[Pkg-javascript-commits] [node-gyp] 77/82: Imported Upstream version 2.0.2

Ximin Luo infinity0 at debian.org
Mon Aug 31 00:41:03 UTC 2015


This is an automated email from the git hooks/post-receive script.

infinity0 pushed a commit to branch master
in repository node-gyp.

commit d59d56a616c907e6d6a420e31936e825bbcd34e6
Author: Ximin Luo <infinity0 at pwned.gg>
Date:   Mon Aug 31 02:23:17 2015 +0200

    Imported Upstream version 2.0.2
---
 0001-gyp-always-install-into-PRODUCT_DIR.patch     |  35 ++++
 ...ly-https-codereview.chromium.org-11361103.patch |  36 ++++
 ...se-links-at-all-just-copy-the-files-inste.patch |  39 ++++
 History.md                                         |  41 ++++
 README.md                                          |  61 ++++--
 addon.gypi                                         |  58 +++++-
 lib/build.js                                       |  12 +-
 lib/configure.js                                   |  32 +++-
 lib/install.js                                     | 103 +++++++++-
 lib/node-gyp.js                                    |   7 +-
 lib/rebuild.js                                     |   4 +-
 node_modules/.bin/mkdirp                           |   1 +
 node_modules/path-array/.npmignore                 |   1 +
 node_modules/path-array/.travis.yml                |   6 +
 node_modules/path-array/History.md                 |  22 +++
 node_modules/path-array/README.md                  |  92 +++++++++
 node_modules/path-array/index.js                   | 137 ++++++++++++++
 .../path-array/node_modules/array-index/.jshintrc  |   4 +
 .../path-array/node_modules/array-index/.npmignore |   1 +
 .../node_modules/array-index/.travis.yml           |   5 +
 .../path-array/node_modules/array-index/History.md |  39 ++++
 .../path-array/node_modules/array-index/Makefile   |  11 ++
 .../path-array/node_modules/array-index/README.md  | 156 +++++++++++++++
 .../node_modules/array-index/component.json        |  22 +++
 .../path-array/node_modules/array-index/index.js   | 180 ++++++++++++++++++
 .../array-index/node_modules/debug/.jshintrc       |   3 +
 .../array-index/node_modules/debug/.npmignore      |   6 +
 .../array-index/node_modules/debug/History.md      | 195 +++++++++++++++++++
 .../array-index/node_modules/debug/Makefile        |  36 ++++
 .../array-index/node_modules/debug/Readme.md       | 188 ++++++++++++++++++
 .../array-index/node_modules/debug/bower.json      |  28 +++
 .../array-index/node_modules/debug/browser.js      | 168 +++++++++++++++++
 .../array-index/node_modules/debug/component.json  |  19 ++
 .../array-index/node_modules/debug/debug.js        | 197 +++++++++++++++++++
 .../array-index/node_modules/debug/node.js         | 209 +++++++++++++++++++++
 .../node_modules/debug/node_modules/ms/.npmignore  |   5 +
 .../node_modules/debug/node_modules/ms/History.md  |  66 +++++++
 .../node_modules/debug/node_modules/ms/LICENSE     |  20 ++
 .../node_modules/debug/node_modules/ms/README.md   |  35 ++++
 .../node_modules/debug/node_modules/ms/index.js    | 125 ++++++++++++
 .../debug/node_modules/ms/package.json             |  48 +++++
 .../array-index/node_modules/debug/package.json    |  73 +++++++
 .../node_modules/array-index/package.json          |  58 ++++++
 node_modules/path-array/package.json               |  56 ++++++
 package.json                                       |  22 ++-
 src/win_delay_load_hook.c                          |  33 ++++
 46 files changed, 2638 insertions(+), 57 deletions(-)

