diff --git a/bower.json b/bower.json deleted file mode 100755 index e246def5..00000000 --- a/bower.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "HelloIonic", - "private": "true", - "devDependencies": { - "ionic": "^2.2.0" - } -} diff --git a/ionic.config.json b/ionic.config.json index 2e165bca..bb11cb3c 100755 --- a/ionic.config.json +++ b/ionic.config.json @@ -1,14 +1,5 @@ { "name": "Practera SDK - Ionic", "app_id": "", - "gulpStartupTasks": [ - "sass", - "watch" - ], - "watchPatterns": [ - "www/**/*", - "!www/lib/**/*", - "!www/**/*.map" - ], "type": "ionic-angular" } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..0b84cf26 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5575 @@ +{ + "name": "practera-sdk-ionic", + "version": "0.0.1", + "lockfileVersion": 1, + "dependencies": { + "@angular/common": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-4.1.3.tgz", + "integrity": "sha1-58R5HjITHPdMI5QowqZ9qrLu8Bc=" + }, + "@angular/compiler": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-4.1.3.tgz", + "integrity": "sha1-0t0whTsM9KVHWLSjFGMsIx+clMM=" + }, + "@angular/compiler-cli": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-4.1.3.tgz", + "integrity": "sha1-wjYv/fZXVkcUgfg5+rZ1vKwhP5Y=" + }, + "@angular/core": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-4.1.3.tgz", + "integrity": "sha1-KFSY64arfQtvmC+Pn0h+9hABOzU=" + }, + "@angular/forms": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-4.1.3.tgz", + "integrity": "sha1-OAq0w6+ExdHXSMKn0EFRx9yOSYI=" + }, + "@angular/http": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-4.1.3.tgz", + "integrity": "sha1-650cMCoBcoFfmlczENm+C964Ra4=" + }, + "@angular/platform-browser": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-4.1.3.tgz", + "integrity": "sha1-T6HbURndF4sxXdrlsym+4akypb0=" + }, + "@angular/platform-browser-dynamic": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.1.3.tgz", + "integrity": "sha1-PBP9z1kdSH9u/cHUaRPygMbYwuw=" + }, + "@angular/tsc-wrapped": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@angular/tsc-wrapped/-/tsc-wrapped-4.1.3.tgz", + "integrity": "sha1-LWNyyRh78WIerNlguUs5xPlSk80=" + }, + "@ionic/app-scripts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ionic/app-scripts/-/app-scripts-2.0.0.tgz", + "integrity": "sha512-/SiW8B64diuiO1BMylM4IxYb60KNeFHTc6DYfdbPxNskCge/iVWpOMWIEjdMeI2vuqVvUiQ3rvr/g9BZ/L97iQ==", + "dev": true + }, + "@ionic/cli-plugin-ionic-angular": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ionic/cli-plugin-ionic-angular/-/cli-plugin-ionic-angular-1.4.0.tgz", + "integrity": "sha512-SsuQ42SFX0adzJoCwOcjQxGwjYNkl25LLpJ9R9cejmJ8ot+skH1FmYoOvCZhA4ah+RO5KH+9jBMbCdo7CdCZ8A==", + "dev": true, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "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 + }, + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=" + }, + "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=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=" + } + } + }, + "@ionic/cli-utils": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@ionic/cli-utils/-/cli-utils-1.6.0.tgz", + "integrity": "sha512-SKN5ylyzXvL272cB9hkcsn4qNSjXzmnJ9OFSOxbEWszdNEYM6yFdn6wPjvQ9UCG+MrWFjhIayZGFrjrObZjGsw==", + "dev": true, + "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 + }, + "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 + }, + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "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 + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true + } + } + }, + "@ionic/storage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@ionic/storage/-/storage-2.0.1.tgz", + "integrity": "sha1-uxqMJ2AH0AjXrN2kJrVgZbD9PAs=" + }, + "@ngx-translate/core": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-7.0.0.tgz", + "integrity": "sha1-W29jvUBCFk1EzYX2hwOvluk5Ln0=" + }, + "@ngx-translate/http-loader": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-0.1.0.tgz", + "integrity": "sha1-YCkyVWHXho/jJaQZ3idw6Y/xUC4=" + }, + "@types/jasmine": { + "version": "2.5.53", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.53.tgz", + "integrity": "sha512-2YNL0jXYuN7w07mb1sMZQ6T6zOvGi83v8UbjhBZ8mhvI1VkQ2STU9XOrTFyvWswMyh5rW1evS+e7qltYJvTqPA==", + "dev": true + }, + "@types/localforage": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/localforage/-/localforage-0.0.30.tgz", + "integrity": "sha1-PWCmv23aOOP4pGlhFZg3nx9klQk=" + }, + "@types/node": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.39.tgz", + "integrity": "sha512-KQHAZeVsk4UIT9XaR6cn4WpHZzimK6UBD1UomQKfQQFmTlUHaNBzeuov+TM4+kigLO0IJt4I5OOsshcCyA9gSA==", + "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.42", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.42.tgz", + "integrity": "sha1-dMt3+2BS7a/yqJhN2v2I1BnyXKw=", + "dev": true + }, + "abbrev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=" + }, + "abstract-leveldown": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", + "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", + "dev": true, + "dependencies": { + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + }, + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "dev": true + }, + "acorn": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", + "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "adm-zip": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz", + "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=", + "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": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "dev": true, + "dependencies": { + "semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", + "dev": true + } + } + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true + }, + "ajv-keywords": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", + "integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=", + "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 + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "angular2-local-storage": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/angular2-local-storage/-/angular2-local-storage-0.2.0.tgz", + "integrity": "sha1-u+QL6G0mNRhITzjGbbgvGJzhNDs=" + }, + "angular2-moment": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/angular2-moment/-/angular2-moment-1.4.0.tgz", + "integrity": "sha1-PVnB68KJNPz+m4iKtGHiYXJJh+g=" + }, + "angular2-template-loader": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/angular2-template-loader/-/angular2-template-loader-0.6.2.tgz", + "integrity": "sha1-wNROkP/w+sleiyPwQ6zaf9HFHXw=", + "dev": true, + "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 + } + } + }, + "ansi-escapes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true + }, + "anymatch": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", + "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", + "dev": true + }, + "aproba": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.2.tgz", + "integrity": "sha512-ZpYajIfO0j2cOFTO955KUMIKNmj6zhX8kVztMAxFsDaMwz+9Z9SV0uou2pC9HJqcfpffOsjnbrDMvkNy+9RXPw==" + }, + "archiver": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", + "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true + } + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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=", + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==" + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==" + } + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "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 + }, + "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": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "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 + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "asn1.js": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", + "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", + "dev": true + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "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 + }, + "ast-types": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.15.tgz", + "integrity": "sha1-ju8IJ/BN/w7IhXupJavj/qYZTlI=" + }, + "async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "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 + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "autoprefixer": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.1.tgz", + "integrity": "sha1-l7yFTH0Ll5+NZIneVHoNF/swf20=", + "dev": true, + "dependencies": { + "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 + }, + "postcss": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.8.tgz", + "integrity": "sha512-G6WnRmdTt2jvJvY+aY+M0AO4YlbxE+slKPZb+jG2P2U9Tyxi3h1fYZ/DgiFU6DC6bv3XIEJoZt+f/kNh8BrWFw==", + "dev": 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 + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "babel-cli": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.24.1.tgz", + "integrity": "sha1-IHzXBbumFImy6kG1MSNBz2rKIoM=", + "dev": true + }, + "babel-code-frame": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "dev": true + }, + "babel-core": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", + "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", + "dev": true + }, + "babel-generator": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", + "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", + "dev": true + }, + "babel-helper-evaluate-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.1.0.tgz", + "integrity": "sha1-ldmMTqNhUEg9sufT7J4ZVKcmKcs=", + "dev": true + }, + "babel-helper-flip-expressions": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.1.2.tgz", + "integrity": "sha1-d/ZlL53pxCQB2Ce9RuvSEJ4+8Yo=", + "dev": true + }, + "babel-helper-is-nodes-equiv": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", + "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=", + "dev": true + }, + "babel-helper-is-void-0": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.1.1.tgz", + "integrity": "sha1-cvIaOrugvvODf5F0/KcxrtmgKIg=", + "dev": true + }, + "babel-helper-mark-eval-scopes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.1.1.tgz", + "integrity": "sha1-RVQ0Xt+fJUlCe9IJjlMCU/ivKZI=", + "dev": true + }, + "babel-helper-remove-or-void": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.1.1.tgz", + "integrity": "sha1-nX4YVtxvr8tBsoOkFnMNwYRPZtc=", + "dev": true + }, + "babel-helper-to-multiple-sequence-expressions": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.1.1.tgz", + "integrity": "sha1-XxuDKznkrPlU6RN/AlE5XHEZazU=", + "dev": true + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true + }, + "babel-plugin-minify-builtins": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.1.3.tgz", + "integrity": "sha1-TyGn3LUfkaBOpx1H/w6OOwX+wCE=", + "dev": true + }, + "babel-plugin-minify-constant-folding": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.1.3.tgz", + "integrity": "sha1-V70XKt+LjXStfJlhLrlQQU6+o8o=", + "dev": true + }, + "babel-plugin-minify-dead-code-elimination": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.1.7.tgz", + "integrity": "sha1-d09TbzR7mDk6J7qnF4cpaIE8NCw=", + "dev": true + }, + "babel-plugin-minify-flip-comparisons": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.1.2.tgz", + "integrity": "sha1-4oa0C3WZsY3+oZUHHkJ5Rlz8GIQ=", + "dev": true + }, + "babel-plugin-minify-guarded-expressions": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.1.2.tgz", + "integrity": "sha1-38PUc7A2LZYF084KweIjKMYNEAc=", + "dev": true + }, + "babel-plugin-minify-infinity": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.1.2.tgz", + "integrity": "sha1-Xxz2fd7cuhPIoA2oMlQt8AkaHNQ=", + "dev": true + }, + "babel-plugin-minify-mangle-names": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.1.3.tgz", + "integrity": "sha1-v6JGYaZ5T7A4M1h+VYKLZUSeBv4=", + "dev": true + }, + "babel-plugin-minify-numeric-literals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.1.1.tgz", + "integrity": "sha1-1LiwySX4dHFO4z7ksmZ4WD185/s=", + "dev": true + }, + "babel-plugin-minify-replace": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.1.2.tgz", + "integrity": "sha1-uQuecatNOzYyVimpG+q+E7CxasE=", + "dev": true + }, + "babel-plugin-minify-simplify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.1.2.tgz", + "integrity": "sha1-qWjxZY/esvx1noH+Mx2Jgp3w9rk=", + "dev": true + }, + "babel-plugin-minify-type-constructors": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.1.2.tgz", + "integrity": "sha1-21PFt2y44vzUXYYvFxBMeHYTN+4=", + "dev": true + }, + "babel-plugin-transform-inline-consecutive-adds": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.1.2.tgz", + "integrity": "sha1-VELp8cGceKeJn4pN7m/UgfYQAfU=", + "dev": true + }, + "babel-plugin-transform-member-expression-literals": { + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.4.tgz", + "integrity": "sha1-BWebxAWWuRKTQBlZqhYgqxsr5Dc=", + "dev": true + }, + "babel-plugin-transform-merge-sibling-variables": { + "version": "6.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.5.tgz", + "integrity": "sha1-A6vfEHxhJBkT6yaN3t5tW8VBhiw=", + "dev": true + }, + "babel-plugin-transform-minify-booleans": { + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.8.2.tgz", + "integrity": "sha1-hFFXn3BucCweGrJ1beXI6jac8Hw=", + "dev": true + }, + "babel-plugin-transform-property-literals": { + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.4.tgz", + "integrity": "sha1-atMREQuAoZKlbvtd30/jym96Ydo=", + "dev": true + }, + "babel-plugin-transform-regexp-constructors": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.1.1.tgz", + "integrity": "sha1-MSq3SHzIihxi7iXqG2CH6JuHeZw=", + "dev": true + }, + "babel-plugin-transform-remove-console": { + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.4.tgz", + "integrity": "sha1-Qf3awZpymkw91+8pZOrAewlvmo8=", + "dev": true + }, + "babel-plugin-transform-remove-debugger": { + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.4.tgz", + "integrity": "sha1-+FcEoIrapxtV13AFtblOm53yH24=", + "dev": true + }, + "babel-plugin-transform-remove-undefined": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.1.2.tgz", + "integrity": "sha1-4ev1ERD2seBmXyg4Lvc/leUCNlI=", + "dev": true + }, + "babel-plugin-transform-simplify-comparison-operators": { + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.4.tgz", + "integrity": "sha1-KqJKJi1mTIyz4SWjBseY16LeCNU=", + "dev": true + }, + "babel-plugin-transform-undefined-to-void": { + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.8.2.tgz", + "integrity": "sha1-/isdKU6wXodSTrk3JN6m4sPWb6E=", + "dev": true + }, + "babel-polyfill": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", + "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", + "dev": true + }, + "babel-preset-babili": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/babel-preset-babili/-/babel-preset-babili-0.1.4.tgz", + "integrity": "sha1-rZ1mUQAvW8PwfKswB4EWf1RyS/I=", + "dev": true + }, + "babel-register": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", + "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=", + "dev": true + }, + "babel-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true + }, + "babel-template": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", + "dev": true + }, + "babel-traverse": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", + "dev": true + }, + "babel-types": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", + "dev": true + }, + "babili": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babili/-/babili-0.1.2.tgz", + "integrity": "sha1-dyMbOXcnI5SGOTbLiL97rydvl/U=", + "dev": true + }, + "babylon": { + "version": "6.17.4", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", + "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw==", + "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 + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base62": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/base62/-/base62-0.1.1.tgz", + "integrity": "sha1-e0F0wvlESXU7EcJlHAg9qEGnsIQ=" + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true + }, + "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 + }, + "big.js": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", + "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=", + "dev": true + }, + "binary-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.9.0.tgz", + "integrity": "sha1-ZlBsFs5vTWkopbPNajPKQelB43s=", + "dev": true + }, + "bl": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", + "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=", + "dev": 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 + }, + "blocking-proxy": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-0.0.5.tgz", + "integrity": "sha1-RikF4Nz76pcPQao3Ij3anAexkSs=", + "dev": true + }, + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "dev": true + }, + "bn.js": { + "version": "4.11.7", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", + "integrity": "sha512-LxFiV5mefv0ley0SzqkOPR1bC4EbpPx8LkOz5vMe/Yi15t5hzwgO/G+tc7wOtL4PZTYjwHu8JnEiSLumuSjSfA==", + "dev": true + }, + "body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", + "dev": true + }, + "body-parser": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", + "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", + "dev": true, + "dependencies": { + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", + "dev": true + }, + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "dev": true + }, + "raw-body": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", + "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=", + "dev": 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 + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "dev": true, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserify-aes": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", + "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", + "dev": true + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true + }, + "browserify-fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", + "integrity": "sha1-8HWqinKdTRcW0GZiDjhvzBMRqW8=", + "dev": true + }, + "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 + }, + "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 + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true + }, + "browserslist": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.2.2.tgz", + "integrity": "sha512-MejxGMNIeIqzgaMKVYfFTWHinrwZOnWMXteN9VlHinTd13/0aDmXY9uyRqNsCTnVxqRmrjQFcXI7cy0q9K1IYg==", + "dev": true + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-es6": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/buffer-es6/-/buffer-es6-4.9.3.tgz", + "integrity": "sha1-8mNHuC33b9N+GLy1KIxJcM/VxAQ=", + "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 + }, + "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 + }, + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "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 + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "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 + }, + "caniuse-lite": { + "version": "1.0.30000704", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000704.tgz", + "integrity": "sha1-rbbqARNFFWY2gtuTq6spHUwClGs=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "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 + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "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 + } + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true + }, + "ci-info": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz", + "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=", + "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 + }, + "clean-css": { + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.27.tgz", + "integrity": "sha1-re91sxwWD/pdcvTeZ5ZuJmDBolU=", + "dev": true, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "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 + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true + }, + "cli-width": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", + "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true + }, + "clone": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", + "integrity": "sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU=", + "dev": true + }, + "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=" + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true + }, + "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.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "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 + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "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.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "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 + }, + "compress-commons": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.0.tgz", + "integrity": "sha1-WFhwku8g03y1i68AARLJJ4/3O58=", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true + } + } + }, + "connect": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.2.tgz", + "integrity": "sha1-aU6NIGgb/kkCgsiriGvpjwn0L+c=", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "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 + }, + "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=" + }, + "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.2", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", + "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=", + "dev": true + }, + "continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "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 + }, + "cookiejar": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", + "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=", + "dev": true + }, + "core-js": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "crc": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", + "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=", + "dev": true + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true + } + } + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true + }, + "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 + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true + }, + "crypto-browserify": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", + "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", + "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 + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true + }, + "d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" + }, + "dargs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", + "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "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.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true, + "optional": true + }, + "deferred-leveldown": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", + "integrity": "sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ=", + "dev": true + }, + "del": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.0.tgz", + "integrity": "sha1-mlDwS/NzJeKDtPROmFM2wlJFa9U=", + "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=" + }, + "depd": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=", + "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 + }, + "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 + }, + "dev-null": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz", + "integrity": "sha1-WiBc48Ky73e2I41roXnrdMag6Bg=", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz", + "integrity": "sha512-w0XZubFWn0Adlsapj9EAWX0FqWdO4tz8kc3RiYdWLh4k/V8PTb6i0SMgXt0vRM3zyKnT8tKO7mUlieRQHIjMNg==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true + }, + "doctrine": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", + "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", + "dev": true, + "dependencies": { + "esutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", + "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", + "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 + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.16", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.16.tgz", + "integrity": "sha1-0OAmc1dUdwkBrjAaIWZMukXZL30=", + "dev": true + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "dev": true + }, + "engine.io": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", + "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", + "dev": true, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", + "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", + "dev": true, + "dependencies": { + "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 + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "dev": true + }, + "enhanced-resolve": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.3.0.tgz", + "integrity": "sha512-2qbxE7ek3YxPJ1ML6V+satHkzHpJQKWkRHmRx6mfAoW59yP8YH8BFplbegSP+u2hBd6B6KCOpvJQ3dZAP+hkpg==", + "dev": true + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "dev": true + }, + "error": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", + "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", + "dev": true + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true + }, + "es3ify": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/es3ify/-/es3ify-0.1.4.tgz", + "integrity": "sha1-rZ+l3xrjTz8x4SEbWBiy1RB439E=" + }, + "es5-ext": { + "version": "0.10.24", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", + "integrity": "sha1-pVh3yZJLwMjZvTwsvhdJWsFwmxQ=", + "dev": true + }, + "es6-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "dev": true + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true + }, + "es6-templates": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", + "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", + "dev": true, + "dependencies": { + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "dev": true + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true + } + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true + }, + "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 + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true + }, + "esmangle-evaluator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esmangle-evaluator/-/esmangle-evaluator-1.0.1.tgz", + "integrity": "sha1-Yg2GbvSGGzMR91dm1SqFcrs8YzY=" + }, + "esprima-fb": { + "version": "3001.1.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz", + "integrity": "sha1-t303q8046gt3Qmu4vCkizmtCZBE=" + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "estree-walker": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.3.1.tgz", + "integrity": "sha1-5rGlHPcpJSTnI3wxLl/mZgwc4ao=", + "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.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", + "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", + "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", + "dev": true + }, + "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, + "dependencies": { + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true + }, + "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 + }, + "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": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true + }, + "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 + }, + "express": { + "version": "4.15.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.15.3.tgz", + "integrity": "sha1-urZdDwOqgMNYQIly/HAPkWlEtmI=", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "dev": 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 + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "external-editor": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", + "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", + "dev": true, + "dependencies": { + "iconv-lite": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", + "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==", + "dev": true + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "dev": true + }, + "falafel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-1.2.0.tgz", + "integrity": "sha1-wY0k71CRF0pJfzGM0ksCaiXN2rQ=" + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "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 + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": 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 + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true + }, + "finalhandler": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz", + "integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk=", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "dev": true + } + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true + }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + }, + "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": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "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.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true + }, + "formidable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", + "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", + "dev": true + }, + "forwarded": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", + "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=", + "dev": true + }, + "fresh": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", + "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=", + "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 + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true + }, + "fs-readdir-recursive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", + "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=", + "dev": true + }, + "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.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "dev": true, + "optional": true, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=" + }, + "npmlog": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==" + }, + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=" + }, + "sshpk": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "string_decoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=" + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "dev": true, + "optional": true + }, + "fwd-stream": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", + "integrity": "sha1-7Sgcq+1G/uz5Ie4y3ExQs3KsfPo=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=" + }, + "gaze": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "dev": true + }, + "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 + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-4.1.0.tgz", + "integrity": "sha1-CA9UVJ7BuCpsYOYx/ILhIR2+lfg=", + "dev": true, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true + } + } + }, + "globule": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", + "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "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 + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true + }, + "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 + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "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=" + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true + }, + "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 + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "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 + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "html-loader": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.4.5.tgz", + "integrity": "sha1-X7zYfNY6XEmn/OL+VvQl4Fcpxow=", + "dev": true + }, + "html-minifier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.3.tgz", + "integrity": "sha512-iKRzQQDuTCsq0Ultbi/mfJJnR0D3AdZKTq966Gsp92xkmAPCV4Xi08qhJ0Dl3ZAWemSgJ7qZK+UsZc0gFqK6wg==", + "dev": true, + "dependencies": { + "clean-css": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.7.tgz", + "integrity": "sha1-ua6k+FZ5iJzz6ui0A0nsTr390DI=", + "dev": true + } + } + }, + "http-errors": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", + "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=", + "dev": true + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "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 + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", + "dev": true + }, + "https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "dev": true + }, + "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 + }, + "idb-wrapper": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.1.tgz", + "integrity": "sha1-ajJnASLhc6hOzFz6lmj6LOsiGwQ=", + "dev": true + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "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 + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true + }, + "inline-process-browser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/inline-process-browser/-/inline-process-browser-1.0.0.tgz", + "integrity": "sha1-RqYbFT3TybFiSxoAYm7bT39BTyI=" + }, + "inquirer": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.1.tgz", + "integrity": "sha512-QgW3eiPN8gpj/K5vVpHADJJgrrF0ho/dZGylikGX7iqAdRgC9FVKYKWFLx6hZDBFcOLEoSqINYrVPeFAeG/PdA==", + "dev": true, + "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 + }, + "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 + }, + "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 + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true + } + } + }, + "interpret": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true + }, + "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 + }, + "ionic": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/ionic/-/ionic-3.6.0.tgz", + "integrity": "sha512-SOVwp23IiSiAbEAHqxs636sEaurPxsDbgJZE86cNcqct1iBT9nHnuoBqnJMZJyTT9Pjqnc1Opzbr3/BNF2u3/w==", + "dev": true, + "dependencies": { + "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 + } + } + }, + "ionic-angular": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/ionic-angular/-/ionic-angular-3.5.3.tgz", + "integrity": "sha512-bURfGz0GKsmSxGGDw8LXMkz/Yt572yBTF2VMh/JLJANfiicZzMoxdDkPt0H6erHM7QpHYajsG6AP0sTV4PvjYQ==" + }, + "ionicons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-3.0.0.tgz", + "integrity": "sha1-QLja9P16MRUL0AIWD2ZJbiKpjDw=" + }, + "ipaddr.js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.3.0.tgz", + "integrity": "sha1-HgOlL9rYOou7KyXL9JmLTP/NPew=", + "dev": true + }, + "is": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", + "integrity": "sha1-OzSixI81mXLzUEKEkZOucmS2NWI=", + "dev": true + }, + "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 + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "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 + }, + "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 + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "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 + }, + "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=" + }, + "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 + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true + }, + "is-object": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", + "integrity": "sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc=", + "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.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true + }, + "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-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 + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, + "isbuffer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", + "integrity": "sha1-OMFG2d9Si4v5sHAcPUPPEt8/w5s=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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 + }, + "jasmine": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.6.0.tgz", + "integrity": "sha1-ayLnCIPo5YnUVjRhU7TSBt2+IX8=", + "dev": true + }, + "jasmine-core": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.6.4.tgz", + "integrity": "sha1-3skmzQqfoof7bbXHVfpIfnTOysU=", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.1.1.tgz", + "integrity": "sha1-Wm1Yq11hvqcwn7wnkjlRF1axtYg=", + "dev": true + }, + "jasminewd2": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.1.0.tgz", + "integrity": "sha1-2llSddGuYx3nNqwKfH2Fyfc+9lI=", + "dev": true + }, + "js-base64": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=", + "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 + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jschardet": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.0.tgz", + "integrity": "sha512-+Q8JsoEQbrdE+a/gg1F9XO92gcKXgpE5UACqr0sIubjDmBEkd+OOWPGzQeMrWSLxd73r4dHxBeRW7edHu5LmJQ==", + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-loader": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.4.tgz", + "integrity": "sha1-i6oTZaYy9Yo8RtIBdfxgAsluN94=", + "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-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true + }, + "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": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "dev": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "jstransform": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-3.0.0.tgz", + "integrity": "sha1-olkats7o2XvzvoMNv6IxO4fNZAs=", + "dependencies": { + "source-map": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz", + "integrity": "sha1-n3BNDWnZ4TioG63267T94z0VHGE=" + } + } + }, + "karma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.0.tgz", + "integrity": "sha1-b3oaQGRG+i4YfslTmGmPTO5HYmk=", + "dev": true, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "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 + }, + "karma-jasmine": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.0.tgz", + "integrity": "sha1-IuTAa/mhguUpTR9wXjczgRuBCs8=", + "dev": true + }, + "karma-jasmine-html-reporter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", + "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", + "dev": true + }, + "karma-sourcemap-loader": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz", + "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=", + "dev": true + }, + "karma-webpack": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-2.0.4.tgz", + "integrity": "sha1-Pi1PSLqUqHjhxmu44a5hKJh6F1s=", + "dev": true, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, + "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 + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "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 + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "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 + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true + }, + "leek": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/leek/-/leek-0.0.24.tgz", + "integrity": "sha1-5ADlfw5g2O8r1NBo3EKKVDRdvNo=", + "dev": true, + "dependencies": { + "lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "dev": true + } + } + }, + "level-blobs": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", + "integrity": "sha1-mrm5e7mfHtv594o0M+Ie1WOGva8=", + "dev": true + }, + "level-filesystem": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", + "integrity": "sha1-oArKmRnEpN+v3KaoEI0iWq3/Y7M=", + "dev": true, + "dependencies": { + "xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=", + "dev": true + } + } + }, + "level-fix-range": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", + "integrity": "sha1-vxW5Fa422EcMgh6IPd95zRZCCCg=", + "dev": true + }, + "level-hooks": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", + "integrity": "sha1-G5rmGSKTDzMF0aYfxNg8gQLA3ZM=", + "dev": true + }, + "level-js": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", + "integrity": "sha1-vAVfQYBjXUSJtWHJSG+jcOjBFpc=", + "dev": true, + "dependencies": { + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true + } + } + }, + "level-peek": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", + "integrity": "sha1-vsUccqgu5GTTNkNMfIdsP8vM538=", + "dev": true + }, + "level-sublevel": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", + "integrity": "sha1-dEwSxy0ucr543eO5tc2E1iGRQTo=", + "dev": true, + "dependencies": { + "level-fix-range": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", + "integrity": "sha1-xBfWIVlEIVGhnZojZ4aPFyTC1Ug=", + "dev": true + }, + "object-keys": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", + "integrity": "sha1-zd7AKZiwkb5CvxA1rjLknxy26mc=", + "dev": true + }, + "xtend": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", + "integrity": "sha1-XqZXptukRwacLlnFihE4ywxebO4=", + "dev": true + } + } + }, + "levelup": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", + "integrity": "sha1-5qAcsIlhbI7MApHCqb0/DETj5es=", + "dev": true, + "dependencies": { + "semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=", + "dev": true + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + }, + "lie": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.0.2.tgz", + "integrity": "sha1-/9oh17uibzd8rYZdNkmy/Izjn+o=" + }, + "livereload-js": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.2.2.tgz", + "integrity": "sha1-bIclfmSKtHW8JOoldFftzB+NC8I=", + "dev": true + }, + "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 + }, + "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 + }, + "localforage": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.4.3.tgz", + "integrity": "sha1-ohJUPDnHx2Qk7dEr9HTEiarKSUw=" + }, + "localforage-cordovasqlitedriver": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/localforage-cordovasqlitedriver/-/localforage-cordovasqlitedriver-1.5.0.tgz", + "integrity": "sha1-+TR4nmrZo5usBf3RFogS9DhTV2I=" + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": 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.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true + }, + "lodash.mergewith": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", + "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=", + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", + "dev": true + }, + "log4js": { + "version": "0.6.38", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "dev": true, + "dependencies": { + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "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 + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==" + }, + "ltgt": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.0.tgz", + "integrity": "sha1-tlul/LNJopkkyOMz98alVi8uSEI=", + "dev": true + }, + "macos-release": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-1.1.0.tgz", + "integrity": "sha512-mmLbumEYMi5nXReB9js3WGsB8UE6cDBWyIO62Z4DNx6GbRhDxHNjA1MlzSpJ2S2KM1wyiPRA0d19uHWYYvMHjA==", + "dev": true + }, + "magic-string": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.19.1.tgz", + "integrity": "sha1-FNdoATyvLsj96hakmvgvw3fnUgE=", + "dev": true + }, + "make-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", + "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=", + "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 + }, + "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 + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true + } + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "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 + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true + }, + "miller-rabin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", + "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", + "dev": true + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", + "dev": true + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "dev": true + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "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 + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "moment": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", + "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", + "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=", + "dev": true + }, + "ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "dev": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "no-case": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.1.tgz", + "integrity": "sha1-euuhxzpSGEJlVUt9wDuvcg34AIE=", + "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 + }, + "node-libs-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", + "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "dependencies": { + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true + } + } + } + } + }, + "node-pre-gyp": { + "version": "0.6.36", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz", + "integrity": "sha1-22BBEst04NR3VU6bUFsXq936t4Y=", + "dev": true, + "optional": true + }, + "node-sass": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.5.3.tgz", + "integrity": "sha1-0JydEXlkEjnRuX/8YjH9zsU+FWg=", + "dev": true, + "dependencies": { + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "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 + }, + "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 + }, + "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 + }, + "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 + }, + "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 + }, + "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 + }, + "null-loader": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-0.1.1.tgz", + "integrity": "sha1-F76av80/8OFRL2/Er8sfUDk3j64=", + "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=" + }, + "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=" + }, + "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-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true + }, + "octal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", + "integrity": "sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws=", + "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 + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true + }, + "opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "os-browserify": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", + "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", + "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=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true + }, + "os-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-2.0.1.tgz", + "integrity": "sha1-uaOGNhwXrjohc27wWZQFyajF3F4=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=" + }, + "output-file-sync": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", + "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "dev": true + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "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 + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "dev": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "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 + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=", + "dev": true + }, + "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-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "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-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-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=" + }, + "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 + }, + "pbkdf2": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz", + "integrity": "sha1-vjZ4XFBn6kjYBv+SMojF91C2uKI=", + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "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 + }, + "postcss": { + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "dev": true, + "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 + } + } + }, + "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 + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "private": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", + "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-es6": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/process-es6/-/process-es6-0.11.6.tgz", + "integrity": "sha1-xrs4n5qVH4K9TrFpYAEFvS/5x3g=", + "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=" + }, + "protractor": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.1.2.tgz", + "integrity": "sha1-myIXQXCaTGLVzVPGqt1UpxE36V8=", + "dev": true, + "dependencies": { + "@types/node": { + "version": "6.0.85", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.85.tgz", + "integrity": "sha512-6qLZpfQFO/g5Ns2e7RsW6brk0Q6Xzwiw7kVVU/XiQNOiJXSojhX76GP457PBYIsNMH2WfcGgcnZB4awFDHrwpA==", + "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 + } + } + }, + "proxy-addr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.4.tgz", + "integrity": "sha1-J+VF9pYKRKYn2bREZ+NcG2tM4vM=", + "dev": true + }, + "proxy-middleware": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", + "integrity": "sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY=", + "dev": true + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "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.1.5", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.1.5.tgz", + "integrity": "sha1-ZZ3p8s+NzCehSBJ28gU3cnI4LnM=", + "dev": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "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 + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true + } + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "dev": true + }, + "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": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", + "dev": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "dev": true, + "optional": 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 + }, + "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 + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=" + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true + } + } + }, + "recast": { + "version": "0.10.43", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.43.tgz", + "integrity": "sha1-uV1Q9tYHYaX2JS4V2AZ4FoSRzn8=", + "dependencies": { + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", + "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=" + } + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true + }, + "reflect-metadata": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz", + "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=" + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + }, + "regex-cache": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "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 + }, + "remove-trailing-separator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", + "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", + "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 + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": 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-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.3.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", + "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "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 + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true + }, + "rollup": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.42.0.tgz", + "integrity": "sha1-VueRs6Lz3XGQu7gKN1Z18v4PmyM=", + "dev": true + }, + "rollup-plugin-commonjs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.0.2.tgz", + "integrity": "sha1-mLFYm/4ypsD2d5C2DAtJmXKv7Yk=", + "dev": true, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "rollup-plugin-json": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-2.3.0.tgz", + "integrity": "sha512-W45nZH7lmXgkSR/DkeyF4ks0YWFrMysdjUT049gTuAg+lwUEDBKI2+PztqW8UDSMlXCAeEONsLzpDDyBy9m+9A==", + "dev": true + }, + "rollup-plugin-node-builtins": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.1.2.tgz", + "integrity": "sha1-JKH+1KQyV7a2Q3HYq8bOGrFFl+k=", + "dev": true + }, + "rollup-plugin-node-globals": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-globals/-/rollup-plugin-node-globals-1.1.0.tgz", + "integrity": "sha1-fv2NYR0TJzeCnoBOn1H1CWKvRR8=", + "dev": true, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + }, + "estree-walker": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz", + "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=", + "dev": true + }, + "magic-string": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.16.0.tgz", + "integrity": "sha1-lw67DacZMwEoX7GqZQ85vdgetFo=", + "dev": true + }, + "rollup-pluginutils": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", + "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", + "dev": true + } + } + }, + "rollup-plugin-node-resolve": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.0.0.tgz", + "integrity": "sha1-i4l8TDAw1QASd7BRSyXSygloPuA=", + "dev": true + }, + "rollup-pluginutils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz", + "integrity": "sha1-fslbNXP2VDpGpkYb2afFRFJdD8A=", + "dev": true + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true + }, + "rxjs": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.0.tgz", + "integrity": "sha1-p9sUqxV/nXqsalbmVeejhg05vyY=" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=", + "dev": true + }, + "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 + }, + "saucelabs": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz", + "integrity": "sha1-0kDoAJ33+ocwbsRXimm6O1xCT+4=", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true + } + } + }, + "selenium-webdriver": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz", + "integrity": "sha1-ot6l2kqX9mcuiefKcnbO+jZRR6c=", + "dev": true, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true + } + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + }, + "send": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.3.tgz", + "integrity": "sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk=", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz", + "integrity": "sha1-n0uhni8wMMVH+K+ZEHg47DjVseI=", + "dev": true + }, + "serviceworker-cache-polyfill": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz", + "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "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 + }, + "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.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + }, + "sha.js": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", + "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", + "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 + }, + "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 + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "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, + "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 + } + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true + }, + "socket.io": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", + "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", + "dev": true, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "dev": true, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", + "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", + "dev": true, + "dependencies": { + "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 + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "dev": true, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "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.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" + }, + "source-map-support": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", + "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=" + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "ssh-config": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ssh-config/-/ssh-config-1.0.1.tgz", + "integrity": "sha1-OHQhFtztfUX1NiyoavdxMMy+vIs=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "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, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true + } + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true + } + } + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "string-range": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", + "integrity": "sha1-qJPtNH5yKZvIO++78qaSqNI51d0=", + "dev": true + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" + }, + "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 + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "superagent": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.5.2.tgz", + "integrity": "sha1-M2GjlxVnUEw1EGOr6q4PqiPb8/g=", + "dev": true, + "dependencies": { + "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 + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true + } + } + }, + "supports-color": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", + "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", + "dev": true + }, + "sw-toolbox": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", + "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=" + }, + "symbol-observable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", + "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" + }, + "tapable": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.7.tgz", + "integrity": "sha1-5GwNqsuyuKmLmwzqD0BSEFgX7Vw=", + "dev": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true + }, + "tar-pack": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "dev": true, + "optional": true + }, + "tar-stream": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", + "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", + "dev": true, + "dependencies": { + "bl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", + "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=" + }, + "timers-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.2.tgz", + "integrity": "sha1-q0iDz1l9zVCvIRNJoA+8pWrIa4Y=", + "dev": true + }, + "tiny-lr": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.0.4.tgz", + "integrity": "sha1-0Tvs83+LfpYzIPV0Mpjj6TTHMpo=", + "dev": true, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dev": true + }, + "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 + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "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 + }, + "ts-loader": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-2.3.1.tgz", + "integrity": "sha512-qpHhht5OaOTlZe0scI5zjFrMIEmqt2qEyhpBiDJBA4nIV/iSF+jj1dGoDwFndL1D71dAr3P+gCmCShqolaQ+HQ==", + "dev": true, + "dependencies": { + "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 + } + } + }, + "ts-node": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.2.1.tgz", + "integrity": "sha1-lZXdhA0D5ivHkhTOWntR5V48T/w=", + "dev": true, + "dependencies": { + "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 + }, + "v8flags": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.0.tgz", + "integrity": "sha512-AGl+C+4qpeSu2g3JxCD/mGFFOs/vVZ3XREkD3ibQXEqr4Y4zgIrPWW124/IKJFHOIVFIoH8miWrLf0o84HYjwA==", + "dev": true + } + } + }, + "tsconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", + "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", + "dev": true, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tsickle": { + "version": "0.21.6", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.21.6.tgz", + "integrity": "sha1-U7Abl5xcE/2xOvs/uVgXflmRWI0=" + }, + "tslib": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.7.1.tgz", + "integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=", + "dev": true + }, + "tslint": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.5.0.tgz", + "integrity": "sha1-EOjas+MGH6YelELozuOYKs8gpqo=", + "dev": true + }, + "tslint-eslint-rules": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-4.1.1.tgz", + "integrity": "sha1-fDDniC8mvCdr/5HSOEl1xp2viLo=", + "dev": true, + "dependencies": { + "tsutils": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.9.1.tgz", + "integrity": "sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=", + "dev": true + } + } + }, + "tsutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.8.0.tgz", + "integrity": "sha1-AWAXNymzvxOGKN0UoVN+AIUdgUo=", + "dev": true + }, + "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 + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typedarray-to-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", + "integrity": "sha1-m7i6DoQfs/TPH+fCRenz+opf6Zw=", + "dev": true + }, + "typescript": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.3.4.tgz", + "integrity": "sha1-PTgyGCgjHkNPKHUUlZw3qCtin0I=", + "dev": true + }, + "uglify-js": { + "version": "3.0.26", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.26.tgz", + "integrity": "sha512-+D/BjzuvT1oRMSkH0fuF3M/BCvDxDywmZasd1UTPPHsdsHZqJEAZSvrojgFlS7lrM3ZZWq5h7Bb5i96X1TbOJw==", + "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": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true + } + } + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "dev": true, + "optional": true + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "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 + }, + "unreachable-branch-transform": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unreachable-branch-transform/-/unreachable-branch-transform-0.3.0.tgz", + "integrity": "sha1-2ZzExudG0mSSiEW2EdtUsPNHTKo=" + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "useragent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", + "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "dev": true, + "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, + "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=" + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "dev": true + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true + }, + "vary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", + "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=", + "dev": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "dev": true + }, + "vlq": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.2.tgz", + "integrity": "sha1-4xbVJXtAuGu0PLjV/qXX9U1rDKE=", + "dev": true + }, + "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 + }, + "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 + }, + "walkdir": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", + "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=", + "dev": true + }, + "watchpack": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", + "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "dev": true + }, + "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, + "dependencies": { + "adm-zip": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", + "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=", + "dev": true + }, + "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 + }, + "tmp": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", + "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=", + "dev": true + }, + "xml2js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", + "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=", + "dev": true + } + } + }, + "webpack": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.3.0.tgz", + "integrity": "sha1-zi+eB2Vmq6kfdIhxM6iD/X2hh7w=", + "dev": true, + "dependencies": { + "acorn": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", + "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", + "dev": true + }, + "ajv": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", + "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "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 + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.11.0.tgz", + "integrity": "sha1-CWkdCXOjCtH4Ksc6EuIIfwpHVPk=", + "dev": true + }, + "webpack-sources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", + "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", + "dev": true + }, + "websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true + }, + "websocket-extensions": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", + "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=", + "dev": true + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=" + }, + "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 + }, + "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==" + }, + "win-release": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", + "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", + "dev": true + }, + "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 + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "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 + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.1.tgz", + "integrity": "sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg=", + "dev": true + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "dev": true + }, + "xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", + "dev": true + }, + "xml2js": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", + "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", + "dev": true + }, + "xmlbuilder": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", + "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + }, + "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, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + }, + "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 + }, + "zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true + } + } + }, + "zone.js": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.12.tgz", + "integrity": "sha1-hv9QU8mK7CkaC/S7rFAdaUoFz7s=" + } + } +} diff --git a/package.json b/package.json index e6c3a54b..1efd072b 100755 --- a/package.json +++ b/package.json @@ -18,47 +18,39 @@ "url": "https://github.com/intersective/practera-sdk-ionic" }, "dependencies": { - "@angular/common": "2.2.1", - "@angular/compiler": "2.2.1", - "@angular/compiler-cli": "2.2.1", - "@angular/core": "2.2.1", - "@angular/forms": "2.2.1", - "@angular/http": "2.2.1", - "@angular/platform-browser": "2.2.1", - "@angular/platform-browser-dynamic": "2.2.1", - "@angular/platform-server": "2.2.1", - "@ionic/storage": "2.0.0", + "@angular/common": "4.1.3", + "@angular/compiler": "4.1.3", + "@angular/compiler-cli": "4.1.3", + "@angular/core": "4.1.3", + "@angular/forms": "4.1.3", + "@angular/http": "4.1.3", + "@angular/platform-browser": "4.1.3", + "@angular/platform-browser-dynamic": "4.1.3", + "@ionic/storage": "2.0.1", "@ngx-translate/core": "^7.0.0", "@ngx-translate/http-loader": "^0.1.0", "angular2-local-storage": "^0.2.0", - "angular2-moment": "^0.8.2", + "angular2-moment": "1.4.0", "d3": "^3.5.17", "font-awesome": "^4.7.0", - "ionic-angular": "2.1.0", + "ionic-angular": "~3.5.*", "ionicons": "3.0.0", "lodash": "^4.13.1", "moment": "^2.17.1", - "rxjs": "5.0.0-beta.12", - "sw-toolbox": "3.4.0", - "zone.js": "0.6.26" + "rxjs": "5.4.0", + "sw-toolbox": "3.6.0", + "zone.js": "0.8.12" }, "devDependencies": { - "@ionic/app-scripts": "^1.3.7", - "@ionic/cli-plugin-ionic-angular": "1.3.1", + "@ionic/app-scripts": "2.0.0", + "@ionic/cli-plugin-ionic-angular": "1.4.1", "@types/jasmine": "^2.5.47", "@types/node": "^7.0.13", "angular2-template-loader": "^0.6.2", "connect": "^3.6.0", "del": "2.2.0", - "gulp": "3.9.1", - "gulp-sass": "^2.3.1", - "gulp-watch": "^4.3.6", "html-loader": "^0.4.5", - "ionic-gulp-browserify-typescript": "^1.1.0", - "ionic-gulp-fonts-copy": "^1.0.0", - "ionic-gulp-html-copy": "^1.0.0", - "ionic-gulp-sass-build": "^1.0.0", - "ionic-gulp-scripts-copy": "^2.0.0", + "ionic": "3.7.0", "jasmine": "^2.5.3", "jasmine-spec-reporter": "^4.0.0", "karma": "^1.6.0", @@ -69,12 +61,8 @@ "karma-webpack": "^2.0.3", "null-loader": "^0.1.1", "protractor": "^5.1.1", - "run-sequence": "^1.2.1", "ts-loader": "^2.0.3", "ts-node": "^3.0.2", - "typescript": "^2.2.2" - }, - "peerDependencies": { - "@ionic/app-scripts": "^1.3.7" + "typescript": "2.3.4" } } diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 1404e73e..9edca0d6 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -24,6 +24,7 @@ export class MyApp implements OnInit { 'resetpassword': ResetPasswordPage, 'secure': MagicLinkPage, }; + @ViewChild('appNav') nav: NavController; constructor( platform: Platform, @@ -36,10 +37,12 @@ export class MyApp implements OnInit { // ionic-native is removed, as we dont need to use cordova }); } + ngOnInit() { let category = []; let page; let navParams = {}; + if (document.URL.indexOf("?") !== -1) { let splitURL = document.URL.split("?"); let splitParams = splitURL[1].split("&"); @@ -56,6 +59,7 @@ export class MyApp implements OnInit { navParams[singleURLParam[0]] = singleURLParam[1]; }); } + if (page) { this.nav.setRoot(page, navParams); } else { @@ -66,4 +70,5 @@ export class MyApp implements OnInit { } } } + } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index b03f1a75..0d50fd6d 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,4 +1,5 @@ // libs +import { BrowserModule } from '@angular/platform-browser'; import { NgModule, ErrorHandler, OnInit } from '@angular/core'; import { HashLocationStrategy, LocationStrategy } from '@angular/common'; import { FormsModule } from '@angular/forms'; @@ -7,33 +8,37 @@ import { CacheModule } from '../shared/cache/cache.module'; import { NotificationModule } from '../shared/notification/notification.module'; import { MyApp } from './app.component'; import { FilestackModule } from '../shared/filestack/filestack.module'; +import { UtilsModule } from '../shared/utils/utils.module'; import { TestModule } from '../shared/testModules/test.module'; import { HttpModule, Http } from '@angular/http'; import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; import { TranslateHttpLoader } from "@ngx-translate/http-loader"; -import { i18nData } from '../../../app/i18n-en'; +import { i18nData } from './assets/i18n-en'; +import { TranslationModule } from '../shared/translation/translation.module'; +import { MomentModule } from 'angular2-moment'; + // services import { AchievementService } from '../services/achievement.service'; import { ActivityService } from '../services/activity.service'; import { AssessmentService } from '../services/assessment.service'; import { AuthService } from '../services/auth.service'; -import { SessionService } from '../services/session.service'; -import { RequestModule } from '../shared/request/request.module'; -import { ResponsiveService } from '../services/responsive.service'; +import { CharacterService } from '../services/character.service'; import { EventService } from '../services/event.service'; import { FilestackService } from '../shared/filestack/filestack.service'; +import { GameService } from '../services/game.service'; +import { GroupEmitterService } from '../components/questions/group-emitter.service'; import { LevelService } from '../services/level.service'; import { MilestoneService } from '../services/milestone.service'; import { NotificationService } from '../shared/notification/notification.service'; +import { RequestModule } from '../shared/request/request.module'; +import { ResponsiveService } from '../services/responsive.service'; +import { SessionService } from '../services/session.service'; import { SubmissionService } from '../services/submission.service'; import { TeamService } from '../services/team.service'; import { WindowRef } from '../shared/window'; - // components import { ModalComponent } from '../shared/notification/modal.component'; import { QuestionGroupComponent } from '../components/questionGroup/questionGroup.component'; -import { CurrentActivitiesComponent } from '../components/currentActivities/currentActivities'; -import { CurrentLevelsComponent } from '../components/currentLevels/currentLevels'; import { EventComponent } from '../components/event/event.component'; import { LevelComponent } from '../components/level/level'; import { LoadingMarkerComponent } from '../components/loadingMarker/loadingMarker'; @@ -41,14 +46,20 @@ import { LockerComponent } from '../components/locker/locker'; import { MemberComponent } from '../components/member/member'; import { PhotoComponent } from '../components/photo/photo'; import { TermContentComponent } from '../pages/term-condition/term-content.component'; - +import { FileQuestionComponent } from '../components/questions/file'; +import { OneofQuestionComponent } from '../components/questions/oneof'; +import { TextQuestionComponent } from '../components/questions/text'; +import { MultipleQuestionComponent } from '../components/questions/multiple'; +import { FeedbackComponent } from '../components/questions/feedback'; // pages import { AchievementsViewPage } from '../pages/achievements/view/achievements-view.page'; import { ActivitiesListPage } from '../pages/activities/list/list.page'; import { ActivityListPopupPage } from '../pages/activities/list/popup'; import { ActivitiesViewModalPage } from '../pages/activities/view/activities-view-modal.page'; import { ActivitiesViewPage } from '../pages/activities/view/activities-view.page'; +import { ActivitiesClassicListPage } from '../pages/activities-classic/list/activities-classic-list.page'; import { AssessmentsPage } from '../pages/assessments/assessments.page'; +import { AssessmentsGroupPage } from '../pages/assessments/group/assessments-group.page'; import { EventCheckinPage } from '../pages/events/checkin/event-checkin.page'; import { EventsComponent } from '../components/events/events.component'; import { EventsDownloadPage } from '../pages/events/download/events-download.page'; @@ -57,11 +68,14 @@ import { EventsPreviewPage } from '../pages/events/download/events-preview.page' import { EventsViewPage } from '../pages/events/view/events-view.page'; import { ForgetPasswordPage } from '../pages/forget-password/forget-password'; import { GalleryPage } from '../pages/gallery/gallery'; -import { HomePage } from '../pages/home/home'; +import { LeaderboardSettingsPage } from '../pages/settings/leaderboard/leaderboard-settings.page'; import { LevelsListPage } from '../pages/levels/list/list'; import { LoginModalPage } from '../pages/login-modal/login-modal'; import { LoginPage } from '../pages/login/login'; import { MagicLinkPage } from '../pages/magic-link/magic-link'; +import { RankingBadgesPage } from '../pages/rankings/view/ranking-badges'; +import { RankingDetailsPage } from '../pages/rankings/view/ranking-details.page'; +import { RankingsPage } from '../pages/rankings/list/rankings.page'; import { RegisterPage } from '../pages/registration/register.page'; import { RegistrationModalPage } from '../pages/registration/modal'; import { RegistrationPage } from '../pages/registration/registration.page'; @@ -73,30 +87,30 @@ import { TabsPage } from '../pages/tabs/tabs.page'; import { TeamPage } from '../pages/team/team'; import { TermConditionPage } from '../pages/term-condition/term-condition.page'; import { TestPage } from '../pages/tabs/test.page'; - +import { TutorialPage } from '../pages/settings/tutorial/tutorial.page'; // custom pipes import { TimeAgoPipe } from '../pipes/timeago'; +import { UcfirstPipe } from '../pipes/ucfirst.pipe'; import { TruncatePipe } from '../pipes/truncate.pipe'; +import { EscapeHtmlPipe } from '../pipes/keep-html.pipe'; // configs import { default as Configure } from '../configs/config'; - // AoT requires an exported function for factories export function HttpLoaderFactory(http: Http) { - return new TranslateHttpLoader(http, "./assets/i18n-", ".json"); + return new TranslateHttpLoader(http, "./assets/i18n-", ".json"); } @NgModule({ declarations: [ AchievementsViewPage, + ActivitiesClassicListPage, ActivitiesListPage, - ActivityListPopupPage, ActivitiesViewModalPage, ActivitiesViewPage, + ActivityListPopupPage, + AssessmentsGroupPage, AssessmentsPage, - QuestionGroupComponent, - CurrentActivitiesComponent, - CurrentLevelsComponent, EventCheckinPage, EventComponent, EventsComponent, @@ -104,9 +118,11 @@ export function HttpLoaderFactory(http: Http) { EventsListPage, EventsPreviewPage, EventsViewPage, + FeedbackComponent, + FileQuestionComponent, ForgetPasswordPage, GalleryPage, - HomePage, + LeaderboardSettingsPage, LevelComponent, LevelsListPage, LoadingMarkerComponent, @@ -116,8 +132,14 @@ export function HttpLoaderFactory(http: Http) { MagicLinkPage, MemberComponent, ModalComponent, + MultipleQuestionComponent, MyApp, + OneofQuestionComponent, PhotoComponent, + QuestionGroupComponent, + RankingBadgesPage, + RankingDetailsPage, + RankingsPage, RegisterPage, RegistrationModalPage, RegistrationPage, @@ -128,17 +150,23 @@ export function HttpLoaderFactory(http: Http) { TabsPage, TeamPage, TestPage, + TutorialPage, TermConditionPage, TermContentComponent, - TruncatePipe, + TextQuestionComponent, TimeAgoPipe, TruncatePipe, + UcfirstPipe, + EscapeHtmlPipe, ], imports: [ - TestModule, + BrowserModule, CacheModule, - NotificationModule, FormsModule, + MomentModule, + NotificationModule, + TestModule, + UtilsModule, RequestModule.forRoot({ appKey: Configure.appKey, prefixUrl: Configure.prefixUrl @@ -153,6 +181,7 @@ export function HttpLoaderFactory(http: Http) { deps: [Http] } }), + TranslationModule, IonicModule.forRoot(MyApp, {}, { links: [ { @@ -187,14 +216,13 @@ export function HttpLoaderFactory(http: Http) { ], entryComponents: [ AchievementsViewPage, + ActivitiesClassicListPage, ActivitiesListPage, - ActivityListPopupPage, ActivitiesViewModalPage, ActivitiesViewPage, + ActivityListPopupPage, + AssessmentsGroupPage, AssessmentsPage, - QuestionGroupComponent, - CurrentActivitiesComponent, - CurrentLevelsComponent, EventCheckinPage, EventComponent, EventsComponent, @@ -204,7 +232,7 @@ export function HttpLoaderFactory(http: Http) { EventsViewPage, ForgetPasswordPage, GalleryPage, - HomePage, + LeaderboardSettingsPage, LevelComponent, LevelsListPage, LoadingMarkerComponent, @@ -212,10 +240,11 @@ export function HttpLoaderFactory(http: Http) { LoginModalPage, LoginPage, MagicLinkPage, - MemberComponent, ModalComponent, MyApp, - PhotoComponent, + RankingBadgesPage, + RankingDetailsPage, + RankingsPage, RegisterPage, RegistrationModalPage, RegistrationPage, @@ -226,6 +255,7 @@ export function HttpLoaderFactory(http: Http) { TabsPage, TestPage, TermConditionPage, + TutorialPage, TermContentComponent, ], providers: [ @@ -233,8 +263,10 @@ export function HttpLoaderFactory(http: Http) { { provide: ActivityService, useClass: ActivityService }, { provide: AssessmentService, useClass: AssessmentService }, { provide: AuthService, useClass: AuthService }, + { provide: CharacterService, useClass: CharacterService }, { provide: ErrorHandler, useClass: IonicErrorHandler }, { provide: EventService, useClass: EventService }, + { provide: FilestackService, useClass: FilestackService }, { provide: LevelService, useClass: LevelService }, { provide: LocationStrategy , useClass: HashLocationStrategy }, { provide: MilestoneService, useClass: MilestoneService }, @@ -243,8 +275,9 @@ export function HttpLoaderFactory(http: Http) { { provide: SessionService, useClass: SessionService }, { provide: SubmissionService, useClass: SubmissionService }, { provide: TeamService, useClass: TeamService }, - { provide: FilestackService, useClass: FilestackService }, WindowRef, + GroupEmitterService, + GameService, // { provide: RequestOptions, useClass: CustomRequestOptions } ] }) diff --git a/src/app/messages.ts b/src/app/messages.ts index deea31c5..c21a0958 100644 --- a/src/app/messages.ts +++ b/src/app/messages.ts @@ -1,12 +1,11 @@ -export const loadingMessages = { - Login: { - "login": "Logging in ..." - }, - LoadingSpinner: { - "loading": "Loading ..." - }, - Logout: { - "logout": "See you next time" +export const confirmMessages = { + Assessments: { + DiscardChanges: { + "discard": "Are you sure you want to discard all changes?" + }, + SubmitConfirmation: { + "confirm": "Are you sure you want to submit this evidence?" + } } } export const errMessages = { @@ -18,15 +17,26 @@ export const errMessages = { "empty": "Whoops... no achievement has been setup ..." }, assessments: { - "error": "Whoops... no assessment has been setup ..." + "empty": "Whoops... no assessment has been setup ..." } }, DirectLink: { - + "mismatch": "Oops... The link to log you in appears to be broken. Please login by typing your email and password." }, Events: { + bookEvents: { + "book": "Whoops, booking of an event has failed, please try again later." + }, + cancelBooking: { + "cancel": "Whoops, we could not cancel your booking for this event, please try again later." + }, events: { "empty": "Whoops... no event has been setup ..." + }, + filter: { + "empty": "There are no scheduled events available. Please check back later.", + "noBookings": "You have no bookings. Tap on 'Browse' and book an event now to enhance your skills.", + "noAttended": "You have not attended any events yet." } }, General: { @@ -38,12 +48,82 @@ export const errMessages = { } }, Login: { - + "login": "Oops... Invalid email or password, please type it again." + }, + PasswordValidation: { + mismatch: { + "mismatch": "You must enter matching passwords. Please Try again." + }, + minlength: { + "minlength": "The minimum length allowed for a password is 8 characters." + } }, Registration: { - + mismatch: { + "mismatch": "The passwords you have entered do not match each other. Please enter the same password." + }, + error: { + "error": "Sorry, something has gone wrong in processing your registration. Please try again or contact " // after the "contact", the content will be a variable, please check with Registration/model.ts file to view detail + }, + invalidUser: { + "account": "Whoops... You do not have a account. To have one set up please contact " // after the "contact", the content will be a variable, please check with Registration/model.ts file to view detail + }, + noPassword: { + "password": "Whoops... Sorry, we have been unable to register you. You must enter a valid password." + }, + alreadyRegistered: { + "registered": "You have already registered. Please type the email address and password you registered with to login." + }, + verifyFailed: { + "verifyfailed": "Sorry, verification failed, please resend your email and password." + } }, ResetPassword: { - + resetLoginFailed: { + "failed": "Whoops, we were unable to reset your password. Please try again." + }, + invalidLink: { + "invalid": "Oops... The log in link is broken. You will be redirected to the login page. Try again with your username and password." + } + }, + TermConditions: { + disagreement: { + "noAccepted": "You must agree to the Terms and Conditions." + }, + verifyFailed: { + "verifyfailed": "Oops... Registration verification has failed. Please try again later." + } + } +} +export const generalVariableMessages = { + helpMail: { + "email": "help@support.com" + } +} +export const loadingMessages = { + Login: { + "login": "Logging in ..." + }, + LoadingSpinner: { + "loading": "Loading ..." + }, + Logout: { + "logout": "See you next time" + }, + SendingEmail: { + "send": "Sending email to us ..." + }, + SentMessage: { // the reason why this message has been divided into two parts, because of we have a variable (${this.email}) in the middle of message + "partOne": "We have sent an email to", + "partTwo": "with a link to log into the system - please check your inbox. If you haven't received an email in a few minutes please check the address you entered and your spam folder." + }, + SuccessRegistration: { + "successRegistration": "Your password has been successfully set. You will now be logged in." + }, + SuccessResetPassword: { + "successResetPassword": "Password has been changed successfully. Logging in now." + }, + VerifyUser: { + "verify": "Verifying user identity ..." } } \ No newline at end of file diff --git a/src/assets/i18n-cn.json b/src/assets/i18n-cn.json new file mode 100644 index 00000000..92874e15 --- /dev/null +++ b/src/assets/i18n-cn.json @@ -0,0 +1,11 @@ +{ + "ACTIVITY": { + "PAGETITLE": "面板", + "POINTS": "分数", + "PROGRESS": "进程", + "SUBMISSION": "提交" + }, + "ASSESSMENT": { + "PAGETITLE": "任务" + } +} diff --git a/src/assets/i18n-en.json b/src/assets/i18n-en.json new file mode 100644 index 00000000..0fa353ca --- /dev/null +++ b/src/assets/i18n-en.json @@ -0,0 +1,76 @@ +{ + "ACTIVITY": { + "PAGETITLE": "Dashboard", + "POINTS": "Points", + "PROGRESS": "Progress", + "SUBMISSION": "Submission" + }, + "ASSESSMENT": { + "PAGETITLE": "Assessment" + }, + "EVENTS": { + "ATTENDED": "Attended", + "BOOK": "Book", + "BROWSE": "Browse", + "CANCELBOOKING": "Cancel Booking", + "CHECKIN": "Check-in", + "VIEWCHECKIN": "View Check-in", + "DOWNLOAD": "Download", + "MYBOOKINGS": "My Bookings", + "PAGETITLE": "Events" + }, + "FORGOTPASSWORD": { + "INPUTTITLE": "Please enter your email address to reset password", + "PAGETITLE": "Forgot Password", + "SENDBUTTON": "Send to Mailbox" + }, + "GENERAL": { + "DONE": "Done", + "DOWNLOAD": "Download", + "NEXT": "Next", + "PREV": "Prev", + "SKIP": "Skip", + "SUBMIT": "Submit" + }, + "LOGIN": { + "HEADER": "Welcome to Practera", + "PAGETITLE": "Login", + "PASSWORDFORGOT": "Forget Your Password?" + }, + "REGISTRATION": { + "HEADER": "Great - you are almost there! Just one more thing...", + "PAGETITLE": "Set Password" + }, + "RANKING": { + "DETAIL": "Ranking Details", + "ME": "Me", + "MONTHLYPOINTS": "Points(Monthly)", + "PAGETITLE": "Ranking", + "TOTALPOINTS": "Points(Total)" + }, + "RESETPASSWORD": { + "PAGETITLE": "Reset Password" + }, + "SETTINGS": { + "HELP": "Email Help", + "LEADERBOARD": "Settings", + "LOGOUT": "Logout", + "PAGETITLE": "Account", + "PROFILE": "My Profile ", + "SUPPORT": "Support", + "SWITCHER": "Program Switcher", + "TUTORIAL": "Tutorial", + "TERMS": "Terms of Use" + }, + "TABS": { + "ACCOUNT": "Account", + "DASHBOARD": "Dashboard", + "EVENTS": "Events", + "RANKING": "Ranking" + }, + "TERMCONDITIONS": { + "PAGETITLE": "Terms and Conditions", + "AGREE": "I agree", + "NEXT": "Next" + } +} diff --git a/src/assets/i18n/i18n-en.json b/src/assets/i18n/i18n-en.json deleted file mode 100644 index 6b695b18..00000000 --- a/src/assets/i18n/i18n-en.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "ACTIVITY": { - "PROGRESS": "Progress", - "POINTS": "Points" - } -} \ No newline at end of file diff --git a/src/assets/img/default/default-badge.png b/src/assets/img/default/default-badge.png new file mode 100644 index 00000000..e2600934 Binary files /dev/null and b/src/assets/img/default/default-badge.png differ diff --git a/src/assets/img/static/event-cover-1.jpg b/src/assets/img/static/event-cover-1.jpg new file mode 100644 index 00000000..b29ee373 Binary files /dev/null and b/src/assets/img/static/event-cover-1.jpg differ diff --git a/src/assets/img/static/event-cover-2.jpg b/src/assets/img/static/event-cover-2.jpg new file mode 100644 index 00000000..b29ee373 Binary files /dev/null and b/src/assets/img/static/event-cover-2.jpg differ diff --git a/src/assets/img/static/event-cover-3.jpg b/src/assets/img/static/event-cover-3.jpg new file mode 100644 index 00000000..b29ee373 Binary files /dev/null and b/src/assets/img/static/event-cover-3.jpg differ diff --git a/src/assets/img/static/event-cover-4.jpg b/src/assets/img/static/event-cover-4.jpg new file mode 100644 index 00000000..b29ee373 Binary files /dev/null and b/src/assets/img/static/event-cover-4.jpg differ diff --git a/src/assets/img/static/event-cover-5.jpg b/src/assets/img/static/event-cover-5.jpg new file mode 100644 index 00000000..b29ee373 Binary files /dev/null and b/src/assets/img/static/event-cover-5.jpg differ diff --git a/src/assets/img/tutorial/tutorial_tour01.png b/src/assets/img/tutorial/tutorial_tour01.png new file mode 100644 index 00000000..b38c1ba0 Binary files /dev/null and b/src/assets/img/tutorial/tutorial_tour01.png differ diff --git a/src/assets/img/tutorial/tutorial_tour02.png b/src/assets/img/tutorial/tutorial_tour02.png new file mode 100644 index 00000000..c942c5dd Binary files /dev/null and b/src/assets/img/tutorial/tutorial_tour02.png differ diff --git a/src/assets/img/tutorial/tutorial_tour03.png b/src/assets/img/tutorial/tutorial_tour03.png new file mode 100644 index 00000000..228dc765 Binary files /dev/null and b/src/assets/img/tutorial/tutorial_tour03.png differ diff --git a/src/components/currentActivities/currentActivities.html b/src/components/currentActivities/currentActivities.html deleted file mode 100644 index 45d82436..00000000 --- a/src/components/currentActivities/currentActivities.html +++ /dev/null @@ -1,8 +0,0 @@ -

Current Activity

- - -

Name:{{activity.name}}

-

Dead: {{activity.deadline}}

-

Desc: {{activity.description}}

-

End: {{activity.end}}

-
diff --git a/src/components/currentActivities/currentActivities.ts b/src/components/currentActivities/currentActivities.ts deleted file mode 100644 index 984974dd..00000000 --- a/src/components/currentActivities/currentActivities.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component } from '@angular/core'; -import { NavController } from 'ionic-angular'; - -import * as _ from 'lodash'; - -import { ActivityService } from '../../services/activity.service'; - -@Component({ - selector: 'current-activities', - templateUrl: 'currentActivities.html' -}) -export class CurrentActivitiesComponent { - - public activities = [ - { - id: 1, - name: 'Activity 1 (Fake)', - } - ]; - - constructor( - public navCtrl: NavController, - public activityService: ActivityService - ) {} - - ionViewDidEnter() { - this.activityService.getList() - .toPromise() - .then((result: any) => { - this.activities = _.map(result.data, this.activityService.normalise); - }, (err: any) => console.log(err)) - .catch((err) => { - console.log('err', err) - }); - } - -} diff --git a/src/components/currentLevels/currentLevels.html b/src/components/currentLevels/currentLevels.html deleted file mode 100644 index f38b0481..00000000 --- a/src/components/currentLevels/currentLevels.html +++ /dev/null @@ -1,5 +0,0 @@ -

Current Level

- - - - diff --git a/src/components/currentLevels/currentLevels.ts b/src/components/currentLevels/currentLevels.ts deleted file mode 100644 index 75cc8cfc..00000000 --- a/src/components/currentLevels/currentLevels.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Component } from '@angular/core'; -import { NavController } from 'ionic-angular'; - -import * as _ from 'lodash'; - -import { LevelService } from '../../services/level.service'; - -@Component({ - selector: 'current-levels', - templateUrl: 'currentLevels.html' -}) -export class CurrentLevelsComponent { - - public levels = [ - { - id: 1, - name: 'Level 1 (Fake)', - } - ]; - - constructor( - public navCtrl: NavController, - public levelService: LevelService, - ) {} - - ionViewDidEnter() { - this.levelService.getLevels() - .then((result: any) => { - const level: any = _.find(result.data, { is_locked: false }); - - if (level) { - this.levels.push(level); - } - }) - .catch((err) => { - // @TODO handle error UI... - console.log('err', err) - }); - } - -} diff --git a/src/components/loadingMarker/loadingMarker.html b/src/components/loadingMarker/loadingMarker.html index 18c0d789..7a57a614 100644 --- a/src/components/loadingMarker/loadingMarker.html +++ b/src/components/loadingMarker/loadingMarker.html @@ -1,5 +1,5 @@
-
+
diff --git a/src/components/questionGroup/questionGroup.component.ts b/src/components/questionGroup/questionGroup.component.ts index b4228306..54489343 100644 --- a/src/components/questionGroup/questionGroup.component.ts +++ b/src/components/questionGroup/questionGroup.component.ts @@ -1,12 +1,14 @@ import { Component, Input } from '@angular/core'; import { NavController } from 'ionic-angular'; +import { TruncatePipe } from '../../pipes/truncate.pipe'; + @Component({ selector: 'questionGroup', templateUrl: 'questionGroup.html', }) export class QuestionGroupComponent { - @Input() questionGroup: any = {}; + @Input() group: any = {}; constructor( public navCtrl: NavController diff --git a/src/components/questionGroup/questionGroup.html b/src/components/questionGroup/questionGroup.html index 37c33d1c..15a834a6 100644 --- a/src/components/questionGroup/questionGroup.html +++ b/src/components/questionGroup/questionGroup.html @@ -1,31 +1,34 @@
- -
- - -
+ + + -
- This is answer hardcoded and display in row. -
-
-
- {{ questionGroup.answer.files.length + ' file uploaded.' }} -
-
- {{ questionGroup.answer.files.length + ' files uploaded.' }} -
-
- -
- {{ questionGroup.answer.answers[0].context | truncate: 150 }} -
+ + +
+ +
+ Completed
-
- +
+ Incomplete +
+ + +
diff --git a/src/components/questionGroup/questionGroup.scss b/src/components/questionGroup/questionGroup.scss index 0f371f34..e5475b88 100644 --- a/src/components/questionGroup/questionGroup.scss +++ b/src/components/questionGroup/questionGroup.scss @@ -14,11 +14,39 @@ questionGroup { font-size: 1.3em; } + .description { + display: block; + text-overflow: ellipsis; + word-wrap: break-word; + overflow: hidden; + text-overflow: ellipsis; + max-height: 3.6em; + line-height: 1.8em; + text-align: left; + padding-left: 10px; + } + button { position: absolute; top: -7px; right: 0px; } + + .status { + text-align: right; + } + + .completed { + color: $toolbar-active-color + } + + .incomplete { + color: $toolbar-inactive-color + } + + .feedback-available { + color: $soft-green + } } .answer { diff --git a/src/components/questions/feedback.html b/src/components/questions/feedback.html new file mode 100644 index 00000000..8d059a17 --- /dev/null +++ b/src/components/questions/feedback.html @@ -0,0 +1,52 @@ +
+ + + Comment: + {{ question.review_answer.comment }} + + +
+ +
+
+ + + + + + Comment: + {{ question.review_answer.comment }} + + + + + + + + Comment: + {{ question.review_answer.comment }} + + + +
+
+ +
+ + + Reviewer Comment: + {{ question.review_answer.comment }} + + + + + + Reviewer Answer: + {{ question.review_answer.answer }} + + +
diff --git a/src/components/questions/feedback.ts b/src/components/questions/feedback.ts new file mode 100644 index 00000000..4219abc5 --- /dev/null +++ b/src/components/questions/feedback.ts @@ -0,0 +1,13 @@ +import { Component, Input, OnInit } from '@angular/core'; + +@Component({ + selector: 'feedback', + templateUrl: './feedback.html' +}) +export class FeedbackComponent implements OnInit { + @Input() question; + + constructor() {} + + ngOnInit() {} +} diff --git a/src/components/questions/file.html b/src/components/questions/file.html new file mode 100644 index 00000000..31e9ff70 --- /dev/null +++ b/src/components/questions/file.html @@ -0,0 +1,19 @@ + + + + {{ uploaded.filename }} + Download + + + + No uploaded files available. + + + + + +

+ Images, testimonials, documents, etc. Any evidence you think can appropriately show that you have applied what you have learnt in the real world. +

+
+
diff --git a/src/components/questions/file.ts b/src/components/questions/file.ts new file mode 100644 index 00000000..3965c07f --- /dev/null +++ b/src/components/questions/file.ts @@ -0,0 +1,73 @@ +import { Component, Input, OnInit, NgZone } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +import { FilestackService, FilestackUpload } from '../../shared/filestack/filestack.service'; +import { UtilsService } from '../../shared/utils/utils.service'; +import * as _ from 'lodash'; + +@Component({ + selector: 'file-question', + templateUrl: './file.html' +}) +export class FileQuestionComponent implements OnInit { + @Input() question; + @Input() disabled; + @Input() form: FormGroup; + + uploaded: any; // uploaded file (support single only) + // uploaded: Array = []; // uploaded files + + constructor( + private fs: FilestackService, + private util: UtilsService, + private zone: NgZone + ) {} + + /** + * @description at file type question initiation, + * uploaded files is retrieved from cached form (if available) + */ + ngOnInit() { + this.uploaded = _.isEmpty(this.form.controls.answer.value) ? false : this.form.controls.answer.value; + } + + /** + * @description Upload file and trigger ngzone to update this.uploaded variable + */ + upload(event) { + let self = this; + + this.fs.pick({ + maxFiles: 1, + storeTo: { + location: 's3' + } + }).then((uploaded: FilestackUpload) => { + self.zone.run(() => { + if (uploaded.filesUploaded.length > 0) { + let file = uploaded.filesUploaded.shift(); + file.icon = self.util.getIcon(file.mimetype); + + // post_assessment_submission API requirement "key" + file.key = file.handle; + + self.uploaded = file; + this.form.controls.answer.setValue(self.uploaded); + } + + if (uploaded.filesFailed.length > 0) { + console.log(uploaded.filesFailed.length, ' file(s) not uploaded.'); + } + }); + }); + } + + private injectIcon = (files: any[]) => { + let result = []; + files.forEach((file, index) => { + file.icon = this.util.getIcon(file.mimetype); + result.push(file); + }); + + return result; + }; +} diff --git a/src/components/questions/group-emitter.service.ts b/src/components/questions/group-emitter.service.ts new file mode 100644 index 00000000..9308895d --- /dev/null +++ b/src/components/questions/group-emitter.service.ts @@ -0,0 +1,14 @@ +import { Injectable, EventEmitter } from '@angular/core'; + +@Injectable() +export class GroupEmitterService { + private static _emitter: { [ID: string]: EventEmitter }; + + static get(ID: string): EventEmitter { + if (!this._emitter[ID]) { + this._emitter[ID] = new EventEmitter(); + } + return this._emitter[ID]; + } +} + diff --git a/src/components/questions/multiple.html b/src/components/questions/multiple.html new file mode 100644 index 00000000..4655b7b0 --- /dev/null +++ b/src/components/questions/multiple.html @@ -0,0 +1,10 @@ +
+ + + + {{choice.name}} + + + + +
diff --git a/src/components/questions/multiple.scss b/src/components/questions/multiple.scss new file mode 100644 index 00000000..ec3090f8 --- /dev/null +++ b/src/components/questions/multiple.scss @@ -0,0 +1,4 @@ +.checkbox-ios.checkbox-disabled, .item-ios.item-checkbox-disabled ion-label { + opacity: 1; + pointer-events: none; +} diff --git a/src/components/questions/multiple.ts b/src/components/questions/multiple.ts new file mode 100644 index 00000000..2103aee7 --- /dev/null +++ b/src/components/questions/multiple.ts @@ -0,0 +1,22 @@ +import { Component, EventEmitter, Input, Output, OnInit } from '@angular/core'; +import { FormGroup } from '@angular/forms'; + +@Component({ + selector: 'multiple-question', + templateUrl: './multiple.html' +}) +export class MultipleQuestionComponent implements OnInit { + @Input() question; + @Input() disabled; + @Input() form: FormGroup; + + constructor() {} + change(e) { + console.log(e); + console.log(this.question); + } + + ngOnInit() { + console.log(this.form); + } +} diff --git a/src/components/questions/oneof.html b/src/components/questions/oneof.html new file mode 100644 index 00000000..052ec6ea --- /dev/null +++ b/src/components/questions/oneof.html @@ -0,0 +1,10 @@ +
+ + + + {{choice.name}} + + + + +
diff --git a/src/components/questions/oneof.scss b/src/components/questions/oneof.scss new file mode 100644 index 00000000..525c7c86 --- /dev/null +++ b/src/components/questions/oneof.scss @@ -0,0 +1,4 @@ +.radio-ios.radio-disabled, .item-ios.item-radio-disabled ion-label { + opacity: 1; + pointer-events: none; +} diff --git a/src/components/questions/oneof.ts b/src/components/questions/oneof.ts new file mode 100644 index 00000000..7830f04e --- /dev/null +++ b/src/components/questions/oneof.ts @@ -0,0 +1,22 @@ +import { Component, EventEmitter, Input, Output, OnInit } from '@angular/core'; +import { FormGroup } from '@angular/forms'; + +@Component({ + selector: 'oneof-question', + templateUrl: './oneof.html' +}) +export class OneofQuestionComponent implements OnInit { + @Input() question; + @Input() form: FormGroup; + @Input() disabled; + @Output() oneofForm = new EventEmitter(); + + constructor() {} + change(e) { + this.oneofForm.emit(e); + } + + ngOnInit() { + // console.log(this.question); + } +} diff --git a/src/components/questions/questions.ts b/src/components/questions/questions.ts new file mode 100644 index 00000000..56bb029b --- /dev/null +++ b/src/components/questions/questions.ts @@ -0,0 +1,25 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'file-question', + templateUrl: './file.html' +}) +export class FileQuestionComponent { + +} + +@Component({ + selector: 'oneof-question', + templateUrl: './oneof.html' +}) +export class OneofQuestionComponent { + +} + +@Component({ + selector: 'text-question', + templateUrl: './text.html' +}) +export class TextQuestionComponent { + +} diff --git a/src/components/questions/text.html b/src/components/questions/text.html new file mode 100644 index 00000000..198a8323 --- /dev/null +++ b/src/components/questions/text.html @@ -0,0 +1,12 @@ +
+ + + + +
diff --git a/src/components/questions/text.scss b/src/components/questions/text.scss new file mode 100644 index 00000000..596c38a3 --- /dev/null +++ b/src/components/questions/text.scss @@ -0,0 +1,5 @@ +text-question { + textarea:read-only { + // opacity: 0.3; + } +} diff --git a/src/components/questions/text.ts b/src/components/questions/text.ts new file mode 100644 index 00000000..4cd711e6 --- /dev/null +++ b/src/components/questions/text.ts @@ -0,0 +1,17 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { FormGroup } from '@angular/forms'; + + +@Component({ + selector: 'text-question', + templateUrl: './text.html' +}) +export class TextQuestionComponent implements OnInit { + @Input() question; + @Input() disabled; + @Input() form: FormGroup; + + constructor() {} + + ngOnInit() {} +} diff --git a/src/configs/config.ts.default b/src/configs/config.ts.default new file mode 100644 index 00000000..ec398a10 --- /dev/null +++ b/src/configs/config.ts.default @@ -0,0 +1,9 @@ +// Need update read me +// Copy file to config.ts +export default { + prefixUrl: 'http://local.practera.com:8080/', + appKey: '', + filestack: { + apiKey: '' + }, +} diff --git a/src/index.html b/src/index.html index a53fae4a..4b84cbcb 100755 --- a/src/index.html +++ b/src/index.html @@ -40,6 +40,9 @@ + + diff --git a/src/pages/achievements/view/achievements-view.html b/src/pages/achievements/view/achievements-view.html index 827a9f34..f206d5d4 100755 --- a/src/pages/achievements/view/achievements-view.html +++ b/src/pages/achievements/view/achievements-view.html @@ -13,7 +13,7 @@ /> - Points + {{ 'ACTIVITY.POINTS' | translate }} {{ this.achievement.points }} diff --git a/src/pages/achievements/view/achievements-view.page.ts b/src/pages/achievements/view/achievements-view.page.ts index 5c3455d6..451808e4 100755 --- a/src/pages/achievements/view/achievements-view.page.ts +++ b/src/pages/achievements/view/achievements-view.page.ts @@ -1,6 +1,6 @@ import { Component } from '@angular/core'; import { NavParams } from 'ionic-angular'; - +import { TranslationService } from '../../../shared/translation/translation.service'; let _mock = { "id": 59, "name": "Test Achievement", @@ -24,6 +24,7 @@ export class AchievementsViewPage { constructor( private params: NavParams, + public translationService: TranslationService ) { this.achievement = {}; } diff --git a/src/pages/activities/list/activities-list.page.ts b/src/pages/activities-classic/list/activities-classic-list.page.ts similarity index 95% rename from src/pages/activities/list/activities-list.page.ts rename to src/pages/activities-classic/list/activities-classic-list.page.ts index 873e82dd..9a5d9f0f 100644 --- a/src/pages/activities/list/activities-list.page.ts +++ b/src/pages/activities-classic/list/activities-classic-list.page.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; import { NavController, ToastController, LoadingController } from 'ionic-angular'; -import { ActivitiesViewPage } from '../view/activities-view.page'; +import { ActivitiesViewPage } from '../../activities/view/activities-view.page'; import { ActivityService } from '../../../services/activity.service'; declare var _: any; @@ -9,7 +9,7 @@ declare var _: any; @Component({ templateUrl: './list.html' }) -export class ActivitiesListPage { +export class ActivitiesClassicListPage { private activities: Array = []; constructor( diff --git a/src/pages/activities-classic/list/list.html b/src/pages/activities-classic/list/list.html new file mode 100644 index 00000000..37b14848 --- /dev/null +++ b/src/pages/activities-classic/list/list.html @@ -0,0 +1,18 @@ + + + Activities + + + + + + + + + + +

{{activity.name}}

+
+
diff --git a/src/pages/activities-classic/list/list.scss b/src/pages/activities-classic/list/list.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/pages/activities/list/list.html b/src/pages/activities/list/list.html index 4679cf1e..1900f585 100644 --- a/src/pages/activities/list/list.html +++ b/src/pages/activities/list/list.html @@ -1,9 +1,20 @@ - Dashboard + + + + New Items + + + + + {{ 'ACTIVITY.PAGETITLE' | translate }} - + -
- -
-
-

{{ 'ACTIVITY.PROGRESS' | translate }}

-

{{ pointPercentage }}%

-
+ +
+
+

{{ 'ACTIVITY.PROGRESS' | translate }}

+

{{ currentPercentage }}%

- - -
-
-

{{ 'ACTIVITY.POINTS' | translate }}

-

{{ currentPoints }}

-
+
+
+ +
+
+

{{ 'ACTIVITY.POINTS' | translate }}

+ +

{{ characterCurrentExperience }}

- -
+
+
+

{{ activitiesLoadingErr }} @@ -55,3 +66,25 @@

{{ currentPoints }}

+ + + + + + + + item + item +

+ {{ item.name }} x{{ item.count[0].count }} +

+
+
+ +
+
+
+
+
diff --git a/src/pages/activities/list/list.page.ts b/src/pages/activities/list/list.page.ts index f1a0fa55..e9ef670b 100755 --- a/src/pages/activities/list/list.page.ts +++ b/src/pages/activities/list/list.page.ts @@ -1,91 +1,93 @@ import { Component, Input, OnInit } from '@angular/core'; -import { NavController, ToastController, LoadingController, ModalController } from 'ionic-angular'; +import { + NavController, + ToastController, + LoadingController, + ModalController +} from 'ionic-angular'; import { Http } from '@angular/http'; import { Observable } from 'rxjs/Observable'; -import { TranslateService } from '@ngx-translate/core'; -import { i18nData } from '../../../app/i18n-en'; -import { loadingMessages, errMessages } from '../../../app/messages'; -import 'rxjs/add/observable/forkJoin'; -import 'rxjs/add/operator/map'; +import { TranslationService } from '../../../shared/translation/translation.service'; +import { loadingMessages, errMessages } from '../../../app/messages'; +import * as _ from 'lodash'; // services import { ActivityService } from '../../../services/activity.service'; import { AchievementService } from '../../../services/achievement.service'; +import { GameService } from '../../../services/game.service'; +import { SubmissionService } from '../../../services/submission.service'; +import { CacheService } from '../../../shared/cache/cache.service'; +import { CharacterService } from '../../../services/character.service'; // pages import { ActivitiesViewPage } from '../view/activities-view.page'; import { ActivityListPopupPage } from './popup'; +import { ItemsPopupPage } from '../../assessments/popup/items-popup.page'; +import { TabsPage } from '../../../pages/tabs/tabs.page'; // pipes import { TruncatePipe } from '../../../pipes/truncate.pipe'; +/** + * @TODO: remove after development is complete + * flag to tell whether should UI popup toast error message at the bottom + * @type {Boolean} + */ + @Component({ selector: 'activities-list-page', templateUrl: 'list.html' }) export class ActivitiesListPage implements OnInit { - public activities = []; + public anyNewItems: any = this.cacheService.getLocal('gotNewItems'); + public newItemsData: any = []; + public activities: any = []; + public currentPercentage: any = 0; + public initialItems: any = []; public totalAchievements: any = []; public currentPoints: number = 0; public maxPoints: number = 0; - public pointPercentage: number = 0; - public percentageValue: any = 0; + public filteredSubmissions: any = []; + public characterData: any = []; + public submissionData: any = []; + public characterCurrentExperience: number = 0; + public percentageValue: number = 0; + public submissionPoints: number = 0; public returnError: boolean = false; + // loading & err message variables public activitiesLoadingErr: any = errMessages.General.loading.load; public activitiesEmptyDataErr: any = errMessages.Activities.activities.empty; + // Achievements + private achievements = { + maxPoint: {}, + obtained: {}, + available: [] + }; constructor( public navCtrl: NavController, public http: Http, public activityService: ActivityService, public achievementService: AchievementService, + public gameService: GameService, + public submissionService: SubmissionService, + public cacheService: CacheService, + public characterService: CharacterService, public toastCtrl: ToastController, public loadingCtrl: LoadingController, public modalCtrl: ModalController, - public translate: TranslateService + public translationService: TranslationService ) { - translate.addLangs(["en"]); - translate.setDefaultLang('en'); - translate.use('en'); + this.anyNewItems = this.cacheService.getLocal('gotNewItems'); + this.newItemsData = this.cacheService.getLocalObject('allNewItems'); + console.log("item data: ", this.newItemsData); } - - ngOnInit(){ - this.loadingAchievements(); + ngOnInit() { + this.loadingDashboard(); } - // display user achievemnt statistics score points - loadingAchievements(){ - let loadingFailed = this.toastCtrl.create({ - message: this.activitiesLoadingErr, - duration: 4000, - position: 'bottom' - }); - let getUserAchievements = this.achievementService.getAchievements(); - let getAllAchievements = this.achievementService.getAllAchievements(); - let getMaxPoints = this.achievementService.getMaxPoints(); - Observable.forkJoin([getUserAchievements, getAllAchievements, getMaxPoints]) - .subscribe(results => { - this.totalAchievements = results; - console.log(this.totalAchievements); - console.log("Max Points: ", results[2].max_achievable_points); - this.maxPoints = results[2].max_achievable_points; - this.currentPoints = results[0].total_points; - if(this.currentPoints >= 0 && this.currentPoints <= this.maxPoints){ - this.percentageValue = (Math.round( ((this.currentPoints / this.maxPoints) * 100) * 10 ) / 10); - (this.percentageValue % 1 === 0) ? this.pointPercentage = this.percentageValue : this.pointPercentage = this.percentageValue.toFixed(1); - }else if(this.currentPoints > this.maxPoints){ - this.pointPercentage = 100; - }else { - this.currentPoints = 0; - this.maxPoints = 0; - this.pointPercentage = 0; - } - }, - err => { - this.currentPoints = 0; - this.maxPoints = 0; - this.pointPercentage = 0; - loadingFailed.present(); - } - ); + // refresher activities + doRefresh(e) { + this.loadingDashboard(); + e.complete(); } - // loading activity list data - loadingActivities(){ - let loadingActivities = this.loadingCtrl.create({ + // display user achievemnt statistics score points + loadingDashboard() { + let loadingData = this.loadingCtrl.create({ content: 'Loading ..' }); let loadingFailed = this.toastCtrl.create({ @@ -93,37 +95,71 @@ export class ActivitiesListPage implements OnInit { duration: 4000, position: 'bottom' }); - loadingActivities.present(); - this.activityService.getActivities() - .subscribe( - data => { - this.activities = data; + let getActivities = this.activityService.getList(); + loadingData.present().then(() => { + getActivities.subscribe( + results => { + this.activities = results; if(this.activities.length == 0){ this.returnError = true; } - loadingActivities.dismiss().then(() => { - console.log("Activities: ", this.activities); - }); + let getCharacter = this.characterService.getCharacter(); + let getSubmission = this.submissionService.getSubmissionsData(); + Observable.forkJoin([getSubmission, getCharacter]) + .subscribe(results => { + loadingData.dismiss().then(() => { + this.submissionData = results[0]; + _.forEach(this.submissionData, element => { + if(element.AssessmentSubmission.status == 'published' || element.AssessmentSubmission.status == 'done'){ + if(element.AssessmentSubmission.moderated_score !== null){ + this.filteredSubmissions.push(element.AssessmentSubmission); + this.submissionPoints += parseFloat(element.AssessmentSubmission.moderated_score); + } + } + }); + let average_score = (this.submissionPoints/this.filteredSubmissions.length)*100; + (average_score > 0) ? this.percentageValue = average_score : this.percentageValue = 0; + this.currentPercentage = this.percentageValue.toFixed(2); + // console.log("Percent: ", this.currentPercentage); // display as string format + this.characterData = results[1].Characters[0]; + this.cacheService.setLocal('character_id', this.characterData.id); + console.log("character id: ", this.characterData.id); + this.characterCurrentExperience = this.characterData.experience_points; + // console.log("Experience: ", this.characterCurrentExperience); + this.gameService.getGameItems(this.characterData.id) + .subscribe( + data => { + this.initialItems = data.Items; + this.cacheService.setLocalObject('initialItems', this.initialItems); + console.log("Items Data: ", this.initialItems); + }, + err => { + console.log("Items Data error: ", err); + } + ); + }); + }, + err => { + loadingData.dismiss().then(() => { + loadingFailed.present(); + }); + } + ); }, - err => { - loadingActivities.dismiss().then(() => { + error => { + loadingData.dismiss().then(() => { loadingFailed.present(); }); } - ) - } - // load activity data - ionViewWillEnter() { - this.loadingActivities(); - } - // refresher activities - doRefresh(e) { - this.loadingActivities() - e.complete(); + ); + }); } // redirect to activity detail page goToDetail(activity: any, id: any){ - this.navCtrl.push(ActivitiesViewPage, { activity: activity, id: id }); + this.navCtrl.push(ActivitiesViewPage, { + achievements: this.achievements, + activity: activity + }); } // view the disabled activity popup goToPopup(unlock_id: any){ @@ -131,4 +167,11 @@ export class ActivitiesListPage implements OnInit { console.log("Achievement ID: ", unlock_id); disabledActivityPopup.present(); } + // close modal and display as main page + closeItemsShwon(){ + this.anyNewItems = !this.cacheService.getLocal('gotNewItems'); + this.cacheService.setLocalObject('allNewItems', []); + this.cacheService.setLocal('gotNewItems', !this.cacheService.getLocal('gotNewItems')); + this.navCtrl.setRoot(TabsPage); + } } diff --git a/src/pages/activities/list/popup.html b/src/pages/activities/list/popup.html index 5b35dfd3..d1f46a25 100644 --- a/src/pages/activities/list/popup.html +++ b/src/pages/activities/list/popup.html @@ -2,15 +2,9 @@ - + {{ achievementName }} - - -
- - × - -
+
@@ -23,10 +17,10 @@ diff --git a/src/pages/activities/list/popup.ts b/src/pages/activities/list/popup.ts index a478e43d..52ae0be4 100644 --- a/src/pages/activities/list/popup.ts +++ b/src/pages/activities/list/popup.ts @@ -1,14 +1,14 @@ -import { Component, Injectable } from '@angular/core'; +import { Component } from '@angular/core'; import { ViewController, ToastController, LoadingController, NavParams } from 'ionic-angular'; import { TranslateService } from '@ngx-translate/core'; -import { i18nData } from '../../../app/i18n-en'; -import { loadingMessages, errMessages } from '../../../app/messages'; +import { i18nData } from '../../../app/i18n-en'; +import { loadingMessages, errMessages } from '../../../app/messages'; // services import { AchievementService } from '../../../services/achievement.service'; -@Injectable() + @Component({ selector: 'activity-list-popup', - templateUrl: 'popup.html' + templateUrl: 'popup.html' }) export class ActivityListPopupPage { public unlock_id: any; @@ -21,18 +21,19 @@ export class ActivityListPopupPage { public loadingMessage: any = loadingMessages.LoadingSpinner.loading; public achievementsLoadingErr: any = errMessages.General.loading.load; public achievementsEmptyDataErr: any = errMessages.Activities.achievements.empty; - constructor(private viewCtrl: ViewController, - private navParams: NavParams, - private toastCtrl: ToastController, - private loadingCtrl: LoadingController, - private achievementService: AchievementService, - private translate: TranslateService){ - this.unlock_id = this.navParams.get('unlock_id'); - console.log('Unlock id value: ', this.unlock_id); - translate.addLangs(["en"]); - translate.setDefaultLang('en'); - translate.use('en'); - } + + constructor( + private viewCtrl: ViewController, + private navParams: NavParams, + private toastCtrl: ToastController, + private loadingCtrl: LoadingController, + private achievementService: AchievementService, + public translationService: TranslateService + ) { + this.unlock_id = this.navParams.get('unlock_id'); + // console.log('Unlock id value: ', this.unlock_id); + } + ionViewWillEnter(){ let loader = this.loadingCtrl.create({ content: this.loadingMessage @@ -48,7 +49,7 @@ export class ActivityListPopupPage { position: 'bottom' }); loader.present().then(() => { - this.achievementService.getAllAchievements() + this.achievementService.getAll() .subscribe( data => { if(data.length > 0){ @@ -63,7 +64,7 @@ export class ActivityListPopupPage { }); }else { this.enableData = false; - loader.dismiss().then(() => { + loader.dismiss().then(() => { nothingLoaded.present(); }); } @@ -81,4 +82,4 @@ export class ActivityListPopupPage { closeModal() { this.viewCtrl.dismiss(); } -} \ No newline at end of file +} diff --git a/src/pages/activities/view/activities-view.page.ts b/src/pages/activities/view/activities-view.page.ts index 4ebc02fb..f5e769f1 100644 --- a/src/pages/activities/view/activities-view.page.ts +++ b/src/pages/activities/view/activities-view.page.ts @@ -1,23 +1,44 @@ import { Component } from '@angular/core'; -import { ModalController, NavParams, NavController } from 'ionic-angular'; +import { ModalController, NavParams, NavController, AlertController } from 'ionic-angular'; +import { Observable } from 'rxjs/Observable'; +// pages import { ActivitiesViewModalPage } from './activities-view-modal.page'; import { AssessmentsPage } from '../../assessments/assessments.page'; +import { ActivityService } from '../../../services/activity.service'; +import { SubmissionService } from '../../../services/submission.service'; +import * as _ from 'lodash'; @Component({ templateUrl: './view.html' }) - export class ActivitiesViewPage { activity: any = {}; + assessment: any = {}; + assessments: any = {}; submissions: Array = []; - activityData = {}; + achievements: any = { + available: [], + obtained: {}, + maxPoints: {} + }; + loadings = { + submissions: false + }; + constructor( private navParams: NavParams, private navCtrl: NavController, - private modalCtrl: ModalController + private modalCtrl: ModalController, + private activityService: ActivityService, + private submissionService: SubmissionService, + private alertCtrl: AlertController ) { } + ionViewWillEnter(): void { + this.loadings.submissions = true; + } + // @TODO: use simple mock data for assessment first /** * on assessment implementation, to do list: @@ -27,49 +48,63 @@ export class ActivitiesViewPage { * - change template view based on responded data format */ ionViewDidEnter(): void { - this.activity = this.navParams.get('activity'); - // console.log("Specific Activity Data, ", this.activity); - this.activityData = this.activity.Activity; - console.log("Specific Activity Data, ", this.activityData); - this.activity.badges = [ - { - url: 'http://leevibe.com/images/category_thumbs/video/19.jpg', - disabled: true, - }, - { - url: 'http://mobileapp.redcross.org.uk/achievements/heart-icon.png', - disabled: true, - }, - { - url: 'http://americanredcross.3sidedcube.com/media/45334/fire-large.png', - disabled: false, - }, - ]; + // assessment + this.activity = this.activityService.normaliseActivity(this.navParams.get('activity') || {}); + this.assessments = this.activity.sequences || []; + this.assessment = this.activity.assessment; - let submission = []; - if (this.activity.Activity.name === 'Workshop-2') { - submission.push({ - title: 'Submission 1', - submittedOn: 'Thu Jun 19 2017 17:37:08', - status: 'Pending Review' - }); - this.activity.badges.map((badge, index) => { - if (index === 1 || index === 0) { - badge.disabled = false; - } else { - badge.disabled = true; + // submission + this.submissions = []; + Observable.forkJoin(this.submissionService.getSubmissionsByReferences(this.activity.References)).subscribe(responses => { + // turn nested array into single dimension array + responses.forEach((submissions: Array) => { + if (submissions.length > 0) { + this.submissions = submissions.map(submission => { + return this.submissionService.normalise(submission); + }); + this.submissions = _.orderBy(this.submissions, 'created', 'desc'); // latest at top } }); - } else { - submission.push({ - title: 'Submission 1', - submittedOn: '', - status: 'Do Now' + + this.loadings.submissions = false; + }); + + // badges + this.achievements = this.navParams.get('achievements'); + this.activity.badges = this.extractBadges(); + this.activity.badges.map((badge, index) => { + if ((this.activity.id % 3) != 0) { + badge.disabled = false; + } else { + badge.disabled = true; + } + }); + } + + // extract "in progress" + inProgressSubmission() { + let result = []; + (this.submissions || []).forEach(submission => { + if (submission.status === 'in progress') { + result.push(submission); + } + }); + return result; + } + + private extractBadges(): Array { + let result = []; + if (this.achievements.available && this.achievements.available.length > 0) { + this.achievements.available.forEach(achievement => { + if (achievement.Achievement.badge) { + result.push({ + url: achievement.Achievement.badge, + disabled: false + }); + } }); } - - this.submissions = submission; - console.log(this.activity); + return result; } /** @@ -81,11 +116,33 @@ export class ActivitiesViewPage { } /** + * @name goAssessment * @description direct to assessment page of a selected activity * @param {Object} activity single activity object from the list of - * activities respond from get_activities API + * activities respond from get_activities API + * @param {Object} opts optional object with + * - hasSubmission: to indicateif user is accessing a in + * progress assessment */ - goAssessment(activity) { - this.navCtrl.push(AssessmentsPage, {activity}); + goAssessment(submission?, opts = { hasSubmission: false }) { + if ((this.inProgressSubmission()).length > 0 && opts.hasSubmission === false) { + let alert = this.alertCtrl.create({ + title: 'You have a submission in progress.', + buttons: ["Ok"] + }); + alert.present(); + } else if (opts.hasSubmission === true) { + this.navCtrl.push(AssessmentsPage, { + activity: this.activity, + assessment: this.assessment, + submissions: this.submissions, + currentSubmission: submission + }); + } else { + this.navCtrl.push(AssessmentsPage, { + activity: this.activity, + assessment: this.assessment + }); + } } } diff --git a/src/pages/activities/view/view.html b/src/pages/activities/view/view.html index 546b4fdf..18bb82ca 100644 --- a/src/pages/activities/view/view.html +++ b/src/pages/activities/view/view.html @@ -1,12 +1,13 @@ - {{ activityData.name }} - + {{ activity.name }} + + @@ -17,17 +18,20 @@ + - - + @@ -35,23 +39,32 @@ + - Submission + {{ 'ACTIVITY.SUBMISSION' | translate }} - + + + Loading submissions... + + + +
-

{{ submission.title }}

-

{{ submission.submittedOn | timeago }}

+

{{ (submission.submitted || submission.created).format() | amDateFormat:"MMM D YYYY, h:mm a" }}

+ {{ submission.status }} +
+
diff --git a/src/pages/assessments/assessments.html b/src/pages/assessments/assessments.html index be51783b..61a5dbc8 100644 --- a/src/pages/assessments/assessments.html +++ b/src/pages/assessments/assessments.html @@ -1,22 +1,32 @@ - {{ assessment.name }} + - - - -
-
-
+
+
- - + + +

{{ assessment.name }}

+
+
+
+ + + +
+
diff --git a/src/pages/assessments/assessments.page.ts b/src/pages/assessments/assessments.page.ts index aae3c99e..afef3587 100644 --- a/src/pages/assessments/assessments.page.ts +++ b/src/pages/assessments/assessments.page.ts @@ -2,13 +2,31 @@ import { Component, ViewChild } from '@angular/core'; import { NavParams, NavController, - AlertController, Navbar, - LoadingController + LoadingController, + AlertController, + ModalController, + Events } from 'ionic-angular'; -import { CacheService } from '../../shared/cache/cache.service'; +import { Observable } from 'rxjs/Observable'; import { AssessmentService } from '../../services/assessment.service'; +import { CacheService } from '../../shared/cache/cache.service'; +import { CharacterService } from '../../services/character.service'; +import { GameService } from '../../services/game.service'; +import { SubmissionService } from '../../services/submission.service'; +// pages +import { AssessmentsGroupPage } from './group/assessments-group.page' +import { ItemsPopupPage } from './popup/items-popup.page'; +// import { TabsPage } from '../../pages/tabs/tabs.page'; +import { ActivitiesListPage } from '../activities/list/list.page'; +class ActivityBase { + id: number; + name: string; + description: string; +} +import { TranslationService } from '../../shared/translation/translation.service'; +import { confirmMessages, errMessages, loadingMessages } from '../../app/messages'; import * as _ from 'lodash'; @Component({ @@ -21,68 +39,58 @@ export class AssessmentsPage { activity: any = {}; answers: any = {}; - assessment: any = {}; + // assessment: any = {}; assessmentGroups: any = []; assessmentQuestions: any = []; - allowSubmit: any = true; + allowSubmit: boolean = false; + submissions: any = []; + submissionUpdated: boolean = false; // event listener flag + getInitialItems: any = this.cacheService.getLocalObject('initialItems'); + getCharacterID: any = this.cacheService.getLocal('character_id'); + gotNewItems: boolean = false; + isEventSubmission: boolean = false; + initialItemsCount: any = {}; + newItemsCount: any = {}; + newItemsData: any = []; + totalItems: any = []; + allItemsData: any = []; + combinedItems: any = []; + public loadingMessages: any = loadingMessages.LoadingSpinner.loading; + // confirm message variables + private discardConfirmMessage = confirmMessages.Assessments.DiscardChanges.discard; + private submitConfirmMessage = confirmMessages.Assessments.SubmitConfirmation.confirm; constructor( private navParams: NavParams, private alertCtrl: AlertController, - private cache: CacheService, private navCtrl: NavController, private loadingCtrl: LoadingController, - private assessmentService: AssessmentService + private assessmentService: AssessmentService, + private characterService: CharacterService, + private cacheService: CacheService, + private gameService: GameService, + private submissionService: SubmissionService, + private translationService: TranslationService, + public modalCtrl: ModalController, + public events: Events ) { this.activity = this.navParams.get('activity'); - console.log('this.activity', this.activity); - } - - ionViewDidLoad() { - // Custom back button on page - this.navbar.backButtonClick = (e: UIEvent) => { - this.clickDiscard(); + if (!this.activity) { + throw "Fatal Error: Activity not available"; } - } - loadQuestions(): Promise { - return new Promise((resolve, reject) => { - this.assessmentService.getAll({ - search: { - assessment_id: this.activity.sequences[0]['Assess.Assessment'].id - } - }).subscribe(assessmentData => { - console.log('assessmentData', assessmentData); - this.assessment = assessmentData[0].Assessment; - this.assessmentGroups = assessmentData[0].AssessmentGroup; - this.assessmentQuestions = assessmentData[0].AssessmentQuestion; - - _.forEach(this.assessmentQuestions, (question, key) => { - // Inject answers - if (this.answers[question.id]) { - this.assessmentQuestions[key].answer = this.answers[question.id]; - } else { - // Set allowSubmit to false when some assessment no answer - this.allowSubmit = false; - this.assessmentQuestions[key].answer = null; - } - }); - - return resolve(); - }, reject); - }); + console.log('this.activity', this.activity); } ionViewWillEnter() { - // Hardcoded answers for now - this.answers = this.cache.getLocalObject('answers') || {}; let loader = this.loadingCtrl.create(); - loader.present().then(() => { this.loadQuestions() .then(() => { loader.dismiss(); + }, err => { + console.log('log::', err); }) .catch((err) => { console.log(err); @@ -91,49 +99,392 @@ export class AssessmentsPage { }); } - doDiscard() { - this.cache.setLocalObject('answers', {}); + /** + * track if this page need to download assessment manually (extra load) + */ + traceAssessmentProgress() { + this.events.subscribe('assessment:changes', (submissionUpdated) => { + this.submissionUpdated = true; + }); } - clickDiscard() { - // Send alert to user before user click back page - // If user click okay will remove all answers in local storage - // No data will send to server - const confirm = this.alertCtrl.create({ - title: 'Discard all change', - message: 'Do you really want to discard all your change?', - buttons: [ - { - text: 'Okay', - handler: () => { - this.doDiscard(); - this.navCtrl.pop(); + /** + * @description mapping assessments and submissions + * @param {Object} submissions submissions + * @param {Object} assessments assessments + */ + mapSubmissionsToAssessment(submissions, assessments) { + _.forEach(assessments, (group, i) => { + _.forEach(group, (assessment, j) => { + + // normalise + assessments[i][j] = assessment = this.assessmentService.normalise(assessment); + console.log('assessment', assessment); + + _.forEach(assessment.AssessmentGroup, (assessmentGroup, k) => { + _.forEach(assessmentGroup.questions, (question, l) => { + // Inject empty answer fields + // We will know thare are no submission when it is null + assessments[i][j].AssessmentGroup[k].questions[l].answer = null; + assessments[i][j].AssessmentGroup[k].questions[l].reviewerAnswer = null; + + // find submission + _.forEach(submissions, (submission) => { + // attach existing submission to assessment group it belongs to + let group = this.assessmentGroups[i][j].AssessmentGroup[k]; + if (group.assessment_id === submission.assessment_id) { + this.assessmentGroups[i][j].AssessmentGroup[k].submission = submission; + } + + // find user answer + _.forEach(submission.answer, (answer) => { + if (answer.assessment_question_id === question.id) { + assessments[i][j].AssessmentGroup[k].questions[l].answer = answer; + } + }); + + // find reviewer feedback + _.forEach(submission.review, (reviewerAnswer) => { + if (reviewerAnswer.assessment_question_id === question.id) { + assessments[i][j].AssessmentGroup[k].questions[l].reviewerAnswer = reviewerAnswer; + } + }); + }); + + }); + + // Summarise basic answer information + // get total number of questions + assessments[i][j].AssessmentGroup[k].totalRequiredQuestions = 0; + _.forEach(assessmentGroup.questions, (q) => { + if (q.required) { + assessments[i][j].AssessmentGroup[k].totalRequiredQuestions += 1; + } + }); + + // get total number of answered questions + assessments[i][j].AssessmentGroup[k].answeredQuestions = 0; + _.forEach(assessmentGroup.questions, (q) => { + if (q.required && q.answer && q.answer !== null) { + assessments[i][j].AssessmentGroup[k].answeredQuestions += 1; + } + }); + + // get total number of feedback + assessments[i][j].AssessmentGroup[k].reviewerFeedback = 0; + _.forEach(assessmentGroup.questions, (q) => { + // If API response, the reviewer's answer and comment are empty, + // front-end don't consider it as a feedback + if ( + q.reviewerAnswer && + q.reviewerAnswer !== null && + !_.isEmpty(q.reviewerAnswer.answer) && + !_.isEmpty(q.reviewerAnswer.comment) + ) { + assessments[i][j].AssessmentGroup[k].reviewerFeedback += 1; + } + }); + + // Set status + // let status = assessments[i][j].AssessmentGroup[k].status = 'incomplete'; + let questionsStatus = []; + _.forEach(assessmentGroup.questions, (q) => { + if (q.required && q.answer !== null) { + if ( + q.reviewerAnswer !== null && + assessmentGroup.submission.status !== 'pending approval' && + (q.reviewerAnswer.answer || q.reviewerAnswer.comment) + ) { + questionsStatus.push('reviewed'); + } else { + questionsStatus.push('completed'); + } + } + + if (!q.required && q.answer !== null) { + if ( + q.reviewerAnswer !== null && + assessmentGroup.submission.status !== 'pending approval' && + (q.reviewerAnswer.answer || q.reviewerAnswer.comment) + ) { + questionsStatus.push('reviewed'); + } else { + questionsStatus.push('completed'); + } + } + + if (q.answer === null) { + questionsStatus.push('incomplete'); + } + + // if (q.required && q.answer === null) { + // questionsStatus.push('incomplete'); + // } + // + // if (!q.required && q.answer === null) { + // questionsStatus.push('completed'); + // } + }); + + console.log('questionsStatus', questionsStatus); + + assessments[i][j].AssessmentGroup[k].status = 'incomplete'; + if (_.every(questionsStatus, (v) => { + return (v === 'completed'); + })) { + assessments[i][j].AssessmentGroup[k].status = 'completed'; } - }, - { - text: 'Cancel', - handler: () => { - console.log('Discard cancelled'); + if (_.includes(questionsStatus, 'reviewed')) { + assessments[i][j].AssessmentGroup[k].status = 'reviewed'; + } + }); + + console.log('assessment 2', assessment); + }); + }); + + return assessments; + } + + /** + * pull submission when required, when: + * - no submission available in the redirection from activity-view/event-view pages + * - [save] clicked & saved from assessment-group.page.ts + * + * @return {Promise} + */ + private pullSubmissions(): Promise { + return new Promise((resolve, reject) => { + // 2nd batch API requests (get_submissions) + Observable.forkJoin( + this.submissionService.getSubmissionsByReferences( + this.activity.References + )) + .subscribe(allSubmissions => { + // allSubmissions - response format: [ // context_ids + // [ // assessment group 1 + // assessment1, + // assessment2, + // ... + // ], + // [ // assessment group 2 + // assessment1, + // assessment2, + // ... + // ], + // ... + // ] + let submissions = []; + _.forEach(allSubmissions, group => { + _.forEach(group, (submission) => { + submissions.push(this.submissionService.normalise(submission)); + }); + }); + + // check if a submission is specified + let currentSubmission = this.navParams.get('currentSubmission'); + let filteredSubmissions = []; + + submissions.forEach(subm => { + if (currentSubmission && currentSubmission.id === subm.id) { + filteredSubmissions.push(subm); + } + }); + let hasInProgress = _.find(submissions, {status: 'in progress'}); // "in progress" never > 1 + let isNew = (!currentSubmission && (filteredSubmissions.length === 0 || !_.isEmpty(hasInProgress))); + + if (isNew) { // new submission + this.submissions = !_.isEmpty(hasInProgress) ? [hasInProgress] : []; + } else if (!isNew && hasInProgress) { // resume "in progress" + filteredSubmissions.push(hasInProgress); + this.submissions = filteredSubmissions; + } else if (currentSubmission) { // display current submission + filteredSubmissions.push(currentSubmission); + this.submissions = filteredSubmissions; } + + console.log('this.submissions', this.submissions); + resolve(submissions); + }, err => { + console.log('err', err); + reject(err); + }); + }); + } + + loadQuestions(): Promise { + return new Promise((resolve, reject) => { + + // get_assessments request with "assessment_id" & "structured" + let getAssessment = (assessmentId) => { + return this.assessmentService.getAll({ + search: { + assessment_id: assessmentId, + structured: true + } + }); + }; + + // Congregation of assessment ids to fulfill get_assessments API's param requirement + let tasks = []; + _.forEach(this.activity.References, (reference) => { + if ( + reference.Assessment && + reference.Assessment.id + ) { + return tasks.push(getAssessment(reference.Assessment.id)); } - ] + }); + + /** + * merging submission into question inside of assessment array objects + * - set question statuses (quantity of total answered) + * - set submission button status + */ + let preprocessAssessmentSubmission = () => { + this.assessmentGroups = this.mapSubmissionsToAssessment( + this.submissions, + this.assessmentGroups + ); + + // Only allow submit when all required question have answered. + _.forEach(this.assessmentGroups, groups => { + _.forEach(groups, assessment => { + let groupWithAnswers = 0; + _.forEach(assessment.AssessmentGroup, group => { + // console.log('group.answeredQuestions', group.answeredQuestions); + // console.log('group.totalRequiredQuestions', group.totalRequiredQuestions); + if (group.answeredQuestions >= group.totalRequiredQuestions) { + groupWithAnswers += 1; + } + }); + // console.log('groupWithAnswers', groupWithAnswers, _.size(assessment.AssessmentGroup)); + if (groupWithAnswers >= _.size(assessment.AssessmentGroup)) { + this.allowSubmit = true; + } + }); + }); + + _.forEach(this.submissions, submission => { + if ( + submission.status === 'pending review' || + submission.status === 'pending approval' || + submission.status === 'published' || // moderated type (reviews & published) + submission.status === 'done' // survey type + ) { + this.allowSubmit = false; + } + }); + + resolve({ + assessmentGroups: this.assessmentGroups, + submissions: this.submissions + }); + }; + + // first batch API requests (get_assessments) + Observable.forkJoin(tasks) + .subscribe( + (assessments: any) => { + this.assessmentGroups = assessments; + this.submissions = this.navParams.get('submissions'); + + // check if this is from single submission view + let currentSubmission = this.navParams.get('currentSubmission'); + if (currentSubmission) { + this.submissions = [currentSubmission]; + console.log(this.navParams.get('currentSubmission'), this.submissions); + } + + // pull new when submission is updated or currentSubmission is empty + if (this.submissionUpdated || !currentSubmission) { + this.pullSubmissions().then(res => { + preprocessAssessmentSubmission(); + }, err => { + reject(err); + }); + this.submissionUpdated = false; + } else { + preprocessAssessmentSubmission(); + } + }, + (err) => { + console.log('err', err); + reject(err); + } + ); }); - confirm.present(); } + /** + * submit answer and change submission status to done + */ doSubmit() { - console.log('Okay'); + let loading = this.loadingCtrl.create({ + content: 'Loading...' + }); + + loading.present().then(() => { + let tasks = []; + _.forEach(this.submissions, (submission) => { + console.log('submission', submission); + + if ( + submission && + submission.assessment_id && + submission.context_id && + submission.id + ) { + tasks.push(this.assessmentService.submit({ + Assessment: { + id: submission.assessment_id, + context_id: submission.context_id, + in_progress: false + }, + AssessmentSubmission: { + id: submission.id + }, + AssessmentSubmissionAnswer: _.map(submission.answer, (answ) => { + if (answ && answ.assessment_question_id && answ.answer) { + return { + assessment_question_id: answ.assessment_question_id, + answer: answ.answer + } + } + }) + })); + } + }); + + Observable + .forkJoin(tasks) + .subscribe( + (assessments: any) => { + loading.dismiss().then(_ => { + console.log('assessments', assessments); + this.allowSubmit = false; + this.popupAfterSubmit(); + }); + }, + err => { + loading.dismiss().then(_ => { + console.log('err', err); + }); + } + ); + }); } clickSubmit() { const confirm = this.alertCtrl.create({ title: 'Submit evidence', - message: 'Do you really want to submit this evidence?', + message: this.submitConfirmMessage, buttons: [ { text: 'Okay', handler: () => { - this.doSubmit(); + // this.doSubmit(); + this.popupAfterSubmit(); } }, { @@ -147,38 +498,119 @@ export class AssessmentsPage { confirm.present(); } - // @TODO: Remove it later... - clickFillAllAnswers() { - _.forEach(this.assessmentQuestions, (question, key) => { - console.log('q', question); - if (question.question_type === 'file') { - this.answers[question.id] = { - type: 'file', - files: [ - { - mime: 'image/jpeg', - url: 'https://placeimg.com/100/100/nature/grayscale' - }, - { - mime: 'image/jpeg', - url: 'https://placeimg.com/100/100/nature/grayscale' - } - ] - }; - } + // items popup + popupAfterSubmit(){ + const loading = this.loadingCtrl.create({ + content: this.loadingMessages + }); + const alert = this.alertCtrl.create({ + title: 'Submission Successful', + buttons: [ + { + text: 'OK', + handler: () => { + this.navCtrl.setRoot(ActivitiesListPage); // dashboard page + } + } + ] + }); - if (question.question_type === 'oneof') { - this.answers[question.id] = { - type: 'file', - answers: [ - { - context: 'This is answer for ' + question.assessment_id - } - ] - }; + // get initial items + console.log('Inital Items: ', this.getInitialItems); + _.forEach(this.getInitialItems, element => { + let id = element.id; + console.log("id value: ", id); + if(!this.initialItemsCount[id]){ + this.initialItemsCount[id] = 0; } + this.initialItemsCount[id]++; + }); + console.log("Count for initial Items: ", this.initialItemsCount); + // get latest updated items data api call + loading.present(); - this.loadQuestions(); + this.gameService.getGameItems(this.getCharacterID) + .subscribe( + data => { + console.log("Items: ", data.Items); + this.newItemsData = data.Items; + _.forEach(data.Items, (element, index) => { + let id = element.id; + console.log("id value: ", id); + if(!this.newItemsCount[id]){ + this.newItemsCount[id] = 0; + } + this.newItemsCount[id]++; + }); + console.log("Count for final Items: ", this.newItemsCount); + // compare with previous get_characters() results and generate final index value array result + _.forEach(this.newItemsCount, (element, id) => { + if(!this.initialItemsCount[id]){ + this.totalItems.push({ "count": element, "id": id }); + }else { + let diffCountVal = element - this.initialItemsCount[id]; + if(diffCountVal > 0){ + this.totalItems.push({ "count": diffCountVal, "id": id }); + } + } + }); + console.log("New compared items: ", this.newItemsData); + // if(!this.totalItems){ + _.forEach(this.totalItems, (element, index) => { + element.id = parseInt(element.id); + }); + console.log("Count for new total Items: ", this.totalItems); + this.allItemsData = _.intersectionBy(this.newItemsData, this.totalItems, 'id'); + console.log("Final items object data: ", this.allItemsData); + // } + _.forEach(this.totalItems, (element, index) => { + element.id = parseInt(element.id); + }); + console.log("Count for new total Items: ", this.totalItems); + this.allItemsData = _.intersectionBy(this.newItemsData, this.totalItems, 'id'); + console.log("Final items object data: ", this.allItemsData); + // get the final object with item occurance count value + let groupData = _.groupBy(this.totalItems, 'id'); + console.log("Group?? ", groupData); + if(this.allItemsData.length === 0){ + this.gotNewItems = false; + this.cacheService.setLocal('gotNewItems', this.gotNewItems); + loading.onDidDismiss(() => { + alert.present(); // redirect to dashboard page + }); + loading.dismiss(); + }else { + _.map(this.allItemsData, (ele) => { + this.combinedItems.push(_.extend({count: groupData[ele.id] || []}, ele)) + console.log("Final Combined results: ", this.combinedItems); + }); + // display items on dashboard page + this.gotNewItems = true; + this.cacheService.setLocal('gotNewItems', this.gotNewItems); + this.cacheService.setLocalObject('allNewItems', this.combinedItems); + loading.onDidDismiss(() => { + this.navCtrl.setRoot(ActivitiesListPage); + }); + loading.dismiss(); + } + }, + err => { + loading.dismiss().then(() => { + console.log("Err: ", err); + }); + } + ); + } + gotoAssessment(assessmentGroup, activity) { + console.log('activity', activity); + this.navCtrl.push(AssessmentsGroupPage, { + assessmentGroup, + activity, + submission: assessmentGroup.submission, // use back the one back from ActivityViewPage + submissions: this.submissions, + event: this.navParams.get('event') + }).then(() => { + this.traceAssessmentProgress(); }); } } diff --git a/src/pages/assessments/assessments.scss b/src/pages/assessments/assessments.scss index 8214be31..16c581fd 100644 --- a/src/pages/assessments/assessments.scss +++ b/src/pages/assessments/assessments.scss @@ -1,3 +1,9 @@ assessments-page { + ion-card.no-box-shadow { + box-shadow: none; + } + .btn-submit[disabled] { + display: none; + } } diff --git a/src/pages/assessments/group/assessments-group.html b/src/pages/assessments/group/assessments-group.html new file mode 100644 index 00000000..43f8bcd9 --- /dev/null +++ b/src/pages/assessments/group/assessments-group.html @@ -0,0 +1,72 @@ + + + Assessment + + + + + + + + + + In Progress + + + + +
{{assessmentGroup.name}}
+

+
+ +
+ + + {{question.name}} + * + + + +

+
+ +
+
{{ submission | json }}
+
+ + + + + + + + + + + + + + + +
+
diff --git a/src/pages/assessments/group/assessments-group.page.ts b/src/pages/assessments/group/assessments-group.page.ts new file mode 100644 index 00000000..831d3576 --- /dev/null +++ b/src/pages/assessments/group/assessments-group.page.ts @@ -0,0 +1,407 @@ +import { Component } from '@angular/core'; +import { NavParams, NavController, AlertController, LoadingController, Events } from 'ionic-angular'; +import { FormBuilder, Validators, FormGroup, FormControl, FormArray } from '@angular/forms'; +import { CacheService } from '../../../shared/cache/cache.service'; +import { ChoiceBase, QuestionBase, Submission, AssessmentService } from '../../../services/assessment.service'; + +import * as _ from 'lodash'; + +@Component({ + selector: 'assessments-group-page', + templateUrl: './assessments-group.html', +}) +export class AssessmentsGroupPage { + questions = []; + formGroup; + + // used when navigate from event view page + event: any; + + //@TODO: decide which one to use + activity: any; + submission: Submission; + assessment: any; + assessmentGroup: any; + cacheKey: any; // to render & display stored + + canUpdateInput: boolean = false; + published: boolean = false; + answers: any; // to render & display submitted answers + inProgress: boolean | any; + + constructor( + private navParams: NavParams, + private navCtrl: NavController, + private fb: FormBuilder, + private cache: CacheService, + private assessmentService: AssessmentService, + private alertCtrl: AlertController, + private loadingCtrl: LoadingController, + public events: Events + ) {} + + ionViewDidEnter() { + // navigate from activity page + this.activity = this.navParams.get('activity') || {}; + + // navigate from event page + this.event = this.navParams.get('event') || {}; + if (!_.isEmpty(this.event)) { + this.activity = this.event; + } + + this.assessment = this.activity.assessment; // required for context_id + this.cacheKey = `assessment.group.${this.assessment.context_id}`; + + this.assessmentGroup = this.navParams.get('assessmentGroup') || {}; + this.submission = this.navParams.get('submission') || {}; + + console.log('this.assessmentGroup', this.assessmentGroup); + + // preset key used for caching later (locally and remote data) + this.canUpdateInput = this.isInputEditable(this.submission); + // this.published = this.assessmentService.isPublished(this.submissions); + this.questions = this.assessmentGroup.questions; + this.questions = this.mapQuestionsFeedback(this.questions, this.submission); + this.formGroup = this.retrieveProgress( + this.buildFormGroup(this.questions), + this.formInProgressAnswer(this.submission) + ); + } + + updateSubmission() { + this.events.publish('assessment:changes', { + changed: true + }); + } + + /** + * @description check answers are editable + * Must define submissions first + * @type {boolen} + */ + // @TODO modify needed + private isInputEditable = (submission):boolean => { + if (_.isEmpty(submission) || submission.status === 'in progress') { + return true; + } + return false; + // let editable = false; + // _.forEach(this.submissions, (submission) => { + // if (_.isEmpty(submission)) { + // editable = true; + // } else { + // _.forEach(submission, (subm) => { + // if ( + // subm.AssessmentSubmission && + // subm.AssessmentSubmission.status === 'in progress' + // ) { + // editable = true; + // } + // }); + // } + // }); + // return editable; + } + + /** + * @description use proper context id based on situation + * + * @type {array} + */ + // @TODO modify + private mapQuestionsFeedback = (questions, submission):any => { + if (_.isEmpty(submission) || _.isEmpty(submission.review) || submission.status !== 'published') { + return questions; + } + + _.forEach(submission.review, (review) => { + _.forEach(questions, (question, idx) => { + if (review.assessment_question_id === question.id) { + // text type + if (question.type === 'text') { + questions[idx].review_answer = review; + } + + // oneof type + if (question.type === 'oneof') { + questions[idx].review_answer = review; + _.forEach(question.choices, (choice, key) => { + if (choice.id == review.answer && choice.id == question.answer.answer) { + questions[idx].choices[key].name = choice.name + ' (you and reviewer)'; + } + if (choice.id != review.answer && choice.id == question.answer.answer) { + questions[idx].choices[key].name = choice.name + ' (you)'; + } + if (choice.id == review.answer && choice.id != question.answer.answer) { + questions[idx].choices[key].name = choice.name + ' (reviewer)'; + } + }); + } + } + }); + }); + + // _.forEach(submissions, (submission) => { + // _.forEach(submission, (subm) => { + // + // _.forEach(subm.AssessmentReviewAnswer, (reviewAnswer) => { + // _.forEach(questions, (question, idx) => { + // + // if (reviewAnswer.assessment_question_id === question.id) { + // // text type + // if (question.type === 'text') { + // questions[idx].review_answer = reviewAnswer; + // } + // + // // oneof type + // if (question.type === 'oneof') { + // questions[idx].review_answer = reviewAnswer; + // _.forEach(question.choices, (choice, key) => { + // if (choice.id == reviewAnswer.answer && choice.id == question.answer.answer) { + // questions[idx].choices[key].name = choice.name + ' (you and reviewer)'; + // } + // if (choice.id != reviewAnswer.answer && choice.id == question.answer.answer) { + // questions[idx].choices[key].name = choice.name + ' (you)'; + // } + // if (choice.id == reviewAnswer.answer && choice.id != question.answer.answer) { + // questions[idx].choices[key].name = choice.name + ' (reviewer)'; + // } + // }); + // } + // } + // + // }); + // }); + // }); + // }); + return questions; + } + + /** + * @description use proper context id based on situation + * event's checkin, use event context_id (reference array in get_event) + * assessment submission, use context_id from get_activity + * + * @type {number} + */ + private getSubmissionContext = ():number => { + // if event object is available + if (this.event) { + return this.event.context_id; + } + + // if "event" not available, use assessment instead + return this.assessment.context_id; + } + + /** + * check the questions was answered + * @return {boolen} passed all check + */ + isAllQuestionsAnswered = () => { + let passed = true; + _.forEach(this.formGroup, fg => { + // check formGroup.validation & each field (answer & comment) validity + if (!fg.valid && (!fg.controls.answer.valid && !fg.controls.comment.valid)) { + passed = false; + } + }); + return passed; + }; + + /** + * turn a collection of questions into angular's FormGroup to share among components + * @param {array} questions list of questions from a question group (Assessment group) + */ + buildFormGroup = (questions) => { + let result: any = {}; + + this.questions.forEach(question => { + let currentAnswer = question.answer || {}; + let group = { + answer: question.required ? + new FormControl(currentAnswer.answer || '', Validators.required) : new FormControl(currentAnswer.answer || ''), + comment: question.required ? + new FormControl(currentAnswer.comment || '', Validators.required) : new FormControl(currentAnswer.comment || '') + }; + + // render choices' FormGroup + let choices = {}; + if (question.choices && question.type === 'multiple') { + question.choices.forEach(choice => { + let answer = (question.choices) ? question.choices[choice.id] : false; + choices[choice.id] = new FormControl(answer); + }); + group['choices'] = new FormGroup(choices); + } + + result[question.id] = new FormGroup(group); + }); + + console.log('this.group', this.group) + + /** + * turn answer into answer submission format (which is formatted for POST to post_assessment API) + * @param {object} submission single submission object retrieve from previous page/view + * @return {object} formatted submission answer + */ + private formInProgressAnswer(submission): boolean | Submission { + if (_.isEmpty(submission)) { + return false; + } + + let answers = {}; + submission.answer.forEach(ans => { + answers[ans.assessment_question_id] = { + assessment_question_id: ans.assessment_question_id, + answer: ans.comment || ans.answer + } + }); + + return { + Assessment: { + id: submission.assessment_id, + context_id: this.getSubmissionContext() + }, + AssessmentSubmissionAnswer: answers + }; + } + + /** + * @description store assessment answer/progress locally + */ + storeProgress = () => { + let answers = {}; + _.forEach(this.formGroup, (question, id) => { + let values = question.getRawValue(), + answer = { + assessment_question_id: id, + answer: values.answer || values.comment, + + // store it if choice answer is available or skip + choices: (!_.isEmpty(values.choices)) ? values.choices : null + }; + + // set empty string to remove answer + answer.answer = (answer.answer) ? answer.answer : ''; + answers[id] = answer; + }); + + // final step - store submission locally + let submission = { + Assessment: { + id: this.activity.assessment.id, + context_id: this.activity.assessment.context_id + }, + AssessmentSubmissionAnswer: answers + }; + this.submission = submission; + + // local cache key + this.cache.setLocal(this.cacheKey, JSON.stringify(submission)); + return submission; + }; + + /** + * @description retrieve saved progress from localStorage + */ + retrieveProgress = (questions: Array, answers?) => { + let cachedProgress = answers || {}; //this.cache.getLocalObject(this.cacheKey); + + let newQuestions = questions; + let savedProgress = cachedProgress.AssessmentSubmissionAnswer; + + if (!_.isEmpty(savedProgress)) { + + // index "id" is set as question.id in @Function buildFormGroup above + _.forEach(newQuestions, (question, id) => { + // check integrity of saved answer (question might get updated) + if (savedProgress[id] && savedProgress[id].assessment_question_id == id) { + newQuestions[id] = this.setValueWith(question, savedProgress[id]); + } + }); + } + return newQuestions; + }; + + /** + * @description set value to each FormControl differently based on type: + * - "text", "oneof" & "file" using just "answer" field + * - "multiple" answer is stored into "choices" FormControl instead + * @param {FormGroup} question FormGroup for a question + * @param {Object} answers answer [choices object || string answer] + */ + private setValueWith(question, answers) { + if (!_.isEmpty(answers.choices)) { + question.controls.choices.setValue(answers.choices); + } else { + question.controls.answer.setValue(answers.answer || ''); + } + return question; + } + + displayAlert(opts) { + return this.alertCtrl.create(opts); + } + + /** + * @description initiate save progress and return to previous page/navigation stack + */ + save() { + let self = this, + loading = this.loadingCtrl.create({ + content: 'Loading...' + }), + // to provide a more descriptive error message (if available) + failAlert = this.alertCtrl.create({ + title: 'Fail to submit.' + }); + + let saveProgress = () => { + this.updateSubmission(); + + loading.present().then(() => { + self.assessmentService.save(self.storeProgress()).subscribe( + response => { + loading.dismiss().then(() => { + self.navCtrl.pop(); + }); + }, + reject => { + loading.dismiss().then(() => { + failAlert.data.title = reject.msg || failAlert.data.title; + failAlert.present().then(() => { + console.log('Unable to save', reject); + }); + }); + } + ); + }); + }; + + let confirmBox = this.alertCtrl.create({ + message: 'You have not completed all required questions. Do you still wish to Save?', + buttons: [ + { + text: 'Yes', + handler: () => { + saveProgress(); + } + }, + { + text: 'No', + handler: () => { + //return false; + } + } + ] + }); + + if (!this.isAllQuestionsAnswered()) { + confirmBox.present(); + } else { + saveProgress(); + } + } +} diff --git a/src/pages/assessments/group/assessments-group.scss b/src/pages/assessments/group/assessments-group.scss new file mode 100644 index 00000000..b2f588da --- /dev/null +++ b/src/pages/assessments/group/assessments-group.scss @@ -0,0 +1,5 @@ +assessments-group-page { + .btn-save[disabled] { + display: none; + } +} diff --git a/src/pages/assessments/popup/items-popup.html b/src/pages/assessments/popup/items-popup.html new file mode 100644 index 00000000..9f1ef8c1 --- /dev/null +++ b/src/pages/assessments/popup/items-popup.html @@ -0,0 +1,31 @@ + + + + + + + Items Popup + + + + + + + + +
+
+ item + item +

+ {{ item.name }} x{{ item.count[0].count }} +

+
+
+ +
diff --git a/src/pages/assessments/popup/items-popup.page.ts b/src/pages/assessments/popup/items-popup.page.ts new file mode 100644 index 00000000..a3a800d1 --- /dev/null +++ b/src/pages/assessments/popup/items-popup.page.ts @@ -0,0 +1,46 @@ +import { Component, Injectable } from '@angular/core'; +import { ViewController, LoadingController, NavParams, NavController } from 'ionic-angular'; + +import { i18nData } from '../../../app/i18n-en'; +import { loadingMessages, errMessages } from '../../../app/messages'; +import * as _ from 'lodash'; +// services +import { CacheService } from '../../../shared/cache/cache.service'; +import { TranslateService } from '@ngx-translate/core'; +// pages +import { TabsPage } from '../../../pages/tabs/tabs.page'; +@Injectable() +@Component({ + selector: 'items-popup', + templateUrl: 'items-popup.html' +}) +export class ItemsPopupPage { + public combinedData: any = []; + // public pageTitle: string = ''; + // public noData: boolean = null; + public loadingMessage: any = loadingMessages.LoadingSpinner.loading; + constructor( + private viewCtrl: ViewController, + private navCtrl: NavController, + private navParams: NavParams, + private loadingCtrl: LoadingController, + public cacheService: CacheService, + public translationService: TranslateService + ) {} + ionViewWillEnter(){ + // if (this.cacheService.getLocal('isEventSubmission') == 'true') { + // this.pageTitle = 'Checkin Successful!'; + // }else { + // this.pageTitle = 'Submit Success!'; + // } + // this.combinedData = this.navParams.get('combined'); + this.combinedData = this.cacheService.getLocalObject('allNewItems'); + console.log("Final final popup combined data: ", this.combinedData); + // return this.combinedData.length == 0 ? this.noData = true : this.noData = false + } + // close disbaled activity popup + closeModal() { + this.viewCtrl.dismiss(); + this.navCtrl.setRoot(TabsPage); + } +} diff --git a/src/pages/events/checkin/event-checkin.html b/src/pages/events/checkin/event-checkin.html index 8a85d4af..e1a41c80 100644 --- a/src/pages/events/checkin/event-checkin.html +++ b/src/pages/events/checkin/event-checkin.html @@ -1,27 +1,28 @@ - + + + +

{{ event.title }}

+
+ + +

{{ event.location }}

+

{{ event.startDisplay }}

+
+ +
+ +
+ + +

{{ user.name | ucfirst }}

+
+
+ + diff --git a/src/pages/events/checkin/event-checkin.html_bak b/src/pages/events/checkin/event-checkin.html_bak new file mode 100644 index 00000000..8a85d4af --- /dev/null +++ b/src/pages/events/checkin/event-checkin.html_bak @@ -0,0 +1,27 @@ + diff --git a/src/pages/events/checkin/event-checkin.page.ts b/src/pages/events/checkin/event-checkin.page.ts index 71ae3bb8..beb35d3b 100644 --- a/src/pages/events/checkin/event-checkin.page.ts +++ b/src/pages/events/checkin/event-checkin.page.ts @@ -1,25 +1,59 @@ import { Component } from '@angular/core'; import { NavParams, NavController, LoadingController } from 'ionic-angular'; -import * as moment from 'moment'; // services import { CacheService } from '../../../shared/cache/cache.service'; import { EventService } from '../../../services/event.service'; +import { AssessmentService } from '../../../services/assessment.service'; + +import * as moment from 'moment'; + @Component({ selector: 'page-event-checkin', templateUrl: './event-checkin.html', }) export class EventCheckinPage { public event: any; + public submissions: any; + public assessment; + public assessmentGroup; + private user: any = {}; + public checkin: any = {}; + constructor( - private params: NavParams, - private nav: NavController, + private navParams: NavParams, + private navCtrl: NavController, private cache: CacheService, private eventService: EventService, - private loadingCtrl: LoadingController,){ - // this.event = params.get('event'); + private assessmentService: AssessmentService, + private loadingCtrl: LoadingController + ) { + this.event = navParams.get('event'); + this.submissions = navParams.get('submissions'); + this.assessment = navParams.get('assessment'); + this.assessmentGroup = navParams.get('assessmentGroup'); + } + + ionViewDidEnter() { + this.checkin = this.getCheckinAnswer(this.submissions[0]); // event checkin has just single submission + this.assessment = this.assessmentService.normaliseGroup(this.assessmentGroup); + this.user = this.cache.getLocalObject('user'); + } + + // Only checkin/file upload answer is displayed in check-in view + private getCheckinAnswer(submission) { + let result = {}; + submission.answer.forEach(ans => { + if (typeof ans.answer === 'object') { + result = ans; + } + }); + + return result; } - ionViewDidEnter(){ - // this.event = this.params.get('event'); - // console.log("Event Data:", this.event); + + injectAssessmentToAnswer() { + this.assessmentGroup.forEach(group => { + console.log(group); + }); } } diff --git a/src/pages/events/download/events-download.page.ts b/src/pages/events/download/events-download.page.ts index a9e48c5b..ff6cc0f5 100644 --- a/src/pages/events/download/events-download.page.ts +++ b/src/pages/events/download/events-download.page.ts @@ -2,7 +2,7 @@ import { Component } from '@angular/core'; import { NavController, NavParams } from 'ionic-angular'; import { FilestackService } from '../../../shared/filestack/filestack.service'; import { EventsPreviewPage } from './events-preview.page'; - +import { UtilsService } from '../../../shared/utils/utils.service'; import { WindowRef } from '../../../shared/window'; @Component({ @@ -16,7 +16,8 @@ export class EventsDownloadPage { private navCtrl: NavController, private params: NavParams, private fs: FilestackService, - private win: WindowRef + private win: WindowRef, + private utils: UtilsService ) { } @@ -33,50 +34,7 @@ export class EventsDownloadPage { this.files.map(file => { // zip file type is not viewable in filestack preview - if ([ - 'application/x-compressed', - 'application/x-zip-compressed', - 'application/zip', - 'multipart/x-zip', - ].indexOf(file.type) >= 0) { - file.icon = 'fa-zip'; - - // set icon to different document type (excel, word, powerpoint, audio, video) - } else if (file.type.indexOf('audio/') >= 0) { - file.icon = 'fa-sound'; - } else if (file.type.indexOf('image/') >= 0) { - file.icon = 'fa-image'; - } else if (file.type.indexOf('text/') >= 0) { - file.icon = 'fa-text'; - } else if (file.type.indexOf('video/') >= 0) { - file.icon = 'fa-movie'; - } else { - switch (file.type) { - case 'application/pdf': - file.icon = 'fa-pdf'; - break; - case 'application/msword': - case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': - file.icon = 'fa-word'; - break; - case 'application/excel': - case 'application/vnd.ms-excel': - case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': - case 'application/x-excel': - case 'application/x-msexcel': - file.icon = 'fa-excel'; - break; - case 'application/mspowerpoint': - case 'application/vnd.ms-powerpoint': - case 'application/vnd.openxmlformats-officedocument.presentationml.presentation': - case 'application/x-mspowerpoint': - file.icon = 'fa-powerpoint'; - break; - default: - file.icon = 'fa-file'; - break; - } - } + file.icon = this.utils.getIcon(file.type) }); } @@ -87,43 +45,11 @@ export class EventsDownloadPage { * @param {object} file single file from files array return from get_events in event list page */ view(file) { - if ([ - 'application/x-compressed', - 'application/x-zip-compressed', - 'application/zip', - 'multipart/x-zip', - ].indexOf(file.type) >= 0) { + if (this.utils.isCompressed(file.type)) { let win = this.win.nativeWindow; let openedWindow = win.open(file.url, '_blank'); } else { this.navCtrl.push(EventsPreviewPage, {file: file}); } } - - /** - * @TODO: move to some where it's necessary - * @description temporary/development purpose file picker for file upload - */ - pick() { - /*{ - "handle": "vM9Vi9FTVi7VsDRJclR3", - "url": "https://cdn.filestackcontent.com/vM9Vi9FTVi7VsDRJclR3", - "filename": "Image uploaded from iOS.jpg", - "size": 1701895, - "mimetype": "image/jpeg", - "status": "Stored" - }*/ - - this.fs.pick({ - accept: 'image/*', - maxFiles: 5, - storeTo: { - location: 's3' - } - }).then(res => { - console.log(res); - }, err => { - console.log(err); - }); - } } diff --git a/src/pages/events/list/list.html b/src/pages/events/list/list.html index 71a071be..b16665e2 100644 --- a/src/pages/events/list/list.html +++ b/src/pages/events/list/list.html @@ -1,6 +1,6 @@ - Events + {{ 'EVENTS.PAGETITLE' | translate }} @@ -16,13 +16,13 @@ - Browse + {{ 'EVENTS.BROWSE' | translate }} - My Bookings + {{ 'EVENTS.MYBOOKINGS' | translate }} - Attended + {{ 'EVENTS.ATTENDED' | translate }} @@ -31,13 +31,13 @@ - There are no scheduled events available. Please check back later. + {{ emptyFilterErrMessage }} - You have no bookings. Tap on "Browse" and book an event now to enhance your skills. + {{ noBookingsFilterErrMessage }} - You have not attended any events yet. + {{ noAttendedFilterErrMessage }} diff --git a/src/pages/events/list/list.page.ts b/src/pages/events/list/list.page.ts index ceff9dfd..9f046ca9 100644 --- a/src/pages/events/list/list.page.ts +++ b/src/pages/events/list/list.page.ts @@ -1,32 +1,35 @@ import { Component } from '@angular/core'; import { NavController, LoadingController } from 'ionic-angular'; - +import * as moment from 'moment'; +import * as _ from 'lodash'; +import { loadingMessages, errMessages } from '../../../app/messages'; +// services import { ActivityService } from '../../../services/activity.service'; import { EventService } from '../../../services/event.service'; +// pages import { EventsViewPage } from '../view/events-view.page'; -import * as moment from 'moment'; -import * as _ from 'lodash'; - @Component({ selector: 'events-list-page', templateUrl: 'list.html' }) export class EventsListPage { - + // loading & error message variables + private emptyFilterErrMessage = errMessages.Events.filter.empty; + private noBookingsFilterErrMessage = errMessages.Events.filter.noBookings; + private noAttendedFilterErrMessage = errMessages.Events.filter.noAttended; constructor( public navCtrl: NavController, public eventService: EventService, public activityService: ActivityService, public loadingCtrl: LoadingController, - ) { - } + ) {} - loadedEvents = []; - events = []; + activities = {}; + private loadedEvents = []; // Further processed events array, for private use + events = []; // ordered events array in filterEvents and to be access through template noEvents = false; filter = 'browses'; - /** * @name filterEvents * @description filter and group events into 3 catergories (attended, my-bookings, browses) @@ -52,15 +55,14 @@ export class EventsListPage { case 'browses': // List all not booked and not ended event in order of start time (asc) this.events = _.orderBy(_.filter(this.loadedEvents, (event) => { - return (moment(event.end).isAfter() && event.isBooked === false); + // return (moment(event.end).isAfter() && event.isBooked === false); + return (moment().isBefore(moment(event.end)) && event.isBooked === false); }), 'start', 'asc'); break; } - if (this.events.length === 0) { this.noEvents = true; } - return this.events; } @@ -75,38 +77,38 @@ export class EventsListPage { return (this.noEvents); } - + /** + * @name loadEvents + * @description retrieve events (from get_events) with a list of activity_id (from get_activity) + * @return {Promise} + */ loadEvents(): Promise { return new Promise((resolve, reject) => { - // Get activities IDs - this.activityService.getList() - .toPromise() + this.activityService.getList().toPromise() .then((activities) => { + this.activities = {}; let activityIDs = []; _.forEach(activities, (act) => { + this.activities[act.Activity.id] = act; activityIDs.push(act.Activity.id); }); // Get event by activityIDs this.eventService.getEvents({ search: { - activity_id: '[' + _.toString(activityIDs) + ']' + activity_id: '[' + _.toString(activityIDs) + ']', + type: 'session' } }) .then((events) => { - // After map event with activities, - // assign events to 'events' and 'loadedEvents' - - // loadedEvents will never change, - // it use to filtering events. - this.loadedEvents = this._injectCover( - this._mapWithActivity(events, activities) - ); + console.log('events', events); + // loadedEvents will never change (private use), + // it will be used for filtering of events (prep for display/template variable). + this.loadedEvents = this._injectCover(this._mapWithActivity(events)); // events use to rendering on page this.events = _.clone(this.loadedEvents); - this.filterEvents(); return resolve(); }, reject); @@ -118,8 +120,7 @@ export class EventsListPage { let loader = this.loadingCtrl.create(); loader.present().then(() => { - this.loadEvents() - .then(() => { + this.loadEvents().then(() => { loader.dismiss(); }) .catch((err) => { @@ -130,8 +131,7 @@ export class EventsListPage { } doRefresh(e) { - this.loadEvents() - .then(() => { + this.loadEvents().then(() => { e.complete(); }) .catch((err) => { @@ -139,7 +139,6 @@ export class EventsListPage { e.complete(); }); } - /** * @TODO: remove this once we decided to remove hardcoded images, big size picture is ruining UX because it induces long download time * @@ -158,23 +157,26 @@ export class EventsListPage { return events; } - private _mapWithActivity(events, activities) { + /** + * @name _mapWithActivity + * @description + * - attach "activity" object into each of single "event" object + * - Extract and merge event-activity only + * - skip non-event activities + * @param {array} events get_events response + */ + private _mapWithActivity(events) { let result = []; - events.forEach((event, key) => { - let activity = _.find(activities, (actv) => { - return actv.Activity.id === event.activity_id - }); - - if (activity) { - events[key].activity = activity.Activity; - } + events.forEach(event => { + let thisActivity = this.activities[event.activity_id]; + thisActivity.References = event.References; // must use event's references + event.activity = this.activityService.normaliseActivity(thisActivity); result.push(event); }); return result; } - // Check event allow to check-in allowCheckIn(event) { console.log('event', event); @@ -182,12 +184,9 @@ export class EventsListPage { } view(event) { - /*if (this.allowCheckIn(event)) { - alert('Going to check-in page...'); - } else { - alert('This event not allow to check-in...'); - }*/ console.log(event); - this.navCtrl.push(EventsViewPage, {event: event}); + this.navCtrl.push(EventsViewPage, { + event + }); } } diff --git a/src/pages/events/view/events-view.html b/src/pages/events/view/events-view.html index 9f8919bb..3da06265 100644 --- a/src/pages/events/view/events-view.html +++ b/src/pages/events/view/events-view.html @@ -27,22 +27,33 @@ {{ event.description || 'No description available.' }} - - + +

{{ bookingStatus }}

- + + + + + - -
diff --git a/src/pages/events/view/events-view.page.ts b/src/pages/events/view/events-view.page.ts index 0a10140f..efdd438e 100755 --- a/src/pages/events/view/events-view.page.ts +++ b/src/pages/events/view/events-view.page.ts @@ -1,12 +1,23 @@ import { Component, Output, EventEmitter } from '@angular/core'; import { Tabs, NavParams, NavController, AlertController, LoadingController, ActionSheetController, ToastController } from 'ionic-angular'; +import { loadingMessages, errMessages } from '../../../app/messages'; +import { TranslationService } from '../../../shared/translation/translation.service'; // services import { CacheService } from '../../../shared/cache/cache.service'; import { EventService } from '../../../services/event.service'; +import { AssessmentService } from '../../../services/assessment.service'; +import { SubmissionService } from '../../../services/submission.service'; + // pages import { EventsListPage } from '../list/list.page'; import { EventsDownloadPage } from '../download/events-download.page'; +import { AssessmentsPage } from '../../assessments/assessments.page'; +import { AssessmentsGroupPage } from '../../assessments/group/assessments-group.page'; import { EventCheckinPage } from '../checkin/event-checkin.page'; + +// We no need custom page for checkin anymore +// import { EventCheckinPage } from '../checkin/event-checkin.page'; + import * as moment from 'moment'; const terms = { @@ -16,46 +27,103 @@ const terms = { templateUrl: './events-view.html' }) export class EventsViewPage { - public event: any; + public loadings = { + checkin: true + }; + public event: any = {}; public bookingStatus: string = ''; public justBooked: boolean = false; public booked_text: string = 'Booked'; + public bookEventErrMessage: any = errMessages.Events.bookEvents.book; + public cancelBookingErrMessage: any = errMessages.Events.cancelBooking.cancel; + public completedSubmissions: boolean = false; + private submissions: Array = []; + constructor( - private params: NavParams, - private nav: NavController, + private navParams: NavParams, + private navCtrl: NavController, private cache: CacheService, private eventService: EventService, + public translationService: TranslationService, private alertCtrl: AlertController, private loadingCtrl: LoadingController, private actionSheetCtrl: ActionSheetController, private toastCtrl: ToastController, - private tab: Tabs + private assessmentService: AssessmentService, + private submissionService: SubmissionService ) { - this.event = params.get('event'); + this.event = navParams.get('event'); } + private availability(event): string { return (event.isBooked)? terms.booked : event.remaining_capacity + ' of ' + event.capacity + ' seats available'; } - ionViewDidEnter() { - this.event = this.params.get('event'); - console.log('ionViewDidEnter', this.event); + + ionViewWillEnter() { + this.loadings.checkin = true; + this.submissions = []; // reset submissions + + if (this.event.References) { + this.event = Object.assign(this.event, this.extractAssessment(this.event.References)); + } + if (this.event) { this.bookingStatus = this.availability(this.event); } } + + ionViewDidEnter() { + this.completedSubmissions = false; + this.submissionService.getSubmissions({ + search: { + context_id: this.event.context_id + } + }).subscribe(res => { + this.loadings.checkin = false; + res.forEach(submission => { + submission = this.submissionService.normalise(submission); + console.log(submission); + this.submissions.push(submission); + if (submission.status === 'done') { + this.completedSubmissions = true; + } + }); + }, err => { + this.loadings.checkin = false; + console.log(err); + }); + } + + /** + * @name extractAssessment + * @description each event has only one assessment + * @param {Array} references References array response from get_activity API + */ + private extractAssessment(references: Array) { + let ref = references[0]; + ref.Assessment.context_id = ref.context_id; + + return { + assessment: ref.Assessment, + context_id: ref.context_id + }; + } + /** * Push Download page to ionic nav stack (navigate to attachment download page) */ gotoDownload(event) { - this.nav.push(EventsDownloadPage, {event}); + this.navCtrl.push(EventsDownloadPage, {event}); } + /** * Event booking function * @param {object} event Single event object from get_events API response */ - checkBookStatus(){ + checkBookStatus() { return false ? (this.event.remaining_capacity == this.event.capacity && this.event.isBooked == false) : (this.event.remaining_capacity != this.event.capacity && this.event.isBooked == true) } + book(event): void { let earnPoints = this.alertCtrl.create({ message: `

Congratulations!


Congratulations logo

You have earned 20 points.

`, @@ -69,12 +137,13 @@ export class EventsViewPage { } ] }); + let bookLoading = this.loadingCtrl.create({ content: 'Booking ..' }); let bookFailed = this.toastCtrl.create({ - message: 'Sorry, book event process is failed, please try it again later.', - duration: 4000, + message: this.bookEventErrMessage, + duration: 5000, position: 'bottom' }); let bookPopup = this.actionSheetCtrl.create({ @@ -100,7 +169,7 @@ export class EventsViewPage { this.booked_text; } bookLoading.dismiss().then(() => { - this.nav.popToRoot(EventsListPage); + this.navCtrl.popToRoot(EventsListPage); }); }, err => { @@ -115,24 +184,53 @@ export class EventsViewPage { }); bookPopup.present(); } + + /** + * @note existence of References array determines if an event is + * a checkin type + * @description examine event to allow check in + * @param {Object} event + */ + allowCheckIn(event) { + if (event.References && event.References.length > 0) { + return true; + } + return false; + } + /** * Event checkin action - * @param + * @param {Object} event single event object return from get_event API */ - checkin(){ - // this.nav.push(EventCheckinPage, {event: this.event}); + checkin(event) { + let loading = this.loadingCtrl.create({ + content: 'loading checkin...' + }); + loading.present().then(() => { + // if submission exist + console.log(this.submissions); + loading.dismiss().then(() => { + // this.navCtrl.push(AssessmentsGroupPage, { + this.navCtrl.push(AssessmentsPage, { + event, + activity: event.activity, + submissions: this.submissions + }); + }); + }) } + /** * Event cancel booking action * @param */ - cancelBooking(){ + cancelBooking() { let cancelLoading = this.loadingCtrl.create({ content: 'Cancel Booking ..' }); let cancelFailed = this.toastCtrl.create({ - message: 'Sorry, cancel event process is failed, please try it again later.', - duration: 4000, + message: this.cancelBookingErrMessage, + duration: 5000, position: 'bottom' }); let cancelBooking = this.actionSheetCtrl.create({ @@ -144,25 +242,25 @@ export class EventsViewPage { handler: () => { cancelLoading.present(); this.eventService.cancelEventBooking(this.event.id) - .subscribe( - data => { - cancelLoading.dismiss().then(() => { - this.nav.popToRoot(EventsListPage); - }); - }, - err => { - cancelLoading.dismiss().then(() => { - cancelFailed.present(); - }); - } - ) + .subscribe( + data => { + cancelLoading.dismiss().then(() => { + this.navCtrl.popToRoot(EventsListPage); + }); + }, + err => { + cancelLoading.dismiss().then(() => { + cancelFailed.present(); + }); + } + ) } }, { text: 'Close', role: 'cancel', handler: () => { - console.log('Close this window ..'); + // console.log('Close this window ..'); } } ] diff --git a/src/pages/forget-password/forget-password.html b/src/pages/forget-password/forget-password.html index bbfd099b..23497c4c 100644 --- a/src/pages/forget-password/forget-password.html +++ b/src/pages/forget-password/forget-password.html @@ -1,12 +1,12 @@ - Forgot Password + {{ 'FORGOTPASSWORD.PAGETITLE' | translate }}
diff --git a/src/pages/forget-password/forget-password.ts b/src/pages/forget-password/forget-password.ts index 3c502cd1..91e5f21c 100644 --- a/src/pages/forget-password/forget-password.ts +++ b/src/pages/forget-password/forget-password.ts @@ -7,6 +7,8 @@ import { NavController, import { FormBuilder, Validators } from '@angular/forms'; import { Observable } from 'rxjs/Observable'; import 'rxjs/Rx'; +import { TranslationService } from '../../shared/translation/translation.service'; +import { loadingMessages, errMessages } from '../../app/messages'; // services import { AuthService } from '../../services/auth.service'; // directives @@ -18,29 +20,34 @@ import {FormValidator} from '../../validators/formValidator'; export class ForgetPasswordPage { email: string; forgotPwdFormGroup: any; + // loading & error message variables + private sendingEmailLoadingMessage = loadingMessages.SendingEmail.send; + private sentEmailMessagePartOne = loadingMessages.SentMessage.partOne; + private sentEmailMessagePartTwo = loadingMessages.SentMessage.partTwo; constructor( private navCtrl: NavController, private navParams: NavParams, private loadingCtrl: LoadingController, private alertCtrl: AlertController, + public translationService: TranslationService, private authService: AuthService, private toastCtrl: ToastController, private formBuilder: FormBuilder) { - this.forgotPwdFormGroup = formBuilder.group({ - email: ['', [FormValidator.isValidEmail, - Validators.required]], - }); - } + this.forgotPwdFormGroup = formBuilder.group({ + email: ['', [FormValidator.isValidEmail, + Validators.required]], + }); + } ionViewDidLoad() { console.log('ionViewDidLoad ForgetPasswordPage'); } userForgotPassword(){ const loading = this.loadingCtrl.create({ dismissOnPageChange: true, - content: 'Sending email to us ..' + content: this.sendingEmailLoadingMessage }); - let defaultMsg = `We have sent an email to ${this.email} with a link to log into the system - please check your inbox. If you haven't received an email in a few minutes please check the address you entered and your spam folder.`; + let defaultMsg = this.sentEmailMessagePartOne + ` ${this.email} ` + this.sentEmailMessagePartTwo; loading.present(); // This part is calling post_forget_password() API from backend diff --git a/src/pages/gallery/gallery.html b/src/pages/gallery/gallery.html index 69f164ee..b1b198fc 100644 --- a/src/pages/gallery/gallery.html +++ b/src/pages/gallery/gallery.html @@ -13,7 +13,7 @@ - + {{ avatarName }}` diff --git a/src/pages/home/home.html b/src/pages/home/home.html deleted file mode 100644 index 6bf0be27..00000000 --- a/src/pages/home/home.html +++ /dev/null @@ -1,12 +0,0 @@ - - - My Score - - - - - - - - - diff --git a/src/pages/home/home.scss b/src/pages/home/home.scss deleted file mode 100644 index d4cc8fc1..00000000 --- a/src/pages/home/home.scss +++ /dev/null @@ -1,3 +0,0 @@ -page-home { - -} diff --git a/src/pages/home/home.ts b/src/pages/home/home.ts deleted file mode 100644 index 74023e10..00000000 --- a/src/pages/home/home.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Component } from '@angular/core'; -import { URLSearchParams } from '@angular/http'; -import { NavController } from 'ionic-angular'; -import { RequestService } from '../../shared/request/request.service'; - -@Component({ - selector: 'home-page', - templateUrl: 'home.html', -}) -export class HomePage { - - constructor( - public navCtrl: NavController, - private request: RequestService - ) { - } -} diff --git a/src/pages/login-modal/login-modal.html b/src/pages/login-modal/login-modal.html index a3877b5a..1c917f9d 100644 --- a/src/pages/login-modal/login-modal.html +++ b/src/pages/login-modal/login-modal.html @@ -2,15 +2,9 @@ - - Login - - -
- - × - -
+ + {{ 'LOGIN.PAGETITLE' | translate }} +
@@ -43,12 +37,12 @@ color="button" (click)="userLogin()" [disabled]="loginForm.invalid"> - LOGIN + {{ 'LOGIN.PAGETITLE' | translate }}
diff --git a/src/pages/login-modal/login-modal.ts b/src/pages/login-modal/login-modal.ts index 687deff9..4529f276 100644 --- a/src/pages/login-modal/login-modal.ts +++ b/src/pages/login-modal/login-modal.ts @@ -8,19 +8,22 @@ import { NavController, import { FormBuilder, Validators } from '@angular/forms'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/Observable'; +import * as _ from 'lodash'; +import { TranslationService } from '../../shared/translation/translation.service'; +import { loadingMessages, errMessages } from '../../app/messages'; // services import { AuthService } from '../../services/auth.service'; import { MilestoneService } from '../../services/milestone.service'; +import { GameService } from '../../services/game.service'; import { CacheService } from '../../shared/cache/cache.service'; +import { GameService } from '../../services/game.service'; import { RequestServiceConfig } from '../../shared/request/request.service'; - // directives import {FormValidator} from '../../validators/formValidator'; // pages import { TabsPage } from '../../pages/tabs/tabs.page'; import { LoginPage } from '../../pages/login/login'; import { ForgetPasswordPage } from '../../pages/forget-password/forget-password'; -import * as _ from 'lodash'; /* This page is for handling user login process */ @Component({ selector: 'page-login-modal', @@ -35,6 +38,8 @@ export class LoginModalPage { milestone_id: string; loginFormGroup: any; forgetpasswordPage = ForgetPasswordPage; + public loginLoadingMessages: any = loadingMessages.Login.login; + public invalidLoginMessage: any = errMessages.Login.login; constructor( private navCtrl: NavController, private navParams: NavParams, @@ -43,11 +48,13 @@ export class LoginModalPage { private modalCtrl: ModalController, private viewCtrl: ViewController, private authService: AuthService, + private gameService: GameService, + public translationService: TranslationService, private config: RequestServiceConfig, private formBuilder: FormBuilder, private milestoneService: MilestoneService, private cacheService: CacheService, - private ngZone: NgZone + private ngZone: NgZone, ) { this.navCtrl = navCtrl; this.loginFormGroup = formBuilder.group({ @@ -75,29 +82,57 @@ export class LoginModalPage { // add loading effect during login process const loading = this.loadingCtrl.create({ dismissOnPageChange: true, - content: 'Logging in ..' + content: this.loginLoadingMessages }); loading.present(); // This part is calling post_auth() API from backend this.authService.loginAuth(this.email, this.password) .subscribe(data => { + data = data.data; // this.getLogInData(data); self.cacheService.setLocalObject('apikey', data.apikey); // saved for 3 types of timeline id in order for later use self.cacheService.setLocalObject('timelineId', data.Timelines[0].Timeline.id); self.cacheService.setLocalObject('timelineID', data.Timelines[0].Timeline.id); self.cacheService.setLocalObject('teams', data.Teams); + self.cacheService.setLocal('gotNewItems', false); + // get game_id data after login + this.gameService.getGames() + .subscribe( + data => { + console.log("game data: ", data); + _.map(data, (element) => { + console.log("game id: ", element[0].id); + this.cacheService.setLocal('game_id', element[0].id); + }); + }, + err => { + console.log("game err: ", err); + } + ); // get milestone data after login this.authService.getUser() .subscribe( data => { + self.cacheService.setLocalObject('name', data.User.name); + self.cacheService.setLocalObject('email', data.User.email); self.cacheService.setLocalObject('program_id', data.User.program_id); self.cacheService.setLocalObject('project_id', data.User.project_id); + self.cacheService.setLocalObject('user', data.User); }, err => { console.log(err); } ); + + this.gameService.getGames() + .subscribe((data) => { + if (data.Games) { + // For now only have one game per project + self.cacheService.setLocalObject('game_id', data.Games[0].id); + } + }); + // get milestone data after login this.milestoneService.getMilestones() .subscribe( @@ -106,7 +141,10 @@ export class LoginModalPage { this.milestone_id = data.data[0].id; self.cacheService.setLocalObject('milestone_id', data.data[0].id); console.log("milestone id: " + data.data[0].id); - this.navCtrl.push(TabsPage); + this.navCtrl.push(TabsPage).then(() => { + this.viewCtrl.dismiss(); // close the login modal and go to dashaboard page + window.history.replaceState({}, '', window.location.origin); + }); }, err => { console.log(err); @@ -166,7 +204,7 @@ export class LoginModalPage { logError(error) { const alert = this.alertCtrl.create({ title: 'Login Failed ..', - message: 'Invalid email or password, please type it again', + message: this.invalidLoginMessage, buttons: ['Close'] }); alert.present(); @@ -177,6 +215,7 @@ export class LoginModalPage { */ linkToForgetPassword() { this.navCtrl.push(this.forgetpasswordPage); + this.viewCtrl.dismiss(); } closeModal() { this.viewCtrl.dismiss(); diff --git a/src/pages/login/login.html b/src/pages/login/login.html index 278c1e5c..378a7119 100644 --- a/src/pages/login/login.html +++ b/src/pages/login/login.html @@ -4,22 +4,48 @@

- Welcome to Practera + {{ 'LOGIN.HEADER' | translate }}

- - - + +
+ + + + + + + + + +
+ +
+
-
diff --git a/src/pages/login/login.page.ts b/src/pages/login/login.page.ts deleted file mode 100644 index bb9ec663..00000000 --- a/src/pages/login/login.page.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { Component, NgZone, OnInit } from '@angular/core'; -import { NavController, - NavParams, - LoadingController, - AlertController, - ModalController } from 'ionic-angular'; -import { FormBuilder, Validators } from '@angular/forms'; -import { Observable } from 'rxjs/Observable'; -// services -import { AuthService } from '../../services/auth.service'; -import { MilestoneService } from '../../services/milestone.service'; - -import { CacheService } from '../../shared/cache/cache.service'; -// directives -import { FormValidator } from '../../validators/formValidator'; -// pages -import { LoginModalPage } from '../../pages/login-modal/login-modal'; -import { TabsPage } from '../../pages/tabs/tabs.page'; -import { ForgetPasswordPage } from '../../pages/forget-password/forget-password'; -import * as _ from 'lodash'; - - -/* This page is for handling user login process */ -@Component({ - selector: 'page-login', - templateUrl: 'login.html' -}) -export class LoginPage { - email: string; - password: any; - userName: string; - userImage: string; - loginFormGroup: any; - - private windowHeight: number = window.innerHeight / 3; - private isLandscaped: boolean = false; - - constructor( - private navCtrl: NavController, - private navParams: NavParams, - private loadingCtrl: LoadingController, - private alertCtrl: AlertController, - private authService: AuthService, - private formBuilder: FormBuilder, - private milestoneService: MilestoneService, - private cacheService: CacheService, - private ngZone:NgZone, - private modalCtrl: ModalController - ) { - this.loginFormGroup = formBuilder.group({ - email: ['', [FormValidator.isValidEmail, - Validators.required]], - password: ['', [Validators.required, Validators.minLength(8)]], - }); - - window.onresize = (e) => { - this.ngZone.run(() => { - function gcd (v1, v2) { - return (v2 == 0) ? v1 : gcd(v2, v1%v2); - } - let screnWidth = window.innerWidth; - let screenHeight = window.innerHeight; - let ratio = gcd(screnWidth, screenHeight); - let ratioRate = (screnWidth/ratio)/(screenHeight/ratio); - if(ratioRate > 1.2 && window.innerWidth < 1024){ - this.windowHeight = window.innerHeight / 6; - return this.isLandscaped = true; - } else { - this.windowHeight = window.innerHeight / 3; - return this.isLandscaped = false; - } - }); - }; - } - - ngOnInit() { - function gcd (v1, v2) { - return (v2 == 0) ? v1 : gcd(v2, v1%v2); - } - let screnWidth = window.innerWidth; - let screenHeight = window.innerHeight; - let ratio = gcd(screnWidth, screenHeight); - let ratioRate = (screnWidth/ratio)/(screenHeight/ratio); - return (ratioRate > 1.2 && window.innerWidth < 1024) ? this.isLandscaped = true : this.isLandscaped = false; - } - - popLoginModal() { - let loginModal = this.modalCtrl.create(LoginModalPage); - loginModal.present(); - } - - ionViewDidEnter() { - console.log(this.navParams); - console.log(this.navParams.get('test')); - } - - ionViewCanLeave(): boolean { - // user is authorized - console.log('authorized'); - let authorized = true; - if (authorized){ - return true; - } else { - return false; - } - } - - // user login function to authenticate user with email and password - userLogin() { - let self = this; - - // add loading effect during login process - const loading = this.loadingCtrl.create({ - dismissOnPageChange: true, - content: 'Signing in ..' - }); - loading.present(); - - function rxjsErr(err) { - console.log('Rxjs Error::', err) - } - - function rxjsFinally() { - console.log('finally!'); - loading.dismiss(); - } - - // This part is calling post_auth() API from backend - this.authService.loginAuth(this.email, this.password) - .subscribe(data => { - - self.cacheService.setLocalObject('apikey', data.apikey); - self.cacheService.setLocalObject('timelines', data.Timelines); - self.cacheService.setLocalObject('teams', data.Teams); - - this.setLoginData(data).subscribe(function(res) { - Observable.forkJoin([ - self.authService.getUser(), - self.milestoneService.getList() - ]).subscribe(res => { - let user = res[0], - milestone = res[1]; - Observable.from([ - self.cacheService.write('user', user), - self.cacheService.write('milestone', milestone), - self.cacheService.setLocalObject('user', user), - self.cacheService.setLocalObject('milestone', milestone), - ]).subscribe( - res => {console.log(res)}, - err => console.log(err), - () => { - loading.dismiss(); - console.log("here?"); - self.navCtrl.push(TabsPage); - } - ); - }, rxjsErr, rxjsFinally); - }, rxjsErr, rxjsFinally); - - self.cacheService.setLocal('isAuthenticated', true); - self.cacheService.write('isAuthenticated', true); - }, err => { - loading.dismiss(); - self.logError(err); - self.cacheService.removeLocal('isAuthenticated'); - self.cacheService.write('isAuthenticated', false); - }); - } - - setLoginData(data) { - let cacheProcesses = []; - _.forEach(data, (datum, key) => { - cacheProcesses.push(this.cacheService.write(key, datum)); - }); - - cacheProcesses.push(this.cacheService.write('timeline_id', data.Timelines[0].Timeline.id)); - cacheProcesses.push(this.cacheService.write('apikey', data.apikey)); - cacheProcesses.push(this.cacheService.write('timelines', data.Timelines)); - cacheProcesses.push(this.cacheService.write('teams', data.Teams)); - - this.cacheService.setLocalObject('timelines', data.Timelines); - this.cacheService.setLocalObject('teams', data.Teams); - this.cacheService.setLocal('apikey', data.apikey); - this.cacheService.setLocal('timeline_id', data.Timelines[0].Timeline.id); - - return Observable.from(cacheProcesses); - } - - getUserKeyData(user) { - let userData = { - 'apikey': user.data.apikey, - 'timelines': user.data.Timelines - } - this.cacheService.write('userData', userData); - this.cacheService.setLocalObject('userData', userData); - // to get API KEY and timeline_id and stored in localStorage - // then other API calls can directly use (API KEY and timeline_id) - } - - logError(error) { - const alert = this.alertCtrl.create({ - title: 'Login Failed ..', - message: 'Invalid email or password, please type it again', - buttons: ['OK'] - }); - alert.present(); - // handle API calling errors display with alert controller - } - - // forget password page link function - linkToForgetPassword() { - this.navCtrl.push(ForgetPasswordPage); - } -} diff --git a/src/pages/login/login.ts b/src/pages/login/login.ts index 86bdf60b..ef16f8db 100644 --- a/src/pages/login/login.ts +++ b/src/pages/login/login.ts @@ -1,28 +1,221 @@ -import { ModalController } from 'ionic-angular'; -import { Component, NgZone, OnInit } from '@angular/core'; +import { Component, ViewChild } from '@angular/core'; +import { NavController, + NavParams, + LoadingController, + AlertController, + ModalController, + ViewController } from 'ionic-angular'; +import { FormBuilder, Validators } from '@angular/forms'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs/Observable'; +import * as _ from 'lodash'; +import { TranslationService } from '../../shared/translation/translation.service'; +import { loadingMessages, errMessages } from '../../app/messages'; // services -import { ResponsiveService } from '../../services/responsive.service'; +import { AuthService } from '../../services/auth.service'; +import { MilestoneService } from '../../services/milestone.service'; +import { CacheService } from '../../shared/cache/cache.service'; +import { GameService } from '../../services/game.service'; +import { RequestServiceConfig } from '../../shared/request/request.service'; +// directives +import {FormValidator} from '../../validators/formValidator'; // pages -import { LoginModalPage } from '../../pages/login-modal/login-modal'; +import { TabsPage } from '../../pages/tabs/tabs.page'; +import { ForgetPasswordPage } from '../../pages/forget-password/forget-password'; /* This page is for handling user login process */ @Component({ selector: 'page-login', templateUrl: 'login.html' }) export class LoginPage { - private windowHeight: number = window.innerHeight / 3; - private isLandscaped: boolean = false; + public email: string; + public password: any; + public userName: string; + public userImage: string; + public API_KEY: string; + public milestone_id: string; + public loginFormGroup: any; + public forgetpasswordPage = ForgetPasswordPage; + public loginLoadingMessages: any = loadingMessages.Login.login; + public invalidLoginMessage: any = errMessages.Login.login; constructor( + private navCtrl: NavController, + private navParams: NavParams, + private loadingCtrl: LoadingController, + private alertCtrl: AlertController, private modalCtrl: ModalController, - private ngZone: NgZone, - private responsiveService: ResponsiveService - ){} - ngOnInit() { + private viewCtrl: ViewController, + private authService: AuthService, + private gameService: GameService, + public translationService: TranslationService, + private config: RequestServiceConfig, + private formBuilder: FormBuilder, + private milestoneService: MilestoneService, + private cacheService: CacheService + ) { + this.navCtrl = navCtrl; + this.loginFormGroup = formBuilder.group({ + email: ['', [FormValidator.isValidEmail, + Validators.required]], + password: ['', [Validators.required, Validators.minLength(8)]], + }); } - ionViewDidLoad(){ + ionViewCanLeave(): boolean { + // user is authorized + console.log('authorized'); + let authorized = true; + if (authorized){ + return true; + } else { + return false; + } } - popLoginModal() { - let loginModal = this.modalCtrl.create(LoginModalPage); - loginModal.present(); + /** + * user login function to authenticate user with email and password + */ + userLogin() { + let self = this; + this.cacheService.clear().then(() => { + // add loading effect during login process + const loading = this.loadingCtrl.create({ + dismissOnPageChange: true, + content: this.loginLoadingMessages + }); + loading.present().then(() => { + // This part is calling post_auth() API from backend + this.authService.loginAuth(this.email, this.password) + .subscribe(data => { + data = data.data; + // this.getLogInData(data); + self.cacheService.setLocalObject('apikey', data.apikey); + // saved for 3 types of timeline id in order for later use + self.cacheService.setLocalObject('timelineId', data.Timelines[0].Timeline.id); + self.cacheService.setLocalObject('timelineID', data.Timelines[0].Timeline.id); + self.cacheService.setLocalObject('teams', data.Teams); + self.cacheService.setLocal('gotNewItems', false); + // get game_id data after login + this.gameService.getGames() + .subscribe( + data => { + console.log("game data: ", data); + _.map(data, (element) => { + console.log("game id: ", element[0].id); + this.cacheService.setLocal('game_id', element[0].id); + }); + }, + err => { + console.log("game err: ", err); + } + ); + // get milestone data after login + this.authService.getUser() + .subscribe( + data => { + self.cacheService.setLocalObject('name', data.User.name); + self.cacheService.setLocalObject('email', data.User.email); + self.cacheService.setLocalObject('program_id', data.User.program_id); + self.cacheService.setLocalObject('project_id', data.User.project_id); + self.cacheService.setLocalObject('user', data.User); + }, + err => { + console.log(err); + } + ); + + this.gameService.getGames() + .subscribe((data) => { + if (data.Games) { + // For now only have one game per project + self.cacheService.setLocalObject('game_id', data.Games[0].id); + } + }); + + // get milestone data after login + this.milestoneService.getMilestones() + .subscribe( + data => { + loading.dismiss().then(() => { + console.log(data.data[0].id); + this.milestone_id = data.data[0].id; + self.cacheService.setLocalObject('milestone_id', data.data[0].id); + console.log("milestone id: " + data.data[0].id); + this.navCtrl.push(TabsPage).then(() => { + this.viewCtrl.dismiss(); // close the login modal and go to dashaboard page + window.history.replaceState({}, '', window.location.origin); + }); + }); + }, + err => { + console.log(err); + } + ) + this.cacheService.write('isAuthenticated', true); + this.cacheService.setLocal('isAuthenticated', true); + }, err => { + loading.dismiss().then(() => { + this.logError(err); + this.cacheService.removeLocal('isAuthenticated'); + this.cacheService.write('isAuthenticated', false); + }); + }); + }); + }); + } + /** + * Insert post_auth() api result into localStorage + * @param {object} data result from API request + * @returns Observable/subject + */ + getLogInData(data){ + let cacheProcesses = []; + _.forEach(data, (datum, key) => { + cacheProcesses.push(this.cacheService.write(key, datum)); + }); + cacheProcesses.push(this.cacheService.write('timeline_id', data.Timelines[0].Timeline.id)); + cacheProcesses.push(this.cacheService.write('apikey', data.apikey)); + cacheProcesses.push(this.cacheService.write('timelines', data.Timelines)); + cacheProcesses.push(this.cacheService.write('teams', data.Teams)); + this.cacheService.setLocal('apikey', data.apikey); + this.cacheService.setLocal('timeline_id', data.Timelines[0].Timeline.id); + console.log("cache data: " + cacheProcesses); + return Observable.from(cacheProcesses); + } + /** + * Insert get_user() api result into localStorage + * @param {object} user result from API request + */ + getUserKeyData(user){ + let userData = { + 'apikey': user.data.apikey, + 'timelines': user.data.Timelines + } + this.cacheService.write('userData', userData); + this.cacheService.setLocalObject('userData', userData); + this.API_KEY = user.data.apikey; + // console.log("Timeline ID: " + user.data.Timelines[0].Timeline.id); + // to get API KEY and timeline_id and stored in localStorage + // then other API calls can directly use (API KEY and timeline_id) + } + /** + * @TODO we'll come back to this logging workflow later in this development + * + * This function is used to log unexpected error accountered in the client side + * @param {object} error result from API request + */ + logError(error) { + const alert = this.alertCtrl.create({ + title: 'Login Failed ..', + message: this.invalidLoginMessage, + buttons: ['Close'] + }); + alert.present(); + // handle API calling errors display with alert controller + } + /** + * forget password page link function + */ + linkToForgetPassword() { + this.navCtrl.push(this.forgetpasswordPage); + this.viewCtrl.dismiss(); } } diff --git a/src/pages/magic-link/magic-link.ts b/src/pages/magic-link/magic-link.ts index a587082e..c20621fb 100644 --- a/src/pages/magic-link/magic-link.ts +++ b/src/pages/magic-link/magic-link.ts @@ -4,10 +4,13 @@ import { NavController, LoadingController, AlertController } from 'ionic-angular'; import 'rxjs/Rx'; +import * as _ from 'lodash'; +import { loadingMessages, errMessages } from '../../app/messages'; // services import { AuthService } from '../../services/auth.service'; -import { MilestoneService } from '../../services/milestone.service'; import { CacheService } from '../../shared/cache/cache.service'; +import { GameService } from '../../services/game.service'; +import { MilestoneService } from '../../services/milestone.service'; // pages import { TabsPage } from '../tabs/tabs.page'; import { LoginPage } from '../login/login'; @@ -19,6 +22,9 @@ export class MagicLinkPage { private verifySuccess = null; private auth_token: string; public milestone_id: string; + // loading & error messages variables + private loginLoadingMessage: any = loadingMessages.Login.login; + private misMatchTokenErrMessage: any = errMessages.DirectLink.mismatch; constructor( private navCtrl: NavController, private navParams: NavParams, @@ -26,7 +32,8 @@ export class MagicLinkPage { private loadingCtrl: LoadingController, private alertCtrl: AlertController, private milestoneService: MilestoneService, - private cacheService: CacheService + private cacheService: CacheService, + private gameService: GameService ) {} ionViewDidLoad() { @@ -40,20 +47,37 @@ export class MagicLinkPage { let observable = this.authService.magicLinkLogin(this.auth_token); const loading = this.loadingCtrl.create({ dismissOnPageChange: true, - content: 'Logging in ..' + content: this.loginLoadingMessage }); loading.present(); observable.subscribe(data => { // localStorage.setItem('isAuthenticated', 'true'); // this.navCtrl.push(TabsPage); // console.log("Successfully logged in"); + data = data.data; this.cacheService.setLocalObject('apikey', data.apikey); this.cacheService.setLocalObject('timelineID', data.Timelines[0].Timeline.id); this.cacheService.setLocalObject('teams', data.Teams); + // get game_id data after login + this.gameService.getGames() + .subscribe( + data => { + console.log("game data: ", data); + _.map(data, (element) => { + console.log("game id: ", element[0].id); + this.cacheService.setLocal('game_id', element[0].id); + }); + }, + err => { + console.log("game err: ", err); + } + ); // get milestone data after login this.authService.getUser() .subscribe( data => { + this.cacheService.setLocalObject('name', data.User.name); + this.cacheService.setLocalObject('email', data.User.email); this.cacheService.setLocalObject('program_id', data.User.program_id); this.cacheService.setLocalObject('project_id', data.User.project_id); }, @@ -84,8 +108,8 @@ export class MagicLinkPage { err => { const failAlert = this.alertCtrl.create({ title: 'Magic did NOT happen', - message: 'please login by typing email and password', - buttons: ['OK'] + message: this.misMatchTokenErrMessage, + buttons: ['Close'] }); failAlert.present(); this.navCtrl.push(LoginPage).then(() => { diff --git a/src/pages/rankings/list/rankings.html b/src/pages/rankings/list/rankings.html new file mode 100644 index 00000000..96c52d77 --- /dev/null +++ b/src/pages/rankings/list/rankings.html @@ -0,0 +1,38 @@ + + + {{ 'RANKING.PAGETITLE' | translate }} + + + + + +
+ {{ listData.rank }} +
+
+ {{ listData.name || 'Hidden Name' }} +
+
+ {{ listData.experience_points }} +
+
+
+ + + + {{ rankingListEmpty }} + + + + + +
+ {{ myRankingData.rank }} +
+ {{ 'RANKING.ME' | translate }} +
+ {{ myRankingData.experience_points }} +
+
+
+
diff --git a/src/pages/rankings/list/rankings.page.ts b/src/pages/rankings/list/rankings.page.ts new file mode 100644 index 00000000..20b79bc4 --- /dev/null +++ b/src/pages/rankings/list/rankings.page.ts @@ -0,0 +1,97 @@ +import { Component } from '@angular/core'; +import { NavController, NavParams, LoadingController, AlertController } from 'ionic-angular'; +import { TranslationService } from '../../../shared/translation/translation.service'; +import { loadingMessages, errMessages } from '../../../app/messages'; +import * as _ from 'lodash'; +// services +import { GameService } from '../../../services/game.service'; +import { CacheService } from '../../../shared/cache/cache.service'; +// pages +import { RankingDetailsPage } from '../view/ranking-details.page'; +@Component({ + selector: 'rankings-list-page', + templateUrl: 'rankings.html' +}) +export class RankingsPage { + public totalData: any = []; + public rankingData: any = []; + public myRankingData: any = []; + public listRankingData: any = []; + public isEmptyList: boolean = false; + public rankingListEmpty: any = errMessages.General.empty.empty; + public loadingMessages: any = loadingMessages.LoadingSpinner.loading; + public emptyErrorMessage: any = errMessages.General.loading.load; + constructor(private navCtrl: NavController, + private loadingCtrl: LoadingController, + private alertCtrl: AlertController, + private gameService: GameService, + private cacheService: CacheService){} + ionViewWillEnter(){ + this.RankingData(); + } + RankingData(){ + const loading = this.loadingCtrl.create({ + content: this.loadingMessages + }); + const emptyDataAlert = this.alertCtrl.create({ + title: 'Sorry, No data has been found', + message: this.emptyErrorMessage, + buttons: ['Close'] + }); + loading.present(); + // @TODO remove later + let gameId = this.cacheService.getLocalObject('game_id'); + this.gameService.getCharacters(gameId) + .subscribe((characters) => { + // Now only have one character per project + let me = characters.Characters[0]; + this.gameService.getRanking(gameId, me.id) + .subscribe( + results => { + loading.dismiss().then(() => { + console.log(results); + this.totalData = results; + this.rankingData = this.totalData; + // We only have 1 character + this.myRankingData = this.totalData.MyCharacters[0]; + this.listRankingData = this.totalData.Characters; + console.log(this.myRankingData); + console.log(this.listRankingData); + if (results) { + this.isEmptyList = false; + } + // _.forEach(this.listRankingData, (element, idx) => { + // if (!element.name) { + // this.listRankingData[idx].name = 'Hidden Name'; + // } + // this.isEmptyList = false; + // }); + console.log('this.listRankingData', this.listRankingData); + }); + }, + err => { + loading.dismiss().then(() => { + this.isEmptyList = true; + // this.rankingListEmpty = err.msg; + console.log('Error: ', err.msg); + emptyDataAlert.present(); + }); + } + ); + }, + err => { + loading.dismiss().then(() => { + this.isEmptyList = true; + // this.rankingListEmpty = err.msg; + console.log('Error: ', err.msg); + emptyDataAlert.present(); + }); + }); + } + goRankingDetail(myRanking){ + console.log('goRankingDetail', myRanking) + this.navCtrl.push(RankingDetailsPage, { + myRanking: myRanking + }); + } +} diff --git a/src/pages/rankings/list/rankings.scss b/src/pages/rankings/list/rankings.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/pages/rankings/view/ranking-badges.html b/src/pages/rankings/view/ranking-badges.html new file mode 100644 index 00000000..eaa788fb --- /dev/null +++ b/src/pages/rankings/view/ranking-badges.html @@ -0,0 +1,18 @@ + + + {{ currentAchievement.name || achievementName }} + + + + + + + + + + + + diff --git a/src/pages/rankings/view/ranking-badges.ts b/src/pages/rankings/view/ranking-badges.ts new file mode 100644 index 00000000..226173b1 --- /dev/null +++ b/src/pages/rankings/view/ranking-badges.ts @@ -0,0 +1,36 @@ +import { Component } from '@angular/core'; +import { ViewController, ToastController, LoadingController, NavParams } from 'ionic-angular'; +import { TranslationService } from '../../../shared/translation/translation.service'; +import { loadingMessages, errMessages } from '../../../app/messages'; +import * as _ from 'lodash'; +// services +import { AchievementService } from '../../../services/achievement.service'; +// pages +import { RankingDetailsPage } from '../view/ranking-details.page'; +@Component({ + selector: 'ranking-badges', + templateUrl: 'ranking-badges.html' +}) +export class RankingBadgesPage { + public currentAchievement: any = null; + public badgeUrl: string = '../assets/img/default/default-badge.png'; + public description: string = "No Description Yet .."; + public points: number = 0; + public achievementName: string = "Achievement"; + public loadingMessage: any = loadingMessages.LoadingSpinner.loading; + public achievementsLoadingErr: any = errMessages.General.loading.load; + public achievementsEmptyDataErr: any = errMessages.Activities.achievements.empty; + constructor(private viewCtrl: ViewController, + private navParams: NavParams, + private toastCtrl: ToastController, + private loadingCtrl: LoadingController, + private achievementService: AchievementService, + public translationService: TranslationService){ + this.currentAchievement = this.navParams.get('achievement'); + console.log("currentAchievement: ", this.currentAchievement); + } + // close disbaled activity popup + closeModal() { + this.viewCtrl.dismiss(); + } +} \ No newline at end of file diff --git a/src/pages/rankings/view/ranking-details.html b/src/pages/rankings/view/ranking-details.html new file mode 100644 index 00000000..d822f4b2 --- /dev/null +++ b/src/pages/rankings/view/ranking-details.html @@ -0,0 +1,29 @@ + + + {{ 'RANKING.ME' | translate }} + + + + + + + {{ 'RANKING.TOTALPOINTS' | translate }} +
+ {{ totalPoints || 0 }} +
+
+
+ + + + + + +

{{ eachAchievement.name || achievementName }}

+
+
+
diff --git a/src/pages/rankings/view/ranking-details.page.ts b/src/pages/rankings/view/ranking-details.page.ts new file mode 100644 index 00000000..d6ee9f8b --- /dev/null +++ b/src/pages/rankings/view/ranking-details.page.ts @@ -0,0 +1,74 @@ +import { Component } from '@angular/core'; +import { NavController, NavParams, LoadingController, AlertController, ModalController } from 'ionic-angular'; +import { TranslationService } from '../../../shared/translation/translation.service'; +import { loadingMessages, errMessages } from '../../../app/messages'; +import * as _ from 'lodash'; +import * as moment from 'moment'; +// services +import { AchievementService } from '../../../services/achievement.service'; +// pages +import { RankingBadgesPage } from './ranking-badges'; +@Component({ + selector: 'rankings-details-page', + templateUrl: 'ranking-details.html' +}) +export class RankingDetailsPage { + public userAchievementsData: any = []; + public achievementBadgeImage = '../assets/img/default/default-badge.png'; + public achievementName = 'Achievement'; + public totalPoints = 0; + public myRank: any= {}; + + public emptyAchievementMessage = errMessages.Activities.achievements.empty; + public loadingMessages: any = loadingMessages.LoadingSpinner.loading; + public emptyErrorMessage: any = errMessages.General.loading.load; + constructor(private navCtrl: NavController, + private loadingCtrl: LoadingController, + private alertCtrl: AlertController, + private modalCtrl: ModalController, + private params: NavParams, + private achievementService: AchievementService){} + + ionViewWillEnter() { + this.myRank = this.params.get('myRanking'); + this.totalPoints = this.myRank.experience_points; + + let loader = this.loadingCtrl.create(); + loader.present().then(() => { + this.userAchievements() + .then(() => { + loader.dismiss(); + }, err => { + console.log('log::', err); + }); + }); + + } + userAchievements(): Promise { + return new Promise((resolve, reject) => { + this.achievementService.getAchievements() + .subscribe( + (data) => { + console.log('achievemnts', data); + if (data) { + // Filter achievemnts + _.forEach(data.Achievement, element => { + if(element.visibility !== 2){ + this.userAchievementsData.push(element); + } + }); + } + resolve(); + }, + (err) => { + console.log("Error: ", err); + reject(err); + } + ); + }); + } + goToBadgeDetailsPage(achievementData){ + let goRankingBadgesPopup = this.modalCtrl.create(RankingBadgesPage, { achievement: achievementData }); + goRankingBadgesPopup.present(); + } +} diff --git a/src/pages/rankings/view/ranking-details.scss b/src/pages/rankings/view/ranking-details.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/pages/registration/modal.html b/src/pages/registration/modal.html index a2f243e7..3baf0af4 100644 --- a/src/pages/registration/modal.html +++ b/src/pages/registration/modal.html @@ -2,15 +2,9 @@ - - Set Password - - -
- - × - -
+ + {{ 'REGISTRATION.PAGETITLE' | translate }} +
@@ -31,17 +25,17 @@ color="button" class="general-circle-btn" [disabled]="password!=verify_password || regForm.invalid"> - DONE + {{ 'GENERAL.DONE' | translate }}
- Password Mismatch .. + {{ passwordMismatchMessage }}
- Password minimum length is 8 characters .. + {{ passwordMinlengthMessage }}
diff --git a/src/pages/registration/modal.ts b/src/pages/registration/modal.ts index 34d69413..c5eb8887 100644 --- a/src/pages/registration/modal.ts +++ b/src/pages/registration/modal.ts @@ -2,11 +2,15 @@ import { Component, ViewChild, NgZone, OnInit, Inject } from '@angular/core'; import { NgForm, FormBuilder, FormGroup, Validators } from '@angular/forms'; import { NavController, ViewController, AlertController, LoadingController, NavParams } from 'ionic-angular'; import { Observable } from 'rxjs/Observable'; +import { loadingMessages, errMessages, generalVariableMessages } from '../../app/messages'; +import { TranslationService } from '../../shared/translation/translation.service'; // services import { AuthService } from '../../services/auth.service'; +import { CacheService } from '../../shared/cache/cache.service'; +import { GameService } from '../../services/game.service'; import { MilestoneService } from '../../services/milestone.service'; import { NotificationService } from '../../shared/notification/notification.service'; -import { CacheService } from '../../shared/cache/cache.service'; + // directives import { FormValidator } from '../../validators/formValidator'; // pages @@ -15,7 +19,7 @@ import { LoginPage } from '../login/login'; import * as _ from 'lodash'; import 'rxjs/add/operator/map'; -const supportEmail = 'help@support.com'; +const supportEmail = generalVariableMessages.helpMail.email; @Component({ selector: 'page-registration-modal', @@ -40,6 +44,15 @@ export class RegistrationModalPage { private milestone_id: string; private password: string; private verify_password: string; + // loading & error messages variables + private successRegistrationLoading: any = loadingMessages.SuccessRegistration.successRegistration; + private passwordMismatchErrMessage: any = errMessages.Registration.mismatch.mismatch; + private registrationErrMessage: any = errMessages.Registration.error.error; + private invalidUserErrMessage: any = errMessages.Registration.invalidUser.account; + private noPasswordErrMessage: any = errMessages.Registration.noPassword.password; + private registeredErrMessage: any = errMessages.Registration.alreadyRegistered.registered; + private passwordMismatchMessage: any = errMessages.PasswordValidation.mismatch.mismatch; + private passwordMinlengthMessage: any = errMessages.PasswordValidation.minlength.minlength; constructor( @Inject(FormBuilder) fb: FormBuilder, public navCtrl: NavController, @@ -50,6 +63,8 @@ export class RegistrationModalPage { private loading: LoadingController, private authService: AuthService, private cache: CacheService, + private gameService: GameService, + public translationService: TranslationService, private milestone: MilestoneService, private ngZone:NgZone, ) { @@ -59,6 +74,7 @@ export class RegistrationModalPage { verify_password: ['', [Validators.minLength(8), Validators.required]], }); } + public displayAlert(message) { return this.alertCtrl.create({ title: 'Test', @@ -66,9 +82,7 @@ export class RegistrationModalPage { buttons: ['OK'] }); } - ionViewDidLoad() { - console.log(this.regForm); - } + onSubmit(form: NgForm):void { let self = this; self.submitted = true; @@ -76,17 +90,17 @@ export class RegistrationModalPage { if (err.frontendErrorCode === 'SERVER_ERROR') { throw 'API endpoint error'; } - let message = `Something went wrong, please contact ${supportEmail}`; + let message = this.registrationErrMessage + `${supportEmail}`; if (err && err.data && err.data.msg) { switch (err.data.msg) { case 'Invalid user': - message = `Account not found, please contact ${supportEmail}`; + message = this.invalidUserErrMessage + `${supportEmail}`; break; case 'No password': - message = "Unable to register, invalid password"; + message = this.noPasswordErrMessage; break; case 'User already registered': - message = "Your account is already registered, please log in"; + message = this.registeredErrMessage; break; } } @@ -101,13 +115,13 @@ export class RegistrationModalPage { if (this.user.password !== this.user.verify_password) { this.notificationService.alert({ title: 'Incorrect Password', - subTitle: 'The passwords entered do not match.', - buttons: ['OK'] + subTitle: this.passwordMismatchErrMessage, + buttons: ['Close'] }); } else { const loading = this.loading.create({ dismissOnPageChange: true, - content: 'Your password has been successfully set. You will now be logged in.' + content: this.successRegistrationLoading }); // registration api call: to let user set password and complete registration process loading.present(); @@ -118,13 +132,29 @@ export class RegistrationModalPage { password: this.regForm.get('password').value }).subscribe(regRespond => { //@TODO: set user data + regRespond = regRespond.data; console.log(regRespond); this.cache.setLocalObject('apikey', regRespond.apikey); this.cache.setLocalObject('timelineID', regRespond.Timeline.id); + this.cache.setLocal('gotNewItems', false); // after passed registration api call, we come to post_auth api call to let user directly login after registred successfully this.authService.loginAuth(this.cache.getLocal('user.email'), this.regForm.get('password').value) .subscribe( data => { + // get game_id data after login + this.gameService.getGames() + .subscribe( + data => { + console.log("game data: ", data); + _.map(data, (element) => { + console.log("game id: ", element[0].id); + this.cache.setLocal('game_id', element[0].id); + }); + }, + err => { + console.log("game err: ", err); + } + ); // get user data after registration and login self.authService.getUser() .subscribe( @@ -142,6 +172,7 @@ export class RegistrationModalPage { this.milestone_id = data.data[0].id; self.cache.setLocalObject('milestone_id', data.data[0].id); self.navCtrl.push(TabsPage).then(() => { + this.viewCtrl.dismiss(); // close the login modal and go to dashaboard page window.history.replaceState({}, '', window.location.origin); }); }, @@ -156,6 +187,7 @@ export class RegistrationModalPage { }, onRegError, onFinally); } } + setRegistrationData(data) { let cacheProcesses = []; _.forEach(data, (datum, key) => { diff --git a/src/pages/registration/register.html b/src/pages/registration/register.html index 8eb599c2..905ebfa0 100644 --- a/src/pages/registration/register.html +++ b/src/pages/registration/register.html @@ -1,25 +1,45 @@ @@ -27,7 +47,7 @@
- Sorry, verification failed, please resend your email and password. + {{ verifyFailedErrMessage }}
diff --git a/src/pages/registration/register.page.ts b/src/pages/registration/register.page.ts index d4760aca..1bb9842c 100644 --- a/src/pages/registration/register.page.ts +++ b/src/pages/registration/register.page.ts @@ -1,15 +1,26 @@ -import { Component, ViewChild, NgZone, OnInit } from '@angular/core'; -import { NgForm } from '@angular/forms'; -import { LoadingController, ModalController, NavParams } from 'ionic-angular'; +import { Component, ViewChild, OnInit, Inject } from '@angular/core'; +import { NgForm, FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { NavController, ViewController, AlertController, LoadingController, NavParams } from 'ionic-angular'; import { Observable } from 'rxjs/Observable'; +import { loadingMessages, errMessages, generalVariableMessages } from '../../app/messages'; // services -import { CacheService } from '../../shared/cache/cache.service'; import { AuthService } from '../../services/auth.service'; +import { CacheService } from '../../shared/cache/cache.service'; +import { GameService } from '../../services/game.service'; import { MilestoneService } from '../../services/milestone.service'; import { NotificationService } from '../../shared/notification/notification.service'; -import { ResponsiveService } from '../../services/responsive.service'; +import { TranslationService } from '../../shared/translation/translation.service'; +// directives +import { FormValidator } from '../../validators/formValidator'; // pages import { RegistrationModalPage } from './modal'; +import { TabsPage } from '../tabs/tabs.page'; +import { LoginPage } from '../login/login'; +import * as _ from 'lodash'; +import 'rxjs/add/operator/map'; + +const supportEmail = generalVariableMessages.helpMail.email; + @Component({ selector: 'register', templateUrl: 'register.html', @@ -18,29 +29,193 @@ import { RegistrationModalPage } from './modal'; export class RegisterPage implements OnInit { @ViewChild('registrationForm') registrationForm: NgForm; user: any = { - password: null, - verify_password: null + password: '', + verify_password: '' }; submitted: boolean = false; - private windowHeight: number = window.innerHeight / 3; - private isLandscaped: boolean = false; + private regForm: any; + private pwdMacthBool: boolean = false; + private verifyPwd: boolean = false; + private verifySuccess: boolean = null; + private isPwdMatch: boolean = false; + private changeContent: boolean = false; + private minLengthCheck: boolean = true; + private clickSuspended: boolean = false; + private milestone_id: string; + private password: string; + private verify_password: string; + // loading & error messages variables + private verifyFailedErrMessage = errMessages.Registration.verifyFailed.verifyfailed; + private successRegistrationLoading: any = loadingMessages.SuccessRegistration.successRegistration; + private passwordMismatchErrMessage: any = errMessages.Registration.mismatch.mismatch; + private registrationErrMessage: any = errMessages.Registration.error.error; + private invalidUserErrMessage: any = errMessages.Registration.invalidUser.account; + private noPasswordErrMessage: any = errMessages.Registration.noPassword.password; + private registeredErrMessage: any = errMessages.Registration.alreadyRegistered.registered; + private passwordMismatchMessage: any = errMessages.PasswordValidation.mismatch.mismatch; + private passwordMinlengthMessage: any = errMessages.PasswordValidation.minlength.minlength; constructor( - private navParams: NavParams, + @Inject(FormBuilder) fb: FormBuilder, + public navCtrl: NavController, + public alertCtrl: AlertController, + private viewCtrl: ViewController, private notificationService: NotificationService, + private navParams: NavParams, private loading: LoadingController, private authService: AuthService, private cache: CacheService, + private gameService: GameService, + public translationService: TranslationService, private milestone: MilestoneService, - private ngZone:NgZone, - private modalCtrl: ModalController, - private responsiveService: ResponsiveService){} + ) { + // validation for both password values: required & minlength is 8 + this.regForm = fb.group({ + password: ['', [Validators.minLength(8), Validators.required]], + verify_password: ['', [Validators.minLength(8), Validators.required]], + }); + } ngOnInit() { } - popRegistrationModal() { - let registerModal = this.modalCtrl.create(RegistrationModalPage, { - "email": this.navParams.get('email') + public displayAlert(message) { + return this.alertCtrl.create({ + title: 'Test', + message: message, + buttons: ['OK'] }); - console.log("get email: " + this.navParams.get('email')); - registerModal.present(); + } + onSubmit(form: NgForm):void { + let self = this; + self.submitted = true; + function onRegError(err) { + if (err.frontendErrorCode === 'SERVER_ERROR') { + throw 'API endpoint error'; + } + let message = this.registrationErrMessage + `${supportEmail}`; + if (err && err.data && err.data.msg) { + switch (err.data.msg) { + case 'Invalid user': + message = this.invalidUserErrMessage + `${supportEmail}`; + break; + case 'No password': + message = this.noPasswordErrMessage; + break; + case 'User already registered': + message = this.registeredErrMessage; + break; + } + } + self.displayAlert(message).present(); + self.submitted = false; + } + function onFinally() { + //@TODO: log something maybe + // self.navCtrl.push(TabsPage); + console.log('Final step - log something here'); + } + if (this.user.password !== this.user.verify_password) { + this.notificationService.alert({ + title: 'Incorrect Password', + subTitle: this.passwordMismatchErrMessage, + buttons: ['Close'] + }); + } else { + const loading = this.loading.create({ + dismissOnPageChange: true, + content: this.successRegistrationLoading + }); + // registration api call: to let user set password and complete registration process + loading.present().then(() => { + this.authService.register({ + email: this.cache.getLocal('user.email'), + key: this.cache.getLocal('user.registration_key'), + user_id: this.cache.getLocal('user.id'), + password: this.regForm.get('password').value + }).subscribe(regRespond => { + //@TODO: set user data + regRespond = regRespond.data; + console.log(regRespond); + this.cache.setLocalObject('apikey', regRespond.apikey); + this.cache.setLocalObject('timelineID', regRespond.Timeline.id); + this.cache.setLocal('gotNewItems', false); + // after passed registration api call, we come to post_auth api call to let user directly login after registred successfully + this.authService.loginAuth(this.cache.getLocal('user.email'), this.regForm.get('password').value) + .subscribe( + data => { + // get game_id data after login + this.gameService.getGames() + .subscribe( + data => { + console.log("game data: ", data); + _.map(data, (element) => { + console.log("game id: ", element[0].id); + this.cache.setLocal('game_id', element[0].id); + }); + }, + err => { + console.log("game err: ", err); + } + ); + // get user data after registration and login + self.authService.getUser() + .subscribe( + data => { + console.log(data); + }, + err => { + console.log(err); + } + ); + // get milestone data after registration and login + self.milestone.getMilestones() + .subscribe( data => { + loading.dismiss().then(() => { + // console.log(data.data[0].id); + this.milestone_id = data.data[0].id; + self.cache.setLocalObject('milestone_id', data.data[0].id); + self.navCtrl.push(TabsPage).then(() => { + window.history.replaceState({}, '', window.location.origin); + }); + }); + }, + err => { + loading.dismiss().then(() => { + console.log(err); + }); + }); + }, + err => { + loading.dismiss().then(() => { + console.log(err); + }); + } + ); + }, onRegError, onFinally); + }); + } + } + setRegistrationData(data) { + let cacheProcesses = []; + _.forEach(data, (datum, key) => { + cacheProcesses.push(this.cache.set(key, datum)); + }); + cacheProcesses.push(this.cache.set('timelineID', data.Timeline.id)); + this.cache.setLocal('timelineID', data.Timeline.id); + return Observable.from(cacheProcesses); + } + goToLogin() { + this.cache.clear().then(() => { + this.navCtrl.push(LoginPage); + }); + } + // check password minmimum length + checkMinLength(){ + return (this.password.length < 8 || this.verify_password.length < 8) ? this.minLengthCheck = true : this.minLengthCheck = false; + } + // check password mismacth issue + verifyPwdKeyUp() { + return this.verifyPwd = true; + } + pwdMatchCheck() { + return this.password != this.verify_password ? this.isPwdMatch = true : this.isPwdMatch = false; } } diff --git a/src/pages/registration/registration.page.ts b/src/pages/registration/registration.page.ts index 2467533f..65f1f0c3 100644 --- a/src/pages/registration/registration.page.ts +++ b/src/pages/registration/registration.page.ts @@ -2,11 +2,15 @@ import { Component, OnInit } from '@angular/core'; import { CacheService } from '../../shared/cache/cache.service'; import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'; import { NavController, NavParams, AlertController } from 'ionic-angular'; +import { Observable } from 'rxjs'; +import { TranslationService } from '../../shared/translation/translation.service'; +import { loadingMessages, errMessages } from '../../app/messages'; +// services import { AuthService } from '../../services/auth.service'; import { RequestService } from '../../shared/request/request.service'; import { NotificationService } from '../../shared/notification/notification.service'; +// pages import { LoginPage } from '../../pages/login/login'; -import { Observable } from 'rxjs'; @Component({ template: ``, }) @@ -18,12 +22,15 @@ export class RegistrationPage implements OnInit { term: String; content: SafeResourceUrl; private prefixUrl: any = this.request.getPrefixUrl(); + // loadinbg & error message variables + private verifyFailedErrMessage = errMessages.Registration.verifyFailed.verifyfailed; constructor( public nav: NavController, private params: NavParams, private authService: AuthService, private sanitizer: DomSanitizer, private notification: NotificationService, + public translationService: TranslationService, private alertCtrl: AlertController, private cache: CacheService, private request: RequestService) {} @@ -58,7 +65,7 @@ export class RegistrationPage implements OnInit { }).subscribe(res => { this.cache.setLocal('user.email', email); this.cache.setLocal('user.registration_key', key); - this.cache.setLocal('user.id', res.User.id); + this.cache.setLocal('user.id', res.data.User.id); this.user = { email: email, key: key @@ -66,7 +73,7 @@ export class RegistrationPage implements OnInit { Observable.forkJoin([ this.cache.write('user.email', email), this.cache.write('user.registration_key', key), - this.cache.write('user.id', res.User.id) + this.cache.write('user.id', res.data.User.id) ]).subscribe(responds => { console.log('RespondsVerify::', responds); }); @@ -78,7 +85,7 @@ export class RegistrationPage implements OnInit { } ionViewDidEnter(): void { this.authService.getTerms().subscribe(res => { - console.log(res); + console.log("terms data: ", res); this.term = res.terms_description; this.content = this.sanitizer.bypassSecurityTrustResourceUrl(this.prefixUrl + res.terms_url); }); diff --git a/src/pages/reset-password/reset-password.html b/src/pages/reset-password/reset-password.html index 69c5831e..5724d08e 100644 --- a/src/pages/reset-password/reset-password.html +++ b/src/pages/reset-password/reset-password.html @@ -1,25 +1,57 @@ @@ -27,7 +59,7 @@

- Oops! There was an error, please try again. In 5 seconds you will return to the login page ... + {{ invalidLinkErrMessage }}
diff --git a/src/pages/reset-password/reset-password.ts b/src/pages/reset-password/reset-password.ts index 4a2b0c1d..bf5f7a0e 100644 --- a/src/pages/reset-password/reset-password.ts +++ b/src/pages/reset-password/reset-password.ts @@ -1,11 +1,19 @@ import { Component, NgZone, OnInit } from '@angular/core'; import { NavController, + ViewController, NavParams, LoadingController, AlertController, ModalController } from 'ionic-angular'; +import { TranslationService } from '../../shared/translation/translation.service'; +import { loadingMessages, errMessages } from '../../app/messages'; +import { FormBuilder, Validators } from '@angular/forms'; +import * as _ from 'lodash'; // services import { AuthService } from '../../services/auth.service'; +import { CacheService } from '../../shared/cache/cache.service'; +import { GameService } from '../../services/game.service'; +import { MilestoneService } from '../../services/milestone.service'; import { ResponsiveService } from '../../services/responsive.service'; // directives import {FormValidator} from '../../validators/formValidator'; @@ -28,15 +36,32 @@ export class ResetPasswordPage implements OnInit { private resetPwdFormGroup: any; private verifyPwd: boolean = false; private minLengthCheck: boolean = true; + public milestone_id: string; + private isPwdMatch: boolean = false; + // loading & error message variables + private invalidLinkErrMessage = errMessages.ResetPassword.invalidLink.invalid; + private verifyUserMessage = loadingMessages.VerifyUser.verify; + private successResetPasswordMessage: any = loadingMessages.SuccessResetPassword.successResetPassword; + private resetPasswordLoginFailedMessage: any = errMessages.ResetPassword.resetLoginFailed.failed; + private passwordMismatchMessage: any = errMessages.PasswordValidation.mismatch.mismatch; + private passwordMinlengthMessage: any = errMessages.PasswordValidation.minlength.minlength; constructor(private navCtrl: NavController, - private navParams: NavParams, - private ngZone: NgZone, - private modalCtrl: ModalController, - private alertCtrl: AlertController, - private authService: AuthService, - private loadingCtrl: LoadingController, - private responsiveService: ResponsiveService) { - } + private navParams: NavParams, + private alertCtrl: AlertController, + private authService: AuthService, + private viewCtrl: ViewController, + private loadingCtrl: LoadingController, + private formBuilder: FormBuilder, + private milestoneService: MilestoneService, + private cacheService: CacheService, + private gameService: GameService, + public translationService: TranslationService) { + // validation for both password values: required & minlength is 8 + this.resetPwdFormGroup = formBuilder.group({ + password: ['', [Validators.minLength(8), Validators.required]], + verify_password: ['', [Validators.minLength(8), Validators.required]], + }) + } /** * Detect user device type (mobile or desktop) on initial page load * Purpose: Initially page loaded, this peice code will detect user screen @@ -70,7 +95,7 @@ export class ResetPasswordPage implements OnInit { this.keyVal = key; this.emailVal = email; const loading = this.loadingCtrl.create({ - content: 'Verifying user identity ..' + content: this.verifyUserMessage }); loading.present(); this.authService.verifyUserKeyEmail(key, email) @@ -90,8 +115,116 @@ export class ResetPasswordPage implements OnInit { }, 5000); }); } - popResetpasswordModel(){ - let resetpasswordModal = this.modalCtrl.create(ResetpasswordModelPage, {"key": this.keyVal, "email": this.emailVal}); - resetpasswordModal.present(); + /** + * to update password in db + * Purpose: store new password for user + * @param { key, email, password, verify_password } + * @return if API request is passed (status code: 200), user password updated + successfully, otherwise, error hint popup to indicate user password + update failed + */ + updatePassword(){ + let key = this.navParams.get('key'), + email = decodeURIComponent(this.navParams.get('email')); + const loading = this.loadingCtrl.create({ + content: this.successResetPasswordMessage + }); + loading.present().then(() => { + this.authService.resetUserPassword(key, email, this.password, this.verify_password).subscribe(data => { + // loading.dismiss(); + // this.navCtrl.push(LoginPage); + this.authService.loginAuth(email, this.password) + .subscribe(data => { + data = data.data; + this.cacheService.setLocalObject('apikey', data.apikey); + this.cacheService.setLocalObject('timelineID', data.Timelines[0].Timeline.id); + this.cacheService.setLocalObject('teams', data.Teams); + this.cacheService.setLocal('gotNewItems', false); + // get game_id data after login + this.gameService.getGames() + .subscribe( + data => { + console.log("game data: ", data); + _.map(data, (element) => { + console.log("game id: ", element[0].id); + this.cacheService.setLocal('game_id', element[0].id); + }); + }, + err => { + console.log("game err: ", err); + } + ); + // get milestone data after login + this.authService.getUser() + .subscribe( + data => { + this.cacheService.setLocalObject('name', data.User.name); + this.cacheService.setLocalObject('email', data.User.email); + this.cacheService.setLocalObject('program_id', data.User.program_id); + this.cacheService.setLocalObject('project_id', data.User.project_id); + }, + err => { + console.log(err); + } + ); + // get milestone data after login + this.milestoneService.getMilestones() + .subscribe( + data => { + loading.dismiss().then(() => { + console.log(data.data[0].id); + this.milestone_id = data.data[0].id; + this.cacheService.setLocalObject('milestone_id', data.data[0].id); + console.log("milestone id: " + data.data[0].id); + loading.dismiss(); + this.navCtrl.push(TabsPage).then(() => { + this.viewCtrl.dismiss(); // close the login modal and go to dashaboard page + window.history.replaceState({}, '', window.location.origin); + }); + }); + }, + err => { + loading.dismiss().then(() => { + console.log(err); + }); + } + ) + this.cacheService.write('isAuthenticated', true); + this.cacheService.setLocal('isAuthenticated', true); + }, + err => { + loading.dismiss().then(() => { + this.loginError(err); + this.cacheService.removeLocal('isAuthenticated'); + this.cacheService.write('isAuthenticated', false); + }); + }); + }, + err => { + loading.dismiss().then(() => { + console.log(err); + }); + }); + }); + } + // after password set, auto login error alertbox + loginError(error) { + const alertLogin = this.alertCtrl.create({ + title: 'Login Failed ..', + message: this.resetPasswordLoginFailedMessage, + buttons: ['Close'] + }); + alertLogin.present(); + } + // check password minmimum length + checkMinLength(){ + return (this.password.length < 8 || this.verify_password.length < 8) ? this.minLengthCheck = true : this.minLengthCheck = false; + } + // check password mismacth issue + verifyPwdKeyUp() { + return this.verifyPwd = true; + } + pwdMatchCheck() { + return this.password != this.verify_password ? this.isPwdMatch = true : this.isPwdMatch = false; } } diff --git a/src/pages/resetpassword-model/resetpassword-model.html b/src/pages/resetpassword-model/resetpassword-model.html index 618d86a1..c0371889 100644 --- a/src/pages/resetpassword-model/resetpassword-model.html +++ b/src/pages/resetpassword-model/resetpassword-model.html @@ -2,15 +2,9 @@ - - Reset Password - - -
- - × - -
+ + {{ 'RESETPASSWORD.PAGETITLE' | translate }} +
@@ -43,17 +37,17 @@ class="general-circle-btn" (click)="updatePassword()" [disabled]="password!=verify_password || resetPasswordForm.invalid"> - DONE + {{ 'GENERAL.DONE' | translate }}
- Password Mismatch .. + {{ passwordMismatchMessage }}
- Password minimum length is 8 characters .. + {{ passwordMinlengthMessage }}
diff --git a/src/pages/resetpassword-model/resetpassword-model.ts b/src/pages/resetpassword-model/resetpassword-model.ts index 4689c7d3..c13208d4 100644 --- a/src/pages/resetpassword-model/resetpassword-model.ts +++ b/src/pages/resetpassword-model/resetpassword-model.ts @@ -5,10 +5,14 @@ import { NavController, LoadingController, AlertController } from 'ionic-angular'; import { FormBuilder, Validators } from '@angular/forms'; +import * as _ from 'lodash'; +import { loadingMessages, errMessages } from '../../app/messages'; // services import { AuthService } from '../../services/auth.service'; import { MilestoneService } from '../../services/milestone.service'; import { CacheService } from '../../shared/cache/cache.service'; +import { GameService } from '../../services/game.service'; +import { TranslationService } from '../../shared/translation/translation.service'; // pages import { TabsPage } from '../tabs/tabs.page'; import { LoginPage } from '../login/login'; @@ -26,6 +30,11 @@ export class ResetpasswordModelPage { private isPwdMatch: boolean = false; private verifyPwd: boolean = false; private minLengthCheck: boolean = true; + // loading & error message variables + private successResetPasswordMessage: any = loadingMessages.SuccessResetPassword.successResetPassword; + private resetPasswordLoginFailedMessage: any = errMessages.ResetPassword.resetLoginFailed.failed; + private passwordMismatchMessage: any = errMessages.PasswordValidation.mismatch.mismatch; + private passwordMinlengthMessage: any = errMessages.PasswordValidation.minlength.minlength; constructor( private navCtrl: NavController, private navParams: NavParams, @@ -35,7 +44,9 @@ export class ResetpasswordModelPage { private loadingCtrl: LoadingController, private formBuilder: FormBuilder, private milestoneService: MilestoneService, - private cacheService: CacheService + private cacheService: CacheService, + private gameService: GameService, + public translationService: TranslationService ) { // validation for both password values: required & minlength is 8 this.resetPwdFormGroup = formBuilder.group({ @@ -61,7 +72,7 @@ export class ResetpasswordModelPage { let key = this.navParams.get('key'), email = decodeURIComponent(this.navParams.get('email')); const loading = this.loadingCtrl.create({ - content: 'Password successfully changed. Logging in now.' + content: this.successResetPasswordMessage }); loading.present(); this.authService.resetUserPassword(key, email, this.password, this.verify_password).subscribe(data => { @@ -69,13 +80,31 @@ export class ResetpasswordModelPage { // this.navCtrl.push(LoginPage); this.authService.loginAuth(email, this.password) .subscribe(data => { + data = data.data; this.cacheService.setLocalObject('apikey', data.apikey); this.cacheService.setLocalObject('timelineID', data.Timelines[0].Timeline.id); this.cacheService.setLocalObject('teams', data.Teams); + this.cacheService.setLocal('gotNewItems', false); + // get game_id data after login + this.gameService.getGames() + .subscribe( + data => { + console.log("game data: ", data); + _.map(data, (element) => { + console.log("game id: ", element[0].id); + this.cacheService.setLocal('game_id', element[0].id); + }); + }, + err => { + console.log("game err: ", err); + } + ); // get milestone data after login this.authService.getUser() .subscribe( data => { + this.cacheService.setLocalObject('name', data.User.name); + this.cacheService.setLocalObject('email', data.User.email); this.cacheService.setLocalObject('program_id', data.User.program_id); this.cacheService.setLocalObject('project_id', data.User.project_id); }, @@ -93,6 +122,7 @@ export class ResetpasswordModelPage { console.log("milestone id: " + data.data[0].id); loading.dismiss(); this.navCtrl.push(TabsPage).then(() => { + this.viewCtrl.dismiss(); // close the login modal and go to dashaboard page window.history.replaceState({}, '', window.location.origin); }); }, @@ -109,18 +139,18 @@ export class ResetpasswordModelPage { this.cacheService.removeLocal('isAuthenticated'); this.cacheService.write('isAuthenticated', false); }); - console.log('Succefully updated'); + // console.log('Succefully updated'); }, err => { loading.dismiss(); - console.log('Update failure ..'); + // console.log('Update failure ..'); }); } // after password set, auto login error alertbox loginError(error) { const alertLogin = this.alertCtrl.create({ title: 'Login Failed ..', - message: 'Sorry, login failed, please go to login page to sign in', + message: this.resetPasswordLoginFailedMessage, buttons: ['Close'] }); alertLogin.present(); diff --git a/src/pages/settings/leaderboard/leaderboard-settings.html b/src/pages/settings/leaderboard/leaderboard-settings.html new file mode 100644 index 00000000..6ce93c66 --- /dev/null +++ b/src/pages/settings/leaderboard/leaderboard-settings.html @@ -0,0 +1,16 @@ + + + {{ 'SETTINGS.LEADERBOARD' | translate }} + + + + + +

Hi {{ username }} ({{ useremail }}),

+
+ +

Hide name in leaderboard?

+ +
+
+
\ No newline at end of file diff --git a/src/pages/settings/leaderboard/leaderboard-settings.page.ts b/src/pages/settings/leaderboard/leaderboard-settings.page.ts new file mode 100644 index 00000000..1cc215b2 --- /dev/null +++ b/src/pages/settings/leaderboard/leaderboard-settings.page.ts @@ -0,0 +1,15 @@ +import { Component } from '@angular/core'; +// services +import { CacheService } from '../../../shared/cache/cache.service'; +@Component({ + selector: 'leaderboard-settings-page', + templateUrl: 'leaderboard-settings.html' +}) +export class LeaderboardSettingsPage { + public username: string = this.cacheService.getLocalObject('name') || ''; + public useremail: string = this.cacheService.getLocalObject('email') || ''; + public isHide: boolean = false; + constructor(private cacheService: CacheService){ + + } +} \ No newline at end of file diff --git a/src/pages/settings/settings.html b/src/pages/settings/settings.html index 7fa8c7c5..5b516ab6 100644 --- a/src/pages/settings/settings.html +++ b/src/pages/settings/settings.html @@ -1,34 +1,32 @@ - - Settings - + {{ 'SETTINGS.PAGETITLE' | translate }} - My Profile ({{ getUserEmail() }}) + {{ 'SETTINGS.PROFILE' | translate }} ({{ getUserEmail() }}) - - - + - Support + {{ 'SETTINGS.SUPPORT' | translate }} - + + {{ 'SETTINGS.HELP' | translate }} + diff --git a/src/pages/settings/settings.page.ts b/src/pages/settings/settings.page.ts index d1d5c210..ec19792b 100644 --- a/src/pages/settings/settings.page.ts +++ b/src/pages/settings/settings.page.ts @@ -1,33 +1,48 @@ import { Component } from '@angular/core'; import { App, NavController, MenuController, LoadingController } from 'ionic-angular'; -import { TranslateService } from '@ngx-translate/core'; -import { i18nData } from '../../../app/i18n-en'; -import { loadingMessages, errMessages } from '../../app/messages'; +import { TranslationService } from '../../shared/translation/translation.service'; +import { loadingMessages, errMessages } from '../../app/messages'; // services import { CacheService } from '../../shared/cache/cache.service'; // pages +import { LeaderboardSettingsPage } from '../settings/leaderboard/leaderboard-settings.page'; import { LoginPage } from '../../pages/login/login'; +import { TutorialPage } from '../settings/tutorial/tutorial.page'; +import { TermConditionPage } from '../term-condition/term-condition.page'; @Component({ selector: 'settings-page', templateUrl: 'settings.html' }) export class SettingsPage { + public helpline = "help@practera.com"; + public logoutMessage: any = loadingMessages.Logout.logout; public loadingMessage: any = loadingMessages.Logout.logout; + public helpline = "help@practera.com"; constructor( private cache: CacheService, private navCtrl: NavController, private menuCtrl: MenuController, private loadingCtrl: LoadingController, + public translationService: TranslationService, private appCtrl: App ) {} public settings = []; public getUserEmail() { - return 'abcd.example.cc'; + return this.cache.getLocalObject('email') || ''; + } + public goLeaderBoardSettings(){ + this.navCtrl.push(LeaderboardSettingsPage); + } + public goToTutorial() { + this.navCtrl.push(TutorialPage); + } + public goToTermConditions() { + this.navCtrl.push(TermConditionPage); } public logout() { let loader = this.loadingCtrl.create({ spinner: 'hide', - content: this.loadingMessage + content: this.logoutMessage }); loader.present().then(() => { this.cache.clear().then(() => { diff --git a/src/pages/settings/tutorial/tutorial.html b/src/pages/settings/tutorial/tutorial.html new file mode 100644 index 00000000..bd72a1ce --- /dev/null +++ b/src/pages/settings/tutorial/tutorial.html @@ -0,0 +1,37 @@ + + + + + + + +

Welcome

+

Great to see you. The Practera App will help you getting the most out of your learning experience! Let’s get started.

+
+ + +

Real Feedback

+

The tasks you submit will be reviewed by real experts in their industry. This will help you to develop the right skills that you need to advance your career!

+
+ + + + +

Leaderboard

+

By engaging and interacting with the app, you will earn points and badges, which will put you on top of the leaderboard and make you even more interesting for employers!

+
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/src/pages/settings/tutorial/tutorial.page.ts b/src/pages/settings/tutorial/tutorial.page.ts new file mode 100644 index 00000000..861861e0 --- /dev/null +++ b/src/pages/settings/tutorial/tutorial.page.ts @@ -0,0 +1,26 @@ +import { Injectable, Component, ViewChild } from '@angular/core'; +import { NavController, LoadingController, Slides } from 'ionic-angular'; +import { ActivitiesListPage } from '../../activities/list/list.page'; +@Injectable() +@Component({ + selector: 'tutorial-page', + templateUrl: 'tutorial.html' +}) +export class TutorialPage { + @ViewChild(Slides) slides: Slides; + public indexCounter: number = 0; + public hideNextButton: boolean = false; + constructor(public navCtrl: NavController){} + goDashbaord() { + this.navCtrl.setRoot(ActivitiesListPage); + } + goPrev() { + this.slides.slidePrev(); + this.hideNextButton = false; + } + goNext() { + this.slides.slideNext(); + this.slides.isEnd() == true ? this.hideNextButton = true : this.hideNextButton = false; + // console.log(this.hideNextButton); + } +} \ No newline at end of file diff --git a/src/pages/sidenav/sidenav.ts b/src/pages/sidenav/sidenav.ts index 4c17b146..e0a4d380 100644 --- a/src/pages/sidenav/sidenav.ts +++ b/src/pages/sidenav/sidenav.ts @@ -3,7 +3,6 @@ import { NavController, MenuController } from 'ionic-angular'; // pages import { LoginPage } from '../login/login'; import { TabsPage } from '../tabs/tabs.page'; -import { HomePage } from '../home/home'; import { ActivitiesListPage } from '../activities/list/list.page'; import { LevelsListPage } from '../levels/list/list'; /* This is side navigation bar which shows after user logged in to the app */ @@ -15,7 +14,6 @@ export class SidenavPage { @ViewChild('sideNav') sideNav: NavController; loginPage = LoginPage; tabsPage = TabsPage; - homePage = HomePage; activitiesListPage = ActivitiesListPage; levelsListPage = LevelsListPage; rootPage = null; diff --git a/src/pages/tabs/tabs.html b/src/pages/tabs/tabs.html index ca7db4da..c45f2d85 100755 --- a/src/pages/tabs/tabs.html +++ b/src/pages/tabs/tabs.html @@ -1,6 +1,9 @@ - - - - + + + + + + + diff --git a/src/pages/tabs/tabs.page.ts b/src/pages/tabs/tabs.page.ts index d8377aa4..888aeb1b 100644 --- a/src/pages/tabs/tabs.page.ts +++ b/src/pages/tabs/tabs.page.ts @@ -1,19 +1,10 @@ import { Component } from '@angular/core'; - -import { HomePage } from '../home/home'; -import { GalleryPage } from '../gallery/gallery'; +import { TranslationService } from '../../shared/translation/translation.service'; import { ActivitiesListPage } from '../activities/list/list.page'; -import { LevelsListPage } from '../levels/list/list'; -import { TeamPage } from '../team/team'; - +import { RankingsPage } from '../rankings/list/rankings.page'; import { SettingsPage } from '../settings/settings.page'; import { TestPage } from './test.page'; import { EventsListPage } from '../events/list/list.page'; - -// @TODO: remove after fully developed -// import { TestPage } from '../../shared/testModules/pages/test/test.page'; -// import { TestPage } from '../../shared/testModules/pages/test/test.page'; - @Component({ templateUrl: 'tabs.html', providers: [] @@ -21,14 +12,10 @@ import { EventsListPage } from '../events/list/list.page'; export class TabsPage { // this tells the tabs component which Pages // should be each tab's root Page - tab0Root: any = TestPage; - tab1Root: any = HomePage; - tab2Root: any = ActivitiesListPage; - tab3Root: any = GalleryPage; - tab5Root: any = LevelsListPage; - tab6Root: any = TeamPage; - tab7Root: any = SettingsPage; - tab8Root: any = EventsListPage; - - constructor() {} + ranking: any = RankingsPage; + // ranking: any = TestPage; + dashboard: any = ActivitiesListPage; + settings: any = SettingsPage; + events: any = EventsListPage; + constructor(public translationService: TranslationService) {} } diff --git a/src/pages/term-condition/term-condition.html b/src/pages/term-condition/term-condition.html index 903e4f41..2b03340b 100644 --- a/src/pages/term-condition/term-condition.html +++ b/src/pages/term-condition/term-condition.html @@ -1,6 +1,6 @@ - Terms and Conditions + {{ 'TERMCONDITIONS.PAGETITLE' | translate }} @@ -10,14 +10,23 @@ - + - I agree + {{ 'TERMCONDITIONS.AGREE' | translate }} - - + + + + + diff --git a/src/pages/term-condition/term-condition.page.ts b/src/pages/term-condition/term-condition.page.ts index 4d9f7756..7487163d 100644 --- a/src/pages/term-condition/term-condition.page.ts +++ b/src/pages/term-condition/term-condition.page.ts @@ -1,53 +1,61 @@ import { Component, Input } from '@angular/core'; import { SafeResourceUrl } from '@angular/platform-browser'; import { NavController, AlertController } from 'ionic-angular'; -import { RegisterPage } from '../registration/register.page'; -import { TabsPage } from '../tabs/tabs.page'; +import { TranslationService } from '../../shared/translation/translation.service'; +import { loadingMessages, errMessages, generalVariableMessages } from '../../app/messages'; +// services import { AuthService } from '../../services/auth.service'; import { NotificationService } from '../../shared/notification/notification.service'; - +// pages +import { RegisterPage } from '../registration/register.page'; +import { TabsPage } from '../tabs/tabs.page'; @Component({ selector: 'term-condition', templateUrl: 'term-condition.html' }) - export class TermConditionPage { @Input('content') content?: SafeResourceUrl; @Input('user') user: any; - agreed:boolean = false; - + private checkAccessMethod: boolean = false; + // loading & error message variables + private helpEmailMessage = generalVariableMessages.helpMail.email; + private disagreeErrMessage = errMessages.TermConditions.disagreement.noAccepted; + private verifyFailedErrMessage = errMessages.TermConditions.verifyFailed.verifyfailed; + private checkAccessMethod: boolean = false; constructor( public nav: NavController, + private alertCtrl: AlertController, private authService: AuthService, private notificationService: NotificationService, - private alertCtrl: AlertController + public translationService: TranslationService, ) {} - + private accessMethod(){ + return (window.location.href.indexOf('?do=') > -1) ? this.checkAccessMethod = true : this.checkAccessMethod = false + } private displayError(errorMessage?: any): void { let alert = this.alertCtrl.create({ title: 'Invalid registration code', subTitle: errorMessage, buttons: [{ - text: 'OK' + text: 'Close' }] }); - alert.present(); } - + private backToSAccountPage() { + this.nav.popToRoot(); + } ionViewDidEnter() { console.log(this.user); } - agree(user): void { if (this.agreed === true) { this.nav.push(RegisterPage, user); } else { - this.notificationService.present('Agreement is required for further registration process.'); + this.notificationService.present(this.disagreeErrMessage); } } - /** * verify if params from url is allowed to proceed with registration */ @@ -60,30 +68,26 @@ export class TermConditionPage { console.log(res); }, err => { - this.notificationService.present('Something is wrong with the registration verification.'); + this.notificationService.present(this.verifyFailedErrMessage); }, () => { this.nav.push(TabsPage); } ); } - /** * toggle Read & confirm to proceed next registration page */ toggleAgree(): void { this.agreed = !this.agreed; } - navToRegister(): void { if (this.agreed === true) { console.log(this.nav.getViews()); } } - onTermError(err): void { - const supportEmail = 'help@support.com'; - + const supportEmail = this.helpEmailMessage; if ((err.data || {}).msg) { //@TODO: implement error handling console.log({title: "Unable to register", template: `Something went wrong, please contact ${supportEmail}.`}); @@ -99,7 +103,6 @@ export class TermConditionPage { }); } } - // temporary fix for direct signin signIn(): void { this.nav.push(TabsPage); diff --git a/src/pipes/keep-html.pipe.ts b/src/pipes/keep-html.pipe.ts new file mode 100644 index 00000000..2f218c8f --- /dev/null +++ b/src/pipes/keep-html.pipe.ts @@ -0,0 +1,12 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; + +@Pipe({ name: 'keepHtml', pure: false }) +export class EscapeHtmlPipe implements PipeTransform { + constructor(private sanitizer: DomSanitizer) { + } + + transform(content) { + return this.sanitizer.bypassSecurityTrustHtml(content); + } +} diff --git a/src/pipes/timeago.ts b/src/pipes/timeago.ts index 36d01728..fdb3ff78 100644 --- a/src/pipes/timeago.ts +++ b/src/pipes/timeago.ts @@ -1,12 +1,16 @@ import {Pipe, PipeTransform} from '@angular/core'; +import * as moment from 'moment'; @Pipe({ name: 'timeago' }) export class TimeAgoPipe implements PipeTransform { - transform(input: string, p_allowFuture?: any) : any { - if (input.length === 0) { + transform(input, p_allowFuture?: any) : any { + if (!input || input.length === 0) { return ''; } + // treat API date as UTC + input = moment.utc(input); + var substitute = function (timeStamp, num, strings) { // var string = angular.isFunction(timeStamp) ? timeStamp(num, dateDifference) : timeStamp; var string = timeStamp; diff --git a/src/pipes/ucfirst.pipe.ts b/src/pipes/ucfirst.pipe.ts new file mode 100644 index 00000000..dacbd74a --- /dev/null +++ b/src/pipes/ucfirst.pipe.ts @@ -0,0 +1,23 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'ucfirst' +}) +// replication of PHP native ucfirst() +export class UcfirstPipe implements PipeTransform { + transform(input: string): any { + let result = ''; + + // turn first letter of word into upper case + var capitalizeFirstLetter = function (string) { + return string.charAt(0).toUpperCase() + string.slice(1); + }; + + if (input) { + result = capitalizeFirstLetter(input); + } + + return result; + } +} + diff --git a/src/service-worker.js b/src/service-worker.js index 6679781a..86d395e0 100755 --- a/src/service-worker.js +++ b/src/service-worker.js @@ -14,6 +14,8 @@ self.toolbox.options.cache = { // pre-cache our key assets self.toolbox.precache( [ + './assets/js/filestack.js', + './assets/js/filestack-0.6.2.js', './build/main.js', './build/main.css', './build/polyfills.js', @@ -27,4 +29,4 @@ self.toolbox.router.any('/*', self.toolbox.cacheFirst); // for any other requests go to the network, cache, // and then only use that cached resource if your user goes offline -self.toolbox.router.default = self.toolbox.networkFirst; \ No newline at end of file +self.toolbox.router.default = self.toolbox.networkFirst; diff --git a/src/services/achievement.service.ts b/src/services/achievement.service.ts index 367ac810..9557d079 100755 --- a/src/services/achievement.service.ts +++ b/src/services/achievement.service.ts @@ -6,21 +6,61 @@ import { CacheService } from '../shared/cache/cache.service'; export class AchievementService { private target_id = this.cacheService.getLocalObject('program_id'); private target_model = 'program'; - private getMaximumPointsUrl = 'api/maximum_points.json?target_model=' + this.target_model + '&target_id=' + this.target_id; - private userAchievementUrl = 'api/user_achievements.json'; - private totalAchievementUrl = 'api/achievements.json'; - constructor(private request: RequestService, - private cacheService: CacheService) {} - // List Maximum Point Of Total Achievements + + constructor( + private request: RequestService, + private cacheService: CacheService + ) {} + + // List Maximum Point Of Total Achievements public getMaxPoints(){ - return this.request.get(this.getMaximumPointsUrl) + return this.request.get('api/maximum_points.json?target_model=' + this.target_model + '&target_id=' + this.target_id) } - // List User Achievements + + // List User Achievements public getAchievements(params = {}) { - return this.request.get(this.userAchievementUrl) + return this.request.get('api/user_achievements.json') } - // List All Achievements - public getAllAchievements() { - return this.request.get(this.totalAchievementUrl) + + // List All Achievements + public getAll() { + return this.request.get('api/achievements.json') + } + + /* + turn: + { + "Achievement": { + "id": 1, + "name": "test", + "description": "", + "badge": "https://www.filepicker.io/api/file/test", + "visibility": 1, + "condition": "AND", + "model": "Program", + "model_id": 4, + "is_default": false, + "scope": "individual", + "points": 100 + } + } + + into: + { + "id": 1, + "name": "test", + "description": "", + "badge": "https://www.filepicker.io/api/file/test", + "visibility": 1, + "condition": "AND", + "model": "Program", + "model_id": 1, + "is_default": false, + "scope": "individual", + "points": 100 + } + */ + public normalise(achievement) { + return achievement.Achievement; } } diff --git a/src/services/activity.service.ts b/src/services/activity.service.ts index 398d3797..5768c592 100755 --- a/src/services/activity.service.ts +++ b/src/services/activity.service.ts @@ -1,27 +1,54 @@ import { Injectable } from '@angular/core'; -import { Http, Headers, RequestOptions, URLSearchParams } from '@angular/http'; +import { URLSearchParams } from '@angular/http'; import * as moment from 'moment'; import * as _ from 'lodash'; // services import { CacheService } from '../shared/cache/cache.service'; import { RequestService } from '../shared/request/request.service'; +class ActivityBase { + id: number; + name: string; + description: string; +} + +class ReferenceAssessmentBase { + id: number; + name: string; +} + +class ReferenceBase { + context_id: number; + Assessment: ReferenceAssessmentBase +} + @Injectable() export class ActivityService { + private cachedActivites = {}; + public milestoneID = this.cacheService.getLocalObject('milestone_id'); - public activityAPIEndPoint = 'api/activities.json'; constructor( private request: RequestService, private cacheService: CacheService, - private http: Http ) {} - public getList() { - return this.request.get(this.activityAPIEndPoint, { + + public getList(options?) { + let mid = this.cacheService.getLocal('milestone_id'); + + options = options || { search: { milestone_id: this.cacheService.getLocal('milestone_id') } - }); + }; + + if (!this.cachedActivites[mid]) { + this.cachedActivites[mid] = this.request.get('api/activities.json', options); + return this.request.get('api/activities.json', options); + } + + return this.cachedActivites[mid]; } + public getLevels = (options?: any) => { let params: URLSearchParams = new URLSearchParams(); if (options.search) { @@ -40,11 +67,16 @@ export class ActivityService { params.set('project_id', data.user.project_id); options.search = params; } - return this.request.get(this.activityAPIEndPoint, options) - .toPromise(); + return this.getList(options).toPromise(); }); } - normalise(activity, index) { + + /* + // commented out - seems not using in any part of the code + // it was built for currentActivities component in HomePage, + // no longer using it now + + normalise(activity, index) { // session activity.enabledRSVP = true; // survey @@ -63,9 +95,283 @@ export class ActivityService { // if sorting is not available, use index instead activity.order = activity.Activity.order || index; return activity; + }*/ + + + /** + * normalise activities + */ + public normaliseActivities(activities): Array { + let result = []; + + activities.forEach((act, index) => { + result[index] = this.normaliseActivity(act); + }); + return result; } - // another way of get activity data list - public getActivities(){ - return this.request.get(this.activityAPIEndPoint); + + /** + * normalise single activity object + */ + public normaliseActivity(activity) { + let thisActivity = activity.Activity, + normalisedActivity: ActivityBase, + sequence = this.mergeReferenceToSequence(activity); + + activity = _.merge(thisActivity, { + activity: activity.Activity, + sequence: sequence, + assessment: this.extractAssessment(sequence), + Activity: activity.Activity, + ActivitySequence: activity.ActivitySequence, + References: activity.References + }); + + if (activity.Activity) { + normalisedActivity = { + id: activity.Activity.id, + name: activity.Activity.name, + description: activity.Activity.description + } + } + + // Not all the API return activity data in capital-case + if (activity.activity) { + normalisedActivity = { + id: activity.activity.id, + name: activity.activity.name, + description: activity.activity.description + } + } + + activity.Activity = normalisedActivity; + + // Normalise activity reference + activity.References.forEach((reference, idx) => { + let referenceAssessment: ReferenceAssessmentBase = { + id: reference.Assessment.id, + name: reference.Assessment.name, + } + let normalisedReference: ReferenceBase = { + context_id: reference.context_id, + Assessment: referenceAssessment + }; + activity.References[idx] = normalisedReference; + }); + + return activity; + } + + /* + turns: + [ + { + "context_id": 25, + "Assessment": { + "id": 19, + "name": "Check-In Workshop 1" + } + }, + { + "context_id": 26, + "Assessment": { + "id": 20, + "name": "Check-In Workshop 2" + } + }, + ... + ] + + into: + { + 19: 25, + 20: 26 + } + */ + public rebuildReferences(references) { + let result = {}; + (references || []).forEach(ref => { + result[ref.Assessment.id] = ref.context_id; + }); + return result; + } + + /* + @name mergeReferenceToSequence + + turns: + [ + { + "id": 52, + "activity_id": 22, + "model": "Assess.Assessment", + "model_id": 19, + "order": 0, + "is_locked": false, + "Assess.Assessment": { + "id": 19, + "name": "Check-In Workshop 1", + "description": "Check in to your first workshop here
", + "assessment_type": "checkin", + "is_live": true, + "is_team": false, + "score_type": "numeric", + "experience_id": 2, + "program_id": 4, + "deleted": false, + "deleted_date": null, + "comparison_group_size": 3, + "comparison_group_points": 10, + "review_period": 72, + "review_scope": "assessment", + "review_scope_id": null, + "created": "2016-02-01 04:45:21.573033", + "modified": "2016-10-25 23:54:22", + "review_instructions": null, + "is_repeatable": false, + "num_reviews": null, + "review_type": null, + "review_role": null, + "auto_assign_reviewers": null, + "parent_id": null, + "auto_publish_reviews": false + } + } + ] + + into: + { + "19": { + "id": 52, + "activity_id": 22, + "model": "Assess.Assessment", + "model_id": 19, + "order": 0, + "is_locked": false, + "Assess.Assessment": { + "id": 19, + "name": "Check-In Workshop 1", + "description": "Check in to your first workshop here
", + "assessment_type": "checkin", + "is_live": true, + "is_team": false, + "score_type": "numeric", + "experience_id": 2, + "program_id": 4, + "deleted": false, + "deleted_date": null, + "comparison_group_size": 3, + "comparison_group_points": 10, + "review_period": 72, + "review_scope": "assessment", + "review_scope_id": null, + "created": "2016-02-01 04:45:21.573033", + "modified": "2016-10-25 23:54:22", + "review_instructions": null, + "is_repeatable": false, + "num_reviews": null, + "review_type": null, + "review_role": null, + "auto_assign_reviewers": null, + "parent_id": null, + "auto_publish_reviews": false + }, + "context_id": 25 + } + } + */ + private mergeReferenceToSequence(activity) { + let refs = this.rebuildReferences(activity.References); + + // @NOTE: first "[0]" sequence is the assessment of an activity + let sequence = activity.ActivitySequence[0] || {}; + + if (!_.isEmpty(sequence)) { + // activity.ActivitySequence.forEach(seq => { + let modelId = sequence.model_id; + sequence.context_id = refs[modelId]; + // }); + } + return sequence; + } + + /* + turns: + { + "id": 52, + "activity_id": 22, + "model": "Assess.Assessment", + "model_id": 19, + "order": 0, + "is_locked": false, + "Assess.Assessment": { + "id": 19, + "name": "Check-In Workshop 1", + "description": "Check in to your first workshop here
", + "assessment_type": "checkin", + "is_live": true, + "is_team": false, + "score_type": "numeric", + "experience_id": 2, + "program_id": 4, + "deleted": false, + "deleted_date": null, + "comparison_group_size": 3, + "comparison_group_points": 10, + "review_period": 72, + "review_scope": "assessment", + "review_scope_id": null, + "created": "2016-02-01 04:45:21.573033", + "modified": "2016-10-25 23:54:22", + "review_instructions": null, + "is_repeatable": false, + "num_reviews": null, + "review_type": null, + "review_role": null, + "auto_assign_reviewers": null, + "parent_id": null, + "auto_publish_reviews": false + }, + "context_id": 25 + } + + into: + { + "id": 19, + "context_id": 25, + "name": "Check-In Workshop 1", + "description": "Check in to your first workshop here
", + "assessment_type": "checkin", + "is_live": true, + "is_team": false, + "score_type": "numeric", + "experience_id": 2, + "program_id": 4, + "deleted": false, + "deleted_date": null, + "comparison_group_size": 3, + "comparison_group_points": 10, + "review_period": 72, + "review_scope": "assessment", + "review_scope_id": null, + "created": "2016-02-01 04:45:21.573033", + "modified": "2016-10-25 23:54:22", + "review_instructions": null, + "is_repeatable": false, + "num_reviews": null, + "review_type": null, + "review_role": null, + "auto_assign_reviewers": null, + "parent_id": null, + "auto_publish_reviews": false + } + */ + private extractAssessment(sequence) { + let assessment: any = {}; + if (sequence['Assess.Assessment']) { + assessment = sequence['Assess.Assessment']; + assessment.context_id = sequence.context_id; + } + return assessment; } } diff --git a/src/services/assessment.service.ts b/src/services/assessment.service.ts index b0582e97..a8f7900c 100755 --- a/src/services/assessment.service.ts +++ b/src/services/assessment.service.ts @@ -1,13 +1,382 @@ import { Injectable } from '@angular/core'; import { RequestService } from '../shared/request/request.service'; +import * as _ from 'lodash'; + +class Assessment { + id: number; + context_id: number; + in_progress?: Boolean; +} + +class Answer { + assessment_question_id: number; + answer: String | Object | Array; + choices?: Array; +} + +export class ChoiceBase { + id: number; + value?: number; // or choice id, usually same as "id" above + name: string; + description?: string; + explanation?: string; + order?: number; + weight?: number; +} + +export class QuestionBase { + id: number; + question_id: number; + group_id: number; + assessment_id: number; + name: string; + type: string; + file_type?: string; + audience: Array; + choices?: ChoiceBase[]; + answer?: any; + required?: boolean; + order?: string | number; + + constructor(id, assessment_id, name, type) { + this.id = id; + this.assessment_id = assessment_id; + this.name = name; + this.type = type; + } +} + +export class Submission { + Assessment: Assessment; + AssessmentSubmission?: any; + AssessmentSubmissionAnswer: Object; +} + @Injectable() export class AssessmentService { constructor(private request: RequestService) {} + /** + * @description check feedback can show + * @type {boolen} + */ + public isPublished(submissions: any):boolean { + let published = false; + _.forEach(submissions, (submission) => { + _.forEach(submission, (subm) => { + if ( + subm.AssessmentSubmission && + subm.AssessmentSubmission.status === 'published' + ) { + published = true; + } + }); + }); + return published; + } + // listAll() - public getAll(options? : any) { + public getAll(options?: any) { return this.request.get('api/assessments.json', options); } + /** + * get question's details + * example: + * - for multiple-type question, checkbox data is not available in + * ActivitySequences (from get_activities API) and get_assessments API + * - checkbox values (selected checkbox ids are required for post_assessments API) which + * they are only available in this get_export_assessments api + * + * @param {any} options [description] + */ + public getQuestion(options?: any) { + return this.request.get('api/export_assessments.json', options); + } + + public post(assessmentAnswer: Submission) { + return this.request.post('api/assessment_submissions.json', assessmentAnswer, { + 'Content-Type': 'application/json' + }); + } + + /** + * save progress using "post" function AssessmentService.post() + * @param {Object} assessmentAnswer + */ + public save(assessmentAnswer) { + assessmentAnswer.Assessment.in_progress = true; // force in_progress + + return this.post(assessmentAnswer); + } + + /** + * submit using "post" function AssessmentService.post() + * @param {Object} assessmentAnswer + */ + public submit(assessmentAnswer) { + return this.post(assessmentAnswer); + } + + /* + Turn API format from: + { + "Assessment": { + "id": 29, + "name": "Check-in 1", + "description": "Needs a description...", + "assessment_type": "checkin", + "is_team": false, + "is_repeatable": false + }, + "AssessmentGroup": [ + { + "id": 28, + "name": "Group 1", + "description": "", + "order": 1, + "assessment_id": 29, + "AssessmentGroupQuestion": [ + { + "assessment_question_id": 100, + "order": null, + "id": 100, + "assessment_group_id": 28, + "AssessmentQuestion": { + "id": 100, + "name": "Selfie", + "description": "", + "question_type": "file", + "file_type": "image", + "is_required": false, + "audience": "[\"reviewer\",\"submitter\"]", + "AssessmentQuestionChoice": [] + } + }, + ... + ] + } + ] + } + + Into: + { + "id": 29, + "name": "Check-in 1", + "description": "Needs a description...", + "assessment_type": "checkin", + "is_team": false, + "is_repeatable": false + "groups": { + "id": 28, + "name": "Group 1", + "description": "", + "order": 1, + "assessment_id": 29, + "questions": [ + { + "id": 100, + "assessment_question_id": 100, + "assessment_group_id": 28, + "name": "Selfie", + "description": "", + "question_type": "file", + "file_type": "image", + "is_required": false, + "audience": "[\"reviewer\",\"submitter\"]", + "AssessmentQuestionChoice": [] + "order": null, + }, + ... + ] + } + } + */ + public normalise(assessment) { + let result = assessment.Assessment; + let thisGroups = assessment.AssessmentGroup; + + thisGroups = thisGroups.map(group => { + return this.normaliseGroup(group); + }); + + return { + id: result.id, + name: result.name, + description: result.description, + assessment_type: result.assessment_type, + is_team: result.is_team, + is_repeatable: result.is_repeatable, + AssessmentGroup: thisGroups + }; + } + + /* + turn "AssessmentGroup" object format from: + { + "id": 28, + "name": "Group 1", + "description": "", + "order": 1, + "assessment_id": 29, + "AssessmentGroupQuestion": [ + { + "assessment_question_id": 100, + "order": null, + "id": 100, + "assessment_group_id": 28, + "AssessmentQuestion": { + "id": 100, + "name": "Selfie", + "description": "", + "question_type": "file", + "file_type": "image", + "is_required": false, + "audience": "[\"reviewer\",\"submitter\"]", + "questions": [] + } + }, + ... + ] + } + + into format: + { + id: group.id, + name: group.name, + description: group.description, + assessment_id: group.assessment_id, + order: group.order + questions: [ + { + "id": 100, + "assessment_group_id": 28, + "assessment_question_id": 100, + "name": "Selfie", + "description": "", + "question_type": "file", + "file_type": "image", + "is_required": false, + "audience": "[\"reviewer\",\"submitter\"]", + "choices": [] + "order": null, + }, + ... + ], + } + */ + public normaliseGroup(group) { + // let result = group; + let thisQuestions = group.AssessmentGroupQuestion; + thisQuestions = thisQuestions.map(question => { + return this.normaliseQuestion(question); + }); + + return { + id: group.id, + assessment_id: group.assessment_id, + name: group.name, + description: group.description, + questions: thisQuestions, + order: group.order, + } + } + + /* + turn "AssessmentGroupQuestion" array format from: + { + "assessment_question_id": 100, + "order": null, + "id": 100, + "assessment_group_id": 28, + "AssessmentQuestion": { + "id": 100, + "name": "Selfie", + "description": "", + "question_type": "file", + "file_type": "image", + "is_required": false, + "audience": "[\"reviewer\",\"submitter\"]", + "questions": [] + } + } + + into: + { + "id": 100, + "assessment_group_id": 28, + "assessment_question_id": 100, + "name": "Selfie", + "description": "", + "question_type": "file", + "file_type": "image", + "is_required": false, + "audience": "[\"reviewer\",\"submitter\"]", + "choices": [] + "order": null, + } + */ + public normaliseQuestion(question): QuestionBase { + let thisQuestion = question.AssessmentQuestion; + let choices = thisQuestion.AssessmentQuestionChoice; + + choices = choices.map(choice => { + return this.normaliseChoice(choice); + }); + + return { + id: question.id, + assessment_id: question.assessment_question_id, + question_id: question.assessment_question_id, + group_id: question.assessment_group_id, + name: thisQuestion.name, + type: thisQuestion.question_type, + audience: thisQuestion.audience, + file_type: thisQuestion.file_type, + required: thisQuestion.is_required, + choices: choices, + order: question.order, + answer: thisQuestion.answer + }; + } + + /* + turn "AssessmentQuestionChoice" array format from: + { + "id": 275, + "assessment_question_id": 104, + "assessment_choice_id": 275, + "order": 1, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 275, + "name": "New Choice 1", + "description": "bad" + } + } + + into: + { + "id": 275, + "value": 275, // or choice id, usually same as "id" above + "name": "New Choice 1", + "description": "bad", + "explanation": null, + "order": 1, + "weight": "1", + } + */ + public normaliseChoice(choice): ChoiceBase { + return { + id: choice.id, // same as assessment_choice_id & AssessmentChoice.id & id + value: choice.assessment_choice_id, // or choice.id (similar id used as "assessment_choice_id") + name: choice.AssessmentChoice.name, + description: choice.AssessmentChoice.description, + explanation: choice.explanation, + order: choice.order, + weight: choice.weight + }; + } } diff --git a/src/services/auth.service.ts b/src/services/auth.service.ts index a2017169..a199b420 100755 --- a/src/services/auth.service.ts +++ b/src/services/auth.service.ts @@ -1,92 +1,90 @@ import { Injectable } from '@angular/core'; import { RequestService } from '../shared/request/request.service'; -import { URLSearchParams } from '@angular/http'; +import { Http, Headers, URLSearchParams, RequestOptions } from '@angular/http'; @Injectable() export class AuthService { - httpHeaderStrObj = { 'Content-Type': 'application/x-www-form-urlencoded'}; - - constructor(private request: RequestService) {} - + private appkey: any = this.request.getAppkey(); + private prefixUrl: any = this.request.getPrefixUrl(); + private AUTH_ENDPOINT: any = this.prefixUrl + 'api/auths.json?action='; + public headerData() { + let headers = new Headers(); + headers.append('Content-Type', 'application/x-www-form-urlencoded'); + headers.append('appkey', this.appkey); + return headers; + } + constructor(private request: RequestService, + private http: Http) {} getTerms() { - return this.request.get('api/registration_details.json'); + let options = new RequestOptions({headers: this.headerData()}); + return this.http.get(this.prefixUrl+'api/registration_details.json', options) + .map(res => res.json()); } - - /** - * verify url's parameters has the valid email and key (registration code) - * @param {object} data object with key and email in it - */ verifyRegistration(data) { - return this.request.post('api/auths.json?action=verify_registration', { - 'email': data.email, - 'key': data.key - }); + let options = new RequestOptions({headers: this.headerData()}); + let urlSearchParams = new URLSearchParams([ + `email=${data.email}`, + `key=${data.key}` + ].join('&')); + return this.http.post(this.AUTH_ENDPOINT+'verify_registration', urlSearchParams.toString(), options) + .map(res => res.json()); } - register(data) { + let options = new RequestOptions({headers: this.headerData()}); let urlSearchParams = new URLSearchParams([ `password=${data.password}`, `user_id=${data.user_id}`, `key=${data.key || 'thisissamplekey'}` ].join('&')); - - return this.request.post('api/auth.json?action=registration', data); + return this.http.post(this.AUTH_ENDPOINT+'registration', urlSearchParams.toString(), options) + .map(res => res.json()); } - loginAuth(email, password) { + let options = new RequestOptions({headers: this.headerData()}); let urlSearchParams = new URLSearchParams([ `data[User][email]=${email}`, `data[User][password]=${password}` ].join('&')); - - return this.request.post( - 'api/auths.json?action=authentication', - urlSearchParams.toString(), - this.httpHeaderStrObj); + return this.http.post(this.AUTH_ENDPOINT+'authentication', urlSearchParams.toString(), options) + .map(res => res.json()); } - forgotPassword(email){ + let options = new RequestOptions({headers: this.headerData()}); let urlSearchParams = new URLSearchParams(); urlSearchParams.append('email', email); - return this.request.post( - 'api/auths.json?action=forgot_password', - urlSearchParams.toString(), - this.httpHeaderStrObj); + return this.http.post(this.AUTH_ENDPOINT+'forgot_password', urlSearchParams.toString(), options) + .map(res => res.json()); } - verifyUserKeyEmail(key, email){ + let options = new RequestOptions({headers: this.headerData()}); let urlSearchParams = new URLSearchParams([ `key=${key}`, `email=${email}` ].join('&')); - return this.request.post( - 'api/auths.json?action=verify_reset_password', - urlSearchParams.toString(), - this.httpHeaderStrObj); + return this.http.post(this.AUTH_ENDPOINT+'verify_reset_password', urlSearchParams.toString(), options) + .map(res => res.json()); } resetUserPassword(key, email, password, verify_password) { + let options = new RequestOptions({headers: this.headerData()}); let urlSearchParams = new URLSearchParams([ `key=${key}`, `email=${email}`, `password=${password}`, `verify_password=${verify_password}` ].join('&')); - return this.request.post( - 'api/auths.json?action=reset_password', - urlSearchParams.toString(), - this.httpHeaderStrObj); + return this.http.post(this.AUTH_ENDPOINT+'reset_password', urlSearchParams.toString(), options) + .map(res => res.json()); } magicLinkLogin(auth_token){ + let options = new RequestOptions({headers: this.headerData()}); let urlSearchParams = new URLSearchParams(); urlSearchParams.append('auth_token', auth_token); - return this.request.post( - 'api/auths.json?', - urlSearchParams.toString(), - this.httpHeaderStrObj); - } - isAuthenticated() { - return true; + return this.http.post(this.prefixUrl+'api/auths.json?', urlSearchParams.toString(), options) + .map(res => res.json()); } getUser() { return this.request.get('api/users.json'); } -} + isAuthenticated() { + return true; + } +} \ No newline at end of file diff --git a/src/services/character.service.ts b/src/services/character.service.ts new file mode 100644 index 00000000..ec182efd --- /dev/null +++ b/src/services/character.service.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@angular/core'; + +// services +import { CacheService } from '../shared/cache/cache.service'; +import { RequestService } from '../shared/request/request.service'; +@Injectable() +export class CharacterService { + public charactersAPIEndpoint: any = 'api/characters.json'; + + constructor( + public cache: CacheService, + public request: RequestService + ) {} + + getCharacter() { + return this.request.get(this.charactersAPIEndpoint, { + search: { + game_id: this.cache.getLocalObject('game_id') + } + }); + } + + postCharacter(data) { + return this.request.post(this.charactersAPIEndpoint, data, { + 'Content-Type': 'application/json' + }); + } +} diff --git a/src/services/game.service.ts b/src/services/game.service.ts new file mode 100644 index 00000000..d94b00d3 --- /dev/null +++ b/src/services/game.service.ts @@ -0,0 +1,40 @@ +import { Injectable } from '@angular/core'; +import { RequestService } from '../shared/request/request.service'; + +import * as _ from 'lodash'; + +@Injectable() +export class GameService { + private gamesTarget = 'api/games'; + private charactersTarget = 'api/characters'; + + constructor( + private request: RequestService + ) {} + // get games + public getGames(options = {}) { + return this.request.get(this.gamesTarget, options); + } + + public getCharacters(gameId, options = {}) { + options = _.merge({ + search: { + game_id: gameId + } + }, options); + return this.request.get(this.charactersTarget, options); + } + + public getRanking(gameId, characterId = null) { + return this.getCharacters(gameId, { + search: { + action: 'ranking', + character_id: characterId + } + }); + } + // get game items + public getGameItems(character_id) { + return this.request.get(`api/items.json?character_id=${character_id}&filter=items_all`); + } +} diff --git a/src/services/ranking.service.ts b/src/services/ranking.service.ts new file mode 100644 index 00000000..fd2f1250 --- /dev/null +++ b/src/services/ranking.service.ts @@ -0,0 +1,15 @@ +// DEPRECATED +import { Injectable } from '@angular/core'; +import { RequestService } from '../shared/request/request.service'; +// services +import { CacheService } from '../shared/cache/cache.service'; +@Injectable() +export class RankingService { + private rankingListAPIEndpoint = `api/characters_statistics.json`; + constructor(private request: RequestService, + private cacheService: CacheService) {} + // List Total Users Rankings + public getRankings(){ + return this.request.get(this.rankingListAPIEndpoint); + } +} diff --git a/src/services/submission.service.ts b/src/services/submission.service.ts index 1aed3364..726f018a 100755 --- a/src/services/submission.service.ts +++ b/src/services/submission.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { RequestService } from '../shared/request/request.service'; import * as _ from 'lodash'; +import * as moment from 'moment'; @Injectable() export class SubmissionService { @@ -10,9 +11,8 @@ export class SubmissionService { constructor(private request: RequestService) {} // list() - public getSubmissions(options? : any) { - return this.request.get(this.targetUrl) - .map(response => response.json()) + public getSubmissions(options?: any) { + return this.request.get(this.targetUrl, options); } public extractPhotos(data) { @@ -36,5 +36,206 @@ export class SubmissionService { return photos; } +/* + Turns: + { + "AssessmentSubmission": { + "id": 4, + "submitter_id": 19, + "created": "2017-07-18 03:28:09", + "modified": "2017-07-18 03:28:09", + "status": "done", + "assessment_id": 28, + "order": null, + "submitted": "2017-07-18 03:28:12", + "team_id": null, + "program_id": 4, + "activity_id": 23, + "score": null, + "moderated_score": "0", + "publish_date": null, + "review_score": "0", + "timeline_id": 5, + "context_id": 26 + }, + "Assessment": { + "id": 28, + "name": "Job Smart Initial Survey", + "description": "This survey is a self-assessment of your employability skills. Be honest with yourself and leave room to improve. In the end of the program, you will be asked the same questions at the end of the program. Please take 5 minutes to reflect on your current state.
", + "assessment_type": "survey", + "is_live": true, + "is_team": false, + "score_type": "numeric", + "experience_id": 2, + "program_id": 4, + "deleted": false, + "deleted_date": null, + "comparison_group_size": 3, + "comparison_group_points": 10, + "review_period": 72, + "review_scope": "assessment", + "review_scope_id": null, + "created": "2016-02-01 04:45:21.573033", + "modified": "2016-10-25 23:59:47", + "review_instructions": null, + "is_repeatable": false, + "num_reviews": null, + "review_type": null, + "review_role": null, + "visibility": { + "guest": false, + "participant": true, + "mentor": true, + "coordinator": true, + "admin": false, + "team": false, + "sysadmin": false + }, + "auto_assign_reviewers": null, + "parent_id": null, + "auto_publish_reviews": false + }, + "AssessmentSubmissionAnswer": [ + { + "id": 10, + "assessment_submission_id": 4, + "comment": null, + "assessment_question_id": 92, + "answer": 235, + "score": "0" + }, + { + "id": 11, + "assessment_submission_id": 4, + "comment": null, + "assessment_question_id": 93, + "answer": 240, + "score": "0" + }, + { + "id": 12, + "assessment_submission_id": 4, + "comment": null, + "assessment_question_id": 94, + "answer": 245, + "score": "0" + }, + { + "id": 13, + "assessment_submission_id": 4, + "comment": null, + "assessment_question_id": 95, + "answer": 250, + "score": "0" + }, + { + "id": 14, + "assessment_submission_id": 4, + "comment": null, + "assessment_question_id": 96, + "answer": 255, + "score": "0" + }, + { + "id": 15, + "assessment_submission_id": 4, + "comment": null, + "assessment_question_id": 97, + "answer": 260, + "score": "0" + }, + { + "id": 16, + "assessment_submission_id": 4, + "comment": null, + "assessment_question_id": 98, + "answer": 265, + "score": "0" + }, + { + "id": 17, + "assessment_submission_id": 4, + "comment": null, + "assessment_question_id": 99, + "answer": 270, + "score": "0" + } + ], + "AssessmentReviewAnswer": [] + } + + into: + { + + } + */ + public normalise(respond) { + let submission = respond['AssessmentSubmission']; + let assessment = respond['Assessment']; + let answer = respond['AssessmentSubmissionAnswer']; + let review = respond['AssessmentReviewAnswer']; + + // preprocess date + submission.created = moment.utc(submission.created); + submission.modified = moment.utc(submission.modified); + + // submitted + if (submission.submitted) { + submission.submitted = moment.utc(submission.submitted); + } + + return _.merge(submission, { + assessment, + answer, + review + }); + } + + /** + * get assessment answer (submission) + * @param {array} respond API respond from get_submissions + */ + public getAnswer(respond, activityId?: number) { + let answer = this.normalise(respond).answer; + return answer; + } + /** + * get review (feedback from moderator) + */ + public getReview(review) { + return review; + } + + /** + * extract reference IDs and prepare Observables to retrieve submissions + * @param {array} references References array responded with get_activities() api + */ + public getSubmissionsByReferences(references) { + let tasks = []; // multiple API requests + + // get_submissions API to retrieve submitted answer + let getSubmissions = (contextId) => { + return this.getSubmissions({ + search: { + context_id: contextId + } + }); + }; + + // Congregation of get_submissions API Observable with different context_id + _.forEach(references, reference => { + if (reference.context_id) { + return tasks.push(getSubmissions(reference.context_id)); + } + }); + + return tasks; + } + + // get user submissions data + // @TODO Remove it later + public getSubmissionsData() { + return this.getSubmissions() + } } diff --git a/src/shared/cache/cache.service.ts b/src/shared/cache/cache.service.ts index b3e14867..ea3557fc 100755 --- a/src/shared/cache/cache.service.ts +++ b/src/shared/cache/cache.service.ts @@ -5,11 +5,6 @@ import { Cache } from '../app/cache'; import * as _ from 'lodash'; - -export class LocalStorage { -} - - @Injectable() export class CacheService { diff --git a/src/shared/filestack/file-preview.directive.ts b/src/shared/filestack/file-preview.directive.ts index 3644d6a6..c9422198 100755 --- a/src/shared/filestack/file-preview.directive.ts +++ b/src/shared/filestack/file-preview.directive.ts @@ -7,8 +7,6 @@ import { WindowRef } from '../window'; export class FilestackPreviewDirective implements OnChanges { @Input('filestack-preview') url: string; - /*
*/ - constructor( private el: ElementRef, private renderer: Renderer, diff --git a/src/shared/filestack/filestack.service.ts b/src/shared/filestack/filestack.service.ts index 138a4870..bc7c87b9 100755 --- a/src/shared/filestack/filestack.service.ts +++ b/src/shared/filestack/filestack.service.ts @@ -3,6 +3,11 @@ import { Injectable, Optional } from '@angular/core'; declare var filestack: any; declare var filepicker: any; +export class FilestackUpload { + filesFailed: Array; + filesUploaded: Array; +} + @Injectable() export class FilestackConfig { apikey = null; @@ -19,11 +24,26 @@ export class FilestackService { this.filepicker = filepicker; this.filepicker.setKey(config.apikey); - console.log(this.filestack); } - pick(file): Promise { - return this.filestack.pick(file); + /** + * display pick/upload popup for file upload, + * refer to filestack documentation for more config information + * @link https://www.filestack.com/docs/javascript-api/pick-v3 + * @param {object} config filestack object + * @return {Promise} single resolved object + */ + pick(config?): Promise { + if (!config) { + config = { + maxFiles: 5, // default by max 5 files + storeTo: { + location: 's3' + } + }; + } + + return this.filestack.pick(config); } pickV1(file, onSuccess, onError?, onProgress?) { diff --git a/src/shared/request/request.service.ts b/src/shared/request/request.service.ts index 32dc0ec3..f341f3dc 100755 --- a/src/shared/request/request.service.ts +++ b/src/shared/request/request.service.ts @@ -90,13 +90,6 @@ export class RequestService { headers.set('timelineID', timelineId); } - // Inject milestoneID from cached - let milestoneId = this.cacheService.getCached('milestone_id') || - this.cacheService.getLocalObject('milestone_id'); - if (milestoneId) { - headers.set('milestoneID', milestoneId); - } - // Inject appKey from config if (!_.isUndefined(this.appkey)) { headers.set('appkey', this.appkey); diff --git a/src/shared/testModules/pages/test/test-start.page.ts b/src/shared/testModules/pages/test/test-start.page.ts index a8cfdc38..d7b0fba7 100755 --- a/src/shared/testModules/pages/test/test-start.page.ts +++ b/src/shared/testModules/pages/test/test-start.page.ts @@ -3,19 +3,965 @@ import { NavController } from 'ionic-angular'; // pages import { AchievementsViewPage } from '../../../../pages/achievements/view/achievements-view.page'; -import { ActivitiesListPage } from '../../../../pages/activities/list/list.page'; +import { AssessmentsGroupPage } from '../../../../pages/assessments/group/assessments-group.page'; +import { ActivitiesClassicListPage } from '../../../../pages/activities-classic/list/activities-classic-list.page'; import { EventsListPage } from '../../../../pages/events/list/list.page'; import { EventsDownloadPage } from '../../../../pages/events/download/events-download.page'; import { GalleryPage } from '../../../../pages/gallery/gallery'; -import { HomePage } from '../../../../pages/home/home'; import { LevelsListPage } from '../../../../pages/levels/list/list'; import { LoginPage } from '../../../../pages/login/login'; import { RegistrationPage } from '../../../../pages/registration/registration.page'; -import { SessionListPage } from '../sessions/list/list.page'; import { SettingsPage } from '../../../../pages/settings/settings.page'; +import { EventCheckinPage } from '../../../../pages/events/checkin/event-checkin.page'; import { TeamPage } from '../../../../pages/team/team'; const PAGES = [ + { + name: 'Check-in', + page: EventCheckinPage, + params: { + event: { + "id": 132, + "activity_id": 35, + "start": "2017-04-01 08:15:00", + "end": "2018-03-16 09:15:00", + "location": "location", + "title": "Year long", + "description": "Test", + "capacity": 40, + "remaining_capacity_percentage": 95, + "remaining_capacity": 38, + "isBooked": true, + "files": [], + "References": [ + { + "context_id": 44, + "Assessment": { + "id": 37, + "name": "Event Assessment 1", + "context_id": 44 + } + } + ], + "isAttended": false, + "startDisplay": "Saturday, Apr 1 at 4:15 PM", + "activity": { + "id": 35, + "milestone_id": 9, + "name": "Test Event", + "description": "", + "lead_image": null, + "video_url": "", + "order": null, + "instructions": "", + "is_locked": false, + "start": "2016-10-22 13:00:01", + "end": "2019-07-18 13:59:59", + "deadline": "2019-07-18 13:59:59", + "activity": { + "id": 35, + "milestone_id": 9, + "name": "Test Event", + "description": "", + "lead_image": null, + "video_url": "", + "order": null, + "instructions": "", + "is_locked": false, + "start": "2016-10-22 13:00:01", + "end": "2019-07-18 13:59:59", + "deadline": "2019-07-18 13:59:59" + }, + "sequence": { + "id": 77, + "activity_id": 35, + "model": "Assess.Assessment", + "model_id": 37, + "order": 0, + "is_locked": false, + "Assess.Assessment": { + "id": 37, + "name": "Event Assessment 1", + "description": "Needs a description...", + "assessment_type": "checkin", + "is_live": true, + "is_team": false, + "score_type": "numeric", + "experience_id": 2, + "program_id": 4, + "deleted": false, + "deleted_date": null, + "comparison_group_size": 3, + "comparison_group_points": 10, + "review_period": 72, + "review_scope": "team", + "review_scope_id": null, + "created": "2016-06-23 06:07:39.681326", + "modified": "2017-07-25 16:20:27", + "review_instructions": null, + "is_repeatable": false, + "num_reviews": 1, + "review_type": "single", + "review_role": "mentor", + "auto_assign_reviewers": null, + "parent_id": null, + "auto_publish_reviews": false, + "context_id": 43 + }, + "context_id": 43 + }, + "assessment": { + "id": 37, + "name": "Event Assessment 1", + "description": "Needs a description...", + "assessment_type": "checkin", + "is_live": true, + "is_team": false, + "score_type": "numeric", + "experience_id": 2, + "program_id": 4, + "deleted": false, + "deleted_date": null, + "comparison_group_size": 3, + "comparison_group_points": 10, + "review_period": 72, + "review_scope": "team", + "review_scope_id": null, + "created": "2016-06-23 06:07:39.681326", + "modified": "2017-07-25 16:20:27", + "review_instructions": null, + "is_repeatable": false, + "num_reviews": 1, + "review_type": "single", + "review_role": "mentor", + "auto_assign_reviewers": null, + "parent_id": null, + "auto_publish_reviews": false, + "context_id": 43 + }, + "Activity": { + "id": 35, + "milestone_id": 9, + "name": "Test Event", + "description": "", + "lead_image": null, + "video_url": "", + "order": null, + "instructions": "", + "is_locked": false, + "start": "2016-10-22 13:00:01", + "end": "2019-07-18 13:59:59", + "deadline": "2019-07-18 13:59:59", + "activity": { + "id": 35, + "milestone_id": 9, + "name": "Test Event", + "description": "", + "lead_image": null, + "video_url": "", + "order": null, + "instructions": "", + "is_locked": false, + "start": "2016-10-22 13:00:01", + "end": "2019-07-18 13:59:59", + "deadline": "2019-07-18 13:59:59" + }, + "sequence": { + "id": 77, + "activity_id": 35, + "model": "Assess.Assessment", + "model_id": 37, + "order": 0, + "is_locked": false, + "Assess.Assessment": { + "id": 37, + "name": "Event Assessment 1", + "description": "Needs a description...", + "assessment_type": "checkin", + "is_live": true, + "is_team": false, + "score_type": "numeric", + "experience_id": 2, + "program_id": 4, + "deleted": false, + "deleted_date": null, + "comparison_group_size": 3, + "comparison_group_points": 10, + "review_period": 72, + "review_scope": "team", + "review_scope_id": null, + "created": "2016-06-23 06:07:39.681326", + "modified": "2017-07-25 16:20:27", + "review_instructions": null, + "is_repeatable": false, + "num_reviews": 1, + "review_type": "single", + "review_role": "mentor", + "auto_assign_reviewers": null, + "parent_id": null, + "auto_publish_reviews": false, + "context_id": 43 + }, + "context_id": 43 + }, + "assessment": { + "id": 37, + "name": "Event Assessment 1", + "description": "Needs a description...", + "assessment_type": "checkin", + "is_live": true, + "is_team": false, + "score_type": "numeric", + "experience_id": 2, + "program_id": 4, + "deleted": false, + "deleted_date": null, + "comparison_group_size": 3, + "comparison_group_points": 10, + "review_period": 72, + "review_scope": "team", + "review_scope_id": null, + "created": "2016-06-23 06:07:39.681326", + "modified": "2017-07-25 16:20:27", + "review_instructions": null, + "is_repeatable": false, + "num_reviews": 1, + "review_type": "single", + "review_role": "mentor", + "auto_assign_reviewers": null, + "parent_id": null, + "auto_publish_reviews": false, + "context_id": 43 + } + }, + "ActivitySequence": [ + { + "id": 77, + "activity_id": 35, + "model": "Assess.Assessment", + "model_id": 37, + "order": 0, + "is_locked": false, + "Assess.Assessment": { + "id": 37, + "name": "Event Assessment 1", + "description": "Needs a description...", + "assessment_type": "checkin", + "is_live": true, + "is_team": false, + "score_type": "numeric", + "experience_id": 2, + "program_id": 4, + "deleted": false, + "deleted_date": null, + "comparison_group_size": 3, + "comparison_group_points": 10, + "review_period": 72, + "review_scope": "team", + "review_scope_id": null, + "created": "2016-06-23 06:07:39.681326", + "modified": "2017-07-25 16:20:27", + "review_instructions": null, + "is_repeatable": false, + "num_reviews": 1, + "review_type": "single", + "review_role": "mentor", + "auto_assign_reviewers": null, + "parent_id": null, + "auto_publish_reviews": false, + "context_id": 43 + }, + "context_id": 43 + } + ], + "References": [ + { + "context_id": 43, + "Assessment": { + "id": 37, + "name": "Event Assessment 1" + } + } + ] + }, + "coverUrl": "/assets/img/static/event-cover-3.jpg", + "assessment": { + "id": 37, + "name": "Event Assessment 1", + "context_id": 44 + }, + "context_id": 44 + }, + submissions: [ + { + "id": 20, + "submitter_id": 20, + "created": "2017-07-28 03:05:36", + "modified": "2017-07-28 03:05:38", + "status": "in progress", + "assessment_id": 37, + "order": null, + "submitted": null, + "team_id": null, + "program_id": 4, + "activity_id": 132, + "score": null, + "moderated_score": "0", + "publish_date": null, + "review_score": "0", + "timeline_id": 5, + "context_id": 44, + "assessment": { + "id": 37, + "name": "Event Assessment 1", + "description": "Needs a description...", + "assessment_type": "checkin", + "is_live": true, + "is_team": false, + "score_type": "numeric", + "experience_id": 2, + "program_id": 4, + "deleted": false, + "deleted_date": null, + "comparison_group_size": 3, + "comparison_group_points": 10, + "review_period": 72, + "review_scope": "team", + "review_scope_id": null, + "created": "2016-06-23 06:07:39.681326", + "modified": "2017-07-25 16:20:27", + "review_instructions": null, + "is_repeatable": false, + "num_reviews": 1, + "review_type": "single", + "review_role": "mentor", + "visibility": { + "guest": false, + "participant": true, + "mentor": true, + "coordinator": true, + "admin": false, + "team": false, + "sysadmin": false + }, + "auto_assign_reviewers": null, + "parent_id": null, + "auto_publish_reviews": false + }, + "answer": [ + { + "id": 75, + "assessment_submission_id": 20, + "comment": null, + "assessment_question_id": 129, + "answer": 284, + "score": "0" + }, + { + "id": 76, + "assessment_submission_id": 20, + "comment": null, + "assessment_question_id": 132, + "answer": { + "filename": "stuckhere.png", + "handle": "iALqct8jRSuKhVs3NB8C", + "mimetype": "image/png", + "originalPath": "stuckhere.png", + "size": 195280, + "source": "local_file_system", + "url": "https://cdn.filestackcontent.com/iALqct8jRSuKhVs3NB8C", + "status": "Stored", + "icon": "fa-image", + "key": "iALqct8jRSuKhVs3NB8C" + }, + "score": "0" + } + ], + "review": [] + } + ] + } + }, + { + name: 'Multiple Choice Questions', + page: AssessmentsGroupPage, + params: { + assessmentGroup: { + AssessmentGroupQuestion: [ + { + "id": 140, + "assessment_group_id": 42, + "assessment_question_id": 140, + "order": null, + "AssessmentQuestion": { + "id": 140, + "assessment_id": 37, + "name": "1st Multitple Question", + "description": "", + "hint": "", + "score": "1", + "question_type": "multiple", + "has_comment": false, + "is_required": true, + "audience": "[\"reviewer\",\"submitter\"]", + "answer": null, + "file_type": null, + "AssessmentQuestionChoice": [ + { + "id": 283, + "assessment_question_id": 140, + "assessment_choice_id": 283, + "order": 1, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 283, + "name": "New Choice 1", + "description": "" + } + }, + { + "id": 284, + "assessment_question_id": 140, + "assessment_choice_id": 284, + "order": 2, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 284, + "name": "New Choice 2", + "description": "" + } + }, + { + "id": 285, + "assessment_question_id": 140, + "assessment_choice_id": 285, + "order": 3, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 285, + "name": "New Choice 3", + "description": "" + } + } + ] + } + }, + { + "id": 141, + "assessment_group_id": 42, + "assessment_question_id": 141, + "order": null, + "AssessmentQuestion": { + "id": 141, + "assessment_id": 37, + "name": "2nd Multi Question", + "description": "", + "hint": "", + "score": "1", + "question_type": "multiple", + "has_comment": false, + "is_required": true, + "audience": "[\"reviewer\",\"submitter\"]", + "answer": null, + "file_type": null, + "AssessmentQuestionChoice": [ + { + "id": 286, + "assessment_question_id": 141, + "assessment_choice_id": 286, + "order": 1, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 286, + "name": "One of the first", + "description": "" + } + }, + { + "id": 287, + "assessment_question_id": 141, + "assessment_choice_id": 287, + "order": 2, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 287, + "name": "2nd ", + "description": "" + } + }, + { + "id": 288, + "assessment_question_id": 141, + "assessment_choice_id": 288, + "order": 3, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 288, + "name": "3rd Choice", + "description": "" + } + }, + { + "id": 289, + "assessment_question_id": 141, + "assessment_choice_id": 289, + "order": 4, + "weight": "0", + "explanation": null, + "AssessmentChoice": { + "id": 289, + "name": "Select me too!", + "description": "" + } + } + ] + } + } + + ] + }, + assessment: { + "Assessment": { + "id": 37, + "name": "Multiple Option Question", + "description": "Needs a description...", + "assessment_type": "quiz", + "is_live": false, + "is_team": false, + "score_type": "numeric", + "experience_id": 2, + "program_id": 5, + "deleted": false, + "deleted_date": null, + "comparison_group_size": 3, + "comparison_group_points": 10, + "review_period": 72, + "review_scope": "team", + "review_scope_id": null, + "created": "2016-06-23 06:07:39.681326", + "modified": "2016-06-23 06:07:39.681326", + "review_instructions": null, + "is_repeatable": false, + "num_reviews": 1, + "review_type": "single", + "review_role": "mentor", + "visibility": { + "guest": false, + "participant": true, + "mentor": true, + "coordinator": true, + "admin": false, + "team": false, + "sysadmin": false + }, + "auto_assign_reviewers": null, + "parent_id": null, + "auto_publish_reviews": false + }, + "AssessmentQuestion": [ + { + "name": "1st Multitple Question", + "question_type": "multiple", + "file_type": null, + "audience": "[\"reviewer\",\"submitter\"]", + "id": 140, + "assessment_id": 37 + }, + { + "name": "2nd Multi Question", + "question_type": "multiple", + "file_type": null, + "audience": "[\"reviewer\",\"submitter\"]", + "id": 141, + "assessment_id": 37, + "AssessmentQuestionChoice": [ + { + "id": 286, + "assessment_question_id": 141, + "assessment_choice_id": 286, + "order": 1, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 286, + "name": "One of the first", + "description": "" + } + }, + { + "id": 287, + "assessment_question_id": 141, + "assessment_choice_id": 287, + "order": 2, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 287, + "name": "2nd ", + "description": "" + } + }, + { + "id": 288, + "assessment_question_id": 141, + "assessment_choice_id": 288, + "order": 3, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 288, + "name": "3rd Choice", + "description": "" + } + }, + { + "id": 289, + "assessment_question_id": 141, + "assessment_choice_id": 289, + "order": 4, + "weight": "0", + "explanation": null, + "AssessmentChoice": { + "id": 289, + "name": "Select me too!", + "description": "" + } + } + ] + } + ], + "AssessmentGroup": [ + { + "id": 42, + "assessment_id": 37, + "name": "1st Group", + "description": "", + "order": 1, + "review_instructions": "", + "restart_numbering": false, + "AssessmentGroupQuestion": [ + { + "id": 140, + "assessment_group_id": 42, + "assessment_question_id": 140, + "order": null, + "AssessmentQuestion": { + "id": 140, + "assessment_id": 37, + "name": "1st Multitple Question", + "description": "", + "hint": "", + "score": "1", + "question_type": "multiple", + "has_comment": false, + "is_required": true, + "audience": "[\"reviewer\",\"submitter\"]", + "answer": null, + "file_type": null, + "AssessmentQuestionChoice": [ + { + "id": 283, + "assessment_question_id": 140, + "assessment_choice_id": 283, + "order": 1, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 283, + "name": "New Choice 1", + "description": "" + } + }, + { + "id": 284, + "assessment_question_id": 140, + "assessment_choice_id": 284, + "order": 2, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 284, + "name": "New Choice 2", + "description": "" + } + }, + { + "id": 285, + "assessment_question_id": 140, + "assessment_choice_id": 285, + "order": 3, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 285, + "name": "New Choice 3", + "description": "" + } + } + ] + } + }, + { + "id": 141, + "assessment_group_id": 42, + "assessment_question_id": 141, + "order": null, + "AssessmentQuestion": { + "id": 141, + "assessment_id": 37, + "name": "2nd Multi Question", + "description": "", + "hint": "", + "score": "1", + "question_type": "multiple", + "has_comment": false, + "is_required": true, + "audience": "[\"reviewer\",\"submitter\"]", + "answer": null, + "file_type": null, + "AssessmentQuestionChoice": [ + { + "id": 286, + "assessment_question_id": 141, + "assessment_choice_id": 286, + "order": 1, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 286, + "name": "One of the first", + "description": "" + } + }, + { + "id": 287, + "assessment_question_id": 141, + "assessment_choice_id": 287, + "order": 2, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 287, + "name": "2nd ", + "description": "" + } + }, + { + "id": 288, + "assessment_question_id": 141, + "assessment_choice_id": 288, + "order": 3, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 288, + "name": "3rd Choice", + "description": "" + } + }, + { + "id": 289, + "assessment_question_id": 141, + "assessment_choice_id": 289, + "order": 4, + "weight": "0", + "explanation": null, + "AssessmentChoice": { + "id": 289, + "name": "Select me too!", + "description": "" + } + } + ] + } + } + ] + } + ], + + } + } + }, + { + name: 'Assorted Assessments Questions', + page: AssessmentsGroupPage, + params: { + assessmentGroup: { + AssessmentGroupQuestion: [ + { + AssessmentQuestion: { + id: 4, + question_type: 'file', + audience: "[\"reviewer\",\"submitter\"]", + file_type: 'image', + AssessmentQuestionChoice: [], + answers: { + submitter: [], + reviewer: [], + }, + name: 'TASK: What was actually required of me in that situation?', + is_required: true + } + }, + { + AssessmentQuestion: { + id: 5, + question_type: 'multiple', + audience: "[\"reviewer\",\"submitter\"]", + file_type: null, + AssessmentQuestionChoice: [ + { + "id": 1, + "assessment_question_id": 5, + "assessment_choice_id": 1, + "order": 1, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 1, + "name": "Test 1", + "description": "" + } + }, + { + "id": 2, + "assessment_question_id": 5, + "assessment_choice_id": 2, + "order": 2, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 2, + "name": "Test 2", + "description": "" + } + }, + { + "id": 3, + "assessment_question_id": 5, + "assessment_choice_id": 3, + "order": 3, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 3, + "name": "Test 3", + "description": "" + } + } + ], + answers: { + submitter: [], + reviewer: [], + }, + name: 'Multiple: 3 choices Questions', + is_required: true + } + }, + + { + AssessmentQuestion: { + + id: 1, + question_type: 'oneof', + audience: "[\"reviewer\",\"submitter\"]", + file_type: null, + AssessmentQuestionChoice: [ + { + "id": 1, + "assessment_question_id": 5, + "assessment_choice_id": 1, + "order": 1, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 1, + "name": "Test 1", + "description": "" + } + }, + { + "id": 2, + "assessment_question_id": 5, + "assessment_choice_id": 2, + "order": 2, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 2, + "name": "Test 2", + "description": "" + } + }, + { + "id": 3, + "assessment_question_id": 5, + "assessment_choice_id": 3, + "order": 3, + "weight": "1", + "explanation": null, + "AssessmentChoice": { + "id": 3, + "name": "Test 3", + "description": "" + } + } + ], + answers: { + submitter: [], + reviewer: [], + }, + name: 'SITUATION: The context in which this experience took place', + is_required: true + } + }, + { + AssessmentQuestion: { + id: 2, + question_type: 'text', + audience: "[\"reviewer\",\"submitter\"]", + file_type: null, + AssessmentQuestionChoice: [], + answers: { + submitter: [], + reviewer: [], + }, + name: 'TASK: What was actually required of me in that situation?', + is_required: true + } + }, + { + AssessmentQuestion: { + id: 3, + question_type: 'text', + audience: "[\"reviewer\",\"submitter\"]", + file_type: null, + AssessmentQuestionChoice: [], + answers: { + submitter: [], + reviewer: [], + }, + name: 'ACTION: What did I do given the situation and the task?', + is_required: true + } + } + ] + }, + assessment: { + Assessment: { + id:'temporary_fake_id' + }, + AssessmentGroupQuestion: [] + + } + } + }, { name: 'Events', page: EventsListPage @@ -24,10 +970,6 @@ const PAGES = [ name: 'Events Download', page: EventsDownloadPage }, - { - name: 'Home Page', - page: HomePage - }, { name: 'Registration', page: RegistrationPage @@ -42,7 +984,7 @@ const PAGES = [ }, { name: 'Activities', - page: ActivitiesListPage + page: ActivitiesClassicListPage }, { name: 'Levels', @@ -59,7 +1001,7 @@ const PAGES = [ { name: 'Achievement View', page: AchievementsViewPage - }, + } ]; @Component({ @@ -72,12 +1014,13 @@ export class TestStartPage { testPage; constructor(public nav: NavController) { - console.log('??', AchievementsViewPage); + // console.log('ActivitiesClassicListPage', ActivitiesClassicListPage) + // console.log('??', ActivitiesClassicListPage); } goTo(nav) { this.testPage = nav.page; - this.nav.push(nav.page); + this.nav.push(nav.page, nav.params || null); } } diff --git a/src/shared/translation/translation.module.ts b/src/shared/translation/translation.module.ts new file mode 100644 index 00000000..add7eed1 --- /dev/null +++ b/src/shared/translation/translation.module.ts @@ -0,0 +1,6 @@ +import { NgModule } from '@angular/core'; +import { TranslationService } from './translation.service'; +@NgModule({ + providers: [ TranslationService ] +}) +export class TranslationModule {} \ No newline at end of file diff --git a/src/shared/translation/translation.service.ts b/src/shared/translation/translation.service.ts new file mode 100644 index 00000000..634046a6 --- /dev/null +++ b/src/shared/translation/translation.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { i18nEN } from './assets/i18n-en'; +import { i18nCN } from './assets/i18n-cn'; +@Injectable() +export class TranslationService { + constructor(public translate: TranslateService,){ + translate.addLangs(["en", "cn"]); + translate.setDefaultLang("en"); + translate.use("en"); + } + isTranslated(checkStatus){ + return checkStatus == true ? this.translate.use("cn") : this.translate.use("en") + } +} \ No newline at end of file diff --git a/src/shared/utils/utils.module.ts b/src/shared/utils/utils.module.ts new file mode 100644 index 00000000..779d588f --- /dev/null +++ b/src/shared/utils/utils.module.ts @@ -0,0 +1,10 @@ +import { NgModule } from '@angular/core'; +import { UtilsService } from './utils.service'; + +@NgModule({ + providers: [UtilsService] +}) + +export class UtilsModule { + +} diff --git a/src/shared/utils/utils.service.ts b/src/shared/utils/utils.service.ts new file mode 100644 index 00000000..9d1fe2c8 --- /dev/null +++ b/src/shared/utils/utils.service.ts @@ -0,0 +1,65 @@ +import { Injectable } from '@angular/core'; + +const zipMime = [ + 'application/x-compressed', + 'application/x-zip-compressed', + 'application/zip', + 'multipart/x-zip', +]; + +@Injectable() +export class UtilsService { + + getIcon(mimetype: string) { + let result: string = ''; + + if (zipMime.indexOf(mimetype) >= 0) { + result = 'fa-zip'; + + // set icon to different document type (excel, word, powerpoint, audio, video) + } else if (mimetype.indexOf('audio/') >= 0) { + result = 'fa-sound'; + } else if (mimetype.indexOf('image/') >= 0) { + result = 'fa-image'; + } else if (mimetype.indexOf('text/') >= 0) { + result = 'fa-text'; + } else if (mimetype.indexOf('video/') >= 0) { + result = 'fa-movie'; + } else { + switch (mimetype) { + case 'application/pdf': + result = 'fa-pdf'; + break; + case 'application/msword': + case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': + result = 'fa-word'; + break; + case 'application/excel': + case 'application/vnd.ms-excel': + case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': + case 'application/x-excel': + case 'application/x-msexcel': + result = 'fa-excel'; + break; + case 'application/mspowerpoint': + case 'application/vnd.ms-powerpoint': + case 'application/vnd.openxmlformats-officedocument.presentationml.presentation': + case 'application/x-mspowerpoint': + result = 'fa-powerpoint'; + break; + default: + result = 'fa-file'; + break; + } + } + + return result; + } + + isCompressed(type: string) { + if (zipMime.indexOf(type) >= 0) { + return true; + } + return false; + } +} diff --git a/src/theme/practera.theme.default.scss b/src/theme/practera.theme.default.scss index 6e7d0ff3..ca69c57a 100755 --- a/src/theme/practera.theme.default.scss +++ b/src/theme/practera.theme.default.scss @@ -17,6 +17,9 @@ $font-secondary: 'Raleway'; background-color: color($colors, primary, base); color: color($colors, secondary, base); } +.flex-display { + display: flex; +} // 4. General Text styling .app-title { font-family: $font-primary; @@ -32,6 +35,9 @@ $font-secondary: 'Raleway'; font-family: $font-primary; font-size: 1.3rem; } +.error-message { + padding: 6px; +} .line-break { word-break: break-word; } @@ -39,6 +45,13 @@ $font-secondary: 'Raleway'; .general-button { background-color: color($colors, button, base); } +.close { + font-size: 2.7rem; + float: right; + background-color: transparent; + color: color($colors, secondary, base); + display: inline-block; +} // 6. General Pages Styling // 6.1 Default Theme Settings Start .toolbar.toolbar-md, @@ -87,10 +100,7 @@ $font-secondary: 'Raleway'; .toolbar-title-ios { color: color($colors, secondary, base); } - .toolbar-title-md { - font-size: 1.7rem; - padding-top: 3px; - } + .toolbar-title-md, .toolbar-title-ios { font-size: 1.7rem; } @@ -144,6 +154,24 @@ $font-secondary: 'Raleway'; .close-btn { @include closeBtn; } + // general logo + .general-logo { + max-width: 80%; + } + // general form + .general-form { + width: 100%; + ion-item { + padding: 0px; + .item-inner { + border-bottom: 1px solid color($colors, border, base) !important; + } + } + .general-circle-btn { + background: none; + padding-top: 20pt; + } + } } // 7.2 login form box styling (shared module: part 2) .login-container { @@ -395,7 +423,7 @@ event { height: 40%; font-size: 28pt; font-weight: bold; - + } } } @@ -439,7 +467,7 @@ event { } } } -// achievement page styling +// 10. Achievement page styling .ahievements-popup { .scroll-content { overflow: hidden !important; @@ -461,6 +489,234 @@ event { } } } +.assessments-items-popup { + display: flex; + align-items: center; + padding-left: 12pt; + .item-popup-img { + width: 20pt; + height: 20pt; + } + .item-popup-text { + padding-left: 4pt; + } +} +// 13. Rankings Page Styling +.rankings { + .scroll-content { + bottom: 49px !important; + } + ion-list:first-child { + margin-bottom: 5px; + } +} +tutorial-page { + .header-md::after, + .tabs-md[tabsPlacement="top"] > .tabbar::after, .footer-md::before, + .tabs-md[tabsPlacement="bottom"] > .tabbar::before { + background-image: none; + } +} +.tutorial-slides { + h1 { + padding-bottom: 20pt; + } + p { + padding: 0 36pt; + margin-top: -12pt; + } + img { + width: 36%; + } + button.general-circle-btn { + width: 80%; + margin: 0 auto; + } + .ranking-item { + width: 100%; + display: flex; + .blur-hidden-text { + color: transparent; + text-shadow: rgba(0, 0, 0, 0.5) 0px 0px 6px; + } + ion-icon { + font-size: 10pt; + font-weight: 900; + } + ion-icon[name=arrow-forward] { + font-weight: normal; + font-size: 18pt; + padding-left: 8pt; + color: #bbb; + } + .badge-image { + width: 60px; + height: 60px; + } + p { + display: flex; + align-items: center; + word-break: break-all; + margin: 0px; + padding: 15px 0pt; + border-bottom: 1px solid color($colors, border, base); + } + p:first-child{ + border: none; + display: flex; + align-items: center; + justify-content: center; + } + } +} +.skip-button { + border: none; + float: right; +} +.slides-button { + .toolbar-background { + background-color: color($colors, secondary, base); + border: none; + } + .next-button, + .skip-button { + float: right; + } + .prev-button, + .next-button, + .skip-button { + background-color: color($colors, secondary, base) !important; + color: color($colors, primary, base); + box-shadow: none; + } +} +// 14.leaderboard settings page styling +.leaderboard-settings { + .hide-settings { + padding: 0; + margin: 0; + display: flex; + align-items: center; + } +} +// 15. items popup general styling +.items-popup { + .scroll-content { + overflow-y: hidden; + } + .items-popup-data { + height: 100%; + display: flex; + justify-content: center; + align-items: center; + .tutorial-slides p { + margin-top: 12pt; + } + .tutorial-slides img { + width: 50%; + } + .tutorial-slides .swiper-pagination { + bottom: 0px; + } + .general-circle-btn { + width: 100%; + margin-top: 12pt; + padding: 12pt; + background-color: color($colors, primary, base); + color: color($colors, secondary, base); + } + } +} +// 11. Settings & Tutorial page stylings +.settings { + .list-header-md { + border: none; + } +} +tutorial-page { + .header-md::after, + .tabs-md[tabsPlacement="top"] > .tabbar::after, .footer-md::before, + .tabs-md[tabsPlacement="bottom"] > .tabbar::before { + background-image: none; + } +} +.tutorial-slides { + h1 { + padding-bottom: 20pt; + } + p { + padding: 0 36pt; + margin-top: -12pt; + } + img { + width: 36%; + } + button.general-circle-btn { + width: 80%; + margin: 0 auto; + } + .swiper-pagination { + bottom: 16pt; + } +} +.skip-button { + border: none; + float: right; +} +.slides-button { + .toolbar-background { + background-color: color($colors, secondary, base); + border: none; + } + .next-button, + .skip-button { + float: right; + } + .prev-button, + .next-button, + .skip-button { + background-color: color($colors, secondary, base) !important; + color: color($colors, primary, base); + box-shadow: none; + } +} +// 14.leaderboard settings page styling +.leaderboard-settings { + .hide-settings { + padding: 0; + margin: 0; + display: flex; + align-items: center; + } +} +// 15. items popup general styling +.items-popup { + .scroll-content { + overflow-y: hidden; + } + .items-popup-data { + height: 100%; + display: flex; + justify-content: center; + align-items: center; + .tutorial-slides p { + margin-top: 12pt; + } + .tutorial-slides img { + width: 50%; + } + .tutorial-slides .swiper-pagination { + bottom: 0px; + } + .general-circle-btn { + width: 100%; + margin-top: 12pt; + padding: 12pt; + background-color: color($colors, primary, base); + color: color($colors, secondary, base); + } + } +} // landscape activity list view @media screen and (min-width: 500px) { .score-board { @@ -479,4 +735,3 @@ event { } } } - diff --git a/src/theme/utils.scss b/src/theme/utils.scss index 755c2d67..64e1d2f9 100644 --- a/src/theme/utils.scss +++ b/src/theme/utils.scss @@ -8,12 +8,30 @@ } /* Utilities */ +// colours +.red { color: red; } +.strong { font-weight: bolder; } +.muted { + opacity: 0.5; +} + +.hr { + padding-top: 16px; + margin-bottom: 13px; + min-height: 4.5rem; + border-top: 1px solid #dedede; +} + .title-wrap { overflow: inherit; text-overflow: none; white-space: pre-wrap; } +.uppercase { + text-transform: uppercase; +} + .inset { &-header { font-weight: 500; diff --git a/src/theme/variables.scss b/src/theme/variables.scss index a5b6d624..968ea46e 100644 --- a/src/theme/variables.scss +++ b/src/theme/variables.scss @@ -16,7 +16,8 @@ $item-wp-detail-push-show: true; // http://ionicframework.com/docs/v2/theming/overriding-ionic-variables/ // General Colors (Shared File) -$primary: #22c7fa; +// main colors +$primary: #ebebeb; // #E60028 $secondary: #ffffff; $danger: #f53d3d; $light: #f4f4f4; @@ -80,8 +81,15 @@ $colors: ( base: $soft-green, contrast: darken($soft-green, 10%) // darken for contrast? ), + purple: ( + base: #a94aa9, + contrast: $secondary + ) ); +$item-md-detail-push-color: color($colors, primary-light, base); +$item-wp-detail-push-color: color($colors, primary-light, base); +$item-ios-detail-push-color: color($colors, primary-light, base); // App iOS Variables // -------------------------------------------------- @@ -127,4 +135,3 @@ $colors: ( // @import "roboto"; // @import "noto-sans"; - diff --git a/www/service-worker.js b/www/service-worker.js index 6679781a..86d395e0 100755 --- a/www/service-worker.js +++ b/www/service-worker.js @@ -14,6 +14,8 @@ self.toolbox.options.cache = { // pre-cache our key assets self.toolbox.precache( [ + './assets/js/filestack.js', + './assets/js/filestack-0.6.2.js', './build/main.js', './build/main.css', './build/polyfills.js', @@ -27,4 +29,4 @@ self.toolbox.router.any('/*', self.toolbox.cacheFirst); // for any other requests go to the network, cache, // and then only use that cached resource if your user goes offline -self.toolbox.router.default = self.toolbox.networkFirst; \ No newline at end of file +self.toolbox.router.default = self.toolbox.networkFirst; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..47dc3624 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,5286 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@angular/common@4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-4.1.3.tgz#e7c4791e32131cf74c239428c2a67daab2eef017" + +"@angular/compiler-cli@4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-4.1.3.tgz#c2362ffdf65756471481f839fab675bcac213f96" + dependencies: + "@angular/tsc-wrapped" "4.1.3" + minimist "^1.2.0" + reflect-metadata "^0.1.2" + +"@angular/compiler@4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-4.1.3.tgz#d2dd30853b0cf4a54758b4a314632c231f9c94c3" + +"@angular/core@4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-4.1.3.tgz#285498eb86ab7d0b6f982f8f9f487ef610013b35" + +"@angular/forms@4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-4.1.3.tgz#380ab4c3af84c5d1d748c2a7d04151c7dc8e4982" + +"@angular/http@4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@angular/http/-/http-4.1.3.tgz#eb9d1c302a0172815f9a573310d9be0bdeb845ae" + +"@angular/platform-browser-dynamic@4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.1.3.tgz#3c13fdcf591d487f6efdc1d46913f280c6d8c2ec" + +"@angular/platform-browser@4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-4.1.3.tgz#4fa1db5119dd178b315ddae5b329bee1a932a5bd" + +"@angular/tsc-wrapped@4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@angular/tsc-wrapped/-/tsc-wrapped-4.1.3.tgz#2d6372c9187bf1621eacd960b94b39c4f95293cd" + dependencies: + tsickle "^0.21.0" + +"@ionic/app-scripts@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@ionic/app-scripts/-/app-scripts-2.0.0.tgz#cb1057c966849d6e6ea837209ebb4ff6fb065f27" + dependencies: + autoprefixer "7.1.1" + babili "0.1.2" + chalk "1.1.3" + chokidar "1.7.0" + clean-css "3.4.27" + cross-spawn "5.1.0" + express "4.15.3" + fs-extra "3.0.1" + glob "7.1.1" + json-loader "0.5.4" + magic-string "0.19.1" + node-sass "4.5.3" + os-name "2.0.1" + postcss "5.2.17" + proxy-middleware "0.15.0" + reflect-metadata "^0.1.10" + rollup "0.42.0" + rollup-plugin-commonjs "8.0.2" + rollup-plugin-json "2.3.0" + rollup-plugin-node-builtins "2.1.2" + rollup-plugin-node-globals "1.1.0" + rollup-plugin-node-resolve "3.0.0" + rollup-pluginutils "2.0.1" + tiny-lr "1.0.4" + tslint "^5.5.0" + tslint-eslint-rules "4.1.1" + uglify-js "^3.0.23" + webpack "^3.1.0" + ws "1.1.1" + xml2js "0.4.17" + +"@ionic/cli-plugin-ionic-angular@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@ionic/cli-plugin-ionic-angular/-/cli-plugin-ionic-angular-1.4.0.tgz#aa793121b2f0a271ea20e53c4f312aba299c0dfc" + dependencies: + "@ionic/cli-utils" "1.6.0" + chalk "^2.0.0" + tslib "^1.7.1" + +"@ionic/cli-utils@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@ionic/cli-utils/-/cli-utils-1.6.0.tgz#33909ec8bdbb086121aac6fcf5c2db951e204e7d" + dependencies: + archiver "^1.3.0" + chalk "^2.0.0" + ci-info "^1.0.0" + cross-spawn "^4.0.2" + dargs "^5.1.0" + dev-null "^0.1.1" + inquirer "^3.0.6" + leek "0.0.24" + lodash "^4.17.4" + minimist "^1.2.0" + ncp "^2.0.0" + semver "^5.3.0" + slice-ansi "^1.0.0" + string-width "^2.1.0" + strip-ansi "^4.0.0" + superagent "^3.5.2" + tslib "^1.7.1" + uuid "^3.0.1" + wrap-ansi "^2.1.0" + +"@ionic/cli-utils@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@ionic/cli-utils/-/cli-utils-1.7.0.tgz#05bdbf3e7533eeeee27d58f3adbfe26bf2bf0d1d" + dependencies: + archiver "^2.0.0" + chalk "^2.0.0" + ci-info "^1.0.0" + cross-spawn "^5.1.0" + dargs "^5.1.0" + dev-null "^0.1.1" + inquirer "^3.2.1" + leek "0.0.24" + lodash "^4.17.4" + minimist "^1.2.0" + ncp "^2.0.0" + semver "^5.4.1" + slice-ansi "^1.0.0" + string-width "^2.1.1" + strip-ansi "^4.0.0" + superagent "^3.5.2" + tslib "^1.7.1" + uuid "^3.0.1" + wrap-ansi "^3.0.1" + +"@ionic/storage@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@ionic/storage/-/storage-2.0.1.tgz#bb1a8c276007d008d7acdda426b56065b0fd3c0b" + dependencies: + "@types/localforage" "0.0.30" + localforage "~1.4.2" + localforage-cordovasqlitedriver "~1.5.0" + +"@ngx-translate/core@^7.0.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@ngx-translate/core/-/core-7.1.0.tgz#5087a65c8ff312e4244ca0646ed45cde83b170cd" + +"@ngx-translate/http-loader@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@ngx-translate/http-loader/-/http-loader-0.1.0.tgz#6029325561d7868fe325a419de2770e98ff1502e" + +"@types/jasmine@^2.5.47": + version "2.5.53" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.5.53.tgz#4e0cefad09df5ec48c8dd40433512f84b1568d61" + +"@types/localforage@0.0.30": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/localforage/-/localforage-0.0.30.tgz#3d60a6bf6dda38e3f8a469611598379f1f649509" + +"@types/node@^6.0.46": + version "6.0.85" + resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.85.tgz#ec02bfe54a61044f2be44f13b389c6a0e8ee05ae" + +"@types/node@^7.0.13": + version "7.0.39" + resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.39.tgz#8aced4196387038113f6f9aa4014ab4c51edab3c" + +"@types/q@^0.0.32": + version "0.0.32" + resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" + +"@types/selenium-webdriver@^2.53.35", "@types/selenium-webdriver@~2.53.39": + version "2.53.42" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-2.53.42.tgz#74cb77fb6052edaff2a8984ddafd88d419f25cac" + +abbrev@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + +abstract-leveldown@~0.12.0, abstract-leveldown@~0.12.1: + version "0.12.4" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz#29e18e632e60e4e221d5810247852a63d7b2e410" + dependencies: + xtend "~3.0.0" + +accepts@1.3.3, accepts@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +acorn-dynamic-import@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" + dependencies: + acorn "^4.0.3" + +acorn@^1.0.3: + version "1.2.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-1.2.2.tgz#c8ce27de0acc76d896d2b1fad3df588d9e82f014" + +acorn@^4.0.1, acorn@^4.0.3: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +acorn@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" + +adm-zip@0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.4.tgz#a61ed5ae6905c3aea58b3a657d25033091052736" + +adm-zip@^0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1" + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + +agent-base@2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7" + dependencies: + extend "~3.0.0" + semver "~5.0.1" + +ajv-keywords@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" + +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ajv@^5.1.5: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + json-schema-traverse "^0.3.0" + json-stable-stringify "^1.0.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +angular2-local-storage@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/angular2-local-storage/-/angular2-local-storage-0.2.0.tgz#bbe40be86d263518484f38c66db82f189ce1343b" + +angular2-moment@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/angular2-moment/-/angular2-moment-1.4.0.tgz#3d59c1ebc28934fcfe9b888ab461e261724987e8" + dependencies: + moment "^2.16.0" + +angular2-template-loader@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/angular2-template-loader/-/angular2-template-loader-0.6.2.tgz#c0d44e90fff0fac95e8b23f043acda7fd1c51d7c" + dependencies: + loader-utils "^0.2.15" + +ansi-escapes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +aproba@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + +archiver-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174" + dependencies: + glob "^7.0.0" + graceful-fs "^4.1.0" + lazystream "^1.0.0" + lodash "^4.8.0" + normalize-path "^2.0.0" + readable-stream "^2.0.0" + +archiver@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-1.3.0.tgz#4f2194d6d8f99df3f531e6881f14f15d55faaf22" + dependencies: + archiver-utils "^1.3.0" + async "^2.0.0" + buffer-crc32 "^0.2.1" + glob "^7.0.0" + lodash "^4.8.0" + readable-stream "^2.0.0" + tar-stream "^1.5.0" + walkdir "^0.0.11" + zip-stream "^1.1.0" + +archiver@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-2.0.0.tgz#ffb73ecccd8dd65b0019e1180f78092a053d43c4" + dependencies: + archiver-utils "^1.3.0" + async "^2.0.0" + buffer-crc32 "^0.2.1" + glob "^7.0.0" + lodash "^4.8.0" + readable-stream "^2.0.0" + tar-stream "^1.5.0" + walkdir "^0.0.11" + zip-stream "^1.2.0" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arraybuffer.slice@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1.js@^4.0.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +ast-types@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52" + +ast-types@0.9.6: + version "0.9.6" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + +async@^2.0.0, async@^2.1.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" + dependencies: + lodash "^4.14.0" + +async@~0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +autoprefixer@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.1.1.tgz#97bc854c7d0b979f8d6489de547a0d17fb307f6d" + dependencies: + browserslist "^2.1.3" + caniuse-lite "^1.0.30000670" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^6.0.1" + postcss-value-parser "^3.2.3" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-cli@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283" + dependencies: + babel-core "^6.24.1" + babel-polyfill "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.0.0" + glob "^7.0.0" + lodash "^4.2.0" + output-file-sync "^1.1.0" + path-is-absolute "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + v8flags "^2.0.10" + optionalDependencies: + chokidar "^1.6.1" + +babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-core@^6.24.1: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.25.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.25.0" + babel-traverse "^6.25.0" + babel-types "^6.25.0" + babylon "^6.17.2" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-generator@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.25.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-helper-evaluate-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.1.0.tgz#95d98c4ea36150483db2e7d3ec9e1954a72629cb" + +babel-helper-flip-expressions@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.1.2.tgz#77f6652f9de9c42401d827bd46ebd2109e3ef18a" + +babel-helper-is-nodes-equiv@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz#34e9b300b1479ddd98ec77ea0bbe9342dfe39684" + +babel-helper-is-void-0@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.1.1.tgz#72f21a3abba0bef3837f9174fca731aed9a02888" + +babel-helper-mark-eval-scopes@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.1.1.tgz#4554345edf9f2549427bd2098e530253f8af2992" + +babel-helper-remove-or-void@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.1.1.tgz#9d7e1856dc6fafcb41b283a416730dc1844f66d7" + +babel-helper-to-multiple-sequence-expressions@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.1.1.tgz#5f1b832b39e4acf954e9137f0251395c71196b35" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-minify-builtins@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.1.3.tgz#4f21a7dcb51f91a04ea71d47ff0e8e3b05fec021" + dependencies: + babel-helper-evaluate-path "^0.1.0" + +babel-plugin-minify-constant-folding@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.1.3.tgz#57bd172adf8b8d74ad7c99612eb950414ebea3ca" + dependencies: + babel-helper-evaluate-path "^0.1.0" + +babel-plugin-minify-dead-code-elimination@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.1.7.tgz#774f536f347b98393a27baa717872968813c342c" + dependencies: + babel-helper-mark-eval-scopes "^0.1.1" + babel-helper-remove-or-void "^0.1.1" + lodash.some "^4.6.0" + +babel-plugin-minify-flip-comparisons@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.1.2.tgz#e286b40b7599b18dfea195071e4279465cfc1884" + dependencies: + babel-helper-is-void-0 "^0.1.1" + +babel-plugin-minify-guarded-expressions@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.1.2.tgz#dfc3d473b0362d9605d3ce0ac1e22328c60d1007" + dependencies: + babel-helper-flip-expressions "^0.1.2" + +babel-plugin-minify-infinity@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.1.2.tgz#5f1cf67ddedcba13c8a00da832542df0091a1cd4" + +babel-plugin-minify-mangle-names@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.1.3.tgz#bfa24661a6794fb03833587e55828b65449e06fe" + dependencies: + babel-helper-mark-eval-scopes "^0.1.1" + +babel-plugin-minify-numeric-literals@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.1.1.tgz#d4b8b0c925f874714ee33ee4b26678583d7ce7fb" + +babel-plugin-minify-replace@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.1.2.tgz#b90b9e71ab4d3b36325629a91beabe13b0b16ac1" + +babel-plugin-minify-simplify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.1.2.tgz#a968f1658fdeb2fc759e81fe331d89829df0f6b9" + dependencies: + babel-helper-flip-expressions "^0.1.2" + babel-helper-is-nodes-equiv "^0.0.1" + babel-helper-to-multiple-sequence-expressions "^0.1.1" + +babel-plugin-minify-type-constructors@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.1.2.tgz#db53c5b76cb8e2fcd45d862f17104c78761337ee" + dependencies: + babel-helper-is-void-0 "^0.1.1" + +babel-plugin-transform-inline-consecutive-adds@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.1.2.tgz#5442e9f1c19c78a7899f8a4dee6fd481f61001f5" + +babel-plugin-transform-member-expression-literals@^6.8.4: + version "6.8.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.4.tgz#05679bc40596b91293401959aa1620ab1b2be437" + +babel-plugin-transform-merge-sibling-variables@^6.8.5: + version "6.8.5" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.5.tgz#03abdf107c61241913eb268ddede6d5bc541862c" + +babel-plugin-transform-minify-booleans@^6.8.2: + version "6.8.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.8.2.tgz#8451579f706e702c1e1ab2756de5c8ea369cf07c" + +babel-plugin-transform-property-literals@^6.8.4: + version "6.8.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.4.tgz#6ad311110b80a192a56efb5ddf4fe3ca6f7a61da" + dependencies: + esutils "^2.0.2" + +babel-plugin-transform-regexp-constructors@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.1.1.tgz#312ab7487cc88a1c62ee25ea1b6087e89b87799c" + +babel-plugin-transform-remove-console@^6.8.4: + version "6.8.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.4.tgz#41fddac19a729a4c3dd7ef2964eac07b096f9a8f" + +babel-plugin-transform-remove-debugger@^6.8.4: + version "6.8.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.4.tgz#f85704a08adaa71b55d77005b5b94e9b9df21f6e" + +babel-plugin-transform-remove-undefined@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.1.2.tgz#e1ebf51110f6b1e0665f28382ef73f95e5023652" + +babel-plugin-transform-simplify-comparison-operators@^6.8.4: + version "6.8.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.4.tgz#2aa24a262d664c8cb3e125a306c798d7a2de08d5" + +babel-plugin-transform-undefined-to-void@^6.8.2: + version "6.8.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.8.2.tgz#fe2b1d294eb05e87524eb93724dea6e2c3d66fa1" + +babel-polyfill@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-preset-babili@^0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/babel-preset-babili/-/babel-preset-babili-0.1.4.tgz#ad9d6651002f5bc3f07cab300781167f54724bf2" + dependencies: + babel-plugin-minify-builtins "^0.1.3" + babel-plugin-minify-constant-folding "^0.1.3" + babel-plugin-minify-dead-code-elimination "^0.1.7" + babel-plugin-minify-flip-comparisons "^0.1.2" + babel-plugin-minify-guarded-expressions "^0.1.2" + babel-plugin-minify-infinity "^0.1.2" + babel-plugin-minify-mangle-names "^0.1.3" + babel-plugin-minify-numeric-literals "^0.1.1" + babel-plugin-minify-replace "^0.1.2" + babel-plugin-minify-simplify "^0.1.2" + babel-plugin-minify-type-constructors "^0.1.2" + babel-plugin-transform-inline-consecutive-adds "^0.1.2" + babel-plugin-transform-member-expression-literals "^6.8.4" + babel-plugin-transform-merge-sibling-variables "^6.8.5" + babel-plugin-transform-minify-booleans "^6.8.2" + babel-plugin-transform-property-literals "^6.8.4" + babel-plugin-transform-regexp-constructors "^0.1.1" + babel-plugin-transform-remove-console "^6.8.4" + babel-plugin-transform-remove-debugger "^6.8.4" + babel-plugin-transform-remove-undefined "^0.1.2" + babel-plugin-transform-simplify-comparison-operators "^6.8.4" + babel-plugin-transform-undefined-to-void "^6.8.2" + lodash.isplainobject "^4.0.6" + +babel-register@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" + dependencies: + babel-core "^6.24.1" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@^6.22.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.25.0.tgz#33b98eaa5d482bb01a8d1aa6b437ad2b01aec41c" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.24.1, babel-template@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.25.0" + babel-types "^6.25.0" + babylon "^6.17.2" + lodash "^4.2.0" + +babel-traverse@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.25.0" + babylon "^6.17.2" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babili@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/babili/-/babili-0.1.2.tgz#77231b3977272394863936cb88bf7baf276f97f5" + dependencies: + babel-cli "^6.24.1" + babel-preset-babili "^0.1.2" + +babylon@^6.17.2: + version "6.17.4" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base62@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/base62/-/base62-0.1.1.tgz#7b4174c2f94449753b11c2651c083da841a7b084" + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + +base64-js@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" + +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + dependencies: + callsite "1.0.0" + +big.js@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" + +binary-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.9.0.tgz#66506c16ce6f4d6928a5b3cd6a33ca41e941e37b" + +bl@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" + dependencies: + readable-stream "^2.0.5" + +bl@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-0.8.2.tgz#c9b6bca08d1bc2ea00fc8afb4f1a5fd1e1c66e4e" + dependencies: + readable-stream "~1.0.26" + +blob@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +blocking-proxy@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-0.0.5.tgz#462905e0dcfbea970f41aa37223dda9c07b1912b" + dependencies: + minimist "^1.2.0" + +bluebird@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.7" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.7.tgz#ddb048e50d9482790094c13eb3fcfc833ce7ab46" + +body-parser@^1.16.1: + version "1.17.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee" + dependencies: + bytes "2.4.0" + content-type "~1.0.2" + debug "2.6.7" + depd "~1.1.0" + http-errors "~1.6.1" + iconv-lite "0.4.15" + on-finished "~2.3.0" + qs "6.4.0" + raw-body "~2.2.0" + type-is "~1.6.15" + +body@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" + dependencies: + continuable-cache "^0.3.1" + error "^7.0.0" + raw-body "~1.1.0" + safe-json-parse "~1.0.1" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^0.1.2: + version "0.1.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" + dependencies: + expand-range "^0.1.0" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + +browser-resolve@^1.11.0: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a" + dependencies: + buffer-xor "^1.0.2" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + inherits "^2.0.1" + +browserify-cipher@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + +browserify-fs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-fs/-/browserify-fs-1.0.0.tgz#f075aa8a729d4d1716d066620e386fcc1311a96f" + dependencies: + level-filesystem "^1.0.1" + level-js "^2.1.3" + levelup "^0.18.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" + dependencies: + pako "~0.2.0" + +browserslist@^2.1.3: + version "2.2.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.2.2.tgz#e9b4618b8a01c193f9786beea09f6fd10dbe31c3" + dependencies: + caniuse-lite "^1.0.30000704" + electron-to-chromium "^1.3.16" + +buffer-crc32@^0.2.1: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + +buffer-es6@^4.9.1, buffer-es6@^4.9.2: + version "4.9.3" + resolved "https://registry.yarnpkg.com/buffer-es6/-/buffer-es6-4.9.3.tgz#f26347b82df76fd37e18bcb5288c4970cfd5c404" + +buffer-xor@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^1.0.0, builtin-modules@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + +bytes@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +caniuse-lite@^1.0.30000670, caniuse-lite@^1.0.30000704: + version "1.0.30000708" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000708.tgz#71dbf388c57f379b1bb66c89a890edc04c2509b6" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@1.1.3, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.0.1.tgz#dbec49436d2ae15f536114e76d14656cdbc0f44d" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chokidar@1.7.0, chokidar@^1.4.1, chokidar@^1.6.1, chokidar@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +ci-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +clean-css@3.4.27: + version "3.4.27" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.27.tgz#adef75b31c160ffa5d72f4de67966e2660c1a255" + dependencies: + commander "2.8.x" + source-map "0.4.x" + +clean-css@4.1.x: + version "4.1.7" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.7.tgz#b9aea4f85679889cf3eae8b40349ec4ebdfdd032" + dependencies: + source-map "0.5.x" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone@~0.1.9: + version "0.1.19" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.1.19.tgz#613fb68639b26a494ac53253e15b1a6bd88ada85" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +color-convert@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +colors@1.1.2, colors@^1.1.0, colors@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combine-lists@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" + dependencies: + lodash "^4.5.0" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@2.11.x, commander@^2.8.1, commander@^2.9.0, commander@~2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + +commander@2.8.x: + version "2.8.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + dependencies: + graceful-readlink ">= 1.0.0" + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + +component-emitter@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" + +component-emitter@1.2.1, component-emitter@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + +compress-commons@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.0.tgz#58587092ef20d37cb58baf000112c9278ff73b9f" + dependencies: + buffer-crc32 "^0.2.1" + crc32-stream "^2.0.0" + normalize-path "^2.0.0" + readable-stream "^2.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.4.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +connect@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.2.tgz#694e8d20681bfe490282c8ab886be98f09f42fe7" + dependencies: + debug "2.6.7" + finalhandler "1.0.3" + parseurl "~1.3.1" + utils-merge "1.0.0" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +continuable-cache@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" + +convert-source-map@^1.1.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +cookiejar@^2.0.6: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.1.tgz#41ad57b1b555951ec171412a81942b1e8200d34a" + +core-js@^2.2.0, core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +crc32-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" + dependencies: + crc "^3.4.4" + readable-stream "^2.0.0" + +crc@^3.4.4: + version "3.4.4" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.4.tgz#9da1e980e3bd44fc5c93bf5ab3da3378d85e466b" + +create-ecdh@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + ripemd160 "^2.0.0" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.6" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@5.1.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +crypto-browserify@^3.11.0: + version "3.11.1" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.1.tgz#948945efc6757a400d6e5e5af47194d10064279f" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + +d3@^3.5.17: + version "3.5.17" + resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +dargs@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +debug@2, debug@^2.1.0, debug@^2.1.1, debug@^2.2.0: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +debug@2.2.0, debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + dependencies: + ms "0.7.2" + +debug@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +deferred-leveldown@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz#2cef1f111e1c57870d8bbb8af2650e587cd2f5b4" + dependencies: + abstract-leveldown "~0.12.1" + +del@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.0.tgz#9a50f04bf37325e283b4f44e985336c252456bd5" + dependencies: + globby "^4.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +del@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +depd@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +dev-null@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dev-null/-/dev-null-0.1.1.tgz#5a205ce3c2b2ef77b6238d6ba179eb74c6a0e818" + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + +diff@^3.1.0, diff@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.0.tgz#056695150d7aa93237ca7e378ac3b1682b7963b9" + +diffie-hellman@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +doctrine@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" + dependencies: + esutils "^1.1.6" + isarray "0.0.1" + +dom-serialize@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +domain-browser@^1.1.1: + version "1.1.7" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +electron-to-chromium@^1.3.16: + version "1.3.16" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.16.tgz#d0e026735754770901ae301a21664cba45d92f7d" + +elliptic@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +end-of-stream@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" + dependencies: + once "^1.4.0" + +engine.io-client@1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab" + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "2.3.3" + engine.io-parser "1.3.2" + has-cors "1.1.0" + indexof "0.0.1" + parsejson "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + ws "1.1.2" + xmlhttprequest-ssl "1.5.3" + yeast "0.1.2" + +engine.io-parser@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a" + dependencies: + after "0.8.2" + arraybuffer.slice "0.0.6" + base64-arraybuffer "0.1.5" + blob "0.0.4" + has-binary "0.1.7" + wtf-8 "1.0.0" + +engine.io@1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.3.tgz#8de7f97895d20d39b85f88eeee777b2bd42b13d4" + dependencies: + accepts "1.3.3" + base64id "1.0.0" + cookie "0.3.1" + debug "2.3.3" + engine.io-parser "1.3.2" + ws "1.1.2" + +enhanced-resolve@^3.0.0, enhanced-resolve@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + object-assign "^4.0.1" + tapable "^0.2.7" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + +errno@^0.1.1, errno@^0.1.3, errno@~0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +error@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" + dependencies: + string-template "~0.2.1" + xtend "~4.0.0" + +es3ify@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es3ify/-/es3ify-0.1.4.tgz#ad9fa5df1ae34f3f31e1211b5818b2d51078dfd1" + dependencies: + esprima-fb "~3001.0001.0000-dev-harmony-fb" + jstransform "~3.0.0" + through "~2.3.4" + +es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.24" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.24.tgz#a55877c9924bc0c8d9bd3c2cbe17495ac1709b14" + dependencies: + es6-iterator "2" + es6-symbol "~3.1" + +es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-symbol "^3.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-templates@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/es6-templates/-/es6-templates-0.2.3.tgz#5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4" + dependencies: + recast "~0.11.12" + through "~2.3.6" + +es6-weak-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esmangle-evaluator@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esmangle-evaluator/-/esmangle-evaluator-1.0.1.tgz#620d866ef4861b3311f75766d52a8572bb3c6336" + +esprima-fb@~15001.1001.0-dev-harmony-fb: + version "15001.1001.0-dev-harmony-fb" + resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659" + +esprima-fb@~3001.0001.0000-dev-harmony-fb, esprima-fb@~3001.1.0-dev-harmony-fb: + version "3001.1.0-dev-harmony-fb" + resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz#b77d37abcd38ea0b77426bb8bc2922ce6b426411" + +esprima@~3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esrecurse@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + dependencies: + estraverse "^4.1.0" + object-assign "^4.0.1" + +estraverse@^4.1.0, estraverse@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +estree-walker@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" + +estree-walker@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" + +esutils@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" + +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +eventemitter3@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +evp_bytestokey@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53" + dependencies: + create-hash "^1.1.1" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + +expand-braces@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" + dependencies: + array-slice "^0.2.3" + array-unique "^0.2.1" + braces "^0.1.2" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" + dependencies: + is-number "^0.1.1" + repeat-string "^0.2.2" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +express@4.15.3: + version "4.15.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662" + dependencies: + accepts "~1.3.3" + array-flatten "1.1.1" + content-disposition "0.5.2" + content-type "~1.0.2" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.7" + depd "~1.1.0" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + finalhandler "~1.0.3" + fresh "0.5.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.1" + path-to-regexp "0.1.7" + proxy-addr "~1.1.4" + qs "6.4.0" + range-parser "~1.2.0" + send "0.15.3" + serve-static "1.12.3" + setprototypeof "1.0.3" + statuses "~1.3.1" + type-is "~1.6.15" + utils-merge "1.0.0" + vary "~1.1.1" + +extend@3, extend@^3.0.0, extend@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" + dependencies: + iconv-lite "^0.4.17" + jschardet "^1.4.2" + tmp "^0.0.31" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +falafel@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/falafel/-/falafel-1.2.0.tgz#c18d24ef5091174a497f318cd24b026a25cddab4" + dependencies: + acorn "^1.0.3" + foreach "^2.0.5" + isarray "0.0.1" + object-keys "^1.0.6" + +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + +fastparse@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" + +faye-websocket@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + dependencies: + websocket-driver ">=0.5.1" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +finalhandler@1.0.3, finalhandler@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" + dependencies: + debug "2.6.7" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.1" + statuses "~1.3.1" + unpipe "~1.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +font-awesome@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +foreach@^2.0.5, foreach@~2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.2.0.tgz#9a5e3b9295f980b2623cf64fa238b14cebca707b" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +formidable@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.1.1.tgz#96b8886f7c3c3508b932d6bd70c4d3a88f35f1a9" + +forwarded@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" + +fresh@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" + +fs-access@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" + dependencies: + null-check "^1.0.0" + +fs-extra@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + +fs-readdir-recursive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.36" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +fwd-stream@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fwd-stream/-/fwd-stream-1.0.4.tgz#ed281cabed46feecf921ee32dc4c50b372ac7cfa" + dependencies: + readable-stream "~1.0.26-4" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" + dependencies: + globule "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@~7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^9.0.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-4.1.0.tgz#080f54549ec1b82a6c60e631fc82e1211dbe95f8" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^6.0.1" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globule@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" + dependencies: + glob "~7.1.1" + lodash "~4.17.4" + minimatch "~3.0.2" + +graceful-fs@^4.1.0, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-binary@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" + dependencies: + isarray "0.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hash-base@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" + dependencies: + inherits "^2.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +he@1.1.x: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + +html-loader@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.4.5.tgz#5fbcd87cd63a5c49a7fce2fe56f425e05729c68c" + dependencies: + es6-templates "^0.2.2" + fastparse "^1.1.1" + html-minifier "^3.0.1" + loader-utils "^1.0.2" + object-assign "^4.1.0" + +html-minifier@^3.0.1: + version "3.5.3" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.3.tgz#4a275e3b1a16639abb79b4c11191ff0d0fcf1ab9" + dependencies: + camel-case "3.0.x" + clean-css "4.1.x" + commander "2.11.x" + he "1.1.x" + ncname "1.0.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.0.x" + +http-errors@~1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" + dependencies: + depd "1.1.0" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-proxy@^1.13.0: + version "1.16.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" + +https-proxy-agent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6" + dependencies: + agent-base "2" + debug "2" + extend "3" + +iconv-lite@0.4.15: + version "0.4.15" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + +iconv-lite@^0.4.17: + version "0.4.18" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" + +idb-wrapper@^1.5.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/idb-wrapper/-/idb-wrapper-1.7.1.tgz#6a32670122e173a84ecc5cfa9668fa2ceb221b04" + +ieee754@^1.1.4: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + +in-publish@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indexof@0.0.1, indexof@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@^1.3.4, ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inline-process-browser@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/inline-process-browser/-/inline-process-browser-1.0.0.tgz#46a61b153dd3c9b1624b1a00626edb4f7f414f22" + dependencies: + falafel "^1.0.1" + through2 "^0.6.5" + +inquirer@^3.0.6, inquirer@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.1.tgz#06ceb0f540f45ca548c17d6840959878265fa175" + dependencies: + ansi-escapes "^2.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ionic-angular@~3.5.*: + version "3.5.3" + resolved "https://registry.yarnpkg.com/ionic-angular/-/ionic-angular-3.5.3.tgz#31e2616fa91ca72ee59ce3c11da9ebdced59791a" + +ionic@3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/ionic/-/ionic-3.7.0.tgz#a3c32174c6d5455c3bc74b6b9152e0f97dce23c8" + dependencies: + "@ionic/cli-utils" "1.7.0" + chalk "^2.0.0" + diff "^3.2.0" + minimist "^1.2.0" + opn "^5.1.0" + os-name "^2.0.1" + rimraf "^2.6.1" + semver "^5.3.0" + ssh-config "^1.0.1" + tar "^2.2.1" + tslib "^1.7.1" + +ionicons@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ionicons/-/ionicons-3.0.0.tgz#40b8daf4fd7a31150bd002160f66496e22a98c3c" + +ipaddr.js@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.4.0.tgz#296aca878a821816e5b85d0a285a99bcff4582f0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + +is-number@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-object@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-0.1.2.tgz#00efbc08816c33cfc4ac8251d132e10dc65098d7" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + +is@~0.2.6: + version "0.2.7" + resolved "https://registry.yarnpkg.com/is/-/is-0.2.7.tgz#3b34a2c48f359972f35042849193ae7264b63562" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isbinaryfile@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + +isbuffer@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/isbuffer/-/isbuffer-0.0.0.tgz#38c146d9df528b8bf9b0701c3d43cf12df3fc39b" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jasmine-core@~2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.7.0.tgz#50ff8c4f92d8ef5c0b2c1b846dd263ed85152091" + +jasmine-spec-reporter@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/jasmine-spec-reporter/-/jasmine-spec-reporter-4.1.1.tgz#5a6d58ab5d61bea7309fbc279239511756b1b588" + dependencies: + colors "1.1.2" + +jasmine@^2.5.3: + version "2.7.0" + resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.7.0.tgz#5cf0bb4e594b4600bb4235560366212ac5aea1b2" + dependencies: + exit "^0.1.2" + glob "^7.0.6" + jasmine-core "~2.7.0" + +jasminewd2@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.1.0.tgz#da595275d1ae631de736ac0a7c7d85c9f73ef652" + +js-base64@^2.1.8, js-base64@^2.1.9: + version "2.1.9" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" + +js-tokens@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jschardet@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.0.tgz#a61f310306a5a71188e1b1acd08add3cfbb08b1e" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +json-loader@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de" + +json-loader@^0.5.4: + version "0.5.7" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.5.0, json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + dependencies: + assert-plus "1.0.0" + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +jstransform@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-3.0.0.tgz#a2591ab6cee8d97bf3be830dbfa2313b87cd640b" + dependencies: + base62 "0.1.1" + esprima-fb "~3001.1.0-dev-harmony-fb" + source-map "0.1.31" + +karma-chrome-launcher@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf" + dependencies: + fs-access "^1.0.0" + which "^1.2.1" + +karma-jasmine-html-reporter@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz#48a8e5ef18807617ee2b5e33c1194c35b439524c" + dependencies: + karma-jasmine "^1.0.2" + +karma-jasmine@^1.0.2, karma-jasmine@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e3733811b810acf" + +karma-sourcemap-loader@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13d46fed062b042e1009d4c4505d8" + dependencies: + graceful-fs "^4.1.2" + +karma-webpack@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-2.0.4.tgz#3e2d4f48ba94a878e1c66bb8e1ae6128987a175b" + dependencies: + async "~0.9.0" + loader-utils "^0.2.5" + lodash "^3.8.0" + source-map "^0.1.41" + webpack-dev-middleware "^1.0.11" + +karma@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/karma/-/karma-1.7.0.tgz#6f7a1a406446fa2e187ec95398698f4cee476269" + dependencies: + bluebird "^3.3.0" + body-parser "^1.16.1" + chokidar "^1.4.1" + colors "^1.1.0" + combine-lists "^1.0.0" + connect "^3.6.0" + core-js "^2.2.0" + di "^0.0.1" + dom-serialize "^2.2.0" + expand-braces "^0.1.1" + glob "^7.1.1" + graceful-fs "^4.1.2" + http-proxy "^1.13.0" + isbinaryfile "^3.0.0" + lodash "^3.8.0" + log4js "^0.6.31" + mime "^1.3.4" + minimatch "^3.0.2" + optimist "^0.6.1" + qjobs "^1.1.4" + range-parser "^1.2.0" + rimraf "^2.6.0" + safe-buffer "^5.0.1" + socket.io "1.7.3" + source-map "^0.5.3" + tmp "0.0.31" + useragent "^2.1.12" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + dependencies: + readable-stream "^2.0.5" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +leek@0.0.24: + version "0.0.24" + resolved "https://registry.yarnpkg.com/leek/-/leek-0.0.24.tgz#e400e57f0e60d8ef2bd4d068dc428a54345dbcda" + dependencies: + debug "^2.1.0" + lodash.assign "^3.2.0" + rsvp "^3.0.21" + +level-blobs@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/level-blobs/-/level-blobs-0.1.7.tgz#9ab9b97bb99f1edbf9f78a3433e21ed56386bdaf" + dependencies: + level-peek "1.0.6" + once "^1.3.0" + readable-stream "^1.0.26-4" + +level-filesystem@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/level-filesystem/-/level-filesystem-1.2.0.tgz#a00aca9919c4a4dfafdca6a8108d225aadff63b3" + dependencies: + concat-stream "^1.4.4" + errno "^0.1.1" + fwd-stream "^1.0.4" + level-blobs "^0.1.7" + level-peek "^1.0.6" + level-sublevel "^5.2.0" + octal "^1.0.0" + once "^1.3.0" + xtend "^2.2.0" + +level-fix-range@2.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/level-fix-range/-/level-fix-range-2.0.0.tgz#c417d62159442151a19d9a2367868f1724c2d548" + dependencies: + clone "~0.1.9" + +level-fix-range@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/level-fix-range/-/level-fix-range-1.0.2.tgz#bf15b915ae36d8470c821e883ddf79cd16420828" + +"level-hooks@>=4.4.0 <5": + version "4.5.0" + resolved "https://registry.yarnpkg.com/level-hooks/-/level-hooks-4.5.0.tgz#1b9ae61922930f3305d1a61fc4d83c8102c0dd93" + dependencies: + string-range "~1.2" + +level-js@^2.1.3: + version "2.2.4" + resolved "https://registry.yarnpkg.com/level-js/-/level-js-2.2.4.tgz#bc055f4180635d4489b561c9486fa370e8c11697" + dependencies: + abstract-leveldown "~0.12.0" + idb-wrapper "^1.5.0" + isbuffer "~0.0.0" + ltgt "^2.1.2" + typedarray-to-buffer "~1.0.0" + xtend "~2.1.2" + +level-peek@1.0.6, level-peek@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/level-peek/-/level-peek-1.0.6.tgz#bec51c72a82ee464d336434c7c876c3fcbcce77f" + dependencies: + level-fix-range "~1.0.2" + +level-sublevel@^5.2.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-5.2.3.tgz#744c12c72d2e72be78dde3b9b5cd84d62191413a" + dependencies: + level-fix-range "2.0" + level-hooks ">=4.4.0 <5" + string-range "~1.2.1" + xtend "~2.0.4" + +levelup@^0.18.2: + version "0.18.6" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-0.18.6.tgz#e6a01cb089616c8ecc0291c2a9bd3f0c44e3e5eb" + dependencies: + bl "~0.8.1" + deferred-leveldown "~0.2.0" + errno "~0.1.1" + prr "~0.0.0" + readable-stream "~1.0.26" + semver "~2.3.1" + xtend "~3.0.0" + +lie@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.0.2.tgz#ffda21d7bba26f377cad865d3649b2fc8ce39fea" + dependencies: + es3ify "^0.1.3" + immediate "~3.0.5" + inline-process-browser "^1.0.0" + unreachable-branch-transform "^0.3.0" + +livereload-js@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + +loader-utils@^0.2.15, loader-utils@^0.2.5: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + +localforage-cordovasqlitedriver@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/localforage-cordovasqlitedriver/-/localforage-cordovasqlitedriver-1.5.0.tgz#f934789e6ad9a39bac05fdd1168812f438535762" + dependencies: + "@types/localforage" "0.0.30" + localforage ">=1.4.0" + +localforage@>=1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.5.0.tgz#6b994e19b56611fa85df3992df397ac4ab66e815" + dependencies: + lie "3.0.2" + +localforage@~1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.4.3.tgz#a212543c39c7c76424edd12bf474c489aaca494c" + dependencies: + lie "3.0.2" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash.assign@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.clonedeep@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.mergewith@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.some@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + +lodash@^3.8.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.8.0, lodash@~4.17.4: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +log4js@^0.6.31: + version "0.6.38" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" + dependencies: + readable-stream "~1.0.2" + semver "~4.3.3" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + +lru-cache@2.2.x: + version "2.2.4" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" + +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +ltgt@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.0.tgz#b65ba5fcb349a29924c8e333f7c6a5562f2e4842" + +macos-release@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-1.1.0.tgz#831945e29365b470aa8724b0ab36c8f8959d10fb" + +magic-string@0.19.1, magic-string@^0.19.0: + version "0.19.1" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.19.1.tgz#14d768013caf2ec8fdea16a49af82fc377e75201" + dependencies: + vlq "^0.2.1" + +magic-string@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.16.0.tgz#970ebb0da7193301285fb1aa650f39bdd81eb45a" + dependencies: + vlq "^0.2.1" + +make-error@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@^1.1.1, methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +miller-rabin@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@~1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" + +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: + version "2.1.16" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" + dependencies: + mime-db "~1.29.0" + +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +mime@^1.3.4: + version "1.3.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" + +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +minimalistic-assert@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +moment@^2.16.0, moment@^2.17.1: + version "2.18.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +nan@^2.3.0, nan@^2.3.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + +ncname@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ncname/-/ncname-1.0.0.tgz#5b57ad18b1ca092864ef62b0b1ed8194f383b71c" + dependencies: + xml-char-classes "^1.0.0" + +ncp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +no-case@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.1.tgz#7aeba1c73a52184265554b7dc03baf720df80081" + dependencies: + lower-case "^1.1.1" + +node-gyp@^3.3.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + minimatch "^3.0.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "2" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-libs-browser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.1.4" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "0.0.1" + os-browserify "^0.2.0" + path-browserify "0.0.0" + process "^0.11.0" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.0.5" + stream-browserify "^2.0.1" + stream-http "^2.3.1" + string_decoder "^0.10.25" + timers-browserify "^2.0.2" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-pre-gyp@^0.6.36: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +node-sass@4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.5.3.tgz#d09c9d1179641239d1b97ffc6231fdcec53e1568" + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash.assign "^4.2.0" + lodash.clonedeep "^4.3.2" + lodash.mergewith "^4.6.0" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.3.2" + node-gyp "^3.3.1" + npmlog "^4.0.0" + request "^2.79.0" + sass-graph "^2.1.1" + stdout-stream "^1.4.0" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +null-check@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" + +null-loader@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-0.1.1.tgz#17be9abfcd3ff0e1512f6fc4afcb1f5039378fae" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + +object-keys@^1.0.6: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object-keys@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.2.0.tgz#cddec02998b091be42bf1035ae32e49f1cb6ea67" + dependencies: + foreach "~2.0.1" + indexof "~0.0.1" + is "~0.2.6" + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +octal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/octal/-/octal-1.0.0.tgz#63e7162a68efbeb9e213588d58e989d1e5c4530b" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.3, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +opn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" + dependencies: + is-wsl "^1.1.0" + +optimist@^0.6.1, optimist@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + +os-browserify@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-name@2.0.1, os-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-2.0.1.tgz#b9a386361c17ae3a21736ef0599405c9a8c5dc5e" + dependencies: + macos-release "^1.0.0" + win-release "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@0, osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +pako@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + dependencies: + no-case "^2.2.0" + +parse-asn1@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parsejson@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" + dependencies: + better-assert "~1.0.0" + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +path-to-regexp@^1.0.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + dependencies: + isarray "0.0.1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +pbkdf2@^3.0.3: + version "3.0.12" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.12.tgz#be36785c5067ea48d806ff923288c5f750b6b8a2" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +postcss-value-parser@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss@5.2.17: + version "5.2.17" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b" + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.1: + version "6.0.8" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.8.tgz#89067a9ce8b11f8a84cbc5117efc30419a0857b3" + dependencies: + chalk "^2.0.1" + source-map "^0.5.6" + supports-color "^4.2.0" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +private@^0.1.6, private@~0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + +process-es6@^0.11.2, process-es6@^0.11.3: + version "0.11.6" + resolved "https://registry.yarnpkg.com/process-es6/-/process-es6-0.11.6.tgz#c6bb389f9a951f82bd4eb169600105bd2ff9c778" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process@^0.11.0: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +protractor@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.1.2.tgz#9b221741709a4c62d5cd53c6aadd54a71137e95f" + dependencies: + "@types/node" "^6.0.46" + "@types/q" "^0.0.32" + "@types/selenium-webdriver" "~2.53.39" + blocking-proxy "0.0.5" + chalk "^1.1.3" + glob "^7.0.3" + jasmine "^2.5.3" + jasminewd2 "^2.1.0" + optimist "~0.6.0" + q "1.4.1" + saucelabs "~1.3.0" + selenium-webdriver "3.0.1" + source-map-support "~0.4.0" + webdriver-js-extender "^1.0.0" + webdriver-manager "^12.0.6" + +proxy-addr@~1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.5.tgz#71c0ee3b102de3f202f3b64f608d173fcba1a918" + dependencies: + forwarded "~0.1.0" + ipaddr.js "1.4.0" + +proxy-middleware@0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/proxy-middleware/-/proxy-middleware-0.15.0.tgz#a3fdf1befb730f951965872ac2f6074c61477a56" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +public-encrypt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +q@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + +q@^1.4.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" + +qjobs@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" + +qs@6.4.0, qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +qs@^6.1.0, qs@^6.4.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +randombytes@^2.0.0, randombytes@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@~1.1.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" + dependencies: + bytes "1" + string_decoder "0.10" + +raw-body@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.15" + unpipe "1.0.0" + +rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.2, readable-stream@~1.0.26, readable-stream@~1.0.26-4: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^1.0.26-4: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.2.6: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +recast@^0.10.1: + version "0.10.43" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f" + dependencies: + ast-types "0.8.15" + esprima-fb "~15001.1001.0-dev-harmony-fb" + private "~0.1.5" + source-map "~0.5.0" + +recast@~0.11.12: + version "0.11.23" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" + dependencies: + ast-types "0.9.6" + esprima "~3.1.0" + private "~0.1.5" + source-map "~0.5.0" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +reflect-metadata@^0.1.10, reflect-metadata@^0.1.2: + version "0.1.10" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.10.tgz#b4f83704416acad89988c9b15635d47e03b9344a" + +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + +remove-trailing-separator@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request@2, request@^2.78.0, request@^2.79.0, request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +requires-port@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" + dependencies: + path-parse "^1.0.5" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + dependencies: + hash-base "^2.0.0" + inherits "^2.0.1" + +rollup-plugin-commonjs@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.0.2.tgz#98b1589bfe32a6c0f67790b60c0b499972afed89" + dependencies: + acorn "^4.0.1" + estree-walker "^0.3.0" + magic-string "^0.19.0" + resolve "^1.1.7" + rollup-pluginutils "^2.0.1" + +rollup-plugin-json@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-json/-/rollup-plugin-json-2.3.0.tgz#3c07a452c1b5391be28006fbfff3644056ce0add" + dependencies: + rollup-pluginutils "^2.0.1" + +rollup-plugin-node-builtins@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.1.2.tgz#24a1fed4a43257b6b64371d8abc6ce1ab14597e9" + dependencies: + browserify-fs "^1.0.0" + buffer-es6 "^4.9.2" + crypto-browserify "^3.11.0" + process-es6 "^0.11.2" + +rollup-plugin-node-globals@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-globals/-/rollup-plugin-node-globals-1.1.0.tgz#7efd8d611d132737829e804e9f51f50962af451f" + dependencies: + acorn "^4.0.1" + buffer-es6 "^4.9.1" + estree-walker "^0.2.1" + magic-string "^0.16.0" + process-es6 "^0.11.3" + rollup-pluginutils "^1.5.2" + +rollup-plugin-node-resolve@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.0.0.tgz#8b897c4c3030d5001277b0514b25d2ca09683ee0" + dependencies: + browser-resolve "^1.11.0" + builtin-modules "^1.1.0" + is-module "^1.0.0" + resolve "^1.1.6" + +rollup-pluginutils@2.0.1, rollup-pluginutils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0" + dependencies: + estree-walker "^0.3.0" + micromatch "^2.3.11" + +rollup-pluginutils@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" + dependencies: + estree-walker "^0.2.1" + minimatch "^3.0.2" + +rollup@0.42.0: + version "0.42.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.42.0.tgz#56e791b3a2f3dd7190bbb80a375675f2fe0f9b23" + dependencies: + source-map-support "^0.4.0" + +rsvp@^3.0.21: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +rxjs@5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.0.tgz#a7db14ab157f9d7aac6a56e655e7a3860d39bf26" + dependencies: + symbol-observable "^1.0.1" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +safe-json-parse@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" + +sass-graph@^2.1.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +saucelabs@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.3.0.tgz#d240e8009df7fa87306ec4578a69ba3b5c424fee" + dependencies: + https-proxy-agent "^1.0.0" + +sax@0.6.x: + version "0.6.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-0.6.1.tgz#563b19c7c1de892e09bfc4f2fc30e3c27f0952b9" + +sax@>=0.6.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +selenium-webdriver@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz#a2dea5da4a97f6672e89e7ca7276cefa365147a7" + dependencies: + adm-zip "^0.4.7" + rimraf "^2.5.4" + tmp "0.0.30" + xml2js "^0.4.17" + +selenium-webdriver@^2.53.2: + version "2.53.3" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz#d29ff5a957dff1a1b49dc457756e4e4bfbdce085" + dependencies: + adm-zip "0.4.4" + rimraf "^2.2.8" + tmp "0.0.24" + ws "^1.0.1" + xml2js "0.4.4" + +"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.3.0, semver@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + +semver@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-2.3.2.tgz#b9848f25d6cf36333073ec9ef8856d42f1233e52" + +semver@~4.3.3: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +semver@~5.0.1: + version "5.0.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +send@0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" + dependencies: + debug "2.6.7" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + fresh "0.5.0" + http-errors "~1.6.1" + mime "1.3.4" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +serve-static@1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.15.3" + +serviceworker-cache-polyfill@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz#de19ee73bef21ab3c0740a37b33db62464babdeb" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.8" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f" + dependencies: + inherits "^2.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +socket.io-adapter@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" + dependencies: + debug "2.3.3" + socket.io-parser "2.3.1" + +socket.io-client@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.3.tgz#b30e86aa10d5ef3546601c09cde4765e381da377" + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "2.3.3" + engine.io-client "1.8.3" + has-binary "0.1.7" + indexof "0.0.1" + object-component "0.0.3" + parseuri "0.0.5" + socket.io-parser "2.3.1" + to-array "0.1.4" + +socket.io-parser@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" + dependencies: + component-emitter "1.1.2" + debug "2.2.0" + isarray "0.0.1" + json3 "3.3.2" + +socket.io@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.3.tgz#b8af9caba00949e568e369f1327ea9be9ea2461b" + dependencies: + debug "2.3.3" + engine.io "1.8.3" + has-binary "0.1.7" + object-assign "4.1.0" + socket.io-adapter "0.5.0" + socket.io-client "1.7.3" + socket.io-parser "2.3.1" + +source-list-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + +source-map-support@^0.4.0, source-map-support@^0.4.2, source-map-support@~0.4.0: + version "0.4.15" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" + dependencies: + source-map "^0.5.6" + +source-map@0.1.31: + version "0.1.31" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.31.tgz#9f704d0d69d9e138a81badf6ebb4fde33d151c61" + dependencies: + amdefine ">=0.0.4" + +source-map@0.4.x, source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.3: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@^0.1.41: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +ssh-config@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ssh-config/-/ssh-config-1.0.1.tgz#38742116dced7d45f5362ca86af77130ccbebc8b" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +"statuses@>= 1.3.1 < 2", statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +stdout-stream@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + dependencies: + readable-stream "^2.0.1" + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-http@^2.3.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.2.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +string-range@~1.2, string-range@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/string-range/-/string-range-1.2.2.tgz#a893ed347e72299bc83befbbf2a692a8d239d5dd" + +string-template@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@0.10, string_decoder@^0.10.25, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +superagent@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.5.2.tgz#3361a3971567504c351063abeaae0faa23dbf3f8" + dependencies: + component-emitter "^1.2.0" + cookiejar "^2.0.6" + debug "^2.2.0" + extend "^3.0.0" + form-data "^2.1.1" + formidable "^1.1.1" + methods "^1.1.1" + mime "^1.3.4" + qs "^6.1.0" + readable-stream "^2.0.5" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +supports-color@^4.0.0, supports-color@^4.2.0, supports-color@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.2.1.tgz#65a4bb2631e90e02420dba5554c375a4754bb836" + dependencies: + has-flag "^2.0.0" + +sw-toolbox@3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/sw-toolbox/-/sw-toolbox-3.6.0.tgz#26df1d1c70348658e4dea2884319149b7b3183b5" + dependencies: + path-to-regexp "^1.0.1" + serviceworker-cache-polyfill "^4.0.0" + +symbol-observable@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" + +tapable@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.7.tgz#e46c0daacbb2b8a98b9b0cea0f4052105817ed5c" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar-stream@^1.5.0: + version "1.5.4" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016" + dependencies: + bl "^1.0.0" + end-of-stream "^1.0.0" + readable-stream "^2.0.0" + xtend "^4.0.0" + +tar@^2.0.0, tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +through2@^0.6.2, through2@^0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through@^2.3.6, through@~2.3.4, through@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timers-browserify@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" + dependencies: + setimmediate "^1.0.4" + +tiny-lr@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.0.4.tgz#d13becf37f8b7e963320f5743298e3e934c7329a" + dependencies: + body "^5.1.0" + debug "~2.2.0" + faye-websocket "~0.10.0" + livereload-js "^2.2.2" + object-assign "^4.1.0" + qs "^6.4.0" + +tmp@0.0.24: + version "0.0.24" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.24.tgz#d6a5e198d14a9835cc6f2d7c3d9e302428c8cf12" + +tmp@0.0.30: + version "0.0.30" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" + dependencies: + os-tmpdir "~1.0.1" + +tmp@0.0.31, tmp@0.0.x, tmp@^0.0.31: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-fast-properties@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +ts-loader@^2.0.3: + version "2.3.2" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-2.3.2.tgz#b71b9f0d0062c791a654d462140718f9f7817665" + dependencies: + chalk "^2.0.1" + enhanced-resolve "^3.0.0" + loader-utils "^1.0.2" + semver "^5.0.1" + +ts-node@^3.0.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-3.3.0.tgz#c13c6a3024e30be1180dd53038fc209289d4bf69" + dependencies: + arrify "^1.0.0" + chalk "^2.0.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.0" + tsconfig "^6.0.0" + v8flags "^3.0.0" + yn "^2.0.0" + +tsconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-6.0.0.tgz#6b0e8376003d7af1864f8df8f89dd0059ffcd032" + dependencies: + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + +tsickle@^0.21.0: + version "0.21.6" + resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.21.6.tgz#53b01b979c5c13fdb13afb3fb958177e5991588d" + dependencies: + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map "^0.5.6" + source-map-support "^0.4.2" + +tslib@^1.0.0, tslib@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.7.1.tgz#bc8004164691923a79fe8378bbeb3da2017538ec" + +tslint-eslint-rules@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-4.1.1.tgz#7c30e7882f26bc276bff91d2384975c69daf88ba" + dependencies: + doctrine "^0.7.2" + tslib "^1.0.0" + tsutils "^1.4.0" + +tslint@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.5.0.tgz#10e8dab3e3061fa61e9442e8cee3982acf20a6aa" + dependencies: + babel-code-frame "^6.22.0" + colors "^1.1.2" + commander "^2.9.0" + diff "^3.2.0" + glob "^7.1.1" + minimatch "^3.0.4" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.7.1" + tsutils "^2.5.1" + +tsutils@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.9.1.tgz#b9f9ab44e55af9681831d5f28d0aeeaf5c750cb0" + +tsutils@^2.5.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.8.0.tgz#0160173729b3bf138628dd14a1537e00851d814a" + dependencies: + tslib "^1.7.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-is@~1.6.15: + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + +typedarray-to-buffer@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz#9bb8ba0e841fb3f4cf1fe7c245e9f3fa8a5fe99c" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +typescript@2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.4.tgz#3d38321828231e434f287514959c37a82b629f42" + +uglify-js@3.0.x, uglify-js@^3.0.23: + version "3.0.27" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.27.tgz#a97db8c8ba6b9dba4e2f88d86aa9548fa6320034" + dependencies: + commander "~2.11.0" + source-map "~0.5.1" + +uglify-js@^2.8.29: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uglifyjs-webpack-plugin@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" + dependencies: + source-map "^0.5.6" + uglify-js "^2.8.29" + webpack-sources "^1.0.1" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + +universalify@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +unreachable-branch-transform@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/unreachable-branch-transform/-/unreachable-branch-transform-0.3.0.tgz#d99cc4c6e746d264928845b611db54b0f3474caa" + dependencies: + esmangle-evaluator "^1.0.0" + recast "^0.10.1" + through2 "^0.6.2" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +useragent@^2.1.12: + version "2.2.1" + resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.2.1.tgz#cf593ef4f2d175875e8bb658ea92e18a4fd06d8e" + dependencies: + lru-cache "2.2.x" + tmp "0.0.x" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util@0.10.3, util@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +uuid@^3.0.0, uuid@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + +v8flags@^2.0.10: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +v8flags@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.0.0.tgz#4be9604488e0c4123645def705b1848d16b8e01f" + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +vary@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +vlq@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.2.tgz#e316d5257b40b86bb43cb8d5fea5d7f54d6b0ca1" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + +walkdir@^0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532" + +watchpack@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac" + dependencies: + async "^2.1.2" + chokidar "^1.7.0" + graceful-fs "^4.1.2" + +webdriver-js-extender@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz#81c533a9e33d5bfb597b4e63e2cdb25b54777515" + dependencies: + "@types/selenium-webdriver" "^2.53.35" + selenium-webdriver "^2.53.2" + +webdriver-manager@^12.0.6: + version "12.0.6" + resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.0.6.tgz#3df1a481977010b4cbf8c9d85c7a577828c0e70b" + dependencies: + adm-zip "^0.4.7" + chalk "^1.1.1" + del "^2.2.0" + glob "^7.0.3" + ini "^1.3.4" + minimist "^1.2.0" + q "^1.4.1" + request "^2.78.0" + rimraf "^2.5.2" + semver "^5.3.0" + xml2js "^0.4.17" + +webpack-dev-middleware@^1.0.11: + version "1.11.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.11.0.tgz#09691d0973a30ad1f82ac73a12e2087f0a4754f9" + dependencies: + memory-fs "~0.4.1" + mime "^1.3.4" + path-is-absolute "^1.0.0" + range-parser "^1.0.3" + +webpack-sources@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf" + dependencies: + source-list-map "^2.0.0" + source-map "~0.5.3" + +webpack@^3.1.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.4.1.tgz#4c3f4f3fb318155a4db0cb6a36ff05c5697418f4" + dependencies: + acorn "^5.0.0" + acorn-dynamic-import "^2.0.0" + ajv "^5.1.5" + ajv-keywords "^2.0.0" + async "^2.1.2" + enhanced-resolve "^3.4.0" + escope "^3.6.0" + interpret "^1.0.0" + json-loader "^0.5.4" + json5 "^0.5.1" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + mkdirp "~0.5.0" + node-libs-browser "^2.0.0" + source-map "^0.5.3" + supports-color "^4.2.1" + tapable "^0.2.7" + uglifyjs-webpack-plugin "^0.4.6" + watchpack "^1.4.0" + webpack-sources "^1.0.1" + yargs "^8.0.2" + +websocket-driver@>=0.5.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + dependencies: + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@1, which@^1.2.1, which@^1.2.9: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +win-release@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/win-release/-/win-release-1.1.1.tgz#5fa55e02be7ca934edfc12665632e849b72e5209" + dependencies: + semver "^5.0.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wrap-ansi@^2.0.0, wrap-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +ws@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +ws@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +ws@^1.0.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.4.tgz#57f40d036832e5f5055662a397c4de76ed66bf61" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +wtf-8@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" + +xml-char-classes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" + +xml2js@0.4.17, xml2js@^0.4.17: + version "0.4.17" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.17.tgz#17be93eaae3f3b779359c795b419705a8817e868" + dependencies: + sax ">=0.6.0" + xmlbuilder "^4.1.0" + +xml2js@0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.4.tgz#3111010003008ae19240eba17497b57c729c555d" + dependencies: + sax "0.6.x" + xmlbuilder ">=1.0.0" + +xmlbuilder@>=1.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.1.tgz#91cd70897755363eba57c12ddeeab4a341a61f65" + +xmlbuilder@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.2.1.tgz#aa58a3041a066f90eaa16c2f5389ff19f3f461a5" + dependencies: + lodash "^4.0.0" + +xmlhttprequest-ssl@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +xtend@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" + +xtend@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.0.6.tgz#5ea657a6dba447069c2e59c58a1138cb0c5e6cee" + dependencies: + is-object "~0.1.2" + object-keys "~0.2.0" + +xtend@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + dependencies: + object-keys "~0.4.0" + +xtend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + +yargs@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.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.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + +zip-stream@^1.1.0, zip-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04" + dependencies: + archiver-utils "^1.3.0" + compress-commons "^1.2.0" + lodash "^4.8.0" + readable-stream "^2.0.0" + +zone.js@0.8.12: + version "0.8.12" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.12.tgz#86ff5053c98aec291a0bf4bbac501d694a05cfbb"