diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 00000000000..99fea4eb3b8
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,83 @@
+module.exports = {
+ "rules": {
+ // the rules below should be sorted in a same way they are sorted on http://eslint.org/docs/rules page
+ // http://eslint.org/docs/rules/#possible-errors
+ "no-caller": 2,
+ "no-control-regex": 2,
+ "no-empty": 1,
+ "no-invalid-regexp": 2,
+ "no-regex-spaces": 2,
+ "no-unsafe-negation": 1,
+ "valid-jsdoc": 0,
+ "valid-typeof": 2,
+ // http://eslint.org/docs/rules/#best-practices
+ "curly": 2,
+ "eqeqeq": [2, "smart"],
+ "guard-for-in": 0,
+ "no-else-return": 1,
+ "no-fallthrough": 2,
+ "no-invalid-this": 1,
+ "no-iterator": 2,
+ "no-loop-func": 2,
+ "no-multi-str": 2,
+ "no-new-func": 2,
+ "no-new-wrappers": 2,
+ "no-new": 2,
+ "no-proto": 2,
+ "no-script-url": 2,
+ "wrap-iife": [2, "outside"],
+ // http://eslint.org/docs/rules/#strict-mode
+ "strict": 2,
+ // http://eslint.org/docs/rules/#variables
+ "no-shadow-restricted-names": 2,
+ "no-shadow": 1,
+ "no-undef": 2,
+ "no-unused-vars": [1, {"vars": "all", "args": "none"}],
+ "no-use-before-define": 0,
+ // http://eslint.org/docs/rules/#nodejs-and-commonjs
+ "no-new-require": 2,
+ // http://eslint.org/docs/rules/#stylistic-issues
+ "block-spacing": 1,
+ "brace-style": [1, "1tbs", { allowSingleLine: true }],
+ "camelcase": 1,
+ "comma-dangle": 2,
+ "comma-spacing": 1,
+ "comma-style": [1, "last"],
+ "computed-property-spacing": 1,
+ "eol-last": 1,
+ "func-call-spacing": 1,
+ "indent": [1, 4],
+ "key-spacing": [1, { beforeColon: false, afterColon: true }],
+ "max-len": [1, 120],
+ "new-cap": [0, {
+ "capIsNewExceptions": [
+ "$.Deferred",
+ "$.Event",
+ "CodeMirror.Pos",
+ "Immutable.Map",
+ "Immutable.List",
+ "JSLINT"
+ ]
+ }],
+ "new-parens": 2,
+ "no-bitwise": 2,
+ "no-new-object": 2,
+ "no-trailing-spaces": 1,
+ "semi-spacing": 1,
+ "semi": 2
+ },
+ "globals": {
+ "$": false,
+ "brackets": false,
+ "clearTimeout": false,
+ "console": false,
+ "define": false,
+ "require": false,
+ "setTimeout": false,
+ "window": false,
+ "ArrayBuffer": false,
+ "Uint32Array": false,
+ "WebSocket": false,
+ "XMLHttpRequest": false
+ }
+};
diff --git a/.eslintrc.json b/.eslintrc.json
deleted file mode 100644
index 4e9117a0459..00000000000
--- a/.eslintrc.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "rules": {
- "no-bitwise": 2,
- "curly": 2,
- "eqeqeq": 2,
- "guard-for-in": 0,
- "wrap-iife": [2, "outside"],
- "no-use-before-define": 0,
- "new-cap": [0, {
- "capIsNewExceptions": [
- "$.Deferred",
- "$.Event",
- "CodeMirror.Pos",
- "Immutable.Map",
- "Immutable.List",
- "JSLINT"
- ]}],
- "no-caller": 2,
- "no-empty": 0,
- "no-new": 2,
- "no-invalid-regexp": 2,
- "no-control-regex": 2,
- "no-regex-spaces": 2,
- "no-undef": 2,
- "strict": 2,
- "no-unused-vars": [0, {"vars": "all", "args": "none"}],
- "semi": 2,
-
- "no-iterator": 2,
- "no-loop-func": 2,
- "no-multi-str": 2,
- "no-fallthrough": 2,
- "no-proto": 2,
- "no-script-url": 2,
- "no-shadow": 0,
- "no-shadow-restricted-names": 2,
- "no-new-func": 2,
- "no-new-wrappers": 2,
- "no-new-require": 2,
- "new-parens": 2,
- "no-new-object": 2,
- "no-invalid-this": 0,
- "indent": [0, 4],
-
- "valid-jsdoc": 0,
- "valid-typeof": 2,
-
- "no-trailing-spaces": 0,
- "eol-last": 0
- },
- "globals": {
- "brackets": false,
-
- "require": false,
- "define": false,
- "$": false,
-
- "window": false,
- "console": false,
- "setTimeout": false,
- "clearTimeout": false,
-
- "ArrayBuffer": false,
- "XMLHttpRequest": false,
- "Uint32Array": false,
- "WebSocket": false
- }
-}
diff --git a/.gitignore b/.gitignore
index a7ff9346eee..41dc4b68697 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,13 @@ Thumbs.db
/node_modules
/npm-debug.log
+# ignore node_modules inside src
+/src/node_modules
+
+# ignore files copied from node_modules to src/thirdparty
+/src/thirdparty/CodeMirror
+/src/thirdparty/less.min.js
+
# ignore compiled files
/dist
/src/.index.html
@@ -16,13 +23,16 @@ Thumbs.db
# ignore everything in the dev extension directory EXCEPT the README
# (so that the directory is non-empty and can be in git)
/src/extensions/dev/*
-!/src/extensions/dev/README
+!/src/extensions/dev/README.*
/src/extensions/disabled
# ignore .disabled file for default extensions
/src/extensions/default/*/.disabled
+# generate through grunt
+/src/config.json
+
#OSX .DS_Store files
.DS_Store
@@ -39,3 +49,5 @@ Thumbs.db
# Files that can be automatically downloaded that we don't want to ship with our builds
/src/extensibility/node/node_modules/request/tests/
+# Files build by scripts
+/src/thirdparty/semver.browser.js
diff --git a/.gitmodules b/.gitmodules
index 99f7ae246b7..403668b6862 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,6 +1,3 @@
-[submodule "src/thirdparty/CodeMirror"]
- path = src/thirdparty/CodeMirror
- url = https://github.com/adobe/CodeMirror2.git
[submodule "src/thirdparty/path-utils"]
path = src/thirdparty/path-utils
url = https://github.com/jblas/path-utils.git
diff --git a/.travis.yml b/.travis.yml
index 5f431ee20ee..464408502fc 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,7 +1,7 @@
language: node_js
sudo: false # use container-based Travis infrastructure
node_js:
- - "0.10"
+ - "6"
before_script:
- npm install -g grunt-cli
- npm install -g jasmine-node
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000000..620998fda66
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,74 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, gender identity and expression, level of experience,
+nationality, personal appearance, race, religion, or sexual identity and
+orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at [admin@brackets.io](mailto:admin@brackets.io). All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
\ No newline at end of file
diff --git a/Gruntfile.js b/Gruntfile.js
index 62278c7110e..7b08d8738a1 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -69,6 +69,7 @@ module.exports = function (grunt) {
'dependencies.js',
'thirdparty/requirejs/require.js',
'LiveDevelopment/launch.html',
+ 'LiveDevelopment/transports/**',
'LiveDevelopment/MultiBrowserImpl/transports/**',
'LiveDevelopment/MultiBrowserImpl/launchers/**'
]
@@ -103,13 +104,7 @@ module.exports = function (grunt) {
'!extensions/default/*/thirdparty/**/*.htm{,l}',
'extensions/dev/*',
'extensions/samples/**/*',
- 'thirdparty/CodeMirror/addon/{,*/}*',
- 'thirdparty/CodeMirror/keymap/{,*/}*',
- 'thirdparty/CodeMirror/lib/{,*/}*',
- 'thirdparty/CodeMirror/mode/{,*/}*',
- '!thirdparty/CodeMirror/mode/**/*.html',
- '!thirdparty/CodeMirror/**/*test.js',
- 'thirdparty/CodeMirror/theme/{,*/}*',
+ 'thirdparty/CodeMirror/**',
'thirdparty/i18n/*.js',
'thirdparty/text/*.js'
]
@@ -122,6 +117,31 @@ module.exports = function (grunt) {
src: ['jsTreeTheme.css', 'fonts/{,*/}*.*', 'images/*', 'brackets.min.css*']
}
]
+ },
+ thirdparty: {
+ files: [
+ {
+ expand: true,
+ dest: 'src/thirdparty/CodeMirror',
+ cwd: 'src/node_modules/codemirror',
+ src: [
+ 'addon/{,*/}*',
+ 'keymap/{,*/}*',
+ 'lib/{,*/}*',
+ 'mode/{,*/}*',
+ 'theme/{,*/}*'
+ ]
+ },
+ {
+ expand: true,
+ flatten: true,
+ dest: 'src/thirdparty',
+ cwd: 'src/node_modules',
+ src: [
+ 'less/dist/less.min.js'
+ ]
+ }
+ ]
}
},
cleanempty: {
@@ -129,7 +149,7 @@ module.exports = function (grunt) {
force: true,
files: false
},
- src: ['dist/**/*'],
+ src: ['dist/**/*']
},
less: {
dist: {
@@ -248,21 +268,20 @@ module.exports = function (grunt) {
]
},
watch: {
- all : {
- files: ['**/*', '!**/node_modules/**'],
- tasks: ['eslint']
- },
- grunt : {
- files: ['<%= meta.grunt %>', 'tasks/**/*'],
+ grunt: {
+ files: ['<%= meta.grunt %>'],
tasks: ['eslint:grunt']
},
- src : {
- files: ['<%= meta.src %>', 'src/**/*'],
+ src: {
+ files: ['<%= meta.src %>'],
tasks: ['eslint:src']
},
- test : {
- files: ['<%= meta.test %>', 'test/**/*'],
+ test: {
+ files: ['<%= meta.test %>'],
tasks: ['eslint:test']
+ },
+ options: {
+ spawn: false
}
},
/* FIXME (jasonsanjose): how to handle extension tests */
@@ -276,14 +295,12 @@ module.exports = function (grunt) {
specs : '<%= meta.specs %>',
/* Keep in sync with test/SpecRunner.html dependencies */
vendor : [
- 'test/polyfills.js', /* For reference to why this polyfill is needed see Issue #7951. The need for this should go away once the version of phantomjs gets upgraded to 2.0 */
+ // For reference to why this polyfill is needed see Issue #7951.
+ // The need for this should go away once the version of phantomjs gets upgraded to 2.0
+ 'test/polyfills.js',
+
'src/thirdparty/jquery-2.1.3.min.js',
- 'src/thirdparty/CodeMirror/lib/codemirror.js',
- 'src/thirdparty/CodeMirror/lib/util/dialog.js',
- 'src/thirdparty/CodeMirror/lib/util/searchcursor.js',
- 'src/thirdparty/CodeMirror/addon/edit/closetag.js',
- 'src/thirdparty/CodeMirror/addon/selection/active-line.js',
- 'src/thirdparty/less-2.5.1.min.js'
+ 'src/thirdparty/less.min.js'
],
helpers : [
'test/spec/PhantomHelper.js'
@@ -323,7 +340,7 @@ module.exports = function (grunt) {
});
// task: install
- grunt.registerTask('install', ['write-config', 'less', 'npm-install-extensions']);
+ grunt.registerTask('install', ['write-config:dev', 'less', 'npm-install-source', 'pack-web-dependencies']);
// task: test
grunt.registerTask('test', ['eslint', 'jasmine', 'nls-check']);
@@ -331,10 +348,11 @@ module.exports = function (grunt) {
// task: set-release
// Update version number in package.json and rewrite src/config.json
- grunt.registerTask('set-release', ['update-release-number', 'write-config']);
+ grunt.registerTask('set-release', ['update-release-number', 'write-config:dev']);
// task: build
grunt.registerTask('build', [
+ 'write-config:dist',
'eslint:src',
'jasmine',
'clean',
@@ -346,7 +364,7 @@ module.exports = function (grunt) {
'concat',
/*'cssmin',*/
/*'uglify',*/
- 'copy',
+ 'copy:dist',
'npm-install',
'cleanempty',
'usemin',
diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md
new file mode 100644
index 00000000000..3e4397396b0
--- /dev/null
+++ b/ISSUE_TEMPLATE.md
@@ -0,0 +1,27 @@
+### Prerequisites
+
+* [ ] Can you reproduce the problem with `Debug -> Reload Without Extensions`?
+* [ ] Did you perform a cursory search to see if your bug or enhancement is already reported?
+* [ ] Did you read the [Troubleshooting guide](https://github.com/adobe/brackets/wiki/Troubleshooting)?
+
+For more information on how to write a good bug report read [here](https://github.com/adobe/brackets/wiki/How-to-Report-an-Issue)
+For more information on how to contribute read [here](https://github.com/adobe/brackets/blob/master/CONTRIBUTING.md)
+
+### Description
+
+[Description of the bug or feature]
+
+### Steps to Reproduce
+
+1. [First Step]
+2. [Second Step]
+3. [and so on...]
+
+**Expected behavior:** [What you expected to happen]
+
+**Actual behavior:** [What actually happened]
+
+### Versions
+
+Please include the OS and what version of the OS you're running.
+Please include the version of Brackets. You can find it under `Help -> About Brackets` (Windows and Linux) or `Brackets -> About Brackets` (macOS)
diff --git a/README.md b/README.md
index 3bc231e10d4..5860b0d27d5 100644
--- a/README.md
+++ b/README.md
@@ -34,6 +34,9 @@ The Linux version has most of the features of the Mac and Windows versions, but
is still missing a few things. See the [Linux wiki page](https://github.com/adobe/brackets/wiki/Linux-Version)
for a list of known issues and to find out how you can help.
+Additionally, for a list of common Linux installation issues and workarounds you can [visit this guide](https://github.com/adobe/brackets/wiki/Brackets-Linux-Guide).
+
+
#### Usage
By default, Brackets opens a folder containing some simple "Getting Started" content.
@@ -57,7 +60,6 @@ Having problems starting Brackets the first time, or not sure how to use Bracket
review [Troubleshooting](https://github.com/adobe/brackets/wiki/Troubleshooting), which helps
you to fix common problems and find extra help if needed.
-
Helping Brackets
----------------
@@ -118,3 +120,6 @@ Not sure you needed the exclamation point there, but we like your enthusiasm.
* **Blog:** http://blog.brackets.io/
* **IRC:** [#brackets on freenode](http://webchat.freenode.net/?channels=brackets)
+---
+
+Please note that this project is released with a [Contributor Code of Conduct](https://github.com/adobe/brackets/blob/master/CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.
diff --git a/build.json b/build.json
new file mode 100644
index 00000000000..df8cb28651d
--- /dev/null
+++ b/build.json
@@ -0,0 +1,6 @@
+{
+ "version": "release-1.10-prerelease-2",
+ "title" : "Brackets 1.10 Pre-release for community testing",
+ "description" : "This is a Brackets 1.10 pre-release build. This release adds native menus for Linux, Search History UI, pseudo selector and AtRules hints in CSS, CSS hints in style attribute value for HTML documents.",
+ "prerelease": true
+}
diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json
index 23f1f90405c..e5df87e2b5a 100644
--- a/npm-shrinkwrap.json
+++ b/npm-shrinkwrap.json
@@ -1,12 +1,103 @@
{
"name": "Brackets",
- "version": "1.8.0-0",
+ "version": "1.10.0-0",
"dependencies": {
+ "abbrev": {
+ "version": "1.1.0",
+ "from": "abbrev@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz"
+ },
+ "acorn": {
+ "version": "4.0.4",
+ "from": "acorn@4.0.4",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.4.tgz",
+ "dev": true
+ },
+ "acorn-dynamic-import": {
+ "version": "2.0.2",
+ "from": "acorn-dynamic-import@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "from": "acorn-jsx@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "from": "acorn@>=3.0.4 <4.0.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "adm-zip": {
+ "version": "0.4.4",
+ "from": "adm-zip@0.4.4",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz",
+ "dev": true
+ },
+ "ajv": {
+ "version": "4.11.5",
+ "from": "ajv@>=4.7.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.5.tgz",
+ "dev": true
+ },
+ "ajv-keywords": {
+ "version": "1.5.1",
+ "from": "ajv-keywords@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz",
+ "dev": true
+ },
+ "align-text": {
+ "version": "0.1.4",
+ "from": "align-text@>=0.1.3 <0.2.0",
+ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+ "dev": true
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "from": "amdefine@>=0.0.4",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "dev": true
+ },
+ "ansi-escapes": {
+ "version": "1.4.0",
+ "from": "ansi-escapes@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "from": "ansi-regex@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz"
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "from": "ansi-styles@>=2.2.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz"
+ },
"anymatch": {
"version": "1.3.0",
"from": "anymatch@1.3.0",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz"
},
+ "argparse": {
+ "version": "0.1.16",
+ "from": "argparse@>=0.1.11 <0.2.0",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz",
+ "dev": true,
+ "dependencies": {
+ "underscore.string": {
+ "version": "2.4.0",
+ "from": "underscore.string@>=2.4.0 <2.5.0",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz",
+ "dev": true
+ }
+ }
+ },
"arr-diff": {
"version": "2.0.0",
"from": "arr-diff@>=2.0.0 <3.0.0",
@@ -17,6 +108,24 @@
"from": "arr-flatten@>=1.0.1 <2.0.0",
"resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz"
},
+ "array-differ": {
+ "version": "1.0.0",
+ "from": "array-differ@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
+ "dev": true
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "from": "array-union@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "dev": true
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "from": "array-uniq@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "dev": true
+ },
"array-unique": {
"version": "0.2.1",
"from": "array-unique@>=0.2.1 <0.3.0",
@@ -27,20 +136,149 @@
"from": "arrify@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz"
},
+ "asap": {
+ "version": "2.0.5",
+ "from": "asap@>=2.0.3 <2.1.0",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "from": "asn1@>=0.2.3 <0.3.0",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz"
+ },
+ "asn1.js": {
+ "version": "4.9.1",
+ "from": "asn1.js@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz",
+ "dev": true
+ },
+ "assert": {
+ "version": "1.4.1",
+ "from": "assert@>=1.1.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
+ "dev": true
+ },
+ "assert-plus": {
+ "version": "0.2.0",
+ "from": "assert-plus@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz"
+ },
+ "async": {
+ "version": "2.1.4",
+ "from": "async@2.1.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz"
+ },
"async-each": {
"version": "1.0.1",
"from": "async-each@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz"
},
+ "asynckit": {
+ "version": "0.4.0",
+ "from": "asynckit@>=0.4.0 <0.5.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "from": "aws-sign2@>=0.6.0 <0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz"
+ },
+ "aws4": {
+ "version": "1.6.0",
+ "from": "aws4@>=1.2.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz"
+ },
+ "babel-code-frame": {
+ "version": "6.22.0",
+ "from": "babel-code-frame@>=6.16.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz",
+ "dev": true
+ },
"balanced-match": {
"version": "0.4.2",
"from": "balanced-match@>=0.4.1 <0.5.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz"
},
+ "base64-js": {
+ "version": "1.2.0",
+ "from": "base64-js@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+ "optional": true
+ },
+ "big.js": {
+ "version": "3.1.3",
+ "from": "big.js@>=3.1.3 <4.0.0",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz",
+ "dev": true
+ },
+ "binary": {
+ "version": "0.3.0",
+ "from": "binary@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz"
+ },
"binary-extensions": {
- "version": "1.5.0",
+ "version": "1.8.0",
"from": "binary-extensions@>=1.0.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.5.0.tgz"
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz"
+ },
+ "bl": {
+ "version": "0.9.5",
+ "from": "bl@>=0.9.0 <0.10.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz",
+ "dev": true,
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "from": "isarray@0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "from": "readable-stream@>=1.0.26 <1.1.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "dev": true
+ }
+ }
+ },
+ "bn.js": {
+ "version": "4.11.6",
+ "from": "bn.js@>=4.1.1 <5.0.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
+ "dev": true
+ },
+ "body-parser": {
+ "version": "1.14.2",
+ "from": "body-parser@>=1.14.0 <1.15.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz",
+ "dev": true,
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.4.13",
+ "from": "iconv-lite@0.4.13",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz",
+ "dev": true
+ },
+ "qs": {
+ "version": "5.2.0",
+ "from": "qs@5.2.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "boom": {
+ "version": "2.10.1",
+ "from": "boom@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz"
},
"brace-expansion": {
"version": "1.1.6",
@@ -52,26 +290,713 @@
"from": "braces@>=1.8.2 <2.0.0",
"resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz"
},
+ "brorand": {
+ "version": "1.1.0",
+ "from": "brorand@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "dev": true
+ },
+ "browserify-aes": {
+ "version": "1.0.6",
+ "from": "browserify-aes@>=1.0.4 <2.0.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz",
+ "dev": true
+ },
+ "browserify-cipher": {
+ "version": "1.0.0",
+ "from": "browserify-cipher@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz",
+ "dev": true
+ },
+ "browserify-des": {
+ "version": "1.0.0",
+ "from": "browserify-des@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz",
+ "dev": true
+ },
+ "browserify-rsa": {
+ "version": "4.0.1",
+ "from": "browserify-rsa@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+ "dev": true
+ },
+ "browserify-sign": {
+ "version": "4.0.0",
+ "from": "browserify-sign@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.0.tgz",
+ "dev": true
+ },
+ "browserify-zlib": {
+ "version": "0.1.4",
+ "from": "browserify-zlib@>=0.1.4 <0.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
+ "dev": true
+ },
+ "buffer": {
+ "version": "4.9.1",
+ "from": "buffer@>=4.3.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+ "dev": true
+ },
"buffer-shims": {
"version": "1.0.0",
"from": "buffer-shims@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz"
},
+ "buffer-xor": {
+ "version": "1.0.3",
+ "from": "buffer-xor@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "dev": true
+ },
+ "buffers": {
+ "version": "0.1.1",
+ "from": "buffers@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz"
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "from": "builtin-modules@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "dev": true
+ },
+ "builtin-status-codes": {
+ "version": "3.0.0",
+ "from": "builtin-status-codes@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "dev": true
+ },
+ "bytes": {
+ "version": "2.2.0",
+ "from": "bytes@2.2.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz",
+ "dev": true
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "from": "caller-path@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "dev": true
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "from": "callsites@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "1.2.1",
+ "from": "camelcase@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.11.0",
+ "from": "caseless@>=0.11.0 <0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz"
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "from": "center-align@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "dev": true
+ },
+ "chainsaw": {
+ "version": "0.1.0",
+ "from": "chainsaw@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz"
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "from": "chalk@>=1.1.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz"
+ },
"chokidar": {
- "version": "1.6.0",
- "from": "chokidar@1.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.0.tgz"
+ "version": "1.6.1",
+ "from": "chokidar@1.6.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.1.tgz"
+ },
+ "ci-info": {
+ "version": "1.0.0",
+ "from": "ci-info@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz",
+ "dev": true
+ },
+ "cipher-base": {
+ "version": "1.0.3",
+ "from": "cipher-base@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz",
+ "dev": true
+ },
+ "circular-json": {
+ "version": "0.3.1",
+ "from": "circular-json@>=0.3.1 <0.4.0",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz",
+ "dev": true
+ },
+ "clean-css": {
+ "version": "1.0.12",
+ "from": "clean-css@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-1.0.12.tgz",
+ "dev": true,
+ "dependencies": {
+ "commander": {
+ "version": "1.3.2",
+ "from": "commander@>=1.3.0 <1.4.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-1.3.2.tgz",
+ "dev": true
+ }
+ }
+ },
+ "cli-cursor": {
+ "version": "1.0.2",
+ "from": "cli-cursor@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
+ "dev": true
+ },
+ "cli-width": {
+ "version": "2.1.0",
+ "from": "cli-width@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz",
+ "dev": true
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "from": "cliui@>=2.1.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "wordwrap": {
+ "version": "0.0.2",
+ "from": "wordwrap@0.0.2",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+ "dev": true
+ }
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "from": "co@>=4.6.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "dev": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "from": "code-point-at@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "dev": true
+ },
+ "coffee-script": {
+ "version": "1.3.3",
+ "from": "coffee-script@>=1.3.3 <1.4.0",
+ "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz",
+ "dev": true
+ },
+ "colors": {
+ "version": "0.6.2",
+ "from": "colors@>=0.6.2 <0.7.0",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.5",
+ "from": "combined-stream@>=1.0.5 <1.1.0",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz"
+ },
+ "commander": {
+ "version": "2.9.0",
+ "from": "commander@>=2.9.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz"
},
"concat-map": {
"version": "0.0.1",
"from": "concat-map@0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
},
+ "concat-stream": {
+ "version": "1.6.0",
+ "from": "concat-stream@>=1.4.6 <2.0.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
+ "dev": true
+ },
+ "config-chain": {
+ "version": "1.1.11",
+ "from": "config-chain@>=1.1.8 <1.2.0",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz",
+ "dev": true
+ },
+ "console-browserify": {
+ "version": "1.1.0",
+ "from": "console-browserify@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+ "dev": true
+ },
+ "constants-browserify": {
+ "version": "1.0.0",
+ "from": "constants-browserify@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "dev": true
+ },
+ "content-type": {
+ "version": "1.0.2",
+ "from": "content-type@>=1.0.1 <1.1.0",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz",
+ "dev": true
+ },
"core-util-is": {
"version": "1.0.2",
"from": "core-util-is@>=1.0.0 <1.1.0",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"
},
+ "create-ecdh": {
+ "version": "4.0.0",
+ "from": "create-ecdh@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz",
+ "dev": true
+ },
+ "create-hash": {
+ "version": "1.1.2",
+ "from": "create-hash@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.2.tgz",
+ "dev": true
+ },
+ "create-hmac": {
+ "version": "1.1.4",
+ "from": "create-hmac@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.4.tgz",
+ "dev": true
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "from": "cryptiles@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz"
+ },
+ "crypto-browserify": {
+ "version": "3.11.0",
+ "from": "crypto-browserify@>=3.11.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz",
+ "dev": true
+ },
+ "ctype": {
+ "version": "0.5.3",
+ "from": "ctype@0.5.3",
+ "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "d": {
+ "version": "0.1.1",
+ "from": "d@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz",
+ "dev": true
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "from": "dashdash@>=1.12.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "from": "assert-plus@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
+ }
+ }
+ },
+ "date-now": {
+ "version": "0.1.4",
+ "from": "date-now@>=0.1.4 <0.2.0",
+ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+ "dev": true
+ },
+ "dateformat": {
+ "version": "1.0.2-1.2.3",
+ "from": "dateformat@1.0.2-1.2.3",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.2.0",
+ "from": "debug@>=2.2.0 <2.3.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "ms": {
+ "version": "0.7.1",
+ "from": "ms@0.7.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "from": "decamelize@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "dev": true
+ },
+ "decompress-zip": {
+ "version": "0.3.0",
+ "from": "decompress-zip@0.3.0",
+ "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.0.tgz",
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "from": "isarray@0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "from": "readable-stream@>=1.1.8 <2.0.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz"
+ }
+ }
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "from": "deep-is@>=0.1.3 <0.2.0",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "dev": true
+ },
+ "del": {
+ "version": "2.2.2",
+ "from": "del@>=2.0.2 <3.0.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "dev": true
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "from": "delayed-stream@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
+ },
+ "depd": {
+ "version": "1.1.0",
+ "from": "depd@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz",
+ "dev": true
+ },
+ "des.js": {
+ "version": "1.0.0",
+ "from": "des.js@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+ "dev": true
+ },
+ "diffie-hellman": {
+ "version": "5.0.2",
+ "from": "diffie-hellman@>=5.0.0 <6.0.0",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "2.0.0",
+ "from": "doctrine@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz",
+ "dev": true
+ },
+ "domain-browser": {
+ "version": "1.1.7",
+ "from": "domain-browser@>=1.1.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz",
+ "dev": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "from": "ecc-jsbn@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+ "optional": true
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "from": "ee-first@1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "dev": true
+ },
+ "elliptic": {
+ "version": "6.4.0",
+ "from": "elliptic@>=6.0.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
+ "dev": true
+ },
+ "emojis-list": {
+ "version": "2.1.0",
+ "from": "emojis-list@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+ "dev": true
+ },
+ "enhanced-resolve": {
+ "version": "3.1.0",
+ "from": "enhanced-resolve@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz",
+ "dev": true
+ },
+ "errno": {
+ "version": "0.1.4",
+ "from": "errno@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "from": "error-ex@>=1.2.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "dev": true
+ },
+ "es5-ext": {
+ "version": "0.10.13",
+ "from": "es5-ext@>=0.10.11 <0.11.0",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.13.tgz",
+ "dev": true
+ },
+ "es6-iterator": {
+ "version": "2.0.0",
+ "from": "es6-iterator@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz",
+ "dev": true
+ },
+ "es6-map": {
+ "version": "0.1.5",
+ "from": "es6-map@>=0.1.3 <0.2.0",
+ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
+ "dev": true,
+ "dependencies": {
+ "d": {
+ "version": "1.0.0",
+ "from": "d@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+ "dev": true
+ },
+ "es5-ext": {
+ "version": "0.10.15",
+ "from": "es5-ext@>=0.10.14 <0.11.0",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.15.tgz",
+ "dev": true
+ },
+ "es6-iterator": {
+ "version": "2.0.1",
+ "from": "es6-iterator@>=2.0.1 <2.1.0",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz",
+ "dev": true
+ },
+ "es6-symbol": {
+ "version": "3.1.1",
+ "from": "es6-symbol@>=3.1.1 <3.2.0",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "es6-set": {
+ "version": "0.1.5",
+ "from": "es6-set@>=0.1.5 <0.2.0",
+ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
+ "dev": true,
+ "dependencies": {
+ "d": {
+ "version": "1.0.0",
+ "from": "d@1",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+ "dev": true
+ },
+ "es5-ext": {
+ "version": "0.10.15",
+ "from": "es5-ext@~0.10.14",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.15.tgz",
+ "dev": true
+ },
+ "es6-iterator": {
+ "version": "2.0.1",
+ "from": "es6-iterator@~2.0.1",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz",
+ "dev": true
+ },
+ "es6-symbol": {
+ "version": "3.1.1",
+ "from": "es6-symbol@3.1.1",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.0",
+ "from": "es6-symbol@>=3.1.0 <3.2.0",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.0.tgz",
+ "dev": true
+ },
+ "es6-weak-map": {
+ "version": "2.0.2",
+ "from": "es6-weak-map@>=2.0.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+ "dev": true,
+ "dependencies": {
+ "d": {
+ "version": "1.0.0",
+ "from": "d@1",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+ "dev": true
+ },
+ "es5-ext": {
+ "version": "0.10.15",
+ "from": "es5-ext@^0.10.14",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.15.tgz",
+ "dev": true
+ },
+ "es6-iterator": {
+ "version": "2.0.1",
+ "from": "es6-iterator@^2.0.1",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz",
+ "dev": true
+ },
+ "es6-symbol": {
+ "version": "3.1.1",
+ "from": "es6-symbol@^3.1.1",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "from": "escape-string-regexp@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+ },
+ "escope": {
+ "version": "3.6.0",
+ "from": "escope@>=3.6.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
+ "dev": true
+ },
+ "eslint": {
+ "version": "3.18.0",
+ "from": "eslint@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.18.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "argparse": {
+ "version": "1.0.9",
+ "from": "argparse@>=1.0.7 <2.0.0",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.3",
+ "from": "debug@>=2.1.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.3.tgz",
+ "dev": true
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "from": "esprima@>=3.1.1 <4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.8.2",
+ "from": "js-yaml@>=3.5.1 <4.0.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.2.tgz",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "from": "strip-bom@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "espree": {
+ "version": "3.4.0",
+ "from": "espree@>=3.1.6 <4.0.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.0.tgz",
+ "dev": true
+ },
+ "esprima": {
+ "version": "1.0.4",
+ "from": "esprima@>=1.0.2 <1.1.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.0.0",
+ "from": "esquery@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
+ "dev": true
+ },
+ "esrecurse": {
+ "version": "4.1.0",
+ "from": "esrecurse@>=4.1.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "estraverse": {
+ "version": "4.1.1",
+ "from": "estraverse@>=4.1.0 <4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "from": "estraverse@>=4.2.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "from": "esutils@>=2.0.2 <3.0.0",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "dev": true
+ },
+ "event-emitter": {
+ "version": "0.3.5",
+ "from": "event-emitter@>=0.3.5 <0.4.0",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "dev": true,
+ "dependencies": {
+ "d": {
+ "version": "1.0.0",
+ "from": "d@1",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+ "dev": true
+ },
+ "es5-ext": {
+ "version": "0.10.15",
+ "from": "es5-ext@~0.10.14",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.15.tgz",
+ "dev": true
+ }
+ }
+ },
+ "eventemitter2": {
+ "version": "0.4.14",
+ "from": "eventemitter2@>=0.4.13 <0.5.0",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
+ "dev": true
+ },
+ "events": {
+ "version": "1.1.1",
+ "from": "events@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
+ "dev": true
+ },
+ "evp_bytestokey": {
+ "version": "1.0.0",
+ "from": "evp_bytestokey@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz",
+ "dev": true
+ },
+ "exit": {
+ "version": "0.1.2",
+ "from": "exit@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "dev": true
+ },
+ "exit-hook": {
+ "version": "1.1.1",
+ "from": "exit-hook@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
+ "dev": true
+ },
"expand-brackets": {
"version": "0.1.5",
"from": "expand-brackets@>=0.1.4 <0.2.0",
@@ -82,30 +1007,211 @@
"from": "expand-range@>=1.8.1 <2.0.0",
"resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz"
},
+ "extend": {
+ "version": "3.0.0",
+ "from": "extend@>=3.0.0 <3.1.0",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz"
+ },
"extglob": {
"version": "0.3.2",
"from": "extglob@>=0.3.1 <0.4.0",
"resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz"
},
+ "extsprintf": {
+ "version": "1.0.2",
+ "from": "extsprintf@1.0.2",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz"
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "from": "fast-levenshtein@>=2.0.4 <2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "dev": true
+ },
+ "faye-websocket": {
+ "version": "0.10.0",
+ "from": "faye-websocket@>=0.10.0 <0.11.0",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
+ "dev": true
+ },
+ "figures": {
+ "version": "1.7.0",
+ "from": "figures@>=1.3.5 <2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+ "dev": true
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "from": "file-entry-cache@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "dev": true
+ },
"filename-regex": {
"version": "2.0.0",
"from": "filename-regex@>=2.0.0 <3.0.0",
"resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz"
},
+ "fileset": {
+ "version": "0.1.8",
+ "from": "fileset@>=0.1.5 <0.2.0",
+ "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.1.8.tgz",
+ "dev": true,
+ "dependencies": {
+ "glob": {
+ "version": "3.2.11",
+ "from": "glob@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz",
+ "dev": true,
+ "dependencies": {
+ "minimatch": {
+ "version": "0.3.0",
+ "from": "minimatch@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "minimatch": {
+ "version": "0.4.0",
+ "from": "minimatch@>=0.0.0 <1.0.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.4.0.tgz",
+ "dev": true
+ }
+ }
+ },
"fill-range": {
"version": "2.2.3",
"from": "fill-range@>=2.1.0 <3.0.0",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz"
},
+ "find-parent-dir": {
+ "version": "0.3.0",
+ "from": "find-parent-dir@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz",
+ "dev": true
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "from": "find-up@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "dev": true
+ },
+ "findup-sync": {
+ "version": "0.1.3",
+ "from": "findup-sync@>=0.1.2 <0.2.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz",
+ "dev": true,
+ "dependencies": {
+ "glob": {
+ "version": "3.2.11",
+ "from": "glob@>=3.2.9 <3.3.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz",
+ "dev": true
+ },
+ "lodash": {
+ "version": "2.4.2",
+ "from": "lodash@>=2.4.1 <2.5.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "0.3.0",
+ "from": "minimatch@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "flat-cache": {
+ "version": "1.2.2",
+ "from": "flat-cache@>=1.2.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz",
+ "dev": true
+ },
"for-in": {
- "version": "0.1.5",
- "from": "for-in@>=0.1.5 <0.2.0",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.5.tgz"
+ "version": "1.0.2",
+ "from": "for-in@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz"
},
"for-own": {
- "version": "0.1.4",
- "from": "for-own@>=0.1.3 <0.2.0",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.4.tgz"
+ "version": "0.1.5",
+ "from": "for-own@>=0.1.4 <0.2.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz"
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "from": "forever-agent@>=0.6.1 <0.7.0",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
+ },
+ "form-data": {
+ "version": "2.1.2",
+ "from": "form-data@>=2.1.1 <2.2.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz"
+ },
+ "fs-extra": {
+ "version": "2.0.0",
+ "from": "fs-extra@2.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.0.0.tgz"
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "from": "fs.realpath@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "dev": true
+ },
+ "gaze": {
+ "version": "0.3.4",
+ "from": "gaze@>=0.3.4 <0.4.0",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.3.4.tgz",
+ "dev": true,
+ "dependencies": {
+ "minimatch": {
+ "version": "0.2.14",
+ "from": "minimatch@>=0.2.9 <0.3.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
+ "dev": true
+ }
+ }
+ },
+ "generate-function": {
+ "version": "2.0.0",
+ "from": "generate-function@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz"
+ },
+ "generate-object-property": {
+ "version": "1.2.0",
+ "from": "generate-object-property@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz"
+ },
+ "get-caller-file": {
+ "version": "1.0.2",
+ "from": "get-caller-file@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+ "dev": true
+ },
+ "getobject": {
+ "version": "0.1.0",
+ "from": "getobject@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.6",
+ "from": "getpass@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz",
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "from": "assert-plus@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
+ }
+ }
+ },
+ "glob": {
+ "version": "7.1.1",
+ "from": "glob@7.1.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
+ "dev": true
},
"glob-base": {
"version": "0.3.0",
@@ -117,141 +1223,2963 @@
"from": "glob-parent@>=2.0.0 <3.0.0",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz"
},
+ "globals": {
+ "version": "9.16.0",
+ "from": "globals@>=9.2.0 <10.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.16.0.tgz",
+ "dev": true
+ },
+ "globby": {
+ "version": "5.0.0",
+ "from": "globby@>=5.0.0 <6.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "dev": true
+ },
+ "globule": {
+ "version": "1.1.0",
+ "from": "globule@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-1.1.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "lodash": {
+ "version": "4.16.6",
+ "from": "lodash@>=4.16.4 <4.17.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.6.tgz",
+ "dev": true
+ }
+ }
+ },
"graceful-fs": {
- "version": "4.1.6",
+ "version": "4.1.11",
"from": "graceful-fs@>=4.1.2 <5.0.0",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.6.tgz"
- },
- "inherits": {
- "version": "2.0.1",
- "from": "inherits@>=2.0.1 <3.0.0",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz"
},
- "is-binary-path": {
+ "graceful-readlink": {
"version": "1.0.1",
- "from": "is-binary-path@>=1.0.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz"
+ "from": "graceful-readlink@>=1.0.0",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz"
},
- "is-buffer": {
- "version": "1.1.4",
- "from": "is-buffer@>=1.0.2 <2.0.0",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz"
+ "growl": {
+ "version": "1.7.0",
+ "from": "growl@>=1.7.0 <1.8.0",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz",
+ "dev": true
},
- "is-dotfile": {
- "version": "1.0.2",
- "from": "is-dotfile@>=1.0.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz"
+ "grunt": {
+ "version": "0.4.5",
+ "from": "grunt@0.4.5",
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz",
+ "dev": true,
+ "dependencies": {
+ "async": {
+ "version": "0.1.22",
+ "from": "async@>=0.1.22 <0.2.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz",
+ "dev": true
+ },
+ "glob": {
+ "version": "3.1.21",
+ "from": "glob@>=3.1.21 <3.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "1.2.3",
+ "from": "graceful-fs@>=1.2.0 <1.3.0",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
+ "dev": true
+ },
+ "inherits": {
+ "version": "1.0.2",
+ "from": "inherits@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
+ "dev": true
+ },
+ "lodash": {
+ "version": "0.9.2",
+ "from": "lodash@>=0.9.2 <0.10.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "0.2.14",
+ "from": "minimatch@>=0.2.12 <0.3.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
+ "dev": true
+ },
+ "nopt": {
+ "version": "1.0.10",
+ "from": "nopt@>=1.0.10 <1.1.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+ "dev": true
+ }
+ }
},
- "is-equal-shallow": {
- "version": "0.1.3",
- "from": "is-equal-shallow@>=0.1.3 <0.2.0",
- "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz"
+ "grunt-cleanempty": {
+ "version": "1.0.3",
+ "from": "grunt-cleanempty@1.0.3",
+ "resolved": "https://registry.npmjs.org/grunt-cleanempty/-/grunt-cleanempty-1.0.3.tgz",
+ "dev": true
},
- "is-extendable": {
- "version": "0.1.1",
- "from": "is-extendable@>=0.1.1 <0.2.0",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz"
+ "grunt-cli": {
+ "version": "0.1.9",
+ "from": "grunt-cli@0.1.9",
+ "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-0.1.9.tgz",
+ "dev": true,
+ "dependencies": {
+ "nopt": {
+ "version": "1.0.10",
+ "from": "nopt@>=1.0.10 <1.1.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+ "dev": true
+ }
+ }
},
- "is-extglob": {
- "version": "1.0.0",
- "from": "is-extglob@>=1.0.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz"
+ "grunt-contrib-clean": {
+ "version": "0.4.1",
+ "from": "grunt-contrib-clean@0.4.1",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.4.1.tgz",
+ "dev": true
},
- "is-glob": {
- "version": "2.0.1",
- "from": "is-glob@>=2.0.1 <3.0.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz"
+ "grunt-contrib-concat": {
+ "version": "0.3.0",
+ "from": "grunt-contrib-concat@0.3.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-0.3.0.tgz",
+ "dev": true
},
- "is-number": {
- "version": "2.1.0",
- "from": "is-number@>=2.1.0 <3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz"
+ "grunt-contrib-copy": {
+ "version": "0.4.1",
+ "from": "grunt-contrib-copy@0.4.1",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-0.4.1.tgz",
+ "dev": true
},
- "is-posix-bracket": {
- "version": "0.1.1",
- "from": "is-posix-bracket@>=0.1.0 <0.2.0",
- "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz"
+ "grunt-contrib-cssmin": {
+ "version": "0.6.0",
+ "from": "grunt-contrib-cssmin@0.6.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-0.6.0.tgz",
+ "dev": true
},
- "is-primitive": {
- "version": "2.0.0",
- "from": "is-primitive@>=2.0.0 <3.0.0",
- "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz"
+ "grunt-contrib-htmlmin": {
+ "version": "0.1.3",
+ "from": "grunt-contrib-htmlmin@0.1.3",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-htmlmin/-/grunt-contrib-htmlmin-0.1.3.tgz",
+ "dev": true
},
- "isarray": {
- "version": "1.0.0",
- "from": "isarray@1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
+ "grunt-contrib-jasmine": {
+ "version": "0.4.2",
+ "from": "grunt-contrib-jasmine@0.4.2",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-jasmine/-/grunt-contrib-jasmine-0.4.2.tgz",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": {
+ "version": "1.1.14",
+ "from": "graceful-fs@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.1.14.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "rimraf": {
+ "version": "2.0.3",
+ "from": "rimraf@>=2.0.3 <2.1.0",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.0.3.tgz",
+ "dev": true
+ }
+ }
},
- "isobject": {
- "version": "2.1.0",
- "from": "isobject@>=2.0.0 <3.0.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz"
+ "grunt-contrib-less": {
+ "version": "1.4.0",
+ "from": "grunt-contrib-less@1.4.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-1.4.0.tgz",
+ "dev": true
},
- "kind-of": {
- "version": "3.0.4",
- "from": "kind-of@>=3.0.2 <4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.4.tgz"
+ "grunt-contrib-requirejs": {
+ "version": "0.4.1",
+ "from": "grunt-contrib-requirejs@0.4.1",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-requirejs/-/grunt-contrib-requirejs-0.4.1.tgz",
+ "dev": true
},
- "lodash": {
- "version": "4.15.0",
- "from": "lodash@4.15.0",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.15.0.tgz"
+ "grunt-contrib-uglify": {
+ "version": "0.2.0",
+ "from": "grunt-contrib-uglify@0.2.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.2.0.tgz",
+ "dev": true
+ },
+ "grunt-contrib-watch": {
+ "version": "1.0.0",
+ "from": "grunt-contrib-watch@1.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.0.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "from": "async@>=1.5.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "dev": true
+ },
+ "gaze": {
+ "version": "1.1.2",
+ "from": "gaze@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz",
+ "dev": true
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "from": "lodash@>=3.10.1 <4.0.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "dev": true
+ }
+ }
+ },
+ "grunt-eslint": {
+ "version": "19.0.0",
+ "from": "grunt-eslint@19.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-19.0.0.tgz",
+ "dev": true
+ },
+ "grunt-jasmine-node": {
+ "version": "0.1.0",
+ "from": "grunt-jasmine-node@0.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-jasmine-node/-/grunt-jasmine-node-0.1.0.tgz",
+ "dev": true
+ },
+ "grunt-legacy-log": {
+ "version": "0.1.3",
+ "from": "grunt-legacy-log@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz",
+ "dev": true,
+ "dependencies": {
+ "lodash": {
+ "version": "2.4.2",
+ "from": "lodash@>=2.4.1 <2.5.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
+ "dev": true
+ },
+ "underscore.string": {
+ "version": "2.3.3",
+ "from": "underscore.string@>=2.3.3 <2.4.0",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
+ "dev": true
+ }
+ }
+ },
+ "grunt-legacy-log-utils": {
+ "version": "0.1.1",
+ "from": "grunt-legacy-log-utils@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "lodash": {
+ "version": "2.4.2",
+ "from": "lodash@>=2.4.1 <2.5.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
+ "dev": true
+ },
+ "underscore.string": {
+ "version": "2.3.3",
+ "from": "underscore.string@>=2.3.3 <2.4.0",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
+ "dev": true
+ }
+ }
+ },
+ "grunt-legacy-util": {
+ "version": "0.2.0",
+ "from": "grunt-legacy-util@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "async": {
+ "version": "0.1.22",
+ "from": "async@>=0.1.22 <0.2.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz",
+ "dev": true
+ },
+ "lodash": {
+ "version": "0.9.2",
+ "from": "lodash@>=0.9.2 <0.10.0",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz",
+ "dev": true
+ }
+ }
+ },
+ "grunt-lib-contrib": {
+ "version": "0.6.1",
+ "from": "grunt-lib-contrib@>=0.6.0 <0.7.0",
+ "resolved": "https://registry.npmjs.org/grunt-lib-contrib/-/grunt-lib-contrib-0.6.1.tgz",
+ "dev": true
+ },
+ "grunt-lib-phantomjs": {
+ "version": "0.3.0",
+ "from": "grunt-lib-phantomjs@0.3.0",
+ "resolved": "https://registry.npmjs.org/grunt-lib-phantomjs/-/grunt-lib-phantomjs-0.3.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "semver": {
+ "version": "1.0.14",
+ "from": "semver@>=1.0.14 <1.1.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-1.0.14.tgz",
+ "dev": true
+ }
+ }
+ },
+ "grunt-targethtml": {
+ "version": "0.2.6",
+ "from": "grunt-targethtml@0.2.6",
+ "resolved": "https://registry.npmjs.org/grunt-targethtml/-/grunt-targethtml-0.2.6.tgz",
+ "dev": true
+ },
+ "grunt-template-jasmine-requirejs": {
+ "version": "0.1.0",
+ "from": "grunt-template-jasmine-requirejs@0.1.0",
+ "resolved": "https://registry.npmjs.org/grunt-template-jasmine-requirejs/-/grunt-template-jasmine-requirejs-0.1.0.tgz",
+ "dev": true
+ },
+ "grunt-usemin": {
+ "version": "0.1.11",
+ "from": "grunt-usemin@0.1.11",
+ "resolved": "https://registry.npmjs.org/grunt-usemin/-/grunt-usemin-0.1.11.tgz",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "from": "har-validator@>=2.0.6 <2.1.0",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz"
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "from": "has-ansi@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz"
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "from": "has-flag@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "dev": true
+ },
+ "hash.js": {
+ "version": "1.0.3",
+ "from": "hash.js@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.0.3.tgz",
+ "dev": true
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "from": "hawk@>=3.1.3 <3.2.0",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz"
+ },
+ "hmac-drbg": {
+ "version": "1.0.0",
+ "from": "hmac-drbg@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.0.tgz",
+ "dev": true
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "from": "hoek@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz"
+ },
+ "hooker": {
+ "version": "0.2.3",
+ "from": "hooker@>=0.2.3 <0.3.0",
+ "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
+ "dev": true
+ },
+ "hosted-git-info": {
+ "version": "2.2.0",
+ "from": "hosted-git-info@>=2.1.4 <3.0.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.2.0.tgz",
+ "dev": true
+ },
+ "html-minifier": {
+ "version": "0.5.6",
+ "from": "html-minifier@>=0.5.0 <0.6.0",
+ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-0.5.6.tgz",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.3.1",
+ "from": "http-errors@>=1.3.1 <1.4.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "from": "http-signature@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz"
+ },
+ "https-browserify": {
+ "version": "0.0.1",
+ "from": "https-browserify@0.0.1",
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz",
+ "dev": true
+ },
+ "husky": {
+ "version": "0.13.2",
+ "from": "husky@0.13.2",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-0.13.2.tgz",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": {
+ "version": "1.0.0",
+ "from": "normalize-path@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "iconv-lite": {
+ "version": "0.2.11",
+ "from": "iconv-lite@>=0.2.11 <0.3.0",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz",
+ "dev": true
+ },
+ "ieee754": {
+ "version": "1.1.8",
+ "from": "ieee754@>=1.1.4 <2.0.0",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
+ "dev": true
+ },
+ "ignore": {
+ "version": "3.2.6",
+ "from": "ignore@>=3.2.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.2.6.tgz",
+ "dev": true
+ },
+ "image-size": {
+ "version": "0.5.1",
+ "from": "image-size@>=0.5.0 <0.6.0",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.1.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "from": "imurmurhash@>=0.1.4 <0.2.0",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "dev": true
+ },
+ "indexof": {
+ "version": "0.0.1",
+ "from": "indexof@0.0.1",
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "from": "inflight@>=1.0.4 <2.0.0",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "dev": true
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "from": "inherits@>=2.0.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
+ },
+ "ini": {
+ "version": "1.3.4",
+ "from": "ini@>=1.2.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz",
+ "dev": true
+ },
+ "inquirer": {
+ "version": "0.12.0",
+ "from": "inquirer@>=0.12.0 <0.13.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz",
+ "dev": true
+ },
+ "interpret": {
+ "version": "1.0.1",
+ "from": "interpret@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.1.tgz",
+ "dev": true
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "from": "invert-kv@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "dev": true
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "from": "is-arrayish@>=0.2.1 <0.3.0",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "from": "is-binary-path@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz"
+ },
+ "is-buffer": {
+ "version": "1.1.5",
+ "from": "is-buffer@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz"
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "from": "is-builtin-module@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "dev": true
+ },
+ "is-ci": {
+ "version": "1.0.10",
+ "from": "is-ci@>=1.0.9 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz",
+ "dev": true
+ },
+ "is-dotfile": {
+ "version": "1.0.2",
+ "from": "is-dotfile@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz"
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "from": "is-equal-shallow@>=0.1.3 <0.2.0",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz"
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "from": "is-extendable@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz"
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "from": "is-extglob@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz"
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "from": "is-glob@>=2.0.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz"
+ },
+ "is-my-json-valid": {
+ "version": "2.16.0",
+ "from": "is-my-json-valid@>=2.12.4 <3.0.0",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz"
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "from": "is-number@>=2.1.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz"
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "from": "is-path-cwd@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "dev": true
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.0",
+ "from": "is-path-in-cwd@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
+ "dev": true
+ },
+ "is-path-inside": {
+ "version": "1.0.0",
+ "from": "is-path-inside@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz",
+ "dev": true
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "from": "is-posix-bracket@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz"
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "from": "is-primitive@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz"
+ },
+ "is-property": {
+ "version": "1.0.2",
+ "from": "is-property@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz"
+ },
+ "is-resolvable": {
+ "version": "1.0.0",
+ "from": "is-resolvable@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz",
+ "dev": true
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "from": "is-typedarray@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "from": "is-utf8@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "from": "isarray@1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "from": "isobject@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz"
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "from": "isstream@>=0.1.2 <0.2.0",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"
+ },
+ "jasmine": {
+ "version": "2.5.3",
+ "from": "jasmine@>=2.4.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.5.3.tgz",
+ "dev": true
+ },
+ "jasmine-core": {
+ "version": "2.5.2",
+ "from": "jasmine-core@>=2.5.2 <2.6.0",
+ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.5.2.tgz",
+ "dev": true
+ },
+ "jasmine-growl-reporter": {
+ "version": "0.0.3",
+ "from": "jasmine-growl-reporter@>=0.0.2 <0.1.0",
+ "resolved": "https://registry.npmjs.org/jasmine-growl-reporter/-/jasmine-growl-reporter-0.0.3.tgz",
+ "dev": true
+ },
+ "jasmine-node": {
+ "version": "1.11.0",
+ "from": "jasmine-node@1.11.0",
+ "resolved": "https://registry.npmjs.org/jasmine-node/-/jasmine-node-1.11.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "mkdirp": {
+ "version": "0.3.5",
+ "from": "mkdirp@>=0.3.5 <0.4.0",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz",
+ "dev": true
+ }
+ }
+ },
+ "jasmine-reporters": {
+ "version": "2.2.0",
+ "from": "jasmine-reporters@>=0.2.0",
+ "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.2.0.tgz",
+ "dev": true
+ },
+ "jodid25519": {
+ "version": "1.0.2",
+ "from": "jodid25519@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz",
+ "optional": true
+ },
+ "js-tokens": {
+ "version": "3.0.1",
+ "from": "js-tokens@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "2.0.5",
+ "from": "js-yaml@>=2.0.5 <2.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz",
+ "dev": true
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "from": "jsbn@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "optional": true
+ },
+ "json-loader": {
+ "version": "0.5.4",
+ "from": "json-loader@>=0.5.4 <0.6.0",
+ "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.4.tgz",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "from": "json-schema@0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz"
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "from": "json-stable-stringify@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "dev": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "from": "json-stringify-safe@>=5.0.1 <5.1.0",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
+ },
+ "json5": {
+ "version": "0.5.1",
+ "from": "json5@>=0.5.0 <0.6.0",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "2.4.0",
+ "from": "jsonfile@>=2.1.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz"
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "from": "jsonify@>=0.0.0 <0.1.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "dev": true
+ },
+ "jsonpointer": {
+ "version": "4.0.1",
+ "from": "jsonpointer@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz"
+ },
+ "jsprim": {
+ "version": "1.4.0",
+ "from": "jsprim@>=1.2.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz",
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "from": "assert-plus@1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
+ }
+ }
+ },
+ "junk": {
+ "version": "1.0.3",
+ "from": "junk@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz",
+ "dev": true
+ },
+ "kew": {
+ "version": "0.4.0",
+ "from": "kew@0.4.0",
+ "resolved": "https://registry.npmjs.org/kew/-/kew-0.4.0.tgz",
+ "dev": true
+ },
+ "keypress": {
+ "version": "0.1.0",
+ "from": "keypress@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.1.0",
+ "from": "kind-of@>=3.0.2 <4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.1.0.tgz"
+ },
+ "lazy-cache": {
+ "version": "1.0.4",
+ "from": "lazy-cache@>=1.0.3 <2.0.0",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "dev": true
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "from": "lcid@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "dev": true
+ },
+ "less": {
+ "version": "2.7.2",
+ "from": "less@>=2.7.1 <2.8.0",
+ "resolved": "https://registry.npmjs.org/less/-/less-2.7.2.tgz",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.3.0",
+ "from": "levn@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "dev": true
+ },
+ "livereload-js": {
+ "version": "2.2.2",
+ "from": "livereload-js@>=2.2.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.2.2.tgz",
+ "dev": true
+ },
+ "load-grunt-tasks": {
+ "version": "3.5.0",
+ "from": "load-grunt-tasks@3.5.0",
+ "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-3.5.0.tgz",
+ "dev": true
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "from": "load-json-file@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "dev": true
+ },
+ "loader-runner": {
+ "version": "2.3.0",
+ "from": "loader-runner@>=2.3.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz",
+ "dev": true
+ },
+ "loader-utils": {
+ "version": "0.2.17",
+ "from": "loader-utils@>=0.2.16 <0.3.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
+ "dev": true
+ },
+ "lodash": {
+ "version": "4.17.4",
+ "from": "lodash@4.17.4",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz"
+ },
+ "longest": {
+ "version": "1.0.1",
+ "from": "longest@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "2.7.3",
+ "from": "lru-cache@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
+ "dev": true
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "from": "media-typer@0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "dev": true
+ },
+ "memory-fs": {
+ "version": "0.4.1",
+ "from": "memory-fs@>=0.4.1 <0.5.0",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+ "dev": true
},
"micromatch": {
"version": "2.3.11",
"from": "micromatch@>=2.1.5 <3.0.0",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz"
},
+ "miller-rabin": {
+ "version": "4.0.0",
+ "from": "miller-rabin@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz",
+ "dev": true
+ },
+ "mime": {
+ "version": "1.2.11",
+ "from": "mime@>=1.2.11 <1.3.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "mime-db": {
+ "version": "1.26.0",
+ "from": "mime-db@>=1.26.0 <1.27.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.26.0.tgz"
+ },
+ "mime-types": {
+ "version": "2.1.14",
+ "from": "mime-types@>=2.1.7 <2.2.0",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.14.tgz"
+ },
+ "minimalistic-assert": {
+ "version": "1.0.0",
+ "from": "minimalistic-assert@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz",
+ "dev": true
+ },
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "from": "minimalistic-crypto-utils@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "dev": true
+ },
"minimatch": {
"version": "3.0.3",
"from": "minimatch@>=3.0.2 <4.0.0",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz"
},
+ "minimist": {
+ "version": "0.0.8",
+ "from": "minimist@0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "from": "mkdirp@>=0.5.0 <0.6.0",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "dev": true
+ },
+ "mkpath": {
+ "version": "0.1.0",
+ "from": "mkpath@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz"
+ },
+ "ms": {
+ "version": "0.7.2",
+ "from": "ms@0.7.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
+ "dev": true
+ },
+ "multimatch": {
+ "version": "2.1.0",
+ "from": "multimatch@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz",
+ "dev": true
+ },
+ "mute-stream": {
+ "version": "0.0.5",
+ "from": "mute-stream@0.0.5",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz",
+ "dev": true
+ },
+ "nan": {
+ "version": "1.0.0",
+ "from": "nan@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-1.0.0.tgz"
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "from": "natural-compare@>=1.4.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "dev": true
+ },
+ "node-libs-browser": {
+ "version": "2.0.0",
+ "from": "node-libs-browser@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz",
+ "dev": true
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "from": "nopt@>=3.0.1 <4.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz"
+ },
+ "normalize-package-data": {
+ "version": "2.3.6",
+ "from": "normalize-package-data@>=2.3.2 <3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.6.tgz",
+ "dev": true
+ },
"normalize-path": {
"version": "2.0.1",
"from": "normalize-path@>=2.0.1 <3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz"
},
+ "npm": {
+ "version": "3.10.9",
+ "from": "npm@3.10.9",
+ "resolved": "https://registry.npmjs.org/npm/-/npm-3.10.9.tgz",
+ "dependencies": {
+ "abbrev": {
+ "version": "1.0.9",
+ "from": "abbrev@1.0.9",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz"
+ },
+ "ansi-regex": {
+ "version": "2.0.0",
+ "from": "ansi-regex@2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz"
+ },
+ "ansicolors": {
+ "version": "0.3.2",
+ "from": "ansicolors@>=0.3.2 <0.4.0",
+ "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz"
+ },
+ "ansistyles": {
+ "version": "0.1.3",
+ "from": "ansistyles@>=0.1.3 <0.2.0",
+ "resolved": "https://registry.npmjs.org/ansistyles/-/ansistyles-0.1.3.tgz"
+ },
+ "aproba": {
+ "version": "1.0.4",
+ "from": "aproba@>=1.0.3 <1.1.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.0.4.tgz"
+ },
+ "archy": {
+ "version": "1.0.0",
+ "from": "archy@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz"
+ },
+ "asap": {
+ "version": "2.0.5",
+ "from": "asap@2.0.5",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz"
+ },
+ "chownr": {
+ "version": "1.0.1",
+ "from": "chownr@>=1.0.1 <1.1.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz"
+ },
+ "cmd-shim": {
+ "version": "2.0.2",
+ "from": "cmd-shim@2.0.2",
+ "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.2.tgz"
+ },
+ "columnify": {
+ "version": "1.5.4",
+ "from": "columnify@1.5.4",
+ "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz",
+ "dependencies": {
+ "wcwidth": {
+ "version": "1.0.0",
+ "from": "wcwidth@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.0.tgz",
+ "dependencies": {
+ "defaults": {
+ "version": "1.0.3",
+ "from": "defaults@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "dependencies": {
+ "clone": {
+ "version": "1.0.2",
+ "from": "clone@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "config-chain": {
+ "version": "1.1.11",
+ "from": "config-chain@1.1.11",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz",
+ "dependencies": {
+ "proto-list": {
+ "version": "1.2.4",
+ "from": "proto-list@>=1.2.1 <1.3.0",
+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz"
+ }
+ }
+ },
+ "debuglog": {
+ "version": "1.0.1",
+ "from": "debuglog@1.0.1",
+ "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz"
+ },
+ "dezalgo": {
+ "version": "1.0.3",
+ "from": "dezalgo@>=1.0.3 <1.1.0"
+ },
+ "editor": {
+ "version": "1.0.0",
+ "from": "editor@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/editor/-/editor-1.0.0.tgz"
+ },
+ "fs-vacuum": {
+ "version": "1.2.9",
+ "from": "fs-vacuum@latest",
+ "resolved": "https://registry.npmjs.org/fs-vacuum/-/fs-vacuum-1.2.9.tgz"
+ },
+ "fs-write-stream-atomic": {
+ "version": "1.0.8",
+ "from": "fs-write-stream-atomic@1.0.8"
+ },
+ "fstream": {
+ "version": "1.0.10",
+ "from": "fstream@>=1.0.10 <1.1.0",
+ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz"
+ },
+ "fstream-npm": {
+ "version": "1.2.0",
+ "from": "fstream-npm@latest",
+ "resolved": "https://registry.npmjs.org/fstream-npm/-/fstream-npm-1.2.0.tgz",
+ "dependencies": {
+ "fstream-ignore": {
+ "version": "1.0.5",
+ "from": "fstream-ignore@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz",
+ "dependencies": {
+ "minimatch": {
+ "version": "3.0.3",
+ "from": "minimatch@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
+ "dependencies": {
+ "brace-expansion": {
+ "version": "1.1.6",
+ "from": "brace-expansion@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz",
+ "dependencies": {
+ "balanced-match": {
+ "version": "0.4.2",
+ "from": "balanced-match@>=0.4.1 <0.5.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz"
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "from": "concat-map@0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "glob": {
+ "version": "7.1.0",
+ "from": "glob@7.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.0.tgz",
+ "dependencies": {
+ "fs.realpath": {
+ "version": "1.0.0",
+ "from": "fs.realpath@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
+ },
+ "minimatch": {
+ "version": "3.0.3",
+ "from": "minimatch@>=3.0.2 <4.0.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
+ "dependencies": {
+ "brace-expansion": {
+ "version": "1.1.6",
+ "from": "brace-expansion@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz",
+ "dependencies": {
+ "balanced-match": {
+ "version": "0.4.2",
+ "from": "balanced-match@>=0.4.1 <0.5.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz"
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "from": "concat-map@0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ }
+ }
+ }
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "from": "path-is-absolute@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
+ }
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.9",
+ "from": "graceful-fs@4.1.9",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.9.tgz"
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "from": "has-unicode@>=2.0.0 <2.1.0",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz"
+ },
+ "hosted-git-info": {
+ "version": "2.1.5",
+ "from": "hosted-git-info@latest",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.5.tgz"
+ },
+ "iferr": {
+ "version": "0.1.5",
+ "from": "iferr@>=0.1.5 <0.2.0",
+ "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz"
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "from": "imurmurhash@>=0.1.4 <0.2.0",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
+ },
+ "inflight": {
+ "version": "1.0.5",
+ "from": "inflight@latest",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz"
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "from": "inherits@2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
+ },
+ "ini": {
+ "version": "1.3.4",
+ "from": "ini@>=1.3.4 <1.4.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz"
+ },
+ "init-package-json": {
+ "version": "1.9.4",
+ "from": "init-package-json@latest",
+ "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.9.4.tgz",
+ "dependencies": {
+ "glob": {
+ "version": "6.0.4",
+ "from": "glob@>=6.0.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
+ "dependencies": {
+ "minimatch": {
+ "version": "3.0.3",
+ "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
+ "dependencies": {
+ "brace-expansion": {
+ "version": "1.1.6",
+ "from": "brace-expansion@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz",
+ "dependencies": {
+ "balanced-match": {
+ "version": "0.4.2",
+ "from": "balanced-match@>=0.4.1 <0.5.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz"
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "from": "concat-map@0.0.1"
+ }
+ }
+ }
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.0",
+ "from": "path-is-absolute@>=1.0.0 <2.0.0"
+ }
+ }
+ },
+ "promzard": {
+ "version": "0.3.0",
+ "from": "promzard@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz"
+ }
+ }
+ },
+ "lockfile": {
+ "version": "1.0.2",
+ "from": "lockfile@1.0.2",
+ "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.2.tgz"
+ },
+ "lodash._baseindexof": {
+ "version": "3.1.0",
+ "from": "lodash._baseindexof@3.1.0",
+ "resolved": "https://registry.npmjs.org/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz"
+ },
+ "lodash._baseuniq": {
+ "version": "4.6.0",
+ "from": "lodash._baseuniq@latest",
+ "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz",
+ "dependencies": {
+ "lodash._createset": {
+ "version": "4.0.3",
+ "from": "lodash._createset@>=4.0.0 <4.1.0",
+ "resolved": "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz"
+ },
+ "lodash._root": {
+ "version": "3.0.1",
+ "from": "lodash._root@>=3.0.0 <3.1.0",
+ "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz"
+ }
+ }
+ },
+ "lodash._bindcallback": {
+ "version": "3.0.1",
+ "from": "lodash._bindcallback@3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz"
+ },
+ "lodash._cacheindexof": {
+ "version": "3.0.2",
+ "from": "lodash._cacheindexof@3.0.2",
+ "resolved": "https://registry.npmjs.org/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz"
+ },
+ "lodash._createcache": {
+ "version": "3.1.2",
+ "from": "lodash._createcache@3.1.2",
+ "resolved": "https://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz"
+ },
+ "lodash._getnative": {
+ "version": "3.9.1",
+ "from": "lodash._getnative@3.9.1",
+ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz"
+ },
+ "lodash.clonedeep": {
+ "version": "4.5.0",
+ "from": "lodash.clonedeep@4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz"
+ },
+ "lodash.restparam": {
+ "version": "3.6.1",
+ "from": "lodash.restparam@3.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz"
+ },
+ "lodash.union": {
+ "version": "4.6.0",
+ "from": "lodash.union@4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz"
+ },
+ "lodash.uniq": {
+ "version": "4.5.0",
+ "from": "lodash.uniq@4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz"
+ },
+ "lodash.without": {
+ "version": "4.4.0",
+ "from": "lodash.without@4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.without/-/lodash.without-4.4.0.tgz"
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "from": "mkdirp@>=0.5.1 <0.6.0",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "from": "minimist@0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"
+ }
+ }
+ },
+ "node-gyp": {
+ "version": "3.4.0",
+ "from": "node-gyp@latest",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.4.0.tgz",
+ "dependencies": {
+ "minimatch": {
+ "version": "3.0.3",
+ "from": "minimatch@>=3.0.2 <4.0.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
+ "dependencies": {
+ "brace-expansion": {
+ "version": "1.1.6",
+ "from": "brace-expansion@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz",
+ "dependencies": {
+ "balanced-match": {
+ "version": "0.4.2",
+ "from": "balanced-match@>=0.4.1 <0.5.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz"
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "from": "concat-map@0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ }
+ }
+ }
+ }
+ },
+ "npmlog": {
+ "version": "3.1.2",
+ "from": "npmlog@>=0.0.0 <1.0.0||>=1.0.0 <2.0.0||>=2.0.0 <3.0.0||>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-3.1.2.tgz",
+ "dependencies": {
+ "are-we-there-yet": {
+ "version": "1.1.2",
+ "from": "are-we-there-yet@~1.1.2",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz",
+ "dependencies": {
+ "delegates": {
+ "version": "1.0.0",
+ "from": "delegates@^1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz"
+ }
+ }
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "from": "console-control-strings@~1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz"
+ },
+ "gauge": {
+ "version": "2.6.0",
+ "from": "gauge@~2.6.0",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.6.0.tgz",
+ "dependencies": {
+ "has-color": {
+ "version": "0.1.7",
+ "from": "has-color@^0.1.7",
+ "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz"
+ },
+ "object-assign": {
+ "version": "4.1.0",
+ "from": "object-assign@^4.1.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz"
+ },
+ "signal-exit": {
+ "version": "3.0.0",
+ "from": "signal-exit@^3.0.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz"
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "from": "string-width@^1.0.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "dependencies": {
+ "code-point-at": {
+ "version": "1.0.0",
+ "from": "code-point-at@^1.0.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz",
+ "dependencies": {
+ "number-is-nan": {
+ "version": "1.0.0",
+ "from": "number-is-nan@^1.0.0",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz"
+ }
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "from": "is-fullwidth-code-point@^1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "dependencies": {
+ "number-is-nan": {
+ "version": "1.0.0",
+ "from": "number-is-nan@^1.0.0",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz"
+ }
+ }
+ }
+ }
+ },
+ "wide-align": {
+ "version": "1.1.0",
+ "from": "wide-align@^1.1.0",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz"
+ }
+ }
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "from": "set-blocking@~2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz"
+ }
+ }
+ },
+ "path-array": {
+ "version": "1.0.1",
+ "from": "path-array@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz",
+ "dependencies": {
+ "array-index": {
+ "version": "1.0.0",
+ "from": "array-index@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz",
+ "dependencies": {
+ "debug": {
+ "version": "2.2.0",
+ "from": "debug@>=2.2.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+ "dependencies": {
+ "ms": {
+ "version": "0.7.1",
+ "from": "ms@0.7.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz"
+ }
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.0",
+ "from": "es6-symbol@>=3.0.2 <4.0.0",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.0.tgz",
+ "dependencies": {
+ "d": {
+ "version": "0.1.1",
+ "from": "d@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz"
+ },
+ "es5-ext": {
+ "version": "0.10.12",
+ "from": "es5-ext@>=0.10.11 <0.11.0",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.12.tgz",
+ "dependencies": {
+ "es6-iterator": {
+ "version": "2.0.0",
+ "from": "es6-iterator@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "from": "nopt@>=3.0.6 <3.1.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz"
+ },
+ "normalize-git-url": {
+ "version": "3.0.2",
+ "from": "normalize-git-url@>=3.0.2 <3.1.0"
+ },
+ "normalize-package-data": {
+ "version": "2.3.5",
+ "from": "normalize-package-data@>=2.3.5 <2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz",
+ "dependencies": {
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "from": "is-builtin-module@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "dependencies": {
+ "builtin-modules": {
+ "version": "1.1.1",
+ "from": "builtin-modules@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz"
+ }
+ }
+ }
+ }
+ },
+ "npm-cache-filename": {
+ "version": "1.0.2",
+ "from": "npm-cache-filename@>=1.0.2 <1.1.0",
+ "resolved": "https://registry.npmjs.org/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz"
+ },
+ "npm-install-checks": {
+ "version": "3.0.0",
+ "from": "npm-install-checks@3.0.0"
+ },
+ "npm-package-arg": {
+ "version": "4.2.0",
+ "from": "npm-package-arg@4.2.0",
+ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-4.2.0.tgz"
+ },
+ "npm-registry-client": {
+ "version": "7.2.1",
+ "from": "npm-registry-client@7.2.1",
+ "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-7.2.1.tgz",
+ "dependencies": {
+ "concat-stream": {
+ "version": "1.5.2",
+ "from": "concat-stream@>=1.5.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz",
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.0.6",
+ "from": "readable-stream@>=2.0.0 <2.1.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+ "dependencies": {
+ "core-util-is": {
+ "version": "1.0.2",
+ "from": "core-util-is@>=1.0.0 <1.1.0"
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "from": "isarray@>=1.0.0 <1.1.0"
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "from": "process-nextick-args@>=1.0.6 <1.1.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz"
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "from": "string_decoder@>=0.10.0 <0.11.0"
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "from": "util-deprecate@>=1.0.1 <1.1.0"
+ }
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "from": "typedarray@>=0.0.5 <0.1.0",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
+ }
+ }
+ },
+ "npmlog": {
+ "version": "3.1.2",
+ "from": "npmlog@>=2.0.0 <2.1.0||>=3.1.0 <3.2.0",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-3.1.2.tgz",
+ "optional": true,
+ "dependencies": {
+ "are-we-there-yet": {
+ "version": "1.1.2",
+ "from": "are-we-there-yet@~1.1.2",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz",
+ "optional": true,
+ "dependencies": {
+ "delegates": {
+ "version": "1.0.0",
+ "from": "delegates@^1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "optional": true
+ }
+ }
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "from": "console-control-strings@~1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz"
+ },
+ "gauge": {
+ "version": "2.6.0",
+ "from": "gauge@~2.6.0",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.6.0.tgz",
+ "optional": true,
+ "dependencies": {
+ "has-color": {
+ "version": "0.1.7",
+ "from": "has-color@^0.1.7",
+ "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
+ "optional": true
+ },
+ "object-assign": {
+ "version": "4.1.0",
+ "from": "object-assign@^4.1.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz",
+ "optional": true
+ },
+ "signal-exit": {
+ "version": "3.0.0",
+ "from": "signal-exit@^3.0.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz",
+ "optional": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "from": "string-width@^1.0.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "dependencies": {
+ "code-point-at": {
+ "version": "1.0.0",
+ "from": "code-point-at@^1.0.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz",
+ "dependencies": {
+ "number-is-nan": {
+ "version": "1.0.0",
+ "from": "number-is-nan@^1.0.0",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz"
+ }
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "from": "is-fullwidth-code-point@^1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "dependencies": {
+ "number-is-nan": {
+ "version": "1.0.0",
+ "from": "number-is-nan@^1.0.0",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz"
+ }
+ }
+ }
+ }
+ },
+ "wide-align": {
+ "version": "1.1.0",
+ "from": "wide-align@^1.1.0",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz",
+ "optional": true
+ }
+ }
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "from": "set-blocking@~2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "optional": true
+ }
+ }
+ },
+ "retry": {
+ "version": "0.10.0",
+ "from": "retry@>=0.10.0 <0.11.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.0.tgz"
+ }
+ }
+ },
+ "npm-user-validate": {
+ "version": "0.1.5",
+ "from": "npm-user-validate@0.1.5",
+ "resolved": "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-0.1.5.tgz"
+ },
+ "npmlog": {
+ "version": "4.0.0",
+ "from": "npmlog@4.0.0",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.0.tgz",
+ "dependencies": {
+ "are-we-there-yet": {
+ "version": "1.1.2",
+ "from": "are-we-there-yet@>=1.1.2 <1.2.0",
+ "resolved": "http://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz",
+ "dependencies": {
+ "delegates": {
+ "version": "1.0.0",
+ "from": "delegates@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz"
+ }
+ }
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "from": "console-control-strings@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz"
+ },
+ "gauge": {
+ "version": "2.6.0",
+ "from": "gauge@>=2.6.0 <2.7.0",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.6.0.tgz",
+ "dependencies": {
+ "has-color": {
+ "version": "0.1.7",
+ "from": "has-color@>=0.1.7 <0.2.0",
+ "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz"
+ },
+ "object-assign": {
+ "version": "4.1.0",
+ "from": "object-assign@>=4.0.1 <5.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz"
+ },
+ "signal-exit": {
+ "version": "3.0.0",
+ "from": "signal-exit@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz"
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "from": "string-width@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "dependencies": {
+ "code-point-at": {
+ "version": "1.0.0",
+ "from": "code-point-at@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz",
+ "dependencies": {
+ "number-is-nan": {
+ "version": "1.0.0",
+ "from": "number-is-nan@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz"
+ }
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "dependencies": {
+ "number-is-nan": {
+ "version": "1.0.0",
+ "from": "number-is-nan@^1.0.0",
+ "resolved": "http://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz"
+ }
+ }
+ }
+ }
+ },
+ "wide-align": {
+ "version": "1.1.0",
+ "from": "wide-align@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz"
+ }
+ }
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "from": "set-blocking@>=2.0.0 <2.1.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz"
+ }
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "from": "once@1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
+ },
+ "opener": {
+ "version": "1.4.2",
+ "from": "opener@1.4.2",
+ "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.2.tgz"
+ },
+ "osenv": {
+ "version": "0.1.3",
+ "from": "osenv@>=0.1.3 <0.2.0",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.3.tgz",
+ "dependencies": {
+ "os-homedir": {
+ "version": "1.0.1",
+ "from": "os-homedir@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz"
+ },
+ "os-tmpdir": {
+ "version": "1.0.1",
+ "from": "os-tmpdir@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz"
+ }
+ }
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "from": "path-is-inside@1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz"
+ },
+ "read": {
+ "version": "1.0.7",
+ "from": "read@>=1.0.7 <1.1.0",
+ "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
+ "dependencies": {
+ "mute-stream": {
+ "version": "0.0.5",
+ "from": "mute-stream@>=0.0.4 <0.1.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz"
+ }
+ }
+ },
+ "read-cmd-shim": {
+ "version": "1.0.1",
+ "from": "read-cmd-shim@>=1.0.1 <1.1.0",
+ "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz"
+ },
+ "read-installed": {
+ "version": "4.0.3",
+ "from": "read-installed@>=4.0.3 <4.1.0",
+ "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz",
+ "dependencies": {
+ "util-extend": {
+ "version": "1.0.3",
+ "from": "util-extend@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz"
+ }
+ }
+ },
+ "read-package-json": {
+ "version": "2.0.4",
+ "from": "read-package-json@>=2.0.3 <2.1.0",
+ "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.4.tgz",
+ "dependencies": {
+ "glob": {
+ "version": "6.0.4",
+ "from": "glob@>=6.0.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
+ "dependencies": {
+ "minimatch": {
+ "version": "3.0.3",
+ "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
+ "dependencies": {
+ "brace-expansion": {
+ "version": "1.1.6",
+ "from": "brace-expansion@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz",
+ "dependencies": {
+ "balanced-match": {
+ "version": "0.4.2",
+ "from": "balanced-match@>=0.4.1 <0.5.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz"
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "from": "concat-map@0.0.1"
+ }
+ }
+ }
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.0",
+ "from": "path-is-absolute@>=1.0.0 <2.0.0"
+ }
+ }
+ },
+ "json-parse-helpfulerror": {
+ "version": "1.0.3",
+ "from": "json-parse-helpfulerror@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz",
+ "dependencies": {
+ "jju": {
+ "version": "1.3.0",
+ "from": "jju@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/jju/-/jju-1.3.0.tgz"
+ }
+ }
+ }
+ }
+ },
+ "read-package-tree": {
+ "version": "5.1.5",
+ "from": "read-package-tree@>=5.1.4 <5.2.0",
+ "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.1.5.tgz"
+ },
+ "readable-stream": {
+ "version": "2.1.5",
+ "from": "readable-stream@2.1.5",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz",
+ "dependencies": {
+ "buffer-shims": {
+ "version": "1.0.0",
+ "from": "buffer-shims@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz"
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "from": "core-util-is@>=1.0.0 <1.1.0"
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "from": "isarray@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "from": "process-nextick-args@>=1.0.6 <1.1.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz"
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "from": "string_decoder@>=0.10.0 <0.11.0"
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "from": "util-deprecate@>=1.0.1 <1.1.0",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+ }
+ }
+ },
+ "readdir-scoped-modules": {
+ "version": "1.0.2",
+ "from": "readdir-scoped-modules@1.0.2",
+ "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz"
+ },
+ "realize-package-specifier": {
+ "version": "3.0.3",
+ "from": "realize-package-specifier@>=3.0.2 <3.1.0"
+ },
+ "request": {
+ "version": "2.75.0",
+ "from": "request@2.75.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz",
+ "dependencies": {
+ "aws-sign2": {
+ "version": "0.6.0",
+ "from": "aws-sign2@>=0.6.0 <0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz"
+ },
+ "aws4": {
+ "version": "1.4.1",
+ "from": "aws4@>=1.2.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz"
+ },
+ "bl": {
+ "version": "1.1.2",
+ "from": "bl@>=1.1.2 <1.2.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz",
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.0.6",
+ "from": "readable-stream@>=2.0.5 <2.1.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+ "dependencies": {
+ "core-util-is": {
+ "version": "1.0.2",
+ "from": "core-util-is@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "from": "isarray@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "from": "process-nextick-args@>=1.0.6 <1.1.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz"
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "from": "string_decoder@>=0.10.0 <0.11.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "from": "util-deprecate@>=1.0.1 <1.1.0",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+ }
+ }
+ }
+ }
+ },
+ "caseless": {
+ "version": "0.11.0",
+ "from": "caseless@>=0.11.0 <0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz"
+ },
+ "combined-stream": {
+ "version": "1.0.5",
+ "from": "combined-stream@>=1.0.5 <1.1.0",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
+ "dependencies": {
+ "delayed-stream": {
+ "version": "1.0.0",
+ "from": "delayed-stream@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.0",
+ "from": "extend@>=3.0.0 <3.1.0",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz"
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "from": "forever-agent@>=0.6.1 <0.7.0",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
+ },
+ "form-data": {
+ "version": "2.0.0",
+ "from": "form-data@>=2.0.0 <2.1.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz",
+ "dependencies": {
+ "asynckit": {
+ "version": "0.4.0",
+ "from": "asynckit@>=0.4.0 <0.5.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
+ }
+ }
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "from": "har-validator@>=2.0.6 <2.1.0",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "from": "chalk@>=1.1.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "from": "ansi-styles@>=2.2.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz"
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "from": "escape-string-regexp@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "from": "has-ansi@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz"
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "from": "supports-color@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz"
+ }
+ }
+ },
+ "commander": {
+ "version": "2.9.0",
+ "from": "commander@>=2.9.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "dependencies": {
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "from": "graceful-readlink@>=1.0.0",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz"
+ }
+ }
+ },
+ "is-my-json-valid": {
+ "version": "2.15.0",
+ "from": "is-my-json-valid@>=2.12.4 <3.0.0",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz",
+ "dependencies": {
+ "generate-function": {
+ "version": "2.0.0",
+ "from": "generate-function@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz"
+ },
+ "generate-object-property": {
+ "version": "1.2.0",
+ "from": "generate-object-property@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+ "dependencies": {
+ "is-property": {
+ "version": "1.0.2",
+ "from": "is-property@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz"
+ }
+ }
+ },
+ "jsonpointer": {
+ "version": "4.0.0",
+ "from": "jsonpointer@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.0.tgz"
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "from": "xtend@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"
+ }
+ }
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "from": "pinkie-promise@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "dependencies": {
+ "pinkie": {
+ "version": "2.0.4",
+ "from": "pinkie@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz"
+ }
+ }
+ }
+ }
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "from": "hawk@>=3.1.3 <3.2.0",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+ "dependencies": {
+ "boom": {
+ "version": "2.10.1",
+ "from": "boom@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz"
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "from": "cryptiles@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz"
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "from": "hoek@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz"
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "from": "sntp@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz"
+ }
+ }
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "from": "http-signature@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+ "dependencies": {
+ "assert-plus": {
+ "version": "0.2.0",
+ "from": "assert-plus@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz"
+ },
+ "jsprim": {
+ "version": "1.3.1",
+ "from": "jsprim@>=1.2.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz",
+ "dependencies": {
+ "extsprintf": {
+ "version": "1.0.2",
+ "from": "extsprintf@1.0.2",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz"
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "from": "json-schema@0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz"
+ },
+ "verror": {
+ "version": "1.3.6",
+ "from": "verror@1.3.6",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz"
+ }
+ }
+ },
+ "sshpk": {
+ "version": "1.10.1",
+ "from": "sshpk@>=1.7.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.1.tgz",
+ "dependencies": {
+ "asn1": {
+ "version": "0.2.3",
+ "from": "asn1@>=0.2.3 <0.3.0",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz"
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "from": "assert-plus@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.0",
+ "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz",
+ "optional": true
+ },
+ "dashdash": {
+ "version": "1.14.0",
+ "from": "dashdash@>=1.12.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz"
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "from": "ecc-jsbn@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+ "optional": true
+ },
+ "getpass": {
+ "version": "0.1.6",
+ "from": "getpass@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz"
+ },
+ "jodid25519": {
+ "version": "1.0.2",
+ "from": "jodid25519@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz",
+ "optional": true
+ },
+ "jsbn": {
+ "version": "0.1.0",
+ "from": "jsbn@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz",
+ "optional": true
+ },
+ "tweetnacl": {
+ "version": "0.14.3",
+ "from": "tweetnacl@>=0.14.0 <0.15.0",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.3.tgz",
+ "optional": true
+ }
+ }
+ }
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "from": "is-typedarray@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "from": "isstream@>=0.1.2 <0.2.0",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "from": "json-stringify-safe@>=5.0.1 <5.1.0",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
+ },
+ "mime-types": {
+ "version": "2.1.12",
+ "from": "mime-types@>=2.1.7 <2.2.0",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.12.tgz",
+ "dependencies": {
+ "mime-db": {
+ "version": "1.24.0",
+ "from": "mime-db@>=1.24.0 <1.25.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.24.0.tgz"
+ }
+ }
+ },
+ "node-uuid": {
+ "version": "1.4.7",
+ "from": "node-uuid@>=1.4.7 <1.5.0",
+ "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz"
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "from": "oauth-sign@>=0.8.1 <0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz"
+ },
+ "qs": {
+ "version": "6.2.1",
+ "from": "qs@>=6.2.0 <6.3.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz"
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "from": "stringstream@>=0.0.4 <0.1.0",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz"
+ },
+ "tough-cookie": {
+ "version": "2.3.1",
+ "from": "tough-cookie@>=2.3.0 <2.4.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.1.tgz"
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "from": "tunnel-agent@>=0.4.1 <0.5.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz"
+ }
+ }
+ },
+ "retry": {
+ "version": "0.10.0",
+ "from": "retry@0.10.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.0.tgz"
+ },
+ "rimraf": {
+ "version": "2.5.4",
+ "from": "rimraf@2.5.4",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz"
+ },
+ "semver": {
+ "version": "5.3.0",
+ "from": "semver@5.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz"
+ },
+ "sha": {
+ "version": "2.0.1",
+ "from": "sha@>=2.0.1 <2.1.0",
+ "resolved": "https://registry.npmjs.org/sha/-/sha-2.0.1.tgz"
+ },
+ "slide": {
+ "version": "1.1.6",
+ "from": "slide@>=1.1.6 <1.2.0",
+ "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz"
+ },
+ "sorted-object": {
+ "version": "2.0.1",
+ "from": "sorted-object@2.0.1",
+ "resolved": "https://registry.npmjs.org/sorted-object/-/sorted-object-2.0.1.tgz"
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "from": "strip-ansi@*",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz"
+ },
+ "tar": {
+ "version": "2.2.1",
+ "from": "tar@>=2.2.1 <2.3.0",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
+ "dependencies": {
+ "block-stream": {
+ "version": "0.0.8",
+ "from": "block-stream@*",
+ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz"
+ }
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "from": "text-table@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
+ },
+ "uid-number": {
+ "version": "0.0.6",
+ "from": "uid-number@0.0.6",
+ "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz"
+ },
+ "umask": {
+ "version": "1.1.0",
+ "from": "umask@>=1.1.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz"
+ },
+ "unique-filename": {
+ "version": "1.1.0",
+ "from": "unique-filename@>=1.1.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz",
+ "dependencies": {
+ "unique-slug": {
+ "version": "2.0.0",
+ "from": "unique-slug@>=2.0.0 <3.0.0"
+ }
+ }
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "from": "unpipe@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.1",
+ "from": "validate-npm-package-license@3.0.1",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
+ "dependencies": {
+ "spdx-correct": {
+ "version": "1.0.2",
+ "from": "spdx-correct@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
+ "dependencies": {
+ "spdx-license-ids": {
+ "version": "1.2.0",
+ "from": "spdx-license-ids@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.0.tgz"
+ }
+ }
+ },
+ "spdx-expression-parse": {
+ "version": "1.0.2",
+ "from": "spdx-expression-parse@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.2.tgz",
+ "dependencies": {
+ "spdx-exceptions": {
+ "version": "1.0.4",
+ "from": "spdx-exceptions@>=1.0.4 <2.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.4.tgz"
+ },
+ "spdx-license-ids": {
+ "version": "1.2.0",
+ "from": "spdx-license-ids@>=1.0.0 <2.0.0"
+ }
+ }
+ }
+ }
+ },
+ "validate-npm-package-name": {
+ "version": "2.2.2",
+ "from": "validate-npm-package-name@>=2.2.2 <2.3.0",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-2.2.2.tgz",
+ "dependencies": {
+ "builtins": {
+ "version": "0.0.7",
+ "from": "builtins@0.0.7",
+ "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz"
+ }
+ }
+ },
+ "which": {
+ "version": "1.2.11",
+ "from": "which@1.2.11",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.2.11.tgz",
+ "dependencies": {
+ "isexe": {
+ "version": "1.1.2",
+ "from": "isexe@>=1.1.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz"
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "from": "wrappy@latest",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
+ },
+ "write-file-atomic": {
+ "version": "1.2.0",
+ "from": "write-file-atomic@1.2.0",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.2.0.tgz"
+ }
+ }
+ },
+ "npmconf": {
+ "version": "2.1.1",
+ "from": "npmconf@2.1.1",
+ "resolved": "https://registry.npmjs.org/npmconf/-/npmconf-2.1.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "once": {
+ "version": "1.3.3",
+ "from": "once@>=1.3.0 <1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
+ "dev": true
+ },
+ "semver": {
+ "version": "4.3.6",
+ "from": "semver@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0||>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
+ "dev": true
+ }
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "from": "number-is-nan@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "from": "oauth-sign@>=0.8.1 <0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz"
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "from": "object-assign@>=4.0.1 <5.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
+ },
"object.omit": {
- "version": "2.0.0",
+ "version": "2.0.1",
"from": "object.omit@>=2.0.0 <3.0.0",
- "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz"
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz"
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "from": "on-finished@>=2.3.0 <2.4.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "from": "once@>=1.3.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "dev": true
+ },
+ "onetime": {
+ "version": "1.1.0",
+ "from": "onetime@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+ "dev": true
+ },
+ "opn": {
+ "version": "4.0.2",
+ "from": "opn@4.0.2",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz"
+ },
+ "optimist": {
+ "version": "0.3.7",
+ "from": "optimist@>=0.3.5 <0.4.0",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz",
+ "dev": true
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "from": "optionator@>=0.8.1 <0.9.0",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "dev": true,
+ "dependencies": {
+ "wordwrap": {
+ "version": "1.0.0",
+ "from": "wordwrap@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "options": {
+ "version": "0.0.6",
+ "from": "options@>=0.0.5",
+ "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz"
+ },
+ "os-browserify": {
+ "version": "0.2.1",
+ "from": "os-browserify@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz",
+ "dev": true
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "from": "os-homedir@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "dev": true
+ },
+ "os-locale": {
+ "version": "1.4.0",
+ "from": "os-locale@>=1.4.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "dev": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "from": "os-tmpdir@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz"
+ },
+ "osenv": {
+ "version": "0.1.4",
+ "from": "osenv@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz",
+ "dev": true
+ },
+ "package": {
+ "version": "1.0.1",
+ "from": "package@>=1.0.0 <1.2.0",
+ "resolved": "https://registry.npmjs.org/package/-/package-1.0.1.tgz",
+ "dev": true
+ },
+ "pako": {
+ "version": "0.2.9",
+ "from": "pako@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+ "dev": true
+ },
+ "parse-asn1": {
+ "version": "5.1.0",
+ "from": "parse-asn1@>=5.0.0 <6.0.0",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz",
+ "dev": true
},
"parse-glob": {
"version": "3.0.4",
"from": "parse-glob@>=3.0.4 <4.0.0",
"resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz"
},
+ "parse-json": {
+ "version": "2.2.0",
+ "from": "parse-json@>=2.2.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "dev": true
+ },
+ "parseurl": {
+ "version": "1.3.1",
+ "from": "parseurl@>=1.3.0 <1.4.0",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz",
+ "dev": true
+ },
+ "path-browserify": {
+ "version": "0.0.0",
+ "from": "path-browserify@0.0.0",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "from": "path-exists@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "dev": true
+ },
"path-is-absolute": {
- "version": "1.0.0",
+ "version": "1.0.1",
"from": "path-is-absolute@>=1.0.0 <2.0.0",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz"
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "from": "path-is-inside@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "from": "path-parse@>=1.0.5 <2.0.0",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "dev": true
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "from": "path-type@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "dev": true
+ },
+ "pbkdf2": {
+ "version": "3.0.9",
+ "from": "pbkdf2@>=3.0.3 <4.0.0",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.9.tgz",
+ "dev": true
+ },
+ "phantomjs": {
+ "version": "1.9.18",
+ "from": "phantomjs@1.9.18",
+ "resolved": "https://registry.npmjs.org/phantomjs/-/phantomjs-1.9.18.tgz",
+ "dev": true,
+ "dependencies": {
+ "asn1": {
+ "version": "0.1.11",
+ "from": "asn1@0.1.11",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "assert-plus": {
+ "version": "0.1.5",
+ "from": "assert-plus@>=0.1.5 <0.2.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "async": {
+ "version": "0.9.2",
+ "from": "async@>=0.9.0 <0.10.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "aws-sign2": {
+ "version": "0.5.0",
+ "from": "aws-sign2@>=0.5.0 <0.6.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "boom": {
+ "version": "0.4.2",
+ "from": "boom@>=0.4.0 <0.5.0",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.6.0",
+ "from": "caseless@>=0.6.0 <0.7.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "0.0.7",
+ "from": "combined-stream@>=0.0.4 <0.1.0",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "cryptiles": {
+ "version": "0.2.2",
+ "from": "cryptiles@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "delayed-stream": {
+ "version": "0.0.5",
+ "from": "delayed-stream@0.0.5",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "forever-agent": {
+ "version": "0.5.2",
+ "from": "forever-agent@>=0.5.0 <0.6.0",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz",
+ "dev": true
+ },
+ "form-data": {
+ "version": "0.1.4",
+ "from": "form-data@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "fs-extra": {
+ "version": "0.23.1",
+ "from": "fs-extra@>=0.23.1 <0.24.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.23.1.tgz",
+ "dev": true
+ },
+ "hawk": {
+ "version": "1.1.1",
+ "from": "hawk@1.1.1",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "hoek": {
+ "version": "0.9.1",
+ "from": "hoek@>=0.9.0 <0.10.0",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "0.10.1",
+ "from": "http-signature@>=0.10.0 <0.11.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "mime-types": {
+ "version": "1.0.2",
+ "from": "mime-types@>=1.0.1 <1.1.0",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz",
+ "dev": true
+ },
+ "node-uuid": {
+ "version": "1.4.7",
+ "from": "node-uuid@>=1.4.0 <1.5.0",
+ "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.4.0",
+ "from": "oauth-sign@>=0.4.0 <0.5.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "qs": {
+ "version": "1.2.2",
+ "from": "qs@>=1.2.0 <1.3.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz",
+ "dev": true
+ },
+ "request": {
+ "version": "2.42.0",
+ "from": "request@2.42.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.42.0.tgz",
+ "dev": true
+ },
+ "sntp": {
+ "version": "0.2.4",
+ "from": "sntp@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "from": "pify@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "from": "pinkie@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz"
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "from": "pinkie-promise@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz"
+ },
+ "pkg-up": {
+ "version": "1.0.0",
+ "from": "pkg-up@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz",
+ "dev": true
+ },
+ "pluralize": {
+ "version": "1.2.1",
+ "from": "pluralize@>=1.2.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "from": "prelude-ls@>=1.1.2 <1.2.0",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "dev": true
},
"preserve": {
"version": "0.2.0",
"from": "preserve@>=0.2.0 <0.3.0",
"resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz"
},
+ "process": {
+ "version": "0.11.9",
+ "from": "process@>=0.11.0 <0.12.0",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.9.tgz",
+ "dev": true
+ },
"process-nextick-args": {
"version": "1.0.7",
"from": "process-nextick-args@>=1.0.6 <1.1.0",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz"
},
+ "progress": {
+ "version": "1.1.8",
+ "from": "progress@1.1.8",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
+ "dev": true
+ },
+ "promise": {
+ "version": "7.1.1",
+ "from": "promise@>=7.1.1 <8.0.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz",
+ "dev": true,
+ "optional": true
+ },
+ "proto-list": {
+ "version": "1.2.4",
+ "from": "proto-list@>=1.2.1 <1.3.0",
+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+ "dev": true
+ },
+ "prr": {
+ "version": "0.0.0",
+ "from": "prr@>=0.0.0 <0.1.0",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz",
+ "dev": true
+ },
+ "public-encrypt": {
+ "version": "4.0.0",
+ "from": "public-encrypt@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz",
+ "dev": true
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "from": "punycode@>=1.4.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz"
+ },
+ "q": {
+ "version": "1.4.1",
+ "from": "q@>=1.1.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz"
+ },
+ "qs": {
+ "version": "6.3.2",
+ "from": "qs@>=6.3.0 <6.4.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz"
+ },
+ "querystring": {
+ "version": "0.2.0",
+ "from": "querystring@0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "dev": true
+ },
+ "querystring-es3": {
+ "version": "0.2.1",
+ "from": "querystring-es3@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "dev": true
+ },
"randomatic": {
- "version": "1.1.5",
+ "version": "1.1.6",
"from": "randomatic@>=1.1.3 <2.0.0",
- "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz"
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz"
+ },
+ "randombytes": {
+ "version": "2.0.3",
+ "from": "randombytes@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.1.7",
+ "from": "raw-body@>=2.1.5 <2.2.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz",
+ "dev": true,
+ "dependencies": {
+ "bytes": {
+ "version": "2.4.0",
+ "from": "bytes@2.4.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
+ "dev": true
+ },
+ "iconv-lite": {
+ "version": "0.4.13",
+ "from": "iconv-lite@0.4.13",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz",
+ "dev": true
+ }
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "from": "read-pkg@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "dev": true
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "from": "read-pkg-up@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "dev": true
},
"readable-stream": {
- "version": "2.1.5",
+ "version": "2.2.5",
"from": "readable-stream@>=2.0.2 <3.0.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz"
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.5.tgz"
},
"readdirp": {
"version": "2.1.0",
"from": "readdirp@>=2.0.0 <3.0.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz"
},
+ "readline2": {
+ "version": "1.0.1",
+ "from": "readline2@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz",
+ "dev": true
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "from": "rechoir@>=0.6.2 <0.7.0",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "dev": true,
+ "dependencies": {
+ "resolve": {
+ "version": "1.3.2",
+ "from": "resolve@>=1.1.6 <2.0.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.2.tgz",
+ "dev": true
+ }
+ }
+ },
"regex-cache": {
"version": "0.4.3",
"from": "regex-cache@>=0.4.2 <0.5.0",
@@ -263,24 +4191,701 @@
"resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz"
},
"repeat-string": {
- "version": "1.5.4",
+ "version": "1.6.1",
"from": "repeat-string@>=1.5.2 <2.0.0",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz"
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz"
+ },
+ "request": {
+ "version": "2.79.0",
+ "from": "request@2.79.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz"
+ },
+ "request-progress": {
+ "version": "0.3.1",
+ "from": "request-progress@0.3.1",
+ "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.1.tgz",
+ "dev": true
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "from": "require-directory@>=2.1.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "from": "require-main-filename@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "dev": true
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "from": "require-uncached@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "dev": true
+ },
+ "requirejs": {
+ "version": "2.1.22",
+ "from": "requirejs@>=2.1.0 <2.2.0",
+ "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.1.22.tgz",
+ "dev": true
+ },
+ "resolve": {
+ "version": "0.3.1",
+ "from": "resolve@>=0.3.1 <0.4.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz",
+ "dev": true
+ },
+ "resolve-from": {
+ "version": "1.0.1",
+ "from": "resolve-from@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "dev": true
+ },
+ "resolve-pkg": {
+ "version": "0.1.0",
+ "from": "resolve-pkg@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-0.1.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "resolve-from": {
+ "version": "2.0.0",
+ "from": "resolve-from@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "restore-cursor": {
+ "version": "1.0.1",
+ "from": "restore-cursor@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
+ "dev": true
+ },
+ "rewire": {
+ "version": "1.1.2",
+ "from": "rewire@1.1.2",
+ "resolved": "https://registry.npmjs.org/rewire/-/rewire-1.1.2.tgz",
+ "dev": true
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "from": "right-align@>=0.1.1 <0.2.0",
+ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "2.2.8",
+ "from": "rimraf@>=2.2.6 <2.3.0",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz"
+ },
+ "ripemd160": {
+ "version": "1.0.1",
+ "from": "ripemd160@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-1.0.1.tgz",
+ "dev": true
+ },
+ "run-async": {
+ "version": "0.1.0",
+ "from": "run-async@>=0.1.0 <0.2.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz",
+ "dev": true
+ },
+ "rx-lite": {
+ "version": "3.1.2",
+ "from": "rx-lite@>=3.1.2 <4.0.0",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz",
+ "dev": true
+ },
+ "sax": {
+ "version": "0.6.1",
+ "from": "sax@>=0.6.1 <0.7.0",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.3.0",
+ "from": "semver@5.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz"
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "from": "set-blocking@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "dev": true
},
"set-immediate-shim": {
"version": "1.0.1",
"from": "set-immediate-shim@>=1.0.1 <2.0.0",
"resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz"
},
+ "setimmediate": {
+ "version": "1.0.5",
+ "from": "setimmediate@>=1.0.4 <2.0.0",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "dev": true
+ },
+ "sha.js": {
+ "version": "2.4.8",
+ "from": "sha.js@>=2.3.6 <3.0.0",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz",
+ "dev": true
+ },
+ "shelljs": {
+ "version": "0.7.7",
+ "from": "shelljs@>=0.7.5 <0.8.0",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz",
+ "dev": true
+ },
+ "sigmund": {
+ "version": "1.0.1",
+ "from": "sigmund@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "0.0.4",
+ "from": "slice-ansi@0.0.4",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
+ "dev": true
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "from": "sntp@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz"
+ },
+ "source-list-map": {
+ "version": "0.1.8",
+ "from": "source-list-map@>=0.1.7 <0.2.0",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.6",
+ "from": "source-map@>=0.5.3 <0.6.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
+ "dev": true
+ },
+ "spdx-correct": {
+ "version": "1.0.2",
+ "from": "spdx-correct@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "1.0.4",
+ "from": "spdx-expression-parse@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
+ "dev": true
+ },
+ "spdx-license-ids": {
+ "version": "1.2.2",
+ "from": "spdx-license-ids@>=1.0.2 <2.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "from": "sprintf-js@>=1.0.2 <1.1.0",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.11.0",
+ "from": "sshpk@>=1.7.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.11.0.tgz",
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "from": "assert-plus@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "from": "statuses@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "dev": true
+ },
+ "stream-browserify": {
+ "version": "2.0.1",
+ "from": "stream-browserify@>=2.0.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
+ "dev": true
+ },
+ "stream-http": {
+ "version": "2.6.3",
+ "from": "stream-http@>=2.3.1 <3.0.0",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.6.3.tgz",
+ "dev": true
+ },
"string_decoder": {
"version": "0.10.31",
"from": "string_decoder@>=0.10.0 <0.11.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
},
+ "string-width": {
+ "version": "1.0.2",
+ "from": "string-width@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "dev": true
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "from": "stringstream@>=0.0.4 <0.1.0",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz"
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "from": "strip-ansi@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz"
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "from": "strip-bom@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "from": "strip-json-comments@>=2.0.1 <2.1.0",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "from": "supports-color@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz"
+ },
+ "table": {
+ "version": "3.8.3",
+ "from": "table@>=3.7.8 <4.0.0",
+ "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz",
+ "dev": true,
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "from": "is-fullwidth-code-point@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.0.0",
+ "from": "string-width@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "tapable": {
+ "version": "0.2.6",
+ "from": "tapable@>=0.2.5 <0.3.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.6.tgz",
+ "dev": true
+ },
+ "temp": {
+ "version": "0.8.3",
+ "from": "temp@0.8.3",
+ "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz"
+ },
+ "temporary": {
+ "version": "0.0.8",
+ "from": "temporary@>=0.0.4 <0.1.0",
+ "resolved": "https://registry.npmjs.org/temporary/-/temporary-0.0.8.tgz",
+ "dev": true
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "from": "text-table@>=0.2.0 <0.3.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "dev": true
+ },
+ "throttleit": {
+ "version": "0.0.2",
+ "from": "throttleit@>=0.0.2 <0.1.0",
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz",
+ "dev": true
+ },
+ "through": {
+ "version": "2.3.8",
+ "from": "through@>=2.3.6 <3.0.0",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "dev": true
+ },
+ "timers-browserify": {
+ "version": "2.0.2",
+ "from": "timers-browserify@>=2.0.2 <3.0.0",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.2.tgz",
+ "dev": true
+ },
+ "tiny-lr": {
+ "version": "0.2.1",
+ "from": "tiny-lr@>=0.2.1 <0.3.0",
+ "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "qs": {
+ "version": "5.1.0",
+ "from": "qs@>=5.1.0 <5.2.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "tinycolor": {
+ "version": "0.0.1",
+ "from": "tinycolor@>=0.0.0 <1.0.0",
+ "resolved": "https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz"
+ },
+ "to-arraybuffer": {
+ "version": "1.0.1",
+ "from": "to-arraybuffer@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+ "dev": true
+ },
+ "touch": {
+ "version": "0.0.3",
+ "from": "touch@0.0.3",
+ "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz",
+ "dependencies": {
+ "nopt": {
+ "version": "1.0.10",
+ "from": "nopt@>=1.0.10 <1.1.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz"
+ }
+ }
+ },
+ "tough-cookie": {
+ "version": "2.3.2",
+ "from": "tough-cookie@>=2.3.0 <2.4.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz"
+ },
+ "traverse": {
+ "version": "0.3.9",
+ "from": "traverse@>=0.3.0 <0.4.0",
+ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz"
+ },
+ "tryit": {
+ "version": "1.0.3",
+ "from": "tryit@>=1.0.1 <2.0.0",
+ "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz",
+ "dev": true
+ },
+ "tty-browserify": {
+ "version": "0.0.0",
+ "from": "tty-browserify@0.0.0",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "from": "tunnel-agent@>=0.4.1 <0.5.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz"
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "from": "tweetnacl@>=0.14.0 <0.15.0",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "optional": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "from": "type-check@>=0.3.2 <0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.14",
+ "from": "type-is@>=1.6.10 <1.7.0",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.14.tgz",
+ "dev": true
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "from": "typedarray@>=0.0.6 <0.0.7",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "2.2.5",
+ "from": "uglify-js@>=2.2.1 <2.3.0",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz",
+ "dev": true,
+ "dependencies": {
+ "source-map": {
+ "version": "0.1.43",
+ "from": "source-map@>=0.1.7 <0.2.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
+ "dev": true
+ }
+ }
+ },
+ "uglify-to-browserify": {
+ "version": "1.0.2",
+ "from": "uglify-to-browserify@>=1.0.0 <1.1.0",
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+ "dev": true
+ },
+ "uid-number": {
+ "version": "0.0.5",
+ "from": "uid-number@0.0.5",
+ "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz",
+ "dev": true
+ },
+ "underscore": {
+ "version": "1.7.0",
+ "from": "underscore@>=1.7.0 <1.8.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
+ "dev": true
+ },
+ "underscore.string": {
+ "version": "2.2.1",
+ "from": "underscore.string@>=2.2.1 <2.3.0",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz",
+ "dev": true
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "from": "unpipe@1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "dev": true
+ },
+ "url": {
+ "version": "0.11.0",
+ "from": "url@>=0.11.0 <0.12.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "punycode": {
+ "version": "1.3.2",
+ "from": "punycode@1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "dev": true
+ }
+ }
+ },
+ "user-home": {
+ "version": "2.0.0",
+ "from": "user-home@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
+ "dev": true
+ },
+ "util": {
+ "version": "0.10.3",
+ "from": "util@>=0.10.3 <0.11.0",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "dev": true,
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "from": "inherits@2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "dev": true
+ }
+ }
+ },
"util-deprecate": {
"version": "1.0.2",
"from": "util-deprecate@>=1.0.1 <1.1.0",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+ },
+ "uuid": {
+ "version": "3.0.1",
+ "from": "uuid@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz"
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.1",
+ "from": "validate-npm-package-license@>=3.0.1 <4.0.0",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.3.6",
+ "from": "verror@1.3.6",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz"
+ },
+ "vm-browserify": {
+ "version": "0.0.4",
+ "from": "vm-browserify@0.0.4",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
+ "dev": true
+ },
+ "walkdir": {
+ "version": "0.0.11",
+ "from": "walkdir@>=0.0.1",
+ "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz",
+ "dev": true
+ },
+ "watchpack": {
+ "version": "1.3.1",
+ "from": "watchpack@>=1.2.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.3.1.tgz",
+ "dev": true
+ },
+ "webpack": {
+ "version": "2.2.1",
+ "from": "webpack@2.2.1",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.2.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "supports-color": {
+ "version": "3.2.3",
+ "from": "supports-color@>=3.1.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "2.8.12",
+ "from": "uglify-js@>=2.7.5 <3.0.0",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.12.tgz",
+ "dev": true,
+ "dependencies": {
+ "yargs": {
+ "version": "3.10.0",
+ "from": "yargs@>=3.10.0 <3.11.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "webpack-sources": {
+ "version": "0.1.5",
+ "from": "webpack-sources@>=0.1.4 <0.2.0",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.1.5.tgz",
+ "dev": true
+ },
+ "websocket-driver": {
+ "version": "0.6.5",
+ "from": "websocket-driver@>=0.5.1",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz",
+ "dev": true
+ },
+ "websocket-extensions": {
+ "version": "0.1.1",
+ "from": "websocket-extensions@>=0.1.1",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz",
+ "dev": true
+ },
+ "which": {
+ "version": "1.0.9",
+ "from": "which@>=1.0.5 <1.1.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz",
+ "dev": true
+ },
+ "which-module": {
+ "version": "1.0.0",
+ "from": "which-module@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+ "dev": true
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "from": "window-size@0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "dev": true
+ },
+ "wordwrap": {
+ "version": "0.0.3",
+ "from": "wordwrap@>=0.0.2 <0.1.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "from": "wrap-ansi@>=2.0.0 <3.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "from": "wrappy@>=1.0.0 <2.0.0",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "dev": true
+ },
+ "write": {
+ "version": "0.2.1",
+ "from": "write@>=0.2.1 <0.3.0",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "dev": true
+ },
+ "ws": {
+ "version": "0.4.32",
+ "from": "ws@>=0.4.31 <0.5.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-0.4.32.tgz",
+ "dependencies": {
+ "commander": {
+ "version": "2.1.0",
+ "from": "commander@>=2.1.0 <2.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz"
+ }
+ }
+ },
+ "xmldoc": {
+ "version": "0.1.4",
+ "from": "xmldoc@>=0.1.2 <0.2.0",
+ "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-0.1.4.tgz",
+ "dev": true
+ },
+ "xmldom": {
+ "version": "0.1.27",
+ "from": "xmldom@>=0.1.22 <0.2.0",
+ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
+ "dev": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "from": "xtend@>=4.0.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "from": "y18n@>=3.2.1 <4.0.0",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "dev": true
+ },
+ "yargs": {
+ "version": "6.6.0",
+ "from": "yargs@>=6.0.0 <7.0.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz",
+ "dev": true,
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "from": "camelcase@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "dev": true
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "from": "cliui@>=3.2.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "4.2.1",
+ "from": "yargs-parser@>=4.2.0 <5.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz",
+ "dev": true,
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "from": "camelcase@>=3.0.0 <4.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "dev": true
+ }
+ }
+ },
+ "zlib-browserify": {
+ "version": "0.0.1",
+ "from": "zlib-browserify@0.0.1",
+ "resolved": "https://registry.npmjs.org/zlib-browserify/-/zlib-browserify-0.0.1.tgz",
+ "dev": true
}
}
}
diff --git a/package.json b/package.json
index 950b6ba98fe..3a1a5b4746f 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "Brackets",
- "version": "1.8.0-0",
- "apiVersion": "1.8.0",
+ "version": "1.10.0-0",
+ "apiVersion": "1.10.0",
"homepage": "http://brackets.io",
"issues": {
"url": "http://github.com/adobe/brackets/issues"
@@ -14,26 +14,36 @@
},
"dependencies": {
"anymatch": "1.3.0",
- "chokidar": "1.6.0",
- "lodash": "4.15.0"
+ "async": "2.1.4",
+ "chokidar": "1.6.1",
+ "decompress-zip": "0.3.0",
+ "fs-extra": "2.0.0",
+ "lodash": "4.17.4",
+ "npm": "3.10.9",
+ "opn": "4.0.2",
+ "request": "2.79.0",
+ "semver": "5.3.0",
+ "temp": "0.8.3",
+ "ws": "~0.4.31"
},
"devDependencies": {
- "glob": "7.0.6",
+ "glob": "7.1.1",
"grunt": "0.4.5",
+ "husky": "0.13.2",
"jasmine-node": "1.11.0",
"grunt-jasmine-node": "0.1.0",
"grunt-cli": "0.1.9",
"phantomjs": "1.9.18",
"grunt-lib-phantomjs": "0.3.0",
- "grunt-eslint": "18.1.0",
- "grunt-contrib-watch": "0.4.3",
+ "grunt-eslint": "19.0.0",
+ "grunt-contrib-watch": "1.0.0",
"grunt-contrib-jasmine": "0.4.2",
"grunt-template-jasmine-requirejs": "0.1.0",
"grunt-contrib-cssmin": "0.6.0",
"grunt-contrib-clean": "0.4.1",
"grunt-contrib-copy": "0.4.1",
"grunt-contrib-htmlmin": "0.1.3",
- "grunt-contrib-less": "1.0.1",
+ "grunt-contrib-less": "1.4.0",
"grunt-contrib-requirejs": "0.4.1",
"grunt-contrib-uglify": "0.2.0",
"grunt-contrib-concat": "0.3.0",
@@ -41,13 +51,16 @@
"grunt-usemin": "0.1.11",
"load-grunt-tasks": "3.5.0",
"q": "1.4.1",
- "semver": "^4.1.0",
+ "rewire": "1.1.2",
"xmldoc": "^0.1.2",
- "grunt-cleanempty": "1.0.3"
+ "grunt-cleanempty": "1.0.3",
+ "webpack": "2.2.1"
},
"scripts": {
+ "prepush": "npm run eslint",
"postinstall": "grunt install",
- "test": "grunt cla-check-pull test"
+ "test": "grunt test cla-check-pull",
+ "eslint": "grunt eslint"
},
"licenses": [
{
@@ -55,4 +68,4 @@
"url": "https://github.com/adobe/brackets/blob/master/LICENSE"
}
]
-}
+}
\ No newline at end of file
diff --git a/samples/fr/Premiers pas/index.html b/samples/fr/Premiers pas/index.html
index cf1129c8ba2..1d8259cc5f0 100644
--- a/samples/fr/Premiers pas/index.html
+++ b/samples/fr/Premiers pas/index.html
@@ -14,7 +14,7 @@
PREMIERS PAS AVEC BRACKETS
Suivez le guide !
@@ -22,7 +22,7 @@
Suivez le guide !
Brackets se distingue des éditeurs traditionnels,
@@ -30,7 +30,7 @@
Suivez le guide !
Projets Brackets
@@ -45,7 +45,7 @@ Projets Brackets
Edition rapide des codes CSS et JavaScript
@@ -71,7 +71,7 @@
Edition rapide des codes CSS et JavaScript
Affichage des modifications HTML et CSS en direct dans le navigateur
@@ -114,7 +114,7 @@
Vous en voulez plus ? Jetez un œil du côté des extensions !
Participer
@@ -155,4 +155,4 @@
Participer
[:::::::::::::: ::::::::::::::]
[[[[[[[[[[[[[[[ ]]]]]]]]]]]]]]]
--->
\ No newline at end of file
+-->
diff --git a/samples/ja/Getting Started/index.html b/samples/ja/Getting Started/index.html
index 3b1f31734ee..fbe157b6e40 100644
--- a/samples/ja/Getting Started/index.html
+++ b/samples/ja/Getting Started/index.html
@@ -14,7 +14,7 @@ BRACKETS をはじめる前に
まずはこのガイドからスタート
@@ -22,7 +22,7 @@
まずはこのガイドからスタート
Brackets は、新しいタイプのエディターです。
@@ -30,7 +30,7 @@
まずはこのガイドからスタート
Brackets のプロジェクト
@@ -45,7 +45,7 @@ Brackets のプロジェクト
CSS と JavaScript のクイック編集
@@ -71,7 +71,7 @@
CSS と JavaScript のクイック編集
HTML および CSS の編集結果をブラウザーでライブプレビュー
@@ -114,7 +114,7 @@
拡張機能でさらに補強
Brackets プロジェクトに参加
@@ -155,4 +155,4 @@
Brackets プロジェクトに参加
[:::::::::::::: ::::::::::::::]
[[[[[[[[[[[[[[[ ]]]]]]]]]]]]]]]
--->
\ No newline at end of file
+-->
diff --git a/samples/zh-tw/Getting Started/index.html b/samples/zh-tw/Getting Started/index.html
index 71609b195a3..e37eb69de6a 100644
--- a/samples/zh-tw/Getting Started/index.html
+++ b/samples/zh-tw/Getting Started/index.html
@@ -154,7 +154,7 @@ 一起參與
Brackets 專案是開放原始碼的。世界各地的網頁開發者貢獻一己之力,只為打造出更好的程式編輯器。
也有不少人正在開發擴充功能,讓 Brackets 更強大。
- 告訴我們您的想法,分享您的 ieda,或是直接為本專案做點事吧。
+ 告訴我們您的想法,分享您的構想,或是直接為本專案做點事吧。
- Brackets.io
@@ -192,4 +192,4 @@ 一起參與
-->
-
\ No newline at end of file
+
diff --git a/src/LiveDevelopment/Agents/RemoteAgent.js b/src/LiveDevelopment/Agents/RemoteAgent.js
index 855b19a1873..7c084ed9bab 100644
--- a/src/LiveDevelopment/Agents/RemoteAgent.js
+++ b/src/LiveDevelopment/Agents/RemoteAgent.js
@@ -33,10 +33,11 @@
define(function RemoteAgent(require, exports, module) {
"use strict";
- var LiveDevelopment = require("LiveDevelopment/LiveDevelopment"),
- EventDispatcher = require("utils/EventDispatcher"),
- Inspector = require("LiveDevelopment/Inspector/Inspector"),
- RemoteFunctions = require("text!LiveDevelopment/Agents/RemoteFunctions.js");
+ var LiveDevelopment = require("LiveDevelopment/LiveDevelopment"),
+ EventDispatcher = require("utils/EventDispatcher"),
+ Inspector = require("LiveDevelopment/Inspector/Inspector"),
+ RemoteFunctions = require("text!LiveDevelopment/Agents/RemoteFunctions.js"),
+ PreferencesManager = require("preferences/PreferencesManager");
var _load; // deferred load
var _objectId; // the object id of the remote object
@@ -130,7 +131,7 @@ define(function RemoteAgent(require, exports, module) {
_stopKeepAliveInterval();
// inject RemoteFunctions
- var command = "window._LD=" + RemoteFunctions + "(" + LiveDevelopment.config.experimental + ");";
+ var command = "window._LD=" + RemoteFunctions + "(" + JSON.stringify(LiveDevelopment.config) + "," + PreferencesManager.get("livedev.wsPort") + ");";
Inspector.Runtime.evaluate(command, function onEvaluate(response) {
if (response.error || response.wasThrown) {
diff --git a/src/LiveDevelopment/Agents/RemoteFunctions.js b/src/LiveDevelopment/Agents/RemoteFunctions.js
index 5f302609f30..cb11e072c26 100644
--- a/src/LiveDevelopment/Agents/RemoteFunctions.js
+++ b/src/LiveDevelopment/Agents/RemoteFunctions.js
@@ -22,7 +22,7 @@
*/
/*jslint forin: true */
-/*global Node */
+/*global Node, MessageEvent */
/*theseus instrument: false */
/**
@@ -30,10 +30,29 @@
* modules should define a single function that returns an object of all
* exported functions.
*/
-function RemoteFunctions(experimental) {
+function RemoteFunctions(config, remoteWSPort) {
"use strict";
+ var experimental;
+ if (!config) {
+ experimental = false;
+ } else {
+ experimental = config.experimental;
+ }
var lastKeepAliveTime = Date.now();
+ var req, timeout;
+ var animateHighlight = function (time) {
+ if(req) {
+ window.cancelAnimationFrame(req);
+ window.clearTimeout(timeout);
+ }
+ req = window.requestAnimationFrame(redrawHighlights);
+
+ timeout = setTimeout(function () {
+ window.cancelAnimationFrame(req);
+ req = null;
+ }, time * 1000);
+ };
/**
* @type {DOMEditHandler}
@@ -98,6 +117,23 @@ function RemoteFunctions(experimental) {
element.removeAttribute(key);
}
}
+
+ // Checks if the element is in Viewport in the client browser
+ function isInViewport(element) {
+ var rect = element.getBoundingClientRect();
+ var html = window.document.documentElement;
+ return (
+ rect.top >= 0 &&
+ rect.left >= 0 &&
+ rect.bottom <= (window.innerHeight || html.clientHeight) &&
+ rect.right <= (window.innerWidth || html.clientWidth)
+ );
+ }
+
+ // returns the distance from the top of the closest relatively positioned parent element
+ function getDocumentOffsetTop(element) {
+ return element.offsetTop + (element.offsetParent ? getDocumentOffsetTop(element.offsetParent) : 0);
+ }
// construct the info menu
function Menu(element) {
@@ -233,56 +269,209 @@ function RemoteFunctions(experimental) {
}
return false;
},
-
_makeHighlightDiv: function (element, doAnimation) {
var elementBounds = element.getBoundingClientRect(),
highlight = window.document.createElement("div"),
- styles = window.getComputedStyle(element);
+ elementStyling = window.getComputedStyle(element),
+ transitionDuration = parseFloat(elementStyling.getPropertyValue('transition-duration')),
+ animationDuration = parseFloat(elementStyling.getPropertyValue('animation-duration'));
+
+ if (transitionDuration) {
+ animateHighlight(transitionDuration);
+ }
+
+ if (animationDuration) {
+ animateHighlight(animationDuration);
+ }
// Don't highlight elements with 0 width & height
if (elementBounds.width === 0 && elementBounds.height === 0) {
return;
}
+
+ var realElBorder = {
+ right: elementStyling.getPropertyValue('border-right-width'),
+ left: elementStyling.getPropertyValue('border-left-width'),
+ top: elementStyling.getPropertyValue('border-top-width'),
+ bottom: elementStyling.getPropertyValue('border-bottom-width')
+ };
+
+ var borderBox = elementStyling.boxSizing === 'border-box';
+
+ var innerWidth = parseFloat(elementStyling.width),
+ innerHeight = parseFloat(elementStyling.height),
+ outerHeight = innerHeight,
+ outerWidth = innerWidth;
+
+ if (!borderBox) {
+ innerWidth += parseFloat(elementStyling.paddingLeft) + parseFloat(elementStyling.paddingRight);
+ innerHeight += parseFloat(elementStyling.paddingTop) + parseFloat(elementStyling.paddingBottom);
+ outerWidth = innerWidth + parseFloat(realElBorder.right) +
+ parseFloat(realElBorder.left),
+ outerHeight = innerHeight + parseFloat(realElBorder.bottom) + parseFloat(realElBorder.top);
+ }
+
+
+ var visualisations = {
+ horizontal: "left, right",
+ vertical: "top, bottom"
+ };
+
+ var drawPaddingRect = function(side) {
+ var elStyling = {};
+
+ if (visualisations.horizontal.indexOf(side) >= 0) {
+ elStyling['width'] = elementStyling.getPropertyValue('padding-' + side);
+ elStyling['height'] = innerHeight + "px";
+ elStyling['top'] = 0;
+
+ if (borderBox) {
+ elStyling['height'] = innerHeight - parseFloat(realElBorder.top) - parseFloat(realElBorder.bottom) + "px";
+ }
+
+ } else {
+ elStyling['height'] = elementStyling.getPropertyValue('padding-' + side);
+ elStyling['width'] = innerWidth + "px";
+ elStyling['left'] = 0;
+
+ if (borderBox) {
+ elStyling['width'] = innerWidth - parseFloat(realElBorder.left) - parseFloat(realElBorder.right) + "px";
+ }
+ }
+
+ elStyling[side] = 0;
+ elStyling['position'] = 'absolute';
+
+ return elStyling;
+ };
+
+ var drawMarginRect = function(side) {
+ var elStyling = {};
+
+ var margin = [];
+ margin['right'] = parseFloat(elementStyling.getPropertyValue('margin-right'));
+ margin['top'] = parseFloat(elementStyling.getPropertyValue('margin-top'));
+ margin['bottom'] = parseFloat(elementStyling.getPropertyValue('margin-bottom'));
+ margin['left'] = parseFloat(elementStyling.getPropertyValue('margin-left'));
+
+ if(visualisations['horizontal'].indexOf(side) >= 0) {
+
+ elStyling['width'] = elementStyling.getPropertyValue('margin-' + side);
+ elStyling['height'] = outerHeight + margin['top'] + margin['bottom'] + "px";
+ elStyling['top'] = "-" + (margin['top'] + parseFloat(realElBorder.top)) + "px";
+ } else {
+ elStyling['height'] = elementStyling.getPropertyValue('margin-' + side);
+ elStyling['width'] = outerWidth + "px";
+ elStyling['left'] = "-" + realElBorder.left;
+ }
+ elStyling[side] = "-" + (margin[side] + parseFloat(realElBorder[side])) + "px";
+ elStyling['position'] = 'absolute';
+
+ return elStyling;
+ };
+
+ var setVisibility = function (el) {
+ if (
+ !config.remoteHighlight.showPaddingMargin ||
+ parseInt(el.height, 10) <= 0 ||
+ parseInt(el.width, 10) <= 0
+ ) {
+ el.display = 'none';
+ } else {
+ el.display = 'block';
+ }
+ };
+
+ var mainBoxStyles = config.remoteHighlight.stylesToSet;
+
+ var paddingVisualisations = [
+ drawPaddingRect('top'),
+ drawPaddingRect('right'),
+ drawPaddingRect('bottom'),
+ drawPaddingRect('left')
+ ];
+
+ var marginVisualisations = [
+ drawMarginRect('top'),
+ drawMarginRect('right'),
+ drawMarginRect('bottom'),
+ drawMarginRect('left')
+ ];
+
+ var setupVisualisations = function (arr, config) {
+ var i;
+ for (i = 0; i < arr.length; i++) {
+ setVisibility(arr[i]);
+
+ // Applies to every visualisationElement (padding or margin div)
+ arr[i]["transform"] = "none";
+ var el = window.document.createElement("div"),
+ styles = Object.assign(
+ {},
+ config,
+ arr[i]
+ );
+
+ _setStyleValues(styles, el.style);
+
+ highlight.appendChild(el);
+ }
+ };
+
+ setupVisualisations(
+ marginVisualisations,
+ config.remoteHighlight.marginStyling
+ );
+ setupVisualisations(
+ paddingVisualisations,
+ config.remoteHighlight.paddingStyling
+ );
+
highlight.className = HIGHLIGHT_CLASSNAME;
var offset = _screenOffset(element);
+
+ var el = element,
+ offsetLeft = 0,
+ offsetTop = 0;
+
+ // Probably the easiest way to get elements position without including transform
+ do {
+ offsetLeft += el.offsetLeft;
+ offsetTop += el.offsetTop;
+ el = el.offsetParent;
+ } while(el);
var stylesToSet = {
- "left": offset.left + "px",
- "top": offset.top + "px",
- "width": elementBounds.width + "px",
- "height": elementBounds.height + "px",
+ "left": offsetLeft + "px",
+ "top": offsetTop + "px",
+ "width": innerWidth + "px",
+ "height": innerHeight + "px",
"z-index": 2000000,
"margin": 0,
"padding": 0,
"position": "absolute",
"pointer-events": "none",
- "border-top-left-radius": styles.borderTopLeftRadius,
- "border-top-right-radius": styles.borderTopRightRadius,
- "border-bottom-left-radius": styles.borderBottomLeftRadius,
- "border-bottom-right-radius": styles.borderBottomRightRadius,
- "border-style": "solid",
- "border-width": "1px",
- "border-color": "#00a2ff",
"box-shadow": "0 0 1px #fff",
- "box-sizing": "border-box"
+ "box-sizing": elementStyling.getPropertyValue('box-sizing'),
+ "border-right": elementStyling.getPropertyValue('border-right'),
+ "border-left": elementStyling.getPropertyValue('border-left'),
+ "border-top": elementStyling.getPropertyValue('border-top'),
+ "border-bottom": elementStyling.getPropertyValue('border-bottom'),
+ "transform": elementStyling.getPropertyValue('transform'),
+ "transform-origin": elementStyling.getPropertyValue('transform-origin'),
+ "border-color": config.remoteHighlight.borderColor
};
+
+ var mergedStyles = Object.assign({}, stylesToSet, config.remoteHighlight.stylesToSet);
- var animateStartValues = {
- "background-color": "rgba(0, 162, 255, 0.5)",
- "opacity": 0
- };
+ var animateStartValues = config.remoteHighlight.animateStartValue;
- var animateEndValues = {
- "background-color": "rgba(0, 162, 255, 0)",
- "opacity": 1
- };
+ var animateEndValues = config.remoteHighlight.animateEndValue;
var transitionValues = {
- "-webkit-transition-property": "opacity, background-color",
- "-webkit-transition-duration": "300ms, 2.3s",
- "transition-property": "opacity, background-color",
+ "transition-property": "opacity, background-color, transform",
"transition-duration": "300ms, 2.3s"
};
@@ -294,7 +483,7 @@ function RemoteFunctions(experimental) {
}
}
- _setStyleValues(stylesToSet, highlight.style);
+ _setStyleValues(mergedStyles, highlight.style);
_setStyleValues(
doAnimation ? animateStartValues : animateEndValues,
highlight.style
@@ -319,6 +508,14 @@ function RemoteFunctions(experimental) {
if (this.trigger) {
_trigger(element, "highlight", 1);
}
+
+ if ((!window.event || window.event instanceof MessageEvent) && !isInViewport(element)) {
+ var top = getDocumentOffsetTop(element);
+ if (top) {
+ top -= (window.innerHeight / 2);
+ window.scrollTo(0, top);
+ }
+ }
this.elements.push(element);
this._makeHighlightDiv(element, doAnimation);
@@ -817,6 +1014,11 @@ function RemoteFunctions(experimental) {
function getSimpleDOM() {
return JSON.stringify(_domElementToJSON(window.document.documentElement));
}
+
+ function updateConfig(newConfig) {
+ config = JSON.parse(newConfig);
+ return JSON.stringify(config);
+ }
// init
_editHandler = new DOMEditHandler(window.document);
@@ -824,7 +1026,42 @@ function RemoteFunctions(experimental) {
if (experimental) {
window.document.addEventListener("keydown", onKeyDown);
}
-
+
+ var _ws = null;
+
+ function onDocumentClick(event) {
+ var element = event.target,
+ currentDataId,
+ newDataId;
+
+ if (_ws && element && element.hasAttribute('data-brackets-id')) {
+ _ws.send(JSON.stringify({
+ type: "message",
+ message: element.getAttribute('data-brackets-id')
+ }));
+ }
+ }
+
+
+ function createWebSocket() {
+ _ws = new WebSocket("ws://localhost:" + remoteWSPort);
+ _ws.onopen = function () {
+ window.document.addEventListener("click", onDocumentClick);
+ };
+
+ _ws.onmessage = function (evt) {
+ };
+
+ _ws.onclose = function () {
+ // websocket is closed
+ window.document.removeEventListener("click", onDocumentClick);
+ };
+ }
+
+ if (remoteWSPort) {
+ createWebSocket();
+ }
+
return {
"DOMEditHandler" : DOMEditHandler,
"keepAlive" : keepAlive,
@@ -834,6 +1071,7 @@ function RemoteFunctions(experimental) {
"highlightRule" : highlightRule,
"redrawHighlights" : redrawHighlights,
"applyDOMEdits" : applyDOMEdits,
- "getSimpleDOM" : getSimpleDOM
+ "getSimpleDOM" : getSimpleDOM,
+ "updateConfig" : updateConfig
};
}
diff --git a/src/LiveDevelopment/Documents/HTMLDocument.js b/src/LiveDevelopment/Documents/HTMLDocument.js
index 2b6e9ded4b7..30f45f45845 100644
--- a/src/LiveDevelopment/Documents/HTMLDocument.js
+++ b/src/LiveDevelopment/Documents/HTMLDocument.js
@@ -100,8 +100,13 @@ define(function HTMLDocumentModule(require, exports, module) {
*/
HTMLDocument.prototype.getResponseData = function getResponseData(enabled) {
var body;
- if (this._instrumentationEnabled && this.editor) {
- body = HTMLInstrumentation.generateInstrumentedHTML(this.editor);
+ if (this._instrumentationEnabled) {
+ if (this.editor) {
+ body = HTMLInstrumentation.generateInstrumentedHTML(this.editor);
+ } else {
+ this.doc._ensureMasterEditor();
+ body = HTMLInstrumentation.generateInstrumentedHTML(this.doc._masterEditor);
+ }
}
return {
diff --git a/src/LiveDevelopment/LiveDevelopment.js b/src/LiveDevelopment/LiveDevelopment.js
index cd54b987b85..57d4438d118 100644
--- a/src/LiveDevelopment/LiveDevelopment.js
+++ b/src/LiveDevelopment/LiveDevelopment.js
@@ -94,7 +94,9 @@ define(function LiveDevelopment(require, exports, module) {
ProjectManager = require("project/ProjectManager"),
Strings = require("strings"),
StringUtils = require("utils/StringUtils"),
- UserServer = require("LiveDevelopment/Servers/UserServer").UserServer;
+ UserServer = require("LiveDevelopment/Servers/UserServer").UserServer,
+ WebSocketTransport = require("LiveDevelopment/transports/WebSocketTransport"),
+ PreferencesManager = require("preferences/PreferencesManager");
// Inspector
var Inspector = require("LiveDevelopment/Inspector/Inspector");
@@ -195,6 +197,10 @@ define(function LiveDevelopment(require, exports, module) {
* Handles of registered servers
*/
var _regServers = [];
+
+ PreferencesManager.definePreference("livedev.wsPort", "number", 8125, {
+ description: Strings.DESCRIPTION_LIVEDEV_WEBSOCKET_PORT
+ });
function _isPromisePending(promise) {
return promise && promise.state() === "pending";
@@ -849,6 +855,7 @@ define(function LiveDevelopment(require, exports, module) {
* @return {jQuery.Promise} Always return a resolved promise once the connection is closed
*/
function _close(doCloseWindow, reason) {
+ WebSocketTransport.closeWebSocketServer();
if (_closeDeferred) {
return _closeDeferred;
} else {
@@ -1362,6 +1369,7 @@ define(function LiveDevelopment(require, exports, module) {
// wait for server (StaticServer, Base URL or file:)
prepareServerPromise
.done(function () {
+ WebSocketTransport.createWebSocketServer(PreferencesManager.get("livedev.wsPort"));
_doLaunchAfterServerReady(doc);
})
.fail(function () {
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/object-assign/index.js b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/object-assign/index.js
deleted file mode 100644
index 508504840dc..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/object-assign/index.js
+++ /dev/null
@@ -1,83 +0,0 @@
-'use strict';
-/* eslint-disable no-unused-vars */
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-var propIsEnumerable = Object.prototype.propertyIsEnumerable;
-
-function toObject(val) {
- if (val === null || val === undefined) {
- throw new TypeError('Object.assign cannot be called with null or undefined');
- }
-
- return Object(val);
-}
-
-function shouldUseNative() {
- try {
- if (!Object.assign) {
- return false;
- }
-
- // Detect buggy property enumeration order in older V8 versions.
-
- // https://bugs.chromium.org/p/v8/issues/detail?id=4118
- var test1 = new String('abc'); // eslint-disable-line
- test1[5] = 'de';
- if (Object.getOwnPropertyNames(test1)[0] === '5') {
- return false;
- }
-
- // https://bugs.chromium.org/p/v8/issues/detail?id=3056
- var test2 = {};
- for (var i = 0; i < 10; i++) {
- test2['_' + String.fromCharCode(i)] = i;
- }
- var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
- return test2[n];
- });
- if (order2.join('') !== '0123456789') {
- return false;
- }
-
- // https://bugs.chromium.org/p/v8/issues/detail?id=3056
- var test3 = {};
- 'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
- test3[letter] = letter;
- });
- if (Object.keys(Object.assign({}, test3)).join('') !==
- 'abcdefghijklmnopqrst') {
- return false;
- }
-
- return true;
- } catch (e) {
- // We don't expect any of the above to throw, but better to be safe.
- return false;
- }
-}
-
-module.exports = shouldUseNative() ? Object.assign : function (target, source) {
- var from;
- var to = toObject(target);
- var symbols;
-
- for (var s = 1; s < arguments.length; s++) {
- from = Object(arguments[s]);
-
- for (var key in from) {
- if (hasOwnProperty.call(from, key)) {
- to[key] = from[key];
- }
- }
-
- if (Object.getOwnPropertySymbols) {
- symbols = Object.getOwnPropertySymbols(from);
- for (var i = 0; i < symbols.length; i++) {
- if (propIsEnumerable.call(from, symbols[i])) {
- to[symbols[i]] = from[symbols[i]];
- }
- }
- }
- }
-
- return to;
-};
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/object-assign/license b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/object-assign/license
deleted file mode 100644
index 654d0bfe943..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/object-assign/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/object-assign/package.json b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/object-assign/package.json
deleted file mode 100644
index 068b9088c79..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/object-assign/package.json
+++ /dev/null
@@ -1,106 +0,0 @@
-{
- "_args": [
- [
- "object-assign@^4.0.1",
- "/Users/Filippo/Documents/git/brackets/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn"
- ]
- ],
- "_from": "object-assign@>=4.0.1 <5.0.0",
- "_id": "object-assign@4.1.0",
- "_inCache": true,
- "_installable": true,
- "_location": "/object-assign",
- "_nodeVersion": "4.1.0",
- "_npmOperationalInternal": {
- "host": "packages-16-east.internal.npmjs.com",
- "tmp": "tmp/object-assign-4.1.0.tgz_1462212593641_0.3332549517508596"
- },
- "_npmUser": {
- "email": "ben@benalpert.com",
- "name": "spicyj"
- },
- "_npmVersion": "2.14.19",
- "_phantomChildren": {},
- "_requested": {
- "name": "object-assign",
- "raw": "object-assign@^4.0.1",
- "rawSpec": "^4.0.1",
- "scope": null,
- "spec": ">=4.0.1 <5.0.0",
- "type": "range"
- },
- "_requiredBy": [
- "/opn"
- ],
- "_resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz",
- "_shasum": "7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0",
- "_shrinkwrap": null,
- "_spec": "object-assign@^4.0.1",
- "_where": "/Users/Filippo/Documents/git/brackets/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn",
- "author": {
- "email": "sindresorhus@gmail.com",
- "name": "Sindre Sorhus",
- "url": "sindresorhus.com"
- },
- "bugs": {
- "url": "https://github.com/sindresorhus/object-assign/issues"
- },
- "dependencies": {},
- "description": "ES2015 Object.assign() ponyfill",
- "devDependencies": {
- "lodash": "^4.8.2",
- "matcha": "^0.7.0",
- "mocha": "*",
- "xo": "*"
- },
- "directories": {},
- "dist": {
- "shasum": "7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0",
- "tarball": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "files": [
- "index.js"
- ],
- "gitHead": "72fe21c86911758f3342fdf41c2a57860d5829bc",
- "homepage": "https://github.com/sindresorhus/object-assign#readme",
- "keywords": [
- "object",
- "assign",
- "extend",
- "properties",
- "es2015",
- "ecmascript",
- "harmony",
- "ponyfill",
- "prollyfill",
- "polyfill",
- "shim",
- "browser"
- ],
- "license": "MIT",
- "maintainers": [
- {
- "email": "sindresorhus@gmail.com",
- "name": "sindresorhus"
- },
- {
- "email": "ben@benalpert.com",
- "name": "spicyj"
- }
- ],
- "name": "object-assign",
- "optionalDependencies": {},
- "readme": "ERROR: No README data found!",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/sindresorhus/object-assign.git"
- },
- "scripts": {
- "bench": "matcha bench.js",
- "test": "xo && mocha"
- },
- "version": "4.1.0"
-}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/object-assign/readme.md b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/object-assign/readme.md
deleted file mode 100644
index 13c097734cf..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/object-assign/readme.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# object-assign [![Build Status](https://travis-ci.org/sindresorhus/object-assign.svg?branch=master)](https://travis-ci.org/sindresorhus/object-assign)
-
-> ES2015 [`Object.assign()`](http://www.2ality.com/2014/01/object-assign.html) ponyfill
-
-> Ponyfill: A polyfill that doesn't overwrite the native method
-
-
-## Install
-
-```
-$ npm install --save object-assign
-```
-
-
-## Usage
-
-```js
-const objectAssign = require('object-assign');
-
-objectAssign({foo: 0}, {bar: 1});
-//=> {foo: 0, bar: 1}
-
-// multiple sources
-objectAssign({foo: 0}, {bar: 1}, {baz: 2});
-//=> {foo: 0, bar: 1, baz: 2}
-
-// overwrites equal keys
-objectAssign({foo: 0}, {foo: 1}, {foo: 2});
-//=> {foo: 2}
-
-// ignores null and undefined sources
-objectAssign({foo: 0}, null, {bar: 1}, undefined);
-//=> {foo: 0, bar: 1}
-```
-
-
-## API
-
-### objectAssign(target, source, [source, ...])
-
-Assigns enumerable own properties of `source` objects to the `target` object and returns the `target` object. Additional `source` objects will overwrite previous ones.
-
-
-## Resources
-
-- [ES2015 spec - Object.assign](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign)
-
-
-## Related
-
-- [deep-assign](https://github.com/sindresorhus/deep-assign) - Recursive `Object.assign()`
-
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn/index.js b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn/index.js
deleted file mode 100644
index 13dcb66fb12..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn/index.js
+++ /dev/null
@@ -1,95 +0,0 @@
-'use strict';
-var path = require('path');
-var childProcess = require('child_process');
-var objectAssign = require('object-assign');
-var Promise = require('pinkie-promise');
-
-module.exports = function (target, opts) {
- if (typeof target !== 'string') {
- return Promise.reject(new Error('Expected a `target`'));
- }
-
- opts = objectAssign({wait: true}, opts);
-
- var cmd;
- var appArgs = [];
- var args = [];
- var cpOpts = {};
-
- if (Array.isArray(opts.app)) {
- appArgs = opts.app.slice(1);
- opts.app = opts.app[0];
- }
-
- if (process.platform === 'darwin') {
- cmd = 'open';
-
- if (opts.wait) {
- args.push('-W');
- }
-
- if (opts.app) {
- args.push('-a', opts.app);
- }
- } else if (process.platform === 'win32') {
- cmd = 'cmd';
- args.push('/c', 'start', '""');
- target = target.replace(/&/g, '^&');
-
- if (opts.wait) {
- args.push('/wait');
- }
-
- if (opts.app) {
- args.push(opts.app);
- }
-
- if (appArgs.length > 0) {
- args = args.concat(appArgs);
- }
- } else {
- if (opts.app) {
- cmd = opts.app;
- } else {
- cmd = path.join(__dirname, 'xdg-open');
- }
-
- if (appArgs.length > 0) {
- args = args.concat(appArgs);
- }
-
- if (!opts.wait) {
- // xdg-open will block the process unless
- // stdio is ignored even if it's unref'd
- cpOpts.stdio = 'ignore';
- }
- }
-
- args.push(target);
-
- if (process.platform === 'darwin' && appArgs.length > 0) {
- args.push('--args');
- args = args.concat(appArgs);
- }
-
- var cp = childProcess.spawn(cmd, args, cpOpts);
-
- if (opts.wait) {
- return new Promise(function (resolve, reject) {
- cp.once('error', reject);
-
- cp.once('close', function (code) {
- if (code > 0) {
- reject(new Error('Exited with code ' + code));
- return;
- }
-
- resolve(cp);
- });
- });
- }
-
- cp.unref();
-
- return Promise.resolve(cp);
-};
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn/license b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn/license
deleted file mode 100644
index ced6f6b30dd..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn/package.json b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn/package.json
deleted file mode 100644
index 1f9d62546b4..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn/package.json
+++ /dev/null
@@ -1,116 +0,0 @@
-{
- "_args": [
- [
- "opn@4.0.2",
- "/Users/Filippo/Documents/git/brackets/src/LiveDevelopment/MultiBrowserImpl/launchers/node"
- ]
- ],
- "_from": "opn@4.0.2",
- "_id": "opn@4.0.2",
- "_inCache": true,
- "_installable": true,
- "_location": "/opn",
- "_nodeVersion": "4.4.2",
- "_npmOperationalInternal": {
- "host": "packages-12-west.internal.npmjs.com",
- "tmp": "tmp/opn-4.0.2.tgz_1463477356148_0.1645404922310263"
- },
- "_npmUser": {
- "email": "sindresorhus@gmail.com",
- "name": "sindresorhus"
- },
- "_npmVersion": "3.9.0",
- "_phantomChildren": {},
- "_requested": {
- "name": "opn",
- "raw": "opn@4.0.2",
- "rawSpec": "4.0.2",
- "scope": null,
- "spec": "4.0.2",
- "type": "version"
- },
- "_requiredBy": [
- "/"
- ],
- "_resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz",
- "_shasum": "7abc22e644dff63b0a96d5ab7f2790c0f01abc95",
- "_shrinkwrap": null,
- "_spec": "opn@4.0.2",
- "_where": "/Users/Filippo/Documents/git/brackets/src/LiveDevelopment/MultiBrowserImpl/launchers/node",
- "author": {
- "email": "sindresorhus@gmail.com",
- "name": "Sindre Sorhus",
- "url": "sindresorhus.com"
- },
- "bugs": {
- "url": "https://github.com/sindresorhus/opn/issues"
- },
- "dependencies": {
- "object-assign": "^4.0.1",
- "pinkie-promise": "^2.0.0"
- },
- "description": "A better node-open. Opens stuff like websites, files, executables. Cross-platform.",
- "devDependencies": {
- "ava": "*",
- "xo": "*"
- },
- "directories": {},
- "dist": {
- "shasum": "7abc22e644dff63b0a96d5ab7f2790c0f01abc95",
- "tarball": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "files": [
- "index.js",
- "xdg-open"
- ],
- "gitHead": "b56b0e981ee377d3b04c57a4e6748ad2793ada17",
- "homepage": "https://github.com/sindresorhus/opn#readme",
- "keywords": [
- "app",
- "open",
- "opn",
- "opener",
- "opens",
- "launch",
- "start",
- "xdg-open",
- "xdg",
- "default",
- "cmd",
- "browser",
- "editor",
- "executable",
- "exe",
- "url",
- "urls",
- "arguments",
- "args",
- "spawn",
- "exec",
- "child",
- "process",
- "website",
- "file"
- ],
- "license": "MIT",
- "maintainers": [
- {
- "email": "sindresorhus@gmail.com",
- "name": "sindresorhus"
- }
- ],
- "name": "opn",
- "optionalDependencies": {},
- "readme": "ERROR: No README data found!",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/sindresorhus/opn.git"
- },
- "scripts": {
- "test": "xo && ava"
- },
- "version": "4.0.2"
-}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn/readme.md b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn/readme.md
deleted file mode 100644
index 76d543933cd..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn/readme.md
+++ /dev/null
@@ -1,89 +0,0 @@
-# opn
-
-> A better [node-open](https://github.com/pwnall/node-open). Opens stuff like websites, files, executables. Cross-platform.
-
-
-#### Why?
-
-- Actively maintained
-- Supports app arguments
-- Safer as it uses `spawn` instead of `exec`
-- Fixes most of the open `node-open` issues
-- Includes the latest [`xdg-open` script](http://cgit.freedesktop.org/xdg/xdg-utils/commit/?id=c55122295c2a480fa721a9614f0e2d42b2949c18) for Linux
-
-
-## Install
-
-```
-$ npm install --save opn
-```
-
-
-## Usage
-
-```js
-const opn = require('opn');
-
-// opens the image in the default image viewer
-opn('unicorn.png').then(() => {
- // image viewer closed
-});
-
-// opens the url in the default browser
-opn('http://sindresorhus.com');
-
-// specify the app to open in
-opn('http://sindresorhus.com', {app: 'firefox'});
-
-// specify app arguments
-opn('http://sindresorhus.com', {app: ['google chrome', '--incognito']});
-```
-
-
-## API
-
-Uses the command `open` on OS X, `start` on Windows and `xdg-open` on other platforms.
-
-### opn(target, [options])
-
-Returns a promise for the [spawned child process](https://nodejs.org/api/child_process.html#child_process_class_childprocess). You'd normally not need to use this for anything, but it can be useful if you'd like to attach custom event listeners or perform other operations directly on the spawned process.
-
-#### target
-
-*Required*
-Type: `string`
-
-The thing you want to open. Can be a URL, file, or executable.
-
-Opens in the default app for the file type. Eg. URLs opens in your default browser.
-
-#### options
-
-Type: `object`
-
-##### wait
-
-Type: `boolean`
-Default: `true`
-
-Wait for the opened app to exit before calling the `callback`. If `false` it's called immediately when opening the app.
-
-On Windows you have to explicitly specify an app for it to be able to wait.
-
-##### app
-
-Type: `string`, `array`
-
-Specify the app to open the `target` with, or an array with the app and app arguments.
-
-The app name is platform dependent. Don't hard code it in reusable modules. Eg. Chrome is `google chrome` on OS X, `google-chrome` on Linux and `chrome` on Windows.
-
-
-## Related
-
-- [opn-cli](https://github.com/sindresorhus/opn-cli) - CLI for this module
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn/xdg-open b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn/xdg-open
deleted file mode 100755
index 9be7f32f63e..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn/xdg-open
+++ /dev/null
@@ -1,861 +0,0 @@
-#!/bin/sh
-#---------------------------------------------
-# xdg-open
-#
-# Utility script to open a URL in the registered default application.
-#
-# Refer to the usage() function below for usage.
-#
-# Copyright 2009-2010, Fathi Boudra
-# Copyright 2009-2010, Rex Dieter
-# Copyright 2006, Kevin Krammer
-# Copyright 2006, Jeremy White
-#
-# LICENSE:
-#
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the "Software"),
-# to deal in the Software without restriction, including without limitation
-# the rights to use, copy, modify, merge, publish, distribute, sublicense,
-# and/or sell copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-#
-#---------------------------------------------
-
-manualpage()
-{
-cat << _MANUALPAGE
-Name
-
- xdg-open - opens a file or URL in the user's preferred
- application
-
-Synopsis
-
- xdg-open { file | URL }
-
- xdg-open { --help | --manual | --version }
-
-Description
-
- xdg-open opens a file or URL in the user's preferred
- application. If a URL is provided the URL will be opened in the
- user's preferred web browser. If a file is provided the file
- will be opened in the preferred application for files of that
- type. xdg-open supports file, ftp, http and https URLs.
-
- xdg-open is for use inside a desktop session only. It is not
- recommended to use xdg-open as root.
-
-Options
-
- --help
- Show command synopsis.
-
- --manual
- Show this manual page.
-
- --version
- Show the xdg-utils version information.
-
-Exit Codes
-
- An exit code of 0 indicates success while a non-zero exit code
- indicates failure. The following failure codes can be returned:
-
- 1
- Error in command line syntax.
-
- 2
- One of the files passed on the command line did not
- exist.
-
- 3
- A required tool could not be found.
-
- 4
- The action failed.
-
-Examples
-
-xdg-open 'http://www.freedesktop.org/'
-
- Opens the freedesktop.org website in the user's default
- browser.
-
-xdg-open /tmp/foobar.png
-
- Opens the PNG image file /tmp/foobar.png in the user's default
- image viewing application.
-_MANUALPAGE
-}
-
-usage()
-{
-cat << _USAGE
- xdg-open - opens a file or URL in the user's preferred
- application
-
-Synopsis
-
- xdg-open { file | URL }
-
- xdg-open { --help | --manual | --version }
-
-_USAGE
-}
-
-#@xdg-utils-common@
-
-#----------------------------------------------------------------------------
-# Common utility functions included in all XDG wrapper scripts
-#----------------------------------------------------------------------------
-
-DEBUG()
-{
- [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && return 0;
- [ ${XDG_UTILS_DEBUG_LEVEL} -lt $1 ] && return 0;
- shift
- echo "$@" >&2
-}
-
-# This handles backslashes but not quote marks.
-first_word()
-{
- read first rest
- echo "$first"
-}
-
-#-------------------------------------------------------------
-# map a binary to a .desktop file
-binary_to_desktop_file()
-{
- search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
- binary="`which "$1"`"
- binary="`readlink -f "$binary"`"
- base="`basename "$binary"`"
- IFS=:
- for dir in $search; do
- unset IFS
- [ "$dir" ] || continue
- [ -d "$dir/applications" ] || [ -d "$dir/applnk" ] || continue
- for file in "$dir"/applications/*.desktop "$dir"/applications/*/*.desktop "$dir"/applnk/*.desktop "$dir"/applnk/*/*.desktop; do
- [ -r "$file" ] || continue
- # Check to make sure it's worth the processing.
- grep -q "^Exec.*$base" "$file" || continue
- # Make sure it's a visible desktop file (e.g. not "preferred-web-browser.desktop").
- grep -Eq "^(NoDisplay|Hidden)=true" "$file" && continue
- command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`"
- command="`which "$command"`"
- if [ x"`readlink -f "$command"`" = x"$binary" ]; then
- # Fix any double slashes that got added path composition
- echo "$file" | sed -e 's,//*,/,g'
- return
- fi
- done
- done
-}
-
-#-------------------------------------------------------------
-# map a .desktop file to a binary
-## FIXME: handle vendor dir case
-desktop_file_to_binary()
-{
- search="${XDG_DATA_HOME:-$HOME/.local/share}:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
- desktop="`basename "$1"`"
- IFS=:
- for dir in $search; do
- unset IFS
- [ "$dir" ] && [ -d "$dir/applications" ] || continue
- file="$dir/applications/$desktop"
- [ -r "$file" ] || continue
- # Remove any arguments (%F, %f, %U, %u, etc.).
- command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`"
- command="`which "$command"`"
- readlink -f "$command"
- return
- done
-}
-
-#-------------------------------------------------------------
-# Exit script on successfully completing the desired operation
-
-exit_success()
-{
- if [ $# -gt 0 ]; then
- echo "$@"
- echo
- fi
-
- exit 0
-}
-
-
-#-----------------------------------------
-# Exit script on malformed arguments, not enough arguments
-# or missing required option.
-# prints usage information
-
-exit_failure_syntax()
-{
- if [ $# -gt 0 ]; then
- echo "xdg-open: $@" >&2
- echo "Try 'xdg-open --help' for more information." >&2
- else
- usage
- echo "Use 'man xdg-open' or 'xdg-open --manual' for additional info."
- fi
-
- exit 1
-}
-
-#-------------------------------------------------------------
-# Exit script on missing file specified on command line
-
-exit_failure_file_missing()
-{
- if [ $# -gt 0 ]; then
- echo "xdg-open: $@" >&2
- fi
-
- exit 2
-}
-
-#-------------------------------------------------------------
-# Exit script on failure to locate necessary tool applications
-
-exit_failure_operation_impossible()
-{
- if [ $# -gt 0 ]; then
- echo "xdg-open: $@" >&2
- fi
-
- exit 3
-}
-
-#-------------------------------------------------------------
-# Exit script on failure returned by a tool application
-
-exit_failure_operation_failed()
-{
- if [ $# -gt 0 ]; then
- echo "xdg-open: $@" >&2
- fi
-
- exit 4
-}
-
-#------------------------------------------------------------
-# Exit script on insufficient permission to read a specified file
-
-exit_failure_file_permission_read()
-{
- if [ $# -gt 0 ]; then
- echo "xdg-open: $@" >&2
- fi
-
- exit 5
-}
-
-#------------------------------------------------------------
-# Exit script on insufficient permission to write a specified file
-
-exit_failure_file_permission_write()
-{
- if [ $# -gt 0 ]; then
- echo "xdg-open: $@" >&2
- fi
-
- exit 6
-}
-
-check_input_file()
-{
- if [ ! -e "$1" ]; then
- exit_failure_file_missing "file '$1' does not exist"
- fi
- if [ ! -r "$1" ]; then
- exit_failure_file_permission_read "no permission to read file '$1'"
- fi
-}
-
-check_vendor_prefix()
-{
- file_label="$2"
- [ -n "$file_label" ] || file_label="filename"
- file=`basename "$1"`
- case "$file" in
- [[:alpha:]]*-*)
- return
- ;;
- esac
-
- echo "xdg-open: $file_label '$file' does not have a proper vendor prefix" >&2
- echo 'A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated' >&2
- echo 'with a dash ("-"). An example '"$file_label"' is '"'example-$file'" >&2
- echo "Use --novendor to override or 'xdg-open --manual' for additional info." >&2
- exit 1
-}
-
-check_output_file()
-{
- # if the file exists, check if it is writeable
- # if it does not exists, check if we are allowed to write on the directory
- if [ -e "$1" ]; then
- if [ ! -w "$1" ]; then
- exit_failure_file_permission_write "no permission to write to file '$1'"
- fi
- else
- DIR=`dirname "$1"`
- if [ ! -w "$DIR" ] || [ ! -x "$DIR" ]; then
- exit_failure_file_permission_write "no permission to create file '$1'"
- fi
- fi
-}
-
-#----------------------------------------
-# Checks for shared commands, e.g. --help
-
-check_common_commands()
-{
- while [ $# -gt 0 ] ; do
- parm="$1"
- shift
-
- case "$parm" in
- --help)
- usage
- echo "Use 'man xdg-open' or 'xdg-open --manual' for additional info."
- exit_success
- ;;
-
- --manual)
- manualpage
- exit_success
- ;;
-
- --version)
- echo "xdg-open 1.1.0 rc3"
- exit_success
- ;;
- esac
- done
-}
-
-check_common_commands "$@"
-
-[ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && unset XDG_UTILS_DEBUG_LEVEL;
-if [ ${XDG_UTILS_DEBUG_LEVEL-0} -lt 1 ]; then
- # Be silent
- xdg_redirect_output=" > /dev/null 2> /dev/null"
-else
- # All output to stderr
- xdg_redirect_output=" >&2"
-fi
-
-#--------------------------------------
-# Checks for known desktop environments
-# set variable DE to the desktop environments name, lowercase
-
-detectDE()
-{
- # see https://bugs.freedesktop.org/show_bug.cgi?id=34164
- unset GREP_OPTIONS
-
- if [ -n "${XDG_CURRENT_DESKTOP}" ]; then
- case "${XDG_CURRENT_DESKTOP}" in
- ENLIGHTENMENT)
- DE=enlightenment;
- ;;
- GNOME)
- DE=gnome;
- ;;
- KDE)
- DE=kde;
- ;;
- LXDE)
- DE=lxde;
- ;;
- MATE)
- DE=mate;
- ;;
- XFCE)
- DE=xfce
- ;;
- esac
- fi
-
- if [ x"$DE" = x"" ]; then
- # classic fallbacks
- if [ x"$KDE_FULL_SESSION" != x"" ]; then DE=kde;
- elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome;
- elif [ x"$MATE_DESKTOP_SESSION_ID" != x"" ]; then DE=mate;
- elif `dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.gnome.SessionManager > /dev/null 2>&1` ; then DE=gnome;
- elif xprop -root _DT_SAVE_MODE 2> /dev/null | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce;
- elif xprop -root 2> /dev/null | grep -i '^xfce_desktop_window' >/dev/null 2>&1; then DE=xfce
- elif echo $DESKTOP | grep -q '^Enlightenment'; then DE=enlightenment;
- fi
- fi
-
- if [ x"$DE" = x"" ]; then
- # fallback to checking $DESKTOP_SESSION
- case "$DESKTOP_SESSION" in
- gnome)
- DE=gnome;
- ;;
- LXDE|Lubuntu)
- DE=lxde;
- ;;
- MATE)
- DE=mate;
- ;;
- xfce|xfce4|'Xfce Session')
- DE=xfce;
- ;;
- esac
- fi
-
- if [ x"$DE" = x"" ]; then
- # fallback to uname output for other platforms
- case "$(uname 2>/dev/null)" in
- Darwin)
- DE=darwin;
- ;;
- esac
- fi
-
- if [ x"$DE" = x"gnome" ]; then
- # gnome-default-applications-properties is only available in GNOME 2.x
- # but not in GNOME 3.x
- which gnome-default-applications-properties > /dev/null 2>&1 || DE="gnome3"
- fi
-}
-
-#----------------------------------------------------------------------------
-# kfmclient exec/openURL can give bogus exit value in KDE <= 3.5.4
-# It also always returns 1 in KDE 3.4 and earlier
-# Simply return 0 in such case
-
-kfmclient_fix_exit_code()
-{
- version=`LC_ALL=C.UTF-8 kde-config --version 2>/dev/null | grep '^KDE'`
- major=`echo $version | sed 's/KDE.*: \([0-9]\).*/\1/'`
- minor=`echo $version | sed 's/KDE.*: [0-9]*\.\([0-9]\).*/\1/'`
- release=`echo $version | sed 's/KDE.*: [0-9]*\.[0-9]*\.\([0-9]\).*/\1/'`
- test "$major" -gt 3 && return $1
- test "$minor" -gt 5 && return $1
- test "$release" -gt 4 && return $1
- return 0
-}
-
-# This handles backslashes but not quote marks.
-last_word()
-{
- read first rest
- echo "$rest"
-}
-
-# Get the value of a key in a desktop file's Desktop Entry group.
-# Example: Use get_key foo.desktop Exec
-# to get the values of the Exec= key for the Desktop Entry group.
-get_key()
-{
- local file="${1}"
- local key="${2}"
- local desktop_entry=""
-
- IFS_="${IFS}"
- IFS=""
- while read line
- do
- case "$line" in
- "[Desktop Entry]")
- desktop_entry="y"
- ;;
- # Reset match flag for other groups
- "["*)
- desktop_entry=""
- ;;
- "${key}="*)
- # Only match Desktop Entry group
- if [ -n "${desktop_entry}" ]
- then
- echo "${line}" | cut -d= -f 2-
- fi
- esac
- done < "${file}"
- IFS="${IFS_}"
-}
-
-open_darwin()
-{
- open "$1"
-
- if [ $? -eq 0 ]; then
- exit_success
- else
- exit_failure_operation_failed
- fi
-}
-
-open_kde()
-{
- if [ -n "${KDE_SESSION_VERSION}" ]; then
- case "${KDE_SESSION_VERSION}" in
- 4)
- kde-open "$1"
- ;;
- 5)
- kde-open${KDE_SESSION_VERSION} "$1"
- ;;
- esac
- else
- kfmclient exec "$1"
- kfmclient_fix_exit_code $?
- fi
-
- if [ $? -eq 0 ]; then
- exit_success
- else
- exit_failure_operation_failed
- fi
-}
-
-open_gnome()
-{
- if gvfs-open --help 2>/dev/null 1>&2; then
- gvfs-open "$1"
- else
- gnome-open "$1"
- fi
-
- if [ $? -eq 0 ]; then
- exit_success
- else
- exit_failure_operation_failed
- fi
-}
-
-open_mate()
-{
- if gvfs-open --help 2>/dev/null 1>&2; then
- gvfs-open "$1"
- else
- mate-open "$1"
- fi
-
- if [ $? -eq 0 ]; then
- exit_success
- else
- exit_failure_operation_failed
- fi
-}
-
-open_xfce()
-{
- exo-open "$1"
-
- if [ $? -eq 0 ]; then
- exit_success
- else
- exit_failure_operation_failed
- fi
-}
-
-open_enlightenment()
-{
- enlightenment_open "$1"
-
- if [ $? -eq 0 ]; then
- exit_success
- else
- exit_failure_operation_failed
- fi
-}
-
-#-----------------------------------------
-# Recursively search .desktop file
-
-search_desktop_file()
-{
- local default="$1"
- local dir="$2"
- local target="$3"
-
- local file=""
- # look for both vendor-app.desktop, vendor/app.desktop
- if [ -r "$dir/$default" ]; then
- file="$dir/$default"
- elif [ -r "$dir/`echo $default | sed -e 's|-|/|'`" ]; then
- file="$dir/`echo $default | sed -e 's|-|/|'`"
- fi
-
- if [ -r "$file" ] ; then
- command="$(get_key "${file}" "Exec" | first_word)"
- command_exec=`which $command 2>/dev/null`
- icon="$(get_key "${file}" "Icon")"
- # FIXME: Actually LC_MESSAGES should be used as described in
- # http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s04.html
- localised_name="$(get_key "${file}" "Name")"
- set -- $(get_key "${file}" "Exec" | last_word)
- # We need to replace any occurrence of "%f", "%F" and
- # the like by the target file. We examine each
- # argument and append the modified argument to the
- # end then shift.
- local args=$#
- local replaced=0
- while [ $args -gt 0 ]; do
- case $1 in
- %[c])
- replaced=1
- arg="${localised_name}"
- shift
- set -- "$@" "$arg"
- ;;
- %[fFuU])
- replaced=1
- arg="$target"
- shift
- set -- "$@" "$arg"
- ;;
- %[i])
- replaced=1
- shift
- set -- "$@" "--icon" "$icon"
- ;;
- *)
- arg="$1"
- shift
- set -- "$@" "$arg"
- ;;
- esac
- args=$(( $args - 1 ))
- done
- [ $replaced -eq 1 ] || set -- "$@" "$target"
- "$command_exec" "$@"
-
- if [ $? -eq 0 ]; then
- exit_success
- fi
- fi
-
- for d in $dir/*/; do
- [ -d "$d" ] && search_desktop_file "$default" "$d" "$target"
- done
-}
-
-
-open_generic_xdg_mime()
-{
- filetype="$2"
- default=`xdg-mime query default "$filetype"`
- if [ -n "$default" ] ; then
- xdg_user_dir="$XDG_DATA_HOME"
- [ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share"
-
- xdg_system_dirs="$XDG_DATA_DIRS"
- [ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/
-
-DEBUG 3 "$xdg_user_dir:$xdg_system_dirs"
- for x in `echo "$xdg_user_dir:$xdg_system_dirs" | sed 's/:/ /g'`; do
- search_desktop_file "$default" "$x/applications/" "$1"
- done
- fi
-}
-
-open_generic_xdg_file_mime()
-{
- filetype=`xdg-mime query filetype "$1" | sed "s/;.*//"`
- open_generic_xdg_mime "$1" "$filetype"
-}
-
-open_generic_xdg_x_scheme_handler()
-{
- scheme="`echo $1 | sed -n 's/\(^[[:alnum:]+\.-]*\):.*$/\1/p'`"
- if [ -n $scheme ]; then
- filetype="x-scheme-handler/$scheme"
- open_generic_xdg_mime "$1" "$filetype"
- fi
-}
-
-open_generic()
-{
- # Paths or file:// URLs
- if (echo "$1" | grep -q '^file://' ||
- ! echo "$1" | egrep -q '^[[:alpha:]+\.\-]+:'); then
-
- local file="$1"
-
- # Decode URLs
- if echo "$file" | grep -q '^file:///'; then
- file=${file#file://}
- file="$(printf "$(echo "$file" | sed -e 's@%\([a-f0-9A-F]\{2\}\)@\\x\1@g')")"
- fi
- file_check=${file%%#*}
- file_check=${file_check%%\?*}
- check_input_file "$file_check"
-
- filetype=`xdg-mime query filetype "$file_check" | sed "s/;.*//"`
- open_generic_xdg_mime "$file" "$filetype"
-
- if which run-mailcap 2>/dev/null 1>&2; then
- run-mailcap --action=view "$file"
- if [ $? -eq 0 ]; then
- exit_success
- fi
- fi
-
- if mimeopen -v 2>/dev/null 1>&2; then
- mimeopen -L -n "$file"
- if [ $? -eq 0 ]; then
- exit_success
- fi
- fi
- fi
-
- open_generic_xdg_x_scheme_handler "$1"
-
- IFS=":"
- for browser in $BROWSER; do
- if [ x"$browser" != x"" ]; then
-
- browser_with_arg=`printf "$browser" "$1" 2>/dev/null`
- if [ $? -ne 0 ]; then
- browser_with_arg=$browser;
- fi
-
- if [ x"$browser_with_arg" = x"$browser" ]; then
- eval '$browser "$1"'$xdg_redirect_output;
- else eval '$browser_with_arg'$xdg_redirect_output;
- fi
-
- if [ $? -eq 0 ]; then
- exit_success;
- fi
- fi
- done
-
- exit_failure_operation_impossible "no method available for opening '$1'"
-}
-
-open_lxde()
-{
- # pcmanfm only knows how to handle file:// urls and filepaths, it seems.
- if (echo "$1" | grep -q '^file://' ||
- ! echo "$1" | egrep -q '^[[:alpha:]+\.\-]+:')
- then
- local file="$1"
-
- # handle relative paths
- if ! echo "$file" | egrep -q '^(file://)?/'; then
- file="$(pwd)/$file"
- fi
-
- pcmanfm "$file"
-
- else
- open_generic "$1"
- fi
-
- if [ $? -eq 0 ]; then
- exit_success
- else
- exit_failure_operation_failed
- fi
-}
-
-[ x"$1" != x"" ] || exit_failure_syntax
-
-url=
-while [ $# -gt 0 ] ; do
- parm="$1"
- shift
-
- case "$parm" in
- -*)
- exit_failure_syntax "unexpected option '$parm'"
- ;;
-
- *)
- if [ -n "$url" ] ; then
- exit_failure_syntax "unexpected argument '$parm'"
- fi
- url="$parm"
- ;;
- esac
-done
-
-if [ -z "${url}" ] ; then
- exit_failure_syntax "file or URL argument missing"
-fi
-
-detectDE
-
-if [ x"$DE" = x"" ]; then
- DE=generic
-fi
-
-DEBUG 2 "Selected DE $DE"
-
-# sanitize BROWSER (avoid caling ourselves in particular)
-case "${BROWSER}" in
- *:"xdg-open"|"xdg-open":*)
- BROWSER=$(echo $BROWSER | sed -e 's|:xdg-open||g' -e 's|xdg-open:||g')
- ;;
- "xdg-open")
- BROWSER=
- ;;
-esac
-
-# if BROWSER variable is not set, check some well known browsers instead
-if [ x"$BROWSER" = x"" ]; then
- BROWSER=links2:elinks:links:lynx:w3m
- if [ -n "$DISPLAY" ]; then
- BROWSER=x-www-browser:firefox:seamonkey:mozilla:epiphany:konqueror:chromium-browser:google-chrome:$BROWSER
- fi
-fi
-
-case "$DE" in
- kde)
- open_kde "$url"
- ;;
-
- gnome*)
- open_gnome "$url"
- ;;
-
- mate)
- open_mate "$url"
- ;;
-
- xfce)
- open_xfce "$url"
- ;;
-
- lxde)
- open_lxde "$url"
- ;;
-
- enlightenment)
- open_enlightenment "$url"
- ;;
-
- generic)
- open_generic "$url"
- ;;
-
- *)
- exit_failure_operation_impossible "no method available for opening '$url'"
- ;;
-esac
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie-promise/index.js b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie-promise/index.js
deleted file mode 100644
index 777377a1f77..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie-promise/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-'use strict';
-
-module.exports = typeof Promise === 'function' ? Promise : require('pinkie');
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie-promise/license b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie-promise/license
deleted file mode 100644
index 1aeb74fd25e..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie-promise/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Vsevolod Strukchinsky (github.com/floatdrop)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie-promise/package.json b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie-promise/package.json
deleted file mode 100644
index a02e8f465e0..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie-promise/package.json
+++ /dev/null
@@ -1,94 +0,0 @@
-{
- "_args": [
- [
- "pinkie-promise@^2.0.0",
- "/Users/Filippo/Documents/git/brackets/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn"
- ]
- ],
- "_from": "pinkie-promise@>=2.0.0 <3.0.0",
- "_id": "pinkie-promise@2.0.1",
- "_inCache": true,
- "_installable": true,
- "_location": "/pinkie-promise",
- "_nodeVersion": "4.4.1",
- "_npmOperationalInternal": {
- "host": "packages-16-east.internal.npmjs.com",
- "tmp": "tmp/pinkie-promise-2.0.1.tgz_1460309839126_0.3422858319245279"
- },
- "_npmUser": {
- "email": "floatdrop@gmail.com",
- "name": "floatdrop"
- },
- "_npmVersion": "2.14.20",
- "_phantomChildren": {},
- "_requested": {
- "name": "pinkie-promise",
- "raw": "pinkie-promise@^2.0.0",
- "rawSpec": "^2.0.0",
- "scope": null,
- "spec": ">=2.0.0 <3.0.0",
- "type": "range"
- },
- "_requiredBy": [
- "/opn"
- ],
- "_resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "_shasum": "2135d6dfa7a358c069ac9b178776288228450ffa",
- "_shrinkwrap": null,
- "_spec": "pinkie-promise@^2.0.0",
- "_where": "/Users/Filippo/Documents/git/brackets/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/opn",
- "author": {
- "email": "floatdrop@gmail.com",
- "name": "Vsevolod Strukchinsky",
- "url": "github.com/floatdrop"
- },
- "bugs": {
- "url": "https://github.com/floatdrop/pinkie-promise/issues"
- },
- "dependencies": {
- "pinkie": "^2.0.0"
- },
- "description": "ES2015 Promise ponyfill",
- "devDependencies": {
- "mocha": "*"
- },
- "directories": {},
- "dist": {
- "shasum": "2135d6dfa7a358c069ac9b178776288228450ffa",
- "tarball": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "files": [
- "index.js"
- ],
- "gitHead": "4a936c09c34ad591a25db93f1216d242de0d6184",
- "homepage": "https://github.com/floatdrop/pinkie-promise",
- "keywords": [
- "promise",
- "promises",
- "es2015",
- "es6",
- "polyfill",
- "ponyfill"
- ],
- "license": "MIT",
- "maintainers": [
- {
- "email": "floatdrop@gmail.com",
- "name": "floatdrop"
- }
- ],
- "name": "pinkie-promise",
- "optionalDependencies": {},
- "readme": "ERROR: No README data found!",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/floatdrop/pinkie-promise.git"
- },
- "scripts": {
- "test": "mocha"
- },
- "version": "2.0.1"
-}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie-promise/readme.md b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie-promise/readme.md
deleted file mode 100644
index 78477f4297d..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie-promise/readme.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# pinkie-promise [![Build Status](https://travis-ci.org/floatdrop/pinkie-promise.svg?branch=master)](https://travis-ci.org/floatdrop/pinkie-promise)
-
-> [ES2015 Promise](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-promise-objects) ponyfill
-
-Module exports global Promise object (if available) or [`pinkie`](http://github.com/floatdrop/pinkie) Promise polyfill.
-
-## Install
-
-```
-$ npm install --save pinkie-promise
-```
-
-## Usage
-
-```js
-var Promise = require('pinkie-promise');
-
-new Promise(function (resolve) { resolve('unicorns'); });
-//=> Promise { 'unicorns' }
-```
-
-## Related
-
-- [pify](https://github.com/sindresorhus/pify) - Promisify a callback-style function
-
-## License
-
-MIT © [Vsevolod Strukchinsky](http://github.com/floatdrop)
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie/index.js b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie/index.js
deleted file mode 100644
index 14ce1bfe3d4..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie/index.js
+++ /dev/null
@@ -1,292 +0,0 @@
-'use strict';
-
-var PENDING = 'pending';
-var SETTLED = 'settled';
-var FULFILLED = 'fulfilled';
-var REJECTED = 'rejected';
-var NOOP = function () {};
-var isNode = typeof global !== 'undefined' && typeof global.process !== 'undefined' && typeof global.process.emit === 'function';
-
-var asyncSetTimer = typeof setImmediate === 'undefined' ? setTimeout : setImmediate;
-var asyncQueue = [];
-var asyncTimer;
-
-function asyncFlush() {
- // run promise callbacks
- for (var i = 0; i < asyncQueue.length; i++) {
- asyncQueue[i][0](asyncQueue[i][1]);
- }
-
- // reset async asyncQueue
- asyncQueue = [];
- asyncTimer = false;
-}
-
-function asyncCall(callback, arg) {
- asyncQueue.push([callback, arg]);
-
- if (!asyncTimer) {
- asyncTimer = true;
- asyncSetTimer(asyncFlush, 0);
- }
-}
-
-function invokeResolver(resolver, promise) {
- function resolvePromise(value) {
- resolve(promise, value);
- }
-
- function rejectPromise(reason) {
- reject(promise, reason);
- }
-
- try {
- resolver(resolvePromise, rejectPromise);
- } catch (e) {
- rejectPromise(e);
- }
-}
-
-function invokeCallback(subscriber) {
- var owner = subscriber.owner;
- var settled = owner._state;
- var value = owner._data;
- var callback = subscriber[settled];
- var promise = subscriber.then;
-
- if (typeof callback === 'function') {
- settled = FULFILLED;
- try {
- value = callback(value);
- } catch (e) {
- reject(promise, e);
- }
- }
-
- if (!handleThenable(promise, value)) {
- if (settled === FULFILLED) {
- resolve(promise, value);
- }
-
- if (settled === REJECTED) {
- reject(promise, value);
- }
- }
-}
-
-function handleThenable(promise, value) {
- var resolved;
-
- try {
- if (promise === value) {
- throw new TypeError('A promises callback cannot return that same promise.');
- }
-
- if (value && (typeof value === 'function' || typeof value === 'object')) {
- // then should be retrieved only once
- var then = value.then;
-
- if (typeof then === 'function') {
- then.call(value, function (val) {
- if (!resolved) {
- resolved = true;
-
- if (value === val) {
- fulfill(promise, val);
- } else {
- resolve(promise, val);
- }
- }
- }, function (reason) {
- if (!resolved) {
- resolved = true;
-
- reject(promise, reason);
- }
- });
-
- return true;
- }
- }
- } catch (e) {
- if (!resolved) {
- reject(promise, e);
- }
-
- return true;
- }
-
- return false;
-}
-
-function resolve(promise, value) {
- if (promise === value || !handleThenable(promise, value)) {
- fulfill(promise, value);
- }
-}
-
-function fulfill(promise, value) {
- if (promise._state === PENDING) {
- promise._state = SETTLED;
- promise._data = value;
-
- asyncCall(publishFulfillment, promise);
- }
-}
-
-function reject(promise, reason) {
- if (promise._state === PENDING) {
- promise._state = SETTLED;
- promise._data = reason;
-
- asyncCall(publishRejection, promise);
- }
-}
-
-function publish(promise) {
- promise._then = promise._then.forEach(invokeCallback);
-}
-
-function publishFulfillment(promise) {
- promise._state = FULFILLED;
- publish(promise);
-}
-
-function publishRejection(promise) {
- promise._state = REJECTED;
- publish(promise);
- if (!promise._handled && isNode) {
- global.process.emit('unhandledRejection', promise._data, promise);
- }
-}
-
-function notifyRejectionHandled(promise) {
- global.process.emit('rejectionHandled', promise);
-}
-
-/**
- * @class
- */
-function Promise(resolver) {
- if (typeof resolver !== 'function') {
- throw new TypeError('Promise resolver ' + resolver + ' is not a function');
- }
-
- if (this instanceof Promise === false) {
- throw new TypeError('Failed to construct \'Promise\': Please use the \'new\' operator, this object constructor cannot be called as a function.');
- }
-
- this._then = [];
-
- invokeResolver(resolver, this);
-}
-
-Promise.prototype = {
- constructor: Promise,
-
- _state: PENDING,
- _then: null,
- _data: undefined,
- _handled: false,
-
- then: function (onFulfillment, onRejection) {
- var subscriber = {
- owner: this,
- then: new this.constructor(NOOP),
- fulfilled: onFulfillment,
- rejected: onRejection
- };
-
- if ((onRejection || onFulfillment) && !this._handled) {
- this._handled = true;
- if (this._state === REJECTED && isNode) {
- asyncCall(notifyRejectionHandled, this);
- }
- }
-
- if (this._state === FULFILLED || this._state === REJECTED) {
- // already resolved, call callback async
- asyncCall(invokeCallback, subscriber);
- } else {
- // subscribe
- this._then.push(subscriber);
- }
-
- return subscriber.then;
- },
-
- catch: function (onRejection) {
- return this.then(null, onRejection);
- }
-};
-
-Promise.all = function (promises) {
- if (!Array.isArray(promises)) {
- throw new TypeError('You must pass an array to Promise.all().');
- }
-
- return new Promise(function (resolve, reject) {
- var results = [];
- var remaining = 0;
-
- function resolver(index) {
- remaining++;
- return function (value) {
- results[index] = value;
- if (!--remaining) {
- resolve(results);
- }
- };
- }
-
- for (var i = 0, promise; i < promises.length; i++) {
- promise = promises[i];
-
- if (promise && typeof promise.then === 'function') {
- promise.then(resolver(i), reject);
- } else {
- results[i] = promise;
- }
- }
-
- if (!remaining) {
- resolve(results);
- }
- });
-};
-
-Promise.race = function (promises) {
- if (!Array.isArray(promises)) {
- throw new TypeError('You must pass an array to Promise.race().');
- }
-
- return new Promise(function (resolve, reject) {
- for (var i = 0, promise; i < promises.length; i++) {
- promise = promises[i];
-
- if (promise && typeof promise.then === 'function') {
- promise.then(resolve, reject);
- } else {
- resolve(promise);
- }
- }
- });
-};
-
-Promise.resolve = function (value) {
- if (value && typeof value === 'object' && value.constructor === Promise) {
- return value;
- }
-
- return new Promise(function (resolve) {
- resolve(value);
- });
-};
-
-Promise.reject = function (reason) {
- return new Promise(function (resolve, reject) {
- reject(reason);
- });
-};
-
-module.exports = Promise;
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie/license b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie/license
deleted file mode 100644
index 1aeb74fd25e..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Vsevolod Strukchinsky (github.com/floatdrop)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie/package.json b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie/package.json
deleted file mode 100644
index 096b2057a3a..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie/package.json
+++ /dev/null
@@ -1,92 +0,0 @@
-{
- "_args": [
- [
- "pinkie@^2.0.0",
- "/Users/Filippo/Documents/git/brackets/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie-promise"
- ]
- ],
- "_from": "pinkie@>=2.0.0 <3.0.0",
- "_id": "pinkie@2.0.4",
- "_inCache": true,
- "_installable": true,
- "_location": "/pinkie",
- "_nodeVersion": "4.2.4",
- "_npmUser": {
- "email": "floatdrop@gmail.com",
- "name": "floatdrop"
- },
- "_npmVersion": "2.14.12",
- "_phantomChildren": {},
- "_requested": {
- "name": "pinkie",
- "raw": "pinkie@^2.0.0",
- "rawSpec": "^2.0.0",
- "scope": null,
- "spec": ">=2.0.0 <3.0.0",
- "type": "range"
- },
- "_requiredBy": [
- "/pinkie-promise"
- ],
- "_resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "_shasum": "72556b80cfa0d48a974e80e77248e80ed4f7f870",
- "_shrinkwrap": null,
- "_spec": "pinkie@^2.0.0",
- "_where": "/Users/Filippo/Documents/git/brackets/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie-promise",
- "author": {
- "email": "floatdrop@gmail.com",
- "name": "Vsevolod Strukchinsky",
- "url": "github.com/floatdrop"
- },
- "bugs": {
- "url": "https://github.com/floatdrop/pinkie/issues"
- },
- "dependencies": {},
- "description": "Itty bitty little widdle twinkie pinkie ES2015 Promise implementation",
- "devDependencies": {
- "core-assert": "^0.1.1",
- "coveralls": "^2.11.4",
- "mocha": "*",
- "nyc": "^3.2.2",
- "promises-aplus-tests": "*",
- "xo": "^0.10.1"
- },
- "directories": {},
- "dist": {
- "shasum": "72556b80cfa0d48a974e80e77248e80ed4f7f870",
- "tarball": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "files": [
- "index.js"
- ],
- "gitHead": "8d4a92447a5c62bff9f89756caeb4c9c8770579b",
- "homepage": "https://github.com/floatdrop/pinkie",
- "keywords": [
- "promise",
- "promises",
- "es2015",
- "es6"
- ],
- "license": "MIT",
- "maintainers": [
- {
- "email": "floatdrop@gmail.com",
- "name": "floatdrop"
- }
- ],
- "name": "pinkie",
- "optionalDependencies": {},
- "readme": "ERROR: No README data found!",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/floatdrop/pinkie.git"
- },
- "scripts": {
- "coverage": "nyc report --reporter=text-lcov | coveralls",
- "test": "xo && nyc mocha"
- },
- "version": "2.0.4"
-}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie/readme.md b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie/readme.md
deleted file mode 100644
index 1565f958896..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/node_modules/pinkie/readme.md
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
-
-
-
-
-
-> Itty bitty little widdle twinkie pinkie [ES2015 Promise](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-promise-objects) implementation
-
-[![Build Status](https://travis-ci.org/floatdrop/pinkie.svg?branch=master)](https://travis-ci.org/floatdrop/pinkie) [![Coverage Status](https://coveralls.io/repos/floatdrop/pinkie/badge.svg?branch=master&service=github)](https://coveralls.io/github/floatdrop/pinkie?branch=master)
-
-There are [tons of Promise implementations](https://github.com/promises-aplus/promises-spec/blob/master/implementations.md#standalone) out there, but all of them focus on browser compatibility and are often bloated with functionality.
-
-This module is an exact Promise specification polyfill (like [native-promise-only](https://github.com/getify/native-promise-only)), but in Node.js land (it should be browserify-able though).
-
-
-## Install
-
-```
-$ npm install --save pinkie
-```
-
-
-## Usage
-
-```js
-var fs = require('fs');
-var Promise = require('pinkie');
-
-new Promise(function (resolve, reject) {
- fs.readFile('foo.json', 'utf8', function (err, data) {
- if (err) {
- reject(err);
- return;
- }
-
- resolve(data);
- });
-});
-//=> Promise
-```
-
-
-### API
-
-`pinkie` exports bare [ES2015 Promise](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-promise-objects) implementation and polyfills [Node.js rejection events](https://nodejs.org/api/process.html#process_event_unhandledrejection). In case you forgot:
-
-#### new Promise(executor)
-
-Returns new instance of `Promise`.
-
-##### executor
-
-*Required*
-Type: `function`
-
-Function with two arguments `resolve` and `reject`. The first argument fulfills the promise, the second argument rejects it.
-
-#### pinkie.all(promises)
-
-Returns a promise that resolves when all of the promises in the `promises` Array argument have resolved.
-
-#### pinkie.race(promises)
-
-Returns a promise that resolves or rejects as soon as one of the promises in the `promises` Array resolves or rejects, with the value or reason from that promise.
-
-#### pinkie.reject(reason)
-
-Returns a Promise object that is rejected with the given `reason`.
-
-#### pinkie.resolve(value)
-
-Returns a Promise object that is resolved with the given `value`. If the `value` is a thenable (i.e. has a then method), the returned promise will "follow" that thenable, adopting its eventual state; otherwise the returned promise will be fulfilled with the `value`.
-
-
-## Related
-
-- [pinkie-promise](https://github.com/floatdrop/pinkie-promise) - Returns the native Promise or this module
-
-
-## License
-
-MIT © [Vsevolod Strukchinsky](http://github.com/floatdrop)
diff --git a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/package.json b/src/LiveDevelopment/MultiBrowserImpl/launchers/node/package.json
deleted file mode 100644
index 994a54144c5..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/launchers/node/package.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "livedev-multibrowser-launchers",
- "dependencies": {
- "opn": "4.0.2"
- }
-}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/protocol/LiveDevProtocol.js b/src/LiveDevelopment/MultiBrowserImpl/protocol/LiveDevProtocol.js
index 56d0874294e..159d16ec5d6 100644
--- a/src/LiveDevelopment/MultiBrowserImpl/protocol/LiveDevProtocol.js
+++ b/src/LiveDevelopment/MultiBrowserImpl/protocol/LiveDevProtocol.js
@@ -45,8 +45,10 @@ define(function (require, exports, module) {
// Text of the script we'll inject into the browser that handles protocol requests.
var LiveDevProtocolRemote = require("text!LiveDevelopment/MultiBrowserImpl/protocol/remote/LiveDevProtocolRemote.js"),
- DocumentObserver = require("text!LiveDevelopment/MultiBrowserImpl/protocol/remote/DocumentObserver.js"),
- RemoteFunctions = require("text!LiveDevelopment/Agents/RemoteFunctions.js");
+ DocumentObserver = require("text!LiveDevelopment/MultiBrowserImpl/protocol/remote/DocumentObserver.js"),
+ RemoteFunctions = require("text!LiveDevelopment/Agents/RemoteFunctions.js"),
+ EditorManager = require("editor/EditorManager"),
+ HTMLInstrumentation = require("language/HTMLInstrumentation");
/**
* @private
@@ -109,6 +111,12 @@ define(function (require, exports, module) {
deferred.resolve(msg);
}
}
+ } else if (msg.tagId) {
+ var editor = EditorManager.getActiveEditor(),
+ position = HTMLInstrumentation.getPositionFromTagId(editor, parseInt(msg.tagId, 10));
+ if (position) {
+ editor.setCursorPos(position.line, position.ch, true);
+ }
} else {
// enrich received message with clientId
msg.clientId = clientId;
diff --git a/src/LiveDevelopment/MultiBrowserImpl/protocol/remote/LiveDevProtocolRemote.js b/src/LiveDevelopment/MultiBrowserImpl/protocol/remote/LiveDevProtocolRemote.js
index da2d0ad324e..943dbe165bc 100644
--- a/src/LiveDevelopment/MultiBrowserImpl/protocol/remote/LiveDevProtocolRemote.js
+++ b/src/LiveDevelopment/MultiBrowserImpl/protocol/remote/LiveDevProtocolRemote.js
@@ -376,5 +376,18 @@
window.addEventListener('load', function () {
ProtocolManager.enable();
});
+
+ /**
+ * Sends the message containing tagID which is being clicked
+ * to the editor in order to change the cursor position to
+ * the HTML tag corresponding to the clicked element.
+ */
+ function onDocumentClick(event) {
+ var element = event.target;
+ if (element && element.hasAttribute('data-brackets-id')) {
+ MessageBroker.send({"tagId": element.getAttribute('data-brackets-id')});
+ }
+ }
+ window.document.addEventListener("click", onDocumentClick);
}(this));
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/.bin/wscat b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/.bin/wscat
deleted file mode 100644
index 1a710cfd651..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/.bin/wscat
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-basedir=`dirname "$0"`
-
-case `uname` in
- *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
-esac
-
-if [ -x "$basedir/node" ]; then
- "$basedir/node" "$basedir/../ws/bin/wscat" "$@"
- ret=$?
-else
- node "$basedir/../ws/bin/wscat" "$@"
- ret=$?
-fi
-exit $ret
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/.bin/wscat.cmd b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/.bin/wscat.cmd
deleted file mode 100644
index a681b37aade..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/.bin/wscat.cmd
+++ /dev/null
@@ -1,5 +0,0 @@
-@IF EXIST "%~dp0\node.exe" (
- "%~dp0\node.exe" "%~dp0\..\ws\bin\wscat" %*
-) ELSE (
- node "%~dp0\..\ws\bin\wscat" %*
-)
\ No newline at end of file
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/lodash/LICENSE.txt b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/lodash/LICENSE.txt
deleted file mode 100644
index 49869bbab37..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/lodash/LICENSE.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright 2012-2013 The Dojo Foundation
-Based on Underscore.js 1.5.2, copyright 2009-2013 Jeremy Ashkenas,
-DocumentCloud and Investigative Reporters & Editors
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/lodash/README.md b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/lodash/README.md
deleted file mode 100644
index 6f9598e8a9d..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/lodash/README.md
+++ /dev/null
@@ -1,163 +0,0 @@
-# Lo-Dash v2.4.1
-A utility library delivering consistency, [customization](http://lodash.com/custom-builds), [performance](http://lodash.com/benchmarks), & [extras](http://lodash.com/#features).
-
-## Download
-
-Check out our [wiki]([https://github.com/lodash/lodash/wiki/build-differences]) for details over the differences between builds.
-
-* Modern builds perfect for newer browsers/environments:
-[Development](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.js) &
-[Production](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.min.js)
-
-* Compatibility builds for older environment support too:
-[Development](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.compat.js) &
-[Production](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.compat.min.js)
-
-* Underscore builds to use as a drop-in replacement:
-[Development](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.js) &
-[Production](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.min.js)
-
-CDN copies are available on [cdnjs](http://cdnjs.com/libraries/lodash.js/) & [jsDelivr](http://www.jsdelivr.com/#!lodash). For smaller file sizes, create [custom builds](http://lodash.com/custom-builds) with only the features needed.
-
-Love modules? We’ve got you covered with [lodash-amd](https://npmjs.org/package/lodash-amd), [lodash-es6](https://github.com/lodash/lodash-es6), [lodash-node](https://npmjs.org/package/lodash-node), & [npm packages](https://npmjs.org/browse/keyword/lodash-modularized) per method.
-
-## Dive in
-
-There’s plenty of **[documentation](http://lodash.com/docs)**, [unit tests](http://lodash.com/tests), & [benchmarks](http://lodash.com/benchmarks).
-Check out DevDocs as a fast, organized, & searchable interface for our documentation.
-
-The full changelog for this release is available on our [wiki](https://github.com/lodash/lodash/wiki/Changelog).
-A list of upcoming features is available on our [roadmap](https://github.com/lodash/lodash/wiki/Roadmap).
-
-## Features *not* in Underscore
-
- * AMD loader support ([curl](https://github.com/cujojs/curl), [dojo](http://dojotoolkit.org/), [requirejs](http://requirejs.org/), etc.)
- * [_(…)](http://lodash.com/docs#_) supports intuitive chaining
- * [_.at](http://lodash.com/docs#at) for cherry-picking collection values
- * [_.bindKey](http://lodash.com/docs#bindKey) for binding [*“lazy”*](http://michaux.ca/articles/lazy-function-definition-pattern) defined methods
- * [_.clone](http://lodash.com/docs#clone) supports shallow cloning of `Date` & `RegExp` objects
- * [_.cloneDeep](http://lodash.com/docs#cloneDeep) for deep cloning arrays & objects
- * [_.constant](http://lodash.com/docs#constant) & [_.property](http://lodash.com/docs#property) function generators for composing functions
- * [_.contains](http://lodash.com/docs#contains) accepts a `fromIndex`
- * [_.create](http://lodash.com/docs#create) for easier object inheritance
- * [_.createCallback](http://lodash.com/docs#createCallback) for extending callbacks in methods & mixins
- * [_.curry](http://lodash.com/docs#curry) for creating [curried](http://hughfdjackson.com/javascript/2013/07/06/why-curry-helps/) functions
- * [_.debounce](http://lodash.com/docs#debounce) & [_.throttle](http://lodash.com/docs#throttle) accept additional `options` for more control
- * [_.findIndex](http://lodash.com/docs#findIndex) & [_.findKey](http://lodash.com/docs#findKey) for finding indexes & keys
- * [_.forEach](http://lodash.com/docs#forEach) is chainable & supports exiting early
- * [_.forIn](http://lodash.com/docs#forIn) for iterating own & inherited properties
- * [_.forOwn](http://lodash.com/docs#forOwn) for iterating own properties
- * [_.isPlainObject](http://lodash.com/docs#isPlainObject) for checking if values are created by `Object`
- * [_.mapValues](http://lodash.com/docs#mapValues) for [mapping](http://lodash.com/docs#map) values to an object
- * [_.memoize](http://lodash.com/docs#memoize) exposes the `cache` of memoized functions
- * [_.merge](http://lodash.com/docs#merge) for a deep [_.extend](http://lodash.com/docs#extend)
- * [_.noop](http://lodash.com/docs#noop) for function placeholders
- * [_.now](http://lodash.com/docs#now) as a cross-browser `Date.now` alternative
- * [_.parseInt](http://lodash.com/docs#parseInt) for consistent behavior
- * [_.pull](http://lodash.com/docs#pull) & [_.remove](http://lodash.com/docs#remove) for mutating arrays
- * [_.random](http://lodash.com/docs#random) supports returning floating-point numbers
- * [_.runInContext](http://lodash.com/docs#runInContext) for easier mocking
- * [_.sortBy](http://lodash.com/docs#sortBy) supports sorting by multiple properties
- * [_.support](http://lodash.com/docs#support) for flagging environment features
- * [_.template](http://lodash.com/docs#template) supports [*“imports”*](http://lodash.com/docs#templateSettings_imports) options & [ES6 template delimiters](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals)
- * [_.transform](http://lodash.com/docs#transform) as a powerful alternative to [_.reduce](http://lodash.com/docs#reduce) for transforming objects
- * [_.where](http://lodash.com/docs#where) supports deep object comparisons
- * [_.xor](http://lodash.com/docs#xor) as a companion to [_.difference](http://lodash.com/docs#difference), [_.intersection](http://lodash.com/docs#intersection), & [_.union](http://lodash.com/docs#union)
- * [_.zip](http://lodash.com/docs#zip) is capable of unzipping values
- * [_.omit](http://lodash.com/docs#omit), [_.pick](http://lodash.com/docs#pick), &
- [more](http://lodash.com/docs "_.assign, _.clone, _.cloneDeep, _.first, _.initial, _.isEqual, _.last, _.merge, _.rest") accept callbacks
- * [_.contains](http://lodash.com/docs#contains), [_.toArray](http://lodash.com/docs#toArray), &
- [more](http://lodash.com/docs "_.at, _.countBy, _.every, _.filter, _.find, _.forEach, _.forEachRight, _.groupBy, _.invoke, _.map, _.max, _.min, _.pluck, _.reduce, _.reduceRight, _.reject, _.shuffle, _.size, _.some, _.sortBy, _.where") accept strings
- * [_.filter](http://lodash.com/docs#filter), [_.map](http://lodash.com/docs#map), &
- [more](http://lodash.com/docs "_.countBy, _.every, _.find, _.findKey, _.findLast, _.findLastIndex, _.findLastKey, _.first, _.groupBy, _.initial, _.last, _.max, _.min, _.reject, _.rest, _.some, _.sortBy, _.sortedIndex, _.uniq") support *“_.pluck”* & *“_.where”* shorthands
- * [_.findLast](http://lodash.com/docs#findLast), [_.findLastIndex](http://lodash.com/docs#findLastIndex), &
- [more](http://lodash.com/docs "_.findLastKey, _.forEachRight, _.forInRight, _.forOwnRight, _.partialRight") right-associative methods
-
-## Resources
-
- * Podcasts
- - [JavaScript Jabber](http://javascriptjabber.com/079-jsj-lo-dash-with-john-david-dalton/)
-
- * Posts
- - [Say “Hello” to Lo-Dash](http://kitcambridge.be/blog/say-hello-to-lo-dash/)
- - [Custom builds in Lo-Dash 2.0](http://kitcambridge.be/blog/custom-builds-in-lo-dash-2-dot-0/)
-
- * Videos
- - [Introduction](https://vimeo.com/44154599)
- - [Origins](https://vimeo.com/44154600)
- - [Optimizations & builds](https://vimeo.com/44154601)
- - [Native method use](https://vimeo.com/48576012)
- - [Testing](https://vimeo.com/45865290)
- - [CascadiaJS ’12](http://www.youtube.com/watch?v=dpPy4f_SeEk)
-
- A list of other community created podcasts, posts, & videos is available on our [wiki](https://github.com/lodash/lodash/wiki/Resources).
-
-## Support
-
-Tested in Chrome 5~31, Firefox 2~25, IE 6-11, Opera 9.25~17, Safari 3-7, Node.js 0.6.21~0.10.22, Narwhal 0.3.2, PhantomJS 1.9.2, RingoJS 0.9, & Rhino 1.7RC5.
-Automated browser test results [are available](https://saucelabs.com/u/lodash) as well as [Travis CI](https://travis-ci.org/) builds for [lodash](https://travis-ci.org/lodash/lodash/), [lodash-cli](https://travis-ci.org/lodash/lodash-cli/), [lodash-amd](https://travis-ci.org/lodash/lodash-amd/), [lodash-node](https://travis-ci.org/lodash/lodash-node/), & [grunt-lodash](https://travis-ci.org/lodash/grunt-lodash).
-
-Special thanks to [Sauce Labs](https://saucelabs.com/) for providing automated browser testing.
-[![Sauce Labs](http://lodash.com/_img/sauce.png)](https://saucelabs.com/ "Sauce Labs: Selenium Testing & More")
-
-## Installation & usage
-
-In browsers:
-
-```html
-
-```
-
-Using [`npm`](http://npmjs.org/):
-
-```bash
-npm i --save lodash
-
-{sudo} npm i -g lodash
-npm ln lodash
-```
-
-In [Node.js](http://nodejs.org/) & [Ringo](http://ringojs.org/):
-
-```js
-var _ = require('lodash');
-// or as Underscore
-var _ = require('lodash/dist/lodash.underscore');
-```
-
-**Notes:**
- * Don’t assign values to [special variable](http://nodejs.org/api/repl.html#repl_repl_features) `_` when in the REPL
- * If Lo-Dash is installed globally, run [`npm ln lodash`](http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/) in your project’s root directory *before* requiring it
-
-In [Rhino](http://www.mozilla.org/rhino/):
-
-```js
-load('lodash.js');
-```
-
-In an AMD loader:
-
-```js
-require({
- 'packages': [
- { 'name': 'lodash', 'location': 'path/to/lodash', 'main': 'lodash' }
- ]
-},
-['lodash'], function(_) {
- console.log(_.VERSION);
-});
-```
-
-## Author
-
-| [![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](https://twitter.com/jdalton "Follow @jdalton on Twitter") |
-|---|
-| [John-David Dalton](http://allyoucanleet.com/) |
-
-## Contributors
-
-| [![twitter/blainebublitz](http://gravatar.com/avatar/ac1c67fd906c9fecd823ce302283b4c1?s=70)](https://twitter.com/blainebublitz "Follow @BlaineBublitz on Twitter") | [![twitter/kitcambridge](http://gravatar.com/avatar/6662a1d02f351b5ef2f8b4d815804661?s=70)](https://twitter.com/kitcambridge "Follow @kitcambridge on Twitter") | [![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") |
-|---|---|---|
-| [Blaine Bublitz](http://www.iceddev.com/) | [Kit Cambridge](http://kitcambridge.be/) | [Mathias Bynens](http://mathiasbynens.be/) |
-
-[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/lodash/lodash/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/lodash/dist/lodash.compat.js b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/lodash/dist/lodash.compat.js
deleted file mode 100644
index 23798ba8538..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/lodash/dist/lodash.compat.js
+++ /dev/null
@@ -1,7157 +0,0 @@
-/**
- * @license
- * Lo-Dash 2.4.1 (Custom Build)
- * Build: `lodash -o ./dist/lodash.compat.js`
- * Copyright 2012-2013 The Dojo Foundation
- * Based on Underscore.js 1.5.2
- * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license
- */
-;(function() {
-
- /** Used as a safe reference for `undefined` in pre ES5 environments */
- var undefined;
-
- /** Used to pool arrays and objects used internally */
- var arrayPool = [],
- objectPool = [];
-
- /** Used to generate unique IDs */
- var idCounter = 0;
-
- /** Used internally to indicate various things */
- var indicatorObject = {};
-
- /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */
- var keyPrefix = +new Date + '';
-
- /** Used as the size when optimizations are enabled for large arrays */
- var largeArraySize = 75;
-
- /** Used as the max size of the `arrayPool` and `objectPool` */
- var maxPoolSize = 40;
-
- /** Used to detect and test whitespace */
- var whitespace = (
- // whitespace
- ' \t\x0B\f\xA0\ufeff' +
-
- // line terminators
- '\n\r\u2028\u2029' +
-
- // unicode category "Zs" space separators
- '\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000'
- );
-
- /** Used to match empty string literals in compiled template source */
- var reEmptyStringLeading = /\b__p \+= '';/g,
- reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
- reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
-
- /**
- * Used to match ES6 template delimiters
- * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals
- */
- var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
-
- /** Used to match regexp flags from their coerced string values */
- var reFlags = /\w*$/;
-
- /** Used to detected named functions */
- var reFuncName = /^\s*function[ \n\r\t]+\w/;
-
- /** Used to match "interpolate" template delimiters */
- var reInterpolate = /<%=([\s\S]+?)%>/g;
-
- /** Used to match leading whitespace and zeros to be removed */
- var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');
-
- /** Used to ensure capturing order of template delimiters */
- var reNoMatch = /($^)/;
-
- /** Used to detect functions containing a `this` reference */
- var reThis = /\bthis\b/;
-
- /** Used to match unescaped characters in compiled string literals */
- var reUnescapedString = /['\n\r\t\u2028\u2029\\]/g;
-
- /** Used to assign default `context` object properties */
- var contextProps = [
- 'Array', 'Boolean', 'Date', 'Error', 'Function', 'Math', 'Number', 'Object',
- 'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',
- 'parseInt', 'setTimeout'
- ];
-
- /** Used to fix the JScript [[DontEnum]] bug */
- var shadowedProps = [
- 'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',
- 'toLocaleString', 'toString', 'valueOf'
- ];
-
- /** Used to make template sourceURLs easier to identify */
- var templateCounter = 0;
-
- /** `Object#toString` result shortcuts */
- var argsClass = '[object Arguments]',
- arrayClass = '[object Array]',
- boolClass = '[object Boolean]',
- dateClass = '[object Date]',
- errorClass = '[object Error]',
- funcClass = '[object Function]',
- numberClass = '[object Number]',
- objectClass = '[object Object]',
- regexpClass = '[object RegExp]',
- stringClass = '[object String]';
-
- /** Used to identify object classifications that `_.clone` supports */
- var cloneableClasses = {};
- cloneableClasses[funcClass] = false;
- cloneableClasses[argsClass] = cloneableClasses[arrayClass] =
- cloneableClasses[boolClass] = cloneableClasses[dateClass] =
- cloneableClasses[numberClass] = cloneableClasses[objectClass] =
- cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;
-
- /** Used as an internal `_.debounce` options object */
- var debounceOptions = {
- 'leading': false,
- 'maxWait': 0,
- 'trailing': false
- };
-
- /** Used as the property descriptor for `__bindData__` */
- var descriptor = {
- 'configurable': false,
- 'enumerable': false,
- 'value': null,
- 'writable': false
- };
-
- /** Used as the data object for `iteratorTemplate` */
- var iteratorData = {
- 'args': '',
- 'array': null,
- 'bottom': '',
- 'firstArg': '',
- 'init': '',
- 'keys': null,
- 'loop': '',
- 'shadowedProps': null,
- 'support': null,
- 'top': '',
- 'useHas': false
- };
-
- /** Used to determine if values are of the language type Object */
- var objectTypes = {
- 'boolean': false,
- 'function': true,
- 'object': true,
- 'number': false,
- 'string': false,
- 'undefined': false
- };
-
- /** Used to escape characters for inclusion in compiled string literals */
- var stringEscapes = {
- '\\': '\\',
- "'": "'",
- '\n': 'n',
- '\r': 'r',
- '\t': 't',
- '\u2028': 'u2028',
- '\u2029': 'u2029'
- };
-
- /** Used as a reference to the global object */
- var root = (objectTypes[typeof window] && window) || this;
-
- /** Detect free variable `exports` */
- var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
-
- /** Detect free variable `module` */
- var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;
-
- /** Detect the popular CommonJS extension `module.exports` */
- var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;
-
- /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */
- var freeGlobal = objectTypes[typeof global] && global;
- if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {
- root = freeGlobal;
- }
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * The base implementation of `_.indexOf` without support for binary searches
- * or `fromIndex` constraints.
- *
- * @private
- * @param {Array} array The array to search.
- * @param {*} value The value to search for.
- * @param {number} [fromIndex=0] The index to search from.
- * @returns {number} Returns the index of the matched value or `-1`.
- */
- function baseIndexOf(array, value, fromIndex) {
- var index = (fromIndex || 0) - 1,
- length = array ? array.length : 0;
-
- while (++index < length) {
- if (array[index] === value) {
- return index;
- }
- }
- return -1;
- }
-
- /**
- * An implementation of `_.contains` for cache objects that mimics the return
- * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.
- *
- * @private
- * @param {Object} cache The cache object to inspect.
- * @param {*} value The value to search for.
- * @returns {number} Returns `0` if `value` is found, else `-1`.
- */
- function cacheIndexOf(cache, value) {
- var type = typeof value;
- cache = cache.cache;
-
- if (type == 'boolean' || value == null) {
- return cache[value] ? 0 : -1;
- }
- if (type != 'number' && type != 'string') {
- type = 'object';
- }
- var key = type == 'number' ? value : keyPrefix + value;
- cache = (cache = cache[type]) && cache[key];
-
- return type == 'object'
- ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)
- : (cache ? 0 : -1);
- }
-
- /**
- * Adds a given value to the corresponding cache object.
- *
- * @private
- * @param {*} value The value to add to the cache.
- */
- function cachePush(value) {
- var cache = this.cache,
- type = typeof value;
-
- if (type == 'boolean' || value == null) {
- cache[value] = true;
- } else {
- if (type != 'number' && type != 'string') {
- type = 'object';
- }
- var key = type == 'number' ? value : keyPrefix + value,
- typeCache = cache[type] || (cache[type] = {});
-
- if (type == 'object') {
- (typeCache[key] || (typeCache[key] = [])).push(value);
- } else {
- typeCache[key] = true;
- }
- }
- }
-
- /**
- * Used by `_.max` and `_.min` as the default callback when a given
- * collection is a string value.
- *
- * @private
- * @param {string} value The character to inspect.
- * @returns {number} Returns the code unit of given character.
- */
- function charAtCallback(value) {
- return value.charCodeAt(0);
- }
-
- /**
- * Used by `sortBy` to compare transformed `collection` elements, stable sorting
- * them in ascending order.
- *
- * @private
- * @param {Object} a The object to compare to `b`.
- * @param {Object} b The object to compare to `a`.
- * @returns {number} Returns the sort order indicator of `1` or `-1`.
- */
- function compareAscending(a, b) {
- var ac = a.criteria,
- bc = b.criteria,
- index = -1,
- length = ac.length;
-
- while (++index < length) {
- var value = ac[index],
- other = bc[index];
-
- if (value !== other) {
- if (value > other || typeof value == 'undefined') {
- return 1;
- }
- if (value < other || typeof other == 'undefined') {
- return -1;
- }
- }
- }
- // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
- // that causes it, under certain circumstances, to return the same value for
- // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247
- //
- // This also ensures a stable sort in V8 and other engines.
- // See http://code.google.com/p/v8/issues/detail?id=90
- return a.index - b.index;
- }
-
- /**
- * Creates a cache object to optimize linear searches of large arrays.
- *
- * @private
- * @param {Array} [array=[]] The array to search.
- * @returns {null|Object} Returns the cache object or `null` if caching should not be used.
- */
- function createCache(array) {
- var index = -1,
- length = array.length,
- first = array[0],
- mid = array[(length / 2) | 0],
- last = array[length - 1];
-
- if (first && typeof first == 'object' &&
- mid && typeof mid == 'object' && last && typeof last == 'object') {
- return false;
- }
- var cache = getObject();
- cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;
-
- var result = getObject();
- result.array = array;
- result.cache = cache;
- result.push = cachePush;
-
- while (++index < length) {
- result.push(array[index]);
- }
- return result;
- }
-
- /**
- * Used by `template` to escape characters for inclusion in compiled
- * string literals.
- *
- * @private
- * @param {string} match The matched character to escape.
- * @returns {string} Returns the escaped character.
- */
- function escapeStringChar(match) {
- return '\\' + stringEscapes[match];
- }
-
- /**
- * Gets an array from the array pool or creates a new one if the pool is empty.
- *
- * @private
- * @returns {Array} The array from the pool.
- */
- function getArray() {
- return arrayPool.pop() || [];
- }
-
- /**
- * Gets an object from the object pool or creates a new one if the pool is empty.
- *
- * @private
- * @returns {Object} The object from the pool.
- */
- function getObject() {
- return objectPool.pop() || {
- 'array': null,
- 'cache': null,
- 'criteria': null,
- 'false': false,
- 'index': 0,
- 'null': false,
- 'number': null,
- 'object': null,
- 'push': null,
- 'string': null,
- 'true': false,
- 'undefined': false,
- 'value': null
- };
- }
-
- /**
- * Checks if `value` is a DOM node in IE < 9.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is a DOM node, else `false`.
- */
- function isNode(value) {
- // IE < 9 presents DOM nodes as `Object` objects except they have `toString`
- // methods that are `typeof` "string" and still can coerce nodes to strings
- return typeof value.toString != 'function' && typeof (value + '') == 'string';
- }
-
- /**
- * Releases the given array back to the array pool.
- *
- * @private
- * @param {Array} [array] The array to release.
- */
- function releaseArray(array) {
- array.length = 0;
- if (arrayPool.length < maxPoolSize) {
- arrayPool.push(array);
- }
- }
-
- /**
- * Releases the given object back to the object pool.
- *
- * @private
- * @param {Object} [object] The object to release.
- */
- function releaseObject(object) {
- var cache = object.cache;
- if (cache) {
- releaseObject(cache);
- }
- object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;
- if (objectPool.length < maxPoolSize) {
- objectPool.push(object);
- }
- }
-
- /**
- * Slices the `collection` from the `start` index up to, but not including,
- * the `end` index.
- *
- * Note: This function is used instead of `Array#slice` to support node lists
- * in IE < 9 and to ensure dense arrays are returned.
- *
- * @private
- * @param {Array|Object|string} collection The collection to slice.
- * @param {number} start The start index.
- * @param {number} end The end index.
- * @returns {Array} Returns the new array.
- */
- function slice(array, start, end) {
- start || (start = 0);
- if (typeof end == 'undefined') {
- end = array ? array.length : 0;
- }
- var index = -1,
- length = end - start || 0,
- result = Array(length < 0 ? 0 : length);
-
- while (++index < length) {
- result[index] = array[start + index];
- }
- return result;
- }
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Create a new `lodash` function using the given context object.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {Object} [context=root] The context object.
- * @returns {Function} Returns the `lodash` function.
- */
- function runInContext(context) {
- // Avoid issues with some ES3 environments that attempt to use values, named
- // after built-in constructors like `Object`, for the creation of literals.
- // ES5 clears this up by stating that literals must use built-in constructors.
- // See http://es5.github.io/#x11.1.5.
- context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;
-
- /** Native constructor references */
- var Array = context.Array,
- Boolean = context.Boolean,
- Date = context.Date,
- Error = context.Error,
- Function = context.Function,
- Math = context.Math,
- Number = context.Number,
- Object = context.Object,
- RegExp = context.RegExp,
- String = context.String,
- TypeError = context.TypeError;
-
- /**
- * Used for `Array` method references.
- *
- * Normally `Array.prototype` would suffice, however, using an array literal
- * avoids issues in Narwhal.
- */
- var arrayRef = [];
-
- /** Used for native method references */
- var errorProto = Error.prototype,
- objectProto = Object.prototype,
- stringProto = String.prototype;
-
- /** Used to restore the original `_` reference in `noConflict` */
- var oldDash = context._;
-
- /** Used to resolve the internal [[Class]] of values */
- var toString = objectProto.toString;
-
- /** Used to detect if a method is native */
- var reNative = RegExp('^' +
- String(toString)
- .replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
- .replace(/toString| for [^\]]+/g, '.*?') + '$'
- );
-
- /** Native method shortcuts */
- var ceil = Math.ceil,
- clearTimeout = context.clearTimeout,
- floor = Math.floor,
- fnToString = Function.prototype.toString,
- getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,
- hasOwnProperty = objectProto.hasOwnProperty,
- push = arrayRef.push,
- propertyIsEnumerable = objectProto.propertyIsEnumerable,
- setTimeout = context.setTimeout,
- splice = arrayRef.splice,
- unshift = arrayRef.unshift;
-
- /** Used to set meta data on functions */
- var defineProperty = (function() {
- // IE 8 only accepts DOM elements
- try {
- var o = {},
- func = isNative(func = Object.defineProperty) && func,
- result = func(o, o, o) && func;
- } catch(e) { }
- return result;
- }());
-
- /* Native method shortcuts for methods with the same name as other `lodash` methods */
- var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,
- nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,
- nativeIsFinite = context.isFinite,
- nativeIsNaN = context.isNaN,
- nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,
- nativeMax = Math.max,
- nativeMin = Math.min,
- nativeParseInt = context.parseInt,
- nativeRandom = Math.random;
-
- /** Used to lookup a built-in constructor by [[Class]] */
- var ctorByClass = {};
- ctorByClass[arrayClass] = Array;
- ctorByClass[boolClass] = Boolean;
- ctorByClass[dateClass] = Date;
- ctorByClass[funcClass] = Function;
- ctorByClass[objectClass] = Object;
- ctorByClass[numberClass] = Number;
- ctorByClass[regexpClass] = RegExp;
- ctorByClass[stringClass] = String;
-
- /** Used to avoid iterating non-enumerable properties in IE < 9 */
- var nonEnumProps = {};
- nonEnumProps[arrayClass] = nonEnumProps[dateClass] = nonEnumProps[numberClass] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };
- nonEnumProps[boolClass] = nonEnumProps[stringClass] = { 'constructor': true, 'toString': true, 'valueOf': true };
- nonEnumProps[errorClass] = nonEnumProps[funcClass] = nonEnumProps[regexpClass] = { 'constructor': true, 'toString': true };
- nonEnumProps[objectClass] = { 'constructor': true };
-
- (function() {
- var length = shadowedProps.length;
- while (length--) {
- var key = shadowedProps[length];
- for (var className in nonEnumProps) {
- if (hasOwnProperty.call(nonEnumProps, className) && !hasOwnProperty.call(nonEnumProps[className], key)) {
- nonEnumProps[className][key] = false;
- }
- }
- }
- }());
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Creates a `lodash` object which wraps the given value to enable intuitive
- * method chaining.
- *
- * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:
- * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,
- * and `unshift`
- *
- * Chaining is supported in custom builds as long as the `value` method is
- * implicitly or explicitly included in the build.
- *
- * The chainable wrapper functions are:
- * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,
- * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,
- * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,
- * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,
- * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,
- * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,
- * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,
- * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,
- * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,
- * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,
- * and `zip`
- *
- * The non-chainable wrapper functions are:
- * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,
- * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,
- * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,
- * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,
- * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,
- * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,
- * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,
- * `template`, `unescape`, `uniqueId`, and `value`
- *
- * The wrapper functions `first` and `last` return wrapped values when `n` is
- * provided, otherwise they return unwrapped values.
- *
- * Explicit chaining can be enabled by using the `_.chain` method.
- *
- * @name _
- * @constructor
- * @category Chaining
- * @param {*} value The value to wrap in a `lodash` instance.
- * @returns {Object} Returns a `lodash` instance.
- * @example
- *
- * var wrapped = _([1, 2, 3]);
- *
- * // returns an unwrapped value
- * wrapped.reduce(function(sum, num) {
- * return sum + num;
- * });
- * // => 6
- *
- * // returns a wrapped value
- * var squares = wrapped.map(function(num) {
- * return num * num;
- * });
- *
- * _.isArray(squares);
- * // => false
- *
- * _.isArray(squares.value());
- * // => true
- */
- function lodash(value) {
- // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor
- return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))
- ? value
- : new lodashWrapper(value);
- }
-
- /**
- * A fast path for creating `lodash` wrapper objects.
- *
- * @private
- * @param {*} value The value to wrap in a `lodash` instance.
- * @param {boolean} chainAll A flag to enable chaining for all methods
- * @returns {Object} Returns a `lodash` instance.
- */
- function lodashWrapper(value, chainAll) {
- this.__chain__ = !!chainAll;
- this.__wrapped__ = value;
- }
- // ensure `new lodashWrapper` is an instance of `lodash`
- lodashWrapper.prototype = lodash.prototype;
-
- /**
- * An object used to flag environments features.
- *
- * @static
- * @memberOf _
- * @type Object
- */
- var support = lodash.support = {};
-
- (function() {
- var ctor = function() { this.x = 1; },
- object = { '0': 1, 'length': 1 },
- props = [];
-
- ctor.prototype = { 'valueOf': 1, 'y': 1 };
- for (var key in new ctor) { props.push(key); }
- for (key in arguments) { }
-
- /**
- * Detect if an `arguments` object's [[Class]] is resolvable (all but Firefox < 4, IE < 9).
- *
- * @memberOf _.support
- * @type boolean
- */
- support.argsClass = toString.call(arguments) == argsClass;
-
- /**
- * Detect if `arguments` objects are `Object` objects (all but Narwhal and Opera < 10.5).
- *
- * @memberOf _.support
- * @type boolean
- */
- support.argsObject = arguments.constructor == Object && !(arguments instanceof Array);
-
- /**
- * Detect if `name` or `message` properties of `Error.prototype` are
- * enumerable by default. (IE < 9, Safari < 5.1)
- *
- * @memberOf _.support
- * @type boolean
- */
- support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') || propertyIsEnumerable.call(errorProto, 'name');
-
- /**
- * Detect if `prototype` properties are enumerable by default.
- *
- * Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1
- * (if the prototype or a property on the prototype has been set)
- * incorrectly sets a function's `prototype` property [[Enumerable]]
- * value to `true`.
- *
- * @memberOf _.support
- * @type boolean
- */
- support.enumPrototypes = propertyIsEnumerable.call(ctor, 'prototype');
-
- /**
- * Detect if functions can be decompiled by `Function#toString`
- * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).
- *
- * @memberOf _.support
- * @type boolean
- */
- support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);
-
- /**
- * Detect if `Function#name` is supported (all but IE).
- *
- * @memberOf _.support
- * @type boolean
- */
- support.funcNames = typeof Function.name == 'string';
-
- /**
- * Detect if `arguments` object indexes are non-enumerable
- * (Firefox < 4, IE < 9, PhantomJS, Safari < 5.1).
- *
- * @memberOf _.support
- * @type boolean
- */
- support.nonEnumArgs = key != 0;
-
- /**
- * Detect if properties shadowing those on `Object.prototype` are non-enumerable.
- *
- * In IE < 9 an objects own properties, shadowing non-enumerable ones, are
- * made non-enumerable as well (a.k.a the JScript [[DontEnum]] bug).
- *
- * @memberOf _.support
- * @type boolean
- */
- support.nonEnumShadows = !/valueOf/.test(props);
-
- /**
- * Detect if own properties are iterated after inherited properties (all but IE < 9).
- *
- * @memberOf _.support
- * @type boolean
- */
- support.ownLast = props[0] != 'x';
-
- /**
- * Detect if `Array#shift` and `Array#splice` augment array-like objects correctly.
- *
- * Firefox < 10, IE compatibility mode, and IE < 9 have buggy Array `shift()`
- * and `splice()` functions that fail to remove the last element, `value[0]`,
- * of array-like objects even though the `length` property is set to `0`.
- * The `shift()` method is buggy in IE 8 compatibility mode, while `splice()`
- * is buggy regardless of mode in IE < 9 and buggy in compatibility mode in IE 9.
- *
- * @memberOf _.support
- * @type boolean
- */
- support.spliceObjects = (arrayRef.splice.call(object, 0, 1), !object[0]);
-
- /**
- * Detect lack of support for accessing string characters by index.
- *
- * IE < 8 can't access characters by index and IE 8 can only access
- * characters by index on string literals.
- *
- * @memberOf _.support
- * @type boolean
- */
- support.unindexedChars = ('x'[0] + Object('x')[0]) != 'xx';
-
- /**
- * Detect if a DOM node's [[Class]] is resolvable (all but IE < 9)
- * and that the JS engine errors when attempting to coerce an object to
- * a string without a `toString` function.
- *
- * @memberOf _.support
- * @type boolean
- */
- try {
- support.nodeClass = !(toString.call(document) == objectClass && !({ 'toString': 0 } + ''));
- } catch(e) {
- support.nodeClass = true;
- }
- }(1));
-
- /**
- * By default, the template delimiters used by Lo-Dash are similar to those in
- * embedded Ruby (ERB). Change the following template settings to use alternative
- * delimiters.
- *
- * @static
- * @memberOf _
- * @type Object
- */
- lodash.templateSettings = {
-
- /**
- * Used to detect `data` property values to be HTML-escaped.
- *
- * @memberOf _.templateSettings
- * @type RegExp
- */
- 'escape': /<%-([\s\S]+?)%>/g,
-
- /**
- * Used to detect code to be evaluated.
- *
- * @memberOf _.templateSettings
- * @type RegExp
- */
- 'evaluate': /<%([\s\S]+?)%>/g,
-
- /**
- * Used to detect `data` property values to inject.
- *
- * @memberOf _.templateSettings
- * @type RegExp
- */
- 'interpolate': reInterpolate,
-
- /**
- * Used to reference the data object in the template text.
- *
- * @memberOf _.templateSettings
- * @type string
- */
- 'variable': '',
-
- /**
- * Used to import variables into the compiled template.
- *
- * @memberOf _.templateSettings
- * @type Object
- */
- 'imports': {
-
- /**
- * A reference to the `lodash` function.
- *
- * @memberOf _.templateSettings.imports
- * @type Function
- */
- '_': lodash
- }
- };
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * The template used to create iterator functions.
- *
- * @private
- * @param {Object} data The data object used to populate the text.
- * @returns {string} Returns the interpolated text.
- */
- var iteratorTemplate = function(obj) {
-
- var __p = 'var index, iterable = ' +
- (obj.firstArg) +
- ', result = ' +
- (obj.init) +
- ';\nif (!iterable) return result;\n' +
- (obj.top) +
- ';';
- if (obj.array) {
- __p += '\nvar length = iterable.length; index = -1;\nif (' +
- (obj.array) +
- ') { ';
- if (support.unindexedChars) {
- __p += '\n if (isString(iterable)) {\n iterable = iterable.split(\'\')\n } ';
- }
- __p += '\n while (++index < length) {\n ' +
- (obj.loop) +
- ';\n }\n}\nelse { ';
- } else if (support.nonEnumArgs) {
- __p += '\n var length = iterable.length; index = -1;\n if (length && isArguments(iterable)) {\n while (++index < length) {\n index += \'\';\n ' +
- (obj.loop) +
- ';\n }\n } else { ';
- }
-
- if (support.enumPrototypes) {
- __p += '\n var skipProto = typeof iterable == \'function\';\n ';
- }
-
- if (support.enumErrorProps) {
- __p += '\n var skipErrorProps = iterable === errorProto || iterable instanceof Error;\n ';
- }
-
- var conditions = []; if (support.enumPrototypes) { conditions.push('!(skipProto && index == "prototype")'); } if (support.enumErrorProps) { conditions.push('!(skipErrorProps && (index == "message" || index == "name"))'); }
-
- if (obj.useHas && obj.keys) {
- __p += '\n var ownIndex = -1,\n ownProps = objectTypes[typeof iterable] && keys(iterable),\n length = ownProps ? ownProps.length : 0;\n\n while (++ownIndex < length) {\n index = ownProps[ownIndex];\n';
- if (conditions.length) {
- __p += ' if (' +
- (conditions.join(' && ')) +
- ') {\n ';
- }
- __p +=
- (obj.loop) +
- '; ';
- if (conditions.length) {
- __p += '\n }';
- }
- __p += '\n } ';
- } else {
- __p += '\n for (index in iterable) {\n';
- if (obj.useHas) { conditions.push("hasOwnProperty.call(iterable, index)"); } if (conditions.length) {
- __p += ' if (' +
- (conditions.join(' && ')) +
- ') {\n ';
- }
- __p +=
- (obj.loop) +
- '; ';
- if (conditions.length) {
- __p += '\n }';
- }
- __p += '\n } ';
- if (support.nonEnumShadows) {
- __p += '\n\n if (iterable !== objectProto) {\n var ctor = iterable.constructor,\n isProto = iterable === (ctor && ctor.prototype),\n className = iterable === stringProto ? stringClass : iterable === errorProto ? errorClass : toString.call(iterable),\n nonEnum = nonEnumProps[className];\n ';
- for (k = 0; k < 7; k++) {
- __p += '\n index = \'' +
- (obj.shadowedProps[k]) +
- '\';\n if ((!(isProto && nonEnum[index]) && hasOwnProperty.call(iterable, index))';
- if (!obj.useHas) {
- __p += ' || (!nonEnum[index] && iterable[index] !== objectProto[index])';
- }
- __p += ') {\n ' +
- (obj.loop) +
- ';\n } ';
- }
- __p += '\n } ';
- }
-
- }
-
- if (obj.array || support.nonEnumArgs) {
- __p += '\n}';
- }
- __p +=
- (obj.bottom) +
- ';\nreturn result';
-
- return __p
- };
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * The base implementation of `_.bind` that creates the bound function and
- * sets its meta data.
- *
- * @private
- * @param {Array} bindData The bind data array.
- * @returns {Function} Returns the new bound function.
- */
- function baseBind(bindData) {
- var func = bindData[0],
- partialArgs = bindData[2],
- thisArg = bindData[4];
-
- function bound() {
- // `Function#bind` spec
- // http://es5.github.io/#x15.3.4.5
- if (partialArgs) {
- // avoid `arguments` object deoptimizations by using `slice` instead
- // of `Array.prototype.slice.call` and not assigning `arguments` to a
- // variable as a ternary expression
- var args = slice(partialArgs);
- push.apply(args, arguments);
- }
- // mimic the constructor's `return` behavior
- // http://es5.github.io/#x13.2.2
- if (this instanceof bound) {
- // ensure `new bound` is an instance of `func`
- var thisBinding = baseCreate(func.prototype),
- result = func.apply(thisBinding, args || arguments);
- return isObject(result) ? result : thisBinding;
- }
- return func.apply(thisArg, args || arguments);
- }
- setBindData(bound, bindData);
- return bound;
- }
-
- /**
- * The base implementation of `_.clone` without argument juggling or support
- * for `thisArg` binding.
- *
- * @private
- * @param {*} value The value to clone.
- * @param {boolean} [isDeep=false] Specify a deep clone.
- * @param {Function} [callback] The function to customize cloning values.
- * @param {Array} [stackA=[]] Tracks traversed source objects.
- * @param {Array} [stackB=[]] Associates clones with source counterparts.
- * @returns {*} Returns the cloned value.
- */
- function baseClone(value, isDeep, callback, stackA, stackB) {
- if (callback) {
- var result = callback(value);
- if (typeof result != 'undefined') {
- return result;
- }
- }
- // inspect [[Class]]
- var isObj = isObject(value);
- if (isObj) {
- var className = toString.call(value);
- if (!cloneableClasses[className] || (!support.nodeClass && isNode(value))) {
- return value;
- }
- var ctor = ctorByClass[className];
- switch (className) {
- case boolClass:
- case dateClass:
- return new ctor(+value);
-
- case numberClass:
- case stringClass:
- return new ctor(value);
-
- case regexpClass:
- result = ctor(value.source, reFlags.exec(value));
- result.lastIndex = value.lastIndex;
- return result;
- }
- } else {
- return value;
- }
- var isArr = isArray(value);
- if (isDeep) {
- // check for circular references and return corresponding clone
- var initedStack = !stackA;
- stackA || (stackA = getArray());
- stackB || (stackB = getArray());
-
- var length = stackA.length;
- while (length--) {
- if (stackA[length] == value) {
- return stackB[length];
- }
- }
- result = isArr ? ctor(value.length) : {};
- }
- else {
- result = isArr ? slice(value) : assign({}, value);
- }
- // add array properties assigned by `RegExp#exec`
- if (isArr) {
- if (hasOwnProperty.call(value, 'index')) {
- result.index = value.index;
- }
- if (hasOwnProperty.call(value, 'input')) {
- result.input = value.input;
- }
- }
- // exit for shallow clone
- if (!isDeep) {
- return result;
- }
- // add the source value to the stack of traversed objects
- // and associate it with its clone
- stackA.push(value);
- stackB.push(result);
-
- // recursively populate clone (susceptible to call stack limits)
- (isArr ? baseEach : forOwn)(value, function(objValue, key) {
- result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);
- });
-
- if (initedStack) {
- releaseArray(stackA);
- releaseArray(stackB);
- }
- return result;
- }
-
- /**
- * The base implementation of `_.create` without support for assigning
- * properties to the created object.
- *
- * @private
- * @param {Object} prototype The object to inherit from.
- * @returns {Object} Returns the new object.
- */
- function baseCreate(prototype, properties) {
- return isObject(prototype) ? nativeCreate(prototype) : {};
- }
- // fallback for browsers without `Object.create`
- if (!nativeCreate) {
- baseCreate = (function() {
- function Object() {}
- return function(prototype) {
- if (isObject(prototype)) {
- Object.prototype = prototype;
- var result = new Object;
- Object.prototype = null;
- }
- return result || context.Object();
- };
- }());
- }
-
- /**
- * The base implementation of `_.createCallback` without support for creating
- * "_.pluck" or "_.where" style callbacks.
- *
- * @private
- * @param {*} [func=identity] The value to convert to a callback.
- * @param {*} [thisArg] The `this` binding of the created callback.
- * @param {number} [argCount] The number of arguments the callback accepts.
- * @returns {Function} Returns a callback function.
- */
- function baseCreateCallback(func, thisArg, argCount) {
- if (typeof func != 'function') {
- return identity;
- }
- // exit early for no `thisArg` or already bound by `Function#bind`
- if (typeof thisArg == 'undefined' || !('prototype' in func)) {
- return func;
- }
- var bindData = func.__bindData__;
- if (typeof bindData == 'undefined') {
- if (support.funcNames) {
- bindData = !func.name;
- }
- bindData = bindData || !support.funcDecomp;
- if (!bindData) {
- var source = fnToString.call(func);
- if (!support.funcNames) {
- bindData = !reFuncName.test(source);
- }
- if (!bindData) {
- // checks if `func` references the `this` keyword and stores the result
- bindData = reThis.test(source);
- setBindData(func, bindData);
- }
- }
- }
- // exit early if there are no `this` references or `func` is bound
- if (bindData === false || (bindData !== true && bindData[1] & 1)) {
- return func;
- }
- switch (argCount) {
- case 1: return function(value) {
- return func.call(thisArg, value);
- };
- case 2: return function(a, b) {
- return func.call(thisArg, a, b);
- };
- case 3: return function(value, index, collection) {
- return func.call(thisArg, value, index, collection);
- };
- case 4: return function(accumulator, value, index, collection) {
- return func.call(thisArg, accumulator, value, index, collection);
- };
- }
- return bind(func, thisArg);
- }
-
- /**
- * The base implementation of `createWrapper` that creates the wrapper and
- * sets its meta data.
- *
- * @private
- * @param {Array} bindData The bind data array.
- * @returns {Function} Returns the new function.
- */
- function baseCreateWrapper(bindData) {
- var func = bindData[0],
- bitmask = bindData[1],
- partialArgs = bindData[2],
- partialRightArgs = bindData[3],
- thisArg = bindData[4],
- arity = bindData[5];
-
- var isBind = bitmask & 1,
- isBindKey = bitmask & 2,
- isCurry = bitmask & 4,
- isCurryBound = bitmask & 8,
- key = func;
-
- function bound() {
- var thisBinding = isBind ? thisArg : this;
- if (partialArgs) {
- var args = slice(partialArgs);
- push.apply(args, arguments);
- }
- if (partialRightArgs || isCurry) {
- args || (args = slice(arguments));
- if (partialRightArgs) {
- push.apply(args, partialRightArgs);
- }
- if (isCurry && args.length < arity) {
- bitmask |= 16 & ~32;
- return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);
- }
- }
- args || (args = arguments);
- if (isBindKey) {
- func = thisBinding[key];
- }
- if (this instanceof bound) {
- thisBinding = baseCreate(func.prototype);
- var result = func.apply(thisBinding, args);
- return isObject(result) ? result : thisBinding;
- }
- return func.apply(thisBinding, args);
- }
- setBindData(bound, bindData);
- return bound;
- }
-
- /**
- * The base implementation of `_.difference` that accepts a single array
- * of values to exclude.
- *
- * @private
- * @param {Array} array The array to process.
- * @param {Array} [values] The array of values to exclude.
- * @returns {Array} Returns a new array of filtered values.
- */
- function baseDifference(array, values) {
- var index = -1,
- indexOf = getIndexOf(),
- length = array ? array.length : 0,
- isLarge = length >= largeArraySize && indexOf === baseIndexOf,
- result = [];
-
- if (isLarge) {
- var cache = createCache(values);
- if (cache) {
- indexOf = cacheIndexOf;
- values = cache;
- } else {
- isLarge = false;
- }
- }
- while (++index < length) {
- var value = array[index];
- if (indexOf(values, value) < 0) {
- result.push(value);
- }
- }
- if (isLarge) {
- releaseObject(values);
- }
- return result;
- }
-
- /**
- * The base implementation of `_.flatten` without support for callback
- * shorthands or `thisArg` binding.
- *
- * @private
- * @param {Array} array The array to flatten.
- * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.
- * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.
- * @param {number} [fromIndex=0] The index to start from.
- * @returns {Array} Returns a new flattened array.
- */
- function baseFlatten(array, isShallow, isStrict, fromIndex) {
- var index = (fromIndex || 0) - 1,
- length = array ? array.length : 0,
- result = [];
-
- while (++index < length) {
- var value = array[index];
-
- if (value && typeof value == 'object' && typeof value.length == 'number'
- && (isArray(value) || isArguments(value))) {
- // recursively flatten arrays (susceptible to call stack limits)
- if (!isShallow) {
- value = baseFlatten(value, isShallow, isStrict);
- }
- var valIndex = -1,
- valLength = value.length,
- resIndex = result.length;
-
- result.length += valLength;
- while (++valIndex < valLength) {
- result[resIndex++] = value[valIndex];
- }
- } else if (!isStrict) {
- result.push(value);
- }
- }
- return result;
- }
-
- /**
- * The base implementation of `_.isEqual`, without support for `thisArg` binding,
- * that allows partial "_.where" style comparisons.
- *
- * @private
- * @param {*} a The value to compare.
- * @param {*} b The other value to compare.
- * @param {Function} [callback] The function to customize comparing values.
- * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.
- * @param {Array} [stackA=[]] Tracks traversed `a` objects.
- * @param {Array} [stackB=[]] Tracks traversed `b` objects.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- */
- function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {
- // used to indicate that when comparing objects, `a` has at least the properties of `b`
- if (callback) {
- var result = callback(a, b);
- if (typeof result != 'undefined') {
- return !!result;
- }
- }
- // exit early for identical values
- if (a === b) {
- // treat `+0` vs. `-0` as not equal
- return a !== 0 || (1 / a == 1 / b);
- }
- var type = typeof a,
- otherType = typeof b;
-
- // exit early for unlike primitive values
- if (a === a &&
- !(a && objectTypes[type]) &&
- !(b && objectTypes[otherType])) {
- return false;
- }
- // exit early for `null` and `undefined` avoiding ES3's Function#call behavior
- // http://es5.github.io/#x15.3.4.4
- if (a == null || b == null) {
- return a === b;
- }
- // compare [[Class]] names
- var className = toString.call(a),
- otherClass = toString.call(b);
-
- if (className == argsClass) {
- className = objectClass;
- }
- if (otherClass == argsClass) {
- otherClass = objectClass;
- }
- if (className != otherClass) {
- return false;
- }
- switch (className) {
- case boolClass:
- case dateClass:
- // coerce dates and booleans to numbers, dates to milliseconds and booleans
- // to `1` or `0` treating invalid dates coerced to `NaN` as not equal
- return +a == +b;
-
- case numberClass:
- // treat `NaN` vs. `NaN` as equal
- return (a != +a)
- ? b != +b
- // but treat `+0` vs. `-0` as not equal
- : (a == 0 ? (1 / a == 1 / b) : a == +b);
-
- case regexpClass:
- case stringClass:
- // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)
- // treat string primitives and their corresponding object instances as equal
- return a == String(b);
- }
- var isArr = className == arrayClass;
- if (!isArr) {
- // unwrap any `lodash` wrapped values
- var aWrapped = hasOwnProperty.call(a, '__wrapped__'),
- bWrapped = hasOwnProperty.call(b, '__wrapped__');
-
- if (aWrapped || bWrapped) {
- return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);
- }
- // exit for functions and DOM nodes
- if (className != objectClass || (!support.nodeClass && (isNode(a) || isNode(b)))) {
- return false;
- }
- // in older versions of Opera, `arguments` objects have `Array` constructors
- var ctorA = !support.argsObject && isArguments(a) ? Object : a.constructor,
- ctorB = !support.argsObject && isArguments(b) ? Object : b.constructor;
-
- // non `Object` object instances with different constructors are not equal
- if (ctorA != ctorB &&
- !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&
- ('constructor' in a && 'constructor' in b)
- ) {
- return false;
- }
- }
- // assume cyclic structures are equal
- // the algorithm for detecting cyclic structures is adapted from ES 5.1
- // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)
- var initedStack = !stackA;
- stackA || (stackA = getArray());
- stackB || (stackB = getArray());
-
- var length = stackA.length;
- while (length--) {
- if (stackA[length] == a) {
- return stackB[length] == b;
- }
- }
- var size = 0;
- result = true;
-
- // add `a` and `b` to the stack of traversed objects
- stackA.push(a);
- stackB.push(b);
-
- // recursively compare objects and arrays (susceptible to call stack limits)
- if (isArr) {
- // compare lengths to determine if a deep comparison is necessary
- length = a.length;
- size = b.length;
- result = size == length;
-
- if (result || isWhere) {
- // deep compare the contents, ignoring non-numeric properties
- while (size--) {
- var index = length,
- value = b[size];
-
- if (isWhere) {
- while (index--) {
- if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {
- break;
- }
- }
- } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {
- break;
- }
- }
- }
- }
- else {
- // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`
- // which, in this case, is more costly
- forIn(b, function(value, key, b) {
- if (hasOwnProperty.call(b, key)) {
- // count the number of properties.
- size++;
- // deep compare each property value.
- return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));
- }
- });
-
- if (result && !isWhere) {
- // ensure both objects have the same number of properties
- forIn(a, function(value, key, a) {
- if (hasOwnProperty.call(a, key)) {
- // `size` will be `-1` if `a` has more properties than `b`
- return (result = --size > -1);
- }
- });
- }
- }
- stackA.pop();
- stackB.pop();
-
- if (initedStack) {
- releaseArray(stackA);
- releaseArray(stackB);
- }
- return result;
- }
-
- /**
- * The base implementation of `_.merge` without argument juggling or support
- * for `thisArg` binding.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @param {Function} [callback] The function to customize merging properties.
- * @param {Array} [stackA=[]] Tracks traversed source objects.
- * @param {Array} [stackB=[]] Associates values with source counterparts.
- */
- function baseMerge(object, source, callback, stackA, stackB) {
- (isArray(source) ? forEach : forOwn)(source, function(source, key) {
- var found,
- isArr,
- result = source,
- value = object[key];
-
- if (source && ((isArr = isArray(source)) || isPlainObject(source))) {
- // avoid merging previously merged cyclic sources
- var stackLength = stackA.length;
- while (stackLength--) {
- if ((found = stackA[stackLength] == source)) {
- value = stackB[stackLength];
- break;
- }
- }
- if (!found) {
- var isShallow;
- if (callback) {
- result = callback(value, source);
- if ((isShallow = typeof result != 'undefined')) {
- value = result;
- }
- }
- if (!isShallow) {
- value = isArr
- ? (isArray(value) ? value : [])
- : (isPlainObject(value) ? value : {});
- }
- // add `source` and associated `value` to the stack of traversed objects
- stackA.push(source);
- stackB.push(value);
-
- // recursively merge objects and arrays (susceptible to call stack limits)
- if (!isShallow) {
- baseMerge(value, source, callback, stackA, stackB);
- }
- }
- }
- else {
- if (callback) {
- result = callback(value, source);
- if (typeof result == 'undefined') {
- result = source;
- }
- }
- if (typeof result != 'undefined') {
- value = result;
- }
- }
- object[key] = value;
- });
- }
-
- /**
- * The base implementation of `_.random` without argument juggling or support
- * for returning floating-point numbers.
- *
- * @private
- * @param {number} min The minimum possible value.
- * @param {number} max The maximum possible value.
- * @returns {number} Returns a random number.
- */
- function baseRandom(min, max) {
- return min + floor(nativeRandom() * (max - min + 1));
- }
-
- /**
- * The base implementation of `_.uniq` without support for callback shorthands
- * or `thisArg` binding.
- *
- * @private
- * @param {Array} array The array to process.
- * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.
- * @param {Function} [callback] The function called per iteration.
- * @returns {Array} Returns a duplicate-value-free array.
- */
- function baseUniq(array, isSorted, callback) {
- var index = -1,
- indexOf = getIndexOf(),
- length = array ? array.length : 0,
- result = [];
-
- var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,
- seen = (callback || isLarge) ? getArray() : result;
-
- if (isLarge) {
- var cache = createCache(seen);
- indexOf = cacheIndexOf;
- seen = cache;
- }
- while (++index < length) {
- var value = array[index],
- computed = callback ? callback(value, index, array) : value;
-
- if (isSorted
- ? !index || seen[seen.length - 1] !== computed
- : indexOf(seen, computed) < 0
- ) {
- if (callback || isLarge) {
- seen.push(computed);
- }
- result.push(value);
- }
- }
- if (isLarge) {
- releaseArray(seen.array);
- releaseObject(seen);
- } else if (callback) {
- releaseArray(seen);
- }
- return result;
- }
-
- /**
- * Creates a function that aggregates a collection, creating an object composed
- * of keys generated from the results of running each element of the collection
- * through a callback. The given `setter` function sets the keys and values
- * of the composed object.
- *
- * @private
- * @param {Function} setter The setter function.
- * @returns {Function} Returns the new aggregator function.
- */
- function createAggregator(setter) {
- return function(collection, callback, thisArg) {
- var result = {};
- callback = lodash.createCallback(callback, thisArg, 3);
-
- if (isArray(collection)) {
- var index = -1,
- length = collection.length;
-
- while (++index < length) {
- var value = collection[index];
- setter(result, value, callback(value, index, collection), collection);
- }
- } else {
- baseEach(collection, function(value, key, collection) {
- setter(result, value, callback(value, key, collection), collection);
- });
- }
- return result;
- };
- }
-
- /**
- * Creates a function that, when called, either curries or invokes `func`
- * with an optional `this` binding and partially applied arguments.
- *
- * @private
- * @param {Function|string} func The function or method name to reference.
- * @param {number} bitmask The bitmask of method flags to compose.
- * The bitmask may be composed of the following flags:
- * 1 - `_.bind`
- * 2 - `_.bindKey`
- * 4 - `_.curry`
- * 8 - `_.curry` (bound)
- * 16 - `_.partial`
- * 32 - `_.partialRight`
- * @param {Array} [partialArgs] An array of arguments to prepend to those
- * provided to the new function.
- * @param {Array} [partialRightArgs] An array of arguments to append to those
- * provided to the new function.
- * @param {*} [thisArg] The `this` binding of `func`.
- * @param {number} [arity] The arity of `func`.
- * @returns {Function} Returns the new function.
- */
- function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {
- var isBind = bitmask & 1,
- isBindKey = bitmask & 2,
- isCurry = bitmask & 4,
- isCurryBound = bitmask & 8,
- isPartial = bitmask & 16,
- isPartialRight = bitmask & 32;
-
- if (!isBindKey && !isFunction(func)) {
- throw new TypeError;
- }
- if (isPartial && !partialArgs.length) {
- bitmask &= ~16;
- isPartial = partialArgs = false;
- }
- if (isPartialRight && !partialRightArgs.length) {
- bitmask &= ~32;
- isPartialRight = partialRightArgs = false;
- }
- var bindData = func && func.__bindData__;
- if (bindData && bindData !== true) {
- // clone `bindData`
- bindData = slice(bindData);
- if (bindData[2]) {
- bindData[2] = slice(bindData[2]);
- }
- if (bindData[3]) {
- bindData[3] = slice(bindData[3]);
- }
- // set `thisBinding` is not previously bound
- if (isBind && !(bindData[1] & 1)) {
- bindData[4] = thisArg;
- }
- // set if previously bound but not currently (subsequent curried functions)
- if (!isBind && bindData[1] & 1) {
- bitmask |= 8;
- }
- // set curried arity if not yet set
- if (isCurry && !(bindData[1] & 4)) {
- bindData[5] = arity;
- }
- // append partial left arguments
- if (isPartial) {
- push.apply(bindData[2] || (bindData[2] = []), partialArgs);
- }
- // append partial right arguments
- if (isPartialRight) {
- unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);
- }
- // merge flags
- bindData[1] |= bitmask;
- return createWrapper.apply(null, bindData);
- }
- // fast path for `_.bind`
- var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;
- return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);
- }
-
- /**
- * Creates compiled iteration functions.
- *
- * @private
- * @param {...Object} [options] The compile options object(s).
- * @param {string} [options.array] Code to determine if the iterable is an array or array-like.
- * @param {boolean} [options.useHas] Specify using `hasOwnProperty` checks in the object loop.
- * @param {Function} [options.keys] A reference to `_.keys` for use in own property iteration.
- * @param {string} [options.args] A comma separated string of iteration function arguments.
- * @param {string} [options.top] Code to execute before the iteration branches.
- * @param {string} [options.loop] Code to execute in the object loop.
- * @param {string} [options.bottom] Code to execute after the iteration branches.
- * @returns {Function} Returns the compiled function.
- */
- function createIterator() {
- // data properties
- iteratorData.shadowedProps = shadowedProps;
-
- // iterator options
- iteratorData.array = iteratorData.bottom = iteratorData.loop = iteratorData.top = '';
- iteratorData.init = 'iterable';
- iteratorData.useHas = true;
-
- // merge options into a template data object
- for (var object, index = 0; object = arguments[index]; index++) {
- for (var key in object) {
- iteratorData[key] = object[key];
- }
- }
- var args = iteratorData.args;
- iteratorData.firstArg = /^[^,]+/.exec(args)[0];
-
- // create the function factory
- var factory = Function(
- 'baseCreateCallback, errorClass, errorProto, hasOwnProperty, ' +
- 'indicatorObject, isArguments, isArray, isString, keys, objectProto, ' +
- 'objectTypes, nonEnumProps, stringClass, stringProto, toString',
- 'return function(' + args + ') {\n' + iteratorTemplate(iteratorData) + '\n}'
- );
-
- // return the compiled function
- return factory(
- baseCreateCallback, errorClass, errorProto, hasOwnProperty,
- indicatorObject, isArguments, isArray, isString, iteratorData.keys, objectProto,
- objectTypes, nonEnumProps, stringClass, stringProto, toString
- );
- }
-
- /**
- * Used by `escape` to convert characters to HTML entities.
- *
- * @private
- * @param {string} match The matched character to escape.
- * @returns {string} Returns the escaped character.
- */
- function escapeHtmlChar(match) {
- return htmlEscapes[match];
- }
-
- /**
- * Gets the appropriate "indexOf" function. If the `_.indexOf` method is
- * customized, this method returns the custom method, otherwise it returns
- * the `baseIndexOf` function.
- *
- * @private
- * @returns {Function} Returns the "indexOf" function.
- */
- function getIndexOf() {
- var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;
- return result;
- }
-
- /**
- * Checks if `value` is a native function.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.
- */
- function isNative(value) {
- return typeof value == 'function' && reNative.test(value);
- }
-
- /**
- * Sets `this` binding data on a given function.
- *
- * @private
- * @param {Function} func The function to set data on.
- * @param {Array} value The data array to set.
- */
- var setBindData = !defineProperty ? noop : function(func, value) {
- descriptor.value = value;
- defineProperty(func, '__bindData__', descriptor);
- };
-
- /**
- * A fallback implementation of `isPlainObject` which checks if a given value
- * is an object created by the `Object` constructor, assuming objects created
- * by the `Object` constructor have no inherited enumerable properties and that
- * there are no `Object.prototype` extensions.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
- */
- function shimIsPlainObject(value) {
- var ctor,
- result;
-
- // avoid non Object objects, `arguments` objects, and DOM elements
- if (!(value && toString.call(value) == objectClass) ||
- (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor)) ||
- (!support.argsClass && isArguments(value)) ||
- (!support.nodeClass && isNode(value))) {
- return false;
- }
- // IE < 9 iterates inherited properties before own properties. If the first
- // iterated property is an object's own property then there are no inherited
- // enumerable properties.
- if (support.ownLast) {
- forIn(value, function(value, key, object) {
- result = hasOwnProperty.call(object, key);
- return false;
- });
- return result !== false;
- }
- // In most environments an object's own properties are iterated before
- // its inherited properties. If the last iterated property is an object's
- // own property then there are no inherited enumerable properties.
- forIn(value, function(value, key) {
- result = key;
- });
- return typeof result == 'undefined' || hasOwnProperty.call(value, result);
- }
-
- /**
- * Used by `unescape` to convert HTML entities to characters.
- *
- * @private
- * @param {string} match The matched character to unescape.
- * @returns {string} Returns the unescaped character.
- */
- function unescapeHtmlChar(match) {
- return htmlUnescapes[match];
- }
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Checks if `value` is an `arguments` object.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.
- * @example
- *
- * (function() { return _.isArguments(arguments); })(1, 2, 3);
- * // => true
- *
- * _.isArguments([1, 2, 3]);
- * // => false
- */
- function isArguments(value) {
- return value && typeof value == 'object' && typeof value.length == 'number' &&
- toString.call(value) == argsClass || false;
- }
- // fallback for browsers that can't detect `arguments` objects by [[Class]]
- if (!support.argsClass) {
- isArguments = function(value) {
- return value && typeof value == 'object' && typeof value.length == 'number' &&
- hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee') || false;
- };
- }
-
- /**
- * Checks if `value` is an array.
- *
- * @static
- * @memberOf _
- * @type Function
- * @category Objects
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is an array, else `false`.
- * @example
- *
- * (function() { return _.isArray(arguments); })();
- * // => false
- *
- * _.isArray([1, 2, 3]);
- * // => true
- */
- var isArray = nativeIsArray || function(value) {
- return value && typeof value == 'object' && typeof value.length == 'number' &&
- toString.call(value) == arrayClass || false;
- };
-
- /**
- * A fallback implementation of `Object.keys` which produces an array of the
- * given object's own enumerable property names.
- *
- * @private
- * @type Function
- * @param {Object} object The object to inspect.
- * @returns {Array} Returns an array of property names.
- */
- var shimKeys = createIterator({
- 'args': 'object',
- 'init': '[]',
- 'top': 'if (!(objectTypes[typeof object])) return result',
- 'loop': 'result.push(index)'
- });
-
- /**
- * Creates an array composed of the own enumerable property names of an object.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to inspect.
- * @returns {Array} Returns an array of property names.
- * @example
- *
- * _.keys({ 'one': 1, 'two': 2, 'three': 3 });
- * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)
- */
- var keys = !nativeKeys ? shimKeys : function(object) {
- if (!isObject(object)) {
- return [];
- }
- if ((support.enumPrototypes && typeof object == 'function') ||
- (support.nonEnumArgs && object.length && isArguments(object))) {
- return shimKeys(object);
- }
- return nativeKeys(object);
- };
-
- /** Reusable iterator options shared by `each`, `forIn`, and `forOwn` */
- var eachIteratorOptions = {
- 'args': 'collection, callback, thisArg',
- 'top': "callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3)",
- 'array': "typeof length == 'number'",
- 'keys': keys,
- 'loop': 'if (callback(iterable[index], index, collection) === false) return result'
- };
-
- /** Reusable iterator options for `assign` and `defaults` */
- var defaultsIteratorOptions = {
- 'args': 'object, source, guard',
- 'top':
- 'var args = arguments,\n' +
- ' argsIndex = 0,\n' +
- " argsLength = typeof guard == 'number' ? 2 : args.length;\n" +
- 'while (++argsIndex < argsLength) {\n' +
- ' iterable = args[argsIndex];\n' +
- ' if (iterable && objectTypes[typeof iterable]) {',
- 'keys': keys,
- 'loop': "if (typeof result[index] == 'undefined') result[index] = iterable[index]",
- 'bottom': ' }\n}'
- };
-
- /** Reusable iterator options for `forIn` and `forOwn` */
- var forOwnIteratorOptions = {
- 'top': 'if (!objectTypes[typeof iterable]) return result;\n' + eachIteratorOptions.top,
- 'array': false
- };
-
- /**
- * Used to convert characters to HTML entities:
- *
- * Though the `>` character is escaped for symmetry, characters like `>` and `/`
- * don't require escaping in HTML and have no special meaning unless they're part
- * of a tag or an unquoted attribute value.
- * http://mathiasbynens.be/notes/ambiguous-ampersands (under "semi-related fun fact")
- */
- var htmlEscapes = {
- '&': '&',
- '<': '<',
- '>': '>',
- '"': '"',
- "'": '''
- };
-
- /** Used to convert HTML entities to characters */
- var htmlUnescapes = invert(htmlEscapes);
-
- /** Used to match HTML entities and HTML characters */
- var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),
- reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');
-
- /**
- * A function compiled to iterate `arguments` objects, arrays, objects, and
- * strings consistenly across environments, executing the callback for each
- * element in the collection. The callback is bound to `thisArg` and invoked
- * with three arguments; (value, index|key, collection). Callbacks may exit
- * iteration early by explicitly returning `false`.
- *
- * @private
- * @type Function
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Array|Object|string} Returns `collection`.
- */
- var baseEach = createIterator(eachIteratorOptions);
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Assigns own enumerable properties of source object(s) to the destination
- * object. Subsequent sources will overwrite property assignments of previous
- * sources. If a callback is provided it will be executed to produce the
- * assigned values. The callback is bound to `thisArg` and invoked with two
- * arguments; (objectValue, sourceValue).
- *
- * @static
- * @memberOf _
- * @type Function
- * @alias extend
- * @category Objects
- * @param {Object} object The destination object.
- * @param {...Object} [source] The source objects.
- * @param {Function} [callback] The function to customize assigning values.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns the destination object.
- * @example
- *
- * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });
- * // => { 'name': 'fred', 'employer': 'slate' }
- *
- * var defaults = _.partialRight(_.assign, function(a, b) {
- * return typeof a == 'undefined' ? b : a;
- * });
- *
- * var object = { 'name': 'barney' };
- * defaults(object, { 'name': 'fred', 'employer': 'slate' });
- * // => { 'name': 'barney', 'employer': 'slate' }
- */
- var assign = createIterator(defaultsIteratorOptions, {
- 'top':
- defaultsIteratorOptions.top.replace(';',
- ';\n' +
- "if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\n" +
- ' var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\n' +
- "} else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\n" +
- ' callback = args[--argsLength];\n' +
- '}'
- ),
- 'loop': 'result[index] = callback ? callback(result[index], iterable[index]) : iterable[index]'
- });
-
- /**
- * Creates a clone of `value`. If `isDeep` is `true` nested objects will also
- * be cloned, otherwise they will be assigned by reference. If a callback
- * is provided it will be executed to produce the cloned values. If the
- * callback returns `undefined` cloning will be handled by the method instead.
- * The callback is bound to `thisArg` and invoked with one argument; (value).
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to clone.
- * @param {boolean} [isDeep=false] Specify a deep clone.
- * @param {Function} [callback] The function to customize cloning values.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {*} Returns the cloned value.
- * @example
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36 },
- * { 'name': 'fred', 'age': 40 }
- * ];
- *
- * var shallow = _.clone(characters);
- * shallow[0] === characters[0];
- * // => true
- *
- * var deep = _.clone(characters, true);
- * deep[0] === characters[0];
- * // => false
- *
- * _.mixin({
- * 'clone': _.partialRight(_.clone, function(value) {
- * return _.isElement(value) ? value.cloneNode(false) : undefined;
- * })
- * });
- *
- * var clone = _.clone(document.body);
- * clone.childNodes.length;
- * // => 0
- */
- function clone(value, isDeep, callback, thisArg) {
- // allows working with "Collections" methods without using their `index`
- // and `collection` arguments for `isDeep` and `callback`
- if (typeof isDeep != 'boolean' && isDeep != null) {
- thisArg = callback;
- callback = isDeep;
- isDeep = false;
- }
- return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
- }
-
- /**
- * Creates a deep clone of `value`. If a callback is provided it will be
- * executed to produce the cloned values. If the callback returns `undefined`
- * cloning will be handled by the method instead. The callback is bound to
- * `thisArg` and invoked with one argument; (value).
- *
- * Note: This method is loosely based on the structured clone algorithm. Functions
- * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and
- * objects created by constructors other than `Object` are cloned to plain `Object` objects.
- * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to deep clone.
- * @param {Function} [callback] The function to customize cloning values.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {*} Returns the deep cloned value.
- * @example
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36 },
- * { 'name': 'fred', 'age': 40 }
- * ];
- *
- * var deep = _.cloneDeep(characters);
- * deep[0] === characters[0];
- * // => false
- *
- * var view = {
- * 'label': 'docs',
- * 'node': element
- * };
- *
- * var clone = _.cloneDeep(view, function(value) {
- * return _.isElement(value) ? value.cloneNode(true) : undefined;
- * });
- *
- * clone.node == view.node;
- * // => false
- */
- function cloneDeep(value, callback, thisArg) {
- return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
- }
-
- /**
- * Creates an object that inherits from the given `prototype` object. If a
- * `properties` object is provided its own enumerable properties are assigned
- * to the created object.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} prototype The object to inherit from.
- * @param {Object} [properties] The properties to assign to the object.
- * @returns {Object} Returns the new object.
- * @example
- *
- * function Shape() {
- * this.x = 0;
- * this.y = 0;
- * }
- *
- * function Circle() {
- * Shape.call(this);
- * }
- *
- * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });
- *
- * var circle = new Circle;
- * circle instanceof Circle;
- * // => true
- *
- * circle instanceof Shape;
- * // => true
- */
- function create(prototype, properties) {
- var result = baseCreate(prototype);
- return properties ? assign(result, properties) : result;
- }
-
- /**
- * Assigns own enumerable properties of source object(s) to the destination
- * object for all destination properties that resolve to `undefined`. Once a
- * property is set, additional defaults of the same property will be ignored.
- *
- * @static
- * @memberOf _
- * @type Function
- * @category Objects
- * @param {Object} object The destination object.
- * @param {...Object} [source] The source objects.
- * @param- {Object} [guard] Allows working with `_.reduce` without using its
- * `key` and `object` arguments as sources.
- * @returns {Object} Returns the destination object.
- * @example
- *
- * var object = { 'name': 'barney' };
- * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });
- * // => { 'name': 'barney', 'employer': 'slate' }
- */
- var defaults = createIterator(defaultsIteratorOptions);
-
- /**
- * This method is like `_.findIndex` except that it returns the key of the
- * first element that passes the callback check, instead of the element itself.
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to search.
- * @param {Function|Object|string} [callback=identity] The function called per
- * iteration. If a property name or object is provided it will be used to
- * create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {string|undefined} Returns the key of the found element, else `undefined`.
- * @example
- *
- * var characters = {
- * 'barney': { 'age': 36, 'blocked': false },
- * 'fred': { 'age': 40, 'blocked': true },
- * 'pebbles': { 'age': 1, 'blocked': false }
- * };
- *
- * _.findKey(characters, function(chr) {
- * return chr.age < 40;
- * });
- * // => 'barney' (property order is not guaranteed across environments)
- *
- * // using "_.where" callback shorthand
- * _.findKey(characters, { 'age': 1 });
- * // => 'pebbles'
- *
- * // using "_.pluck" callback shorthand
- * _.findKey(characters, 'blocked');
- * // => 'fred'
- */
- function findKey(object, callback, thisArg) {
- var result;
- callback = lodash.createCallback(callback, thisArg, 3);
- forOwn(object, function(value, key, object) {
- if (callback(value, key, object)) {
- result = key;
- return false;
- }
- });
- return result;
- }
-
- /**
- * This method is like `_.findKey` except that it iterates over elements
- * of a `collection` in the opposite order.
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to search.
- * @param {Function|Object|string} [callback=identity] The function called per
- * iteration. If a property name or object is provided it will be used to
- * create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {string|undefined} Returns the key of the found element, else `undefined`.
- * @example
- *
- * var characters = {
- * 'barney': { 'age': 36, 'blocked': true },
- * 'fred': { 'age': 40, 'blocked': false },
- * 'pebbles': { 'age': 1, 'blocked': true }
- * };
- *
- * _.findLastKey(characters, function(chr) {
- * return chr.age < 40;
- * });
- * // => returns `pebbles`, assuming `_.findKey` returns `barney`
- *
- * // using "_.where" callback shorthand
- * _.findLastKey(characters, { 'age': 40 });
- * // => 'fred'
- *
- * // using "_.pluck" callback shorthand
- * _.findLastKey(characters, 'blocked');
- * // => 'pebbles'
- */
- function findLastKey(object, callback, thisArg) {
- var result;
- callback = lodash.createCallback(callback, thisArg, 3);
- forOwnRight(object, function(value, key, object) {
- if (callback(value, key, object)) {
- result = key;
- return false;
- }
- });
- return result;
- }
-
- /**
- * Iterates over own and inherited enumerable properties of an object,
- * executing the callback for each property. The callback is bound to `thisArg`
- * and invoked with three arguments; (value, key, object). Callbacks may exit
- * iteration early by explicitly returning `false`.
- *
- * @static
- * @memberOf _
- * @type Function
- * @category Objects
- * @param {Object} object The object to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns `object`.
- * @example
- *
- * function Shape() {
- * this.x = 0;
- * this.y = 0;
- * }
- *
- * Shape.prototype.move = function(x, y) {
- * this.x += x;
- * this.y += y;
- * };
- *
- * _.forIn(new Shape, function(value, key) {
- * console.log(key);
- * });
- * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)
- */
- var forIn = createIterator(eachIteratorOptions, forOwnIteratorOptions, {
- 'useHas': false
- });
-
- /**
- * This method is like `_.forIn` except that it iterates over elements
- * of a `collection` in the opposite order.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns `object`.
- * @example
- *
- * function Shape() {
- * this.x = 0;
- * this.y = 0;
- * }
- *
- * Shape.prototype.move = function(x, y) {
- * this.x += x;
- * this.y += y;
- * };
- *
- * _.forInRight(new Shape, function(value, key) {
- * console.log(key);
- * });
- * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'
- */
- function forInRight(object, callback, thisArg) {
- var pairs = [];
-
- forIn(object, function(value, key) {
- pairs.push(key, value);
- });
-
- var length = pairs.length;
- callback = baseCreateCallback(callback, thisArg, 3);
- while (length--) {
- if (callback(pairs[length--], pairs[length], object) === false) {
- break;
- }
- }
- return object;
- }
-
- /**
- * Iterates over own enumerable properties of an object, executing the callback
- * for each property. The callback is bound to `thisArg` and invoked with three
- * arguments; (value, key, object). Callbacks may exit iteration early by
- * explicitly returning `false`.
- *
- * @static
- * @memberOf _
- * @type Function
- * @category Objects
- * @param {Object} object The object to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns `object`.
- * @example
- *
- * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {
- * console.log(key);
- * });
- * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)
- */
- var forOwn = createIterator(eachIteratorOptions, forOwnIteratorOptions);
-
- /**
- * This method is like `_.forOwn` except that it iterates over elements
- * of a `collection` in the opposite order.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns `object`.
- * @example
- *
- * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {
- * console.log(key);
- * });
- * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'
- */
- function forOwnRight(object, callback, thisArg) {
- var props = keys(object),
- length = props.length;
-
- callback = baseCreateCallback(callback, thisArg, 3);
- while (length--) {
- var key = props[length];
- if (callback(object[key], key, object) === false) {
- break;
- }
- }
- return object;
- }
-
- /**
- * Creates a sorted array of property names of all enumerable properties,
- * own and inherited, of `object` that have function values.
- *
- * @static
- * @memberOf _
- * @alias methods
- * @category Objects
- * @param {Object} object The object to inspect.
- * @returns {Array} Returns an array of property names that have function values.
- * @example
- *
- * _.functions(_);
- * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]
- */
- function functions(object) {
- var result = [];
- forIn(object, function(value, key) {
- if (isFunction(value)) {
- result.push(key);
- }
- });
- return result.sort();
- }
-
- /**
- * Checks if the specified property name exists as a direct property of `object`,
- * instead of an inherited property.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to inspect.
- * @param {string} key The name of the property to check.
- * @returns {boolean} Returns `true` if key is a direct property, else `false`.
- * @example
- *
- * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');
- * // => true
- */
- function has(object, key) {
- return object ? hasOwnProperty.call(object, key) : false;
- }
-
- /**
- * Creates an object composed of the inverted keys and values of the given object.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to invert.
- * @returns {Object} Returns the created inverted object.
- * @example
- *
- * _.invert({ 'first': 'fred', 'second': 'barney' });
- * // => { 'fred': 'first', 'barney': 'second' }
- */
- function invert(object) {
- var index = -1,
- props = keys(object),
- length = props.length,
- result = {};
-
- while (++index < length) {
- var key = props[index];
- result[object[key]] = key;
- }
- return result;
- }
-
- /**
- * Checks if `value` is a boolean value.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.
- * @example
- *
- * _.isBoolean(null);
- * // => false
- */
- function isBoolean(value) {
- return value === true || value === false ||
- value && typeof value == 'object' && toString.call(value) == boolClass || false;
- }
-
- /**
- * Checks if `value` is a date.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is a date, else `false`.
- * @example
- *
- * _.isDate(new Date);
- * // => true
- */
- function isDate(value) {
- return value && typeof value == 'object' && toString.call(value) == dateClass || false;
- }
-
- /**
- * Checks if `value` is a DOM element.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.
- * @example
- *
- * _.isElement(document.body);
- * // => true
- */
- function isElement(value) {
- return value && value.nodeType === 1 || false;
- }
-
- /**
- * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a
- * length of `0` and objects with no own enumerable properties are considered
- * "empty".
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Array|Object|string} value The value to inspect.
- * @returns {boolean} Returns `true` if the `value` is empty, else `false`.
- * @example
- *
- * _.isEmpty([1, 2, 3]);
- * // => false
- *
- * _.isEmpty({});
- * // => true
- *
- * _.isEmpty('');
- * // => true
- */
- function isEmpty(value) {
- var result = true;
- if (!value) {
- return result;
- }
- var className = toString.call(value),
- length = value.length;
-
- if ((className == arrayClass || className == stringClass ||
- (support.argsClass ? className == argsClass : isArguments(value))) ||
- (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {
- return !length;
- }
- forOwn(value, function() {
- return (result = false);
- });
- return result;
- }
-
- /**
- * Performs a deep comparison between two values to determine if they are
- * equivalent to each other. If a callback is provided it will be executed
- * to compare values. If the callback returns `undefined` comparisons will
- * be handled by the method instead. The callback is bound to `thisArg` and
- * invoked with two arguments; (a, b).
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} a The value to compare.
- * @param {*} b The other value to compare.
- * @param {Function} [callback] The function to customize comparing values.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- * @example
- *
- * var object = { 'name': 'fred' };
- * var copy = { 'name': 'fred' };
- *
- * object == copy;
- * // => false
- *
- * _.isEqual(object, copy);
- * // => true
- *
- * var words = ['hello', 'goodbye'];
- * var otherWords = ['hi', 'goodbye'];
- *
- * _.isEqual(words, otherWords, function(a, b) {
- * var reGreet = /^(?:hello|hi)$/i,
- * aGreet = _.isString(a) && reGreet.test(a),
- * bGreet = _.isString(b) && reGreet.test(b);
- *
- * return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;
- * });
- * // => true
- */
- function isEqual(a, b, callback, thisArg) {
- return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));
- }
-
- /**
- * Checks if `value` is, or can be coerced to, a finite number.
- *
- * Note: This is not the same as native `isFinite` which will return true for
- * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is finite, else `false`.
- * @example
- *
- * _.isFinite(-101);
- * // => true
- *
- * _.isFinite('10');
- * // => true
- *
- * _.isFinite(true);
- * // => false
- *
- * _.isFinite('');
- * // => false
- *
- * _.isFinite(Infinity);
- * // => false
- */
- function isFinite(value) {
- return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));
- }
-
- /**
- * Checks if `value` is a function.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is a function, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- */
- function isFunction(value) {
- return typeof value == 'function';
- }
- // fallback for older versions of Chrome and Safari
- if (isFunction(/x/)) {
- isFunction = function(value) {
- return typeof value == 'function' && toString.call(value) == funcClass;
- };
- }
-
- /**
- * Checks if `value` is the language type of Object.
- * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(1);
- * // => false
- */
- function isObject(value) {
- // check if the value is the ECMAScript language type of Object
- // http://es5.github.io/#x8
- // and avoid a V8 bug
- // http://code.google.com/p/v8/issues/detail?id=2291
- return !!(value && objectTypes[typeof value]);
- }
-
- /**
- * Checks if `value` is `NaN`.
- *
- * Note: This is not the same as native `isNaN` which will return `true` for
- * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.
- * @example
- *
- * _.isNaN(NaN);
- * // => true
- *
- * _.isNaN(new Number(NaN));
- * // => true
- *
- * isNaN(undefined);
- * // => true
- *
- * _.isNaN(undefined);
- * // => false
- */
- function isNaN(value) {
- // `NaN` as a primitive is the only value that is not equal to itself
- // (perform the [[Class]] check first to avoid errors with some host objects in IE)
- return isNumber(value) && value != +value;
- }
-
- /**
- * Checks if `value` is `null`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.
- * @example
- *
- * _.isNull(null);
- * // => true
- *
- * _.isNull(undefined);
- * // => false
- */
- function isNull(value) {
- return value === null;
- }
-
- /**
- * Checks if `value` is a number.
- *
- * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is a number, else `false`.
- * @example
- *
- * _.isNumber(8.4 * 5);
- * // => true
- */
- function isNumber(value) {
- return typeof value == 'number' ||
- value && typeof value == 'object' && toString.call(value) == numberClass || false;
- }
-
- /**
- * Checks if `value` is an object created by the `Object` constructor.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
- * @example
- *
- * function Shape() {
- * this.x = 0;
- * this.y = 0;
- * }
- *
- * _.isPlainObject(new Shape);
- * // => false
- *
- * _.isPlainObject([1, 2, 3]);
- * // => false
- *
- * _.isPlainObject({ 'x': 0, 'y': 0 });
- * // => true
- */
- var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {
- if (!(value && toString.call(value) == objectClass) || (!support.argsClass && isArguments(value))) {
- return false;
- }
- var valueOf = value.valueOf,
- objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);
-
- return objProto
- ? (value == objProto || getPrototypeOf(value) == objProto)
- : shimIsPlainObject(value);
- };
-
- /**
- * Checks if `value` is a regular expression.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.
- * @example
- *
- * _.isRegExp(/fred/);
- * // => true
- */
- function isRegExp(value) {
- return value && objectTypes[typeof value] && toString.call(value) == regexpClass || false;
- }
-
- /**
- * Checks if `value` is a string.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is a string, else `false`.
- * @example
- *
- * _.isString('fred');
- * // => true
- */
- function isString(value) {
- return typeof value == 'string' ||
- value && typeof value == 'object' && toString.call(value) == stringClass || false;
- }
-
- /**
- * Checks if `value` is `undefined`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.
- * @example
- *
- * _.isUndefined(void 0);
- * // => true
- */
- function isUndefined(value) {
- return typeof value == 'undefined';
- }
-
- /**
- * Creates an object with the same keys as `object` and values generated by
- * running each own enumerable property of `object` through the callback.
- * The callback is bound to `thisArg` and invoked with three arguments;
- * (value, key, object).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to iterate over.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a new object with values of the results of each `callback` execution.
- * @example
- *
- * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });
- * // => { 'a': 3, 'b': 6, 'c': 9 }
- *
- * var characters = {
- * 'fred': { 'name': 'fred', 'age': 40 },
- * 'pebbles': { 'name': 'pebbles', 'age': 1 }
- * };
- *
- * // using "_.pluck" callback shorthand
- * _.mapValues(characters, 'age');
- * // => { 'fred': 40, 'pebbles': 1 }
- */
- function mapValues(object, callback, thisArg) {
- var result = {};
- callback = lodash.createCallback(callback, thisArg, 3);
-
- forOwn(object, function(value, key, object) {
- result[key] = callback(value, key, object);
- });
- return result;
- }
-
- /**
- * Recursively merges own enumerable properties of the source object(s), that
- * don't resolve to `undefined` into the destination object. Subsequent sources
- * will overwrite property assignments of previous sources. If a callback is
- * provided it will be executed to produce the merged values of the destination
- * and source properties. If the callback returns `undefined` merging will
- * be handled by the method instead. The callback is bound to `thisArg` and
- * invoked with two arguments; (objectValue, sourceValue).
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The destination object.
- * @param {...Object} [source] The source objects.
- * @param {Function} [callback] The function to customize merging properties.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns the destination object.
- * @example
- *
- * var names = {
- * 'characters': [
- * { 'name': 'barney' },
- * { 'name': 'fred' }
- * ]
- * };
- *
- * var ages = {
- * 'characters': [
- * { 'age': 36 },
- * { 'age': 40 }
- * ]
- * };
- *
- * _.merge(names, ages);
- * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }
- *
- * var food = {
- * 'fruits': ['apple'],
- * 'vegetables': ['beet']
- * };
- *
- * var otherFood = {
- * 'fruits': ['banana'],
- * 'vegetables': ['carrot']
- * };
- *
- * _.merge(food, otherFood, function(a, b) {
- * return _.isArray(a) ? a.concat(b) : undefined;
- * });
- * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }
- */
- function merge(object) {
- var args = arguments,
- length = 2;
-
- if (!isObject(object)) {
- return object;
- }
- // allows working with `_.reduce` and `_.reduceRight` without using
- // their `index` and `collection` arguments
- if (typeof args[2] != 'number') {
- length = args.length;
- }
- if (length > 3 && typeof args[length - 2] == 'function') {
- var callback = baseCreateCallback(args[--length - 1], args[length--], 2);
- } else if (length > 2 && typeof args[length - 1] == 'function') {
- callback = args[--length];
- }
- var sources = slice(arguments, 1, length),
- index = -1,
- stackA = getArray(),
- stackB = getArray();
-
- while (++index < length) {
- baseMerge(object, sources[index], callback, stackA, stackB);
- }
- releaseArray(stackA);
- releaseArray(stackB);
- return object;
- }
-
- /**
- * Creates a shallow clone of `object` excluding the specified properties.
- * Property names may be specified as individual arguments or as arrays of
- * property names. If a callback is provided it will be executed for each
- * property of `object` omitting the properties the callback returns truey
- * for. The callback is bound to `thisArg` and invoked with three arguments;
- * (value, key, object).
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The source object.
- * @param {Function|...string|string[]} [callback] The properties to omit or the
- * function called per iteration.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns an object without the omitted properties.
- * @example
- *
- * _.omit({ 'name': 'fred', 'age': 40 }, 'age');
- * // => { 'name': 'fred' }
- *
- * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {
- * return typeof value == 'number';
- * });
- * // => { 'name': 'fred' }
- */
- function omit(object, callback, thisArg) {
- var result = {};
- if (typeof callback != 'function') {
- var props = [];
- forIn(object, function(value, key) {
- props.push(key);
- });
- props = baseDifference(props, baseFlatten(arguments, true, false, 1));
-
- var index = -1,
- length = props.length;
-
- while (++index < length) {
- var key = props[index];
- result[key] = object[key];
- }
- } else {
- callback = lodash.createCallback(callback, thisArg, 3);
- forIn(object, function(value, key, object) {
- if (!callback(value, key, object)) {
- result[key] = value;
- }
- });
- }
- return result;
- }
-
- /**
- * Creates a two dimensional array of an object's key-value pairs,
- * i.e. `[[key1, value1], [key2, value2]]`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to inspect.
- * @returns {Array} Returns new array of key-value pairs.
- * @example
- *
- * _.pairs({ 'barney': 36, 'fred': 40 });
- * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)
- */
- function pairs(object) {
- var index = -1,
- props = keys(object),
- length = props.length,
- result = Array(length);
-
- while (++index < length) {
- var key = props[index];
- result[index] = [key, object[key]];
- }
- return result;
- }
-
- /**
- * Creates a shallow clone of `object` composed of the specified properties.
- * Property names may be specified as individual arguments or as arrays of
- * property names. If a callback is provided it will be executed for each
- * property of `object` picking the properties the callback returns truey
- * for. The callback is bound to `thisArg` and invoked with three arguments;
- * (value, key, object).
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The source object.
- * @param {Function|...string|string[]} [callback] The function called per
- * iteration or property names to pick, specified as individual property
- * names or arrays of property names.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns an object composed of the picked properties.
- * @example
- *
- * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');
- * // => { 'name': 'fred' }
- *
- * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {
- * return key.charAt(0) != '_';
- * });
- * // => { 'name': 'fred' }
- */
- function pick(object, callback, thisArg) {
- var result = {};
- if (typeof callback != 'function') {
- var index = -1,
- props = baseFlatten(arguments, true, false, 1),
- length = isObject(object) ? props.length : 0;
-
- while (++index < length) {
- var key = props[index];
- if (key in object) {
- result[key] = object[key];
- }
- }
- } else {
- callback = lodash.createCallback(callback, thisArg, 3);
- forIn(object, function(value, key, object) {
- if (callback(value, key, object)) {
- result[key] = value;
- }
- });
- }
- return result;
- }
-
- /**
- * An alternative to `_.reduce` this method transforms `object` to a new
- * `accumulator` object which is the result of running each of its own
- * enumerable properties through a callback, with each callback execution
- * potentially mutating the `accumulator` object. The callback is bound to
- * `thisArg` and invoked with four arguments; (accumulator, value, key, object).
- * Callbacks may exit iteration early by explicitly returning `false`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Array|Object} object The object to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {*} [accumulator] The custom accumulator value.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {*} Returns the accumulated value.
- * @example
- *
- * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {
- * num *= num;
- * if (num % 2) {
- * return result.push(num) < 3;
- * }
- * });
- * // => [1, 9, 25]
- *
- * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {
- * result[key] = num * 3;
- * });
- * // => { 'a': 3, 'b': 6, 'c': 9 }
- */
- function transform(object, callback, accumulator, thisArg) {
- var isArr = isArray(object);
- if (accumulator == null) {
- if (isArr) {
- accumulator = [];
- } else {
- var ctor = object && object.constructor,
- proto = ctor && ctor.prototype;
-
- accumulator = baseCreate(proto);
- }
- }
- if (callback) {
- callback = lodash.createCallback(callback, thisArg, 4);
- (isArr ? baseEach : forOwn)(object, function(value, index, object) {
- return callback(accumulator, value, index, object);
- });
- }
- return accumulator;
- }
-
- /**
- * Creates an array composed of the own enumerable property values of `object`.
- *
- * @static
- * @memberOf _
- * @category Objects
- * @param {Object} object The object to inspect.
- * @returns {Array} Returns an array of property values.
- * @example
- *
- * _.values({ 'one': 1, 'two': 2, 'three': 3 });
- * // => [1, 2, 3] (property order is not guaranteed across environments)
- */
- function values(object) {
- var index = -1,
- props = keys(object),
- length = props.length,
- result = Array(length);
-
- while (++index < length) {
- result[index] = object[props[index]];
- }
- return result;
- }
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Creates an array of elements from the specified indexes, or keys, of the
- * `collection`. Indexes may be specified as individual arguments or as arrays
- * of indexes.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`
- * to retrieve, specified as individual indexes or arrays of indexes.
- * @returns {Array} Returns a new array of elements corresponding to the
- * provided indexes.
- * @example
- *
- * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);
- * // => ['a', 'c', 'e']
- *
- * _.at(['fred', 'barney', 'pebbles'], 0, 2);
- * // => ['fred', 'pebbles']
- */
- function at(collection) {
- var args = arguments,
- index = -1,
- props = baseFlatten(args, true, false, 1),
- length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,
- result = Array(length);
-
- if (support.unindexedChars && isString(collection)) {
- collection = collection.split('');
- }
- while(++index < length) {
- result[index] = collection[props[index]];
- }
- return result;
- }
-
- /**
- * Checks if a given value is present in a collection using strict equality
- * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the
- * offset from the end of the collection.
- *
- * @static
- * @memberOf _
- * @alias include
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {*} target The value to check for.
- * @param {number} [fromIndex=0] The index to search from.
- * @returns {boolean} Returns `true` if the `target` element is found, else `false`.
- * @example
- *
- * _.contains([1, 2, 3], 1);
- * // => true
- *
- * _.contains([1, 2, 3], 1, 2);
- * // => false
- *
- * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');
- * // => true
- *
- * _.contains('pebbles', 'eb');
- * // => true
- */
- function contains(collection, target, fromIndex) {
- var index = -1,
- indexOf = getIndexOf(),
- length = collection ? collection.length : 0,
- result = false;
-
- fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;
- if (isArray(collection)) {
- result = indexOf(collection, target, fromIndex) > -1;
- } else if (typeof length == 'number') {
- result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;
- } else {
- baseEach(collection, function(value) {
- if (++index >= fromIndex) {
- return !(result = value === target);
- }
- });
- }
- return result;
- }
-
- /**
- * Creates an object composed of keys generated from the results of running
- * each element of `collection` through the callback. The corresponding value
- * of each key is the number of times the key was returned by the callback.
- * The callback is bound to `thisArg` and invoked with three arguments;
- * (value, index|key, collection).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns the composed aggregate object.
- * @example
- *
- * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });
- * // => { '4': 1, '6': 2 }
- *
- * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);
- * // => { '4': 1, '6': 2 }
- *
- * _.countBy(['one', 'two', 'three'], 'length');
- * // => { '3': 2, '5': 1 }
- */
- var countBy = createAggregator(function(result, value, key) {
- (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);
- });
-
- /**
- * Checks if the given callback returns truey value for **all** elements of
- * a collection. The callback is bound to `thisArg` and invoked with three
- * arguments; (value, index|key, collection).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @alias all
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {boolean} Returns `true` if all elements passed the callback check,
- * else `false`.
- * @example
- *
- * _.every([true, 1, null, 'yes']);
- * // => false
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36 },
- * { 'name': 'fred', 'age': 40 }
- * ];
- *
- * // using "_.pluck" callback shorthand
- * _.every(characters, 'age');
- * // => true
- *
- * // using "_.where" callback shorthand
- * _.every(characters, { 'age': 36 });
- * // => false
- */
- function every(collection, callback, thisArg) {
- var result = true;
- callback = lodash.createCallback(callback, thisArg, 3);
-
- if (isArray(collection)) {
- var index = -1,
- length = collection.length;
-
- while (++index < length) {
- if (!(result = !!callback(collection[index], index, collection))) {
- break;
- }
- }
- } else {
- baseEach(collection, function(value, index, collection) {
- return (result = !!callback(value, index, collection));
- });
- }
- return result;
- }
-
- /**
- * Iterates over elements of a collection, returning an array of all elements
- * the callback returns truey for. The callback is bound to `thisArg` and
- * invoked with three arguments; (value, index|key, collection).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @alias select
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a new array of elements that passed the callback check.
- * @example
- *
- * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
- * // => [2, 4, 6]
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36, 'blocked': false },
- * { 'name': 'fred', 'age': 40, 'blocked': true }
- * ];
- *
- * // using "_.pluck" callback shorthand
- * _.filter(characters, 'blocked');
- * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
- *
- * // using "_.where" callback shorthand
- * _.filter(characters, { 'age': 36 });
- * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
- */
- function filter(collection, callback, thisArg) {
- var result = [];
- callback = lodash.createCallback(callback, thisArg, 3);
-
- if (isArray(collection)) {
- var index = -1,
- length = collection.length;
-
- while (++index < length) {
- var value = collection[index];
- if (callback(value, index, collection)) {
- result.push(value);
- }
- }
- } else {
- baseEach(collection, function(value, index, collection) {
- if (callback(value, index, collection)) {
- result.push(value);
- }
- });
- }
- return result;
- }
-
- /**
- * Iterates over elements of a collection, returning the first element that
- * the callback returns truey for. The callback is bound to `thisArg` and
- * invoked with three arguments; (value, index|key, collection).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @alias detect, findWhere
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {*} Returns the found element, else `undefined`.
- * @example
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36, 'blocked': false },
- * { 'name': 'fred', 'age': 40, 'blocked': true },
- * { 'name': 'pebbles', 'age': 1, 'blocked': false }
- * ];
- *
- * _.find(characters, function(chr) {
- * return chr.age < 40;
- * });
- * // => { 'name': 'barney', 'age': 36, 'blocked': false }
- *
- * // using "_.where" callback shorthand
- * _.find(characters, { 'age': 1 });
- * // => { 'name': 'pebbles', 'age': 1, 'blocked': false }
- *
- * // using "_.pluck" callback shorthand
- * _.find(characters, 'blocked');
- * // => { 'name': 'fred', 'age': 40, 'blocked': true }
- */
- function find(collection, callback, thisArg) {
- callback = lodash.createCallback(callback, thisArg, 3);
-
- if (isArray(collection)) {
- var index = -1,
- length = collection.length;
-
- while (++index < length) {
- var value = collection[index];
- if (callback(value, index, collection)) {
- return value;
- }
- }
- } else {
- var result;
- baseEach(collection, function(value, index, collection) {
- if (callback(value, index, collection)) {
- result = value;
- return false;
- }
- });
- return result;
- }
- }
-
- /**
- * This method is like `_.find` except that it iterates over elements
- * of a `collection` from right to left.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {*} Returns the found element, else `undefined`.
- * @example
- *
- * _.findLast([1, 2, 3, 4], function(num) {
- * return num % 2 == 1;
- * });
- * // => 3
- */
- function findLast(collection, callback, thisArg) {
- var result;
- callback = lodash.createCallback(callback, thisArg, 3);
- forEachRight(collection, function(value, index, collection) {
- if (callback(value, index, collection)) {
- result = value;
- return false;
- }
- });
- return result;
- }
-
- /**
- * Iterates over elements of a collection, executing the callback for each
- * element. The callback is bound to `thisArg` and invoked with three arguments;
- * (value, index|key, collection). Callbacks may exit iteration early by
- * explicitly returning `false`.
- *
- * Note: As with other "Collections" methods, objects with a `length` property
- * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
- * may be used for object iteration.
- *
- * @static
- * @memberOf _
- * @alias each
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Array|Object|string} Returns `collection`.
- * @example
- *
- * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');
- * // => logs each number and returns '1,2,3'
- *
- * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });
- * // => logs each number and returns the object (property order is not guaranteed across environments)
- */
- function forEach(collection, callback, thisArg) {
- if (callback && typeof thisArg == 'undefined' && isArray(collection)) {
- var index = -1,
- length = collection.length;
-
- while (++index < length) {
- if (callback(collection[index], index, collection) === false) {
- break;
- }
- }
- } else {
- baseEach(collection, callback, thisArg);
- }
- return collection;
- }
-
- /**
- * This method is like `_.forEach` except that it iterates over elements
- * of a `collection` from right to left.
- *
- * @static
- * @memberOf _
- * @alias eachRight
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Array|Object|string} Returns `collection`.
- * @example
- *
- * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');
- * // => logs each number from right to left and returns '3,2,1'
- */
- function forEachRight(collection, callback, thisArg) {
- var iterable = collection,
- length = collection ? collection.length : 0;
-
- callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
- if (isArray(collection)) {
- while (length--) {
- if (callback(collection[length], length, collection) === false) {
- break;
- }
- }
- } else {
- if (typeof length != 'number') {
- var props = keys(collection);
- length = props.length;
- } else if (support.unindexedChars && isString(collection)) {
- iterable = collection.split('');
- }
- baseEach(collection, function(value, key, collection) {
- key = props ? props[--length] : --length;
- return callback(iterable[key], key, collection);
- });
- }
- return collection;
- }
-
- /**
- * Creates an object composed of keys generated from the results of running
- * each element of a collection through the callback. The corresponding value
- * of each key is an array of the elements responsible for generating the key.
- * The callback is bound to `thisArg` and invoked with three arguments;
- * (value, index|key, collection).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns the composed aggregate object.
- * @example
- *
- * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });
- * // => { '4': [4.2], '6': [6.1, 6.4] }
- *
- * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);
- * // => { '4': [4.2], '6': [6.1, 6.4] }
- *
- * // using "_.pluck" callback shorthand
- * _.groupBy(['one', 'two', 'three'], 'length');
- * // => { '3': ['one', 'two'], '5': ['three'] }
- */
- var groupBy = createAggregator(function(result, value, key) {
- (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);
- });
-
- /**
- * Creates an object composed of keys generated from the results of running
- * each element of the collection through the given callback. The corresponding
- * value of each key is the last element responsible for generating the key.
- * The callback is bound to `thisArg` and invoked with three arguments;
- * (value, index|key, collection).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Object} Returns the composed aggregate object.
- * @example
- *
- * var keys = [
- * { 'dir': 'left', 'code': 97 },
- * { 'dir': 'right', 'code': 100 }
- * ];
- *
- * _.indexBy(keys, 'dir');
- * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
- *
- * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });
- * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
- *
- * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);
- * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
- */
- var indexBy = createAggregator(function(result, value, key) {
- result[key] = value;
- });
-
- /**
- * Invokes the method named by `methodName` on each element in the `collection`
- * returning an array of the results of each invoked method. Additional arguments
- * will be provided to each invoked method. If `methodName` is a function it
- * will be invoked for, and `this` bound to, each element in the `collection`.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|string} methodName The name of the method to invoke or
- * the function invoked per iteration.
- * @param {...*} [arg] Arguments to invoke the method with.
- * @returns {Array} Returns a new array of the results of each invoked method.
- * @example
- *
- * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
- * // => [[1, 5, 7], [1, 2, 3]]
- *
- * _.invoke([123, 456], String.prototype.split, '');
- * // => [['1', '2', '3'], ['4', '5', '6']]
- */
- function invoke(collection, methodName) {
- var args = slice(arguments, 2),
- index = -1,
- isFunc = typeof methodName == 'function',
- length = collection ? collection.length : 0,
- result = Array(typeof length == 'number' ? length : 0);
-
- forEach(collection, function(value) {
- result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);
- });
- return result;
- }
-
- /**
- * Creates an array of values by running each element in the collection
- * through the callback. The callback is bound to `thisArg` and invoked with
- * three arguments; (value, index|key, collection).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @alias collect
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a new array of the results of each `callback` execution.
- * @example
- *
- * _.map([1, 2, 3], function(num) { return num * 3; });
- * // => [3, 6, 9]
- *
- * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });
- * // => [3, 6, 9] (property order is not guaranteed across environments)
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36 },
- * { 'name': 'fred', 'age': 40 }
- * ];
- *
- * // using "_.pluck" callback shorthand
- * _.map(characters, 'name');
- * // => ['barney', 'fred']
- */
- function map(collection, callback, thisArg) {
- var index = -1,
- length = collection ? collection.length : 0,
- result = Array(typeof length == 'number' ? length : 0);
-
- callback = lodash.createCallback(callback, thisArg, 3);
- if (isArray(collection)) {
- while (++index < length) {
- result[index] = callback(collection[index], index, collection);
- }
- } else {
- baseEach(collection, function(value, key, collection) {
- result[++index] = callback(value, key, collection);
- });
- }
- return result;
- }
-
- /**
- * Retrieves the maximum value of a collection. If the collection is empty or
- * falsey `-Infinity` is returned. If a callback is provided it will be executed
- * for each value in the collection to generate the criterion by which the value
- * is ranked. The callback is bound to `thisArg` and invoked with three
- * arguments; (value, index, collection).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {*} Returns the maximum value.
- * @example
- *
- * _.max([4, 2, 8, 6]);
- * // => 8
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36 },
- * { 'name': 'fred', 'age': 40 }
- * ];
- *
- * _.max(characters, function(chr) { return chr.age; });
- * // => { 'name': 'fred', 'age': 40 };
- *
- * // using "_.pluck" callback shorthand
- * _.max(characters, 'age');
- * // => { 'name': 'fred', 'age': 40 };
- */
- function max(collection, callback, thisArg) {
- var computed = -Infinity,
- result = computed;
-
- // allows working with functions like `_.map` without using
- // their `index` argument as a callback
- if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {
- callback = null;
- }
- if (callback == null && isArray(collection)) {
- var index = -1,
- length = collection.length;
-
- while (++index < length) {
- var value = collection[index];
- if (value > result) {
- result = value;
- }
- }
- } else {
- callback = (callback == null && isString(collection))
- ? charAtCallback
- : lodash.createCallback(callback, thisArg, 3);
-
- baseEach(collection, function(value, index, collection) {
- var current = callback(value, index, collection);
- if (current > computed) {
- computed = current;
- result = value;
- }
- });
- }
- return result;
- }
-
- /**
- * Retrieves the minimum value of a collection. If the collection is empty or
- * falsey `Infinity` is returned. If a callback is provided it will be executed
- * for each value in the collection to generate the criterion by which the value
- * is ranked. The callback is bound to `thisArg` and invoked with three
- * arguments; (value, index, collection).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {*} Returns the minimum value.
- * @example
- *
- * _.min([4, 2, 8, 6]);
- * // => 2
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36 },
- * { 'name': 'fred', 'age': 40 }
- * ];
- *
- * _.min(characters, function(chr) { return chr.age; });
- * // => { 'name': 'barney', 'age': 36 };
- *
- * // using "_.pluck" callback shorthand
- * _.min(characters, 'age');
- * // => { 'name': 'barney', 'age': 36 };
- */
- function min(collection, callback, thisArg) {
- var computed = Infinity,
- result = computed;
-
- // allows working with functions like `_.map` without using
- // their `index` argument as a callback
- if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {
- callback = null;
- }
- if (callback == null && isArray(collection)) {
- var index = -1,
- length = collection.length;
-
- while (++index < length) {
- var value = collection[index];
- if (value < result) {
- result = value;
- }
- }
- } else {
- callback = (callback == null && isString(collection))
- ? charAtCallback
- : lodash.createCallback(callback, thisArg, 3);
-
- baseEach(collection, function(value, index, collection) {
- var current = callback(value, index, collection);
- if (current < computed) {
- computed = current;
- result = value;
- }
- });
- }
- return result;
- }
-
- /**
- * Retrieves the value of a specified property from all elements in the collection.
- *
- * @static
- * @memberOf _
- * @type Function
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {string} property The name of the property to pluck.
- * @returns {Array} Returns a new array of property values.
- * @example
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36 },
- * { 'name': 'fred', 'age': 40 }
- * ];
- *
- * _.pluck(characters, 'name');
- * // => ['barney', 'fred']
- */
- var pluck = map;
-
- /**
- * Reduces a collection to a value which is the accumulated result of running
- * each element in the collection through the callback, where each successive
- * callback execution consumes the return value of the previous execution. If
- * `accumulator` is not provided the first element of the collection will be
- * used as the initial `accumulator` value. The callback is bound to `thisArg`
- * and invoked with four arguments; (accumulator, value, index|key, collection).
- *
- * @static
- * @memberOf _
- * @alias foldl, inject
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {*} [accumulator] Initial value of the accumulator.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {*} Returns the accumulated value.
- * @example
- *
- * var sum = _.reduce([1, 2, 3], function(sum, num) {
- * return sum + num;
- * });
- * // => 6
- *
- * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {
- * result[key] = num * 3;
- * return result;
- * }, {});
- * // => { 'a': 3, 'b': 6, 'c': 9 }
- */
- function reduce(collection, callback, accumulator, thisArg) {
- var noaccum = arguments.length < 3;
- callback = lodash.createCallback(callback, thisArg, 4);
-
- if (isArray(collection)) {
- var index = -1,
- length = collection.length;
-
- if (noaccum) {
- accumulator = collection[++index];
- }
- while (++index < length) {
- accumulator = callback(accumulator, collection[index], index, collection);
- }
- } else {
- baseEach(collection, function(value, index, collection) {
- accumulator = noaccum
- ? (noaccum = false, value)
- : callback(accumulator, value, index, collection)
- });
- }
- return accumulator;
- }
-
- /**
- * This method is like `_.reduce` except that it iterates over elements
- * of a `collection` from right to left.
- *
- * @static
- * @memberOf _
- * @alias foldr
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} [callback=identity] The function called per iteration.
- * @param {*} [accumulator] Initial value of the accumulator.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {*} Returns the accumulated value.
- * @example
- *
- * var list = [[0, 1], [2, 3], [4, 5]];
- * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);
- * // => [4, 5, 2, 3, 0, 1]
- */
- function reduceRight(collection, callback, accumulator, thisArg) {
- var noaccum = arguments.length < 3;
- callback = lodash.createCallback(callback, thisArg, 4);
- forEachRight(collection, function(value, index, collection) {
- accumulator = noaccum
- ? (noaccum = false, value)
- : callback(accumulator, value, index, collection);
- });
- return accumulator;
- }
-
- /**
- * The opposite of `_.filter` this method returns the elements of a
- * collection that the callback does **not** return truey for.
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a new array of elements that failed the callback check.
- * @example
- *
- * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
- * // => [1, 3, 5]
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36, 'blocked': false },
- * { 'name': 'fred', 'age': 40, 'blocked': true }
- * ];
- *
- * // using "_.pluck" callback shorthand
- * _.reject(characters, 'blocked');
- * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
- *
- * // using "_.where" callback shorthand
- * _.reject(characters, { 'age': 36 });
- * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
- */
- function reject(collection, callback, thisArg) {
- callback = lodash.createCallback(callback, thisArg, 3);
- return filter(collection, function(value, index, collection) {
- return !callback(value, index, collection);
- });
- }
-
- /**
- * Retrieves a random element or `n` random elements from a collection.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|string} collection The collection to sample.
- * @param {number} [n] The number of elements to sample.
- * @param- {Object} [guard] Allows working with functions like `_.map`
- * without using their `index` arguments as `n`.
- * @returns {Array} Returns the random sample(s) of `collection`.
- * @example
- *
- * _.sample([1, 2, 3, 4]);
- * // => 2
- *
- * _.sample([1, 2, 3, 4], 2);
- * // => [3, 1]
- */
- function sample(collection, n, guard) {
- if (collection && typeof collection.length != 'number') {
- collection = values(collection);
- } else if (support.unindexedChars && isString(collection)) {
- collection = collection.split('');
- }
- if (n == null || guard) {
- return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;
- }
- var result = shuffle(collection);
- result.length = nativeMin(nativeMax(0, n), result.length);
- return result;
- }
-
- /**
- * Creates an array of shuffled values, using a version of the Fisher-Yates
- * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|string} collection The collection to shuffle.
- * @returns {Array} Returns a new shuffled collection.
- * @example
- *
- * _.shuffle([1, 2, 3, 4, 5, 6]);
- * // => [4, 1, 6, 3, 5, 2]
- */
- function shuffle(collection) {
- var index = -1,
- length = collection ? collection.length : 0,
- result = Array(typeof length == 'number' ? length : 0);
-
- forEach(collection, function(value) {
- var rand = baseRandom(0, ++index);
- result[index] = result[rand];
- result[rand] = value;
- });
- return result;
- }
-
- /**
- * Gets the size of the `collection` by returning `collection.length` for arrays
- * and array-like objects or the number of own enumerable properties for objects.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|string} collection The collection to inspect.
- * @returns {number} Returns `collection.length` or number of own enumerable properties.
- * @example
- *
- * _.size([1, 2]);
- * // => 2
- *
- * _.size({ 'one': 1, 'two': 2, 'three': 3 });
- * // => 3
- *
- * _.size('pebbles');
- * // => 7
- */
- function size(collection) {
- var length = collection ? collection.length : 0;
- return typeof length == 'number' ? length : keys(collection).length;
- }
-
- /**
- * Checks if the callback returns a truey value for **any** element of a
- * collection. The function returns as soon as it finds a passing value and
- * does not iterate over the entire collection. The callback is bound to
- * `thisArg` and invoked with three arguments; (value, index|key, collection).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @alias any
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {boolean} Returns `true` if any element passed the callback check,
- * else `false`.
- * @example
- *
- * _.some([null, 0, 'yes', false], Boolean);
- * // => true
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36, 'blocked': false },
- * { 'name': 'fred', 'age': 40, 'blocked': true }
- * ];
- *
- * // using "_.pluck" callback shorthand
- * _.some(characters, 'blocked');
- * // => true
- *
- * // using "_.where" callback shorthand
- * _.some(characters, { 'age': 1 });
- * // => false
- */
- function some(collection, callback, thisArg) {
- var result;
- callback = lodash.createCallback(callback, thisArg, 3);
-
- if (isArray(collection)) {
- var index = -1,
- length = collection.length;
-
- while (++index < length) {
- if ((result = callback(collection[index], index, collection))) {
- break;
- }
- }
- } else {
- baseEach(collection, function(value, index, collection) {
- return !(result = callback(value, index, collection));
- });
- }
- return !!result;
- }
-
- /**
- * Creates an array of elements, sorted in ascending order by the results of
- * running each element in a collection through the callback. This method
- * performs a stable sort, that is, it will preserve the original sort order
- * of equal elements. The callback is bound to `thisArg` and invoked with
- * three arguments; (value, index|key, collection).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an array of property names is provided for `callback` the collection
- * will be sorted by each property value.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Array|Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a new array of sorted elements.
- * @example
- *
- * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });
- * // => [3, 1, 2]
- *
- * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);
- * // => [3, 1, 2]
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36 },
- * { 'name': 'fred', 'age': 40 },
- * { 'name': 'barney', 'age': 26 },
- * { 'name': 'fred', 'age': 30 }
- * ];
- *
- * // using "_.pluck" callback shorthand
- * _.map(_.sortBy(characters, 'age'), _.values);
- * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]
- *
- * // sorting by multiple properties
- * _.map(_.sortBy(characters, ['name', 'age']), _.values);
- * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]
- */
- function sortBy(collection, callback, thisArg) {
- var index = -1,
- isArr = isArray(callback),
- length = collection ? collection.length : 0,
- result = Array(typeof length == 'number' ? length : 0);
-
- if (!isArr) {
- callback = lodash.createCallback(callback, thisArg, 3);
- }
- forEach(collection, function(value, key, collection) {
- var object = result[++index] = getObject();
- if (isArr) {
- object.criteria = map(callback, function(key) { return value[key]; });
- } else {
- (object.criteria = getArray())[0] = callback(value, key, collection);
- }
- object.index = index;
- object.value = value;
- });
-
- length = result.length;
- result.sort(compareAscending);
- while (length--) {
- var object = result[length];
- result[length] = object.value;
- if (!isArr) {
- releaseArray(object.criteria);
- }
- releaseObject(object);
- }
- return result;
- }
-
- /**
- * Converts the `collection` to an array.
- *
- * @static
- * @memberOf _
- * @category Collections
- * @param {Array|Object|string} collection The collection to convert.
- * @returns {Array} Returns the new converted array.
- * @example
- *
- * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);
- * // => [2, 3, 4]
- */
- function toArray(collection) {
- if (collection && typeof collection.length == 'number') {
- return (support.unindexedChars && isString(collection))
- ? collection.split('')
- : slice(collection);
- }
- return values(collection);
- }
-
- /**
- * Performs a deep comparison of each element in a `collection` to the given
- * `properties` object, returning an array of all elements that have equivalent
- * property values.
- *
- * @static
- * @memberOf _
- * @type Function
- * @category Collections
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Object} props The object of property values to filter by.
- * @returns {Array} Returns a new array of elements that have the given properties.
- * @example
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },
- * { 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }
- * ];
- *
- * _.where(characters, { 'age': 36 });
- * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]
- *
- * _.where(characters, { 'pets': ['dino'] });
- * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]
- */
- var where = filter;
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Creates an array with all falsey values removed. The values `false`, `null`,
- * `0`, `""`, `undefined`, and `NaN` are all falsey.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to compact.
- * @returns {Array} Returns a new array of filtered values.
- * @example
- *
- * _.compact([0, 1, false, 2, '', 3]);
- * // => [1, 2, 3]
- */
- function compact(array) {
- var index = -1,
- length = array ? array.length : 0,
- result = [];
-
- while (++index < length) {
- var value = array[index];
- if (value) {
- result.push(value);
- }
- }
- return result;
- }
-
- /**
- * Creates an array excluding all values of the provided arrays using strict
- * equality for comparisons, i.e. `===`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to process.
- * @param {...Array} [values] The arrays of values to exclude.
- * @returns {Array} Returns a new array of filtered values.
- * @example
- *
- * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);
- * // => [1, 3, 4]
- */
- function difference(array) {
- return baseDifference(array, baseFlatten(arguments, true, true, 1));
- }
-
- /**
- * This method is like `_.find` except that it returns the index of the first
- * element that passes the callback check, instead of the element itself.
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to search.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {number} Returns the index of the found element, else `-1`.
- * @example
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36, 'blocked': false },
- * { 'name': 'fred', 'age': 40, 'blocked': true },
- * { 'name': 'pebbles', 'age': 1, 'blocked': false }
- * ];
- *
- * _.findIndex(characters, function(chr) {
- * return chr.age < 20;
- * });
- * // => 2
- *
- * // using "_.where" callback shorthand
- * _.findIndex(characters, { 'age': 36 });
- * // => 0
- *
- * // using "_.pluck" callback shorthand
- * _.findIndex(characters, 'blocked');
- * // => 1
- */
- function findIndex(array, callback, thisArg) {
- var index = -1,
- length = array ? array.length : 0;
-
- callback = lodash.createCallback(callback, thisArg, 3);
- while (++index < length) {
- if (callback(array[index], index, array)) {
- return index;
- }
- }
- return -1;
- }
-
- /**
- * This method is like `_.findIndex` except that it iterates over elements
- * of a `collection` from right to left.
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to search.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {number} Returns the index of the found element, else `-1`.
- * @example
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36, 'blocked': true },
- * { 'name': 'fred', 'age': 40, 'blocked': false },
- * { 'name': 'pebbles', 'age': 1, 'blocked': true }
- * ];
- *
- * _.findLastIndex(characters, function(chr) {
- * return chr.age > 30;
- * });
- * // => 1
- *
- * // using "_.where" callback shorthand
- * _.findLastIndex(characters, { 'age': 36 });
- * // => 0
- *
- * // using "_.pluck" callback shorthand
- * _.findLastIndex(characters, 'blocked');
- * // => 2
- */
- function findLastIndex(array, callback, thisArg) {
- var length = array ? array.length : 0;
- callback = lodash.createCallback(callback, thisArg, 3);
- while (length--) {
- if (callback(array[length], length, array)) {
- return length;
- }
- }
- return -1;
- }
-
- /**
- * Gets the first element or first `n` elements of an array. If a callback
- * is provided elements at the beginning of the array are returned as long
- * as the callback returns truey. The callback is bound to `thisArg` and
- * invoked with three arguments; (value, index, array).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @alias head, take
- * @category Arrays
- * @param {Array} array The array to query.
- * @param {Function|Object|number|string} [callback] The function called
- * per element or the number of elements to return. If a property name or
- * object is provided it will be used to create a "_.pluck" or "_.where"
- * style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {*} Returns the first element(s) of `array`.
- * @example
- *
- * _.first([1, 2, 3]);
- * // => 1
- *
- * _.first([1, 2, 3], 2);
- * // => [1, 2]
- *
- * _.first([1, 2, 3], function(num) {
- * return num < 3;
- * });
- * // => [1, 2]
- *
- * var characters = [
- * { 'name': 'barney', 'blocked': true, 'employer': 'slate' },
- * { 'name': 'fred', 'blocked': false, 'employer': 'slate' },
- * { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
- * ];
- *
- * // using "_.pluck" callback shorthand
- * _.first(characters, 'blocked');
- * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]
- *
- * // using "_.where" callback shorthand
- * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');
- * // => ['barney', 'fred']
- */
- function first(array, callback, thisArg) {
- var n = 0,
- length = array ? array.length : 0;
-
- if (typeof callback != 'number' && callback != null) {
- var index = -1;
- callback = lodash.createCallback(callback, thisArg, 3);
- while (++index < length && callback(array[index], index, array)) {
- n++;
- }
- } else {
- n = callback;
- if (n == null || thisArg) {
- return array ? array[0] : undefined;
- }
- }
- return slice(array, 0, nativeMin(nativeMax(0, n), length));
- }
-
- /**
- * Flattens a nested array (the nesting can be to any depth). If `isShallow`
- * is truey, the array will only be flattened a single level. If a callback
- * is provided each element of the array is passed through the callback before
- * flattening. The callback is bound to `thisArg` and invoked with three
- * arguments; (value, index, array).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to flatten.
- * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a new flattened array.
- * @example
- *
- * _.flatten([1, [2], [3, [[4]]]]);
- * // => [1, 2, 3, 4];
- *
- * _.flatten([1, [2], [3, [[4]]]], true);
- * // => [1, 2, 3, [[4]]];
- *
- * var characters = [
- * { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },
- * { 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }
- * ];
- *
- * // using "_.pluck" callback shorthand
- * _.flatten(characters, 'pets');
- * // => ['hoppy', 'baby puss', 'dino']
- */
- function flatten(array, isShallow, callback, thisArg) {
- // juggle arguments
- if (typeof isShallow != 'boolean' && isShallow != null) {
- thisArg = callback;
- callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;
- isShallow = false;
- }
- if (callback != null) {
- array = map(array, callback, thisArg);
- }
- return baseFlatten(array, isShallow);
- }
-
- /**
- * Gets the index at which the first occurrence of `value` is found using
- * strict equality for comparisons, i.e. `===`. If the array is already sorted
- * providing `true` for `fromIndex` will run a faster binary search.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to search.
- * @param {*} value The value to search for.
- * @param {boolean|number} [fromIndex=0] The index to search from or `true`
- * to perform a binary search on a sorted array.
- * @returns {number} Returns the index of the matched value or `-1`.
- * @example
- *
- * _.indexOf([1, 2, 3, 1, 2, 3], 2);
- * // => 1
- *
- * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);
- * // => 4
- *
- * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);
- * // => 2
- */
- function indexOf(array, value, fromIndex) {
- if (typeof fromIndex == 'number') {
- var length = array ? array.length : 0;
- fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);
- } else if (fromIndex) {
- var index = sortedIndex(array, value);
- return array[index] === value ? index : -1;
- }
- return baseIndexOf(array, value, fromIndex);
- }
-
- /**
- * Gets all but the last element or last `n` elements of an array. If a
- * callback is provided elements at the end of the array are excluded from
- * the result as long as the callback returns truey. The callback is bound
- * to `thisArg` and invoked with three arguments; (value, index, array).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to query.
- * @param {Function|Object|number|string} [callback=1] The function called
- * per element or the number of elements to exclude. If a property name or
- * object is provided it will be used to create a "_.pluck" or "_.where"
- * style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a slice of `array`.
- * @example
- *
- * _.initial([1, 2, 3]);
- * // => [1, 2]
- *
- * _.initial([1, 2, 3], 2);
- * // => [1]
- *
- * _.initial([1, 2, 3], function(num) {
- * return num > 1;
- * });
- * // => [1]
- *
- * var characters = [
- * { 'name': 'barney', 'blocked': false, 'employer': 'slate' },
- * { 'name': 'fred', 'blocked': true, 'employer': 'slate' },
- * { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
- * ];
- *
- * // using "_.pluck" callback shorthand
- * _.initial(characters, 'blocked');
- * // => [{ 'name': 'barney', 'blocked': false, 'employer': 'slate' }]
- *
- * // using "_.where" callback shorthand
- * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');
- * // => ['barney', 'fred']
- */
- function initial(array, callback, thisArg) {
- var n = 0,
- length = array ? array.length : 0;
-
- if (typeof callback != 'number' && callback != null) {
- var index = length;
- callback = lodash.createCallback(callback, thisArg, 3);
- while (index-- && callback(array[index], index, array)) {
- n++;
- }
- } else {
- n = (callback == null || thisArg) ? 1 : callback || n;
- }
- return slice(array, 0, nativeMin(nativeMax(0, length - n), length));
- }
-
- /**
- * Creates an array of unique values present in all provided arrays using
- * strict equality for comparisons, i.e. `===`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {...Array} [array] The arrays to inspect.
- * @returns {Array} Returns an array of shared values.
- * @example
- *
- * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);
- * // => [1, 2]
- */
- function intersection() {
- var args = [],
- argsIndex = -1,
- argsLength = arguments.length,
- caches = getArray(),
- indexOf = getIndexOf(),
- trustIndexOf = indexOf === baseIndexOf,
- seen = getArray();
-
- while (++argsIndex < argsLength) {
- var value = arguments[argsIndex];
- if (isArray(value) || isArguments(value)) {
- args.push(value);
- caches.push(trustIndexOf && value.length >= largeArraySize &&
- createCache(argsIndex ? args[argsIndex] : seen));
- }
- }
- var array = args[0],
- index = -1,
- length = array ? array.length : 0,
- result = [];
-
- outer:
- while (++index < length) {
- var cache = caches[0];
- value = array[index];
-
- if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {
- argsIndex = argsLength;
- (cache || seen).push(value);
- while (--argsIndex) {
- cache = caches[argsIndex];
- if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {
- continue outer;
- }
- }
- result.push(value);
- }
- }
- while (argsLength--) {
- cache = caches[argsLength];
- if (cache) {
- releaseObject(cache);
- }
- }
- releaseArray(caches);
- releaseArray(seen);
- return result;
- }
-
- /**
- * Gets the last element or last `n` elements of an array. If a callback is
- * provided elements at the end of the array are returned as long as the
- * callback returns truey. The callback is bound to `thisArg` and invoked
- * with three arguments; (value, index, array).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to query.
- * @param {Function|Object|number|string} [callback] The function called
- * per element or the number of elements to return. If a property name or
- * object is provided it will be used to create a "_.pluck" or "_.where"
- * style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {*} Returns the last element(s) of `array`.
- * @example
- *
- * _.last([1, 2, 3]);
- * // => 3
- *
- * _.last([1, 2, 3], 2);
- * // => [2, 3]
- *
- * _.last([1, 2, 3], function(num) {
- * return num > 1;
- * });
- * // => [2, 3]
- *
- * var characters = [
- * { 'name': 'barney', 'blocked': false, 'employer': 'slate' },
- * { 'name': 'fred', 'blocked': true, 'employer': 'slate' },
- * { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
- * ];
- *
- * // using "_.pluck" callback shorthand
- * _.pluck(_.last(characters, 'blocked'), 'name');
- * // => ['fred', 'pebbles']
- *
- * // using "_.where" callback shorthand
- * _.last(characters, { 'employer': 'na' });
- * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]
- */
- function last(array, callback, thisArg) {
- var n = 0,
- length = array ? array.length : 0;
-
- if (typeof callback != 'number' && callback != null) {
- var index = length;
- callback = lodash.createCallback(callback, thisArg, 3);
- while (index-- && callback(array[index], index, array)) {
- n++;
- }
- } else {
- n = callback;
- if (n == null || thisArg) {
- return array ? array[length - 1] : undefined;
- }
- }
- return slice(array, nativeMax(0, length - n));
- }
-
- /**
- * Gets the index at which the last occurrence of `value` is found using strict
- * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used
- * as the offset from the end of the collection.
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to search.
- * @param {*} value The value to search for.
- * @param {number} [fromIndex=array.length-1] The index to search from.
- * @returns {number} Returns the index of the matched value or `-1`.
- * @example
- *
- * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);
- * // => 4
- *
- * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);
- * // => 1
- */
- function lastIndexOf(array, value, fromIndex) {
- var index = array ? array.length : 0;
- if (typeof fromIndex == 'number') {
- index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;
- }
- while (index--) {
- if (array[index] === value) {
- return index;
- }
- }
- return -1;
- }
-
- /**
- * Removes all provided values from the given array using strict equality for
- * comparisons, i.e. `===`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to modify.
- * @param {...*} [value] The values to remove.
- * @returns {Array} Returns `array`.
- * @example
- *
- * var array = [1, 2, 3, 1, 2, 3];
- * _.pull(array, 2, 3);
- * console.log(array);
- * // => [1, 1]
- */
- function pull(array) {
- var args = arguments,
- argsIndex = 0,
- argsLength = args.length,
- length = array ? array.length : 0;
-
- while (++argsIndex < argsLength) {
- var index = -1,
- value = args[argsIndex];
- while (++index < length) {
- if (array[index] === value) {
- splice.call(array, index--, 1);
- length--;
- }
- }
- }
- return array;
- }
-
- /**
- * Creates an array of numbers (positive and/or negative) progressing from
- * `start` up to but not including `end`. If `start` is less than `stop` a
- * zero-length range is created unless a negative `step` is specified.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {number} [start=0] The start of the range.
- * @param {number} end The end of the range.
- * @param {number} [step=1] The value to increment or decrement by.
- * @returns {Array} Returns a new range array.
- * @example
- *
- * _.range(4);
- * // => [0, 1, 2, 3]
- *
- * _.range(1, 5);
- * // => [1, 2, 3, 4]
- *
- * _.range(0, 20, 5);
- * // => [0, 5, 10, 15]
- *
- * _.range(0, -4, -1);
- * // => [0, -1, -2, -3]
- *
- * _.range(1, 4, 0);
- * // => [1, 1, 1]
- *
- * _.range(0);
- * // => []
- */
- function range(start, end, step) {
- start = +start || 0;
- step = typeof step == 'number' ? step : (+step || 1);
-
- if (end == null) {
- end = start;
- start = 0;
- }
- // use `Array(length)` so engines like Chakra and V8 avoid slower modes
- // http://youtu.be/XAqIpGU8ZZk#t=17m25s
- var index = -1,
- length = nativeMax(0, ceil((end - start) / (step || 1))),
- result = Array(length);
-
- while (++index < length) {
- result[index] = start;
- start += step;
- }
- return result;
- }
-
- /**
- * Removes all elements from an array that the callback returns truey for
- * and returns an array of removed elements. The callback is bound to `thisArg`
- * and invoked with three arguments; (value, index, array).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to modify.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a new array of removed elements.
- * @example
- *
- * var array = [1, 2, 3, 4, 5, 6];
- * var evens = _.remove(array, function(num) { return num % 2 == 0; });
- *
- * console.log(array);
- * // => [1, 3, 5]
- *
- * console.log(evens);
- * // => [2, 4, 6]
- */
- function remove(array, callback, thisArg) {
- var index = -1,
- length = array ? array.length : 0,
- result = [];
-
- callback = lodash.createCallback(callback, thisArg, 3);
- while (++index < length) {
- var value = array[index];
- if (callback(value, index, array)) {
- result.push(value);
- splice.call(array, index--, 1);
- length--;
- }
- }
- return result;
- }
-
- /**
- * The opposite of `_.initial` this method gets all but the first element or
- * first `n` elements of an array. If a callback function is provided elements
- * at the beginning of the array are excluded from the result as long as the
- * callback returns truey. The callback is bound to `thisArg` and invoked
- * with three arguments; (value, index, array).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @alias drop, tail
- * @category Arrays
- * @param {Array} array The array to query.
- * @param {Function|Object|number|string} [callback=1] The function called
- * per element or the number of elements to exclude. If a property name or
- * object is provided it will be used to create a "_.pluck" or "_.where"
- * style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a slice of `array`.
- * @example
- *
- * _.rest([1, 2, 3]);
- * // => [2, 3]
- *
- * _.rest([1, 2, 3], 2);
- * // => [3]
- *
- * _.rest([1, 2, 3], function(num) {
- * return num < 3;
- * });
- * // => [3]
- *
- * var characters = [
- * { 'name': 'barney', 'blocked': true, 'employer': 'slate' },
- * { 'name': 'fred', 'blocked': false, 'employer': 'slate' },
- * { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
- * ];
- *
- * // using "_.pluck" callback shorthand
- * _.pluck(_.rest(characters, 'blocked'), 'name');
- * // => ['fred', 'pebbles']
- *
- * // using "_.where" callback shorthand
- * _.rest(characters, { 'employer': 'slate' });
- * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]
- */
- function rest(array, callback, thisArg) {
- if (typeof callback != 'number' && callback != null) {
- var n = 0,
- index = -1,
- length = array ? array.length : 0;
-
- callback = lodash.createCallback(callback, thisArg, 3);
- while (++index < length && callback(array[index], index, array)) {
- n++;
- }
- } else {
- n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);
- }
- return slice(array, n);
- }
-
- /**
- * Uses a binary search to determine the smallest index at which a value
- * should be inserted into a given sorted array in order to maintain the sort
- * order of the array. If a callback is provided it will be executed for
- * `value` and each element of `array` to compute their sort ranking. The
- * callback is bound to `thisArg` and invoked with one argument; (value).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to inspect.
- * @param {*} value The value to evaluate.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {number} Returns the index at which `value` should be inserted
- * into `array`.
- * @example
- *
- * _.sortedIndex([20, 30, 50], 40);
- * // => 2
- *
- * // using "_.pluck" callback shorthand
- * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');
- * // => 2
- *
- * var dict = {
- * 'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }
- * };
- *
- * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
- * return dict.wordToNumber[word];
- * });
- * // => 2
- *
- * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
- * return this.wordToNumber[word];
- * }, dict);
- * // => 2
- */
- function sortedIndex(array, value, callback, thisArg) {
- var low = 0,
- high = array ? array.length : low;
-
- // explicitly reference `identity` for better inlining in Firefox
- callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;
- value = callback(value);
-
- while (low < high) {
- var mid = (low + high) >>> 1;
- (callback(array[mid]) < value)
- ? low = mid + 1
- : high = mid;
- }
- return low;
- }
-
- /**
- * Creates an array of unique values, in order, of the provided arrays using
- * strict equality for comparisons, i.e. `===`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {...Array} [array] The arrays to inspect.
- * @returns {Array} Returns an array of combined values.
- * @example
- *
- * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);
- * // => [1, 2, 3, 5, 4]
- */
- function union() {
- return baseUniq(baseFlatten(arguments, true, true));
- }
-
- /**
- * Creates a duplicate-value-free version of an array using strict equality
- * for comparisons, i.e. `===`. If the array is sorted, providing
- * `true` for `isSorted` will use a faster algorithm. If a callback is provided
- * each element of `array` is passed through the callback before uniqueness
- * is computed. The callback is bound to `thisArg` and invoked with three
- * arguments; (value, index, array).
- *
- * If a property name is provided for `callback` the created "_.pluck" style
- * callback will return the property value of the given element.
- *
- * If an object is provided for `callback` the created "_.where" style callback
- * will return `true` for elements that have the properties of the given object,
- * else `false`.
- *
- * @static
- * @memberOf _
- * @alias unique
- * @category Arrays
- * @param {Array} array The array to process.
- * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.
- * @param {Function|Object|string} [callback=identity] The function called
- * per iteration. If a property name or object is provided it will be used
- * to create a "_.pluck" or "_.where" style callback, respectively.
- * @param {*} [thisArg] The `this` binding of `callback`.
- * @returns {Array} Returns a duplicate-value-free array.
- * @example
- *
- * _.uniq([1, 2, 1, 3, 1]);
- * // => [1, 2, 3]
- *
- * _.uniq([1, 1, 2, 2, 3], true);
- * // => [1, 2, 3]
- *
- * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });
- * // => ['A', 'b', 'C']
- *
- * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);
- * // => [1, 2.5, 3]
- *
- * // using "_.pluck" callback shorthand
- * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
- * // => [{ 'x': 1 }, { 'x': 2 }]
- */
- function uniq(array, isSorted, callback, thisArg) {
- // juggle arguments
- if (typeof isSorted != 'boolean' && isSorted != null) {
- thisArg = callback;
- callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;
- isSorted = false;
- }
- if (callback != null) {
- callback = lodash.createCallback(callback, thisArg, 3);
- }
- return baseUniq(array, isSorted, callback);
- }
-
- /**
- * Creates an array excluding all provided values using strict equality for
- * comparisons, i.e. `===`.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {Array} array The array to filter.
- * @param {...*} [value] The values to exclude.
- * @returns {Array} Returns a new array of filtered values.
- * @example
- *
- * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
- * // => [2, 3, 4]
- */
- function without(array) {
- return baseDifference(array, slice(arguments, 1));
- }
-
- /**
- * Creates an array that is the symmetric difference of the provided arrays.
- * See http://en.wikipedia.org/wiki/Symmetric_difference.
- *
- * @static
- * @memberOf _
- * @category Arrays
- * @param {...Array} [array] The arrays to inspect.
- * @returns {Array} Returns an array of values.
- * @example
- *
- * _.xor([1, 2, 3], [5, 2, 1, 4]);
- * // => [3, 5, 4]
- *
- * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);
- * // => [1, 4, 5]
- */
- function xor() {
- var index = -1,
- length = arguments.length;
-
- while (++index < length) {
- var array = arguments[index];
- if (isArray(array) || isArguments(array)) {
- var result = result
- ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))
- : array;
- }
- }
- return result || [];
- }
-
- /**
- * Creates an array of grouped elements, the first of which contains the first
- * elements of the given arrays, the second of which contains the second
- * elements of the given arrays, and so on.
- *
- * @static
- * @memberOf _
- * @alias unzip
- * @category Arrays
- * @param {...Array} [array] Arrays to process.
- * @returns {Array} Returns a new array of grouped elements.
- * @example
- *
- * _.zip(['fred', 'barney'], [30, 40], [true, false]);
- * // => [['fred', 30, true], ['barney', 40, false]]
- */
- function zip() {
- var array = arguments.length > 1 ? arguments : arguments[0],
- index = -1,
- length = array ? max(pluck(array, 'length')) : 0,
- result = Array(length < 0 ? 0 : length);
-
- while (++index < length) {
- result[index] = pluck(array, index);
- }
- return result;
- }
-
- /**
- * Creates an object composed from arrays of `keys` and `values`. Provide
- * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`
- * or two arrays, one of `keys` and one of corresponding `values`.
- *
- * @static
- * @memberOf _
- * @alias object
- * @category Arrays
- * @param {Array} keys The array of keys.
- * @param {Array} [values=[]] The array of values.
- * @returns {Object} Returns an object composed of the given keys and
- * corresponding values.
- * @example
- *
- * _.zipObject(['fred', 'barney'], [30, 40]);
- * // => { 'fred': 30, 'barney': 40 }
- */
- function zipObject(keys, values) {
- var index = -1,
- length = keys ? keys.length : 0,
- result = {};
-
- if (!values && length && !isArray(keys[0])) {
- values = [];
- }
- while (++index < length) {
- var key = keys[index];
- if (values) {
- result[key] = values[index];
- } else if (key) {
- result[key[0]] = key[1];
- }
- }
- return result;
- }
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Creates a function that executes `func`, with the `this` binding and
- * arguments of the created function, only after being called `n` times.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {number} n The number of times the function must be called before
- * `func` is executed.
- * @param {Function} func The function to restrict.
- * @returns {Function} Returns the new restricted function.
- * @example
- *
- * var saves = ['profile', 'settings'];
- *
- * var done = _.after(saves.length, function() {
- * console.log('Done saving!');
- * });
- *
- * _.forEach(saves, function(type) {
- * asyncSave({ 'type': type, 'complete': done });
- * });
- * // => logs 'Done saving!', after all saves have completed
- */
- function after(n, func) {
- if (!isFunction(func)) {
- throw new TypeError;
- }
- return function() {
- if (--n < 1) {
- return func.apply(this, arguments);
- }
- };
- }
-
- /**
- * Creates a function that, when called, invokes `func` with the `this`
- * binding of `thisArg` and prepends any additional `bind` arguments to those
- * provided to the bound function.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to bind.
- * @param {*} [thisArg] The `this` binding of `func`.
- * @param {...*} [arg] Arguments to be partially applied.
- * @returns {Function} Returns the new bound function.
- * @example
- *
- * var func = function(greeting) {
- * return greeting + ' ' + this.name;
- * };
- *
- * func = _.bind(func, { 'name': 'fred' }, 'hi');
- * func();
- * // => 'hi fred'
- */
- function bind(func, thisArg) {
- return arguments.length > 2
- ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)
- : createWrapper(func, 1, null, null, thisArg);
- }
-
- /**
- * Binds methods of an object to the object itself, overwriting the existing
- * method. Method names may be specified as individual arguments or as arrays
- * of method names. If no method names are provided all the function properties
- * of `object` will be bound.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Object} object The object to bind and assign the bound methods to.
- * @param {...string} [methodName] The object method names to
- * bind, specified as individual method names or arrays of method names.
- * @returns {Object} Returns `object`.
- * @example
- *
- * var view = {
- * 'label': 'docs',
- * 'onClick': function() { console.log('clicked ' + this.label); }
- * };
- *
- * _.bindAll(view);
- * jQuery('#docs').on('click', view.onClick);
- * // => logs 'clicked docs', when the button is clicked
- */
- function bindAll(object) {
- var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),
- index = -1,
- length = funcs.length;
-
- while (++index < length) {
- var key = funcs[index];
- object[key] = createWrapper(object[key], 1, null, null, object);
- }
- return object;
- }
-
- /**
- * Creates a function that, when called, invokes the method at `object[key]`
- * and prepends any additional `bindKey` arguments to those provided to the bound
- * function. This method differs from `_.bind` by allowing bound functions to
- * reference methods that will be redefined or don't yet exist.
- * See http://michaux.ca/articles/lazy-function-definition-pattern.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Object} object The object the method belongs to.
- * @param {string} key The key of the method.
- * @param {...*} [arg] Arguments to be partially applied.
- * @returns {Function} Returns the new bound function.
- * @example
- *
- * var object = {
- * 'name': 'fred',
- * 'greet': function(greeting) {
- * return greeting + ' ' + this.name;
- * }
- * };
- *
- * var func = _.bindKey(object, 'greet', 'hi');
- * func();
- * // => 'hi fred'
- *
- * object.greet = function(greeting) {
- * return greeting + 'ya ' + this.name + '!';
- * };
- *
- * func();
- * // => 'hiya fred!'
- */
- function bindKey(object, key) {
- return arguments.length > 2
- ? createWrapper(key, 19, slice(arguments, 2), null, object)
- : createWrapper(key, 3, null, null, object);
- }
-
- /**
- * Creates a function that is the composition of the provided functions,
- * where each function consumes the return value of the function that follows.
- * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.
- * Each function is executed with the `this` binding of the composed function.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {...Function} [func] Functions to compose.
- * @returns {Function} Returns the new composed function.
- * @example
- *
- * var realNameMap = {
- * 'pebbles': 'penelope'
- * };
- *
- * var format = function(name) {
- * name = realNameMap[name.toLowerCase()] || name;
- * return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();
- * };
- *
- * var greet = function(formatted) {
- * return 'Hiya ' + formatted + '!';
- * };
- *
- * var welcome = _.compose(greet, format);
- * welcome('pebbles');
- * // => 'Hiya Penelope!'
- */
- function compose() {
- var funcs = arguments,
- length = funcs.length;
-
- while (length--) {
- if (!isFunction(funcs[length])) {
- throw new TypeError;
- }
- }
- return function() {
- var args = arguments,
- length = funcs.length;
-
- while (length--) {
- args = [funcs[length].apply(this, args)];
- }
- return args[0];
- };
- }
-
- /**
- * Creates a function which accepts one or more arguments of `func` that when
- * invoked either executes `func` returning its result, if all `func` arguments
- * have been provided, or returns a function that accepts one or more of the
- * remaining `func` arguments, and so on. The arity of `func` can be specified
- * if `func.length` is not sufficient.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to curry.
- * @param {number} [arity=func.length] The arity of `func`.
- * @returns {Function} Returns the new curried function.
- * @example
- *
- * var curried = _.curry(function(a, b, c) {
- * console.log(a + b + c);
- * });
- *
- * curried(1)(2)(3);
- * // => 6
- *
- * curried(1, 2)(3);
- * // => 6
- *
- * curried(1, 2, 3);
- * // => 6
- */
- function curry(func, arity) {
- arity = typeof arity == 'number' ? arity : (+arity || func.length);
- return createWrapper(func, 4, null, null, null, arity);
- }
-
- /**
- * Creates a function that will delay the execution of `func` until after
- * `wait` milliseconds have elapsed since the last time it was invoked.
- * Provide an options object to indicate that `func` should be invoked on
- * the leading and/or trailing edge of the `wait` timeout. Subsequent calls
- * to the debounced function will return the result of the last `func` call.
- *
- * Note: If `leading` and `trailing` options are `true` `func` will be called
- * on the trailing edge of the timeout only if the the debounced function is
- * invoked more than once during the `wait` timeout.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to debounce.
- * @param {number} wait The number of milliseconds to delay.
- * @param {Object} [options] The options object.
- * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.
- * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.
- * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.
- * @returns {Function} Returns the new debounced function.
- * @example
- *
- * // avoid costly calculations while the window size is in flux
- * var lazyLayout = _.debounce(calculateLayout, 150);
- * jQuery(window).on('resize', lazyLayout);
- *
- * // execute `sendMail` when the click event is fired, debouncing subsequent calls
- * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
- * 'leading': true,
- * 'trailing': false
- * });
- *
- * // ensure `batchLog` is executed once after 1 second of debounced calls
- * var source = new EventSource('/stream');
- * source.addEventListener('message', _.debounce(batchLog, 250, {
- * 'maxWait': 1000
- * }, false);
- */
- function debounce(func, wait, options) {
- var args,
- maxTimeoutId,
- result,
- stamp,
- thisArg,
- timeoutId,
- trailingCall,
- lastCalled = 0,
- maxWait = false,
- trailing = true;
-
- if (!isFunction(func)) {
- throw new TypeError;
- }
- wait = nativeMax(0, wait) || 0;
- if (options === true) {
- var leading = true;
- trailing = false;
- } else if (isObject(options)) {
- leading = options.leading;
- maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);
- trailing = 'trailing' in options ? options.trailing : trailing;
- }
- var delayed = function() {
- var remaining = wait - (now() - stamp);
- if (remaining <= 0) {
- if (maxTimeoutId) {
- clearTimeout(maxTimeoutId);
- }
- var isCalled = trailingCall;
- maxTimeoutId = timeoutId = trailingCall = undefined;
- if (isCalled) {
- lastCalled = now();
- result = func.apply(thisArg, args);
- if (!timeoutId && !maxTimeoutId) {
- args = thisArg = null;
- }
- }
- } else {
- timeoutId = setTimeout(delayed, remaining);
- }
- };
-
- var maxDelayed = function() {
- if (timeoutId) {
- clearTimeout(timeoutId);
- }
- maxTimeoutId = timeoutId = trailingCall = undefined;
- if (trailing || (maxWait !== wait)) {
- lastCalled = now();
- result = func.apply(thisArg, args);
- if (!timeoutId && !maxTimeoutId) {
- args = thisArg = null;
- }
- }
- };
-
- return function() {
- args = arguments;
- stamp = now();
- thisArg = this;
- trailingCall = trailing && (timeoutId || !leading);
-
- if (maxWait === false) {
- var leadingCall = leading && !timeoutId;
- } else {
- if (!maxTimeoutId && !leading) {
- lastCalled = stamp;
- }
- var remaining = maxWait - (stamp - lastCalled),
- isCalled = remaining <= 0;
-
- if (isCalled) {
- if (maxTimeoutId) {
- maxTimeoutId = clearTimeout(maxTimeoutId);
- }
- lastCalled = stamp;
- result = func.apply(thisArg, args);
- }
- else if (!maxTimeoutId) {
- maxTimeoutId = setTimeout(maxDelayed, remaining);
- }
- }
- if (isCalled && timeoutId) {
- timeoutId = clearTimeout(timeoutId);
- }
- else if (!timeoutId && wait !== maxWait) {
- timeoutId = setTimeout(delayed, wait);
- }
- if (leadingCall) {
- isCalled = true;
- result = func.apply(thisArg, args);
- }
- if (isCalled && !timeoutId && !maxTimeoutId) {
- args = thisArg = null;
- }
- return result;
- };
- }
-
- /**
- * Defers executing the `func` function until the current call stack has cleared.
- * Additional arguments will be provided to `func` when it is invoked.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to defer.
- * @param {...*} [arg] Arguments to invoke the function with.
- * @returns {number} Returns the timer id.
- * @example
- *
- * _.defer(function(text) { console.log(text); }, 'deferred');
- * // logs 'deferred' after one or more milliseconds
- */
- function defer(func) {
- if (!isFunction(func)) {
- throw new TypeError;
- }
- var args = slice(arguments, 1);
- return setTimeout(function() { func.apply(undefined, args); }, 1);
- }
-
- /**
- * Executes the `func` function after `wait` milliseconds. Additional arguments
- * will be provided to `func` when it is invoked.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to delay.
- * @param {number} wait The number of milliseconds to delay execution.
- * @param {...*} [arg] Arguments to invoke the function with.
- * @returns {number} Returns the timer id.
- * @example
- *
- * _.delay(function(text) { console.log(text); }, 1000, 'later');
- * // => logs 'later' after one second
- */
- function delay(func, wait) {
- if (!isFunction(func)) {
- throw new TypeError;
- }
- var args = slice(arguments, 2);
- return setTimeout(function() { func.apply(undefined, args); }, wait);
- }
-
- /**
- * Creates a function that memoizes the result of `func`. If `resolver` is
- * provided it will be used to determine the cache key for storing the result
- * based on the arguments provided to the memoized function. By default, the
- * first argument provided to the memoized function is used as the cache key.
- * The `func` is executed with the `this` binding of the memoized function.
- * The result cache is exposed as the `cache` property on the memoized function.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to have its output memoized.
- * @param {Function} [resolver] A function used to resolve the cache key.
- * @returns {Function} Returns the new memoizing function.
- * @example
- *
- * var fibonacci = _.memoize(function(n) {
- * return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
- * });
- *
- * fibonacci(9)
- * // => 34
- *
- * var data = {
- * 'fred': { 'name': 'fred', 'age': 40 },
- * 'pebbles': { 'name': 'pebbles', 'age': 1 }
- * };
- *
- * // modifying the result cache
- * var get = _.memoize(function(name) { return data[name]; }, _.identity);
- * get('pebbles');
- * // => { 'name': 'pebbles', 'age': 1 }
- *
- * get.cache.pebbles.name = 'penelope';
- * get('pebbles');
- * // => { 'name': 'penelope', 'age': 1 }
- */
- function memoize(func, resolver) {
- if (!isFunction(func)) {
- throw new TypeError;
- }
- var memoized = function() {
- var cache = memoized.cache,
- key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];
-
- return hasOwnProperty.call(cache, key)
- ? cache[key]
- : (cache[key] = func.apply(this, arguments));
- }
- memoized.cache = {};
- return memoized;
- }
-
- /**
- * Creates a function that is restricted to execute `func` once. Repeat calls to
- * the function will return the value of the first call. The `func` is executed
- * with the `this` binding of the created function.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to restrict.
- * @returns {Function} Returns the new restricted function.
- * @example
- *
- * var initialize = _.once(createApplication);
- * initialize();
- * initialize();
- * // `initialize` executes `createApplication` once
- */
- function once(func) {
- var ran,
- result;
-
- if (!isFunction(func)) {
- throw new TypeError;
- }
- return function() {
- if (ran) {
- return result;
- }
- ran = true;
- result = func.apply(this, arguments);
-
- // clear the `func` variable so the function may be garbage collected
- func = null;
- return result;
- };
- }
-
- /**
- * Creates a function that, when called, invokes `func` with any additional
- * `partial` arguments prepended to those provided to the new function. This
- * method is similar to `_.bind` except it does **not** alter the `this` binding.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to partially apply arguments to.
- * @param {...*} [arg] Arguments to be partially applied.
- * @returns {Function} Returns the new partially applied function.
- * @example
- *
- * var greet = function(greeting, name) { return greeting + ' ' + name; };
- * var hi = _.partial(greet, 'hi');
- * hi('fred');
- * // => 'hi fred'
- */
- function partial(func) {
- return createWrapper(func, 16, slice(arguments, 1));
- }
-
- /**
- * This method is like `_.partial` except that `partial` arguments are
- * appended to those provided to the new function.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to partially apply arguments to.
- * @param {...*} [arg] Arguments to be partially applied.
- * @returns {Function} Returns the new partially applied function.
- * @example
- *
- * var defaultsDeep = _.partialRight(_.merge, _.defaults);
- *
- * var options = {
- * 'variable': 'data',
- * 'imports': { 'jq': $ }
- * };
- *
- * defaultsDeep(options, _.templateSettings);
- *
- * options.variable
- * // => 'data'
- *
- * options.imports
- * // => { '_': _, 'jq': $ }
- */
- function partialRight(func) {
- return createWrapper(func, 32, null, slice(arguments, 1));
- }
-
- /**
- * Creates a function that, when executed, will only call the `func` function
- * at most once per every `wait` milliseconds. Provide an options object to
- * indicate that `func` should be invoked on the leading and/or trailing edge
- * of the `wait` timeout. Subsequent calls to the throttled function will
- * return the result of the last `func` call.
- *
- * Note: If `leading` and `trailing` options are `true` `func` will be called
- * on the trailing edge of the timeout only if the the throttled function is
- * invoked more than once during the `wait` timeout.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {Function} func The function to throttle.
- * @param {number} wait The number of milliseconds to throttle executions to.
- * @param {Object} [options] The options object.
- * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.
- * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.
- * @returns {Function} Returns the new throttled function.
- * @example
- *
- * // avoid excessively updating the position while scrolling
- * var throttled = _.throttle(updatePosition, 100);
- * jQuery(window).on('scroll', throttled);
- *
- * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes
- * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
- * 'trailing': false
- * }));
- */
- function throttle(func, wait, options) {
- var leading = true,
- trailing = true;
-
- if (!isFunction(func)) {
- throw new TypeError;
- }
- if (options === false) {
- leading = false;
- } else if (isObject(options)) {
- leading = 'leading' in options ? options.leading : leading;
- trailing = 'trailing' in options ? options.trailing : trailing;
- }
- debounceOptions.leading = leading;
- debounceOptions.maxWait = wait;
- debounceOptions.trailing = trailing;
-
- return debounce(func, wait, debounceOptions);
- }
-
- /**
- * Creates a function that provides `value` to the wrapper function as its
- * first argument. Additional arguments provided to the function are appended
- * to those provided to the wrapper function. The wrapper is executed with
- * the `this` binding of the created function.
- *
- * @static
- * @memberOf _
- * @category Functions
- * @param {*} value The value to wrap.
- * @param {Function} wrapper The wrapper function.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var p = _.wrap(_.escape, function(func, text) {
- * return '' + func(text) + '
';
- * });
- *
- * p('Fred, Wilma, & Pebbles');
- * // => 'Fred, Wilma, & Pebbles
'
- */
- function wrap(value, wrapper) {
- return createWrapper(wrapper, 16, [value]);
- }
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Creates a function that returns `value`.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {*} value The value to return from the new function.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var object = { 'name': 'fred' };
- * var getter = _.constant(object);
- * getter() === object;
- * // => true
- */
- function constant(value) {
- return function() {
- return value;
- };
- }
-
- /**
- * Produces a callback bound to an optional `thisArg`. If `func` is a property
- * name the created callback will return the property value for a given element.
- * If `func` is an object the created callback will return `true` for elements
- * that contain the equivalent object properties, otherwise it will return `false`.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {*} [func=identity] The value to convert to a callback.
- * @param {*} [thisArg] The `this` binding of the created callback.
- * @param {number} [argCount] The number of arguments the callback accepts.
- * @returns {Function} Returns a callback function.
- * @example
- *
- * var characters = [
- * { 'name': 'barney', 'age': 36 },
- * { 'name': 'fred', 'age': 40 }
- * ];
- *
- * // wrap to create custom callback shorthands
- * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {
- * var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);
- * return !match ? func(callback, thisArg) : function(object) {
- * return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];
- * };
- * });
- *
- * _.filter(characters, 'age__gt38');
- * // => [{ 'name': 'fred', 'age': 40 }]
- */
- function createCallback(func, thisArg, argCount) {
- var type = typeof func;
- if (func == null || type == 'function') {
- return baseCreateCallback(func, thisArg, argCount);
- }
- // handle "_.pluck" style callback shorthands
- if (type != 'object') {
- return property(func);
- }
- var props = keys(func),
- key = props[0],
- a = func[key];
-
- // handle "_.where" style callback shorthands
- if (props.length == 1 && a === a && !isObject(a)) {
- // fast path the common case of providing an object with a single
- // property containing a primitive value
- return function(object) {
- var b = object[key];
- return a === b && (a !== 0 || (1 / a == 1 / b));
- };
- }
- return function(object) {
- var length = props.length,
- result = false;
-
- while (length--) {
- if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {
- break;
- }
- }
- return result;
- };
- }
-
- /**
- * Converts the characters `&`, `<`, `>`, `"`, and `'` in `string` to their
- * corresponding HTML entities.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {string} string The string to escape.
- * @returns {string} Returns the escaped string.
- * @example
- *
- * _.escape('Fred, Wilma, & Pebbles');
- * // => 'Fred, Wilma, & Pebbles'
- */
- function escape(string) {
- return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);
- }
-
- /**
- * This method returns the first argument provided to it.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {*} value Any value.
- * @returns {*} Returns `value`.
- * @example
- *
- * var object = { 'name': 'fred' };
- * _.identity(object) === object;
- * // => true
- */
- function identity(value) {
- return value;
- }
-
- /**
- * Adds function properties of a source object to the destination object.
- * If `object` is a function methods will be added to its prototype as well.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {Function|Object} [object=lodash] object The destination object.
- * @param {Object} source The object of functions to add.
- * @param {Object} [options] The options object.
- * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.
- * @example
- *
- * function capitalize(string) {
- * return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
- * }
- *
- * _.mixin({ 'capitalize': capitalize });
- * _.capitalize('fred');
- * // => 'Fred'
- *
- * _('fred').capitalize().value();
- * // => 'Fred'
- *
- * _.mixin({ 'capitalize': capitalize }, { 'chain': false });
- * _('fred').capitalize();
- * // => 'Fred'
- */
- function mixin(object, source, options) {
- var chain = true,
- methodNames = source && functions(source);
-
- if (!source || (!options && !methodNames.length)) {
- if (options == null) {
- options = source;
- }
- ctor = lodashWrapper;
- source = object;
- object = lodash;
- methodNames = functions(source);
- }
- if (options === false) {
- chain = false;
- } else if (isObject(options) && 'chain' in options) {
- chain = options.chain;
- }
- var ctor = object,
- isFunc = isFunction(ctor);
-
- forEach(methodNames, function(methodName) {
- var func = object[methodName] = source[methodName];
- if (isFunc) {
- ctor.prototype[methodName] = function() {
- var chainAll = this.__chain__,
- value = this.__wrapped__,
- args = [value];
-
- push.apply(args, arguments);
- var result = func.apply(object, args);
- if (chain || chainAll) {
- if (value === result && isObject(result)) {
- return this;
- }
- result = new ctor(result);
- result.__chain__ = chainAll;
- }
- return result;
- };
- }
- });
- }
-
- /**
- * Reverts the '_' variable to its previous value and returns a reference to
- * the `lodash` function.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @returns {Function} Returns the `lodash` function.
- * @example
- *
- * var lodash = _.noConflict();
- */
- function noConflict() {
- context._ = oldDash;
- return this;
- }
-
- /**
- * A no-operation function.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @example
- *
- * var object = { 'name': 'fred' };
- * _.noop(object) === undefined;
- * // => true
- */
- function noop() {
- // no operation performed
- }
-
- /**
- * Gets the number of milliseconds that have elapsed since the Unix epoch
- * (1 January 1970 00:00:00 UTC).
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @example
- *
- * var stamp = _.now();
- * _.defer(function() { console.log(_.now() - stamp); });
- * // => logs the number of milliseconds it took for the deferred function to be called
- */
- var now = isNative(now = Date.now) && now || function() {
- return new Date().getTime();
- };
-
- /**
- * Converts the given value into an integer of the specified radix.
- * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the
- * `value` is a hexadecimal, in which case a `radix` of `16` is used.
- *
- * Note: This method avoids differences in native ES3 and ES5 `parseInt`
- * implementations. See http://es5.github.io/#E.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {string} value The value to parse.
- * @param {number} [radix] The radix used to interpret the value to parse.
- * @returns {number} Returns the new integer value.
- * @example
- *
- * _.parseInt('08');
- * // => 8
- */
- var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {
- // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`
- return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);
- };
-
- /**
- * Creates a "_.pluck" style function, which returns the `key` value of a
- * given object.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {string} key The name of the property to retrieve.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var characters = [
- * { 'name': 'fred', 'age': 40 },
- * { 'name': 'barney', 'age': 36 }
- * ];
- *
- * var getName = _.property('name');
- *
- * _.map(characters, getName);
- * // => ['barney', 'fred']
- *
- * _.sortBy(characters, getName);
- * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }]
- */
- function property(key) {
- return function(object) {
- return object[key];
- };
- }
-
- /**
- * Produces a random number between `min` and `max` (inclusive). If only one
- * argument is provided a number between `0` and the given number will be
- * returned. If `floating` is truey or either `min` or `max` are floats a
- * floating-point number will be returned instead of an integer.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {number} [min=0] The minimum possible value.
- * @param {number} [max=1] The maximum possible value.
- * @param {boolean} [floating=false] Specify returning a floating-point number.
- * @returns {number} Returns a random number.
- * @example
- *
- * _.random(0, 5);
- * // => an integer between 0 and 5
- *
- * _.random(5);
- * // => also an integer between 0 and 5
- *
- * _.random(5, true);
- * // => a floating-point number between 0 and 5
- *
- * _.random(1.2, 5.2);
- * // => a floating-point number between 1.2 and 5.2
- */
- function random(min, max, floating) {
- var noMin = min == null,
- noMax = max == null;
-
- if (floating == null) {
- if (typeof min == 'boolean' && noMax) {
- floating = min;
- min = 1;
- }
- else if (!noMax && typeof max == 'boolean') {
- floating = max;
- noMax = true;
- }
- }
- if (noMin && noMax) {
- max = 1;
- }
- min = +min || 0;
- if (noMax) {
- max = min;
- min = 0;
- } else {
- max = +max || 0;
- }
- if (floating || min % 1 || max % 1) {
- var rand = nativeRandom();
- return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);
- }
- return baseRandom(min, max);
- }
-
- /**
- * Resolves the value of property `key` on `object`. If `key` is a function
- * it will be invoked with the `this` binding of `object` and its result returned,
- * else the property value is returned. If `object` is falsey then `undefined`
- * is returned.
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {Object} object The object to inspect.
- * @param {string} key The name of the property to resolve.
- * @returns {*} Returns the resolved value.
- * @example
- *
- * var object = {
- * 'cheese': 'crumpets',
- * 'stuff': function() {
- * return 'nonsense';
- * }
- * };
- *
- * _.result(object, 'cheese');
- * // => 'crumpets'
- *
- * _.result(object, 'stuff');
- * // => 'nonsense'
- */
- function result(object, key) {
- if (object) {
- var value = object[key];
- return isFunction(value) ? object[key]() : value;
- }
- }
-
- /**
- * A micro-templating method that handles arbitrary delimiters, preserves
- * whitespace, and correctly escapes quotes within interpolated code.
- *
- * Note: In the development build, `_.template` utilizes sourceURLs for easier
- * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl
- *
- * For more information on precompiling templates see:
- * http://lodash.com/custom-builds
- *
- * For more information on Chrome extension sandboxes see:
- * http://developer.chrome.com/stable/extensions/sandboxingEval.html
- *
- * @static
- * @memberOf _
- * @category Utilities
- * @param {string} text The template text.
- * @param {Object} data The data object used to populate the text.
- * @param {Object} [options] The options object.
- * @param {RegExp} [options.escape] The "escape" delimiter.
- * @param {RegExp} [options.evaluate] The "evaluate" delimiter.
- * @param {Object} [options.imports] An object to import into the template as local variables.
- * @param {RegExp} [options.interpolate] The "interpolate" delimiter.
- * @param {string} [sourceURL] The sourceURL of the template's compiled source.
- * @param {string} [variable] The data object variable name.
- * @returns {Function|string} Returns a compiled function when no `data` object
- * is given, else it returns the interpolated text.
- * @example
- *
- * // using the "interpolate" delimiter to create a compiled template
- * var compiled = _.template('hello <%= name %>');
- * compiled({ 'name': 'fred' });
- * // => 'hello fred'
- *
- * // using the "escape" delimiter to escape HTML in data property values
- * _.template('<%- value %>', { 'value': '\n```\n\nUsing [`npm`](http://npmjs.org/):\n\n```bash\nnpm i --save lodash\n\n{sudo} npm i -g lodash\nnpm ln lodash\n```\n\nIn [Node.js](http://nodejs.org/) & [Ringo](http://ringojs.org/):\n\n```js\nvar _ = require('lodash');\n// or as Underscore\nvar _ = require('lodash/dist/lodash.underscore');\n```\n\n**Notes:**\n * Don’t assign values to [special variable](http://nodejs.org/api/repl.html#repl_repl_features) `_` when in the REPL\n * If Lo-Dash is installed globally, run [`npm ln lodash`](http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/) in your project’s root directory *before* requiring it\n\nIn [Rhino](http://www.mozilla.org/rhino/):\n\n```js\nload('lodash.js');\n```\n\nIn an AMD loader:\n\n```js\nrequire({\n 'packages': [\n { 'name': 'lodash', 'location': 'path/to/lodash', 'main': 'lodash' }\n ]\n},\n['lodash'], function(_) {\n console.log(_.VERSION);\n});\n```\n\n## Author\n\n| [![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](https://twitter.com/jdalton \"Follow @jdalton on Twitter\") |\n|---|\n| [John-David Dalton](http://allyoucanleet.com/) |\n\n## Contributors\n\n| [![twitter/blainebublitz](http://gravatar.com/avatar/ac1c67fd906c9fecd823ce302283b4c1?s=70)](https://twitter.com/blainebublitz \"Follow @BlaineBublitz on Twitter\") | [![twitter/kitcambridge](http://gravatar.com/avatar/6662a1d02f351b5ef2f8b4d815804661?s=70)](https://twitter.com/kitcambridge \"Follow @kitcambridge on Twitter\") | [![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias \"Follow @mathias on Twitter\") |\n|---|---|---|\n| [Blaine Bublitz](http://www.iceddev.com/) | [Kit Cambridge](http://kitcambridge.be/) | [Mathias Bynens](http://mathiasbynens.be/) |\n\n[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/lodash/lodash/trend.png)](https://bitdeli.com/free \"Bitdeli Badge\")\n",
- "readmeFilename": "README.md",
- "_id": "lodash@2.4.1",
- "_from": "lodash@~2.4.1"
-}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/.npmignore b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/.npmignore
deleted file mode 100644
index 1eba800f80f..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/.npmignore
+++ /dev/null
@@ -1,11 +0,0 @@
-npm-debug.log
-node_modules
-.*.swp
-.lock-*
-build
-
-bench
-doc
-examples
-test
-
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/.travis.yml b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/.travis.yml
deleted file mode 100644
index 973586683f5..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: node_js
-npm_args: --ws:native
-node_js:
- - "0.8"
- - "0.10"
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/History.md b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/History.md
deleted file mode 100644
index 63cf0ea6a95..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/History.md
+++ /dev/null
@@ -1,312 +0,0 @@
-v0.4.31 - September 23th, 2013
-=====================
-
-* Component support
-
-v0.4.30 - August 30th, 2013
-=====================
-
-* BufferedAmount could be undefined, default to 0 [TooTallNate]
-* Support protocols as second argument and options as third [TooTallNate]
-* Proper browserify shim [mcollina]
-* Broadcasting example in README [stefanocudini]
-
-v0.4.29 - August 23th, 2013
-=====================
-* Small clean up of the Node 0.11 support by using NAN from the NPM registry [kkoopa]
-* Support for custom `Agent`'s through the options. [gramakri] & [TooTallNate]
-* Support for custom headers through the options [3rd-Eden]
-* Added a `gypfile` flag to the package.json for compiled module discovery [wolfeidau]
-
-v0.4.28 - August 16th, 2013
-=====================
-* Node 0.11 support. [kkoopa]
-* Authorization headers are sent when basic auth is used in the url [jcrugzz]
-* Origin header will now include the port number [Jason Plum]
-* Race condition fixed where data was received before the readyState was updated. [saschagehlich]
-
-v0.4.27 - June 27th, 2013
-=====================
-* Frames are no longer masked in `wscat`. [slaskis]
-* Don't retrain reference to large slab buffers. [jmatthewsr-msi]
-* Don't use Buffer.byteLength for ArrayBuffer's. [Anthony Pesch]
-* Fix browser field in package.json. [shtylman]
-* Client-side certificate support & documentation improvements. [Lukas Berns]
-* WebSocket readyState's is added to the prototype for spec compatiblity. [BallBearing]
-* Use Object.defineProperty. [arlolra]
-* Autodetect ArrayBuffers as binary when sending. [BallBearing]
-* Check instanceof Buffer for binary data. [arlolra]
-* Emit the close event before destroying the internal socket. [3rd-Eden]
-* Don't setup multiply timeouts for one connection. [AndreasMadsen]
-* Allow support for binding to ethereal port. [wpreul]
-* Fix broken terminate reference. [3rd-Eden]
-* Misc node 0.10 test fixes and documentation improvements. [3rd-Eden]
-* Ensure ssl options are propagated to request. [einaros]
-* Add 'Host' and 'Origin' to request header. [Lars-Magnus Skog]
-* Subprotocol support. [kanaka]
-* Honor ArrayBufferView's byteOffset when sending. [Anthony Pesch]
-* Added target attribute for events. [arlolra]
-
-v0.4.26 - Skipped
-=====================
-
-v0.4.25 - December 17th, 2012
-=====================
-* Removed install.js. [shtylman]
-* Added browser field to package.json. [shtylman]
-* Support overwriting host header. [Raynos]
-* Emit 'listening' also with custom http server. [sebiq]
-
-v0.4.24 - December 6th, 2012
-=====================
-* Yet another intermediate release, to not delay minor features any longer.
-* Native support installation issues further circumvented. [einaros]
-
-v0.4.23 - November 19th, 2012
-=====================
-* Service release - last before major upgrade.
-* Changes default host from 127.0.0.1 to 0.0.0.0. [einaros]
-
-v0.4.22 - October 3rd, 2012
-=====================
-* clear failsafe cleanup timeout once cleanup is called [AndreasMadsen]
-* added w3c compatible CloseEvent for onclose / addEventListener("close", ...). [einaros]
-* fix the sub protocol header handler [sonnyp]
-* fix unhandled exception if socket closes and 'error' is emitted [jmatthewsr-ms]
-
-v0.4.21 - July 14th, 2012
-=====================
-* Emit error if server reponds with anything other than status code 101. [einaros]
-* Added 'headers' event to server. [rauchg]
-* path.exists moved to fs.exists. [blakmatrix]
-
-v0.4.20 - June 26th, 2012
-=====================
-* node v0.8.0 compatibility release.
-
-v0.4.19 - June 19th, 2012
-=====================
-* Change sender to merge buffers for relatively small payloads, may improve perf in some cases [einaros]
-* Avoid EventEmitter for Receiver classes. As above this may improve perf. [einaros]
-* Renamed fallback files from the somewhat misleading '*Windows'. [einaros]
-
-v0.4.18 - June 14th 2012
-=====================
-* Fixed incorrect md5 digest encoding in Hixie handshake [nicokaiser]
-* Added example of use with Express 3 [einaros]
-* Change installation procedure to not require --ws:native to build native extensions. They will now build if a compiler is available. [einaros]
-
-v0.4.17 - June 13th 2012
-=====================
-* Improve error handling during connection handshaking [einaros]
-* Ensure that errors are caught also after connection teardown [nicokaiser]
-* Update 'mocha' version to 1.1.0. [einaros]
-* Stop showing 'undefined' for some error logs. [tricknotes]
-* Update 'should' version to 0.6.3 [tricknotes]
-
-v0.4.16 - June 1st 2012
-=====================
-* Build fix for Windows. [einaros]
-
-v0.4.15 - May 20th 2012
-=====================
-* Enable fauxe streaming for hixie tansport. [einaros]
-* Allow hixie sender to deal with buffers. [einaros/pigne]
-* Allow error code 1011. [einaros]
-* Fix framing for empty packets (empty pings and pongs might break). [einaros]
-* Improve error and close handling, to avoid connections lingering in CLOSING state. [einaros]
-
-v0.4.14 - Apr 30th 2012
-=====================
-* use node-gyp instead of node-waf [TooTallNate]
-* remove old windows compatibility makefile, and silently fall back to native modules [einaros]
-* ensure connection status [nicokaiser]
-* websocket client updated to use port 443 by default for wss:// connections [einaros]
-* support unix sockets [kschzt]
-
-v0.4.13 - Apr 12th 2012
-=====================
-
-* circumvent node 0.6+ related memory leak caused by Object.defineProperty [nicokaiser]
-* improved error handling, improving stability in massive load use cases [nicokaiser]
-
-v0.4.12 - Mar 30th 2012
-=====================
-
-* various memory leak / possible memory leak cleanups [einaros]
-* api documentation [nicokaiser]
-* add option to disable client tracking [nicokaiser]
-
-v0.4.11 - Mar 24th 2012
-=====================
-
-* node v0.7 compatibillity release
-* gyp support [TooTallNate]
-* commander dependency update [jwueller]
-* loadbalancer support [nicokaiser]
-
-v0.4.10 - Mar 22th 2012
-=====================
-
-* Final hixie close frame fixes. [nicokaiser]
-
-v0.4.9 - Mar 21st 2012
-=====================
-
-* Various hixie bugfixes (such as proper close frame handling). [einaros]
-
-v0.4.8 - Feb 29th 2012
-=====================
-
-* Allow verifyClient to run asynchronously [karlsequin]
-* Various bugfixes and cleanups. [einaros]
-
-v0.4.7 - Feb 21st 2012
-=====================
-
-* Exposed bytesReceived from websocket client object, which makes it possible to implement bandwidth sampling. [einaros]
-* Updated browser based file upload example to include and output per websocket channel bandwidth sampling. [einaros]
-* Changed build scripts to check which architecture is currently in use. Required after the node.js changes to have prebuilt packages target ia32 by default. [einaros]
-
-v0.4.6 - Feb 9th 2012
-=====================
-
-* Added browser based file upload example. [einaros]
-* Added server-to-browser status push example. [einaros]
-* Exposed pause() and resume() on WebSocket object, to enable client stream shaping. [einaros]
-
-v0.4.5 - Feb 7th 2012
-=====================
-
-* Corrected regression bug in handling of connections with the initial frame delivered across both http upgrade head and a standalone packet. This would lead to a race condition, which in some cases could cause message corruption. [einaros]
-
-v0.4.4 - Feb 6th 2012
-=====================
-
-* Pass original request object to verifyClient, for cookie or authentication verifications. [einaros]
-* Implemented addEventListener and slightly improved the emulation API by adding a MessageEvent with a readonly data attribute. [aslakhellesoy]
-* Rewrite parts of hybi receiver to avoid stack overflows for large amounts of packets bundled in the same buffer / packet. [einaros]
-
-v0.4.3 - Feb 4th 2012
-=====================
-
-* Prioritized update: Corrected issue which would cause sockets to stay open longer than necessary, and resource leakage because of this. [einaros]
-
-v0.4.2 - Feb 4th 2012
-=====================
-
-* Breaking change: WebSocketServer's verifyOrigin option has been renamed to verifyClient. [einaros]
-* verifyClient now receives { origin: 'origin header', secure: true/false }, where 'secure' will be true for ssl connections. [einaros]
-* Split benchmark, in preparation for more thorough case. [einaros]
-* Introduced hixie-76 draft support for server, since Safari (iPhone / iPad / OS X) and Opera still aren't updated to use Hybi. [einaros]
-* Expose 'supports' object from WebSocket, to indicate e.g. the underlying transport's support for binary data. [einaros]
-* Test and code cleanups. [einaros]
-
-v0.4.1 - Jan 25th 2012
-=====================
-
-* Use readline in wscat [tricknotes]
-* Refactor _state away, in favor of the new _readyState [tricknotes]
-* travis-ci integration [einaros]
-* Fixed race condition in testsuite, causing a few tests to fail (without actually indicating errors) on travis [einaros]
-* Expose pong event [paddybyers]
-* Enabled running of WebSocketServer in noServer-mode, meaning that upgrades are passed in manually. [einaros]
-* Reworked connection procedure for WebSocketServer, and cleaned up tests. [einaros]
-
-v0.4.0 - Jan 2nd 2012
-=====================
-
-* Windows compatibility [einaros]
-* Windows compatible test script [einaros]
-
-v0.3.9 - Jan 1st 2012
-======================
-
-* Improved protocol framing performance [einaros]
-* WSS support [kazuyukitanimura]
-* WSS tests [einaros]
-* readyState exposed [justinlatimer, tricknotes]
-* url property exposed [justinlatimer]
-* Removed old 'state' property [einaros]
-* Test cleanups [einaros]
-
-v0.3.8 - Dec 27th 2011
-======================
-
-* Made it possible to listen on specific paths, which is especially good to have for precreated http servers [einaros]
-* Extensive WebSocket / WebSocketServer cleanup, including changing all internal properties to unconfigurable, unenumerable properties [einaros]
-* Receiver modifications to ensure even better performance with fragmented sends [einaros]
-* Fixed issue in sender.js, which would cause SlowBuffer instances (such as returned from the crypto library's randomBytes) to be copied (and thus be dead slow) [einaros]
-* Removed redundant buffer copy in sender.js, which should improve server performance [einaros]
-
-v0.3.7 - Dec 25nd 2011
-======================
-
-* Added a browser based API which uses EventEmitters internally [3rd-Eden]
-* Expose request information from upgrade event for websocket server clients [mmalecki]
-
-v0.3.6 - Dec 19th 2011
-======================
-
-* Added option to let WebSocket.Server use an already existing http server [mmalecki]
-* Migrating various option structures to use options.js module [einaros]
-* Added a few more tests, options and handshake verifications to ensure that faulty connections are dealt with [einaros]
-* Code cleanups in Sender and Receiver, to ensure even faster parsing [einaros]
-
-v0.3.5 - Dec 13th 2011
-======================
-
-* Optimized Sender.js, Receiver.js and bufferutil.cc:
- * Apply loop-unrolling-like small block copies rather than use node.js Buffer#copy() (which is slow).
- * Mask blocks of data using combination of 32bit xor and loop-unrolling, instead of single bytes.
- * Keep pre-made send buffer for small transfers.
-* Leak fixes and code cleanups.
-
-v0.3.3 - Dec 12th 2011
-======================
-
-* Compile fix for Linux.
-* Rewrote parts of WebSocket.js, to avoid try/catch and thus avoid optimizer bailouts.
-
-v0.3.2 - Dec 11th 2011
-======================
-
-* Further performance updates, including the additions of a native BufferUtil module, which deals with several of the cpu intensive WebSocket operations.
-
-v0.3.1 - Dec 8th 2011
-======================
-
-* Service release, fixing broken tests.
-
-v0.3.0 - Dec 8th 2011
-======================
-
-* Node.js v0.4.x compatibility.
-* Code cleanups and efficiency improvements.
-* WebSocket server added, although this will still mainly be a client library.
-* WebSocket server certified to pass the Autobahn test suite.
-* Protocol improvements and corrections - such as handling (redundant) masks for empty fragments.
-* 'wscat' command line utility added, which can act as either client or server.
-
-v0.2.6 - Dec 3rd 2011
-======================
-
-* Renamed to 'ws'. Big woop, right -- but easy-websocket really just doesn't cut it anymore!
-
-v0.2.5 - Dec 3rd 2011
-======================
-
- * Rewrote much of the WebSocket parser, to ensure high speed for highly fragmented messages.
- * Added a BufferPool, as a start to more efficiently deal with allocations for WebSocket connections. More work to come, in that area.
- * Updated the Autobahn report, at http://einaros.github.com/easy-websocket, with comparisons against WebSocket-Node 1.0.2 and Chrome 16.
-
-v0.2.0 - Nov 25th 2011
-======================
-
- * Major rework to make sure all the Autobahn test cases pass. Also updated the internal tests to cover more corner cases.
-
-v0.1.2 - Nov 14th 2011
-======================
-
- * Back and forth, back and forth: now settled on keeping the api (event names, methods) closer to the websocket browser api. This will stick now.
- * Started keeping this history record. Better late than never, right?
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/Makefile b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/Makefile
deleted file mode 100644
index 151aa2ba535..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/Makefile
+++ /dev/null
@@ -1,40 +0,0 @@
-ALL_TESTS = $(shell find test/ -name '*.test.js')
-ALL_INTEGRATION = $(shell find test/ -name '*.integration.js')
-
-all:
- node-gyp configure build
-
-clean:
- node-gyp clean
-
-run-tests:
- @./node_modules/.bin/mocha \
- -t 2000 \
- -s 2400 \
- $(TESTFLAGS) \
- $(TESTS)
-
-run-integrationtests:
- @./node_modules/.bin/mocha \
- -t 5000 \
- -s 6000 \
- $(TESTFLAGS) \
- $(TESTS)
-
-test:
- @$(MAKE) NODE_TLS_REJECT_UNAUTHORIZED=0 NODE_PATH=lib TESTS="$(ALL_TESTS)" run-tests
-
-integrationtest:
- @$(MAKE) NODE_TLS_REJECT_UNAUTHORIZED=0 NODE_PATH=lib TESTS="$(ALL_INTEGRATION)" run-integrationtests
-
-benchmark:
- @node bench/sender.benchmark.js
- @node bench/parser.benchmark.js
-
-autobahn:
- @NODE_PATH=lib node test/autobahn.js
-
-autobahn-server:
- @NODE_PATH=lib node test/autobahn-server.js
-
-.PHONY: test
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/README.md b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/README.md
deleted file mode 100644
index cf1f1fb885a..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/README.md
+++ /dev/null
@@ -1,171 +0,0 @@
-[![Build Status](https://secure.travis-ci.org/einaros/ws.png)](http://travis-ci.org/einaros/ws)
-
-# ws: a node.js websocket library #
-
-`ws` is a simple to use websocket implementation, up-to-date against RFC-6455, and [probably the fastest WebSocket library for node.js](http://web.archive.org/web/20130314230536/http://hobbycoding.posterous.com/the-fastest-websocket-module-for-nodejs).
-
-Passes the quite extensive Autobahn test suite. See http://einaros.github.com/ws for the full reports.
-
-Comes with a command line utility, `wscat`, which can either act as a server (--listen), or client (--connect); Use it to debug simple websocket services.
-
-## Protocol support ##
-
-* **Hixie draft 76** (Old and deprecated, but still in use by Safari and Opera. Added to ws version 0.4.2, but server only. Can be disabled by setting the `disableHixie` option to true.)
-* **HyBi drafts 07-12** (Use the option `protocolVersion: 8`, or argument `-p 8` for wscat)
-* **HyBi drafts 13-17** (Current default, alternatively option `protocolVersion: 13`, or argument `-p 13` for wscat)
-
-_See the echo.websocket.org example below for how to use the `protocolVersion` option._
-
-## Usage ##
-
-### Installing ###
-
-`npm install ws`
-
-### Sending and receiving text data ###
-
-```js
-var WebSocket = require('ws');
-var ws = new WebSocket('ws://www.host.com/path');
-ws.on('open', function() {
- ws.send('something');
-});
-ws.on('message', function(data, flags) {
- // flags.binary will be set if a binary data is received
- // flags.masked will be set if the data was masked
-});
-```
-
-### Sending binary data ###
-
-```js
-var WebSocket = require('ws');
-var ws = new WebSocket('ws://www.host.com/path');
-ws.on('open', function() {
- var array = new Float32Array(5);
- for (var i = 0; i < array.length; ++i) array[i] = i / 2;
- ws.send(array, {binary: true, mask: true});
-});
-```
-
-Setting `mask`, as done for the send options above, will cause the data to be masked according to the websocket protocol. The same option applies for text data.
-
-### Server example ###
-
-```js
-var WebSocketServer = require('ws').Server
- , wss = new WebSocketServer({port: 8080});
-wss.on('connection', function(ws) {
- ws.on('message', function(message) {
- console.log('received: %s', message);
- });
- ws.send('something');
-});
-```
-
-### Server sending broadcast data ###
-
-```js
-var WebSocketServer = require('ws').Server
- , wss = new WebSocketServer({port: 8080});
-
-wss.broadcast = function(data) {
- for(var i in this.clients)
- this.clients[i].send(data);
-};
-```
-
-### Error handling best practices ###
-
-```js
-// If the WebSocket is closed before the following send is attempted
-ws.send('something');
-
-// Errors (both immediate and async write errors) can be detected in an optional callback.
-// The callback is also the only way of being notified that data has actually been sent.
-ws.send('something', function(error) {
- // if error is null, the send has been completed,
- // otherwise the error object will indicate what failed.
-});
-
-// Immediate errors can also be handled with try/catch-blocks, but **note**
-// that since sends are inherently asynchronous, socket write failures will *not*
-// be captured when this technique is used.
-try {
- ws.send('something');
-}
-catch (e) {
- // handle error
-}
-```
-
-### echo.websocket.org demo ###
-
-```js
-var WebSocket = require('ws');
-var ws = new WebSocket('ws://echo.websocket.org/', {protocolVersion: 8, origin: 'http://websocket.org'});
-ws.on('open', function() {
- console.log('connected');
- ws.send(Date.now().toString(), {mask: true});
-});
-ws.on('close', function() {
- console.log('disconnected');
-});
-ws.on('message', function(data, flags) {
- console.log('Roundtrip time: ' + (Date.now() - parseInt(data)) + 'ms', flags);
- setTimeout(function() {
- ws.send(Date.now().toString(), {mask: true});
- }, 500);
-});
-```
-
-### wscat against echo.websocket.org ###
-
- $ npm install -g ws
- $ wscat -c ws://echo.websocket.org
- connected (press CTRL+C to quit)
- > hi there
- < hi there
- > are you a happy parrot?
- < are you a happy parrot?
-
-### Other examples ###
-
-For a full example with a browser client communicating with a ws server, see the examples folder.
-
-Note that the usage together with Express 3.0 is quite different from Express 2.x. The difference is expressed in the two different serverstats-examples.
-
-Otherwise, see the test cases.
-
-### Running the tests ###
-
-`make test`
-
-## API Docs ##
-
-See the doc/ directory for Node.js-like docs for the ws classes.
-
-## License ##
-
-(The MIT License)
-
-Copyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/bin/wscat b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/bin/wscat
deleted file mode 100644
index 7c66600de29..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/bin/wscat
+++ /dev/null
@@ -1,222 +0,0 @@
-#!/usr/bin/env node
-
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var WebSocket = require('../')
- , fs = require('fs')
- , program = require('commander')
- , util = require('util')
- , events = require('events')
- , readline = require('readline');
-
-/**
- * InputReader - processes console input
- */
-
-function Console() {
- this.stdin = process.stdin;
- this.stdout = process.stdout;
-
- this.readlineInterface = readline.createInterface(this.stdin, this.stdout);
-
- var self = this;
- this.readlineInterface.on('line', function(data) {
- self.emit('line', data);
- });
- this.readlineInterface.on('close', function() {
- self.emit('close');
- });
-
- this._resetInput = function() {
- self.clear();
- }
-}
-util.inherits(Console, events.EventEmitter);
-
-Console.Colors = {
- Red: '\033[31m',
- Green: '\033[32m',
- Yellow: '\033[33m',
- Blue: '\033[34m',
- Default: '\033[39m'
-};
-
-Console.prototype.prompt = function() {
- this.readlineInterface.prompt();
-}
-
-Console.prototype.print = function(msg, color) {
- this.clear();
- color = color || Console.Colors.Default;
- this.stdout.write(color + msg + Console.Colors.Default + '\n');
- this.prompt();
-}
-
-Console.prototype.clear = function() {
- this.stdout.write('\033[2K\033[E');
-}
-
-Console.prototype.pause = function() {
- this.stdin.on('keypress', this._resetInput);
-}
-
-Console.prototype.resume = function() {
- this.stdin.removeListener('keypress', this._resetInput);
-}
-
-function appender(xs) {
- xs = xs || [];
- return function (x) {
- xs.push(x);
- return xs;
- }
-}
-
-function into(obj, kvals) {
- kvals.forEach(function (kv) {
- obj[kv[0]] = kv[1];
- });
- return obj;
-}
-
-function splitOnce(sep, str) { // sep can be either String or RegExp
- var tokens = str.split(sep);
- return [tokens[0], str.replace(sep, '').substr(tokens[0].length)];
-}
-
-/**
- * The actual application
- */
-
-var version = JSON.parse(fs.readFileSync(__dirname + '/../package.json', 'utf8')).version;
-program
- .version(version)
- .usage('[options] ')
- .option('-l, --listen ', 'listen on port')
- .option('-c, --connect ', 'connect to a websocket server')
- .option('-p, --protocol ', 'optional protocol version')
- .option('-o, --origin ', 'optional origin')
- .option('--host ', 'optional host')
- .option('-s, --subprotocol ', 'optional subprotocol')
- .option('-n, --no-check', 'Do not check for unauthorized certificates')
- .option('-H, --header ', 'Set an HTTP header. Repeat to set multiple. (--connect only)', appender(), [])
- .option('--auth ', 'Add basic HTTP authentication header. (--connect only)')
- .parse(process.argv);
-
-if (program.listen && program.connect) {
- console.error('\033[33merror: use either --listen or --connect\033[39m');
- process.exit(-1);
-}
-else if (program.listen) {
- var wsConsole = new Console();
- wsConsole.pause();
- var options = {};
- if (program.protocol) options.protocolVersion = program.protocol;
- if (program.origin) options.origin = program.origin;
- if (program.subprotocol) options.protocol = program.subprotocol;
- if (!program.check) options.rejectUnauthorized = program.check;
- var ws = null;
- var wss = new WebSocket.Server({port: program.listen}, function() {
- wsConsole.print('listening on port ' + program.listen + ' (press CTRL+C to quit)', Console.Colors.Green);
- wsConsole.clear();
- });
- wsConsole.on('close', function() {
- if (ws) {
- try {
- ws.close();
- }
- catch (e) {}
- }
- process.exit(0);
- });
- wsConsole.on('line', function(data) {
- if (ws) {
- ws.send(data, {mask: false});
- wsConsole.prompt();
- }
- });
- wss.on('connection', function(newClient) {
- if (ws) {
- // limit to one client
- newClient.terminate();
- return;
- };
- ws = newClient;
- wsConsole.resume();
- wsConsole.prompt();
- wsConsole.print('client connected', Console.Colors.Green);
- ws.on('close', function() {
- wsConsole.print('disconnected', Console.Colors.Green);
- wsConsole.clear();
- wsConsole.pause();
- ws = null;
- });
- ws.on('error', function(code, description) {
- wsConsole.print('error: ' + code + (description ? ' ' + description : ''), Console.Colors.Yellow);
- });
- ws.on('message', function(data, flags) {
- wsConsole.print('< ' + data, Console.Colors.Blue);
- });
- });
- wss.on('error', function(error) {
- wsConsole.print('error: ' + error.toString(), Console.Colors.Yellow);
- process.exit(-1);
- });
-}
-else if (program.connect) {
- var wsConsole = new Console();
- var options = {};
- if (program.protocol) options.protocolVersion = program.protocol;
- if (program.origin) options.origin = program.origin;
- if (program.subprotocol) options.protocol = program.subprotocol;
- if (program.host) options.host = program.host;
- if (!program.check) options.rejectUnauthorized = program.check;
- var headers = into({}, (program.header || []).map(function (s) {
- return splitOnce(':', s)
- }));
- if (program.auth) {
- headers['Authorization'] = 'Basic ' + new Buffer(program.auth).toString('base64');
- }
- options.headers = headers;
- var ws = new WebSocket(program.connect, options);
- ws.on('open', function() {
- wsConsole.print('connected (press CTRL+C to quit)', Console.Colors.Green);
- wsConsole.on('line', function(data) {
- ws.send(data, {mask: true});
- wsConsole.prompt();
- });
- });
- ws.on('close', function() {
- wsConsole.print('disconnected', Console.Colors.Green);
- wsConsole.clear();
- process.exit();
- });
- ws.on('error', function(code, description) {
- wsConsole.print('error: ' + code + (description ? ' ' + description : ''), Console.Colors.Yellow);
- process.exit(-1);
- });
- ws.on('message', function(data, flags) {
- wsConsole.print('< ' + data, Console.Colors.Blue);
- });
- wsConsole.on('close', function() {
- if (ws) {
- try {
- ws.close();
- }
- catch(e) {}
- process.exit();
- }
- });
-}
-else {
- console.error('\033[33merror: use either --listen or --connect\033[39m');
- process.exit(-1);
-}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/binding.gyp b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/binding.gyp
deleted file mode 100644
index 600f9d10f14..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/binding.gyp
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- 'targets': [
- {
- 'target_name': 'validation',
- 'include_dirs': ["
- * MIT Licensed
- */
-
-module.exports = require('./lib/WebSocket');
-module.exports.Server = require('./lib/WebSocketServer');
-module.exports.Sender = require('./lib/Sender');
-module.exports.Receiver = require('./lib/Receiver');
-
-module.exports.createServer = function (options, connectionListener) {
- var server = new module.exports.Server(options);
- if (typeof connectionListener === 'function') {
- server.on('connection', connectionListener);
- }
- return server;
-};
-
-module.exports.connect = module.exports.createConnection = function (address, openListener) {
- var client = new module.exports(address);
- if (typeof openListener === 'function') {
- client.on('open', openListener);
- }
- return client;
-};
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/BufferPool.js b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/BufferPool.js
deleted file mode 100644
index faf8637c04e..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/BufferPool.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-var util = require('util');
-
-function BufferPool(initialSize, growStrategy, shrinkStrategy) {
- if (typeof initialSize === 'function') {
- shrinkStrategy = growStrategy;
- growStrategy = initialSize;
- initialSize = 0;
- }
- else if (typeof initialSize === 'undefined') {
- initialSize = 0;
- }
- this._growStrategy = (growStrategy || function(db, size) {
- return db.used + size;
- }).bind(null, this);
- this._shrinkStrategy = (shrinkStrategy || function(db) {
- return initialSize;
- }).bind(null, this);
- this._buffer = initialSize ? new Buffer(initialSize) : null;
- this._offset = 0;
- this._used = 0;
- this._changeFactor = 0;
- this.__defineGetter__('size', function(){
- return this._buffer == null ? 0 : this._buffer.length;
- });
- this.__defineGetter__('used', function(){
- return this._used;
- });
-}
-
-BufferPool.prototype.get = function(length) {
- if (this._buffer == null || this._offset + length > this._buffer.length) {
- var newBuf = new Buffer(this._growStrategy(length));
- this._buffer = newBuf;
- this._offset = 0;
- }
- this._used += length;
- var buf = this._buffer.slice(this._offset, this._offset + length);
- this._offset += length;
- return buf;
-}
-
-BufferPool.prototype.reset = function(forceNewBuffer) {
- var len = this._shrinkStrategy();
- if (len < this.size) this._changeFactor -= 1;
- if (forceNewBuffer || this._changeFactor < -2) {
- this._changeFactor = 0;
- this._buffer = len ? new Buffer(len) : null;
- }
- this._offset = 0;
- this._used = 0;
-}
-
-module.exports = BufferPool;
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/BufferUtil.fallback.js b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/BufferUtil.fallback.js
deleted file mode 100644
index 508542c9e50..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/BufferUtil.fallback.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-module.exports.BufferUtil = {
- merge: function(mergedBuffer, buffers) {
- var offset = 0;
- for (var i = 0, l = buffers.length; i < l; ++i) {
- var buf = buffers[i];
- buf.copy(mergedBuffer, offset);
- offset += buf.length;
- }
- },
- mask: function(source, mask, output, offset, length) {
- var maskNum = mask.readUInt32LE(0, true);
- var i = 0;
- for (; i < length - 3; i += 4) {
- var num = maskNum ^ source.readUInt32LE(i, true);
- if (num < 0) num = 4294967296 + num;
- output.writeUInt32LE(num, offset + i, true);
- }
- switch (length % 4) {
- case 3: output[offset + i + 2] = source[i + 2] ^ mask[2];
- case 2: output[offset + i + 1] = source[i + 1] ^ mask[1];
- case 1: output[offset + i] = source[i] ^ mask[0];
- case 0:;
- }
- },
- unmask: function(data, mask) {
- var maskNum = mask.readUInt32LE(0, true);
- var length = data.length;
- var i = 0;
- for (; i < length - 3; i += 4) {
- var num = maskNum ^ data.readUInt32LE(i, true);
- if (num < 0) num = 4294967296 + num;
- data.writeUInt32LE(num, i, true);
- }
- switch (length % 4) {
- case 3: data[i + 2] = data[i + 2] ^ mask[2];
- case 2: data[i + 1] = data[i + 1] ^ mask[1];
- case 1: data[i] = data[i] ^ mask[0];
- case 0:;
- }
- }
-}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/BufferUtil.js b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/BufferUtil.js
deleted file mode 100644
index 15d35b98f5c..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/BufferUtil.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-try {
- module.exports = require('../build/Release/bufferutil');
-} catch (e) { try {
- module.exports = require('../build/default/bufferutil');
-} catch (e) { try {
- module.exports = require('./BufferUtil.fallback');
-} catch (e) {
- console.error('bufferutil.node seems to not have been built. Run npm install.');
- throw e;
-}}}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/ErrorCodes.js b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/ErrorCodes.js
deleted file mode 100644
index 55ebd529b7c..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/ErrorCodes.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-module.exports = {
- isValidErrorCode: function(code) {
- return (code >= 1000 && code <= 1011 && code != 1004 && code != 1005 && code != 1006) ||
- (code >= 3000 && code <= 4999);
- },
- 1000: 'normal',
- 1001: 'going away',
- 1002: 'protocol error',
- 1003: 'unsupported data',
- 1004: 'reserved',
- 1005: 'reserved for extensions',
- 1006: 'reserved for extensions',
- 1007: 'inconsistent or invalid data',
- 1008: 'policy violation',
- 1009: 'message too big',
- 1010: 'extension handshake missing',
- 1011: 'an unexpected condition prevented the request from being fulfilled',
-};
\ No newline at end of file
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Receiver.hixie.js b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Receiver.hixie.js
deleted file mode 100644
index a8e41c47b51..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Receiver.hixie.js
+++ /dev/null
@@ -1,180 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-var util = require('util');
-
-/**
- * State constants
- */
-
-var EMPTY = 0
- , BODY = 1;
-var BINARYLENGTH = 2
- , BINARYBODY = 3;
-
-/**
- * Hixie Receiver implementation
- */
-
-function Receiver () {
- this.state = EMPTY;
- this.buffers = [];
- this.messageEnd = -1;
- this.spanLength = 0;
- this.dead = false;
-
- this.onerror = function() {};
- this.ontext = function() {};
- this.onbinary = function() {};
- this.onclose = function() {};
- this.onping = function() {};
- this.onpong = function() {};
-}
-
-module.exports = Receiver;
-
-/**
- * Add new data to the parser.
- *
- * @api public
- */
-
-Receiver.prototype.add = function(data) {
- var self = this;
- function doAdd() {
- if (self.state === EMPTY) {
- if (data.length == 2 && data[0] == 0xFF && data[1] == 0x00) {
- self.reset();
- self.onclose();
- return;
- }
- if (data[0] === 0x80) {
- self.messageEnd = 0;
- self.state = BINARYLENGTH;
- data = data.slice(1);
- } else {
-
- if (data[0] !== 0x00) {
- self.error('payload must start with 0x00 byte', true);
- return;
- }
- data = data.slice(1);
- self.state = BODY;
-
- }
- }
- if (self.state === BINARYLENGTH) {
- var i = 0;
- while ((i < data.length) && (data[i] & 0x80)) {
- self.messageEnd = 128 * self.messageEnd + (data[i] & 0x7f);
- ++i;
- }
- if (i < data.length) {
- self.messageEnd = 128 * self.messageEnd + (data[i] & 0x7f);
- self.state = BINARYBODY;
- ++i;
- }
- if (i > 0)
- data = data.slice(i);
- }
- if (self.state === BINARYBODY) {
- var dataleft = self.messageEnd - self.spanLength;
- if (data.length >= dataleft) {
- // consume the whole buffer to finish the frame
- self.buffers.push(data);
- self.spanLength += dataleft;
- self.messageEnd = dataleft;
- return self.parse();
- }
- // frame's not done even if we consume it all
- self.buffers.push(data);
- self.spanLength += data.length;
- return;
- }
- self.buffers.push(data);
- if ((self.messageEnd = bufferIndex(data, 0xFF)) != -1) {
- self.spanLength += self.messageEnd;
- return self.parse();
- }
- else self.spanLength += data.length;
- }
- while(data) data = doAdd();
-};
-
-/**
- * Releases all resources used by the receiver.
- *
- * @api public
- */
-
-Receiver.prototype.cleanup = function() {
- this.dead = true;
- this.state = EMPTY;
- this.buffers = [];
-};
-
-/**
- * Process buffered data.
- *
- * @api public
- */
-
-Receiver.prototype.parse = function() {
- var output = new Buffer(this.spanLength);
- var outputIndex = 0;
- for (var bi = 0, bl = this.buffers.length; bi < bl - 1; ++bi) {
- var buffer = this.buffers[bi];
- buffer.copy(output, outputIndex);
- outputIndex += buffer.length;
- }
- var lastBuffer = this.buffers[this.buffers.length - 1];
- if (this.messageEnd > 0) lastBuffer.copy(output, outputIndex, 0, this.messageEnd);
- if (this.state !== BODY) --this.messageEnd;
- var tail = null;
- if (this.messageEnd < lastBuffer.length - 1) {
- tail = lastBuffer.slice(this.messageEnd + 1);
- }
- this.reset();
- this.ontext(output.toString('utf8'));
- return tail;
-};
-
-/**
- * Handles an error
- *
- * @api private
- */
-
-Receiver.prototype.error = function (reason, terminate) {
- this.reset();
- this.onerror(reason, terminate);
- return this;
-};
-
-/**
- * Reset parser state
- *
- * @api private
- */
-
-Receiver.prototype.reset = function (reason) {
- if (this.dead) return;
- this.state = EMPTY;
- this.buffers = [];
- this.messageEnd = -1;
- this.spanLength = 0;
-};
-
-/**
- * Internal api
- */
-
-function bufferIndex(buffer, byte) {
- for (var i = 0, l = buffer.length; i < l; ++i) {
- if (buffer[i] === byte) return i;
- }
- return -1;
-}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Receiver.js b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Receiver.js
deleted file mode 100644
index 004cd32c168..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Receiver.js
+++ /dev/null
@@ -1,585 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-var util = require('util')
- , Validation = require('./Validation').Validation
- , ErrorCodes = require('./ErrorCodes')
- , BufferPool = require('./BufferPool')
- , bufferUtil = require('./BufferUtil').BufferUtil;
-
-/**
- * HyBi Receiver implementation
- */
-
-function Receiver () {
- // memory pool for fragmented messages
- var fragmentedPoolPrevUsed = -1;
- this.fragmentedBufferPool = new BufferPool(1024, function(db, length) {
- return db.used + length;
- }, function(db) {
- return fragmentedPoolPrevUsed = fragmentedPoolPrevUsed >= 0 ?
- (fragmentedPoolPrevUsed + db.used) / 2 :
- db.used;
- });
-
- // memory pool for unfragmented messages
- var unfragmentedPoolPrevUsed = -1;
- this.unfragmentedBufferPool = new BufferPool(1024, function(db, length) {
- return db.used + length;
- }, function(db) {
- return unfragmentedPoolPrevUsed = unfragmentedPoolPrevUsed >= 0 ?
- (unfragmentedPoolPrevUsed + db.used) / 2 :
- db.used;
- });
-
- this.state = {
- activeFragmentedOperation: null,
- lastFragment: false,
- masked: false,
- opcode: 0,
- fragmentedOperation: false
- };
- this.overflow = [];
- this.headerBuffer = new Buffer(10);
- this.expectOffset = 0;
- this.expectBuffer = null;
- this.expectHandler = null;
- this.currentMessage = [];
- this.expectHeader(2, this.processPacket);
- this.dead = false;
-
- this.onerror = function() {};
- this.ontext = function() {};
- this.onbinary = function() {};
- this.onclose = function() {};
- this.onping = function() {};
- this.onpong = function() {};
-}
-
-module.exports = Receiver;
-
-/**
- * Add new data to the parser.
- *
- * @api public
- */
-
-Receiver.prototype.add = function(data) {
- var dataLength = data.length;
- if (dataLength == 0) return;
- if (this.expectBuffer == null) {
- this.overflow.push(data);
- return;
- }
- var toRead = Math.min(dataLength, this.expectBuffer.length - this.expectOffset);
- fastCopy(toRead, data, this.expectBuffer, this.expectOffset);
- this.expectOffset += toRead;
- if (toRead < dataLength) {
- this.overflow.push(data.slice(toRead));
- }
- while (this.expectBuffer && this.expectOffset == this.expectBuffer.length) {
- var bufferForHandler = this.expectBuffer;
- this.expectBuffer = null;
- this.expectOffset = 0;
- this.expectHandler.call(this, bufferForHandler);
- }
-};
-
-/**
- * Releases all resources used by the receiver.
- *
- * @api public
- */
-
-Receiver.prototype.cleanup = function() {
- this.dead = true;
- this.overflow = null;
- this.headerBuffer = null;
- this.expectBuffer = null;
- this.expectHandler = null;
- this.unfragmentedBufferPool = null;
- this.fragmentedBufferPool = null;
- this.state = null;
- this.currentMessage = null;
- this.onerror = null;
- this.ontext = null;
- this.onbinary = null;
- this.onclose = null;
- this.onping = null;
- this.onpong = null;
-};
-
-/**
- * Waits for a certain amount of header bytes to be available, then fires a callback.
- *
- * @api private
- */
-
-Receiver.prototype.expectHeader = function(length, handler) {
- if (length == 0) {
- handler(null);
- return;
- }
- this.expectBuffer = this.headerBuffer.slice(this.expectOffset, this.expectOffset + length);
- this.expectHandler = handler;
- var toRead = length;
- while (toRead > 0 && this.overflow.length > 0) {
- var fromOverflow = this.overflow.pop();
- if (toRead < fromOverflow.length) this.overflow.push(fromOverflow.slice(toRead));
- var read = Math.min(fromOverflow.length, toRead);
- fastCopy(read, fromOverflow, this.expectBuffer, this.expectOffset);
- this.expectOffset += read;
- toRead -= read;
- }
-};
-
-/**
- * Waits for a certain amount of data bytes to be available, then fires a callback.
- *
- * @api private
- */
-
-Receiver.prototype.expectData = function(length, handler) {
- if (length == 0) {
- handler(null);
- return;
- }
- this.expectBuffer = this.allocateFromPool(length, this.state.fragmentedOperation);
- this.expectHandler = handler;
- var toRead = length;
- while (toRead > 0 && this.overflow.length > 0) {
- var fromOverflow = this.overflow.pop();
- if (toRead < fromOverflow.length) this.overflow.push(fromOverflow.slice(toRead));
- var read = Math.min(fromOverflow.length, toRead);
- fastCopy(read, fromOverflow, this.expectBuffer, this.expectOffset);
- this.expectOffset += read;
- toRead -= read;
- }
-};
-
-/**
- * Allocates memory from the buffer pool.
- *
- * @api private
- */
-
-Receiver.prototype.allocateFromPool = function(length, isFragmented) {
- return (isFragmented ? this.fragmentedBufferPool : this.unfragmentedBufferPool).get(length);
-};
-
-/**
- * Start processing a new packet.
- *
- * @api private
- */
-
-Receiver.prototype.processPacket = function (data) {
- if ((data[0] & 0x70) != 0) {
- this.error('reserved fields must be empty', 1002);
- return;
- }
- this.state.lastFragment = (data[0] & 0x80) == 0x80;
- this.state.masked = (data[1] & 0x80) == 0x80;
- var opcode = data[0] & 0xf;
- if (opcode === 0) {
- // continuation frame
- this.state.fragmentedOperation = true;
- this.state.opcode = this.state.activeFragmentedOperation;
- if (!(this.state.opcode == 1 || this.state.opcode == 2)) {
- this.error('continuation frame cannot follow current opcode', 1002);
- return;
- }
- }
- else {
- if (opcode < 3 && this.state.activeFragmentedOperation != null) {
- this.error('data frames after the initial data frame must have opcode 0', 1002);
- return;
- }
- this.state.opcode = opcode;
- if (this.state.lastFragment === false) {
- this.state.fragmentedOperation = true;
- this.state.activeFragmentedOperation = opcode;
- }
- else this.state.fragmentedOperation = false;
- }
- var handler = opcodes[this.state.opcode];
- if (typeof handler == 'undefined') this.error('no handler for opcode ' + this.state.opcode, 1002);
- else {
- handler.start.call(this, data);
- }
-};
-
-/**
- * Endprocessing a packet.
- *
- * @api private
- */
-
-Receiver.prototype.endPacket = function() {
- if (!this.state.fragmentedOperation) this.unfragmentedBufferPool.reset(true);
- else if (this.state.lastFragment) this.fragmentedBufferPool.reset(false);
- this.expectOffset = 0;
- this.expectBuffer = null;
- this.expectHandler = null;
- if (this.state.lastFragment && this.state.opcode === this.state.activeFragmentedOperation) {
- // end current fragmented operation
- this.state.activeFragmentedOperation = null;
- }
- this.state.lastFragment = false;
- this.state.opcode = this.state.activeFragmentedOperation != null ? this.state.activeFragmentedOperation : 0;
- this.state.masked = false;
- this.expectHeader(2, this.processPacket);
-};
-
-/**
- * Reset the parser state.
- *
- * @api private
- */
-
-Receiver.prototype.reset = function() {
- if (this.dead) return;
- this.state = {
- activeFragmentedOperation: null,
- lastFragment: false,
- masked: false,
- opcode: 0,
- fragmentedOperation: false
- };
- this.fragmentedBufferPool.reset(true);
- this.unfragmentedBufferPool.reset(true);
- this.expectOffset = 0;
- this.expectBuffer = null;
- this.expectHandler = null;
- this.overflow = [];
- this.currentMessage = [];
-};
-
-/**
- * Unmask received data.
- *
- * @api private
- */
-
-Receiver.prototype.unmask = function (mask, buf, binary) {
- if (mask != null && buf != null) bufferUtil.unmask(buf, mask);
- if (binary) return buf;
- return buf != null ? buf.toString('utf8') : '';
-};
-
-/**
- * Concatenates a list of buffers.
- *
- * @api private
- */
-
-Receiver.prototype.concatBuffers = function(buffers) {
- var length = 0;
- for (var i = 0, l = buffers.length; i < l; ++i) length += buffers[i].length;
- var mergedBuffer = new Buffer(length);
- bufferUtil.merge(mergedBuffer, buffers);
- return mergedBuffer;
-};
-
-/**
- * Handles an error
- *
- * @api private
- */
-
-Receiver.prototype.error = function (reason, protocolErrorCode) {
- this.reset();
- this.onerror(reason, protocolErrorCode);
- return this;
-};
-
-/**
- * Buffer utilities
- */
-
-function readUInt16BE(start) {
- return (this[start]<<8) +
- this[start+1];
-}
-
-function readUInt32BE(start) {
- return (this[start]<<24) +
- (this[start+1]<<16) +
- (this[start+2]<<8) +
- this[start+3];
-}
-
-function fastCopy(length, srcBuffer, dstBuffer, dstOffset) {
- switch (length) {
- default: srcBuffer.copy(dstBuffer, dstOffset, 0, length); break;
- case 16: dstBuffer[dstOffset+15] = srcBuffer[15];
- case 15: dstBuffer[dstOffset+14] = srcBuffer[14];
- case 14: dstBuffer[dstOffset+13] = srcBuffer[13];
- case 13: dstBuffer[dstOffset+12] = srcBuffer[12];
- case 12: dstBuffer[dstOffset+11] = srcBuffer[11];
- case 11: dstBuffer[dstOffset+10] = srcBuffer[10];
- case 10: dstBuffer[dstOffset+9] = srcBuffer[9];
- case 9: dstBuffer[dstOffset+8] = srcBuffer[8];
- case 8: dstBuffer[dstOffset+7] = srcBuffer[7];
- case 7: dstBuffer[dstOffset+6] = srcBuffer[6];
- case 6: dstBuffer[dstOffset+5] = srcBuffer[5];
- case 5: dstBuffer[dstOffset+4] = srcBuffer[4];
- case 4: dstBuffer[dstOffset+3] = srcBuffer[3];
- case 3: dstBuffer[dstOffset+2] = srcBuffer[2];
- case 2: dstBuffer[dstOffset+1] = srcBuffer[1];
- case 1: dstBuffer[dstOffset] = srcBuffer[0];
- }
-}
-
-/**
- * Opcode handlers
- */
-
-var opcodes = {
- // text
- '1': {
- start: function(data) {
- var self = this;
- // decode length
- var firstLength = data[1] & 0x7f;
- if (firstLength < 126) {
- opcodes['1'].getData.call(self, firstLength);
- }
- else if (firstLength == 126) {
- self.expectHeader(2, function(data) {
- opcodes['1'].getData.call(self, readUInt16BE.call(data, 0));
- });
- }
- else if (firstLength == 127) {
- self.expectHeader(8, function(data) {
- if (readUInt32BE.call(data, 0) != 0) {
- self.error('packets with length spanning more than 32 bit is currently not supported', 1008);
- return;
- }
- opcodes['1'].getData.call(self, readUInt32BE.call(data, 4));
- });
- }
- },
- getData: function(length) {
- var self = this;
- if (self.state.masked) {
- self.expectHeader(4, function(data) {
- var mask = data;
- self.expectData(length, function(data) {
- opcodes['1'].finish.call(self, mask, data);
- });
- });
- }
- else {
- self.expectData(length, function(data) {
- opcodes['1'].finish.call(self, null, data);
- });
- }
- },
- finish: function(mask, data) {
- var packet = this.unmask(mask, data, true);
- if (packet != null) this.currentMessage.push(packet);
- if (this.state.lastFragment) {
- var messageBuffer = this.concatBuffers(this.currentMessage);
- if (!Validation.isValidUTF8(messageBuffer)) {
- this.error('invalid utf8 sequence', 1007);
- return;
- }
- this.ontext(messageBuffer.toString('utf8'), {masked: this.state.masked, buffer: messageBuffer});
- this.currentMessage = [];
- }
- this.endPacket();
- }
- },
- // binary
- '2': {
- start: function(data) {
- var self = this;
- // decode length
- var firstLength = data[1] & 0x7f;
- if (firstLength < 126) {
- opcodes['2'].getData.call(self, firstLength);
- }
- else if (firstLength == 126) {
- self.expectHeader(2, function(data) {
- opcodes['2'].getData.call(self, readUInt16BE.call(data, 0));
- });
- }
- else if (firstLength == 127) {
- self.expectHeader(8, function(data) {
- if (readUInt32BE.call(data, 0) != 0) {
- self.error('packets with length spanning more than 32 bit is currently not supported', 1008);
- return;
- }
- opcodes['2'].getData.call(self, readUInt32BE.call(data, 4, true));
- });
- }
- },
- getData: function(length) {
- var self = this;
- if (self.state.masked) {
- self.expectHeader(4, function(data) {
- var mask = data;
- self.expectData(length, function(data) {
- opcodes['2'].finish.call(self, mask, data);
- });
- });
- }
- else {
- self.expectData(length, function(data) {
- opcodes['2'].finish.call(self, null, data);
- });
- }
- },
- finish: function(mask, data) {
- var packet = this.unmask(mask, data, true);
- if (packet != null) this.currentMessage.push(packet);
- if (this.state.lastFragment) {
- var messageBuffer = this.concatBuffers(this.currentMessage);
- this.onbinary(messageBuffer, {masked: this.state.masked, buffer: messageBuffer});
- this.currentMessage = [];
- }
- this.endPacket();
- }
- },
- // close
- '8': {
- start: function(data) {
- var self = this;
- if (self.state.lastFragment == false) {
- self.error('fragmented close is not supported', 1002);
- return;
- }
-
- // decode length
- var firstLength = data[1] & 0x7f;
- if (firstLength < 126) {
- opcodes['8'].getData.call(self, firstLength);
- }
- else {
- self.error('control frames cannot have more than 125 bytes of data', 1002);
- }
- },
- getData: function(length) {
- var self = this;
- if (self.state.masked) {
- self.expectHeader(4, function(data) {
- var mask = data;
- self.expectData(length, function(data) {
- opcodes['8'].finish.call(self, mask, data);
- });
- });
- }
- else {
- self.expectData(length, function(data) {
- opcodes['8'].finish.call(self, null, data);
- });
- }
- },
- finish: function(mask, data) {
- var self = this;
- data = self.unmask(mask, data, true);
- if (data && data.length == 1) {
- self.error('close packets with data must be at least two bytes long', 1002);
- return;
- }
- var code = data && data.length > 1 ? readUInt16BE.call(data, 0) : 1000;
- if (!ErrorCodes.isValidErrorCode(code)) {
- self.error('invalid error code', 1002);
- return;
- }
- var message = '';
- if (data && data.length > 2) {
- var messageBuffer = data.slice(2);
- if (!Validation.isValidUTF8(messageBuffer)) {
- self.error('invalid utf8 sequence', 1007);
- return;
- }
- message = messageBuffer.toString('utf8');
- }
- this.onclose(code, message, {masked: self.state.masked});
- this.reset();
- },
- },
- // ping
- '9': {
- start: function(data) {
- var self = this;
- if (self.state.lastFragment == false) {
- self.error('fragmented ping is not supported', 1002);
- return;
- }
-
- // decode length
- var firstLength = data[1] & 0x7f;
- if (firstLength < 126) {
- opcodes['9'].getData.call(self, firstLength);
- }
- else {
- self.error('control frames cannot have more than 125 bytes of data', 1002);
- }
- },
- getData: function(length) {
- var self = this;
- if (self.state.masked) {
- self.expectHeader(4, function(data) {
- var mask = data;
- self.expectData(length, function(data) {
- opcodes['9'].finish.call(self, mask, data);
- });
- });
- }
- else {
- self.expectData(length, function(data) {
- opcodes['9'].finish.call(self, null, data);
- });
- }
- },
- finish: function(mask, data) {
- this.onping(this.unmask(mask, data, true), {masked: this.state.masked, binary: true});
- this.endPacket();
- }
- },
- // pong
- '10': {
- start: function(data) {
- var self = this;
- if (self.state.lastFragment == false) {
- self.error('fragmented pong is not supported', 1002);
- return;
- }
-
- // decode length
- var firstLength = data[1] & 0x7f;
- if (firstLength < 126) {
- opcodes['10'].getData.call(self, firstLength);
- }
- else {
- self.error('control frames cannot have more than 125 bytes of data', 1002);
- }
- },
- getData: function(length) {
- var self = this;
- if (this.state.masked) {
- this.expectHeader(4, function(data) {
- var mask = data;
- self.expectData(length, function(data) {
- opcodes['10'].finish.call(self, mask, data);
- });
- });
- }
- else {
- this.expectData(length, function(data) {
- opcodes['10'].finish.call(self, null, data);
- });
- }
- },
- finish: function(mask, data) {
- this.onpong(this.unmask(mask, data, true), {masked: this.state.masked, binary: true});
- this.endPacket();
- }
- }
-}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Sender.hixie.js b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Sender.hixie.js
deleted file mode 100644
index c715dbdc7ec..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Sender.hixie.js
+++ /dev/null
@@ -1,118 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-var events = require('events')
- , util = require('util')
- , EventEmitter = events.EventEmitter;
-
-/**
- * Hixie Sender implementation
- */
-
-function Sender(socket) {
- this.socket = socket;
- this.continuationFrame = false;
- this.isClosed = false;
-}
-
-module.exports = Sender;
-
-/**
- * Inherits from EventEmitter.
- */
-
-util.inherits(Sender, events.EventEmitter);
-
-/**
- * Frames and writes data.
- *
- * @api public
- */
-
-Sender.prototype.send = function(data, options, cb) {
- if (this.isClosed) return;
-
- var isString = typeof data == 'string'
- , length = isString ? Buffer.byteLength(data) : data.length
- , lengthbytes = (length > 127) ? 2 : 1 // assume less than 2**14 bytes
- , writeStartMarker = this.continuationFrame == false
- , writeEndMarker = !options || !(typeof options.fin != 'undefined' && !options.fin)
- , buffer = new Buffer((writeStartMarker ? ((options && options.binary) ? (1 + lengthbytes) : 1) : 0) + length + ((writeEndMarker && !(options && options.binary)) ? 1 : 0))
- , offset = writeStartMarker ? 1 : 0;
-
- if (writeStartMarker) {
- if (options && options.binary) {
- buffer.write('\x80', 'binary');
- // assume length less than 2**14 bytes
- if (lengthbytes > 1)
- buffer.write(String.fromCharCode(128+length/128), offset++, 'binary');
- buffer.write(String.fromCharCode(length&0x7f), offset++, 'binary');
- } else
- buffer.write('\x00', 'binary');
- }
-
- if (isString) buffer.write(data, offset, 'utf8');
- else data.copy(buffer, offset, 0);
-
- if (writeEndMarker) {
- if (options && options.binary) {
- // sending binary, not writing end marker
- } else
- buffer.write('\xff', offset + length, 'binary');
- this.continuationFrame = false;
- }
- else this.continuationFrame = true;
-
- try {
- this.socket.write(buffer, 'binary', cb);
- } catch (e) {
- this.error(e.toString());
- }
-};
-
-/**
- * Sends a close instruction to the remote party.
- *
- * @api public
- */
-
-Sender.prototype.close = function(code, data, mask, cb) {
- if (this.isClosed) return;
- this.isClosed = true;
- try {
- if (this.continuationFrame) this.socket.write(new Buffer([0xff], 'binary'));
- this.socket.write(new Buffer([0xff, 0x00]), 'binary', cb);
- } catch (e) {
- this.error(e.toString());
- }
-};
-
-/**
- * Sends a ping message to the remote party. Not available for hixie.
- *
- * @api public
- */
-
-Sender.prototype.ping = function(data, options) {};
-
-/**
- * Sends a pong message to the remote party. Not available for hixie.
- *
- * @api public
- */
-
-Sender.prototype.pong = function(data, options) {};
-
-/**
- * Handles an error
- *
- * @api private
- */
-
-Sender.prototype.error = function (reason) {
- this.emit('error', reason);
- return this;
-};
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Sender.js b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Sender.js
deleted file mode 100644
index bc6ea7308f1..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Sender.js
+++ /dev/null
@@ -1,227 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-var events = require('events')
- , util = require('util')
- , EventEmitter = events.EventEmitter
- , ErrorCodes = require('./ErrorCodes')
- , bufferUtil = require('./BufferUtil').BufferUtil;
-
-/**
- * HyBi Sender implementation
- */
-
-function Sender(socket) {
- this._socket = socket;
- this.firstFragment = true;
-}
-
-/**
- * Inherits from EventEmitter.
- */
-
-util.inherits(Sender, events.EventEmitter);
-
-/**
- * Sends a close instruction to the remote party.
- *
- * @api public
- */
-
-Sender.prototype.close = function(code, data, mask) {
- if (typeof code !== 'undefined') {
- if (typeof code !== 'number' ||
- !ErrorCodes.isValidErrorCode(code)) throw new Error('first argument must be a valid error code number');
- }
- code = code || 1000;
- var dataBuffer = new Buffer(2 + (data ? Buffer.byteLength(data) : 0));
- writeUInt16BE.call(dataBuffer, code, 0);
- if (dataBuffer.length > 2) dataBuffer.write(data, 2);
- this.frameAndSend(0x8, dataBuffer, true, mask);
-};
-
-/**
- * Sends a ping message to the remote party.
- *
- * @api public
- */
-
-Sender.prototype.ping = function(data, options) {
- var mask = options && options.mask;
- this.frameAndSend(0x9, data || '', true, mask);
-};
-
-/**
- * Sends a pong message to the remote party.
- *
- * @api public
- */
-
-Sender.prototype.pong = function(data, options) {
- var mask = options && options.mask;
- this.frameAndSend(0xa, data || '', true, mask);
-};
-
-/**
- * Sends text or binary data to the remote party.
- *
- * @api public
- */
-
-Sender.prototype.send = function(data, options, cb) {
- var finalFragment = options && options.fin === false ? false : true;
- var mask = options && options.mask;
- var opcode = options && options.binary ? 2 : 1;
- if (this.firstFragment === false) opcode = 0;
- else this.firstFragment = false;
- if (finalFragment) this.firstFragment = true
- this.frameAndSend(opcode, data, finalFragment, mask, cb);
-};
-
-/**
- * Frames and sends a piece of data according to the HyBi WebSocket protocol.
- *
- * @api private
- */
-
-Sender.prototype.frameAndSend = function(opcode, data, finalFragment, maskData, cb) {
- var canModifyData = false;
-
- if (!data) {
- try {
- this._socket.write(new Buffer([opcode | (finalFragment ? 0x80 : 0), 0 | (maskData ? 0x80 : 0)].concat(maskData ? [0, 0, 0, 0] : [])), 'binary', cb);
- }
- catch (e) {
- if (typeof cb == 'function') cb(e);
- else this.emit('error', e);
- }
- return;
- }
-
- if (!Buffer.isBuffer(data)) {
- canModifyData = true;
- if (data && (typeof data.byteLength !== 'undefined' || typeof data.buffer !== 'undefined')) {
- data = getArrayBuffer(data);
- } else {
- data = new Buffer(data);
- }
- }
-
- var dataLength = data.length
- , dataOffset = maskData ? 6 : 2
- , secondByte = dataLength;
-
- if (dataLength >= 65536) {
- dataOffset += 8;
- secondByte = 127;
- }
- else if (dataLength > 125) {
- dataOffset += 2;
- secondByte = 126;
- }
-
- var mergeBuffers = dataLength < 32768 || (maskData && !canModifyData);
- var totalLength = mergeBuffers ? dataLength + dataOffset : dataOffset;
- var outputBuffer = new Buffer(totalLength);
- outputBuffer[0] = finalFragment ? opcode | 0x80 : opcode;
-
- switch (secondByte) {
- case 126:
- writeUInt16BE.call(outputBuffer, dataLength, 2);
- break;
- case 127:
- writeUInt32BE.call(outputBuffer, 0, 2);
- writeUInt32BE.call(outputBuffer, dataLength, 6);
- }
-
- if (maskData) {
- outputBuffer[1] = secondByte | 0x80;
- var mask = this._randomMask || (this._randomMask = getRandomMask());
- outputBuffer[dataOffset - 4] = mask[0];
- outputBuffer[dataOffset - 3] = mask[1];
- outputBuffer[dataOffset - 2] = mask[2];
- outputBuffer[dataOffset - 1] = mask[3];
- if (mergeBuffers) {
- bufferUtil.mask(data, mask, outputBuffer, dataOffset, dataLength);
- try {
- this._socket.write(outputBuffer, 'binary', cb);
- }
- catch (e) {
- if (typeof cb == 'function') cb(e);
- else this.emit('error', e);
- }
- }
- else {
- bufferUtil.mask(data, mask, data, 0, dataLength);
- try {
- this._socket.write(outputBuffer, 'binary');
- this._socket.write(data, 'binary', cb);
- }
- catch (e) {
- if (typeof cb == 'function') cb(e);
- else this.emit('error', e);
- }
- }
- }
- else {
- outputBuffer[1] = secondByte;
- if (mergeBuffers) {
- data.copy(outputBuffer, dataOffset);
- try {
- this._socket.write(outputBuffer, 'binary', cb);
- }
- catch (e) {
- if (typeof cb == 'function') cb(e);
- else this.emit('error', e);
- }
- }
- else {
- try {
- this._socket.write(outputBuffer, 'binary');
- this._socket.write(data, 'binary', cb);
- }
- catch (e) {
- if (typeof cb == 'function') cb(e);
- else this.emit('error', e);
- }
- }
- }
-};
-
-module.exports = Sender;
-
-function writeUInt16BE(value, offset) {
- this[offset] = (value & 0xff00)>>8;
- this[offset+1] = value & 0xff;
-}
-
-function writeUInt32BE(value, offset) {
- this[offset] = (value & 0xff000000)>>24;
- this[offset+1] = (value & 0xff0000)>>16;
- this[offset+2] = (value & 0xff00)>>8;
- this[offset+3] = value & 0xff;
-}
-
-function getArrayBuffer(data) {
- // data is either an ArrayBuffer or ArrayBufferView.
- var array = new Uint8Array(data.buffer || data)
- , l = data.byteLength || data.length
- , o = data.byteOffset || 0
- , buffer = new Buffer(l);
- for (var i = 0; i < l; ++i) {
- buffer[i] = array[o+i];
- }
- return buffer;
-}
-
-function getRandomMask() {
- return new Buffer([
- ~~(Math.random() * 255),
- ~~(Math.random() * 255),
- ~~(Math.random() * 255),
- ~~(Math.random() * 255)
- ]);
-}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Validation.fallback.js b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Validation.fallback.js
deleted file mode 100644
index 2c7c4fd48b2..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Validation.fallback.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-module.exports.Validation = {
- isValidUTF8: function(buffer) {
- return true;
- }
-};
-
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Validation.js b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Validation.js
deleted file mode 100644
index 0f3109a05a5..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/Validation.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-try {
- module.exports = require('../build/Release/validation');
-} catch (e) { try {
- module.exports = require('../build/default/validation');
-} catch (e) { try {
- module.exports = require('./Validation.fallback');
-} catch (e) {
- console.error('validation.node seems to not have been built. Run npm install.');
- throw e;
-}}}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/WebSocket.js b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/WebSocket.js
deleted file mode 100644
index 8c304ebbd05..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/WebSocket.js
+++ /dev/null
@@ -1,794 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-var util = require('util')
- , events = require('events')
- , http = require('http')
- , https = require('https')
- , crypto = require('crypto')
- , url = require('url')
- , stream = require('stream')
- , Options = require('options')
- , Sender = require('./Sender')
- , Receiver = require('./Receiver')
- , SenderHixie = require('./Sender.hixie')
- , ReceiverHixie = require('./Receiver.hixie');
-
-/**
- * Constants
- */
-
-// Default protocol version
-
-var protocolVersion = 13;
-
-// Close timeout
-
-var closeTimeout = 30000; // Allow 5 seconds to terminate the connection cleanly
-
-/**
- * WebSocket implementation
- */
-
-function WebSocket(address, protocols, options) {
-
- if (protocols && !Array.isArray(protocols) && 'object' == typeof protocols) {
- // accept the "options" Object as the 2nd argument
- options = protocols;
- protocols = null;
- }
- if ('string' == typeof protocols) {
- protocols = [ protocols ];
- }
- if (!Array.isArray(protocols)) {
- protocols = [];
- }
- // TODO: actually handle the `Sub-Protocols` part of the WebSocket client
-
- this._socket = null;
- this.bytesReceived = 0;
- this.readyState = null;
- this.supports = {};
-
- if (Array.isArray(address)) {
- initAsServerClient.apply(this, address.concat(options));
- } else {
- initAsClient.apply(this, [address, protocols, options]);
- }
-}
-
-/**
- * Inherits from EventEmitter.
- */
-
-util.inherits(WebSocket, events.EventEmitter);
-
-/**
- * Ready States
- */
-
-["CONNECTING", "OPEN", "CLOSING", "CLOSED"].forEach(function (state, index) {
- WebSocket.prototype[state] = WebSocket[state] = index;
-});
-
-/**
- * Gracefully closes the connection, after sending a description message to the server
- *
- * @param {Object} data to be sent to the server
- * @api public
- */
-
-WebSocket.prototype.close = function(code, data) {
- if (this.readyState == WebSocket.CLOSING || this.readyState == WebSocket.CLOSED) return;
- if (this.readyState == WebSocket.CONNECTING) {
- this.readyState = WebSocket.CLOSED;
- return;
- }
- try {
- this.readyState = WebSocket.CLOSING;
- this._closeCode = code;
- this._closeMessage = data;
- var mask = !this._isServer;
- this._sender.close(code, data, mask);
- }
- catch (e) {
- this.emit('error', e);
- }
- finally {
- this.terminate();
- }
-}
-
-/**
- * Pause the client stream
- *
- * @api public
- */
-
-WebSocket.prototype.pause = function() {
- if (this.readyState != WebSocket.OPEN) throw new Error('not opened');
- return this._socket.pause();
-}
-
-/**
- * Sends a ping
- *
- * @param {Object} data to be sent to the server
- * @param {Object} Members - mask: boolean, binary: boolean
- * @param {boolean} dontFailWhenClosed indicates whether or not to throw if the connection isnt open
- * @api public
- */
-
-WebSocket.prototype.ping = function(data, options, dontFailWhenClosed) {
- if (this.readyState != WebSocket.OPEN) {
- if (dontFailWhenClosed === true) return;
- throw new Error('not opened');
- }
- options = options || {};
- if (typeof options.mask == 'undefined') options.mask = !this._isServer;
- this._sender.ping(data, options);
-}
-
-/**
- * Sends a pong
- *
- * @param {Object} data to be sent to the server
- * @param {Object} Members - mask: boolean, binary: boolean
- * @param {boolean} dontFailWhenClosed indicates whether or not to throw if the connection isnt open
- * @api public
- */
-
-WebSocket.prototype.pong = function(data, options, dontFailWhenClosed) {
- if (this.readyState != WebSocket.OPEN) {
- if (dontFailWhenClosed === true) return;
- throw new Error('not opened');
- }
- options = options || {};
- if (typeof options.mask == 'undefined') options.mask = !this._isServer;
- this._sender.pong(data, options);
-}
-
-/**
- * Resume the client stream
- *
- * @api public
- */
-
-WebSocket.prototype.resume = function() {
- if (this.readyState != WebSocket.OPEN) throw new Error('not opened');
- return this._socket.resume();
-}
-
-/**
- * Sends a piece of data
- *
- * @param {Object} data to be sent to the server
- * @param {Object} Members - mask: boolean, binary: boolean
- * @param {function} Optional callback which is executed after the send completes
- * @api public
- */
-
-WebSocket.prototype.send = function(data, options, cb) {
- if (typeof options == 'function') {
- cb = options;
- options = {};
- }
- if (this.readyState != WebSocket.OPEN) {
- if (typeof cb == 'function') cb(new Error('not opened'));
- else throw new Error('not opened');
- return;
- }
- if (!data) data = '';
- if (this._queue) {
- var self = this;
- this._queue.push(function() { self.send(data, options, cb); });
- return;
- }
- options = options || {};
- options.fin = true;
- if (typeof options.binary == 'undefined') {
- options.binary = (data instanceof ArrayBuffer || data instanceof Buffer ||
- data instanceof Uint8Array ||
- data instanceof Uint16Array ||
- data instanceof Uint32Array ||
- data instanceof Int8Array ||
- data instanceof Int16Array ||
- data instanceof Int32Array ||
- data instanceof Float32Array ||
- data instanceof Float64Array);
- }
- if (typeof options.mask == 'undefined') options.mask = !this._isServer;
- var readable = typeof stream.Readable == 'function' ? stream.Readable : stream.Stream;
- if (data instanceof readable) {
- startQueue(this);
- var self = this;
- sendStream(this, data, options, function(error) {
- process.nextTick(function() { executeQueueSends(self); });
- if (typeof cb == 'function') cb(error);
- });
- }
- else this._sender.send(data, options, cb);
-}
-
-/**
- * Streams data through calls to a user supplied function
- *
- * @param {Object} Members - mask: boolean, binary: boolean
- * @param {function} 'function (error, send)' which is executed on successive ticks of which send is 'function (data, final)'.
- * @api public
- */
-
-WebSocket.prototype.stream = function(options, cb) {
- if (typeof options == 'function') {
- cb = options;
- options = {};
- }
- var self = this;
- if (typeof cb != 'function') throw new Error('callback must be provided');
- if (this.readyState != WebSocket.OPEN) {
- if (typeof cb == 'function') cb(new Error('not opened'));
- else throw new Error('not opened');
- return;
- }
- if (this._queue) {
- this._queue.push(function() { self.stream(options, cb); });
- return;
- }
- options = options || {};
- if (typeof options.mask == 'undefined') options.mask = !this._isServer;
- startQueue(this);
- var send = function(data, final) {
- try {
- if (self.readyState != WebSocket.OPEN) throw new Error('not opened');
- options.fin = final === true;
- self._sender.send(data, options);
- if (!final) process.nextTick(cb.bind(null, null, send));
- else executeQueueSends(self);
- }
- catch (e) {
- if (typeof cb == 'function') cb(e);
- else {
- delete self._queue;
- self.emit('error', e);
- }
- }
- }
- process.nextTick(cb.bind(null, null, send));
-}
-
-/**
- * Immediately shuts down the connection
- *
- * @api public
- */
-
-WebSocket.prototype.terminate = function() {
- if (this.readyState == WebSocket.CLOSED) return;
- if (this._socket) {
- try {
- // End the connection
- this._socket.end();
- }
- catch (e) {
- // Socket error during end() call, so just destroy it right now
- cleanupWebsocketResources.call(this, true);
- return;
- }
-
- // Add a timeout to ensure that the connection is completely
- // cleaned up within 30 seconds, even if the clean close procedure
- // fails for whatever reason
- this._closeTimer = setTimeout(cleanupWebsocketResources.bind(this, true), closeTimeout);
- }
- else if (this.readyState == WebSocket.CONNECTING) {
- cleanupWebsocketResources.call(this, true);
- }
-};
-
-/**
- * Expose bufferedAmount
- *
- * @api public
- */
-
-Object.defineProperty(WebSocket.prototype, 'bufferedAmount', {
- get: function get() {
- var amount = 0;
- if (this._socket) {
- amount = this._socket.bufferSize || 0;
- }
- return amount;
- }
-});
-
-/**
- * Emulates the W3C Browser based WebSocket interface using function members.
- *
- * @see http://dev.w3.org/html5/websockets/#the-websocket-interface
- * @api public
- */
-
-['open', 'error', 'close', 'message'].forEach(function(method) {
- Object.defineProperty(WebSocket.prototype, 'on' + method, {
- /**
- * Returns the current listener
- *
- * @returns {Mixed} the set function or undefined
- * @api public
- */
-
- get: function get() {
- var listener = this.listeners(method)[0];
- return listener ? (listener._listener ? listener._listener : listener) : undefined;
- },
-
- /**
- * Start listening for events
- *
- * @param {Function} listener the listener
- * @returns {Mixed} the set function or undefined
- * @api public
- */
-
- set: function set(listener) {
- this.removeAllListeners(method);
- this.addEventListener(method, listener);
- }
- });
-});
-
-/**
- * Emulates the W3C Browser based WebSocket interface using addEventListener.
- *
- * @see https://developer.mozilla.org/en/DOM/element.addEventListener
- * @see http://dev.w3.org/html5/websockets/#the-websocket-interface
- * @api public
- */
-WebSocket.prototype.addEventListener = function(method, listener) {
- var target = this;
- if (typeof listener === 'function') {
- if (method === 'message') {
- function onMessage (data, flags) {
- listener.call(this, new MessageEvent(data, flags.binary ? 'Binary' : 'Text', target));
- }
- // store a reference so we can return the original function from the addEventListener hook
- onMessage._listener = listener;
- this.on(method, onMessage);
- } else if (method === 'close') {
- function onClose (code, message) {
- listener.call(this, new CloseEvent(code, message, target));
- }
- // store a reference so we can return the original function from the addEventListener hook
- onClose._listener = listener;
- this.on(method, onClose);
- } else if (method === 'error') {
- function onError (event) {
- event.target = target;
- listener.call(this, event);
- }
- // store a reference so we can return the original function from the addEventListener hook
- onError._listener = listener;
- this.on(method, onError);
- } else if (method === 'open') {
- function onOpen () {
- listener.call(this, new OpenEvent(target));
- }
- // store a reference so we can return the original function from the addEventListener hook
- onOpen._listener = listener;
- this.on(method, onOpen);
- } else {
- this.on(method, listener);
- }
- }
-}
-
-module.exports = WebSocket;
-
-/**
- * W3C MessageEvent
- *
- * @see http://www.w3.org/TR/html5/comms.html
- * @api private
- */
-
-function MessageEvent(dataArg, typeArg, target) {
- this.data = dataArg;
- this.type = typeArg;
- this.target = target;
-}
-
-/**
- * W3C CloseEvent
- *
- * @see http://www.w3.org/TR/html5/comms.html
- * @api private
- */
-
-function CloseEvent(code, reason, target) {
- this.wasClean = (typeof code == 'undefined' || code == 1000);
- this.code = code;
- this.reason = reason;
- this.target = target;
-}
-
-/**
- * W3C OpenEvent
- *
- * @see http://www.w3.org/TR/html5/comms.html
- * @api private
- */
-
-function OpenEvent(target) {
- this.target = target;
-}
-
-/**
- * Entirely private apis,
- * which may or may not be bound to a sepcific WebSocket instance.
- */
-
-function initAsServerClient(req, socket, upgradeHead, options) {
- options = new Options({
- protocolVersion: protocolVersion,
- protocol: null
- }).merge(options);
-
- // expose state properties
- this.protocol = options.value.protocol;
- this.protocolVersion = options.value.protocolVersion;
- this.supports.binary = (this.protocolVersion != 'hixie-76');
- this.upgradeReq = req;
- this.readyState = WebSocket.CONNECTING;
- this._isServer = true;
-
- // establish connection
- if (options.value.protocolVersion == 'hixie-76') establishConnection.call(this, ReceiverHixie, SenderHixie, socket, upgradeHead);
- else establishConnection.call(this, Receiver, Sender, socket, upgradeHead);
-}
-
-function initAsClient(address, protocols, options) {
- options = new Options({
- origin: null,
- protocolVersion: protocolVersion,
- host: null,
- headers: null,
- protocol: null,
- agent: null,
-
- // ssl-related options
- pfx: null,
- key: null,
- passphrase: null,
- cert: null,
- ca: null,
- ciphers: null,
- rejectUnauthorized: null
- }).merge(options);
- if (options.value.protocolVersion != 8 && options.value.protocolVersion != 13) {
- throw new Error('unsupported protocol version');
- }
-
- // verify url and establish http class
- var serverUrl = url.parse(address);
- var isUnixSocket = serverUrl.protocol === 'ws+unix:';
- if (!serverUrl.host && !isUnixSocket) throw new Error('invalid url');
- var isSecure = serverUrl.protocol === 'wss:' || serverUrl.protocol === 'https:';
- var httpObj = isSecure ? https : http;
- var port = serverUrl.port || (isSecure ? 443 : 80);
- var auth = serverUrl.auth;
-
- // expose state properties
- this._isServer = false;
- this.url = address;
- this.protocolVersion = options.value.protocolVersion;
- this.supports.binary = (this.protocolVersion != 'hixie-76');
-
- // begin handshake
- var key = new Buffer(options.value.protocolVersion + '-' + Date.now()).toString('base64');
- var shasum = crypto.createHash('sha1');
- shasum.update(key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11');
- var expectedServerKey = shasum.digest('base64');
-
- var agent = options.value.agent;
-
- var headerHost = serverUrl.hostname;
- // Append port number to Host and Origin header, only if specified in the url and non-default
- if(serverUrl.port) {
- if((isSecure && (port != 443)) || (!isSecure && (port != 80))){
- headerHost = headerHost + ':' + port;
- }
- }
-
- var requestOptions = {
- port: port,
- host: serverUrl.hostname,
- headers: {
- 'Connection': 'Upgrade',
- 'Upgrade': 'websocket',
- 'Host': headerHost,
- 'Origin': headerHost,
- 'Sec-WebSocket-Version': options.value.protocolVersion,
- 'Sec-WebSocket-Key': key
- }
- };
-
- // If we have basic auth.
- if (auth) {
- requestOptions.headers['Authorization'] = 'Basic ' + new Buffer(auth).toString('base64');
- }
-
- if (options.value.protocol) {
- requestOptions.headers['Sec-WebSocket-Protocol'] = options.value.protocol;
- }
-
- if (options.value.host) {
- requestOptions.headers['Host'] = options.value.host;
- }
-
- if (options.value.headers) {
- for (var header in options.value.headers) {
- if (options.value.headers.hasOwnProperty(header)) {
- requestOptions.headers[header] = options.value.headers[header];
- }
- }
- }
-
- if (options.isDefinedAndNonNull('pfx')
- || options.isDefinedAndNonNull('key')
- || options.isDefinedAndNonNull('passphrase')
- || options.isDefinedAndNonNull('cert')
- || options.isDefinedAndNonNull('ca')
- || options.isDefinedAndNonNull('ciphers')
- || options.isDefinedAndNonNull('rejectUnauthorized')) {
-
- if (options.isDefinedAndNonNull('pfx')) requestOptions.pfx = options.value.pfx;
- if (options.isDefinedAndNonNull('key')) requestOptions.key = options.value.key;
- if (options.isDefinedAndNonNull('passphrase')) requestOptions.passphrase = options.value.passphrase;
- if (options.isDefinedAndNonNull('cert')) requestOptions.cert = options.value.cert;
- if (options.isDefinedAndNonNull('ca')) requestOptions.ca = options.value.ca;
- if (options.isDefinedAndNonNull('ciphers')) requestOptions.ciphers = options.value.ciphers;
- if (options.isDefinedAndNonNull('rejectUnauthorized')) requestOptions.rejectUnauthorized = options.value.rejectUnauthorized;
-
- if (!agent) {
- // global agent ignores client side certificates
- agent = new httpObj.Agent(requestOptions);
- }
- }
-
- requestOptions.path = serverUrl.path || '/';
-
- if (agent) {
- requestOptions.agent = agent;
- }
-
- if (isUnixSocket) {
- requestOptions.socketPath = serverUrl.pathname;
- }
- if (options.value.origin) {
- if (options.value.protocolVersion < 13) requestOptions.headers['Sec-WebSocket-Origin'] = options.value.origin;
- else requestOptions.headers['Origin'] = options.value.origin;
- }
-
- var self = this;
- var req = httpObj.request(requestOptions);
-
- req.on('error', function(error) {
- self.emit('error', error);
- cleanupWebsocketResources.call(this, error);
- });
-
- req.once('response', function(res) {
- if (!self.emit('unexpected-response', req, res)) {
- var error = new Error('unexpected server response (' + res.statusCode + ')');
- req.abort();
- self.emit('error', error);
- }
- cleanupWebsocketResources.call(this, error);
- });
-
- req.once('upgrade', function(res, socket, upgradeHead) {
- if (self.readyState == WebSocket.CLOSED) {
- // client closed before server accepted connection
- self.emit('close');
- self.removeAllListeners();
- socket.end();
- return;
- }
- var serverKey = res.headers['sec-websocket-accept'];
- if (typeof serverKey == 'undefined' || serverKey !== expectedServerKey) {
- self.emit('error', 'invalid server key');
- self.removeAllListeners();
- socket.end();
- return;
- }
-
- var serverProt = res.headers['sec-websocket-protocol'];
- var protList = (options.value.protocol || "").split(/, */);
- var protError = null;
- if (!options.value.protocol && serverProt) {
- protError = 'server sent a subprotocol even though none requested';
- } else if (options.value.protocol && !serverProt) {
- protError = 'server sent no subprotocol even though requested';
- } else if (serverProt && protList.indexOf(serverProt) === -1) {
- protError = 'server responded with an invalid protocol';
- }
- if (protError) {
- self.emit('error', protError);
- self.removeAllListeners();
- socket.end();
- return;
- } else if (serverProt) {
- self.protocol = serverProt;
- }
-
- establishConnection.call(self, Receiver, Sender, socket, upgradeHead);
-
- // perform cleanup on http resources
- req.removeAllListeners();
- req = null;
- agent = null;
- });
-
- req.end();
- this.readyState = WebSocket.CONNECTING;
-}
-
-function establishConnection(ReceiverClass, SenderClass, socket, upgradeHead) {
- this._socket = socket;
- socket.setTimeout(0);
- socket.setNoDelay(true);
- var self = this;
- this._receiver = new ReceiverClass();
-
- // socket cleanup handlers
- socket.on('end', cleanupWebsocketResources.bind(this));
- socket.on('close', cleanupWebsocketResources.bind(this));
- socket.on('error', cleanupWebsocketResources.bind(this));
-
- // ensure that the upgradeHead is added to the receiver
- function firstHandler(data) {
- if (self.readyState != WebSocket.OPEN) return;
- if (upgradeHead && upgradeHead.length > 0) {
- self.bytesReceived += upgradeHead.length;
- var head = upgradeHead;
- upgradeHead = null;
- self._receiver.add(head);
- }
- dataHandler = realHandler;
- if (data) {
- self.bytesReceived += data.length;
- self._receiver.add(data);
- }
- }
- // subsequent packets are pushed straight to the receiver
- function realHandler(data) {
- if (data) self.bytesReceived += data.length;
- self._receiver.add(data);
- }
- var dataHandler = firstHandler;
- // if data was passed along with the http upgrade,
- // this will schedule a push of that on to the receiver.
- // this has to be done on next tick, since the caller
- // hasn't had a chance to set event handlers on this client
- // object yet.
- process.nextTick(firstHandler);
-
- // receiver event handlers
- self._receiver.ontext = function (data, flags) {
- flags = flags || {};
- self.emit('message', data, flags);
- };
- self._receiver.onbinary = function (data, flags) {
- flags = flags || {};
- flags.binary = true;
- self.emit('message', data, flags);
- };
- self._receiver.onping = function(data, flags) {
- flags = flags || {};
- self.pong(data, {mask: !self._isServer, binary: flags.binary === true}, true);
- self.emit('ping', data, flags);
- };
- self._receiver.onpong = function(data, flags) {
- self.emit('pong', data, flags);
- };
- self._receiver.onclose = function(code, data, flags) {
- flags = flags || {};
- self.close(code, data);
- };
- self._receiver.onerror = function(reason, errorCode) {
- // close the connection when the receiver reports a HyBi error code
- self.close(typeof errorCode != 'undefined' ? errorCode : 1002, '');
- self.emit('error', reason, errorCode);
- };
-
- // finalize the client
- this._sender = new SenderClass(socket);
- this._sender.on('error', function(error) {
- self.close(1002, '');
- self.emit('error', error);
- });
- this.readyState = WebSocket.OPEN;
- this.emit('open');
-
- socket.on('data', dataHandler);
-}
-
-function startQueue(instance) {
- instance._queue = instance._queue || [];
-}
-
-function executeQueueSends(instance) {
- var queue = instance._queue;
- if (typeof queue == 'undefined') return;
- delete instance._queue;
- for (var i = 0, l = queue.length; i < l; ++i) {
- queue[i]();
- }
-}
-
-function sendStream(instance, stream, options, cb) {
- stream.on('data', function(data) {
- if (instance.readyState != WebSocket.OPEN) {
- if (typeof cb == 'function') cb(new Error('not opened'));
- else {
- delete instance._queue;
- instance.emit('error', new Error('not opened'));
- }
- return;
- }
- options.fin = false;
- instance._sender.send(data, options);
- });
- stream.on('end', function() {
- if (instance.readyState != WebSocket.OPEN) {
- if (typeof cb == 'function') cb(new Error('not opened'));
- else {
- delete instance._queue;
- instance.emit('error', new Error('not opened'));
- }
- return;
- }
- options.fin = true;
- instance._sender.send(null, options);
- if (typeof cb == 'function') cb(null);
- });
-}
-
-function cleanupWebsocketResources(error) {
- if (this.readyState == WebSocket.CLOSED) return;
- var emitClose = this.readyState != WebSocket.CONNECTING;
- this.readyState = WebSocket.CLOSED;
-
- clearTimeout(this._closeTimer);
- this._closeTimer = null;
- if (emitClose) this.emit('close', this._closeCode || 1000, this._closeMessage || '');
-
- if (this._socket) {
- this._socket.removeAllListeners();
- // catch all socket error after removing all standard handlers
- var socket = this._socket;
- this._socket.on('error', function() {
- try { socket.destroy(); } catch (e) {}
- });
- try {
- if (!error) this._socket.end();
- else this._socket.destroy();
- }
- catch (e) { /* Ignore termination errors */ }
- this._socket = null;
- }
- if (this._sender) {
- this._sender.removeAllListeners();
- this._sender = null;
- }
- if (this._receiver) {
- this._receiver.cleanup();
- this._receiver = null;
- }
- this.removeAllListeners();
- this.on('error', function() {}); // catch all errors after this
- delete this._queue;
-}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/WebSocketServer.js b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/WebSocketServer.js
deleted file mode 100644
index 5cbd195b42e..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/WebSocketServer.js
+++ /dev/null
@@ -1,465 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik
- * MIT Licensed
- */
-
-var util = require('util')
- , events = require('events')
- , http = require('http')
- , crypto = require('crypto')
- , Options = require('options')
- , WebSocket = require('./WebSocket')
- , tls = require('tls')
- , url = require('url');
-
-/**
- * WebSocket Server implementation
- */
-
-function WebSocketServer(options, callback) {
- options = new Options({
- host: '0.0.0.0',
- port: null,
- server: null,
- verifyClient: null,
- handleProtocols: null,
- path: null,
- noServer: false,
- disableHixie: false,
- clientTracking: true
- }).merge(options);
-
- if (!options.isDefinedAndNonNull('port') && !options.isDefinedAndNonNull('server') && !options.value.noServer) {
- throw new TypeError('`port` or a `server` must be provided');
- }
-
- var self = this;
-
- if (options.isDefinedAndNonNull('port')) {
- this._server = http.createServer(function (req, res) {
- res.writeHead(200, {'Content-Type': 'text/plain'});
- res.end('Not implemented');
- });
- this._server.listen(options.value.port, options.value.host, callback);
- this._closeServer = function() { if (self._server) self._server.close(); };
- }
- else if (options.value.server) {
- this._server = options.value.server;
- if (options.value.path) {
- // take note of the path, to avoid collisions when multiple websocket servers are
- // listening on the same http server
- if (this._server._webSocketPaths && options.value.server._webSocketPaths[options.value.path]) {
- throw new Error('two instances of WebSocketServer cannot listen on the same http server path');
- }
- if (typeof this._server._webSocketPaths !== 'object') {
- this._server._webSocketPaths = {};
- }
- this._server._webSocketPaths[options.value.path] = 1;
- }
- }
- if (this._server) this._server.once('listening', function() { self.emit('listening'); });
-
- if (typeof this._server != 'undefined') {
- this._server.on('error', function(error) {
- self.emit('error', error)
- });
- this._server.on('upgrade', function(req, socket, upgradeHead) {
- //copy upgradeHead to avoid retention of large slab buffers used in node core
- var head = new Buffer(upgradeHead.length);
- upgradeHead.copy(head);
-
- self.handleUpgrade(req, socket, head, function(client) {
- self.emit('connection'+req.url, client);
- self.emit('connection', client);
- });
- });
- }
-
- this.options = options.value;
- this.path = options.value.path;
- this.clients = [];
-}
-
-/**
- * Inherits from EventEmitter.
- */
-
-util.inherits(WebSocketServer, events.EventEmitter);
-
-/**
- * Immediately shuts down the connection.
- *
- * @api public
- */
-
-WebSocketServer.prototype.close = function() {
- // terminate all associated clients
- var error = null;
- try {
- for (var i = 0, l = this.clients.length; i < l; ++i) {
- this.clients[i].terminate();
- }
- }
- catch (e) {
- error = e;
- }
-
- // remove path descriptor, if any
- if (this.path && this._server._webSocketPaths) {
- delete this._server._webSocketPaths[this.path];
- if (Object.keys(this._server._webSocketPaths).length == 0) {
- delete this._server._webSocketPaths;
- }
- }
-
- // close the http server if it was internally created
- try {
- if (typeof this._closeServer !== 'undefined') {
- this._closeServer();
- }
- }
- finally {
- delete this._server;
- }
- if (error) throw error;
-}
-
-/**
- * Handle a HTTP Upgrade request.
- *
- * @api public
- */
-
-WebSocketServer.prototype.handleUpgrade = function(req, socket, upgradeHead, cb) {
- // check for wrong path
- if (this.options.path) {
- var u = url.parse(req.url);
- if (u && u.pathname !== this.options.path) return;
- }
-
- if (typeof req.headers.upgrade === 'undefined' || req.headers.upgrade.toLowerCase() !== 'websocket') {
- abortConnection(socket, 400, 'Bad Request');
- return;
- }
-
- if (req.headers['sec-websocket-key1']) handleHixieUpgrade.apply(this, arguments);
- else handleHybiUpgrade.apply(this, arguments);
-}
-
-module.exports = WebSocketServer;
-
-/**
- * Entirely private apis,
- * which may or may not be bound to a sepcific WebSocket instance.
- */
-
-function handleHybiUpgrade(req, socket, upgradeHead, cb) {
- // handle premature socket errors
- var errorHandler = function() {
- try { socket.destroy(); } catch (e) {}
- }
- socket.on('error', errorHandler);
-
- // verify key presence
- if (!req.headers['sec-websocket-key']) {
- abortConnection(socket, 400, 'Bad Request');
- return;
- }
-
- // verify version
- var version = parseInt(req.headers['sec-websocket-version']);
- if ([8, 13].indexOf(version) === -1) {
- abortConnection(socket, 400, 'Bad Request');
- return;
- }
-
- // verify protocol
- var protocols = req.headers['sec-websocket-protocol'];
-
- // verify client
- var origin = version < 13 ?
- req.headers['sec-websocket-origin'] :
- req.headers['origin'];
-
- // handler to call when the connection sequence completes
- var self = this;
- var completeHybiUpgrade2 = function(protocol) {
-
- // calc key
- var key = req.headers['sec-websocket-key'];
- var shasum = crypto.createHash('sha1');
- shasum.update(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
- key = shasum.digest('base64');
-
- var headers = [
- 'HTTP/1.1 101 Switching Protocols'
- , 'Upgrade: websocket'
- , 'Connection: Upgrade'
- , 'Sec-WebSocket-Accept: ' + key
- ];
-
- if (typeof protocol != 'undefined') {
- headers.push('Sec-WebSocket-Protocol: ' + protocol);
- }
-
- // allows external modification/inspection of handshake headers
- self.emit('headers', headers);
-
- socket.setTimeout(0);
- socket.setNoDelay(true);
- try {
- socket.write(headers.concat('', '').join('\r\n'));
- }
- catch (e) {
- // if the upgrade write fails, shut the connection down hard
- try { socket.destroy(); } catch (e) {}
- return;
- }
-
- var client = new WebSocket([req, socket, upgradeHead], {
- protocolVersion: version,
- protocol: protocol
- });
-
- if (self.options.clientTracking) {
- self.clients.push(client);
- client.on('close', function() {
- var index = self.clients.indexOf(client);
- if (index != -1) {
- self.clients.splice(index, 1);
- }
- });
- }
-
- // signal upgrade complete
- socket.removeListener('error', errorHandler);
- cb(client);
- }
-
- // optionally call external protocol selection handler before
- // calling completeHybiUpgrade2
- var completeHybiUpgrade1 = function() {
- // choose from the sub-protocols
- if (typeof self.options.handleProtocols == 'function') {
- var protList = (protocols || "").split(/, */);
- var callbackCalled = false;
- var res = self.options.handleProtocols(protList, function(result, protocol) {
- callbackCalled = true;
- if (!result) abortConnection(socket, 404, 'Unauthorized')
- else completeHybiUpgrade2(protocol);
- });
- if (!callbackCalled) {
- // the handleProtocols handler never called our callback
- abortConnection(socket, 501, 'Could not process protocols');
- }
- return;
- } else {
- if (typeof protocols !== 'undefined') {
- completeHybiUpgrade2(protocols.split(/, */)[0]);
- }
- else {
- completeHybiUpgrade2();
- }
- }
- }
-
- // optionally call external client verification handler
- if (typeof this.options.verifyClient == 'function') {
- var info = {
- origin: origin,
- secure: typeof req.connection.authorized !== 'undefined' || typeof req.connection.encrypted !== 'undefined',
- req: req
- };
- if (this.options.verifyClient.length == 2) {
- this.options.verifyClient(info, function(result, code, name) {
- if (typeof code === 'undefined') code = 401;
- if (typeof name === 'undefined') name = http.STATUS_CODES[code];
-
- if (!result) abortConnection(socket, code, name);
- else completeHybiUpgrade1();
- });
- return;
- }
- else if (!this.options.verifyClient(info)) {
- abortConnection(socket, 401, 'Unauthorized');
- return;
- }
- }
-
- completeHybiUpgrade1();
-}
-
-function handleHixieUpgrade(req, socket, upgradeHead, cb) {
- // handle premature socket errors
- var errorHandler = function() {
- try { socket.destroy(); } catch (e) {}
- }
- socket.on('error', errorHandler);
-
- // bail if options prevent hixie
- if (this.options.disableHixie) {
- abortConnection(socket, 401, 'Hixie support disabled');
- return;
- }
-
- // verify key presence
- if (!req.headers['sec-websocket-key2']) {
- abortConnection(socket, 400, 'Bad Request');
- return;
- }
-
- var origin = req.headers['origin']
- , self = this;
-
- // setup handshake completion to run after client has been verified
- var onClientVerified = function() {
- var wshost;
- if (!req.headers['x-forwarded-host'])
- wshost = req.headers.host;
- else
- wshost = req.headers['x-forwarded-host'];
- var location = ((req.headers['x-forwarded-proto'] === 'https' || socket.encrypted) ? 'wss' : 'ws') + '://' + wshost + req.url
- , protocol = req.headers['sec-websocket-protocol'];
-
- // handshake completion code to run once nonce has been successfully retrieved
- var completeHandshake = function(nonce, rest) {
- // calculate key
- var k1 = req.headers['sec-websocket-key1']
- , k2 = req.headers['sec-websocket-key2']
- , md5 = crypto.createHash('md5');
-
- [k1, k2].forEach(function (k) {
- var n = parseInt(k.replace(/[^\d]/g, ''))
- , spaces = k.replace(/[^ ]/g, '').length;
- if (spaces === 0 || n % spaces !== 0){
- abortConnection(socket, 400, 'Bad Request');
- return;
- }
- n /= spaces;
- md5.update(String.fromCharCode(
- n >> 24 & 0xFF,
- n >> 16 & 0xFF,
- n >> 8 & 0xFF,
- n & 0xFF));
- });
- md5.update(nonce.toString('binary'));
-
- var headers = [
- 'HTTP/1.1 101 Switching Protocols'
- , 'Upgrade: WebSocket'
- , 'Connection: Upgrade'
- , 'Sec-WebSocket-Location: ' + location
- ];
- if (typeof protocol != 'undefined') headers.push('Sec-WebSocket-Protocol: ' + protocol);
- if (typeof origin != 'undefined') headers.push('Sec-WebSocket-Origin: ' + origin);
-
- socket.setTimeout(0);
- socket.setNoDelay(true);
- try {
- // merge header and hash buffer
- var headerBuffer = new Buffer(headers.concat('', '').join('\r\n'));
- var hashBuffer = new Buffer(md5.digest('binary'), 'binary');
- var handshakeBuffer = new Buffer(headerBuffer.length + hashBuffer.length);
- headerBuffer.copy(handshakeBuffer, 0);
- hashBuffer.copy(handshakeBuffer, headerBuffer.length);
-
- // do a single write, which - upon success - causes a new client websocket to be setup
- socket.write(handshakeBuffer, 'binary', function(err) {
- if (err) return; // do not create client if an error happens
- var client = new WebSocket([req, socket, rest], {
- protocolVersion: 'hixie-76',
- protocol: protocol
- });
- if (self.options.clientTracking) {
- self.clients.push(client);
- client.on('close', function() {
- var index = self.clients.indexOf(client);
- if (index != -1) {
- self.clients.splice(index, 1);
- }
- });
- }
-
- // signal upgrade complete
- socket.removeListener('error', errorHandler);
- cb(client);
- });
- }
- catch (e) {
- try { socket.destroy(); } catch (e) {}
- return;
- }
- }
-
- // retrieve nonce
- var nonceLength = 8;
- if (upgradeHead && upgradeHead.length >= nonceLength) {
- var nonce = upgradeHead.slice(0, nonceLength);
- var rest = upgradeHead.length > nonceLength ? upgradeHead.slice(nonceLength) : null;
- completeHandshake.call(self, nonce, rest);
- }
- else {
- // nonce not present in upgradeHead, so we must wait for enough data
- // data to arrive before continuing
- var nonce = new Buffer(nonceLength);
- upgradeHead.copy(nonce, 0);
- var received = upgradeHead.length;
- var rest = null;
- var handler = function (data) {
- var toRead = Math.min(data.length, nonceLength - received);
- if (toRead === 0) return;
- data.copy(nonce, received, 0, toRead);
- received += toRead;
- if (received == nonceLength) {
- socket.removeListener('data', handler);
- if (toRead < data.length) rest = data.slice(toRead);
- completeHandshake.call(self, nonce, rest);
- }
- }
- socket.on('data', handler);
- }
- }
-
- // verify client
- if (typeof this.options.verifyClient == 'function') {
- var info = {
- origin: origin,
- secure: typeof req.connection.authorized !== 'undefined' || typeof req.connection.encrypted !== 'undefined',
- req: req
- };
- if (this.options.verifyClient.length == 2) {
- var self = this;
- this.options.verifyClient(info, function(result, code, name) {
- if (typeof code === 'undefined') code = 401;
- if (typeof name === 'undefined') name = http.STATUS_CODES[code];
-
- if (!result) abortConnection(socket, code, name);
- else onClientVerified.apply(self);
- });
- return;
- }
- else if (!this.options.verifyClient(info)) {
- abortConnection(socket, 401, 'Unauthorized');
- return;
- }
- }
-
- // no client verification required
- onClientVerified();
-}
-
-function abortConnection(socket, code, name) {
- try {
- var response = [
- 'HTTP/1.1 ' + code + ' ' + name,
- 'Content-type: text/html'
- ];
- socket.write(response.concat('', '').join('\r\n'));
- }
- catch (e) { /* ignore errors - we've aborted this connection */ }
- finally {
- // ensure that an early aborted connection is shut down completely
- try { socket.destroy(); } catch (e) {}
- }
-}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/browser.js b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/browser.js
deleted file mode 100644
index 8d3a755cd57..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/lib/browser.js
+++ /dev/null
@@ -1,43 +0,0 @@
-
-/**
- * Module dependencies.
- */
-
-var global = (function() { return this; })();
-
-/**
- * WebSocket constructor.
- */
-
-var WebSocket = global.WebSocket || global.MozWebSocket;
-
-/**
- * Module exports.
- */
-
-module.exports = WebSocket ? ws : null;
-
-/**
- * WebSocket constructor.
- *
- * The third `opts` options object gets ignored in web browsers, since it's
- * non-standard, and throws a TypeError if passed to the constructor.
- * See: https://github.com/einaros/ws/issues/227
- *
- * @param {String} uri
- * @param {Array} protocols (optional)
- * @param {Object) opts (optional)
- * @api public
- */
-
-function ws(uri, protocols, opts) {
- var instance;
- if (protocols) {
- instance = new WebSocket(uri, protocols);
- } else {
- instance = new WebSocket(uri);
- }
- return instance;
-}
-
-if (WebSocket) ws.prototype = WebSocket.prototype;
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/commander/Readme.md b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/commander/Readme.md
deleted file mode 100644
index d1644012c51..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/commander/Readme.md
+++ /dev/null
@@ -1,195 +0,0 @@
-# Commander.js
-
- The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander).
-
- [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js)
-
-## Installation
-
- $ npm install commander
-
-## Option parsing
-
- Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
- .version('0.0.1')
- .option('-p, --peppers', 'Add peppers')
- .option('-P, --pineapple', 'Add pineapple')
- .option('-b, --bbq', 'Add bbq sauce')
- .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
- .parse(process.argv);
-
-console.log('you ordered a pizza with:');
-if (program.peppers) console.log(' - peppers');
-if (program.pineapple) console.log(' - pineapple');
-if (program.bbq) console.log(' - bbq');
-console.log(' - %s cheese', program.cheese);
-```
-
- Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc.
-
-## Automated --help
-
- The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:
-
-```
- $ ./examples/pizza --help
-
- Usage: pizza [options]
-
- Options:
-
- -V, --version output the version number
- -p, --peppers Add peppers
- -P, --pineapple Add pineapple
- -b, --bbq Add bbq sauce
- -c, --cheese Add the specified type of cheese [marble]
- -h, --help output usage information
-
-```
-
-## Coercion
-
-```js
-function range(val) {
- return val.split('..').map(Number);
-}
-
-function list(val) {
- return val.split(',');
-}
-
-program
- .version('0.0.1')
- .usage('[options] ')
- .option('-i, --integer ', 'An integer argument', parseInt)
- .option('-f, --float ', 'A float argument', parseFloat)
- .option('-r, --range ..', 'A range', range)
- .option('-l, --list ', 'A list', list)
- .option('-o, --optional [value]', 'An optional value')
- .parse(process.argv);
-
-console.log(' int: %j', program.integer);
-console.log(' float: %j', program.float);
-console.log(' optional: %j', program.optional);
-program.range = program.range || [];
-console.log(' range: %j..%j', program.range[0], program.range[1]);
-console.log(' list: %j', program.list);
-console.log(' args: %j', program.args);
-```
-
-## Custom help
-
- You can display arbitrary `-h, --help` information
- by listening for "--help". Commander will automatically
- exit once you are done so that the remainder of your program
- does not execute causing undesired behaviours, for example
- in the following executable "stuff" will not output when
- `--help` is used.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('../');
-
-function list(val) {
- return val.split(',').map(Number);
-}
-
-program
- .version('0.0.1')
- .option('-f, --foo', 'enable some foo')
- .option('-b, --bar', 'enable some bar')
- .option('-B, --baz', 'enable some baz');
-
-// must be before .parse() since
-// node's emit() is immediate
-
-program.on('--help', function(){
- console.log(' Examples:');
- console.log('');
- console.log(' $ custom-help --help');
- console.log(' $ custom-help -h');
- console.log('');
-});
-
-program.parse(process.argv);
-
-console.log('stuff');
-```
-
-yielding the following help output:
-
-```
-
-Usage: custom-help [options]
-
-Options:
-
- -h, --help output usage information
- -V, --version output the version number
- -f, --foo enable some foo
- -b, --bar enable some bar
- -B, --baz enable some baz
-
-Examples:
-
- $ custom-help --help
- $ custom-help -h
-
-```
-
-## .outputHelp()
-
- Output help information without exiting.
-
-## .help()
-
- Output help information and exit immediately.
-
-## Links
-
- - [API documentation](http://visionmedia.github.com/commander.js/)
- - [ascii tables](https://github.com/LearnBoost/cli-table)
- - [progress bars](https://github.com/visionmedia/node-progress)
- - [more progress bars](https://github.com/substack/node-multimeter)
- - [examples](https://github.com/visionmedia/commander.js/tree/master/examples)
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/commander/index.js b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/commander/index.js
deleted file mode 100644
index 790a7519bdc..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/commander/index.js
+++ /dev/null
@@ -1,851 +0,0 @@
-
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('events').EventEmitter;
-var spawn = require('child_process').spawn;
-var fs = require('fs');
-var exists = fs.existsSync;
-var path = require('path');
-var dirname = path.dirname;
-var basename = path.basename;
-
-/**
- * Expose the root command.
- */
-
-exports = module.exports = new Command;
-
-/**
- * Expose `Command`.
- */
-
-exports.Command = Command;
-
-/**
- * Expose `Option`.
- */
-
-exports.Option = Option;
-
-/**
- * Initialize a new `Option` with the given `flags` and `description`.
- *
- * @param {String} flags
- * @param {String} description
- * @api public
- */
-
-function Option(flags, description) {
- this.flags = flags;
- this.required = ~flags.indexOf('<');
- this.optional = ~flags.indexOf('[');
- this.bool = !~flags.indexOf('-no-');
- flags = flags.split(/[ ,|]+/);
- if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();
- this.long = flags.shift();
- this.description = description || '';
-}
-
-/**
- * Return option name.
- *
- * @return {String}
- * @api private
- */
-
-Option.prototype.name = function(){
- return this.long
- .replace('--', '')
- .replace('no-', '');
-};
-
-/**
- * Check if `arg` matches the short or long flag.
- *
- * @param {String} arg
- * @return {Boolean}
- * @api private
- */
-
-Option.prototype.is = function(arg){
- return arg == this.short
- || arg == this.long;
-};
-
-/**
- * Initialize a new `Command`.
- *
- * @param {String} name
- * @api public
- */
-
-function Command(name) {
- this.commands = [];
- this.options = [];
- this._execs = [];
- this._args = [];
- this._name = name;
-}
-
-/**
- * Inherit from `EventEmitter.prototype`.
- */
-
-Command.prototype.__proto__ = EventEmitter.prototype;
-
-/**
- * Add command `name`.
- *
- * The `.action()` callback is invoked when the
- * command `name` is specified via __ARGV__,
- * and the remaining arguments are applied to the
- * function for access.
- *
- * When the `name` is "*" an un-matched command
- * will be passed as the first arg, followed by
- * the rest of __ARGV__ remaining.
- *
- * Examples:
- *
- * program
- * .version('0.0.1')
- * .option('-C, --chdir ', 'change the working directory')
- * .option('-c, --config ', 'set config path. defaults to ./deploy.conf')
- * .option('-T, --no-tests', 'ignore test hook')
- *
- * program
- * .command('setup')
- * .description('run remote setup commands')
- * .action(function(){
- * console.log('setup');
- * });
- *
- * program
- * .command('exec ')
- * .description('run the given remote command')
- * .action(function(cmd){
- * console.log('exec "%s"', cmd);
- * });
- *
- * program
- * .command('*')
- * .description('deploy the given env')
- * .action(function(env){
- * console.log('deploying "%s"', env);
- * });
- *
- * program.parse(process.argv);
- *
- * @param {String} name
- * @param {String} [desc]
- * @return {Command} the new command
- * @api public
- */
-
-Command.prototype.command = function(name, desc){
- var args = name.split(/ +/);
- var cmd = new Command(args.shift());
- if (desc) cmd.description(desc);
- if (desc) this.executables = true;
- if (desc) this._execs[cmd._name] = true;
- this.commands.push(cmd);
- cmd.parseExpectedArgs(args);
- cmd.parent = this;
- if (desc) return this;
- return cmd;
-};
-
-/**
- * Add an implicit `help [cmd]` subcommand
- * which invokes `--help` for the given command.
- *
- * @api private
- */
-
-Command.prototype.addImplicitHelpCommand = function() {
- this.command('help [cmd]', 'display help for [cmd]');
-};
-
-/**
- * Parse expected `args`.
- *
- * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
- *
- * @param {Array} args
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.parseExpectedArgs = function(args){
- if (!args.length) return;
- var self = this;
- args.forEach(function(arg){
- switch (arg[0]) {
- case '<':
- self._args.push({ required: true, name: arg.slice(1, -1) });
- break;
- case '[':
- self._args.push({ required: false, name: arg.slice(1, -1) });
- break;
- }
- });
- return this;
-};
-
-/**
- * Register callback `fn` for the command.
- *
- * Examples:
- *
- * program
- * .command('help')
- * .description('display verbose help')
- * .action(function(){
- * // output help here
- * });
- *
- * @param {Function} fn
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.action = function(fn){
- var self = this;
- this.parent.on(this._name, function(args, unknown){
- // Parse any so-far unknown options
- unknown = unknown || [];
- var parsed = self.parseOptions(unknown);
-
- // Output help if necessary
- outputHelpIfNecessary(self, parsed.unknown);
-
- // If there are still any unknown options, then we simply
- // die, unless someone asked for help, in which case we give it
- // to them, and then we die.
- if (parsed.unknown.length > 0) {
- self.unknownOption(parsed.unknown[0]);
- }
-
- // Leftover arguments need to be pushed back. Fixes issue #56
- if (parsed.args.length) args = parsed.args.concat(args);
-
- self._args.forEach(function(arg, i){
- if (arg.required && null == args[i]) {
- self.missingArgument(arg.name);
- }
- });
-
- // Always append ourselves to the end of the arguments,
- // to make sure we match the number of arguments the user
- // expects
- if (self._args.length) {
- args[self._args.length] = self;
- } else {
- args.push(self);
- }
-
- fn.apply(this, args);
- });
- return this;
-};
-
-/**
- * Define option with `flags`, `description` and optional
- * coercion `fn`.
- *
- * The `flags` string should contain both the short and long flags,
- * separated by comma, a pipe or space. The following are all valid
- * all will output this way when `--help` is used.
- *
- * "-p, --pepper"
- * "-p|--pepper"
- * "-p --pepper"
- *
- * Examples:
- *
- * // simple boolean defaulting to false
- * program.option('-p, --pepper', 'add pepper');
- *
- * --pepper
- * program.pepper
- * // => Boolean
- *
- * // simple boolean defaulting to false
- * program.option('-C, --no-cheese', 'remove cheese');
- *
- * program.cheese
- * // => true
- *
- * --no-cheese
- * program.cheese
- * // => true
- *
- * // required argument
- * program.option('-C, --chdir ', 'change the working directory');
- *
- * --chdir /tmp
- * program.chdir
- * // => "/tmp"
- *
- * // optional argument
- * program.option('-c, --cheese [type]', 'add cheese [marble]');
- *
- * @param {String} flags
- * @param {String} description
- * @param {Function|Mixed} fn or default
- * @param {Mixed} defaultValue
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.option = function(flags, description, fn, defaultValue){
- var self = this
- , option = new Option(flags, description)
- , oname = option.name()
- , name = camelcase(oname);
-
- // default as 3rd arg
- if ('function' != typeof fn) defaultValue = fn, fn = null;
-
- // preassign default value only for --no-*, [optional], or
- if (false == option.bool || option.optional || option.required) {
- // when --no-* we make sure default is true
- if (false == option.bool) defaultValue = true;
- // preassign only if we have a default
- if (undefined !== defaultValue) self[name] = defaultValue;
- }
-
- // register the option
- this.options.push(option);
-
- // when it's passed assign the value
- // and conditionally invoke the callback
- this.on(oname, function(val){
- // coercion
- if (null != val && fn) val = fn(val);
-
- // unassigned or bool
- if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) {
- // if no value, bool true, and we have a default, then use it!
- if (null == val) {
- self[name] = option.bool
- ? defaultValue || true
- : false;
- } else {
- self[name] = val;
- }
- } else if (null !== val) {
- // reassign
- self[name] = val;
- }
- });
-
- return this;
-};
-
-/**
- * Parse `argv`, settings options and invoking commands when defined.
- *
- * @param {Array} argv
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.parse = function(argv){
- // implicit help
- if (this.executables) this.addImplicitHelpCommand();
-
- // store raw args
- this.rawArgs = argv;
-
- // guess name
- this._name = this._name || basename(argv[1]);
-
- // process argv
- var parsed = this.parseOptions(this.normalize(argv.slice(2)));
- var args = this.args = parsed.args;
-
- var result = this.parseArgs(this.args, parsed.unknown);
-
- // executable sub-commands
- var name = result.args[0];
- if (this._execs[name]) return this.executeSubCommand(argv, args, parsed.unknown);
-
- return result;
-};
-
-/**
- * Execute a sub-command executable.
- *
- * @param {Array} argv
- * @param {Array} args
- * @param {Array} unknown
- * @api private
- */
-
-Command.prototype.executeSubCommand = function(argv, args, unknown) {
- args = args.concat(unknown);
-
- if (!args.length) this.help();
- if ('help' == args[0] && 1 == args.length) this.help();
-
- // --help
- if ('help' == args[0]) {
- args[0] = args[1];
- args[1] = '--help';
- }
-
- // executable
- var dir = dirname(argv[1]);
- var bin = basename(argv[1]) + '-' + args[0];
-
- // check for ./ first
- var local = path.join(dir, bin);
-
- // run it
- args = args.slice(1);
- var proc = spawn(local, args, { stdio: 'inherit', customFds: [0, 1, 2] });
- proc.on('error', function(err){
- if (err.code == "ENOENT") {
- console.error('\n %s(1) does not exist, try --help\n', bin);
- } else if (err.code == "EACCES") {
- console.error('\n %s(1) not executable. try chmod or run with root\n', bin);
- }
- });
-
- this.runningCommand = proc;
-};
-
-/**
- * Normalize `args`, splitting joined short flags. For example
- * the arg "-abc" is equivalent to "-a -b -c".
- * This also normalizes equal sign and splits "--abc=def" into "--abc def".
- *
- * @param {Array} args
- * @return {Array}
- * @api private
- */
-
-Command.prototype.normalize = function(args){
- var ret = []
- , arg
- , lastOpt
- , index;
-
- for (var i = 0, len = args.length; i < len; ++i) {
- arg = args[i];
- i > 0 && (lastOpt = this.optionFor(args[i-1]));
-
- if (lastOpt && lastOpt.required) {
- ret.push(arg);
- } else if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) {
- arg.slice(1).split('').forEach(function(c){
- ret.push('-' + c);
- });
- } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) {
- ret.push(arg.slice(0, index), arg.slice(index + 1));
- } else {
- ret.push(arg);
- }
- }
-
- return ret;
-};
-
-/**
- * Parse command `args`.
- *
- * When listener(s) are available those
- * callbacks are invoked, otherwise the "*"
- * event is emitted and those actions are invoked.
- *
- * @param {Array} args
- * @return {Command} for chaining
- * @api private
- */
-
-Command.prototype.parseArgs = function(args, unknown){
- var cmds = this.commands
- , len = cmds.length
- , name;
-
- if (args.length) {
- name = args[0];
- if (this.listeners(name).length) {
- this.emit(args.shift(), args, unknown);
- } else {
- this.emit('*', args);
- }
- } else {
- outputHelpIfNecessary(this, unknown);
-
- // If there were no args and we have unknown options,
- // then they are extraneous and we need to error.
- if (unknown.length > 0) {
- this.unknownOption(unknown[0]);
- }
- }
-
- return this;
-};
-
-/**
- * Return an option matching `arg` if any.
- *
- * @param {String} arg
- * @return {Option}
- * @api private
- */
-
-Command.prototype.optionFor = function(arg){
- for (var i = 0, len = this.options.length; i < len; ++i) {
- if (this.options[i].is(arg)) {
- return this.options[i];
- }
- }
-};
-
-/**
- * Parse options from `argv` returning `argv`
- * void of these options.
- *
- * @param {Array} argv
- * @return {Array}
- * @api public
- */
-
-Command.prototype.parseOptions = function(argv){
- var args = []
- , len = argv.length
- , literal
- , option
- , arg;
-
- var unknownOptions = [];
-
- // parse options
- for (var i = 0; i < len; ++i) {
- arg = argv[i];
-
- // literal args after --
- if ('--' == arg) {
- literal = true;
- continue;
- }
-
- if (literal) {
- args.push(arg);
- continue;
- }
-
- // find matching Option
- option = this.optionFor(arg);
-
- // option is defined
- if (option) {
- // requires arg
- if (option.required) {
- arg = argv[++i];
- if (null == arg) return this.optionMissingArgument(option);
- this.emit(option.name(), arg);
- // optional arg
- } else if (option.optional) {
- arg = argv[i+1];
- if (null == arg || ('-' == arg[0] && '-' != arg)) {
- arg = null;
- } else {
- ++i;
- }
- this.emit(option.name(), arg);
- // bool
- } else {
- this.emit(option.name());
- }
- continue;
- }
-
- // looks like an option
- if (arg.length > 1 && '-' == arg[0]) {
- unknownOptions.push(arg);
-
- // If the next argument looks like it might be
- // an argument for this option, we pass it on.
- // If it isn't, then it'll simply be ignored
- if (argv[i+1] && '-' != argv[i+1][0]) {
- unknownOptions.push(argv[++i]);
- }
- continue;
- }
-
- // arg
- args.push(arg);
- }
-
- return { args: args, unknown: unknownOptions };
-};
-
-/**
- * Argument `name` is missing.
- *
- * @param {String} name
- * @api private
- */
-
-Command.prototype.missingArgument = function(name){
- console.error();
- console.error(" error: missing required argument `%s'", name);
- console.error();
- process.exit(1);
-};
-
-/**
- * `Option` is missing an argument, but received `flag` or nothing.
- *
- * @param {String} option
- * @param {String} flag
- * @api private
- */
-
-Command.prototype.optionMissingArgument = function(option, flag){
- console.error();
- if (flag) {
- console.error(" error: option `%s' argument missing, got `%s'", option.flags, flag);
- } else {
- console.error(" error: option `%s' argument missing", option.flags);
- }
- console.error();
- process.exit(1);
-};
-
-/**
- * Unknown option `flag`.
- *
- * @param {String} flag
- * @api private
- */
-
-Command.prototype.unknownOption = function(flag){
- console.error();
- console.error(" error: unknown option `%s'", flag);
- console.error();
- process.exit(1);
-};
-
-
-/**
- * Set the program version to `str`.
- *
- * This method auto-registers the "-V, --version" flag
- * which will print the version number when passed.
- *
- * @param {String} str
- * @param {String} flags
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.version = function(str, flags){
- if (0 == arguments.length) return this._version;
- this._version = str;
- flags = flags || '-V, --version';
- this.option(flags, 'output the version number');
- this.on('version', function(){
- console.log(str);
- process.exit(0);
- });
- return this;
-};
-
-/**
- * Set the description `str`.
- *
- * @param {String} str
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.description = function(str){
- if (0 == arguments.length) return this._description;
- this._description = str;
- return this;
-};
-
-/**
- * Set / get the command usage `str`.
- *
- * @param {String} str
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.usage = function(str){
- var args = this._args.map(function(arg){
- return arg.required
- ? '<' + arg.name + '>'
- : '[' + arg.name + ']';
- });
-
- var usage = '[options'
- + (this.commands.length ? '] [command' : '')
- + ']'
- + (this._args.length ? ' ' + args : '');
-
- if (0 == arguments.length) return this._usage || usage;
- this._usage = str;
-
- return this;
-};
-
-/**
- * Return the largest option length.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.largestOptionLength = function(){
- return this.options.reduce(function(max, option){
- return Math.max(max, option.flags.length);
- }, 0);
-};
-
-/**
- * Return help for options.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.optionHelp = function(){
- var width = this.largestOptionLength();
-
- // Prepend the help information
- return [pad('-h, --help', width) + ' ' + 'output usage information']
- .concat(this.options.map(function(option){
- return pad(option.flags, width)
- + ' ' + option.description;
- }))
- .join('\n');
-};
-
-/**
- * Return command help documentation.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.commandHelp = function(){
- if (!this.commands.length) return '';
- return [
- ''
- , ' Commands:'
- , ''
- , this.commands.map(function(cmd){
- var args = cmd._args.map(function(arg){
- return arg.required
- ? '<' + arg.name + '>'
- : '[' + arg.name + ']';
- }).join(' ');
-
- return pad(cmd._name
- + (cmd.options.length
- ? ' [options]'
- : '') + ' ' + args, 22)
- + (cmd.description()
- ? ' ' + cmd.description()
- : '');
- }).join('\n').replace(/^/gm, ' ')
- , ''
- ].join('\n');
-};
-
-/**
- * Return program help documentation.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.helpInformation = function(){
- return [
- ''
- , ' Usage: ' + this._name + ' ' + this.usage()
- , '' + this.commandHelp()
- , ' Options:'
- , ''
- , '' + this.optionHelp().replace(/^/gm, ' ')
- , ''
- , ''
- ].join('\n');
-};
-
-/**
- * Output help information for this command
- *
- * @api public
- */
-
-Command.prototype.outputHelp = function(){
- process.stdout.write(this.helpInformation());
- this.emit('--help');
-};
-
-/**
- * Output help information and exit.
- *
- * @api public
- */
-
-Command.prototype.help = function(){
- this.outputHelp();
- process.exit();
-};
-
-/**
- * Camel-case the given `flag`
- *
- * @param {String} flag
- * @return {String}
- * @api private
- */
-
-function camelcase(flag) {
- return flag.split('-').reduce(function(str, word){
- return str + word[0].toUpperCase() + word.slice(1);
- });
-}
-
-/**
- * Pad `str` to `width`.
- *
- * @param {String} str
- * @param {Number} width
- * @return {String}
- * @api private
- */
-
-function pad(str, width) {
- var len = Math.max(0, width - str.length);
- return str + Array(len + 1).join(' ');
-}
-
-/**
- * Output help information if necessary
- *
- * @param {Command} command to output help for
- * @param {Array} array of options to search for -h or --help
- * @api private
- */
-
-function outputHelpIfNecessary(cmd, options) {
- options = options || [];
- for (var i = 0; i < options.length; i++) {
- if (options[i] == '--help' || options[i] == '-h') {
- cmd.outputHelp();
- process.exit(0);
- }
- }
-}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/commander/package.json b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/commander/package.json
deleted file mode 100644
index bdafc5ca911..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/commander/package.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "name": "commander",
- "version": "2.1.0",
- "description": "the complete solution for node.js command-line programs",
- "keywords": [
- "command",
- "option",
- "parser",
- "prompt",
- "stdin"
- ],
- "author": {
- "name": "TJ Holowaychuk",
- "email": "tj@vision-media.ca"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/visionmedia/commander.js.git"
- },
- "devDependencies": {
- "should": ">= 0.0.1"
- },
- "scripts": {
- "test": "make test"
- },
- "main": "index",
- "engines": {
- "node": ">= 0.6.x"
- },
- "files": [
- "index.js"
- ],
- "readme": "# Commander.js\n\n The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander).\n\n [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js)\n\n## Installation\n\n $ npm install commander\n\n## Option parsing\n\n Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('commander');\n\nprogram\n .version('0.0.1')\n .option('-p, --peppers', 'Add peppers')\n .option('-P, --pineapple', 'Add pineapple')\n .option('-b, --bbq', 'Add bbq sauce')\n .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')\n .parse(process.argv);\n\nconsole.log('you ordered a pizza with:');\nif (program.peppers) console.log(' - peppers');\nif (program.pineapple) console.log(' - pineapple');\nif (program.bbq) console.log(' - bbq');\nconsole.log(' - %s cheese', program.cheese);\n```\n\n Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as \"--template-engine\" are camel-cased, becoming `program.templateEngine` etc.\n\n## Automated --help\n\n The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:\n\n``` \n $ ./examples/pizza --help\n\n Usage: pizza [options]\n\n Options:\n\n -V, --version output the version number\n -p, --peppers Add peppers\n -P, --pineapple Add pineapple\n -b, --bbq Add bbq sauce\n -c, --cheese Add the specified type of cheese [marble]\n -h, --help output usage information\n\n```\n\n## Coercion\n\n```js\nfunction range(val) {\n return val.split('..').map(Number);\n}\n\nfunction list(val) {\n return val.split(',');\n}\n\nprogram\n .version('0.0.1')\n .usage('[options] ')\n .option('-i, --integer ', 'An integer argument', parseInt)\n .option('-f, --float ', 'A float argument', parseFloat)\n .option('-r, --range ..', 'A range', range)\n .option('-l, --list ', 'A list', list)\n .option('-o, --optional [value]', 'An optional value')\n .parse(process.argv);\n\nconsole.log(' int: %j', program.integer);\nconsole.log(' float: %j', program.float);\nconsole.log(' optional: %j', program.optional);\nprogram.range = program.range || [];\nconsole.log(' range: %j..%j', program.range[0], program.range[1]);\nconsole.log(' list: %j', program.list);\nconsole.log(' args: %j', program.args);\n```\n\n## Custom help\n\n You can display arbitrary `-h, --help` information\n by listening for \"--help\". Commander will automatically\n exit once you are done so that the remainder of your program\n does not execute causing undesired behaviours, for example\n in the following executable \"stuff\" will not output when\n `--help` is used.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('../');\n\nfunction list(val) {\n return val.split(',').map(Number);\n}\n\nprogram\n .version('0.0.1')\n .option('-f, --foo', 'enable some foo')\n .option('-b, --bar', 'enable some bar')\n .option('-B, --baz', 'enable some baz');\n\n// must be before .parse() since\n// node's emit() is immediate\n\nprogram.on('--help', function(){\n console.log(' Examples:');\n console.log('');\n console.log(' $ custom-help --help');\n console.log(' $ custom-help -h');\n console.log('');\n});\n\nprogram.parse(process.argv);\n\nconsole.log('stuff');\n```\n\nyielding the following help output:\n\n```\n\nUsage: custom-help [options]\n\nOptions:\n\n -h, --help output usage information\n -V, --version output the version number\n -f, --foo enable some foo\n -b, --bar enable some bar\n -B, --baz enable some baz\n\nExamples:\n\n $ custom-help --help\n $ custom-help -h\n\n```\n\n## .outputHelp()\n\n Output help information without exiting.\n\n## .help()\n\n Output help information and exit immediately.\n\n## Links\n\n - [API documentation](http://visionmedia.github.com/commander.js/)\n - [ascii tables](https://github.com/LearnBoost/cli-table)\n - [progress bars](https://github.com/visionmedia/node-progress)\n - [more progress bars](https://github.com/substack/node-multimeter)\n - [examples](https://github.com/visionmedia/commander.js/tree/master/examples)\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
- "readmeFilename": "Readme.md",
- "bugs": {
- "url": "https://github.com/visionmedia/commander.js/issues"
- },
- "homepage": "https://github.com/visionmedia/commander.js",
- "_id": "commander@2.1.0",
- "_from": "commander@~2.1.0"
-}
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/nan/.dntrc b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/nan/.dntrc
deleted file mode 100644
index 1c3e6243a30..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/nan/.dntrc
+++ /dev/null
@@ -1,36 +0,0 @@
-## DNT config file
-## see https://github.com/rvagg/dnt
-
-NODE_VERSIONS="\
- master \
- v0.11.13 \
- v0.11.10 \
- v0.11.9 \
- v0.11.8 \
- v0.11.7 \
- v0.11.6 \
- v0.11.5 \
- v0.11.4 \
- v0.10.26 \
- v0.10.25 \
- v0.10.24 \
- v0.10.23 \
- v0.10.22 \
- v0.10.21 \
- v0.10.20 \
- v0.10.19 \
- v0.10.18 \
- v0.8.26 \
- v0.8.25 \
- v0.8.24 \
- v0.8.23 \
- v0.8.22 \
-"
-OUTPUT_PREFIX="nan-"
-TEST_CMD="\
- cd /dnt/test/ && \
- npm install && \
- node_modules/.bin/node-gyp --nodedir /usr/src/node/ rebuild && \
- node_modules/.bin/tap --gc js/*-test.js; \
-"
-
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/nan/LICENSE b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/nan/LICENSE
deleted file mode 100644
index d502e18a193..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/nan/LICENSE
+++ /dev/null
@@ -1,46 +0,0 @@
-Copyright 2013, NAN contributors:
- - Rod Vagg
- - Benjamin Byholm
- - Trevor Norris
- - Nathan Rajlich
- - Brett Lawson
- - Ben Noordhuis
-(the "Original Author")
-All rights reserved.
-
-MIT +no-false-attribs License
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-Distributions of all or part of the Software intended to be used
-by the recipients as they would use the unmodified Software,
-containing modifications that substantially alter, remove, or
-disable functionality of the Software, outside of the documented
-configuration mechanisms provided by the Software, shall be
-modified such that the Original Author's bug reporting email
-addresses and urls are either replaced with the contact information
-of the parties responsible for the changes, or removed entirely.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-
-Except where noted, this license applies to any and all software
-programs and associated documentation files created by the
-Original Author, when distributed with the Software.
diff --git a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/nan/README.md b/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/nan/README.md
deleted file mode 100644
index 7c8d6883f72..00000000000
--- a/src/LiveDevelopment/MultiBrowserImpl/transports/node/node_modules/ws/node_modules/nan/README.md
+++ /dev/null
@@ -1,947 +0,0 @@
-Native Abstractions for Node.js
-===============================
-
-**A header file filled with macro and utility goodness for making add-on development for Node.js easier across versions 0.8, 0.10 and 0.11, and eventually 0.12.**
-
-***Current version: 1.0.0*** *(See [nan.h](https://github.com/rvagg/nan/blob/master/nan.h) for complete ChangeLog)*
-
-[![NPM](https://nodei.co/npm/nan.png?downloads=true)](https://nodei.co/npm/nan/) [![NPM](https://nodei.co/npm-dl/nan.png?months=6)](https://nodei.co/npm/nan/)
-
-Thanks to the crazy changes in V8 (and some in Node core), keeping native addons compiling happily across versions, particularly 0.10 to 0.11/0.12, is a minor nightmare. The goal of this project is to store all logic necessary to develop native Node.js addons without having to inspect `NODE_MODULE_VERSION` and get yourself into a macro-tangle.
-
-This project also contains some helper utilities that make addon development a bit more pleasant.
-
- * **[News & Updates](#news)**
- * **[Usage](#usage)**
- * **[Example](#example)**
- * **[API](#api)**
-
-
-## News & Updates
-
-### May-2013: Major changes for V8 3.25 / Node 0.11.13
-
-Node 0.11.11 and 0.11.12 were both broken releases for native add-ons, you simply can't properly compile against either of them for different reasons. But we now have a 0.11.13 release that jumps a couple of versions of V8 ahead and includes some more, major (traumatic) API changes.
-
-Because we are now nearing Node 0.12 and estimate that the version of V8 we are using in Node 0.11.13 will be close to the API we get for 0.12, we have taken the opportunity to not only *fix* NAN for 0.11.13 but make some major changes to improve the NAN API.
-
-We have **removed support for Node 0.11 versions prior to 0.11.13**, (although our tests are still passing for 0.11.10). As usual, our tests are run against (and pass) the last 5 versions of Node 0.8 and Node 0.10. We also include Node 0.11.13 obviously.
-
-The major change is something that [Benjamin Byholm](kkoopa) has put many hours in to. We now have a fantastic new `NanNew(args)` interface for creating new `Local`s, this replaces `NanNewLocal()` and much more. If you look in [./nan.h](nan.h) you'll see a large number of overloaded versions of this method. In general you should be able to `NanNew(arguments)` for any type you want to make a `Local` from. This includes `Persistent` types, so we now have a `Local NanNew(const Persistent arg)` to replace `NanPersistentToLocal()`.
-
-We also now have `NanUndefined()`, `NanNull()`, `NanTrue()` and `NanFalse()`. Mainly because of the new requirement for an `Isolate` argument for each of the native V8 versions of this.
-
-V8 has now introduced an `EscapableHandleScope` from which you `scope.Escape(Local value)` to *return* a value from a one scope to another. This replaces the standard `HandleScope` and `scope.Close(Local value)`, although `HandleScope` still exists for when you don't need to return a handle to the caller. For NAN we are exposing it as `NanEscapableScope()` and `NanEscapeScope()`, while `NanScope()` is still how you create a new scope that doesn't need to return handles. For older versions of Node/V8, it'll still map to the older `HandleScope` functionality.
-
-`NanFromV8String()` was deprecated and has now been removed. You should use `NanCString()` or `NanRawString()` instead.
-
-Because `node::MakeCallback()` now takes an `Isolate`, and because it doesn't exist in older versions of Node, we've introduced `NanMakeCallabck()`. You should *always* use this when calling a JavaScript function from C++.
-
-There's lots more, check out the Changelog in nan.h or look through [#86](https://github.com/rvagg/nan/pull/86) for all the gory details.
-
-### Dec-2013: NanCString and NanRawString
-
-Two new functions have been introduced to replace the functionality that's been provided by `NanFromV8String` until now. NanCString has sensible defaults so it's super easy to fetch a null-terminated c-style string out of a `v8::String`. `NanFromV8String` is still around and has defaults that allow you to pass a single handle to fetch a `char*` while `NanRawString` requires a little more attention to arguments.
-
-### Nov-2013: Node 0.11.9+ breaking V8 change
-
-The version of V8 that's shipping with Node 0.11.9+ has changed the signature for new `Local`s to: `v8::Local::New(isolate, value)`, i.e. introducing the `isolate` argument and therefore breaking all new `Local` declarations for previous versions. NAN 0.6+ now includes a `NanNewLocal(value)` that can be used in place to work around this incompatibility and maintain compatibility with 0.8->0.11.9+ (minus a few early 0.11 releases).
-
-For example, if you wanted to return a `null` on a callback you will have to change the argument from `v8::Local::New(v8::Null())` to `NanNewLocal(v8::Null())`.
-
-### Nov-2013: Change to binding.gyp `"include_dirs"` for NAN
-
-Inclusion of NAN in a project's binding.gyp is now greatly simplified. You can now just use `"
-## Usage
-
-Simply add **NAN** as a dependency in the *package.json* of your Node addon:
-
-``` bash
-$ npm install --save nan
-```
-
-Pull in the path to **NAN** in your *binding.gyp* so that you can use `#include ` in your *.cpp* files:
-
-``` python
-"include_dirs" : [
- "` when compiling your addon.
-
-
-## Example
-
-See **[LevelDOWN](https://github.com/rvagg/node-leveldown/pull/48)** for a full example of **NAN** in use.
-
-For a simpler example, see the **[async pi estimation example](https://github.com/rvagg/nan/tree/master/examples/async_pi_estimate)** in the examples directory for full code and an explanation of what this Monte Carlo Pi estimation example does. Below are just some parts of the full example that illustrate the use of **NAN**.
-
-Compare to the current 0.10 version of this example, found in the [node-addon-examples](https://github.com/rvagg/node-addon-examples/tree/master/9_async_work) repository and also a 0.11 version of the same found [here](https://github.com/kkoopa/node-addon-examples/tree/5c01f58fc993377a567812597e54a83af69686d7/9_async_work).
-
-Note that there is no embedded version sniffing going on here and also the async work is made much simpler, see below for details on the `NanAsyncWorker` class.
-
-```c++
-// addon.cc
-#include
-#include
-// ...
-
-using v8::FunctionTemplate;
-using v8::Handle;
-using v8::Object;
-
-void InitAll(Handle