diff --git a/0001-gyp-always-install-into-PRODUCT_DIR.patch b/0001-gyp-always-install-into-PRODUCT_DIR.patch
new file mode 100644
index 0000000..694913f
--- /dev/null
+++ b/0001-gyp-always-install-into-PRODUCT_DIR.patch
@@ -0,0 +1,35 @@
+From 9b5e8dc426ada891d67d27b09acc73122ab46849 Mon Sep 17 00:00:00 2001
+From: Nathan Rajlich <nathan at tootallnate.net>
+Date: Wed, 14 Nov 2012 16:48:52 -0800
+Subject: [PATCH 1/3] gyp: always install into $PRODUCT_DIR
+
+---
+ gyp/pylib/gyp/generator/make.py | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+diff --git a/gyp/pylib/gyp/generator/make.py b/gyp/pylib/gyp/generator/make.py
+index b88a433..9b3e4e3 100644
+--- a/gyp/pylib/gyp/generator/make.py
++++ b/gyp/pylib/gyp/generator/make.py
+@@ -1888,11 +1888,13 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
+     """Returns the location of the final output for an installable target."""
+     # Xcode puts shared_library results into PRODUCT_DIR, and some gyp files
+     # rely on this. Emulate this behavior for mac.
+-    if (self.type == 'shared_library' and
+-        (self.flavor != 'mac' or self.toolset != 'target')):
+-      # Install all shared libs into a common directory (per toolset) for
+-      # convenient access with LD_LIBRARY_PATH.
+-      return '$(builddir)/lib.%s/%s' % (self.toolset, self.alias)
++
++    # XXX(TooTallNate): disabling this code since we don't want this behavior...
++    #if (self.type == 'shared_library' and
++    #    (self.flavor != 'mac' or self.toolset != 'target')):
++    #  # Install all shared libs into a common directory (per toolset) for
++    #  # convenient access with LD_LIBRARY_PATH.
++    #  return '$(builddir)/lib.%s/%s' % (self.toolset, self.alias)
+     return '$(builddir)/' + self.alias
+ 
+ 
+-- 
+2.3.2 (Apple Git-55)
+
diff --git a/0002-gyp-apply-https-codereview.chromium.org-11361103.patch b/0002-gyp-apply-https-codereview.chromium.org-11361103.patch
new file mode 100644
index 0000000..d1c5cac
--- /dev/null
+++ b/0002-gyp-apply-https-codereview.chromium.org-11361103.patch
@@ -0,0 +1,36 @@
+From 511840e82116662aa825088fb8a52a9f799f7767 Mon Sep 17 00:00:00 2001
+From: Nathan Rajlich <nathan at tootallnate.net>
+Date: Wed, 14 Nov 2012 16:54:04 -0800
+Subject: [PATCH 2/3] gyp: apply https://codereview.chromium.org/11361103/
+
+---
+ gyp/pylib/gyp/generator/msvs.py | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/gyp/pylib/gyp/generator/msvs.py b/gyp/pylib/gyp/generator/msvs.py
+index d8e0872..c59aea1 100644
+--- a/gyp/pylib/gyp/generator/msvs.py
++++ b/gyp/pylib/gyp/generator/msvs.py
+@@ -2720,6 +2720,9 @@ def _GetMSBuildAttributes(spec, config, build_file):
+     product_name = spec.get('product_name', '$(ProjectName)')
+     target_name = prefix + product_name
+     msbuild_attributes['TargetName'] = target_name
++  if 'TargetExt' not in msbuild_attributes and 'product_extension' in spec:
++    ext = spec.get('product_extension')
++    msbuild_attributes['TargetExt'] = '.' + ext
+ 
+   if spec.get('msvs_external_builder'):
+     external_out_dir = spec.get('msvs_external_builder_out_dir', '.')
+@@ -2773,6 +2776,9 @@ def _GetMSBuildConfigurationGlobalProperties(spec, configurations, build_file):
+                             attributes['OutputDirectory'])
+     _AddConditionalProperty(properties, condition, 'TargetName',
+                             attributes['TargetName'])
++    if 'TargetExt' in attributes:
++      _AddConditionalProperty(properties, condition, 'TargetExt',
++                              attributes['TargetExt'])
+ 
+     if attributes.get('TargetPath'):
+       _AddConditionalProperty(properties, condition, 'TargetPath',
+-- 
+2.3.2 (Apple Git-55)
+
diff --git a/0003-gyp-don-t-use-links-at-all-just-copy-the-files-inste.patch b/0003-gyp-don-t-use-links-at-all-just-copy-the-files-inste.patch
new file mode 100644
index 0000000..673a3dd
--- /dev/null
+++ b/0003-gyp-don-t-use-links-at-all-just-copy-the-files-inste.patch
@@ -0,0 +1,39 @@
+From 0cd9f08a6d4f4be6643001b6c3b5ad40e094bdcc Mon Sep 17 00:00:00 2001
+From: Nathan Zadoks <nathan at nathan7.eu>
+Date: Tue, 2 Jul 2013 11:07:16 -0700
+Subject: [PATCH 3/3] gyp: don't use links at all, just copy the files instead
+
+---
+ gyp/pylib/gyp/generator/make.py  | 2 +-
+ gyp/pylib/gyp/generator/ninja.py | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/gyp/pylib/gyp/generator/make.py b/gyp/pylib/gyp/generator/make.py
+index 9b3e4e3..b3f8a2b 100644
+--- a/gyp/pylib/gyp/generator/make.py
++++ b/gyp/pylib/gyp/generator/make.py
+@@ -372,7 +372,7 @@ cmd_touch = touch $@
+ 
+ quiet_cmd_copy = COPY $@
+ # send stderr to /dev/null to ignore messages when linking directories.
+-cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@")
++cmd_copy = rm -rf "$@" && cp -af "$<" "$@"
+ 
+ %(link_commands)s
+ """
+diff --git a/gyp/pylib/gyp/generator/ninja.py b/gyp/pylib/gyp/generator/ninja.py
+index 7461814..c2951a4 100644
+--- a/gyp/pylib/gyp/generator/ninja.py
++++ b/gyp/pylib/gyp/generator/ninja.py
+@@ -2020,7 +2020,7 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params,
+     master_ninja.rule(
+       'copy',
+       description='COPY $in $out',
+-      command='ln -f $in $out 2>/dev/null || (rm -rf $out && cp -af $in $out)')
++      command='rm -rf $out && cp -af $in $out')
+   master_ninja.newline()
+ 
+   all_targets = set()
+-- 
+2.3.2 (Apple Git-55)
+
diff --git a/History.md b/History.md
new file mode 100644
index 0000000..8768081
--- /dev/null
+++ b/History.md
@@ -0,0 +1,41 @@
+
+2.0.2 / 2015-07-14
+==================
+
+  * Use HTTPS for dist url (#656, @SonicHedgehog)
+  * Merge pull request #648 from nevosegal/master
+  * Merge pull request #650 from magic890/patch-1
+  * Updated Installation section on README
+  * Updated link to gyp user documentation
+  * Fix download error message spelling (#643, @tomxtobin)
+  * Merge pull request #637 from lygstate/master
+  * Set NODE_GYP_DIR for addon.gypi to setting absolute path for
+    src/win_delay_load_hook.c, and fixes of the long relative path issue on Win32.
+    Fixes #636 (#637, @lygstate).
+
+2.0.1 / 2015-05-28
+==================
+
+  * configure: try/catch the semver range.test() call
+  * README: update for visual studio 2013 (#510, @samccone)
+
+2.0.0 / 2015-05-24
+==================
+
+  * configure: check for python2 executable by default, fallback to python
+  * configure: don't clobber existing $PYTHONPATH
+  * configure: use "path-array" for PYTHONPATH
+  * gyp: fix for non-acsii userprofile name on Windows
+  * gyp: always install into $PRODUCT_DIR
+  * gyp: apply https://codereview.chromium.org/11361103/
+  * gyp: don't use links at all, just copy the files instead
+  * gyp: update gyp to e1c8fcf7
+  * Updated README.md with updated Windows build info
+  * Show URL when a download fails
+  * package: add a "license" field
+  * move HMODULE m declaration to top
+  * Only add "-undefined dynamic_lookup" to loadable_module targets
+  * win: optionally allow node.exe/iojs.exe to be renamed
+  * Avoid downloading shasums if using tarPath
+  * Add target name preprocessor define: `NODE_GYP_MODULE_NAME`
+  * Show better error message in case of bad network settings
diff --git a/README.md b/README.md
index ffe429c..edde1f6 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,8 @@ node-gyp
 ### Node.js native addon build tool
 
 `node-gyp` is a cross-platform command-line tool written in Node.js for compiling
-native addon modules for Node.js, which takes away the pain of dealing with the
+native addon modules for Node.js.  It bundles the [gyp](https://code.google.com/p/gyp/)
+project used by the Chromium team and takes away the pain of dealing with the
 various differences in build platforms. It is the replacement to the `node-waf`
 program which is removed for node `v0.8`. If you have a native addon for node that
 still has a `wscript` file, then you should definitely add a `binding.gyp` file
@@ -34,16 +35,44 @@ You will also need to install:
   * On Unix:
     * `python` (`v2.7` recommended, `v3.x.x` is __*not*__ supported)
     * `make`
-    * A proper C/C++ compiler toolchain, like GCC
+    * A proper C/C++ compiler toolchain, like [GCC](https://gcc.gnu.org)
+  * On Mac OS X:
+    * `python` (`v2.7` recommended, `v3.x.x` is __*not*__ supported) (already installed on Mac OS X)
+    * [Xcode](https://developer.apple.com/xcode/downloads/)
+      * You also need to install the `Command Line Tools` via Xcode. You can find this under the menu `Xcode -> Preferences -> Downloads`
+      * This step will install `gcc` and the related toolchain containing `make`
   * On Windows:
     * [Python][windows-python] ([`v2.7.3`][windows-python-v2.7.3] recommended, `v3.x.x` is __*not*__ supported)
+      * Make sure that you have a PYTHON environment variable, and it is set to drive:\path\to\python.exe not to a folder
     * Windows XP/Vista/7:
-      * Microsoft Visual Studio C++ 2010 ([Express][msvc2010] version works well)
-      * For 64-bit builds of node and native modules you will _**also**_ need the [Windows 7 64-bit SDK][win7sdk]
-        * If the install fails, try uninstalling any C++ 2010 x64&x86 Redistributable that you have installed first.
-      * If you get errors that the 64-bit compilers are not installed you may also need the [compiler update for the Windows SDK 7.1]
+      * Microsoft Visual Studio C++ 2013 ([Express][msvc2013] version works well)
+        * If the install fails, try uninstalling any C++ 2010 x64&x86 Redistributable that you have installed first
+        * If you get errors that the 64-bit compilers are not installed you may also need the [compiler update for the Windows SDK 7.1]
     * Windows 7/8:
-      * Microsoft Visual Studio C++ 2012 for Windows Desktop ([Express][msvc2012] version works well)
+      * Microsoft Visual Studio C++ 2013 for Windows Desktop ([Express][msvc2013] version works well)
+    * All Windows Versions
+      * For 64-bit builds of node and native modules you will _**also**_ need the [Windows 7 64-bit SDK][win7sdk]
+      * You may need to run one of the following commands if your build complains about WindowsSDKDir not being set, and you are sure you have already installed the SDK:
+
+```
+call "C:\Program Files\Microsoft SDKs\Windows\v7.1\bin\Setenv.cmd" /Release /x86
+call "C:\Program Files\Microsoft SDKs\Windows\v7.1\bin\Setenv.cmd" /Release /x64
+```
+
+If you have multiple Python versions installed, you can identify which Python
+version `node-gyp` uses by setting the '--python' variable:
+
+``` bash
+$ node-gyp --python /path/to/python2.7
+```
+
+If `node-gyp` is called by way of `npm` *and* you have multiple versions of
+Python installed, then you can set `npm`'s 'python' config key to the appropriate
+value:
+
+``` bash
+$ npm config set python /path/to/executable/python2.7
+```
 
 Note that OS X is just a flavour of Unix and so needs `python`, `make`, and C/C++.
 An easy way to obtain these is to install XCode from Apple,
@@ -66,7 +95,7 @@ $ node-gyp configure
 ```
 
 __Note__: The `configure` step looks for the `binding.gyp` file in the current
-directory to processs. See below for instructions on creating the `binding.gyp` file.
+directory to process. See below for instructions on creating the `binding.gyp` file.
 
 Now you will have either a `Makefile` (on Unix platforms) or a `vcxproj` file
 (on Windows) in the `build/` directory. Next invoke the `build` command:
@@ -80,7 +109,7 @@ in `build/Debug/` or `build/Release/`, depending on the build mode. At this poin
 you can require the `.node` file with Node and run your tests!
 
 __Note:__ To create a _Debug_ build of the bindings file, pass the `--debug` (or
-`-d`) switch when running the either `configure` or `build` command.
+`-d`) switch when running either the `configure`, `build` or `rebuild` command.
 
 
 The "binding.gyp" file
@@ -104,11 +133,12 @@ A barebones `gyp` file appropriate for building a node addon looks like:
 }
 ```
 
-Some additional resources for writing `gyp` files:
+Some additional resources for addons and writing `gyp` files:
 
+ * ["Going Native" a nodeschool.io tutorial](http://nodeschool.io/#goingnative)
  * ["Hello World" node addon example](https://github.com/joyent/node/tree/master/test/addons/hello-world)
- * [gyp user documentation](http://code.google.com/p/gyp/wiki/GypUserDocumentation)
- * [gyp input format reference](http://code.google.com/p/gyp/wiki/InputFormatReference)
+ * [gyp user documentation](https://chromium.googlesource.com/external/gyp/+/master/docs/UserDocumentation.md)
+ * [gyp input format reference](https://chromium.googlesource.com/external/gyp/+/master/docs/InputFormatReference.md)
  * [*"binding.gyp" files out in the wild* wiki page](https://github.com/TooTallNate/node-gyp/wiki/%22binding.gyp%22-files-out-in-the-wild)
 
 
@@ -120,9 +150,9 @@ Commands
 | **Command**   | **Description**
 |:--------------|:---------------------------------------------------------------
 | `build`       | Invokes `make`/`msbuild.exe` and builds the native addon
-| `clean`       | Removes any the `build` dir if it exists
+| `clean`       | Removes the `build` directory if it exists
 | `configure`   | Generates project build files for the current platform
-| `rebuild`     | Runs "clean", "configure" and "build" all in a row
+| `rebuild`     | Runs `clean`, `configure` and `build` all in a row
 | `install`     | Installs node development header files for the given version
 | `list`        | Lists the currently installed node development file versions
 | `remove`      | Removes the node development header files for the given version
@@ -157,7 +187,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 [windows-python]: http://www.python.org/getit/windows
 [windows-python-v2.7.3]: http://www.python.org/download/releases/2.7.3#download
-[msvc2010]: http://go.microsoft.com/?linkid=9709949
-[msvc2012]: http://go.microsoft.com/?linkid=9816758
+[msvc2013]: http://www.visualstudio.com/en-us/downloads/download-visual-studio-vs
 [win7sdk]: http://www.microsoft.com/en-us/download/details.aspx?id=8279
 [compiler update for the Windows SDK 7.1]: http://www.microsoft.com/en-us/download/details.aspx?id=4422
diff --git a/addon.gypi b/addon.gypi
index 6b9e20e..3377942 100644
--- a/addon.gypi
+++ b/addon.gypi
@@ -1,29 +1,65 @@
 {
   'target_defaults': {
     'type': 'loadable_module',
+    'win_delay_load_hook': 'false',
     'product_prefix': '',
+
     'include_dirs': [
       '<(node_root_dir)/src',
       '<(node_root_dir)/deps/uv/include',
       '<(node_root_dir)/deps/v8/include'
     ],
+    'defines': [
+      'NODE_GYP_MODULE_NAME=>(_target_name)'
+    ],
 
     'target_conditions': [
       ['_type=="loadable_module"', {
         'product_extension': 'node',
-        'defines': [ 'BUILDING_NODE_EXTENSION' ],
+        'defines': [
+          'BUILDING_NODE_EXTENSION'
+        ],
+        'xcode_settings': {
+          'OTHER_LDFLAGS': [
+            '-undefined dynamic_lookup'
+          ],
+        },
       }],
+
       ['_type=="static_library"', {
         # set to `1` to *disable* the -T thin archive 'ld' flag.
         # older linkers don't support this flag.
         'standalone_static_library': '<(standalone_static_library)'
       }],
+
+      ['_win_delay_load_hook=="true"', {
+        # If the addon specifies `'win_delay_load_hook': 'true'` in its
+        # binding.gyp, link a delay-load hook into the DLL. This hook ensures
+        # that the addon will work regardless of whether the node/iojs binary
+        # is named node.exe, iojs.exe, or something else.
+        'conditions': [
+          [ 'OS=="win"', {
+            'sources': [
+              '<(node_gyp_dir)/src/win_delay_load_hook.c',
+            ],
+            'msvs_settings': {
+              'VCLinkerTool': {
+                'DelayLoadDLLs': [ 'iojs.exe', 'node.exe' ],
+                # Don't print a linker warning when no imports from either .exe
+                # are used.
+                'AdditionalOptions': [ '/ignore:4199' ],
+              },
+            },
+          }],
+        ],
+      }],
     ],
 
     'conditions': [
       [ 'OS=="mac"', {
-        'defines': [ '_DARWIN_USE_64_BIT_INODE=1' ],
-        'libraries': [ '-undefined dynamic_lookup' ],
+        'defines': [
+          '_DARWIN_USE_64_BIT_INODE=1'
+        ],
         'xcode_settings': {
           'DYLIB_INSTALL_NAME_BASE': '@rpath'
         },
@@ -42,14 +78,20 @@
           '-luuid.lib',
           '-lodbc32.lib',
           '-lDelayImp.lib',
-          '-l<(node_root_dir)/$(Configuration)/node.lib'
+          '-l"<(node_root_dir)/$(ConfigurationName)/node.lib"'
+        ],
+        'msvs_disabled_warnings': [
+          # warning C4251: 'node::ObjectWrap::handle_' : class 'v8::Persistent<T>'
+          # needs to have dll-interface to be used by
+          # clients of class 'node::ObjectWrap'
+          4251
         ],
-        # warning C4251: 'node::ObjectWrap::handle_' : class 'v8::Persistent<T>'
-        # needs to have dll-interface to be used by clients of class 'node::ObjectWrap'
-        'msvs_disabled_warnings': [ 4251 ],
       }, {
         # OS!="win"
-        'defines': [ '_LARGEFILE_SOURCE', '_FILE_OFFSET_BITS=64' ],
+        'defines': [
+          '_LARGEFILE_SOURCE',
+          '_FILE_OFFSET_BITS=64'
+        ],
       }],
       [ 'OS=="freebsd" or OS=="openbsd" or OS=="solaris" or (OS=="linux" and target_arch!="ia32")', {
         'cflags': [ '-fPIC' ],
diff --git a/lib/build.js b/lib/build.js
index f360590..eeeb602 100644
--- a/lib/build.js
+++ b/lib/build.js
@@ -150,7 +150,7 @@ function build (gyp, argv, callback) {
         return (x.version < y.version ? -1 : 1)
       })
       ;(function verifyMsbuild () {
-        if (!msbuilds.length) return callback(notfoundErr);
+        if (!msbuilds.length) return callback(notfoundErr)
         msbuildPath = path.resolve(msbuilds.pop().path, 'msbuild.exe')
         fs.stat(msbuildPath, function (err, stat) {
           if (err) {
@@ -222,8 +222,9 @@ function build (gyp, argv, callback) {
       var p = arch === 'x64' ? 'x64' : 'Win32'
       argv.push('/p:Configuration=' + buildType + ';Platform=' + p)
       if (jobs) {
-        if (!isNaN(parseInt(jobs, 10))) {
-          argv.push('/m:' + parseInt(jobs, 10))
+        var j = parseInt(jobs, 10)
+        if (!isNaN(j) && j > 0) {
+          argv.push('/m:' + j)
         } else if (jobs.toUpperCase() === 'MAX') {
           argv.push('/m:' + require('os').cpus().length)
         }
@@ -234,9 +235,10 @@ function build (gyp, argv, callback) {
       argv.push('-C')
       argv.push('build')
       if (jobs) {
-        if (!isNaN(parseInt(jobs, 10))) {
+        var j = parseInt(jobs, 10)
+        if (!isNaN(j) && j > 0) {
           argv.push('--jobs')
-          argv.push(parseInt(jobs, 10))
+          argv.push(j)
         } else if (jobs.toUpperCase() === 'MAX') {
           argv.push('--jobs')
           argv.push(require('os').cpus().length)
diff --git a/lib/configure.js b/lib/configure.js
index e101a31..e8c2029 100644
--- a/lib/configure.js
+++ b/lib/configure.js
@@ -1,4 +1,3 @@
-
 module.exports = exports = configure
 
 /**
@@ -14,6 +13,8 @@ var fs = require('graceful-fs')
   , semver = require('semver')
   , mkdirp = require('mkdirp')
   , cp = require('child_process')
+  , PathArray = require('path-array')
+  , extend = require('util')._extend
   , spawn = cp.spawn
   , execFile = cp.execFile
   , win = process.platform == 'win32'
@@ -22,7 +23,7 @@ exports.usage = 'Generates ' + (win ? 'MSVC project files' : 'a Makefile') + ' f
 
 function configure (gyp, argv, callback) {
 
-  var python = gyp.opts.python || process.env.PYTHON || 'python'
+  var python = gyp.opts.python || process.env.PYTHON || 'python2'
     , buildDir = path.resolve('build')
     , configNames = [ 'config.gypi', 'common.gypi' ]
     , configs = []
@@ -36,6 +37,10 @@ function configure (gyp, argv, callback) {
     which(python, function (err, execPath) {
       if (err) {
         log.verbose('`which` failed', python, err)
+        if (python === 'python2') {
+          python = 'python'
+          return checkPython()
+        }
         if (win) {
           guessPython()
         } else {
@@ -73,7 +78,9 @@ function configure (gyp, argv, callback) {
   }
 
   function checkPythonVersion () {
-    var env = { TERM: 'dumb', PATH: process.env.PATH };
+    var env = extend({}, process.env)
+    env.TERM = 'dumb'
+
     execFile(python, ['-c', 'import platform; print(platform.python_version());'], { env: env }, function (err, stdout) {
       if (err) {
         return callback(err)
@@ -88,8 +95,14 @@ function configure (gyp, argv, callback) {
         log.silly('stripping "rc" identifier from version')
         version = version.replace(/rc(.*)$/ig, '')
       }
-      var range = semver.Range('>=2.5.0 <3.0.0');
-      if (range.test(version)) {
+      var range = semver.Range('>=2.5.0 <3.0.0')
+      var valid = false
+      try {
+        valid = range.test(version)
+      } catch (e) {
+        log.silly('range.test() error', e)
+      }
+      if (valid) {
         getNodeDir()
       } else {
         failPythonVersion(version)
@@ -210,7 +223,7 @@ function configure (gyp, argv, callback) {
     variables.copy_dev_lib = !gyp.opts.nodedir
 
     // disable -T "thin" static archives by default
-    variables.standalone_static_library = gyp.opts.thin ? 0 : 1;
+    variables.standalone_static_library = gyp.opts.thin ? 0 : 1
 
     // loop through the rest of the opts and add the unknown ones as variables.
     // this allows for module-specific configure flags like:
@@ -303,14 +316,17 @@ function configure (gyp, argv, callback) {
       // Windows expects an absolute path
       output_dir = buildDir
     }
+    var nodeGypDir = path.resolve(__dirname, '..')
 
     argv.push('-I', addon_gypi)
     argv.push('-I', common_gypi)
     argv.push('-Dlibrary=shared_library')
     argv.push('-Dvisibility=default')
     argv.push('-Dnode_root_dir=' + nodeDir)
+    argv.push('-Dnode_gyp_dir=' + nodeGypDir)
     argv.push('-Dmodule_root_dir=' + process.cwd())
     argv.push('--depth=.')
+    argv.push('--no-parallel')
 
     // tell gyp to write the Makefile/Solution files into output_dir
     argv.push('--generator-output', output_dir)
@@ -324,6 +340,10 @@ function configure (gyp, argv, callback) {
     // execute `gyp` from the current target nodedir
     argv.unshift(gyp_script)
 
+    // make sure python uses files that came with this particular node package
+    var pypath = new PathArray(process.env, 'PYTHONPATH')
+    pypath.unshift(path.join(__dirname, '..', 'gyp', 'pylib'))
+
     var cp = gyp.spawn(python, argv)
     cp.on('exit', onCpExit)
   }
diff --git a/lib/install.js b/lib/install.js
index 60dc3cd..6cbcdb8 100644
--- a/lib/install.js
+++ b/lib/install.js
@@ -12,6 +12,7 @@ var fs = require('graceful-fs')
   , tar = require('tar')
   , rm = require('rimraf')
   , path = require('path')
+  , crypto = require('crypto')
   , zlib = require('zlib')
   , log = require('npmlog')
   , semver = require('semver')
@@ -38,7 +39,7 @@ function install (gyp, argv, callback) {
     }
   }
 
-  var distUrl = gyp.opts['dist-url'] || gyp.opts.disturl || 'http://nodejs.org/dist'
+  var distUrl = gyp.opts['dist-url'] || gyp.opts.disturl || 'https://nodejs.org/dist'
 
 
   // Determine which node dev files version we are installing
@@ -71,6 +72,9 @@ function install (gyp, argv, callback) {
   version = version.version
   log.verbose('install', 'installing version: %s', version)
 
+  // distributions starting with 0.10.0 contain sha256 checksums
+  var checksumAlgo = semver.gte(version, '0.10.0') ? 'sha256' : 'sha1'
+
   // the directory where the dev files will be installed
   var devDir = path.resolve(gyp.devDir, version)
 
@@ -151,6 +155,15 @@ function install (gyp, argv, callback) {
     return req
   }
 
+  function getContentSha(res, callback) {
+    var shasum = crypto.createHash(checksumAlgo)
+    res.on('data', function (chunk) {
+      shasum.update(chunk)
+    }).on('end', function () {
+      callback(null, shasum.digest('hex'))
+    })
+  }
+
   function go () {
 
     log.verbose('ensuring nodedir is created', devDir)
@@ -171,13 +184,16 @@ function install (gyp, argv, callback) {
       }
 
       // now download the node tarball
-      var tarPath = gyp.opts['tarball'];
+      var tarPath = gyp.opts['tarball']
       var tarballUrl = tarPath ? tarPath : distUrl + '/v' + version + '/node-v' + version + '.tar.gz'
         , badDownload = false
         , extractCount = 0
         , gunzip = zlib.createGunzip()
         , extracter = tar.Extract({ path: devDir, strip: 1, filter: isValid })
 
+      var contentShasums = {}
+      var expectShasums = {}
+
       // checks if a file to be extracted from the tarball is valid.
       // only .h header files and the gyp files get extracted
       function isValid () {
@@ -214,6 +230,11 @@ function install (gyp, argv, callback) {
 
       // something went wrong downloading the tarball?
       req.on('error', function (err) {
+        if (err.code === 'ENOTFOUND') {
+          return cb(new Error('This is most likely not a problem with node-gyp or the package itself and\n' +
+            'is related to network connectivity. In most cases you are behind a proxy or have bad \n' +
+            'network settings.'))
+        }
         badDownload = true
         cb(err)
       })
@@ -227,9 +248,16 @@ function install (gyp, argv, callback) {
       req.on('response', function (res) {
         if (res.statusCode !== 200) {
           badDownload = true
-          cb(new Error(res.statusCode + ' status code downloading tarball'))
+          cb(new Error(res.statusCode + ' response downloading ' + tarballUrl))
           return
         }
+        // content checksum
+        getContentSha(res, function (_, checksum) {
+          var filename = path.basename(tarballUrl).trim()
+          contentShasums[filename] = checksum
+          log.verbose('content checksum', filename, checksum)
+        })
+
         // start unzipping and untaring
         req.pipe(gunzip).pipe(extracter)
       })
@@ -254,6 +282,13 @@ function install (gyp, argv, callback) {
         var installVersionPath = path.resolve(devDir, 'installVersion')
         fs.writeFile(installVersionPath, gyp.package.installVersion + '\n', deref)
 
+        // Only download SHASUMS.txt if not using tarPath override
+        if (!tarPath) {
+          // download SHASUMS.txt
+          async++
+          downloadShasums(deref)
+        }
+
         if (async === 0) {
           // no async tasks required
           cb()
@@ -261,10 +296,60 @@ function install (gyp, argv, callback) {
 
         function deref (err) {
           if (err) return cb(err)
-          --async || cb()
+
+          async--
+          if (!async) {
+            log.verbose('download contents checksum', JSON.stringify(contentShasums))
+            // check content shasums
+            for (var k in contentShasums) {
+              log.verbose('validating download checksum for ' + k, '(%s == %s)', contentShasums[k], expectShasums[k])
+              if (contentShasums[k] !== expectShasums[k]) {
+                cb(new Error(k + ' local checksum ' + contentShasums[k] + ' not match remote ' + expectShasums[k]))
+                return
+              }
+            }
+            cb()
+          }
         }
       }
 
+      function downloadShasums(done) {
+        var shasumsFile = (checksumAlgo === 'sha256') ? 'SHASUMS256.txt' : 'SHASUMS.txt'
+        log.verbose('check download content checksum, need to download `' + shasumsFile + '`...')
+        var shasumsPath = path.resolve(devDir, shasumsFile)
+          , shasumsUrl = distUrl + '/v' + version + '/' + shasumsFile
+
+        log.verbose('checksum url', shasumsUrl)
+        var req = download(shasumsUrl)
+        if (!req) return
+        req.on('error', done)
+        req.on('response', function (res) {
+          if (res.statusCode !== 200) {
+            done(new Error(res.statusCode + ' status code downloading checksum'))
+            return
+          }
+
+          var chunks = []
+          res.on('data', function (chunk) {
+            chunks.push(chunk)
+          })
+          res.on('end', function () {
+            var lines = Buffer.concat(chunks).toString().trim().split('\n')
+            lines.forEach(function (line) {
+              var items = line.trim().split(/\s+/)
+              if (items.length !== 2) return
+
+              // 0035d18e2dcf9aad669b1c7c07319e17abfe3762  ./node-v0.11.4.tar.gz
+              var name = items[1].replace(/^\.\//, '')
+              expectShasums[name] = items[0]
+            })
+
+            log.verbose('checksum data', JSON.stringify(expectShasums))
+            done()
+          })
+        })
+      }
+
       function downloadNodeLib (done) {
         log.verbose('on Windows; need to download `node.lib`...')
         var dir32 = path.resolve(devDir, 'ia32')
@@ -293,6 +378,11 @@ function install (gyp, argv, callback) {
               return
             }
 
+            getContentSha(res, function (_, checksum) {
+              contentShasums['node.lib'] = checksum
+              log.verbose('content checksum', 'node.lib', checksum)
+            })
+
             var ws = fs.createWriteStream(nodeLibPath32)
             ws.on('error', cb)
             req.pipe(ws)
@@ -314,6 +404,11 @@ function install (gyp, argv, callback) {
               return
             }
 
+            getContentSha(res, function (_, checksum) {
+              contentShasums['x64/node.lib'] = checksum
+              log.verbose('content checksum', 'x64/node.lib', checksum)
+            })
+
             var ws = fs.createWriteStream(nodeLibPath64)
             ws.on('error', cb)
             req.pipe(ws)
diff --git a/lib/node-gyp.js b/lib/node-gyp.js
index 2ae0890..6223d4b 100644
--- a/lib/node-gyp.js
+++ b/lib/node-gyp.js
@@ -180,8 +180,8 @@ proto.parseArgv = function parseOpts (argv) {
 
 proto.spawn = function spawn (command, args, opts) {
   if (!opts) opts = {}
-  if (!opts.silent && !opts.customFds) {
-    opts.customFds = [ 0, 1, 2 ]
+  if (!opts.silent && !opts.stdio) {
+    opts.stdio = [ 0, 1, 2 ]
   }
   var cp = child_process.spawn(command, args, opts)
   log.info('spawn', command)
@@ -203,9 +203,6 @@ proto.usage = function usage () {
         return '    - ' + c + ' - ' + require('./' + c).usage
       }).join('\n')
     , ''
-    , '  for specific command usage and options try:'
-    , '    $ node-gyp <command> --help'
-    , ''
     , 'node-gyp@' + this.version + '  ' + path.resolve(__dirname, '..')
     , 'node@' + process.versions.node
   ].join('\n')
diff --git a/lib/rebuild.js b/lib/rebuild.js
index 595d87a..4c6f472 100644
--- a/lib/rebuild.js
+++ b/lib/rebuild.js
@@ -3,13 +3,11 @@ module.exports = exports = rebuild
 
 exports.usage = 'Runs "clean", "configure" and "build" all at once'
 
-var log = require('npmlog')
-
 function rebuild (gyp, argv, callback) {
 
   gyp.todo.push(
       { name: 'clean', args: [] }
-    , { name: 'configure', args: [] }
+    , { name: 'configure', args: argv }
     , { name: 'build', args: [] }
   )
   process.nextTick(callback)
diff --git a/node_modules/.bin/mkdirp b/node_modules/.bin/mkdirp
new file mode 120000
index 0000000..017896c
--- /dev/null
+++ b/node_modules/.bin/mkdirp
@@ -0,0 +1 @@
+../mkdirp/bin/cmd.js
\ No newline at end of file
diff --git a/node_modules/path-array/.npmignore b/node_modules/path-array/.npmignore
new file mode 100644
index 0000000..07e6e47
--- /dev/null
+++ b/node_modules/path-array/.npmignore
@@ -0,0 +1 @@
+/node_modules
diff --git a/node_modules/path-array/.travis.yml b/node_modules/path-array/.travis.yml
new file mode 100644
index 0000000..c7d8e3d
--- /dev/null
+++ b/node_modules/path-array/.travis.yml
@@ -0,0 +1,6 @@
+language: node_js
+node_js:
+  - 0.8
+  - 0.9
+  - 0.10
+  - 0.11
diff --git a/node_modules/path-array/History.md b/node_modules/path-array/History.md
new file mode 100644
index 0000000..ff93a2a
--- /dev/null
+++ b/node_modules/path-array/History.md
@@ -0,0 +1,22 @@
+
+1.0.0 / 2014-11-11
+==================
+
+  * index: add support for a configrable `property` name to use
+  * README: fix Travis badge
+
+0.0.2 / 2013-12-22
+==================
+
+  * README++
+  * test: add unshift() test
+  * test: add more tests
+  * index: ensure that the indexed getters/setters are set up in the constructor
+  * add .travis.yml file
+  * add initial tests
+
+0.0.1 / 2013-12-21
+==================
+
+  * add README.md
+  * initial commit
diff --git a/node_modules/path-array/README.md b/node_modules/path-array/README.md
new file mode 100644
index 0000000..2595316
--- /dev/null
+++ b/node_modules/path-array/README.md
@@ -0,0 +1,92 @@
+path-array
+==========
+### Treat your `$PATH` like a JavaScript Array
+[![Build Status](https://travis-ci.org/TooTallNate/path-array.svg?branch=master)](https://travis-ci.org/TooTallNate/path-array)
+
+This module provides a JavaScript `Array` implementation that is backed by your
+`$PATH` env variable. That is, you can use regular Array functions like `shift()`,
+`pop()`, `push()`, `unshift()`, etc. to mutate your `$PATH`.
+
+Also works for preparing an `env` object for passing to
+[`child_process.spawn()`][cp.spawn].
+
+
+Installation
+------------
+
+Install with `npm`:
+
+``` bash
+$ npm install path-array
+```
+
+
+Example
+-------
+
+Interacting with your own `$PATH` env variable:
+
+``` js
+var PathArray = require('path-array');
+
+// no args uses `process.env` by default
+var p = new PathArray();
+
+console.log(p);
+// [ './node_modules/.bin',
+//   '/opt/local/bin',
+//   '/opt/local/sbin',
+//   '/usr/local/bin',
+//   '/usr/local/sbin',
+//   '/usr/bin',
+//   '/bin',
+//   '/usr/sbin',
+//   '/sbin',
+//   '/usr/local/bin',
+//   '/opt/X11/bin' ]
+
+// push another path entry. this function mutates the `process.env.PATH`
+p.unshift('/foo');
+
+console.log(process.env.PATH);
+// '/foo:./node_modules/.bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin'
+```
+
+
+API
+---
+
+### new PathArray([env]) → PathArray
+
+Creates and returns a new `PathArray` instance with the given `env` object. If no
+`env` is specified, then [`process.env`][process.env] is used by default.
+
+
+License
+-------
+
+(The MIT License)
+
+Copyright (c) 2013 Nathan Rajlich <nathan at tootallnate.net>
+
+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.
+
+[process.env]: http://nodejs.org/docs/latest/api/process.html#process_process_env
+[cp.spawn]: http://nodejs.org/docs/latest/api/child_process.html#child_process_child_process_spawn_command_args_options
diff --git a/node_modules/path-array/index.js b/node_modules/path-array/index.js
new file mode 100644
index 0000000..40b982d
--- /dev/null
+++ b/node_modules/path-array/index.js
@@ -0,0 +1,137 @@
+
+/**
+ * Module dependencies.
+ */
+
+var inherits = require('util').inherits;
+var delimiter = require('path').delimiter || ':';
+var ArrayIndex = require('array-index');
+
+/**
+ * Module exports.
+ */
+
+module.exports = PathArray;
+
+/**
+ * `PathArray` constructor. Treat your `$PATH` like a mutable JavaScript Array!
+ *
+ * @param {Env} env - `process.env` object to use.
+ * @param {String} [property] - optional property name to use (`PATH` by default).
+ * @public
+ */
+
+function PathArray (env, property) {
+  if (!(this instanceof PathArray)) return new PathArray(env);
+  ArrayIndex.call(this);
+
+  this.property = property || 'PATH';
+
+  // overwrite only the `get` operator of the ".length" property
+  Object.defineProperty(this, 'length', {
+    get: this._getLength
+  });
+
+  // store the `process.env` object as a non-enumerable `_env`
+  Object.defineProperty(this, '_env', {
+    value: env || process.env,
+    writable: true,
+    enumerable: false,
+    configurable: true
+  });
+
+  // need to invoke the `length` getter to ensure that the
+  // indexed getters/setters are set up at this point
+  void(this.length);
+}
+
+// inherit from ArrayIndex
+inherits(PathArray, ArrayIndex);
+
+/**
+ * Returns the current $PATH representation as an Array.
+ *
+ * @api private
+ */
+
+PathArray.prototype._array = function () {
+  var path = this._env[this.property];
+  if (!path) return [];
+  return path.split(delimiter);
+};
+
+/**
+ * Sets the `env` object's `PATH` string to the values in the passed in Array
+ * instance.
+ *
+ * @api private
+ */
+
+PathArray.prototype._setArray = function (arr) {
+  // mutate the $PATH
+  this._env[this.property] = arr.join(delimiter);
+};
+
+/**
+ * `.length` getter operation implementation.
+ *
+ * @api private
+ */
+
+PathArray.prototype._getLength = function () {
+  var length = this._array().length;
+
+  // invoke the ArrayIndex internal `set` operator to ensure that
+  // there's getters/setters defined for the determined length so far...
+  this.length = length;
+
+  return length;
+};
+
+/**
+ * ArrayIndex [0] getter operator implementation.
+ *
+ * @api private
+ */
+
+PathArray.prototype.__get__ = function get (index) {
+  return this._array()[index];
+};
+
+/**
+ * ArrayIndex [0]= setter operator implementation.
+ *
+ * @api private
+ */
+
+PathArray.prototype.__set__ = function set (index, value) {
+  var arr = this._array();
+  arr[index] = value;
+  this._setArray(arr);
+  return value;
+};
+
+/**
+ * `toString()` returns the current $PATH string.
+ *
+ * @api public
+ */
+
+PathArray.prototype.toString = function toString () {
+  return this._env[this.property] || '';
+};
+
+// proxy the JavaScript Array functions, and mutate the $PATH
+Object.getOwnPropertyNames(Array.prototype).forEach(function (name) {
+  if ('constructor' == name) return;
+  if ('function' != typeof Array.prototype[name]) return;
+  if (/to(Locale)?String/.test(name)) return;
+  //console.log('proxy %s', name);
+
+  PathArray.prototype[name] = function () {
+    var arr = this._array();
+    var rtn = arr[name].apply(arr, arguments);
+    this._setArray(arr);
+    return rtn;
+  };
+});
diff --git a/node_modules/path-array/node_modules/array-index/.jshintrc b/node_modules/path-array/node_modules/array-index/.jshintrc
new file mode 100644
index 0000000..182e34d
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/.jshintrc
@@ -0,0 +1,4 @@
+{
+  "asi": true,
+  "laxcomma": true
+}
diff --git a/node_modules/path-array/node_modules/array-index/.npmignore b/node_modules/path-array/node_modules/array-index/.npmignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/node_modules/path-array/node_modules/array-index/.travis.yml b/node_modules/path-array/node_modules/array-index/.travis.yml
new file mode 100644
index 0000000..99cdc74
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/.travis.yml
@@ -0,0 +1,5 @@
+language: node_js
+node_js:
+  - "0.8"
+  - "0.10"
+  - "0.11"
diff --git a/node_modules/path-array/node_modules/array-index/History.md b/node_modules/path-array/node_modules/array-index/History.md
new file mode 100644
index 0000000..20b03e9
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/History.md
@@ -0,0 +1,39 @@
+
+0.1.1 / 2014-11-03
+==================
+
+ * index: use `%o` debug formatters
+ * .travis: don't test node v0.9.x
+ * README: use svg for Travis badge
+ * add .jshintrc file
+
+0.1.0 / 2013-12-01
+==================
+
+  * add `History.md` file
+  * .travis.yml: test node v0.8-v0.11
+  * add component.json
+  * package: update "main" field
+  * package: beautify
+
+0.0.4 / 2013-09-27
+==================
+
+  * ensure that the `length` property has the same maximum as regular Arrays
+
+0.0.3 / 2013-09-15
+==================
+
+  * add `toArray()`, `toJSON()`, and `toString()` functions
+  * add an `inspect()` function
+
+0.0.2 / 2013-09-15
+==================
+
+  * use "configurable: true"
+  * add `travis.yml` file
+
+0.0.1 / 2013-06-14
+==================
+
+  * Initial release
diff --git a/node_modules/path-array/node_modules/array-index/Makefile b/node_modules/path-array/node_modules/array-index/Makefile
new file mode 100644
index 0000000..0f14dac
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/Makefile
@@ -0,0 +1,11 @@
+
+build: components index.js
+	@component build --dev
+
+components: component.json
+	@component install --dev
+
+clean:
+	rm -fr build components template.js
+
+.PHONY: clean
diff --git a/node_modules/path-array/node_modules/array-index/README.md b/node_modules/path-array/node_modules/array-index/README.md
new file mode 100644
index 0000000..ecd3498
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/README.md
@@ -0,0 +1,156 @@
+array-index
+===========
+### Invoke getter/setter functions on array-like objects
+[![Build Status](https://secure.travis-ci.org/TooTallNate/array-index.svg)](http://travis-ci.org/TooTallNate/array-index)
+
+
+This little module provides an `ArrayIndex` constructor function that you can
+inherit from with your own objects. When a numbered property gets read, then the
+`__get__` function on the object will be invoked. When a numbered property gets
+set, then the `__set__` function on the object will be invoked.
+
+
+Installation
+------------
+
+Install with `npm`:
+
+``` bash
+$ npm install array-index
+```
+
+
+Examples
+--------
+
+A quick silly example, using `Math.sqrt()` for the "getter":
+
+``` js
+var ArrayIndex = require('array-index')
+
+// let's just create a singleton instance.
+var a = new ArrayIndex()
+
+// the "__get__" function is invoked for each "a[n]" access.
+// it is given a single argument, the "index" currently being accessed.
+// so here, we're passing in the `Math.sqrt()` function, so accessing
+// "a[9]" will return `Math.sqrt(9)`.
+a.__get__ = Math.sqrt
+
+// the "__get__" and "__set__" functions are only invoked up
+// to "a.length", so we must set that manually.
+a.length = 10
+
+console.log(a)
+// [ 0,
+//   1,
+//   1.4142135623730951,
+//   1.7320508075688772,
+//   2,
+//   2.23606797749979,
+//   2.449489742783178,
+//   2.6457513110645907,
+//   2.8284271247461903,
+//   3,
+//   __get__: [Function: sqrt] ]
+```
+
+Here's an example of creating a subclass of `ArrayIndex` using `util.inherits()`:
+
+``` js
+var ArrayIndex = require('array-index')
+var inherits = require('util').inherits
+
+function MyArray (length) {
+  // be sure to call the ArrayIndex constructor in your own constructor
+  ArrayIndex.call(this, length)
+
+  // the "set" object will contain values at indexes previously set,
+  // so that they can be returned in the "getter" function. This is just a
+  // silly example, your subclass will have more meaningful logic.
+  Object.defineProperty(this, 'set', {
+    value: Object.create(null),
+    enumerable: false
+  })
+}
+
+// inherit from the ArrayIndex's prototype
+inherits(MyArray, ArrayIndex)
+
+MyArray.prototype.__get__ = function (index) {
+  if (index in this.set) return this.set[index]
+  return index * 2
+}
+
+MyArray.prototype.__set__ = function (index, v) {
+  this.set[index] = v
+}
+
+
+// and now you can create some instances
+var a = new MyArray(15)
+a[9] = a[10] = a[14] = '_'
+a[0] = 'nate'
+
+console.log(a)
+// [ 'nate', 2, 4, 6, 8, 10, 12, 14, 16, '_', '_', 22, 24, 26, '_' ]
+```
+
+API
+---
+
+The `ArrayIndex` base class is meant to be subclassed, but it also has a few
+convenient functions built-in.
+
+### "length" -> Number
+
+The length of the ArrayIndex instance. The `__get__` and `__set__` functions will
+only be invoked on the object up to this "length". You may set this length at any
+time to adjust the amount range where the getters/setters will be invoked.
+
+### "toArray()" -> Array
+
+Returns a new regular Array instance with the same values that this ArrayIndex
+class would have. This function calls the `__get__` function repeatedly from
+`0...length-1` and returns the "flattened" array instance.
+
+### "toJSON()" -> Array
+
+All `ArrayIndex` instances get basic support for `JSON.stringify()`, which is
+the same as a "flattened" Array being stringified.
+
+### "toString()" -> String
+
+The `toString()` override is basically just `array.toArray().toString()`.
+
+### "format()" -> String
+
+The `inspect()` implementation for the REPL attempts to mimic what a regular
+Array looks like in the REPL.
+
+
+License
+-------
+
+(The MIT License)
+
+Copyright (c) 2012 Nathan Rajlich <nathan at tootallnate.net>
+
+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/node_modules/path-array/node_modules/array-index/component.json b/node_modules/path-array/node_modules/array-index/component.json
new file mode 100644
index 0000000..390d7a7
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/component.json
@@ -0,0 +1,22 @@
+{
+  "name": "array-index",
+  "repo": "TooTallNate/array-index",
+  "description": "Invoke getter/setter functions on array-like objects",
+  "keywords": [
+    "index",
+    "array",
+    "getter",
+    "setter",
+    "proxy"
+  ],
+  "version": "0.1.1",
+  "dependencies": {
+    "visionmedia/debug": "*"
+  },
+  "development": {},
+  "license": "MIT",
+  "main": "index.js",
+  "scripts": [
+    "index.js"
+  ]
+}
diff --git a/node_modules/path-array/node_modules/array-index/index.js b/node_modules/path-array/node_modules/array-index/index.js
new file mode 100644
index 0000000..18069c6
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/index.js
@@ -0,0 +1,180 @@
+
+/**
+ * Module dependencies.
+ */
+
+var util = require('util')
+var debug = require('debug')('array-index')
+
+/**
+ * JavaScript Array "length" is bound to an unsigned 32-bit int.
+ * See: http://stackoverflow.com/a/6155063/376773
+ */
+
+var MAX_LENGTH = Math.pow(2, 32)
+
+/**
+ * Module exports.
+ */
+
+module.exports = ArrayIndex
+
+/**
+ * Subclass this.
+ */
+
+function ArrayIndex (length) {
+  Object.defineProperty(this, 'length', {
+    get: getLength,
+    set: setLength,
+    enumerable: false,
+    configurable: true
+  })
+
+  Object.defineProperty(this, '__length', {
+    value: 0,
+    writable: true,
+    enumerable: false,
+    configurable: true
+  })
+
+  if (arguments.length > 0) {
+    this.length = length
+  }
+}
+
+/**
+ * You overwrite the "__get__" function in your subclass.
+ */
+
+ArrayIndex.prototype.__get__ = function () {
+  throw new Error('you must implement the __get__ function')
+}
+
+/**
+ * You overwrite the "__set__" function in your subclass.
+ */
+
+ArrayIndex.prototype.__set__ = function () {
+  throw new Error('you must implement the __set__ function')
+}
+
+/**
+ * Converts this array class into a real JavaScript Array. Note that this
+ * is a "flattened" array and your defined getters and setters won't be invoked
+ * when you interact with the returned Array. This function will call the
+ * getter on every array index of the object.
+ *
+ * @return {Array} The flattened array
+ * @api public
+ */
+
+ArrayIndex.prototype.toArray = function toArray () {
+  var i = 0, l = this.length, array = new Array(l)
+  for (; i < l; i++) {
+    array[i] = this[i]
+  }
+  return array
+}
+
+/**
+ * Basic support for `JSON.stringify()`.
+ */
+
+ArrayIndex.prototype.toJSON = function toJSON () {
+  return this.toArray()
+}
+
+/**
+ * toString() override. Use Array.prototype.toString().
+ */
+
+ArrayIndex.prototype.toString = function toString () {
+  var a = this.toArray()
+  return a.toString.apply(a, arguments)
+}
+
+/**
+ * inspect() override. For the REPL.
+ */
+
+ArrayIndex.prototype.inspect = function inspect () {
+  var a = this.toArray()
+  Object.keys(this).forEach(function (k) {
+    a[k] = this[k]
+  }, this)
+  return util.inspect(a)
+}
+
+/**
+ * Getter for the "length" property.
+ * Returns the value of the "__length" property.
+ */
+
+function getLength () {
+  debug('getting "length": %o', this.__length)
+  return this.__length
+}
+
+/**
+ * Setter for the "length" property.
+ * Calls "ensureLength()", then sets the "__length" property.
+ */
+
+function setLength (v) {
+  debug('setting "length": %o', v)
+  return this.__length = ensureLength(v)
+}
+
+/**
+ * Ensures that getters/setters from 0 up to "_length" have been defined
+ * on `ArrayIndex.prototype`.
+ *
+ * @api private
+ */
+
+function ensureLength (_length) {
+  var length
+  if (_length > MAX_LENGTH) {
+    length = MAX_LENGTH
+  } else {
+    length = _length | 0
+  }
+  var cur = ArrayIndex.prototype.__length__ | 0
+  var num = length - cur
+  if (num > 0) {
+    var desc = {}
+    debug('creating a descriptor object with %o entries', num)
+    for (var i = cur; i < length; i++) {
+      desc[i] = setup(i)
+    }
+    debug('done creating descriptor object')
+    debug('calling `Object.defineProperties()` with %o entries', num)
+    Object.defineProperties(ArrayIndex.prototype, desc)
+    debug('finished `Object.defineProperties()`')
+    ArrayIndex.prototype.__length__ = length
+  }
+  return length
+}
+
+/**
+ * Returns a property descriptor for the given "index", with "get" and "set"
+ * functions created within the closure.
+ *
+ * @api private
+ */
+
+function setup (index) {
+  function get () {
+    return this.__get__(index)
+  }
+  function set (v) {
+    return this.__set__(index, v)
+  }
+  return {
+      enumerable: true
+    , configurable: true
+    , get: get
+    , set: set
+  }
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/.jshintrc b/node_modules/path-array/node_modules/array-index/node_modules/debug/.jshintrc
new file mode 100644
index 0000000..299877f
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/.jshintrc
@@ -0,0 +1,3 @@
+{
+  "laxbreak": true
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/.npmignore b/node_modules/path-array/node_modules/array-index/node_modules/debug/.npmignore
new file mode 100644
index 0000000..7e6163d
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/.npmignore
@@ -0,0 +1,6 @@
+support
+test
+examples
+example
+*.sock
+dist
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/History.md b/node_modules/path-array/node_modules/array-index/node_modules/debug/History.md
new file mode 100644
index 0000000..854c971
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/History.md
@@ -0,0 +1,195 @@
+
+2.2.0 / 2015-05-09
+==================
+
+  * package: update "ms" to v0.7.1 (#202, @dougwilson)
+  * README: add logging to file example (#193, @DanielOchoa)
+  * README: fixed a typo (#191, @amir-s)
+  * browser: expose `storage` (#190, @stephenmathieson)
+  * Makefile: add a `distclean` target (#189, @stephenmathieson)
+
+2.1.3 / 2015-03-13
+==================
+
+  * Updated stdout/stderr example (#186)
+  * Updated example/stdout.js to match debug current behaviour
+  * Renamed example/stderr.js to stdout.js
+  * Update Readme.md (#184)
+  * replace high intensity foreground color for bold (#182, #183)
+
+2.1.2 / 2015-03-01
+==================
+
+  * dist: recompile
+  * update "ms" to v0.7.0
+  * package: update "browserify" to v9.0.3
+  * component: fix "ms.js" repo location
+  * changed bower package name
+  * updated documentation about using debug in a browser
+  * fix: security error on safari (#167, #168, @yields)
+
+2.1.1 / 2014-12-29
+==================
+
+  * browser: use `typeof` to check for `console` existence
+  * browser: check for `console.log` truthiness (fix IE 8/9)
+  * browser: add support for Chrome apps
+  * Readme: added Windows usage remarks
+  * Add `bower.json` to properly support bower install
+
+2.1.0 / 2014-10-15
+==================
+
+  * node: implement `DEBUG_FD` env variable support
+  * package: update "browserify" to v6.1.0
+  * package: add "license" field to package.json (#135, @panuhorsmalahti)
+
+2.0.0 / 2014-09-01
+==================
+
+  * package: update "browserify" to v5.11.0
+  * node: use stderr rather than stdout for logging (#29, @stephenmathieson)
+
+1.0.4 / 2014-07-15
+==================
+
+  * dist: recompile
+  * example: remove `console.info()` log usage
+  * example: add "Content-Type" UTF-8 header to browser example
+  * browser: place %c marker after the space character
+  * browser: reset the "content" color via `color: inherit`
+  * browser: add colors support for Firefox >= v31
+  * debug: prefer an instance `log()` function over the global one (#119)
+  * Readme: update documentation about styled console logs for FF v31 (#116, @wryk)
+
+1.0.3 / 2014-07-09
+==================
+
+  * Add support for multiple wildcards in namespaces (#122, @seegno)
+  * browser: fix lint
+
+1.0.2 / 2014-06-10
+==================
+
+  * browser: update color palette (#113, @gscottolson)
+  * common: make console logging function configurable (#108, @timoxley)
+  * node: fix %o colors on old node <= 0.8.x
+  * Makefile: find node path using shell/which (#109, @timoxley)
+
+1.0.1 / 2014-06-06
+==================
+
+  * browser: use `removeItem()` to clear localStorage
+  * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777)
+  * package: add "contributors" section
+  * node: fix comment typo
+  * README: list authors
+
+1.0.0 / 2014-06-04
+==================
+
+  * make ms diff be global, not be scope
+  * debug: ignore empty strings in enable()
+  * node: make DEBUG_COLORS able to disable coloring
+  * *: export the `colors` array
+  * npmignore: don't publish the `dist` dir
+  * Makefile: refactor to use browserify
+  * package: add "browserify" as a dev dependency
+  * Readme: add Web Inspector Colors section
+  * node: reset terminal color for the debug content
+  * node: map "%o" to `util.inspect()`
+  * browser: map "%j" to `JSON.stringify()`
+  * debug: add custom "formatters"
+  * debug: use "ms" module for humanizing the diff
+  * Readme: add "bash" syntax highlighting
+  * browser: add Firebug color support
+  * browser: add colors for WebKit browsers
+  * node: apply log to `console`
+  * rewrite: abstract common logic for Node & browsers
+  * add .jshintrc file
+
+0.8.1 / 2014-04-14
+==================
+
+  * package: re-add the "component" section
+
+0.8.0 / 2014-03-30
+==================
+
+  * add `enable()` method for nodejs. Closes #27
+  * change from stderr to stdout
+  * remove unnecessary index.js file
+
+0.7.4 / 2013-11-13
+==================
+
+  * remove "browserify" key from package.json (fixes something in browserify)
+
+0.7.3 / 2013-10-30
+==================
+
+  * fix: catch localStorage security error when cookies are blocked (Chrome)
+  * add debug(err) support. Closes #46
+  * add .browser prop to package.json. Closes #42
+
+0.7.2 / 2013-02-06
+==================
+
+  * fix package.json
+  * fix: Mobile Safari (private mode) is broken with debug
+  * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript
+
+0.7.1 / 2013-02-05
+==================
+
+  * add repository URL to package.json
+  * add DEBUG_COLORED to force colored output
+  * add browserify support
+  * fix component. Closes #24
+
+0.7.0 / 2012-05-04
+==================
+
+  * Added .component to package.json
+  * Added debug.component.js build
+
+0.6.0 / 2012-03-16
+==================
+
+  * Added support for "-" prefix in DEBUG [Vinay Pulim]
+  * Added `.enabled` flag to the node version [TooTallNate]
+
+0.5.0 / 2012-02-02
+==================
+
+  * Added: humanize diffs. Closes #8
+  * Added `debug.disable()` to the CS variant
+  * Removed padding. Closes #10
+  * Fixed: persist client-side variant again. Closes #9
+
+0.4.0 / 2012-02-01
+==================
+
+  * Added browser variant support for older browsers [TooTallNate]
+  * Added `debug.enable('project:*')` to browser variant [TooTallNate]
+  * Added padding to diff (moved it to the right)
+
+0.3.0 / 2012-01-26
+==================
+
+  * Added millisecond diff when isatty, otherwise UTC string
+
+0.2.0 / 2012-01-22
+==================
+
+  * Added wildcard support
+
+0.1.0 / 2011-12-02
+==================
+
+  * Added: remove colors unless stderr isatty [TooTallNate]
+
+0.0.1 / 2010-01-03
+==================
+
+  * Initial release
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/Makefile b/node_modules/path-array/node_modules/array-index/node_modules/debug/Makefile
new file mode 100644
index 0000000..5cf4a59
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/Makefile
@@ -0,0 +1,36 @@
+
+# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
+THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
+THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)
+
+# BIN directory
+BIN := $(THIS_DIR)/node_modules/.bin
+
+# applications
+NODE ?= $(shell which node)
+NPM ?= $(NODE) $(shell which npm)
+BROWSERIFY ?= $(NODE) $(BIN)/browserify
+
+all: dist/debug.js
+
+install: node_modules
+
+clean:
+	@rm -rf dist
+
+dist:
+	@mkdir -p $@
+
+dist/debug.js: node_modules browser.js debug.js dist
+	@$(BROWSERIFY) \
+		--standalone debug \
+		. > $@
+
+distclean: clean
+	@rm -rf node_modules
+
+node_modules: package.json
+	@NODE_ENV= $(NPM) install
+	@touch node_modules
+
+.PHONY: all install clean distclean
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/Readme.md b/node_modules/path-array/node_modules/array-index/node_modules/debug/Readme.md
new file mode 100644
index 0000000..b4f45e3
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/Readme.md
@@ -0,0 +1,188 @@
+# debug
+
+  tiny node.js debugging utility modelled after node core's debugging technique.
+
+## Installation
+
+```bash
+$ npm install debug
+```
+
+## Usage
+
+ With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility.
+
+Example _app.js_:
+
+```js
+var debug = require('debug')('http')
+  , http = require('http')
+  , name = 'My App';
+
+// fake app
+
+debug('booting %s', name);
+
+http.createServer(function(req, res){
+  debug(req.method + ' ' + req.url);
+  res.end('hello\n');
+}).listen(3000, function(){
+  debug('listening');
+});
+
+// fake worker of some kind
+
+require('./worker');
+```
+
+Example _worker.js_:
+
+```js
+var debug = require('debug')('worker');
+
+setInterval(function(){
+  debug('doing some work');
+}, 1000);
+```
+
+ The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:
+
+  ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)
+
+  ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)
+
+#### Windows note
+
+ On Windows the environment variable is set using the `set` command.
+
+ ```cmd
+ set DEBUG=*,-not_this
+ ```
+
+Then, run the program to be debugged as usual.
+
+## Millisecond diff
+
+  When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.
+
+  ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)
+
+  When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:
+
+  ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)
+
+## Conventions
+
+ If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser".
+
+## Wildcards
+
+  The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.
+
+  You can also exclude specific debuggers by prefixing them with a "-" character.  For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:".
+
+## Browser support
+
+  Debug works in the browser as well, currently persisted by `localStorage`. Consider the situation shown below where you have `worker:a` and `worker:b`, and wish to debug both. Somewhere in the code on your page, include:
+
+```js
+window.myDebug = require("debug");
+```
+
+  ("debug" is a global object in the browser so we give this object a different name.) When your page is open in the browser, type the following in the console:
+
+```js
+myDebug.enable("worker:*")
+```
+
+  Refresh the page. Debug output will continue to be sent to the console until it is disabled by typing `myDebug.disable()` in the console.
+
+```js
+a = debug('worker:a');
+b = debug('worker:b');
+
+setInterval(function(){
+  a('doing some work');
+}, 1000);
+
+setInterval(function(){
+  b('doing some work');
+}, 1200);
+```
+
+#### Web Inspector Colors
+
+  Colors are also enabled on "Web Inspectors" that understand the `%c` formatting
+  option. These are WebKit web inspectors, Firefox ([since version
+  31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))
+  and the Firebug plugin for Firefox (any version).
+
+  Colored output looks something like:
+
+  ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png)
+
+### stderr vs stdout
+
+You can set an alternative logging method per-namespace by overriding the `log` method on a per-namespace or globally:
+
+Example _stdout.js_:
+
+```js
+var debug = require('debug');
+var error = debug('app:error');
+
+// by default stderr is used
+error('goes to stderr!');
+
+var log = debug('app:log');
+// set this namespace to log via console.log
+log.log = console.log.bind(console); // don't forget to bind to console!
+log('goes to stdout');
+error('still goes to stderr!');
+
+// set all output to go via console.info
+// overrides all per-namespace log settings
+debug.log = console.info.bind(console);
+error('now goes to stdout via console.info');
+log('still goes to stdout, but via console.info now');
+```
+
+### Save debug output to a file
+
+You can save all debug statements to a file by piping them.
+
+Example:
+
+```bash
+$ DEBUG_FD=3 node your-app.js 3> whatever.log
+```
+
+## Authors
+
+ - TJ Holowaychuk
+ - Nathan Rajlich
+
+## License
+
+(The MIT License)
+
+Copyright (c) 2014 TJ Holowaychuk <tj at 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/node_modules/path-array/node_modules/array-index/node_modules/debug/bower.json b/node_modules/path-array/node_modules/array-index/node_modules/debug/bower.json
new file mode 100644
index 0000000..6af573f
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/bower.json
@@ -0,0 +1,28 @@
+{
+  "name": "visionmedia-debug",
+  "main": "dist/debug.js",
+  "version": "2.2.0",
+  "homepage": "https://github.com/visionmedia/debug",
+  "authors": [
+    "TJ Holowaychuk <tj at vision-media.ca>"
+  ],
+  "description": "visionmedia-debug",
+  "moduleType": [
+    "amd",
+    "es6",
+    "globals",
+    "node"
+  ],
+  "keywords": [
+    "visionmedia",
+    "debug"
+  ],
+  "license": "MIT",
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests"
+  ]
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/browser.js b/node_modules/path-array/node_modules/array-index/node_modules/debug/browser.js
new file mode 100644
index 0000000..7c76452
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/browser.js
@@ -0,0 +1,168 @@
+
+/**
+ * This is the web browser implementation of `debug()`.
+ *
+ * Expose `debug()` as the module.
+ */
+
+exports = module.exports = require('./debug');
+exports.log = log;
+exports.formatArgs = formatArgs;
+exports.save = save;
+exports.load = load;
+exports.useColors = useColors;
+exports.storage = 'undefined' != typeof chrome
+               && 'undefined' != typeof chrome.storage
+                  ? chrome.storage.local
+                  : localstorage();
+
+/**
+ * Colors.
+ */
+
+exports.colors = [
+  'lightseagreen',
+  'forestgreen',
+  'goldenrod',
+  'dodgerblue',
+  'darkorchid',
+  'crimson'
+];
+
+/**
+ * Currently only WebKit-based Web Inspectors, Firefox >= v31,
+ * and the Firebug extension (any Firefox version) are known
+ * to support "%c" CSS customizations.
+ *
+ * TODO: add a `localStorage` variable to explicitly enable/disable colors
+ */
+
+function useColors() {
+  // is webkit? http://stackoverflow.com/a/16459606/376773
+  return ('WebkitAppearance' in document.documentElement.style) ||
+    // is firebug? http://stackoverflow.com/a/398120/376773
+    (window.console && (console.firebug || (console.exception && console.table))) ||
+    // is firefox >= v31?
+    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
+    (navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31);
+}
+
+/**
+ * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
+ */
+
+exports.formatters.j = function(v) {
+  return JSON.stringify(v);
+};
+
+
+/**
+ * Colorize log arguments if enabled.
+ *
+ * @api public
+ */
+
+function formatArgs() {
+  var args = arguments;
+  var useColors = this.useColors;
+
+  args[0] = (useColors ? '%c' : '')
+    + this.namespace
+    + (useColors ? ' %c' : ' ')
+    + args[0]
+    + (useColors ? '%c ' : ' ')
+    + '+' + exports.humanize(this.diff);
+
+  if (!useColors) return args;
+
+  var c = 'color: ' + this.color;
+  args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1));
+
+  // the final "%c" is somewhat tricky, because there could be other
+  // arguments passed either before or after the %c, so we need to
+  // figure out the correct index to insert the CSS into
+  var index = 0;
+  var lastC = 0;
+  args[0].replace(/%[a-z%]/g, function(match) {
+    if ('%%' === match) return;
+    index++;
+    if ('%c' === match) {
+      // we only are interested in the *last* %c
+      // (the user may have provided their own)
+      lastC = index;
+    }
+  });
+
+  args.splice(lastC, 0, c);
+  return args;
+}
+
+/**
+ * Invokes `console.log()` when available.
+ * No-op when `console.log` is not a "function".
+ *
+ * @api public
+ */
+
+function log() {
+  // this hackery is required for IE8/9, where
+  // the `console.log` function doesn't have 'apply'
+  return 'object' === typeof console
+    && console.log
+    && Function.prototype.apply.call(console.log, console, arguments);
+}
+
+/**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+
+function save(namespaces) {
+  try {
+    if (null == namespaces) {
+      exports.storage.removeItem('debug');
+    } else {
+      exports.storage.debug = namespaces;
+    }
+  } catch(e) {}
+}
+
+/**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+
+function load() {
+  var r;
+  try {
+    r = exports.storage.debug;
+  } catch(e) {}
+  return r;
+}
+
+/**
+ * Enable namespaces listed in `localStorage.debug` initially.
+ */
+
+exports.enable(load());
+
+/**
+ * Localstorage attempts to return the localstorage.
+ *
+ * This is necessary because safari throws
+ * when a user disables cookies/localstorage
+ * and you attempt to access it.
+ *
+ * @return {LocalStorage}
+ * @api private
+ */
+
+function localstorage(){
+  try {
+    return window.localStorage;
+  } catch (e) {}
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/component.json b/node_modules/path-array/node_modules/array-index/node_modules/debug/component.json
new file mode 100644
index 0000000..ca10637
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/component.json
@@ -0,0 +1,19 @@
+{
+  "name": "debug",
+  "repo": "visionmedia/debug",
+  "description": "small debugging utility",
+  "version": "2.2.0",
+  "keywords": [
+    "debug",
+    "log",
+    "debugger"
+  ],
+  "main": "browser.js",
+  "scripts": [
+    "browser.js",
+    "debug.js"
+  ],
+  "dependencies": {
+    "rauchg/ms.js": "0.7.1"
+  }
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/debug.js b/node_modules/path-array/node_modules/array-index/node_modules/debug/debug.js
new file mode 100644
index 0000000..7571a86
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/debug.js
@@ -0,0 +1,197 @@
+
+/**
+ * This is the common logic for both the Node.js and web browser
+ * implementations of `debug()`.
+ *
+ * Expose `debug()` as the module.
+ */
+
+exports = module.exports = debug;
+exports.coerce = coerce;
+exports.disable = disable;
+exports.enable = enable;
+exports.enabled = enabled;
+exports.humanize = require('ms');
+
+/**
+ * The currently active debug mode names, and names to skip.
+ */
+
+exports.names = [];
+exports.skips = [];
+
+/**
+ * Map of special "%n" handling functions, for the debug "format" argument.
+ *
+ * Valid key names are a single, lowercased letter, i.e. "n".
+ */
+
+exports.formatters = {};
+
+/**
+ * Previously assigned color.
+ */
+
+var prevColor = 0;
+
+/**
+ * Previous log timestamp.
+ */
+
+var prevTime;
+
+/**
+ * Select a color.
+ *
+ * @return {Number}
+ * @api private
+ */
+
+function selectColor() {
+  return exports.colors[prevColor++ % exports.colors.length];
+}
+
+/**
+ * Create a debugger with the given `namespace`.
+ *
+ * @param {String} namespace
+ * @return {Function}
+ * @api public
+ */
+
+function debug(namespace) {
+
+  // define the `disabled` version
+  function disabled() {
+  }
+  disabled.enabled = false;
+
+  // define the `enabled` version
+  function enabled() {
+
+    var self = enabled;
+
+    // set `diff` timestamp
+    var curr = +new Date();
+    var ms = curr - (prevTime || curr);
+    self.diff = ms;
+    self.prev = prevTime;
+    self.curr = curr;
+    prevTime = curr;
+
+    // add the `color` if not set
+    if (null == self.useColors) self.useColors = exports.useColors();
+    if (null == self.color && self.useColors) self.color = selectColor();
+
+    var args = Array.prototype.slice.call(arguments);
+
+    args[0] = exports.coerce(args[0]);
+
+    if ('string' !== typeof args[0]) {
+      // anything else let's inspect with %o
+      args = ['%o'].concat(args);
+    }
+
+    // apply any `formatters` transformations
+    var index = 0;
+    args[0] = args[0].replace(/%([a-z%])/g, function(match, format) {
+      // if we encounter an escaped % then don't increase the array index
+      if (match === '%%') return match;
+      index++;
+      var formatter = exports.formatters[format];
+      if ('function' === typeof formatter) {
+        var val = args[index];
+        match = formatter.call(self, val);
+
+        // now we need to remove `args[index]` since it's inlined in the `format`
+        args.splice(index, 1);
+        index--;
+      }
+      return match;
+    });
+
+    if ('function' === typeof exports.formatArgs) {
+      args = exports.formatArgs.apply(self, args);
+    }
+    var logFn = enabled.log || exports.log || console.log.bind(console);
+    logFn.apply(self, args);
+  }
+  enabled.enabled = true;
+
+  var fn = exports.enabled(namespace) ? enabled : disabled;
+
+  fn.namespace = namespace;
+
+  return fn;
+}
+
+/**
+ * Enables a debug mode by namespaces. This can include modes
+ * separated by a colon and wildcards.
+ *
+ * @param {String} namespaces
+ * @api public
+ */
+
+function enable(namespaces) {
+  exports.save(namespaces);
+
+  var split = (namespaces || '').split(/[\s,]+/);
+  var len = split.length;
+
+  for (var i = 0; i < len; i++) {
+    if (!split[i]) continue; // ignore empty strings
+    namespaces = split[i].replace(/\*/g, '.*?');
+    if (namespaces[0] === '-') {
+      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
+    } else {
+      exports.names.push(new RegExp('^' + namespaces + '$'));
+    }
+  }
+}
+
+/**
+ * Disable debug output.
+ *
+ * @api public
+ */
+
+function disable() {
+  exports.enable('');
+}
+
+/**
+ * Returns true if the given mode name is enabled, false otherwise.
+ *
+ * @param {String} name
+ * @return {Boolean}
+ * @api public
+ */
+
+function enabled(name) {
+  var i, len;
+  for (i = 0, len = exports.skips.length; i < len; i++) {
+    if (exports.skips[i].test(name)) {
+      return false;
+    }
+  }
+  for (i = 0, len = exports.names.length; i < len; i++) {
+    if (exports.names[i].test(name)) {
+      return true;
+    }
+  }
+  return false;
+}
+
+/**
+ * Coerce `val`.
+ *
+ * @param {Mixed} val
+ * @return {Mixed}
+ * @api private
+ */
+
+function coerce(val) {
+  if (val instanceof Error) return val.stack || val.message;
+  return val;
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/node.js b/node_modules/path-array/node_modules/array-index/node_modules/debug/node.js
new file mode 100644
index 0000000..1d392a8
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/node.js
@@ -0,0 +1,209 @@
+
+/**
+ * Module dependencies.
+ */
+
+var tty = require('tty');
+var util = require('util');
+
+/**
+ * This is the Node.js implementation of `debug()`.
+ *
+ * Expose `debug()` as the module.
+ */
+
+exports = module.exports = require('./debug');
+exports.log = log;
+exports.formatArgs = formatArgs;
+exports.save = save;
+exports.load = load;
+exports.useColors = useColors;
+
+/**
+ * Colors.
+ */
+
+exports.colors = [6, 2, 3, 4, 5, 1];
+
+/**
+ * The file descriptor to write the `debug()` calls to.
+ * Set the `DEBUG_FD` env variable to override with another value. i.e.:
+ *
+ *   $ DEBUG_FD=3 node script.js 3>debug.log
+ */
+
+var fd = parseInt(process.env.DEBUG_FD, 10) || 2;
+var stream = 1 === fd ? process.stdout :
+             2 === fd ? process.stderr :
+             createWritableStdioStream(fd);
+
+/**
+ * Is stdout a TTY? Colored output is enabled when `true`.
+ */
+
+function useColors() {
+  var debugColors = (process.env.DEBUG_COLORS || '').trim().toLowerCase();
+  if (0 === debugColors.length) {
+    return tty.isatty(fd);
+  } else {
+    return '0' !== debugColors
+        && 'no' !== debugColors
+        && 'false' !== debugColors
+        && 'disabled' !== debugColors;
+  }
+}
+
+/**
+ * Map %o to `util.inspect()`, since Node doesn't do that out of the box.
+ */
+
+var inspect = (4 === util.inspect.length ?
+  // node <= 0.8.x
+  function (v, colors) {
+    return util.inspect(v, void 0, void 0, colors);
+  } :
+  // node > 0.8.x
+  function (v, colors) {
+    return util.inspect(v, { colors: colors });
+  }
+);
+
+exports.formatters.o = function(v) {
+  return inspect(v, this.useColors)
+    .replace(/\s*\n\s*/g, ' ');
+};
+
+/**
+ * Adds ANSI color escape codes if enabled.
+ *
+ * @api public
+ */
+
+function formatArgs() {
+  var args = arguments;
+  var useColors = this.useColors;
+  var name = this.namespace;
+
+  if (useColors) {
+    var c = this.color;
+
+    args[0] = '  \u001b[3' + c + ';1m' + name + ' '
+      + '\u001b[0m'
+      + args[0] + '\u001b[3' + c + 'm'
+      + ' +' + exports.humanize(this.diff) + '\u001b[0m';
+  } else {
+    args[0] = new Date().toUTCString()
+      + ' ' + name + ' ' + args[0];
+  }
+  return args;
+}
+
+/**
+ * Invokes `console.error()` with the specified arguments.
+ */
+
+function log() {
+  return stream.write(util.format.apply(this, arguments) + '\n');
+}
+
+/**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+
+function save(namespaces) {
+  if (null == namespaces) {
+    // If you set a process.env field to null or undefined, it gets cast to the
+    // string 'null' or 'undefined'. Just delete instead.
+    delete process.env.DEBUG;
+  } else {
+    process.env.DEBUG = namespaces;
+  }
+}
+
+/**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+
+function load() {
+  return process.env.DEBUG;
+}
+
+/**
+ * Copied from `node/src/node.js`.
+ *
+ * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
+ * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
+ */
+
+function createWritableStdioStream (fd) {
+  var stream;
+  var tty_wrap = process.binding('tty_wrap');
+
+  // Note stream._type is used for test-module-load-list.js
+
+  switch (tty_wrap.guessHandleType(fd)) {
+    case 'TTY':
+      stream = new tty.WriteStream(fd);
+      stream._type = 'tty';
+
+      // Hack to have stream not keep the event loop alive.
+      // See https://github.com/joyent/node/issues/1726
+      if (stream._handle && stream._handle.unref) {
+        stream._handle.unref();
+      }
+      break;
+
+    case 'FILE':
+      var fs = require('fs');
+      stream = new fs.SyncWriteStream(fd, { autoClose: false });
+      stream._type = 'fs';
+      break;
+
+    case 'PIPE':
+    case 'TCP':
+      var net = require('net');
+      stream = new net.Socket({
+        fd: fd,
+        readable: false,
+        writable: true
+      });
+
+      // FIXME Should probably have an option in net.Socket to create a
+      // stream from an existing fd which is writable only. But for now
+      // we'll just add this hack and set the `readable` member to false.
+      // Test: ./node test/fixtures/echo.js < /etc/passwd
+      stream.readable = false;
+      stream.read = null;
+      stream._type = 'pipe';
+
+      // FIXME Hack to have stream not keep the event loop alive.
+      // See https://github.com/joyent/node/issues/1726
+      if (stream._handle && stream._handle.unref) {
+        stream._handle.unref();
+      }
+      break;
+
+    default:
+      // Probably an error on in uv_guess_handle()
+      throw new Error('Implement me. Unknown stream file type!');
+  }
+
+  // For supporting legacy API we put the FD here.
+  stream.fd = fd;
+
+  stream._isStdio = true;
+
+  return stream;
+}
+
+/**
+ * Enable namespaces listed in `process.env.DEBUG` initially.
+ */
+
+exports.enable(load());
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/.npmignore b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/.npmignore
new file mode 100644
index 0000000..d1aa0ce
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/.npmignore
@@ -0,0 +1,5 @@
+node_modules
+test
+History.md
+Makefile
+component.json
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/History.md b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/History.md
new file mode 100644
index 0000000..32fdfc1
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/History.md
@@ -0,0 +1,66 @@
+
+0.7.1 / 2015-04-20
+==================
+
+  * prevent extraordinary long inputs (@evilpacket)
+  * Fixed broken readme link
+
+0.7.0 / 2014-11-24
+==================
+
+ * add time abbreviations, updated tests and readme for the new units
+ * fix example in the readme.
+ * add LICENSE file
+
+0.6.2 / 2013-12-05
+==================
+
+ * Adding repository section to package.json to suppress warning from NPM.
+
+0.6.1 / 2013-05-10
+==================
+
+  * fix singularization [visionmedia]
+
+0.6.0 / 2013-03-15
+==================
+
+  * fix minutes
+
+0.5.1 / 2013-02-24
+==================
+
+  * add component namespace
+
+0.5.0 / 2012-11-09
+==================
+
+  * add short formatting as default and .long option
+  * add .license property to component.json
+  * add version to component.json
+
+0.4.0 / 2012-10-22
+==================
+
+  * add rounding to fix crazy decimals
+
+0.3.0 / 2012-09-07
+==================
+
+  * fix `ms(<String>)` [visionmedia]
+
+0.2.0 / 2012-09-03
+==================
+
+  * add component.json [visionmedia]
+  * add days support [visionmedia]
+  * add hours support [visionmedia]
+  * add minutes support [visionmedia]
+  * add seconds support [visionmedia]
+  * add ms string support [visionmedia]
+  * refactor tests to facilitate ms(number) [visionmedia]
+
+0.1.0 / 2012-03-07
+==================
+
+  * Initial release
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/LICENSE b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/LICENSE
new file mode 100644
index 0000000..6c07561
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/LICENSE
@@ -0,0 +1,20 @@
+(The MIT License)
+
+Copyright (c) 2014 Guillermo Rauch <rauchg at 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/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/README.md b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/README.md
new file mode 100644
index 0000000..9b4fd03
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/README.md
@@ -0,0 +1,35 @@
+# ms.js: miliseconds conversion utility
+
+```js
+ms('2 days')  // 172800000
+ms('1d')      // 86400000
+ms('10h')     // 36000000
+ms('2.5 hrs') // 9000000
+ms('2h')      // 7200000
+ms('1m')      // 60000
+ms('5s')      // 5000
+ms('100')     // 100
+```
+
+```js
+ms(60000)             // "1m"
+ms(2 * 60000)         // "2m"
+ms(ms('10 hours'))    // "10h"
+```
+
+```js
+ms(60000, { long: true })             // "1 minute"
+ms(2 * 60000, { long: true })         // "2 minutes"
+ms(ms('10 hours'), { long: true })    // "10 hours"
+```
+
+- Node/Browser compatible. Published as [`ms`](https://www.npmjs.org/package/ms) in [NPM](http://nodejs.org/download).
+- If a number is supplied to `ms`, a string with a unit is returned.
+- If a string that contains the number is supplied, it returns it as
+a number (e.g: it returns `100` for `'100'`).
+- If you pass a string with a number and a valid unit, the number of
+equivalent ms is returned.
+
+## License
+
+MIT
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/index.js b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/index.js
new file mode 100644
index 0000000..4f92771
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/index.js
@@ -0,0 +1,125 @@
+/**
+ * Helpers.
+ */
+
+var s = 1000;
+var m = s * 60;
+var h = m * 60;
+var d = h * 24;
+var y = d * 365.25;
+
+/**
+ * Parse or format the given `val`.
+ *
+ * Options:
+ *
+ *  - `long` verbose formatting [false]
+ *
+ * @param {String|Number} val
+ * @param {Object} options
+ * @return {String|Number}
+ * @api public
+ */
+
+module.exports = function(val, options){
+  options = options || {};
+  if ('string' == typeof val) return parse(val);
+  return options.long
+    ? long(val)
+    : short(val);
+};
+
+/**
+ * Parse the given `str` and return milliseconds.
+ *
+ * @param {String} str
+ * @return {Number}
+ * @api private
+ */
+
+function parse(str) {
+  str = '' + str;
+  if (str.length > 10000) return;
+  var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str);
+  if (!match) return;
+  var n = parseFloat(match[1]);
+  var type = (match[2] || 'ms').toLowerCase();
+  switch (type) {
+    case 'years':
+    case 'year':
+    case 'yrs':
+    case 'yr':
+    case 'y':
+      return n * y;
+    case 'days':
+    case 'day':
+    case 'd':
+      return n * d;
+    case 'hours':
+    case 'hour':
+    case 'hrs':
+    case 'hr':
+    case 'h':
+      return n * h;
+    case 'minutes':
+    case 'minute':
+    case 'mins':
+    case 'min':
+    case 'm':
+      return n * m;
+    case 'seconds':
+    case 'second':
+    case 'secs':
+    case 'sec':
+    case 's':
+      return n * s;
+    case 'milliseconds':
+    case 'millisecond':
+    case 'msecs':
+    case 'msec':
+    case 'ms':
+      return n;
+  }
+}
+
+/**
+ * Short format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+function short(ms) {
+  if (ms >= d) return Math.round(ms / d) + 'd';
+  if (ms >= h) return Math.round(ms / h) + 'h';
+  if (ms >= m) return Math.round(ms / m) + 'm';
+  if (ms >= s) return Math.round(ms / s) + 's';
+  return ms + 'ms';
+}
+
+/**
+ * Long format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+function long(ms) {
+  return plural(ms, d, 'day')
+    || plural(ms, h, 'hour')
+    || plural(ms, m, 'minute')
+    || plural(ms, s, 'second')
+    || ms + ' ms';
+}
+
+/**
+ * Pluralization helper.
+ */
+
+function plural(ms, n, name) {
+  if (ms < n) return;
+  if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name;
+  return Math.ceil(ms / n) + ' ' + name + 's';
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/package.json b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/package.json
new file mode 100644
index 0000000..253335e
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/package.json
@@ -0,0 +1,48 @@
+{
+  "name": "ms",
+  "version": "0.7.1",
+  "description": "Tiny ms conversion utility",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/guille/ms.js.git"
+  },
+  "main": "./index",
+  "devDependencies": {
+    "mocha": "*",
+    "expect.js": "*",
+    "serve": "*"
+  },
+  "component": {
+    "scripts": {
+      "ms/index.js": "index.js"
+    }
+  },
+  "gitHead": "713dcf26d9e6fd9dbc95affe7eff9783b7f1b909",
+  "bugs": {
+    "url": "https://github.com/guille/ms.js/issues"
+  },
+  "homepage": "https://github.com/guille/ms.js",
+  "_id": "ms at 0.7.1",
+  "scripts": {},
+  "_shasum": "9cd13c03adbff25b65effde7ce864ee952017098",
+  "_from": "ms at 0.7.1",
+  "_npmVersion": "2.7.5",
+  "_nodeVersion": "0.12.2",
+  "_npmUser": {
+    "name": "rauchg",
+    "email": "rauchg at gmail.com"
+  },
+  "maintainers": [
+    {
+      "name": "rauchg",
+      "email": "rauchg at gmail.com"
+    }
+  ],
+  "dist": {
+    "shasum": "9cd13c03adbff25b65effde7ce864ee952017098",
+    "tarball": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz"
+  },
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+  "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/package.json b/node_modules/path-array/node_modules/array-index/node_modules/debug/package.json
new file mode 100644
index 0000000..7e6d9fc
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/package.json
@@ -0,0 +1,73 @@
+{
+  "name": "debug",
+  "version": "2.2.0",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/visionmedia/debug.git"
+  },
+  "description": "small debugging utility",
+  "keywords": [
+    "debug",
+    "log",
+    "debugger"
+  ],
+  "author": {
+    "name": "TJ Holowaychuk",
+    "email": "tj at vision-media.ca"
+  },
+  "contributors": [
+    {
+      "name": "Nathan Rajlich",
+      "email": "nathan at tootallnate.net",
+      "url": "http://n8.io"
+    }
+  ],
+  "license": "MIT",
+  "dependencies": {
+    "ms": "0.7.1"
+  },
+  "devDependencies": {
+    "browserify": "9.0.3",
+    "mocha": "*"
+  },
+  "main": "./node.js",
+  "browser": "./browser.js",
+  "component": {
+    "scripts": {
+      "debug/index.js": "browser.js",
+      "debug/debug.js": "debug.js"
+    }
+  },
+  "gitHead": "b38458422b5aa8aa6d286b10dfe427e8a67e2b35",
+  "bugs": {
+    "url": "https://github.com/visionmedia/debug/issues"
+  },
+  "homepage": "https://github.com/visionmedia/debug",
+  "_id": "debug at 2.2.0",
+  "scripts": {},
+  "_shasum": "f87057e995b1a1f6ae6a4960664137bc56f039da",
+  "_from": "debug@*",
+  "_npmVersion": "2.7.4",
+  "_nodeVersion": "0.12.2",
+  "_npmUser": {
+    "name": "tootallnate",
+    "email": "nathan at tootallnate.net"
+  },
+  "maintainers": [
+    {
+      "name": "tjholowaychuk",
+      "email": "tj at vision-media.ca"
+    },
+    {
+      "name": "tootallnate",
+      "email": "nathan at tootallnate.net"
+    }
+  ],
+  "dist": {
+    "shasum": "f87057e995b1a1f6ae6a4960664137bc56f039da",
+    "tarball": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz"
+  },
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+  "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/path-array/node_modules/array-index/package.json b/node_modules/path-array/node_modules/array-index/package.json
new file mode 100644
index 0000000..6ba9df7
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/package.json
@@ -0,0 +1,58 @@
+{
+  "name": "array-index",
+  "description": "Invoke getter/setter functions on array-like objects",
+  "keywords": [
+    "index",
+    "array",
+    "getter",
+    "setter",
+    "proxy"
+  ],
+  "version": "0.1.1",
+  "author": {
+    "name": "Nathan Rajlich",
+    "email": "nathan at tootallnate.net",
+    "url": "http://tootallnate.net"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/TooTallNate/array-index.git"
+  },
+  "main": "index.js",
+  "scripts": {
+    "test": "node test"
+  },
+  "dependencies": {
+    "debug": "*"
+  },
+  "engines": {
+    "node": "*"
+  },
+  "gitHead": "65a5d884f25b4b7a1608e367d715d713dbd3b3d6",
+  "bugs": {
+    "url": "https://github.com/TooTallNate/array-index/issues"
+  },
+  "homepage": "https://github.com/TooTallNate/array-index",
+  "_id": "array-index at 0.1.1",
+  "_shasum": "4d5eaf06cc3d925847cd73d1535c217ba306d3e1",
+  "_from": "array-index@>=0.1.0 <0.2.0",
+  "_npmVersion": "2.1.3",
+  "_nodeVersion": "0.10.32",
+  "_npmUser": {
+    "name": "tootallnate",
+    "email": "nathan at tootallnate.net"
+  },
+  "maintainers": [
+    {
+      "name": "tootallnate",
+      "email": "nathan at tootallnate.net"
+    }
+  ],
+  "dist": {
+    "shasum": "4d5eaf06cc3d925847cd73d1535c217ba306d3e1",
+    "tarball": "http://registry.npmjs.org/array-index/-/array-index-0.1.1.tgz"
+  },
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/array-index/-/array-index-0.1.1.tgz",
+  "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/path-array/package.json b/node_modules/path-array/package.json
new file mode 100644
index 0000000..41d2548
--- /dev/null
+++ b/node_modules/path-array/package.json
@@ -0,0 +1,56 @@
+{
+  "name": "path-array",
+  "version": "1.0.0",
+  "description": "Treat your $PATH like a JavaScript Array",
+  "main": "index.js",
+  "scripts": {
+    "test": "mocha --reporter spec"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/TooTallNate/node-path-array.git"
+  },
+  "keywords": [
+    "PATH",
+    "env",
+    "array"
+  ],
+  "author": {
+    "name": "Nathan Rajlich",
+    "email": "nathan at tootallnate.net",
+    "url": "http://n8.io/"
+  },
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/TooTallNate/node-path-array/issues"
+  },
+  "homepage": "https://github.com/TooTallNate/node-path-array",
+  "dependencies": {
+    "array-index": "~0.1.0"
+  },
+  "devDependencies": {
+    "mocha": "~1.16.1"
+  },
+  "gitHead": "5d1fedd54e4413459f67e4a4babb024144cd00d0",
+  "_id": "path-array at 1.0.0",
+  "_shasum": "6c14130c33084f0150553c657b38397ab67aaa4e",
+  "_from": "path-array@>=1.0.0 <2.0.0",
+  "_npmVersion": "1.4.28",
+  "_npmUser": {
+    "name": "tootallnate",
+    "email": "nathan at tootallnate.net"
+  },
+  "maintainers": [
+    {
+      "name": "tootallnate",
+      "email": "nathan at tootallnate.net"
+    }
+  ],
+  "dist": {
+    "shasum": "6c14130c33084f0150553c657b38397ab67aaa4e",
+    "tarball": "http://registry.npmjs.org/path-array/-/path-array-1.0.0.tgz"
+  },
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.0.tgz",
+  "readme": "ERROR: No README data found!"
+}
diff --git a/package.json b/package.json
index db3b9de..b6f6133 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,7 @@
 {
   "name": "node-gyp",
   "description": "Node.js native addon build tool",
+  "license": "MIT",
   "keywords": [
     "native",
     "addon",
@@ -10,7 +11,7 @@
     "bindings",
     "gyp"
   ],
-  "version": "0.12.2",
+  "version": "2.0.2",
   "installVersion": 9,
   "author": "Nathan Rajlich <nathan at tootallnate.net> (http://tootallnate.net)",
   "repository": {
@@ -21,18 +22,19 @@
   "bin": "./bin/node-gyp.js",
   "main": "./lib/node-gyp.js",
   "dependencies": {
-    "glob": "3",
-    "graceful-fs": "2",
-    "fstream": "0",
-    "minimatch": "0",
-    "mkdirp": "0",
-    "nopt": "2",
-    "npmlog": "0",
+    "fstream": "^1.0.0",
+    "glob": "3 || 4",
+    "graceful-fs": "3",
+    "minimatch": "1",
+    "mkdirp": "^0.5.0",
+    "nopt": "2 || 3",
+    "npmlog": "0 || 1",
     "osenv": "0",
+    "path-array": "^1.0.0",
     "request": "2",
     "rimraf": "2",
-    "semver": "~2.2.1",
-    "tar": "0",
+    "semver": "2.x || 3.x || 4",
+    "tar": "^1.0.0",
     "which": "1"
   },
   "engines": {
diff --git a/src/win_delay_load_hook.c b/src/win_delay_load_hook.c
new file mode 100644
index 0000000..f397cfa
--- /dev/null
+++ b/src/win_delay_load_hook.c
@@ -0,0 +1,33 @@
+/*
+ * When this file is linked to a DLL, it sets up a delay-load hook that
+ * intervenes when the DLL is trying to load 'node.exe' or 'iojs.exe'
+ * dynamically. Instead of trying to locate the .exe file it'll just return
+ * a handle to the process image.
+ *
+ * This allows compiled addons to work when node.exe or iojs.exe is renamed.
+ */
+
+#ifdef _MSC_VER
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#include <delayimp.h>
+#include <string.h>
+
+static FARPROC WINAPI load_exe_hook(unsigned int event, DelayLoadInfo* info) {
+  HMODULE m;
+  if (event != dliNotePreLoadLibrary)
+    return NULL;
+
+  if (_stricmp(info->szDll, "iojs.exe") != 0 &&
+      _stricmp(info->szDll, "node.exe") != 0)
+    return NULL;
+
+  m = GetModuleHandle(NULL);
+  return (FARPROC) m;
+}
+
+PfnDliHook __pfnDliNotifyHook2 = load_exe_hook;
+
+#endif

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/node-gyp.git



More information about the Pkg-javascript-commits mailing list