From 986110e0295e1b384376339d769005ab1e538fcb Mon Sep 17 00:00:00 2001
From: Ben Coombs <bencoombs@protonmail.com>
Date: Fri, 15 Jan 2021 08:03:32 +1300
Subject: [PATCH] Added node.js server to communicate with Arduino device over
 serial port

---
 node_modules/.bin/detect-libc                 |   15 +
 node_modules/.bin/detect-libc.cmd             |   17 +
 node_modules/.bin/detect-libc.ps1             |   18 +
 node_modules/.bin/prebuild-install            |   15 +
 node_modules/.bin/prebuild-install.cmd        |   17 +
 node_modules/.bin/prebuild-install.ps1        |   18 +
 node_modules/.bin/rc                          |   15 +
 node_modules/.bin/rc.cmd                      |   17 +
 node_modules/.bin/rc.ps1                      |   18 +
 node_modules/.bin/semver                      |   15 +
 node_modules/.bin/semver.cmd                  |   17 +
 node_modules/.bin/semver.ps1                  |   18 +
 .../@serialport/binding-abstract/CHANGELOG.md |   35 +
 .../@serialport/binding-abstract/LICENSE      |   21 +
 .../@serialport/binding-abstract/README.md    |   14 +
 .../@serialport/binding-abstract/lib/index.js |  221 ++
 .../@serialport/binding-abstract/package.json |   55 +
 .../@serialport/binding-mock/CHANGELOG.md     |   35 +
 node_modules/@serialport/binding-mock/LICENSE |   21 +
 .../@serialport/binding-mock/README.md        |   11 +
 .../@serialport/binding-mock/lib/index.js     |  233 ++
 .../@serialport/binding-mock/lib/legacy.js    |   26 +
 .../@serialport/binding-mock/package.json     |   55 +
 .../@serialport/bindings/.prebuild-installrc  |    3 +
 .../@serialport/bindings/CHANGELOG.md         |   82 +
 node_modules/@serialport/bindings/LICENSE     |   21 +
 node_modules/@serialport/bindings/README.md   |   13 +
 node_modules/@serialport/bindings/binding.gyp |   67 +
 .../bindings/build/Release/bindings.node      |  Bin 0 -> 211456 bytes
 .../@serialport/bindings/lib/darwin.js        |  110 +
 .../@serialport/bindings/lib/index.js         |   15 +
 .../@serialport/bindings/lib/legacy.js        |   26 +
 .../@serialport/bindings/lib/linux-list.js    |  100 +
 .../@serialport/bindings/lib/linux.js         |  110 +
 .../@serialport/bindings/lib/poller.js        |  111 +
 .../@serialport/bindings/lib/unix-read.js     |   57 +
 .../@serialport/bindings/lib/unix-write.js    |   57 +
 .../bindings/lib/win32-sn-parser.js           |   14 +
 .../@serialport/bindings/lib/win32.js         |  123 +
 .../@serialport/bindings/package.json         |   81 +
 .../@serialport/bindings/src/darwin_list.cpp  |  359 ++
 .../@serialport/bindings/src/darwin_list.h    |   46 +
 .../@serialport/bindings/src/poller.cpp       |  142 +
 .../@serialport/bindings/src/poller.h         |   34 +
 .../@serialport/bindings/src/serialport.cpp   |  483 +++
 .../@serialport/bindings/src/serialport.h     |  138 +
 .../bindings/src/serialport_linux.cpp         |   39 +
 .../bindings/src/serialport_linux.h           |    8 +
 .../bindings/src/serialport_unix.cpp          |  400 +++
 .../bindings/src/serialport_unix.h            |    7 +
 .../bindings/src/serialport_win.cpp           |  953 ++++++
 .../@serialport/bindings/src/serialport_win.h |   74 +
 .../parser-byte-length/CHANGELOG.md           |   24 +
 .../@serialport/parser-byte-length/LICENSE    |   21 +
 .../@serialport/parser-byte-length/README.md  |    1 +
 .../parser-byte-length/lib/index.js           |   55 +
 .../parser-byte-length/package.json           |   48 +
 .../@serialport/parser-cctalk/CHANGELOG.md    |   24 +
 .../@serialport/parser-cctalk/LICENSE         |   21 +
 .../@serialport/parser-cctalk/README.md       |    1 +
 .../@serialport/parser-cctalk/lib/index.js    |   52 +
 .../@serialport/parser-cctalk/package.json    |   48 +
 .../@serialport/parser-delimiter/CHANGELOG.md |   24 +
 .../@serialport/parser-delimiter/LICENSE      |   21 +
 .../@serialport/parser-delimiter/README.md    |    1 +
 .../@serialport/parser-delimiter/lib/index.js |   49 +
 .../@serialport/parser-delimiter/package.json |   49 +
 .../@serialport/parser-readline/CHANGELOG.md  |   24 +
 .../@serialport/parser-readline/LICENSE       |   21 +
 .../@serialport/parser-readline/README.md     |    1 +
 .../@serialport/parser-readline/lib/index.js  |   30 +
 .../@serialport/parser-readline/package.json  |   52 +
 .../@serialport/parser-ready/CHANGELOG.md     |   24 +
 node_modules/@serialport/parser-ready/LICENSE |   21 +
 .../@serialport/parser-ready/README.md        |    1 +
 .../@serialport/parser-ready/lib/index.js     |   63 +
 .../@serialport/parser-ready/package.json     |   48 +
 .../@serialport/parser-regex/CHANGELOG.md     |   24 +
 node_modules/@serialport/parser-regex/LICENSE |   21 +
 .../@serialport/parser-regex/README.md        |    1 +
 .../@serialport/parser-regex/lib/index.js     |   53 +
 .../@serialport/parser-regex/package.json     |   48 +
 node_modules/@serialport/stream/CHANGELOG.md  |   36 +
 node_modules/@serialport/stream/LICENSE       |   21 +
 node_modules/@serialport/stream/README.md     |   16 +
 node_modules/@serialport/stream/lib/index.js  |  656 ++++
 node_modules/@serialport/stream/package.json  |   54 +
 node_modules/ansi-regex/index.js              |    4 +
 node_modules/ansi-regex/license               |   21 +
 node_modules/ansi-regex/package.json          |  108 +
 node_modules/ansi-regex/readme.md             |   39 +
 node_modules/aproba/LICENSE                   |   14 +
 node_modules/aproba/README.md                 |   94 +
 node_modules/aproba/index.js                  |  105 +
 node_modules/aproba/package.json              |   62 +
 node_modules/are-we-there-yet/CHANGES.md      |   37 +
 node_modules/are-we-there-yet/LICENSE         |    5 +
 node_modules/are-we-there-yet/README.md       |  195 ++
 node_modules/are-we-there-yet/index.js        |    4 +
 node_modules/are-we-there-yet/package.json    |   63 +
 node_modules/are-we-there-yet/tracker-base.js |   11 +
 .../are-we-there-yet/tracker-group.js         |  107 +
 .../are-we-there-yet/tracker-stream.js        |   36 +
 node_modules/are-we-there-yet/tracker.js      |   30 +
 node_modules/base64-js/LICENSE                |   21 +
 node_modules/base64-js/README.md              |   34 +
 node_modules/base64-js/base64js.min.js        |    1 +
 node_modules/base64-js/index.d.ts             |    3 +
 node_modules/base64-js/index.js               |  150 +
 node_modules/base64-js/package.json           |   75 +
 node_modules/bindings/LICENSE.md              |   22 +
 node_modules/bindings/README.md               |   98 +
 node_modules/bindings/bindings.js             |  221 ++
 node_modules/bindings/package.json            |   57 +
 node_modules/bl/.travis.yml                   |   16 +
 node_modules/bl/BufferList.js                 |  396 +++
 node_modules/bl/LICENSE.md                    |   13 +
 node_modules/bl/README.md                     |  247 ++
 node_modules/bl/bl.js                         |   84 +
 .../readable-stream/CONTRIBUTING.md           |   38 +
 .../readable-stream/GOVERNANCE.md             |  136 +
 .../bl/node_modules/readable-stream/LICENSE   |   47 +
 .../bl/node_modules/readable-stream/README.md |  106 +
 .../readable-stream/errors-browser.js         |  127 +
 .../bl/node_modules/readable-stream/errors.js |  116 +
 .../readable-stream/experimentalWarning.js    |   17 +
 .../readable-stream/lib/_stream_duplex.js     |  139 +
 .../lib/_stream_passthrough.js                |   39 +
 .../readable-stream/lib/_stream_readable.js   | 1124 +++++++
 .../readable-stream/lib/_stream_transform.js  |  201 ++
 .../readable-stream/lib/_stream_writable.js   |  697 ++++
 .../lib/internal/streams/async_iterator.js    |  207 ++
 .../lib/internal/streams/buffer_list.js       |  210 ++
 .../lib/internal/streams/destroy.js           |  105 +
 .../lib/internal/streams/end-of-stream.js     |  104 +
 .../lib/internal/streams/from-browser.js      |    3 +
 .../lib/internal/streams/from.js              |   64 +
 .../lib/internal/streams/pipeline.js          |   97 +
 .../lib/internal/streams/state.js             |   27 +
 .../lib/internal/streams/stream-browser.js    |    1 +
 .../lib/internal/streams/stream.js            |    1 +
 .../node_modules/readable-stream/package.json |   97 +
 .../readable-stream/readable-browser.js       |    9 +
 .../node_modules/readable-stream/readable.js  |   16 +
 node_modules/bl/package.json                  |   69 +
 node_modules/bl/test/convert.js               |   21 +
 node_modules/bl/test/indexOf.js               |  492 +++
 node_modules/bl/test/isBufferList.js          |   32 +
 node_modules/bl/test/test.js                  |  851 +++++
 node_modules/buffer/AUTHORS.md                |   70 +
 node_modules/buffer/LICENSE                   |   21 +
 node_modules/buffer/README.md                 |  410 +++
 node_modules/buffer/index.d.ts                |  186 ++
 node_modules/buffer/index.js                  | 1817 +++++++++++
 node_modules/buffer/package.json              |  127 +
 node_modules/chownr/LICENSE                   |   15 +
 node_modules/chownr/README.md                 |    3 +
 node_modules/chownr/chownr.js                 |  167 +
 node_modules/chownr/package.json              |   62 +
 node_modules/code-point-at/index.js           |   32 +
 node_modules/code-point-at/license            |   21 +
 node_modules/code-point-at/package.json       |   70 +
 node_modules/code-point-at/readme.md          |   32 +
 node_modules/console-control-strings/LICENSE  |   13 +
 .../console-control-strings/README.md         |  145 +
 .../console-control-strings/README.md~        |  140 +
 node_modules/console-control-strings/index.js |  125 +
 .../console-control-strings/package.json      |   61 +
 node_modules/core-util-is/LICENSE             |   19 +
 node_modules/core-util-is/README.md           |    3 +
 node_modules/core-util-is/float.patch         |  604 ++++
 node_modules/core-util-is/lib/util.js         |  107 +
 node_modules/core-util-is/package.json        |   62 +
 node_modules/core-util-is/test.js             |   68 +
 node_modules/debug/LICENSE                    |   19 +
 node_modules/debug/README.md                  |  455 +++
 node_modules/debug/package.json               |  105 +
 node_modules/debug/src/browser.js             |  269 ++
 node_modules/debug/src/common.js              |  261 ++
 node_modules/debug/src/index.js               |   10 +
 node_modules/debug/src/node.js                |  263 ++
 node_modules/decompress-response/index.d.ts   |   29 +
 node_modules/decompress-response/index.js     |   40 +
 node_modules/decompress-response/license      |    9 +
 node_modules/decompress-response/package.json |   82 +
 node_modules/decompress-response/readme.md    |   52 +
 node_modules/deep-extend/CHANGELOG.md         |   46 +
 node_modules/deep-extend/LICENSE              |   20 +
 node_modules/deep-extend/README.md            |   91 +
 node_modules/deep-extend/index.js             |    1 +
 node_modules/deep-extend/lib/deep-extend.js   |  150 +
 node_modules/deep-extend/package.json         |   92 +
 node_modules/delegates/.npmignore             |    1 +
 node_modules/delegates/History.md             |   22 +
 node_modules/delegates/License                |   20 +
 node_modules/delegates/Makefile               |    8 +
 node_modules/delegates/Readme.md              |   94 +
 node_modules/delegates/index.js               |  121 +
 node_modules/delegates/package.json           |   48 +
 node_modules/delegates/test/index.js          |   94 +
 node_modules/detect-libc/.npmignore           |    7 +
 node_modules/detect-libc/LICENSE              |  201 ++
 node_modules/detect-libc/README.md            |   78 +
 node_modules/detect-libc/bin/detect-libc.js   |   18 +
 node_modules/detect-libc/lib/detect-libc.js   |   92 +
 node_modules/detect-libc/package.json         |   70 +
 node_modules/end-of-stream/LICENSE            |   21 +
 node_modules/end-of-stream/README.md          |   54 +
 node_modules/end-of-stream/index.js           |   94 +
 node_modules/end-of-stream/package.json       |   66 +
 node_modules/expand-template/.travis.yml      |    6 +
 node_modules/expand-template/LICENSE          |   21 +
 node_modules/expand-template/README.md        |   43 +
 node_modules/expand-template/index.js         |   26 +
 node_modules/expand-template/package.json     |   60 +
 node_modules/expand-template/test.js          |   67 +
 node_modules/file-uri-to-path/.npmignore      |    1 +
 node_modules/file-uri-to-path/.travis.yml     |   30 +
 node_modules/file-uri-to-path/History.md      |   21 +
 node_modules/file-uri-to-path/LICENSE         |   20 +
 node_modules/file-uri-to-path/README.md       |   74 +
 node_modules/file-uri-to-path/index.d.ts      |    2 +
 node_modules/file-uri-to-path/index.js        |   66 +
 node_modules/file-uri-to-path/package.json    |   61 +
 node_modules/file-uri-to-path/test/test.js    |   24 +
 node_modules/file-uri-to-path/test/tests.json |   13 +
 node_modules/fs-constants/LICENSE             |   21 +
 node_modules/fs-constants/README.md           |   26 +
 node_modules/fs-constants/browser.js          |    1 +
 node_modules/fs-constants/index.js            |    1 +
 node_modules/fs-constants/package.json        |   47 +
 node_modules/gauge/CHANGELOG.md               |  160 +
 node_modules/gauge/LICENSE                    |   13 +
 node_modules/gauge/README.md                  |  399 +++
 node_modules/gauge/base-theme.js              |   14 +
 node_modules/gauge/error.js                   |   24 +
 node_modules/gauge/has-color.js               |   12 +
 node_modules/gauge/index.js                   |  233 ++
 node_modules/gauge/package.json               |   91 +
 node_modules/gauge/plumbing.js                |   48 +
 node_modules/gauge/process.js                 |    3 +
 node_modules/gauge/progress-bar.js            |   35 +
 node_modules/gauge/render-template.js         |  181 +
 node_modules/gauge/set-immediate.js           |    7 +
 node_modules/gauge/set-interval.js            |    3 +
 node_modules/gauge/spin.js                    |    5 +
 node_modules/gauge/template-item.js           |   73 +
 node_modules/gauge/theme-set.js               |  115 +
 node_modules/gauge/themes.js                  |   54 +
 node_modules/gauge/wide-truncate.js           |   25 +
 node_modules/github-from-package/.travis.yml  |    4 +
 node_modules/github-from-package/LICENSE      |   18 +
 .../github-from-package/example/package.json  |    8 +
 .../github-from-package/example/url.js        |    3 +
 node_modules/github-from-package/index.js     |   17 +
 node_modules/github-from-package/package.json |   58 +
 .../github-from-package/readme.markdown       |   53 +
 node_modules/github-from-package/test/a.json  |    8 +
 node_modules/github-from-package/test/b.json  |    5 +
 node_modules/github-from-package/test/c.json  |    5 +
 node_modules/github-from-package/test/d.json  |    7 +
 node_modules/github-from-package/test/e.json  |    5 +
 node_modules/github-from-package/test/url.js  |   19 +
 node_modules/has-unicode/LICENSE              |   14 +
 node_modules/has-unicode/README.md            |   43 +
 node_modules/has-unicode/index.js             |   16 +
 node_modules/has-unicode/package.json         |   58 +
 node_modules/ieee754/LICENSE                  |   11 +
 node_modules/ieee754/README.md                |   51 +
 node_modules/ieee754/index.d.ts               |   10 +
 node_modules/ieee754/index.js                 |   85 +
 node_modules/ieee754/package.json             |   84 +
 node_modules/inherits/LICENSE                 |   16 +
 node_modules/inherits/README.md               |   42 +
 node_modules/inherits/inherits.js             |    9 +
 node_modules/inherits/inherits_browser.js     |   27 +
 node_modules/inherits/package.json            |   65 +
 node_modules/ini/LICENSE                      |   15 +
 node_modules/ini/README.md                    |  102 +
 node_modules/ini/ini.js                       |  206 ++
 node_modules/ini/package.json                 |   66 +
 node_modules/is-fullwidth-code-point/index.js |   46 +
 node_modules/is-fullwidth-code-point/license  |   21 +
 .../is-fullwidth-code-point/package.json      |   77 +
 .../is-fullwidth-code-point/readme.md         |   39 +
 node_modules/isarray/.npmignore               |    1 +
 node_modules/isarray/.travis.yml              |    4 +
 node_modules/isarray/Makefile                 |    6 +
 node_modules/isarray/README.md                |   60 +
 node_modules/isarray/component.json           |   19 +
 node_modules/isarray/index.js                 |    5 +
 node_modules/isarray/package.json             |   73 +
 node_modules/isarray/test.js                  |   20 +
 node_modules/mimic-response/index.d.ts        |   17 +
 node_modules/mimic-response/index.js          |   38 +
 node_modules/mimic-response/license           |    9 +
 node_modules/mimic-response/package.json      |   74 +
 node_modules/mimic-response/readme.md         |   57 +
 node_modules/minimist/.travis.yml             |    8 +
 node_modules/minimist/LICENSE                 |   18 +
 node_modules/minimist/example/parse.js        |    2 +
 node_modules/minimist/index.js                |  245 ++
 node_modules/minimist/package.json            |   74 +
 node_modules/minimist/readme.markdown         |   95 +
 node_modules/minimist/test/all_bool.js        |   32 +
 node_modules/minimist/test/bool.js            |  178 +
 node_modules/minimist/test/dash.js            |   31 +
 node_modules/minimist/test/default_bool.js    |   35 +
 node_modules/minimist/test/dotted.js          |   22 +
 node_modules/minimist/test/kv_short.js        |   16 +
 node_modules/minimist/test/long.js            |   31 +
 node_modules/minimist/test/num.js             |   36 +
 node_modules/minimist/test/parse.js           |  197 ++
 node_modules/minimist/test/parse_modified.js  |    9 +
 node_modules/minimist/test/proto.js           |   44 +
 node_modules/minimist/test/short.js           |   67 +
 node_modules/minimist/test/stop_early.js      |   15 +
 node_modules/minimist/test/unknown.js         |  102 +
 node_modules/minimist/test/whitespace.js      |    8 +
 node_modules/mkdirp-classic/LICENSE           |   21 +
 node_modules/mkdirp-classic/README.md         |   18 +
 node_modules/mkdirp-classic/index.js          |   98 +
 node_modules/mkdirp-classic/package.json      |   47 +
 node_modules/ms/index.js                      |  162 +
 node_modules/ms/license.md                    |   21 +
 node_modules/ms/package.json                  |   69 +
 node_modules/ms/readme.md                     |   60 +
 node_modules/nan/CHANGELOG.md                 |  537 +++
 node_modules/nan/LICENSE.md                   |   13 +
 node_modules/nan/README.md                    |  455 +++
 node_modules/nan/doc/asyncworker.md           |  146 +
 node_modules/nan/doc/buffers.md               |   54 +
 node_modules/nan/doc/callback.md              |   76 +
 node_modules/nan/doc/converters.md            |   41 +
 node_modules/nan/doc/errors.md                |  226 ++
 node_modules/nan/doc/json.md                  |   62 +
 node_modules/nan/doc/maybe_types.md           |  583 ++++
 node_modules/nan/doc/methods.md               |  664 ++++
 node_modules/nan/doc/new.md                   |  147 +
 node_modules/nan/doc/node_misc.md             |  123 +
 node_modules/nan/doc/object_wrappers.md       |  263 ++
 node_modules/nan/doc/persistent.md            |  296 ++
 node_modules/nan/doc/scopes.md                |   73 +
 node_modules/nan/doc/script.md                |   38 +
 node_modules/nan/doc/string_bytes.md          |   62 +
 node_modules/nan/doc/v8_internals.md          |  199 ++
 node_modules/nan/doc/v8_misc.md               |   85 +
 node_modules/nan/include_dirs.js              |    1 +
 node_modules/nan/nan.h                        | 2898 +++++++++++++++++
 node_modules/nan/nan_callbacks.h              |   88 +
 node_modules/nan/nan_callbacks_12_inl.h       |  514 +++
 node_modules/nan/nan_callbacks_pre_12_inl.h   |  520 +++
 node_modules/nan/nan_converters.h             |   72 +
 node_modules/nan/nan_converters_43_inl.h      |   68 +
 node_modules/nan/nan_converters_pre_43_inl.h  |   42 +
 .../nan/nan_define_own_property_helper.h      |   29 +
 node_modules/nan/nan_implementation_12_inl.h  |  430 +++
 .../nan/nan_implementation_pre_12_inl.h       |  263 ++
 node_modules/nan/nan_json.h                   |  166 +
 node_modules/nan/nan_maybe_43_inl.h           |  356 ++
 node_modules/nan/nan_maybe_pre_43_inl.h       |  268 ++
 node_modules/nan/nan_new.h                    |  340 ++
 node_modules/nan/nan_object_wrap.h            |  156 +
 node_modules/nan/nan_persistent_12_inl.h      |  132 +
 node_modules/nan/nan_persistent_pre_12_inl.h  |  242 ++
 node_modules/nan/nan_private.h                |   73 +
 node_modules/nan/nan_string_bytes.h           |  305 ++
 node_modules/nan/nan_typedarray_contents.h    |   96 +
 node_modules/nan/nan_weak.h                   |  437 +++
 node_modules/nan/package.json                 |   98 +
 node_modules/nan/tools/1to2.js                |  412 +++
 node_modules/nan/tools/README.md              |   14 +
 node_modules/nan/tools/package.json           |   19 +
 node_modules/napi-build-utils/LICENSE         |   21 +
 node_modules/napi-build-utils/README.md       |   48 +
 node_modules/napi-build-utils/index.js        |  213 ++
 node_modules/napi-build-utils/index.md        |   81 +
 node_modules/napi-build-utils/package.json    |   68 +
 .../node-abi/.github/workflows/update-abi.yml |   41 +
 node_modules/node-abi/.travis.yml             |   19 +
 node_modules/node-abi/CODE_OF_CONDUCT.md      |   73 +
 node_modules/node-abi/CONTRIBUTING.md         |   53 +
 node_modules/node-abi/LICENSE                 |   21 +
 node_modules/node-abi/README.md               |   50 +
 node_modules/node-abi/abi_registry.json       |   99 +
 node_modules/node-abi/index.js                |  170 +
 node_modules/node-abi/package.json            |   65 +
 .../node-abi/scripts/update-abi-registry.js   |  113 +
 node_modules/node-abi/test/index.js           |  174 +
 node_modules/noop-logger/.npmignore           |    1 +
 node_modules/noop-logger/History.md           |   16 +
 node_modules/noop-logger/Makefile             |    8 +
 node_modules/noop-logger/Readme.md            |   27 +
 node_modules/noop-logger/circle.yml           |    9 +
 node_modules/noop-logger/lib/index.js         |   25 +
 node_modules/noop-logger/package.json         |   47 +
 node_modules/noop-logger/test/index.js        |   18 +
 node_modules/npmlog/CHANGELOG.md              |   49 +
 node_modules/npmlog/LICENSE                   |   15 +
 node_modules/npmlog/README.md                 |  216 ++
 node_modules/npmlog/log.js                    |  309 ++
 node_modules/npmlog/package.json              |   61 +
 node_modules/number-is-nan/index.js           |    4 +
 node_modules/number-is-nan/license            |   21 +
 node_modules/number-is-nan/package.json       |   67 +
 node_modules/number-is-nan/readme.md          |   28 +
 node_modules/object-assign/index.js           |   90 +
 node_modules/object-assign/license            |   21 +
 node_modules/object-assign/package.json       |   74 +
 node_modules/object-assign/readme.md          |   61 +
 node_modules/once/LICENSE                     |   15 +
 node_modules/once/README.md                   |   79 +
 node_modules/once/once.js                     |   42 +
 node_modules/once/package.json                |   68 +
 node_modules/prebuild-install/.travis.yml     |   19 +
 node_modules/prebuild-install/CHANGELOG.md    |   27 +
 node_modules/prebuild-install/CONTRIBUTING.md |    6 +
 node_modules/prebuild-install/LICENSE         |   21 +
 node_modules/prebuild-install/README.md       |  110 +
 node_modules/prebuild-install/appveyor.yml    |   40 +
 node_modules/prebuild-install/asset.js        |   48 +
 node_modules/prebuild-install/bin.js          |   83 +
 node_modules/prebuild-install/download.js     |  130 +
 node_modules/prebuild-install/error.js        |   14 +
 node_modules/prebuild-install/help.txt        |   16 +
 node_modules/prebuild-install/index.js        |    1 +
 node_modules/prebuild-install/log.js          |   25 +
 node_modules/prebuild-install/package.json    |  129 +
 node_modules/prebuild-install/proxy.js        |   38 +
 node_modules/prebuild-install/rc.js           |   60 +
 node_modules/prebuild-install/util.js         |  116 +
 node_modules/process-nextick-args/index.js    |   45 +
 node_modules/process-nextick-args/license.md  |   19 +
 .../process-nextick-args/package.json         |   50 +
 node_modules/process-nextick-args/readme.md   |   18 +
 node_modules/pump/.travis.yml                 |    5 +
 node_modules/pump/LICENSE                     |   21 +
 node_modules/pump/README.md                   |   65 +
 node_modules/pump/index.js                    |   82 +
 node_modules/pump/package.json                |   60 +
 node_modules/pump/test-browser.js             |   66 +
 node_modules/pump/test-node.js                |   53 +
 node_modules/rc/LICENSE.APACHE2               |   15 +
 node_modules/rc/LICENSE.BSD                   |   26 +
 node_modules/rc/LICENSE.MIT                   |   24 +
 node_modules/rc/README.md                     |  227 ++
 node_modules/rc/browser.js                    |    7 +
 node_modules/rc/cli.js                        |    4 +
 node_modules/rc/index.js                      |   53 +
 node_modules/rc/lib/utils.js                  |  104 +
 node_modules/rc/package.json                  |   64 +
 node_modules/rc/test/ini.js                   |   16 +
 node_modules/rc/test/nested-env-vars.js       |   50 +
 node_modules/rc/test/test.js                  |   59 +
 node_modules/readable-stream/.travis.yml      |   34 +
 node_modules/readable-stream/CONTRIBUTING.md  |   38 +
 node_modules/readable-stream/GOVERNANCE.md    |  136 +
 node_modules/readable-stream/LICENSE          |   47 +
 node_modules/readable-stream/README.md        |   58 +
 .../doc/wg-meetings/2015-01-30.md             |   60 +
 .../readable-stream/duplex-browser.js         |    1 +
 node_modules/readable-stream/duplex.js        |    1 +
 .../readable-stream/lib/_stream_duplex.js     |  131 +
 .../lib/_stream_passthrough.js                |   47 +
 .../readable-stream/lib/_stream_readable.js   | 1019 ++++++
 .../readable-stream/lib/_stream_transform.js  |  214 ++
 .../readable-stream/lib/_stream_writable.js   |  687 ++++
 .../lib/internal/streams/BufferList.js        |   79 +
 .../lib/internal/streams/destroy.js           |   74 +
 .../lib/internal/streams/stream-browser.js    |    1 +
 .../lib/internal/streams/stream.js            |    1 +
 node_modules/readable-stream/package.json     |   81 +
 node_modules/readable-stream/passthrough.js   |    1 +
 .../readable-stream/readable-browser.js       |    7 +
 node_modules/readable-stream/readable.js      |   19 +
 node_modules/readable-stream/transform.js     |    1 +
 .../readable-stream/writable-browser.js       |    1 +
 node_modules/readable-stream/writable.js      |    8 +
 node_modules/safe-buffer/LICENSE              |   21 +
 node_modules/safe-buffer/README.md            |  584 ++++
 node_modules/safe-buffer/index.d.ts           |  187 ++
 node_modules/safe-buffer/index.js             |   62 +
 node_modules/safe-buffer/package.json         |   64 +
 node_modules/semver/CHANGELOG.md              |   39 +
 node_modules/semver/LICENSE                   |   15 +
 node_modules/semver/README.md                 |  412 +++
 node_modules/semver/bin/semver                |  160 +
 node_modules/semver/package.json              |   60 +
 node_modules/semver/range.bnf                 |   16 +
 node_modules/semver/semver.js                 | 1483 +++++++++
 node_modules/serialport/CHANGELOG.md          |   67 +
 node_modules/serialport/LICENSE               |   21 +
 node_modules/serialport/README.md             |   91 +
 node_modules/serialport/lib/index.js          |   15 +
 node_modules/serialport/lib/parsers.js        |    8 +
 node_modules/serialport/package.json          |   98 +
 node_modules/serialport/test.js               |    8 +
 node_modules/serialport/thank-you.js          |    3 +
 node_modules/set-blocking/CHANGELOG.md        |   26 +
 node_modules/set-blocking/LICENSE.txt         |   14 +
 node_modules/set-blocking/README.md           |   31 +
 node_modules/set-blocking/index.js            |    7 +
 node_modules/set-blocking/package.json        |   70 +
 node_modules/signal-exit/CHANGELOG.md         |   35 +
 node_modules/signal-exit/LICENSE.txt          |   16 +
 node_modules/signal-exit/README.md            |   39 +
 node_modules/signal-exit/index.js             |  163 +
 node_modules/signal-exit/package.json         |   66 +
 node_modules/signal-exit/signals.js           |   53 +
 node_modules/simple-concat/.travis.yml        |    3 +
 node_modules/simple-concat/LICENSE            |   20 +
 node_modules/simple-concat/README.md          |   44 +
 node_modules/simple-concat/index.js           |   15 +
 node_modules/simple-concat/package.json       |   72 +
 node_modules/simple-concat/test/basic.js      |   41 +
 node_modules/simple-get/LICENSE               |   20 +
 node_modules/simple-get/README.md             |  319 ++
 node_modules/simple-get/index.js              |   99 +
 node_modules/simple-get/package.json          |   78 +
 node_modules/string-width/index.js            |   37 +
 node_modules/string-width/license             |   21 +
 node_modules/string-width/package.json        |   89 +
 node_modules/string-width/readme.md           |   42 +
 node_modules/string_decoder/.travis.yml       |   50 +
 node_modules/string_decoder/LICENSE           |   48 +
 node_modules/string_decoder/README.md         |   47 +
 .../string_decoder/lib/string_decoder.js      |  296 ++
 node_modules/string_decoder/package.json      |   61 +
 node_modules/strip-ansi/index.js              |    6 +
 node_modules/strip-ansi/license               |   21 +
 node_modules/strip-ansi/package.json          |  102 +
 node_modules/strip-ansi/readme.md             |   33 +
 node_modules/strip-json-comments/index.js     |   70 +
 node_modules/strip-json-comments/license      |   21 +
 node_modules/strip-json-comments/package.json |   74 +
 node_modules/strip-json-comments/readme.md    |   64 +
 node_modules/tar-fs/.travis.yml               |    6 +
 node_modules/tar-fs/LICENSE                   |   21 +
 node_modules/tar-fs/README.md                 |  165 +
 node_modules/tar-fs/index.js                  |  351 ++
 node_modules/tar-fs/package.json              |   68 +
 node_modules/tar-fs/test/fixtures/a/hello.txt |    1 +
 .../tar-fs/test/fixtures/b/a/test.txt         |    1 +
 node_modules/tar-fs/test/fixtures/d/file1     |    0
 node_modules/tar-fs/test/fixtures/d/file2     |    0
 .../tar-fs/test/fixtures/d/sub-dir/file5      |    0
 .../tar-fs/test/fixtures/d/sub-files/file3    |    0
 .../tar-fs/test/fixtures/d/sub-files/file4    |    0
 .../tar-fs/test/fixtures/e/directory/.ignore  |    0
 node_modules/tar-fs/test/fixtures/e/file      |    0
 node_modules/tar-fs/test/fixtures/invalid.tar |  Bin 0 -> 2560 bytes
 node_modules/tar-fs/test/index.js             |  346 ++
 node_modules/tar-stream/LICENSE               |   21 +
 node_modules/tar-stream/README.md             |  168 +
 node_modules/tar-stream/extract.js            |  257 ++
 node_modules/tar-stream/headers.js            |  295 ++
 node_modules/tar-stream/index.js              |    2 +
 .../readable-stream/CONTRIBUTING.md           |   38 +
 .../readable-stream/GOVERNANCE.md             |  136 +
 .../node_modules/readable-stream/LICENSE      |   47 +
 .../node_modules/readable-stream/README.md    |  106 +
 .../readable-stream/errors-browser.js         |  127 +
 .../node_modules/readable-stream/errors.js    |  116 +
 .../readable-stream/experimentalWarning.js    |   17 +
 .../readable-stream/lib/_stream_duplex.js     |  139 +
 .../lib/_stream_passthrough.js                |   39 +
 .../readable-stream/lib/_stream_readable.js   | 1124 +++++++
 .../readable-stream/lib/_stream_transform.js  |  201 ++
 .../readable-stream/lib/_stream_writable.js   |  697 ++++
 .../lib/internal/streams/async_iterator.js    |  207 ++
 .../lib/internal/streams/buffer_list.js       |  210 ++
 .../lib/internal/streams/destroy.js           |  105 +
 .../lib/internal/streams/end-of-stream.js     |  104 +
 .../lib/internal/streams/from-browser.js      |    3 +
 .../lib/internal/streams/from.js              |   64 +
 .../lib/internal/streams/pipeline.js          |   97 +
 .../lib/internal/streams/state.js             |   27 +
 .../lib/internal/streams/stream-browser.js    |    1 +
 .../lib/internal/streams/stream.js            |    1 +
 .../node_modules/readable-stream/package.json |   97 +
 .../readable-stream/readable-browser.js       |    9 +
 .../node_modules/readable-stream/readable.js  |   16 +
 node_modules/tar-stream/pack.js               |  255 ++
 node_modules/tar-stream/package.json          |   90 +
 node_modules/tar-stream/sandbox.js            |   11 +
 node_modules/tunnel-agent/LICENSE             |   55 +
 node_modules/tunnel-agent/README.md           |    4 +
 node_modules/tunnel-agent/index.js            |  244 ++
 node_modules/tunnel-agent/package.json        |   55 +
 node_modules/util-deprecate/History.md        |   16 +
 node_modules/util-deprecate/LICENSE           |   24 +
 node_modules/util-deprecate/README.md         |   53 +
 node_modules/util-deprecate/browser.js        |   67 +
 node_modules/util-deprecate/node.js           |    6 +
 node_modules/util-deprecate/package.json      |   58 +
 node_modules/which-pm-runs/LICENSE            |   21 +
 node_modules/which-pm-runs/README.md          |   29 +
 node_modules/which-pm-runs/index.js           |   17 +
 node_modules/which-pm-runs/package.json       |   61 +
 node_modules/wide-align/LICENSE               |   14 +
 node_modules/wide-align/README.md             |   47 +
 node_modules/wide-align/align.js              |   65 +
 node_modules/wide-align/package.json          |   66 +
 node_modules/wrappy/LICENSE                   |   15 +
 node_modules/wrappy/README.md                 |   36 +
 node_modules/wrappy/package.json              |   58 +
 node_modules/wrappy/wrappy.js                 |   33 +
 server.js                                     |   44 +
 simple_serial/simple_serial.ino               |   16 +
 609 files changed, 59127 insertions(+)
 create mode 100644 node_modules/.bin/detect-libc
 create mode 100644 node_modules/.bin/detect-libc.cmd
 create mode 100644 node_modules/.bin/detect-libc.ps1
 create mode 100644 node_modules/.bin/prebuild-install
 create mode 100644 node_modules/.bin/prebuild-install.cmd
 create mode 100644 node_modules/.bin/prebuild-install.ps1
 create mode 100644 node_modules/.bin/rc
 create mode 100644 node_modules/.bin/rc.cmd
 create mode 100644 node_modules/.bin/rc.ps1
 create mode 100644 node_modules/.bin/semver
 create mode 100644 node_modules/.bin/semver.cmd
 create mode 100644 node_modules/.bin/semver.ps1
 create mode 100644 node_modules/@serialport/binding-abstract/CHANGELOG.md
 create mode 100644 node_modules/@serialport/binding-abstract/LICENSE
 create mode 100644 node_modules/@serialport/binding-abstract/README.md
 create mode 100644 node_modules/@serialport/binding-abstract/lib/index.js
 create mode 100644 node_modules/@serialport/binding-abstract/package.json
 create mode 100644 node_modules/@serialport/binding-mock/CHANGELOG.md
 create mode 100644 node_modules/@serialport/binding-mock/LICENSE
 create mode 100644 node_modules/@serialport/binding-mock/README.md
 create mode 100644 node_modules/@serialport/binding-mock/lib/index.js
 create mode 100644 node_modules/@serialport/binding-mock/lib/legacy.js
 create mode 100644 node_modules/@serialport/binding-mock/package.json
 create mode 100644 node_modules/@serialport/bindings/.prebuild-installrc
 create mode 100644 node_modules/@serialport/bindings/CHANGELOG.md
 create mode 100644 node_modules/@serialport/bindings/LICENSE
 create mode 100644 node_modules/@serialport/bindings/README.md
 create mode 100644 node_modules/@serialport/bindings/binding.gyp
 create mode 100644 node_modules/@serialport/bindings/build/Release/bindings.node
 create mode 100644 node_modules/@serialport/bindings/lib/darwin.js
 create mode 100644 node_modules/@serialport/bindings/lib/index.js
 create mode 100644 node_modules/@serialport/bindings/lib/legacy.js
 create mode 100644 node_modules/@serialport/bindings/lib/linux-list.js
 create mode 100644 node_modules/@serialport/bindings/lib/linux.js
 create mode 100644 node_modules/@serialport/bindings/lib/poller.js
 create mode 100644 node_modules/@serialport/bindings/lib/unix-read.js
 create mode 100644 node_modules/@serialport/bindings/lib/unix-write.js
 create mode 100644 node_modules/@serialport/bindings/lib/win32-sn-parser.js
 create mode 100644 node_modules/@serialport/bindings/lib/win32.js
 create mode 100644 node_modules/@serialport/bindings/package.json
 create mode 100644 node_modules/@serialport/bindings/src/darwin_list.cpp
 create mode 100644 node_modules/@serialport/bindings/src/darwin_list.h
 create mode 100644 node_modules/@serialport/bindings/src/poller.cpp
 create mode 100644 node_modules/@serialport/bindings/src/poller.h
 create mode 100644 node_modules/@serialport/bindings/src/serialport.cpp
 create mode 100644 node_modules/@serialport/bindings/src/serialport.h
 create mode 100644 node_modules/@serialport/bindings/src/serialport_linux.cpp
 create mode 100644 node_modules/@serialport/bindings/src/serialport_linux.h
 create mode 100644 node_modules/@serialport/bindings/src/serialport_unix.cpp
 create mode 100644 node_modules/@serialport/bindings/src/serialport_unix.h
 create mode 100644 node_modules/@serialport/bindings/src/serialport_win.cpp
 create mode 100644 node_modules/@serialport/bindings/src/serialport_win.h
 create mode 100644 node_modules/@serialport/parser-byte-length/CHANGELOG.md
 create mode 100644 node_modules/@serialport/parser-byte-length/LICENSE
 create mode 100644 node_modules/@serialport/parser-byte-length/README.md
 create mode 100644 node_modules/@serialport/parser-byte-length/lib/index.js
 create mode 100644 node_modules/@serialport/parser-byte-length/package.json
 create mode 100644 node_modules/@serialport/parser-cctalk/CHANGELOG.md
 create mode 100644 node_modules/@serialport/parser-cctalk/LICENSE
 create mode 100644 node_modules/@serialport/parser-cctalk/README.md
 create mode 100644 node_modules/@serialport/parser-cctalk/lib/index.js
 create mode 100644 node_modules/@serialport/parser-cctalk/package.json
 create mode 100644 node_modules/@serialport/parser-delimiter/CHANGELOG.md
 create mode 100644 node_modules/@serialport/parser-delimiter/LICENSE
 create mode 100644 node_modules/@serialport/parser-delimiter/README.md
 create mode 100644 node_modules/@serialport/parser-delimiter/lib/index.js
 create mode 100644 node_modules/@serialport/parser-delimiter/package.json
 create mode 100644 node_modules/@serialport/parser-readline/CHANGELOG.md
 create mode 100644 node_modules/@serialport/parser-readline/LICENSE
 create mode 100644 node_modules/@serialport/parser-readline/README.md
 create mode 100644 node_modules/@serialport/parser-readline/lib/index.js
 create mode 100644 node_modules/@serialport/parser-readline/package.json
 create mode 100644 node_modules/@serialport/parser-ready/CHANGELOG.md
 create mode 100644 node_modules/@serialport/parser-ready/LICENSE
 create mode 100644 node_modules/@serialport/parser-ready/README.md
 create mode 100644 node_modules/@serialport/parser-ready/lib/index.js
 create mode 100644 node_modules/@serialport/parser-ready/package.json
 create mode 100644 node_modules/@serialport/parser-regex/CHANGELOG.md
 create mode 100644 node_modules/@serialport/parser-regex/LICENSE
 create mode 100644 node_modules/@serialport/parser-regex/README.md
 create mode 100644 node_modules/@serialport/parser-regex/lib/index.js
 create mode 100644 node_modules/@serialport/parser-regex/package.json
 create mode 100644 node_modules/@serialport/stream/CHANGELOG.md
 create mode 100644 node_modules/@serialport/stream/LICENSE
 create mode 100644 node_modules/@serialport/stream/README.md
 create mode 100644 node_modules/@serialport/stream/lib/index.js
 create mode 100644 node_modules/@serialport/stream/package.json
 create mode 100644 node_modules/ansi-regex/index.js
 create mode 100644 node_modules/ansi-regex/license
 create mode 100644 node_modules/ansi-regex/package.json
 create mode 100644 node_modules/ansi-regex/readme.md
 create mode 100644 node_modules/aproba/LICENSE
 create mode 100644 node_modules/aproba/README.md
 create mode 100644 node_modules/aproba/index.js
 create mode 100644 node_modules/aproba/package.json
 create mode 100644 node_modules/are-we-there-yet/CHANGES.md
 create mode 100644 node_modules/are-we-there-yet/LICENSE
 create mode 100644 node_modules/are-we-there-yet/README.md
 create mode 100644 node_modules/are-we-there-yet/index.js
 create mode 100644 node_modules/are-we-there-yet/package.json
 create mode 100644 node_modules/are-we-there-yet/tracker-base.js
 create mode 100644 node_modules/are-we-there-yet/tracker-group.js
 create mode 100644 node_modules/are-we-there-yet/tracker-stream.js
 create mode 100644 node_modules/are-we-there-yet/tracker.js
 create mode 100644 node_modules/base64-js/LICENSE
 create mode 100644 node_modules/base64-js/README.md
 create mode 100644 node_modules/base64-js/base64js.min.js
 create mode 100644 node_modules/base64-js/index.d.ts
 create mode 100644 node_modules/base64-js/index.js
 create mode 100644 node_modules/base64-js/package.json
 create mode 100644 node_modules/bindings/LICENSE.md
 create mode 100644 node_modules/bindings/README.md
 create mode 100644 node_modules/bindings/bindings.js
 create mode 100644 node_modules/bindings/package.json
 create mode 100644 node_modules/bl/.travis.yml
 create mode 100644 node_modules/bl/BufferList.js
 create mode 100644 node_modules/bl/LICENSE.md
 create mode 100644 node_modules/bl/README.md
 create mode 100644 node_modules/bl/bl.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/CONTRIBUTING.md
 create mode 100644 node_modules/bl/node_modules/readable-stream/GOVERNANCE.md
 create mode 100644 node_modules/bl/node_modules/readable-stream/LICENSE
 create mode 100644 node_modules/bl/node_modules/readable-stream/README.md
 create mode 100644 node_modules/bl/node_modules/readable-stream/errors-browser.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/errors.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/experimentalWarning.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/lib/internal/streams/async_iterator.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/lib/internal/streams/buffer_list.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/lib/internal/streams/destroy.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/lib/internal/streams/end-of-stream.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/lib/internal/streams/from-browser.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/lib/internal/streams/from.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/lib/internal/streams/pipeline.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/lib/internal/streams/state.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream-browser.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/package.json
 create mode 100644 node_modules/bl/node_modules/readable-stream/readable-browser.js
 create mode 100644 node_modules/bl/node_modules/readable-stream/readable.js
 create mode 100644 node_modules/bl/package.json
 create mode 100644 node_modules/bl/test/convert.js
 create mode 100644 node_modules/bl/test/indexOf.js
 create mode 100644 node_modules/bl/test/isBufferList.js
 create mode 100644 node_modules/bl/test/test.js
 create mode 100644 node_modules/buffer/AUTHORS.md
 create mode 100644 node_modules/buffer/LICENSE
 create mode 100644 node_modules/buffer/README.md
 create mode 100644 node_modules/buffer/index.d.ts
 create mode 100644 node_modules/buffer/index.js
 create mode 100644 node_modules/buffer/package.json
 create mode 100644 node_modules/chownr/LICENSE
 create mode 100644 node_modules/chownr/README.md
 create mode 100644 node_modules/chownr/chownr.js
 create mode 100644 node_modules/chownr/package.json
 create mode 100644 node_modules/code-point-at/index.js
 create mode 100644 node_modules/code-point-at/license
 create mode 100644 node_modules/code-point-at/package.json
 create mode 100644 node_modules/code-point-at/readme.md
 create mode 100644 node_modules/console-control-strings/LICENSE
 create mode 100644 node_modules/console-control-strings/README.md
 create mode 100644 node_modules/console-control-strings/README.md~
 create mode 100644 node_modules/console-control-strings/index.js
 create mode 100644 node_modules/console-control-strings/package.json
 create mode 100644 node_modules/core-util-is/LICENSE
 create mode 100644 node_modules/core-util-is/README.md
 create mode 100644 node_modules/core-util-is/float.patch
 create mode 100644 node_modules/core-util-is/lib/util.js
 create mode 100644 node_modules/core-util-is/package.json
 create mode 100644 node_modules/core-util-is/test.js
 create mode 100644 node_modules/debug/LICENSE
 create mode 100644 node_modules/debug/README.md
 create mode 100644 node_modules/debug/package.json
 create mode 100644 node_modules/debug/src/browser.js
 create mode 100644 node_modules/debug/src/common.js
 create mode 100644 node_modules/debug/src/index.js
 create mode 100644 node_modules/debug/src/node.js
 create mode 100644 node_modules/decompress-response/index.d.ts
 create mode 100644 node_modules/decompress-response/index.js
 create mode 100644 node_modules/decompress-response/license
 create mode 100644 node_modules/decompress-response/package.json
 create mode 100644 node_modules/decompress-response/readme.md
 create mode 100644 node_modules/deep-extend/CHANGELOG.md
 create mode 100644 node_modules/deep-extend/LICENSE
 create mode 100644 node_modules/deep-extend/README.md
 create mode 100644 node_modules/deep-extend/index.js
 create mode 100644 node_modules/deep-extend/lib/deep-extend.js
 create mode 100644 node_modules/deep-extend/package.json
 create mode 100644 node_modules/delegates/.npmignore
 create mode 100644 node_modules/delegates/History.md
 create mode 100644 node_modules/delegates/License
 create mode 100644 node_modules/delegates/Makefile
 create mode 100644 node_modules/delegates/Readme.md
 create mode 100644 node_modules/delegates/index.js
 create mode 100644 node_modules/delegates/package.json
 create mode 100644 node_modules/delegates/test/index.js
 create mode 100644 node_modules/detect-libc/.npmignore
 create mode 100644 node_modules/detect-libc/LICENSE
 create mode 100644 node_modules/detect-libc/README.md
 create mode 100644 node_modules/detect-libc/bin/detect-libc.js
 create mode 100644 node_modules/detect-libc/lib/detect-libc.js
 create mode 100644 node_modules/detect-libc/package.json
 create mode 100644 node_modules/end-of-stream/LICENSE
 create mode 100644 node_modules/end-of-stream/README.md
 create mode 100644 node_modules/end-of-stream/index.js
 create mode 100644 node_modules/end-of-stream/package.json
 create mode 100644 node_modules/expand-template/.travis.yml
 create mode 100644 node_modules/expand-template/LICENSE
 create mode 100644 node_modules/expand-template/README.md
 create mode 100644 node_modules/expand-template/index.js
 create mode 100644 node_modules/expand-template/package.json
 create mode 100644 node_modules/expand-template/test.js
 create mode 100644 node_modules/file-uri-to-path/.npmignore
 create mode 100644 node_modules/file-uri-to-path/.travis.yml
 create mode 100644 node_modules/file-uri-to-path/History.md
 create mode 100644 node_modules/file-uri-to-path/LICENSE
 create mode 100644 node_modules/file-uri-to-path/README.md
 create mode 100644 node_modules/file-uri-to-path/index.d.ts
 create mode 100644 node_modules/file-uri-to-path/index.js
 create mode 100644 node_modules/file-uri-to-path/package.json
 create mode 100644 node_modules/file-uri-to-path/test/test.js
 create mode 100644 node_modules/file-uri-to-path/test/tests.json
 create mode 100644 node_modules/fs-constants/LICENSE
 create mode 100644 node_modules/fs-constants/README.md
 create mode 100644 node_modules/fs-constants/browser.js
 create mode 100644 node_modules/fs-constants/index.js
 create mode 100644 node_modules/fs-constants/package.json
 create mode 100644 node_modules/gauge/CHANGELOG.md
 create mode 100644 node_modules/gauge/LICENSE
 create mode 100644 node_modules/gauge/README.md
 create mode 100644 node_modules/gauge/base-theme.js
 create mode 100644 node_modules/gauge/error.js
 create mode 100644 node_modules/gauge/has-color.js
 create mode 100644 node_modules/gauge/index.js
 create mode 100644 node_modules/gauge/package.json
 create mode 100644 node_modules/gauge/plumbing.js
 create mode 100644 node_modules/gauge/process.js
 create mode 100644 node_modules/gauge/progress-bar.js
 create mode 100644 node_modules/gauge/render-template.js
 create mode 100644 node_modules/gauge/set-immediate.js
 create mode 100644 node_modules/gauge/set-interval.js
 create mode 100644 node_modules/gauge/spin.js
 create mode 100644 node_modules/gauge/template-item.js
 create mode 100644 node_modules/gauge/theme-set.js
 create mode 100644 node_modules/gauge/themes.js
 create mode 100644 node_modules/gauge/wide-truncate.js
 create mode 100644 node_modules/github-from-package/.travis.yml
 create mode 100644 node_modules/github-from-package/LICENSE
 create mode 100644 node_modules/github-from-package/example/package.json
 create mode 100644 node_modules/github-from-package/example/url.js
 create mode 100644 node_modules/github-from-package/index.js
 create mode 100644 node_modules/github-from-package/package.json
 create mode 100644 node_modules/github-from-package/readme.markdown
 create mode 100644 node_modules/github-from-package/test/a.json
 create mode 100644 node_modules/github-from-package/test/b.json
 create mode 100644 node_modules/github-from-package/test/c.json
 create mode 100644 node_modules/github-from-package/test/d.json
 create mode 100644 node_modules/github-from-package/test/e.json
 create mode 100644 node_modules/github-from-package/test/url.js
 create mode 100644 node_modules/has-unicode/LICENSE
 create mode 100644 node_modules/has-unicode/README.md
 create mode 100644 node_modules/has-unicode/index.js
 create mode 100644 node_modules/has-unicode/package.json
 create mode 100644 node_modules/ieee754/LICENSE
 create mode 100644 node_modules/ieee754/README.md
 create mode 100644 node_modules/ieee754/index.d.ts
 create mode 100644 node_modules/ieee754/index.js
 create mode 100644 node_modules/ieee754/package.json
 create mode 100644 node_modules/inherits/LICENSE
 create mode 100644 node_modules/inherits/README.md
 create mode 100644 node_modules/inherits/inherits.js
 create mode 100644 node_modules/inherits/inherits_browser.js
 create mode 100644 node_modules/inherits/package.json
 create mode 100644 node_modules/ini/LICENSE
 create mode 100644 node_modules/ini/README.md
 create mode 100644 node_modules/ini/ini.js
 create mode 100644 node_modules/ini/package.json
 create mode 100644 node_modules/is-fullwidth-code-point/index.js
 create mode 100644 node_modules/is-fullwidth-code-point/license
 create mode 100644 node_modules/is-fullwidth-code-point/package.json
 create mode 100644 node_modules/is-fullwidth-code-point/readme.md
 create mode 100644 node_modules/isarray/.npmignore
 create mode 100644 node_modules/isarray/.travis.yml
 create mode 100644 node_modules/isarray/Makefile
 create mode 100644 node_modules/isarray/README.md
 create mode 100644 node_modules/isarray/component.json
 create mode 100644 node_modules/isarray/index.js
 create mode 100644 node_modules/isarray/package.json
 create mode 100644 node_modules/isarray/test.js
 create mode 100644 node_modules/mimic-response/index.d.ts
 create mode 100644 node_modules/mimic-response/index.js
 create mode 100644 node_modules/mimic-response/license
 create mode 100644 node_modules/mimic-response/package.json
 create mode 100644 node_modules/mimic-response/readme.md
 create mode 100644 node_modules/minimist/.travis.yml
 create mode 100644 node_modules/minimist/LICENSE
 create mode 100644 node_modules/minimist/example/parse.js
 create mode 100644 node_modules/minimist/index.js
 create mode 100644 node_modules/minimist/package.json
 create mode 100644 node_modules/minimist/readme.markdown
 create mode 100644 node_modules/minimist/test/all_bool.js
 create mode 100644 node_modules/minimist/test/bool.js
 create mode 100644 node_modules/minimist/test/dash.js
 create mode 100644 node_modules/minimist/test/default_bool.js
 create mode 100644 node_modules/minimist/test/dotted.js
 create mode 100644 node_modules/minimist/test/kv_short.js
 create mode 100644 node_modules/minimist/test/long.js
 create mode 100644 node_modules/minimist/test/num.js
 create mode 100644 node_modules/minimist/test/parse.js
 create mode 100644 node_modules/minimist/test/parse_modified.js
 create mode 100644 node_modules/minimist/test/proto.js
 create mode 100644 node_modules/minimist/test/short.js
 create mode 100644 node_modules/minimist/test/stop_early.js
 create mode 100644 node_modules/minimist/test/unknown.js
 create mode 100644 node_modules/minimist/test/whitespace.js
 create mode 100644 node_modules/mkdirp-classic/LICENSE
 create mode 100644 node_modules/mkdirp-classic/README.md
 create mode 100644 node_modules/mkdirp-classic/index.js
 create mode 100644 node_modules/mkdirp-classic/package.json
 create mode 100644 node_modules/ms/index.js
 create mode 100644 node_modules/ms/license.md
 create mode 100644 node_modules/ms/package.json
 create mode 100644 node_modules/ms/readme.md
 create mode 100644 node_modules/nan/CHANGELOG.md
 create mode 100644 node_modules/nan/LICENSE.md
 create mode 100644 node_modules/nan/README.md
 create mode 100644 node_modules/nan/doc/asyncworker.md
 create mode 100644 node_modules/nan/doc/buffers.md
 create mode 100644 node_modules/nan/doc/callback.md
 create mode 100644 node_modules/nan/doc/converters.md
 create mode 100644 node_modules/nan/doc/errors.md
 create mode 100644 node_modules/nan/doc/json.md
 create mode 100644 node_modules/nan/doc/maybe_types.md
 create mode 100644 node_modules/nan/doc/methods.md
 create mode 100644 node_modules/nan/doc/new.md
 create mode 100644 node_modules/nan/doc/node_misc.md
 create mode 100644 node_modules/nan/doc/object_wrappers.md
 create mode 100644 node_modules/nan/doc/persistent.md
 create mode 100644 node_modules/nan/doc/scopes.md
 create mode 100644 node_modules/nan/doc/script.md
 create mode 100644 node_modules/nan/doc/string_bytes.md
 create mode 100644 node_modules/nan/doc/v8_internals.md
 create mode 100644 node_modules/nan/doc/v8_misc.md
 create mode 100644 node_modules/nan/include_dirs.js
 create mode 100644 node_modules/nan/nan.h
 create mode 100644 node_modules/nan/nan_callbacks.h
 create mode 100644 node_modules/nan/nan_callbacks_12_inl.h
 create mode 100644 node_modules/nan/nan_callbacks_pre_12_inl.h
 create mode 100644 node_modules/nan/nan_converters.h
 create mode 100644 node_modules/nan/nan_converters_43_inl.h
 create mode 100644 node_modules/nan/nan_converters_pre_43_inl.h
 create mode 100644 node_modules/nan/nan_define_own_property_helper.h
 create mode 100644 node_modules/nan/nan_implementation_12_inl.h
 create mode 100644 node_modules/nan/nan_implementation_pre_12_inl.h
 create mode 100644 node_modules/nan/nan_json.h
 create mode 100644 node_modules/nan/nan_maybe_43_inl.h
 create mode 100644 node_modules/nan/nan_maybe_pre_43_inl.h
 create mode 100644 node_modules/nan/nan_new.h
 create mode 100644 node_modules/nan/nan_object_wrap.h
 create mode 100644 node_modules/nan/nan_persistent_12_inl.h
 create mode 100644 node_modules/nan/nan_persistent_pre_12_inl.h
 create mode 100644 node_modules/nan/nan_private.h
 create mode 100644 node_modules/nan/nan_string_bytes.h
 create mode 100644 node_modules/nan/nan_typedarray_contents.h
 create mode 100644 node_modules/nan/nan_weak.h
 create mode 100644 node_modules/nan/package.json
 create mode 100644 node_modules/nan/tools/1to2.js
 create mode 100644 node_modules/nan/tools/README.md
 create mode 100644 node_modules/nan/tools/package.json
 create mode 100644 node_modules/napi-build-utils/LICENSE
 create mode 100644 node_modules/napi-build-utils/README.md
 create mode 100644 node_modules/napi-build-utils/index.js
 create mode 100644 node_modules/napi-build-utils/index.md
 create mode 100644 node_modules/napi-build-utils/package.json
 create mode 100644 node_modules/node-abi/.github/workflows/update-abi.yml
 create mode 100644 node_modules/node-abi/.travis.yml
 create mode 100644 node_modules/node-abi/CODE_OF_CONDUCT.md
 create mode 100644 node_modules/node-abi/CONTRIBUTING.md
 create mode 100644 node_modules/node-abi/LICENSE
 create mode 100644 node_modules/node-abi/README.md
 create mode 100644 node_modules/node-abi/abi_registry.json
 create mode 100644 node_modules/node-abi/index.js
 create mode 100644 node_modules/node-abi/package.json
 create mode 100644 node_modules/node-abi/scripts/update-abi-registry.js
 create mode 100644 node_modules/node-abi/test/index.js
 create mode 100644 node_modules/noop-logger/.npmignore
 create mode 100644 node_modules/noop-logger/History.md
 create mode 100644 node_modules/noop-logger/Makefile
 create mode 100644 node_modules/noop-logger/Readme.md
 create mode 100644 node_modules/noop-logger/circle.yml
 create mode 100644 node_modules/noop-logger/lib/index.js
 create mode 100644 node_modules/noop-logger/package.json
 create mode 100644 node_modules/noop-logger/test/index.js
 create mode 100644 node_modules/npmlog/CHANGELOG.md
 create mode 100644 node_modules/npmlog/LICENSE
 create mode 100644 node_modules/npmlog/README.md
 create mode 100644 node_modules/npmlog/log.js
 create mode 100644 node_modules/npmlog/package.json
 create mode 100644 node_modules/number-is-nan/index.js
 create mode 100644 node_modules/number-is-nan/license
 create mode 100644 node_modules/number-is-nan/package.json
 create mode 100644 node_modules/number-is-nan/readme.md
 create mode 100644 node_modules/object-assign/index.js
 create mode 100644 node_modules/object-assign/license
 create mode 100644 node_modules/object-assign/package.json
 create mode 100644 node_modules/object-assign/readme.md
 create mode 100644 node_modules/once/LICENSE
 create mode 100644 node_modules/once/README.md
 create mode 100644 node_modules/once/once.js
 create mode 100644 node_modules/once/package.json
 create mode 100644 node_modules/prebuild-install/.travis.yml
 create mode 100644 node_modules/prebuild-install/CHANGELOG.md
 create mode 100644 node_modules/prebuild-install/CONTRIBUTING.md
 create mode 100644 node_modules/prebuild-install/LICENSE
 create mode 100644 node_modules/prebuild-install/README.md
 create mode 100644 node_modules/prebuild-install/appveyor.yml
 create mode 100644 node_modules/prebuild-install/asset.js
 create mode 100644 node_modules/prebuild-install/bin.js
 create mode 100644 node_modules/prebuild-install/download.js
 create mode 100644 node_modules/prebuild-install/error.js
 create mode 100644 node_modules/prebuild-install/help.txt
 create mode 100644 node_modules/prebuild-install/index.js
 create mode 100644 node_modules/prebuild-install/log.js
 create mode 100644 node_modules/prebuild-install/package.json
 create mode 100644 node_modules/prebuild-install/proxy.js
 create mode 100644 node_modules/prebuild-install/rc.js
 create mode 100644 node_modules/prebuild-install/util.js
 create mode 100644 node_modules/process-nextick-args/index.js
 create mode 100644 node_modules/process-nextick-args/license.md
 create mode 100644 node_modules/process-nextick-args/package.json
 create mode 100644 node_modules/process-nextick-args/readme.md
 create mode 100644 node_modules/pump/.travis.yml
 create mode 100644 node_modules/pump/LICENSE
 create mode 100644 node_modules/pump/README.md
 create mode 100644 node_modules/pump/index.js
 create mode 100644 node_modules/pump/package.json
 create mode 100644 node_modules/pump/test-browser.js
 create mode 100644 node_modules/pump/test-node.js
 create mode 100644 node_modules/rc/LICENSE.APACHE2
 create mode 100644 node_modules/rc/LICENSE.BSD
 create mode 100644 node_modules/rc/LICENSE.MIT
 create mode 100644 node_modules/rc/README.md
 create mode 100644 node_modules/rc/browser.js
 create mode 100644 node_modules/rc/cli.js
 create mode 100644 node_modules/rc/index.js
 create mode 100644 node_modules/rc/lib/utils.js
 create mode 100644 node_modules/rc/package.json
 create mode 100644 node_modules/rc/test/ini.js
 create mode 100644 node_modules/rc/test/nested-env-vars.js
 create mode 100644 node_modules/rc/test/test.js
 create mode 100644 node_modules/readable-stream/.travis.yml
 create mode 100644 node_modules/readable-stream/CONTRIBUTING.md
 create mode 100644 node_modules/readable-stream/GOVERNANCE.md
 create mode 100644 node_modules/readable-stream/LICENSE
 create mode 100644 node_modules/readable-stream/README.md
 create mode 100644 node_modules/readable-stream/doc/wg-meetings/2015-01-30.md
 create mode 100644 node_modules/readable-stream/duplex-browser.js
 create mode 100644 node_modules/readable-stream/duplex.js
 create mode 100644 node_modules/readable-stream/lib/_stream_duplex.js
 create mode 100644 node_modules/readable-stream/lib/_stream_passthrough.js
 create mode 100644 node_modules/readable-stream/lib/_stream_readable.js
 create mode 100644 node_modules/readable-stream/lib/_stream_transform.js
 create mode 100644 node_modules/readable-stream/lib/_stream_writable.js
 create mode 100644 node_modules/readable-stream/lib/internal/streams/BufferList.js
 create mode 100644 node_modules/readable-stream/lib/internal/streams/destroy.js
 create mode 100644 node_modules/readable-stream/lib/internal/streams/stream-browser.js
 create mode 100644 node_modules/readable-stream/lib/internal/streams/stream.js
 create mode 100644 node_modules/readable-stream/package.json
 create mode 100644 node_modules/readable-stream/passthrough.js
 create mode 100644 node_modules/readable-stream/readable-browser.js
 create mode 100644 node_modules/readable-stream/readable.js
 create mode 100644 node_modules/readable-stream/transform.js
 create mode 100644 node_modules/readable-stream/writable-browser.js
 create mode 100644 node_modules/readable-stream/writable.js
 create mode 100644 node_modules/safe-buffer/LICENSE
 create mode 100644 node_modules/safe-buffer/README.md
 create mode 100644 node_modules/safe-buffer/index.d.ts
 create mode 100644 node_modules/safe-buffer/index.js
 create mode 100644 node_modules/safe-buffer/package.json
 create mode 100644 node_modules/semver/CHANGELOG.md
 create mode 100644 node_modules/semver/LICENSE
 create mode 100644 node_modules/semver/README.md
 create mode 100644 node_modules/semver/bin/semver
 create mode 100644 node_modules/semver/package.json
 create mode 100644 node_modules/semver/range.bnf
 create mode 100644 node_modules/semver/semver.js
 create mode 100644 node_modules/serialport/CHANGELOG.md
 create mode 100644 node_modules/serialport/LICENSE
 create mode 100644 node_modules/serialport/README.md
 create mode 100644 node_modules/serialport/lib/index.js
 create mode 100644 node_modules/serialport/lib/parsers.js
 create mode 100644 node_modules/serialport/package.json
 create mode 100644 node_modules/serialport/test.js
 create mode 100644 node_modules/serialport/thank-you.js
 create mode 100644 node_modules/set-blocking/CHANGELOG.md
 create mode 100644 node_modules/set-blocking/LICENSE.txt
 create mode 100644 node_modules/set-blocking/README.md
 create mode 100644 node_modules/set-blocking/index.js
 create mode 100644 node_modules/set-blocking/package.json
 create mode 100644 node_modules/signal-exit/CHANGELOG.md
 create mode 100644 node_modules/signal-exit/LICENSE.txt
 create mode 100644 node_modules/signal-exit/README.md
 create mode 100644 node_modules/signal-exit/index.js
 create mode 100644 node_modules/signal-exit/package.json
 create mode 100644 node_modules/signal-exit/signals.js
 create mode 100644 node_modules/simple-concat/.travis.yml
 create mode 100644 node_modules/simple-concat/LICENSE
 create mode 100644 node_modules/simple-concat/README.md
 create mode 100644 node_modules/simple-concat/index.js
 create mode 100644 node_modules/simple-concat/package.json
 create mode 100644 node_modules/simple-concat/test/basic.js
 create mode 100644 node_modules/simple-get/LICENSE
 create mode 100644 node_modules/simple-get/README.md
 create mode 100644 node_modules/simple-get/index.js
 create mode 100644 node_modules/simple-get/package.json
 create mode 100644 node_modules/string-width/index.js
 create mode 100644 node_modules/string-width/license
 create mode 100644 node_modules/string-width/package.json
 create mode 100644 node_modules/string-width/readme.md
 create mode 100644 node_modules/string_decoder/.travis.yml
 create mode 100644 node_modules/string_decoder/LICENSE
 create mode 100644 node_modules/string_decoder/README.md
 create mode 100644 node_modules/string_decoder/lib/string_decoder.js
 create mode 100644 node_modules/string_decoder/package.json
 create mode 100644 node_modules/strip-ansi/index.js
 create mode 100644 node_modules/strip-ansi/license
 create mode 100644 node_modules/strip-ansi/package.json
 create mode 100644 node_modules/strip-ansi/readme.md
 create mode 100644 node_modules/strip-json-comments/index.js
 create mode 100644 node_modules/strip-json-comments/license
 create mode 100644 node_modules/strip-json-comments/package.json
 create mode 100644 node_modules/strip-json-comments/readme.md
 create mode 100644 node_modules/tar-fs/.travis.yml
 create mode 100644 node_modules/tar-fs/LICENSE
 create mode 100644 node_modules/tar-fs/README.md
 create mode 100644 node_modules/tar-fs/index.js
 create mode 100644 node_modules/tar-fs/package.json
 create mode 100644 node_modules/tar-fs/test/fixtures/a/hello.txt
 create mode 100644 node_modules/tar-fs/test/fixtures/b/a/test.txt
 create mode 100644 node_modules/tar-fs/test/fixtures/d/file1
 create mode 100644 node_modules/tar-fs/test/fixtures/d/file2
 create mode 100644 node_modules/tar-fs/test/fixtures/d/sub-dir/file5
 create mode 100644 node_modules/tar-fs/test/fixtures/d/sub-files/file3
 create mode 100644 node_modules/tar-fs/test/fixtures/d/sub-files/file4
 create mode 100644 node_modules/tar-fs/test/fixtures/e/directory/.ignore
 create mode 100644 node_modules/tar-fs/test/fixtures/e/file
 create mode 100644 node_modules/tar-fs/test/fixtures/invalid.tar
 create mode 100644 node_modules/tar-fs/test/index.js
 create mode 100644 node_modules/tar-stream/LICENSE
 create mode 100644 node_modules/tar-stream/README.md
 create mode 100644 node_modules/tar-stream/extract.js
 create mode 100644 node_modules/tar-stream/headers.js
 create mode 100644 node_modules/tar-stream/index.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/CONTRIBUTING.md
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/GOVERNANCE.md
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/LICENSE
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/README.md
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/errors-browser.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/errors.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/experimentalWarning.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/lib/_stream_duplex.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/lib/_stream_passthrough.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/lib/_stream_readable.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/lib/_stream_transform.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/lib/_stream_writable.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/async_iterator.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/buffer_list.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/destroy.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/end-of-stream.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from-browser.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/pipeline.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/state.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/package.json
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/readable-browser.js
 create mode 100644 node_modules/tar-stream/node_modules/readable-stream/readable.js
 create mode 100644 node_modules/tar-stream/pack.js
 create mode 100644 node_modules/tar-stream/package.json
 create mode 100644 node_modules/tar-stream/sandbox.js
 create mode 100644 node_modules/tunnel-agent/LICENSE
 create mode 100644 node_modules/tunnel-agent/README.md
 create mode 100644 node_modules/tunnel-agent/index.js
 create mode 100644 node_modules/tunnel-agent/package.json
 create mode 100644 node_modules/util-deprecate/History.md
 create mode 100644 node_modules/util-deprecate/LICENSE
 create mode 100644 node_modules/util-deprecate/README.md
 create mode 100644 node_modules/util-deprecate/browser.js
 create mode 100644 node_modules/util-deprecate/node.js
 create mode 100644 node_modules/util-deprecate/package.json
 create mode 100644 node_modules/which-pm-runs/LICENSE
 create mode 100644 node_modules/which-pm-runs/README.md
 create mode 100644 node_modules/which-pm-runs/index.js
 create mode 100644 node_modules/which-pm-runs/package.json
 create mode 100644 node_modules/wide-align/LICENSE
 create mode 100644 node_modules/wide-align/README.md
 create mode 100644 node_modules/wide-align/align.js
 create mode 100644 node_modules/wide-align/package.json
 create mode 100644 node_modules/wrappy/LICENSE
 create mode 100644 node_modules/wrappy/README.md
 create mode 100644 node_modules/wrappy/package.json
 create mode 100644 node_modules/wrappy/wrappy.js
 create mode 100644 server.js
 create mode 100644 simple_serial/simple_serial.ino

diff --git a/node_modules/.bin/detect-libc b/node_modules/.bin/detect-libc
new file mode 100644
index 0000000..4509242
--- /dev/null
+++ b/node_modules/.bin/detect-libc
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../detect-libc/bin/detect-libc.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/../detect-libc/bin/detect-libc.js" "$@"
+  ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/detect-libc.cmd b/node_modules/.bin/detect-libc.cmd
new file mode 100644
index 0000000..9a2d0ee
--- /dev/null
+++ b/node_modules/.bin/detect-libc.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\detect-libc\bin\detect-libc.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/detect-libc.ps1 b/node_modules/.bin/detect-libc.ps1
new file mode 100644
index 0000000..85e43b5
--- /dev/null
+++ b/node_modules/.bin/detect-libc.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../detect-libc/bin/detect-libc.js" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../detect-libc/bin/detect-libc.js" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/prebuild-install b/node_modules/.bin/prebuild-install
new file mode 100644
index 0000000..510e616
--- /dev/null
+++ b/node_modules/.bin/prebuild-install
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../prebuild-install/bin.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/../prebuild-install/bin.js" "$@"
+  ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/prebuild-install.cmd b/node_modules/.bin/prebuild-install.cmd
new file mode 100644
index 0000000..a310eb0
--- /dev/null
+++ b/node_modules/.bin/prebuild-install.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\prebuild-install\bin.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/prebuild-install.ps1 b/node_modules/.bin/prebuild-install.ps1
new file mode 100644
index 0000000..4875e9d
--- /dev/null
+++ b/node_modules/.bin/prebuild-install.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../prebuild-install/bin.js" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../prebuild-install/bin.js" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/rc b/node_modules/.bin/rc
new file mode 100644
index 0000000..9e01626
--- /dev/null
+++ b/node_modules/.bin/rc
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../rc/cli.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/../rc/cli.js" "$@"
+  ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/rc.cmd b/node_modules/.bin/rc.cmd
new file mode 100644
index 0000000..c0bf847
--- /dev/null
+++ b/node_modules/.bin/rc.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\rc\cli.js" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/rc.ps1 b/node_modules/.bin/rc.ps1
new file mode 100644
index 0000000..ac2cd2a
--- /dev/null
+++ b/node_modules/.bin/rc.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../rc/cli.js" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../rc/cli.js" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/.bin/semver b/node_modules/.bin/semver
new file mode 100644
index 0000000..10497aa
--- /dev/null
+++ b/node_modules/.bin/semver
@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/../semver/bin/semver" "$@"
+  ret=$?
+else 
+  node  "$basedir/../semver/bin/semver" "$@"
+  ret=$?
+fi
+exit $ret
diff --git a/node_modules/.bin/semver.cmd b/node_modules/.bin/semver.cmd
new file mode 100644
index 0000000..f6c4ad4
--- /dev/null
+++ b/node_modules/.bin/semver.cmd
@@ -0,0 +1,17 @@
+@ECHO off
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+"%_prog%"  "%dp0%\..\semver\bin\semver" %*
+ENDLOCAL
+EXIT /b %errorlevel%
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
diff --git a/node_modules/.bin/semver.ps1 b/node_modules/.bin/semver.ps1
new file mode 100644
index 0000000..a3315ff
--- /dev/null
+++ b/node_modules/.bin/semver.ps1
@@ -0,0 +1,18 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  & "$basedir/node$exe"  "$basedir/../semver/bin/semver" $args
+  $ret=$LASTEXITCODE
+} else {
+  & "node$exe"  "$basedir/../semver/bin/semver" $args
+  $ret=$LASTEXITCODE
+}
+exit $ret
diff --git a/node_modules/@serialport/binding-abstract/CHANGELOG.md b/node_modules/@serialport/binding-abstract/CHANGELOG.md
new file mode 100644
index 0000000..fa2fdd2
--- /dev/null
+++ b/node_modules/@serialport/binding-abstract/CHANGELOG.md
@@ -0,0 +1,35 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [9.0.2](https://github.com/serialport/node-serialport/compare/v9.0.1...v9.0.2) (2020-10-16)
+
+
+### Bug Fixes
+
+* while validating for offset, check for offset's value for NaN instead length ([#2124](https://github.com/serialport/node-serialport/issues/2124)) ([4215122](https://github.com/serialport/node-serialport/commit/42151228240c5c818ac5327d6ff5c01398805564))
+
+
+
+
+
+## [9.0.1](https://github.com/serialport/node-serialport/compare/v9.0.0...v9.0.1) (2020-08-08)
+
+**Note:** Version bump only for package @serialport/binding-abstract
+
+
+
+
+
+# [9.0.0](https://github.com/serialport/node-serialport/compare/v8.0.8...v9.0.0) (2020-05-10)
+
+**Note:** Version bump only for package @serialport/binding-abstract
+
+
+
+
+
+## [8.0.6](https://github.com/serialport/node-serialport/compare/v8.0.5...v8.0.6) (2019-12-25)
+
+**Note:** Version bump only for package @serialport/binding-abstract
diff --git a/node_modules/@serialport/binding-abstract/LICENSE b/node_modules/@serialport/binding-abstract/LICENSE
new file mode 100644
index 0000000..800d776
--- /dev/null
+++ b/node_modules/@serialport/binding-abstract/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright 2010 Christopher Williams. All rights reserved.
+
+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/@serialport/binding-abstract/README.md b/node_modules/@serialport/binding-abstract/README.md
new file mode 100644
index 0000000..df7bda1
--- /dev/null
+++ b/node_modules/@serialport/binding-abstract/README.md
@@ -0,0 +1,14 @@
+# @serialport/BindingAbstract
+
+This Abstract binding class is the base for all serialport bindings. You wouldn't use this class directly but instead extend it to make a new binding for a different platform or underling technology.
+
+This is currently used for the win32, linux, darwin and mock bindings.
+
+This is how you use it.
+```js
+class MockBinding extends AbstractBinding {
+  constructor(opt) {
+    super(opt)
+  }
+}
+```
diff --git a/node_modules/@serialport/binding-abstract/lib/index.js b/node_modules/@serialport/binding-abstract/lib/index.js
new file mode 100644
index 0000000..1c89713
--- /dev/null
+++ b/node_modules/@serialport/binding-abstract/lib/index.js
@@ -0,0 +1,221 @@
+const debug = require('debug')('serialport/binding-abstract')
+
+/**
+ * @name Binding
+ * @type {AbstractBinding}
+ * @since 5.0.0
+ * @description The `Binding` is how Node-SerialPort talks to the underlying system. By default, we auto detect Windows, Linux and OS X, and load the appropriate module for your system. You can assign `SerialPort.Binding` to any binding you like. Find more by searching at [npm](https://npmjs.org/).
+  Prevent auto loading the default bindings by requiring SerialPort with:
+  ```js
+  var SerialPort = require('@serialport/stream');
+  SerialPort.Binding = MyBindingClass;
+  ```
+ */
+
+/**
+ * You never have to use `Binding` objects directly. SerialPort uses them to access the underlying hardware. This documentation is geared towards people who are making bindings for different platforms. This class can be inherited from to get type checking for each method.
+ * @class AbstractBinding
+ * @param {object} options options for the binding
+ * @property {boolean} isOpen Required property. `true` if the port is open, `false` otherwise. Should be read-only.
+ * @throws {TypeError} When given invalid arguments, a `TypeError` is thrown.
+ * @since 5.0.0
+ */
+class AbstractBinding {
+  /**
+   * Retrieves a list of available serial ports with metadata. The `path` must be guaranteed, and all other fields should be undefined if unavailable. The `path` is either the path or an identifier (eg `COM1`) used to open the serialport.
+   * @returns {Promise} resolves to an array of port [info objects](#module_serialport--SerialPort.list).
+   */
+  static async list() {
+    debug('list')
+  }
+
+  constructor(opt = {}) {
+    if (typeof opt !== 'object') {
+      throw new TypeError('"options" is not an object')
+    }
+  }
+
+  /**
+   * Opens a connection to the serial port referenced by the path.
+   * @param {string} path the path or com port to open
+   * @param {openOptions} options openOptions for the serialport
+   * @returns {Promise} Resolves after the port is opened and configured.
+   * @rejects {TypeError} When given invalid arguments, a `TypeError` is rejected.
+   */
+  async open(path, options) {
+    if (!path) {
+      throw new TypeError('"path" is not a valid port')
+    }
+
+    if (typeof options !== 'object') {
+      throw new TypeError('"options" is not an object')
+    }
+    debug('open')
+
+    if (this.isOpen) {
+      throw new Error('Already open')
+    }
+  }
+
+  /**
+   * Closes an open connection
+   * @returns {Promise} Resolves once the connection is closed.
+   * @rejects {TypeError} When given invalid arguments, a `TypeError` is rejected.
+   */
+  async close() {
+    debug('close')
+    if (!this.isOpen) {
+      throw new Error('Port is not open')
+    }
+  }
+
+  /**
+   * Request a number of bytes from the SerialPort. This function is similar to Node's [`fs.read`](http://nodejs.org/api/fs.html#fs_fs_read_fd_buffer_offset_length_position_callback) except it will always return at least one byte.
+
+The in progress reads must error when the port is closed with an error object that has the property `canceled` equal to `true`. Any other error will cause a disconnection.
+
+   * @param {buffer} buffer Accepts a [`Buffer`](http://nodejs.org/api/buffer.html) object.
+   * @param {integer} offset The offset in the buffer to start writing at.
+   * @param {integer} length Specifies the maximum number of bytes to read.
+   * @returns {Promise} Resolves with the number of bytes read after a read operation.
+   * @rejects {TypeError} When given invalid arguments, a `TypeError` is rejected.
+   */
+  async read(buffer, offset, length) {
+    if (!Buffer.isBuffer(buffer)) {
+      throw new TypeError('"buffer" is not a Buffer')
+    }
+
+    if (typeof offset !== 'number' || isNaN(offset)) {
+      throw new TypeError(`"offset" is not an integer got "${isNaN(offset) ? 'NaN' : typeof offset}"`)
+    }
+
+    if (typeof length !== 'number' || isNaN(length)) {
+      throw new TypeError(`"length" is not an integer got "${isNaN(length) ? 'NaN' : typeof length}"`)
+    }
+
+    debug('read')
+    if (buffer.length < offset + length) {
+      throw new Error('buffer is too small')
+    }
+
+    if (!this.isOpen) {
+      throw new Error('Port is not open')
+    }
+  }
+
+  /**
+   * Write bytes to the SerialPort. Only called when there is no pending write operation.
+
+The in progress writes must error when the port is closed with an error object that has the property `canceled` equal to `true`. Any other error will cause a disconnection.
+
+   * @param {buffer} buffer - Accepts a [`Buffer`](http://nodejs.org/api/buffer.html) object.
+   * @returns {Promise} Resolves after the data is passed to the operating system for writing.
+   * @rejects {TypeError} When given invalid arguments, a `TypeError` is rejected.
+   */
+  async write(buffer) {
+    if (!Buffer.isBuffer(buffer)) {
+      throw new TypeError('"buffer" is not a Buffer')
+    }
+
+    debug('write', buffer.length, 'bytes')
+    if (!this.isOpen) {
+      debug('write', 'error port is not open')
+
+      throw new Error('Port is not open')
+    }
+  }
+
+  /**
+   * Changes connection settings on an open port. Only `baudRate` is supported.
+   * @param {object=} options Only supports `baudRate`.
+   * @param {number=} [options.baudRate] If provided a baud rate that the bindings do not support, it should reject.
+   * @returns {Promise} Resolves once the port's baud rate changes.
+   * @rejects {TypeError} When given invalid arguments, a `TypeError` is rejected.
+   */
+  async update(options) {
+    if (typeof options !== 'object') {
+      throw TypeError('"options" is not an object')
+    }
+
+    if (typeof options.baudRate !== 'number') {
+      throw new TypeError('"options.baudRate" is not a number')
+    }
+
+    debug('update')
+    if (!this.isOpen) {
+      throw new Error('Port is not open')
+    }
+  }
+
+  /**
+   * Set control flags on an open port.
+   * @param {object=} options All options are operating system default when the port is opened. Every flag is set on each call to the provided or default values. All options are always provided.
+   * @param {Boolean} [options.brk=false] flag for brk
+   * @param {Boolean} [options.cts=false] flag for cts
+   * @param {Boolean} [options.dsr=false] flag for dsr
+   * @param {Boolean} [options.dtr=true] flag for dtr
+   * @param {Boolean} [options.rts=true] flag for rts
+   * @returns {Promise} Resolves once the port's flags are set.
+   * @rejects {TypeError} When given invalid arguments, a `TypeError` is rejected.
+   */
+  async set(options) {
+    if (typeof options !== 'object') {
+      throw new TypeError('"options" is not an object')
+    }
+    debug('set')
+    if (!this.isOpen) {
+      throw new Error('Port is not open')
+    }
+  }
+
+  /**
+   * Get the control flags (CTS, DSR, DCD) on the open port.
+   * @returns {Promise} Resolves with the retrieved flags.
+   * @rejects {TypeError} When given invalid arguments, a `TypeError` is rejected.
+   */
+  async get() {
+    debug('get')
+    if (!this.isOpen) {
+      throw new Error('Port is not open')
+    }
+  }
+
+  /**
+   * Get the OS reported baud rate for the open port.
+   * Used mostly for debugging custom baud rates.
+   * @returns {Promise} Resolves with the current baud rate.
+   * @rejects {TypeError} When given invalid arguments, a `TypeError` is rejected.
+   */
+  async getBaudRate() {
+    debug('getbaudRate')
+    if (!this.isOpen) {
+      throw new Error('Port is not open')
+    }
+  }
+
+  /**
+   * Flush (discard) data received but not read, and written but not transmitted.
+   * @returns {Promise} Resolves once the flush operation finishes.
+   * @rejects {TypeError} When given invalid arguments, a `TypeError` is rejected.
+   */
+  async flush() {
+    debug('flush')
+    if (!this.isOpen) {
+      throw new Error('Port is not open')
+    }
+  }
+
+  /**
+   * Drain waits until all output data is transmitted to the serial port. An in progress write should be completed before this returns.
+   * @returns {Promise} Resolves once the drain operation finishes.
+   * @rejects {TypeError} When given invalid arguments, a `TypeError` is rejected.
+   */
+  async drain() {
+    debug('drain')
+    if (!this.isOpen) {
+      throw new Error('Port is not open')
+    }
+  }
+}
+
+module.exports = AbstractBinding
diff --git a/node_modules/@serialport/binding-abstract/package.json b/node_modules/@serialport/binding-abstract/package.json
new file mode 100644
index 0000000..df19464
--- /dev/null
+++ b/node_modules/@serialport/binding-abstract/package.json
@@ -0,0 +1,55 @@
+{
+  "_from": "@serialport/binding-abstract@^9.0.2",
+  "_id": "@serialport/binding-abstract@9.0.2",
+  "_inBundle": false,
+  "_integrity": "sha512-kyMX6usn+VLpidt0YsDq5JwztIan9TPCX6skr0XcalOxI8I7w+/2qVZJzjgo2fSqDnPRcU2jMWTytwzEXFODvQ==",
+  "_location": "/@serialport/binding-abstract",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "@serialport/binding-abstract@^9.0.2",
+    "name": "@serialport/binding-abstract",
+    "escapedName": "@serialport%2fbinding-abstract",
+    "scope": "@serialport",
+    "rawSpec": "^9.0.2",
+    "saveSpec": null,
+    "fetchSpec": "^9.0.2"
+  },
+  "_requiredBy": [
+    "/@serialport/binding-mock",
+    "/@serialport/bindings"
+  ],
+  "_resolved": "https://registry.npmjs.org/@serialport/binding-abstract/-/binding-abstract-9.0.2.tgz",
+  "_shasum": "f06f1859b59875632cd263d3f3bb0711c885c78f",
+  "_spec": "@serialport/binding-abstract@^9.0.2",
+  "_where": "F:\\vent-display\\node_modules\\@serialport\\binding-mock",
+  "bugs": {
+    "url": "https://github.com/serialport/node-serialport/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "debug": "^4.1.1"
+  },
+  "deprecated": false,
+  "description": "This Abstract binding class is the base for all serialport bindings. You wouldn't use this class directly but instead extend it to make a new binding for a different platform or underling technology.",
+  "engines": {
+    "node": ">=8.6.0"
+  },
+  "gitHead": "df482d3af7660fd13a4ecc2de5ddcb70a02417f4",
+  "homepage": "https://github.com/serialport/node-serialport#readme",
+  "keywords": [
+    "serialport-binding"
+  ],
+  "license": "MIT",
+  "main": "lib",
+  "name": "@serialport/binding-abstract",
+  "publishConfig": {
+    "access": "public"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/serialport/node-serialport.git"
+  },
+  "version": "9.0.2"
+}
diff --git a/node_modules/@serialport/binding-mock/CHANGELOG.md b/node_modules/@serialport/binding-mock/CHANGELOG.md
new file mode 100644
index 0000000..a11f2b0
--- /dev/null
+++ b/node_modules/@serialport/binding-mock/CHANGELOG.md
@@ -0,0 +1,35 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [9.0.2](https://github.com/serialport/node-serialport/compare/v9.0.1...v9.0.2) (2020-10-16)
+
+**Note:** Version bump only for package @serialport/binding-mock
+
+
+
+
+
+## [9.0.1](https://github.com/serialport/node-serialport/compare/v9.0.0...v9.0.1) (2020-08-08)
+
+**Note:** Version bump only for package @serialport/binding-mock
+
+
+
+
+
+# [9.0.0](https://github.com/serialport/node-serialport/compare/v8.0.8...v9.0.0) (2020-05-10)
+
+**Note:** Version bump only for package @serialport/binding-mock
+
+
+
+
+
+## [8.0.6](https://github.com/serialport/node-serialport/compare/v8.0.5...v8.0.6) (2019-12-25)
+
+
+### Bug Fixes
+
+* bindings.close() should cause a canceled read error ([#1972](https://github.com/serialport/node-serialport/issues/1972)) ([50f967e](https://github.com/serialport/node-serialport/commit/50f967e788f362da57d782829712542c8f15f8c8))
diff --git a/node_modules/@serialport/binding-mock/LICENSE b/node_modules/@serialport/binding-mock/LICENSE
new file mode 100644
index 0000000..800d776
--- /dev/null
+++ b/node_modules/@serialport/binding-mock/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright 2010 Christopher Williams. All rights reserved.
+
+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/@serialport/binding-mock/README.md b/node_modules/@serialport/binding-mock/README.md
new file mode 100644
index 0000000..ada6993
--- /dev/null
+++ b/node_modules/@serialport/binding-mock/README.md
@@ -0,0 +1,11 @@
+# @serialport/BindingMock
+
+This stream does some neat stuff.
+
+This is why you'd use it.
+
+This is how you use it.
+```js
+const bindingMock = new BindingMock()
+
+```
diff --git a/node_modules/@serialport/binding-mock/lib/index.js b/node_modules/@serialport/binding-mock/lib/index.js
new file mode 100644
index 0000000..640890f
--- /dev/null
+++ b/node_modules/@serialport/binding-mock/lib/index.js
@@ -0,0 +1,233 @@
+const AbstractBinding = require('@serialport/binding-abstract')
+const debug = require('debug')('serialport/binding-mock')
+const { wrapWithHiddenComName } = require('./legacy')
+
+let ports = {}
+let serialNumber = 0
+
+function resolveNextTick(value) {
+  return new Promise(resolve => process.nextTick(() => resolve(value)))
+}
+
+const cancelError = message => {
+  const err = new Error(message)
+  err.canceled = true
+  return err
+}
+
+/**
+ * Mock bindings for pretend serialport access
+ */
+class MockBinding extends AbstractBinding {
+  constructor(opt = {}) {
+    super(opt)
+    this.pendingRead = null // thunk for a promise or null
+    this.isOpen = false
+    this.port = null
+    this.lastWrite = null
+    this.recording = Buffer.alloc(0)
+    this.writeOperation = null // in flight promise or null
+  }
+
+  // Reset mocks
+  static reset() {
+    ports = {}
+    serialNumber = 0
+  }
+
+  // Create a mock port
+  static createPort(path, opt) {
+    serialNumber++
+    opt = {
+      echo: false,
+      record: false,
+      readyData: Buffer.from('READY'),
+      manufacturer: 'The J5 Robotics Company',
+      vendorId: undefined,
+      productId: undefined,
+      ...opt,
+    }
+
+    ports[path] = {
+      data: Buffer.alloc(0),
+      echo: opt.echo,
+      record: opt.record,
+      readyData: Buffer.from(opt.readyData),
+      info: {
+        path,
+        manufacturer: opt.manufacturer,
+        serialNumber,
+        pnpId: undefined,
+        locationId: undefined,
+        vendorId: opt.vendorId,
+        productId: opt.productId,
+      },
+    }
+    debug(serialNumber, 'created port', JSON.stringify({ path, opt }))
+  }
+
+  static async list() {
+    return wrapWithHiddenComName(Object.values(ports).map(port => port.info))
+  }
+
+  // Emit data on a mock port
+  emitData(data) {
+    if (!this.isOpen) {
+      throw new Error('Port must be open to pretend to receive data')
+    }
+    if (!Buffer.isBuffer(data)) {
+      data = Buffer.from(data)
+    }
+    debug(this.serialNumber, 'emitting data - pending read:', Boolean(this.pendingRead))
+    this.port.data = Buffer.concat([this.port.data, data])
+    if (this.pendingRead) {
+      process.nextTick(this.pendingRead)
+      this.pendingRead = null
+    }
+  }
+
+  async open(path, opt) {
+    debug(null, `opening path ${path}`)
+    const port = (this.port = ports[path])
+    await super.open(path, opt)
+    await resolveNextTick()
+    if (!port) {
+      throw new Error(`Port does not exist - please call MockBinding.createPort('${path}') first`)
+    }
+    this.serialNumber = port.info.serialNumber
+
+    if (port.openOpt && port.openOpt.lock) {
+      throw new Error('Port is locked cannot open')
+    }
+
+    if (this.isOpen) {
+      throw new Error('Open: binding is already open')
+    }
+
+    port.openOpt = { ...opt }
+    this.isOpen = true
+    debug(this.serialNumber, 'port is open')
+    if (port.echo) {
+      process.nextTick(() => {
+        if (this.isOpen) {
+          debug(this.serialNumber, 'emitting ready data')
+          this.emitData(port.readyData)
+        }
+      })
+    }
+  }
+
+  async close() {
+    const port = this.port
+    debug(this.serialNumber, 'closing port')
+    if (!port) {
+      throw new Error('already closed')
+    }
+
+    await super.close()
+    delete port.openOpt
+    // reset data on close
+    port.data = Buffer.alloc(0)
+    debug(this.serialNumber, 'port is closed')
+    delete this.port
+    delete this.serialNumber
+    this.isOpen = false
+    if (this.pendingRead) {
+      this.pendingRead(cancelError('port is closed'))
+    }
+  }
+
+  async read(buffer, offset, length) {
+    debug(this.serialNumber, 'reading', length, 'bytes')
+    await super.read(buffer, offset, length)
+    await resolveNextTick()
+    if (!this.isOpen) {
+      throw cancelError('Read canceled')
+    }
+    if (this.port.data.length <= 0) {
+      return new Promise((resolve, reject) => {
+        this.pendingRead = err => {
+          if (err) {
+            return reject(err)
+          }
+          this.read(buffer, offset, length).then(resolve, reject)
+        }
+      })
+    }
+    const data = this.port.data.slice(0, length)
+    const bytesRead = data.copy(buffer, offset)
+    this.port.data = this.port.data.slice(length)
+    debug(this.serialNumber, 'read', bytesRead, 'bytes')
+    return { bytesRead, buffer }
+  }
+
+  async write(buffer) {
+    debug(this.serialNumber, 'writing')
+    if (this.writeOperation) {
+      throw new Error('Overlapping writes are not supported and should be queued by the serialport object')
+    }
+    this.writeOperation = super.write(buffer).then(async () => {
+      await resolveNextTick()
+      if (!this.isOpen) {
+        throw new Error('Write canceled')
+      }
+      const data = (this.lastWrite = Buffer.from(buffer)) // copy
+      if (this.port.record) {
+        this.recording = Buffer.concat([this.recording, data])
+      }
+      if (this.port.echo) {
+        process.nextTick(() => {
+          if (this.isOpen) {
+            this.emitData(data)
+          }
+        })
+      }
+      this.writeOperation = null
+      debug(this.serialNumber, 'writing finished')
+    })
+    return this.writeOperation
+  }
+
+  async update(opt) {
+    await super.update(opt)
+    await resolveNextTick()
+    this.port.openOpt.baudRate = opt.baudRate
+  }
+
+  async set(opt) {
+    await super.set(opt)
+    await resolveNextTick()
+  }
+
+  async get() {
+    await super.get()
+    await resolveNextTick()
+    return {
+      cts: true,
+      dsr: false,
+      dcd: false,
+    }
+  }
+
+  async getBaudRate() {
+    await super.getBaudRate()
+    await resolveNextTick()
+    return {
+      baudRate: this.port.openOpt.baudRate,
+    }
+  }
+
+  async flush() {
+    await super.flush()
+    await resolveNextTick()
+    this.port.data = Buffer.alloc(0)
+  }
+
+  async drain() {
+    await super.drain()
+    await this.writeOperation
+    await resolveNextTick()
+  }
+}
+
+module.exports = MockBinding
diff --git a/node_modules/@serialport/binding-mock/lib/legacy.js b/node_modules/@serialport/binding-mock/lib/legacy.js
new file mode 100644
index 0000000..9cd2b70
--- /dev/null
+++ b/node_modules/@serialport/binding-mock/lib/legacy.js
@@ -0,0 +1,26 @@
+let warningSent = false
+
+const wrapWithHiddenComName = async portsPromise => {
+  const ports = await portsPromise
+  return ports.map(port => {
+    const newPort = { ...port }
+    return Object.defineProperties(newPort, {
+      comName: {
+        get() {
+          if (!warningSent) {
+            warningSent = true
+            console.warn(
+              `"PortInfo.comName" has been deprecated. You should now use "PortInfo.path". The property will be removed in the next major release.`
+            )
+          }
+          return newPort.path
+        },
+        enumerable: false,
+      },
+    })
+  })
+}
+
+module.exports = {
+  wrapWithHiddenComName,
+}
diff --git a/node_modules/@serialport/binding-mock/package.json b/node_modules/@serialport/binding-mock/package.json
new file mode 100644
index 0000000..e306612
--- /dev/null
+++ b/node_modules/@serialport/binding-mock/package.json
@@ -0,0 +1,55 @@
+{
+  "_from": "@serialport/binding-mock@^9.0.2",
+  "_id": "@serialport/binding-mock@9.0.2",
+  "_inBundle": false,
+  "_integrity": "sha512-HfrvJ/LXULHk8w63CGxwDNiDidFgDX8BnadY+cgVS6yHMHikbhLCLjCmUKsKBWaGKRqOznl0w+iUl7TMi1lkXQ==",
+  "_location": "/@serialport/binding-mock",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "@serialport/binding-mock@^9.0.2",
+    "name": "@serialport/binding-mock",
+    "escapedName": "@serialport%2fbinding-mock",
+    "scope": "@serialport",
+    "rawSpec": "^9.0.2",
+    "saveSpec": null,
+    "fetchSpec": "^9.0.2"
+  },
+  "_requiredBy": [
+    "/serialport"
+  ],
+  "_resolved": "https://registry.npmjs.org/@serialport/binding-mock/-/binding-mock-9.0.2.tgz",
+  "_shasum": "134acb3ad3c9a0343764b22f66c69cff506ecece",
+  "_spec": "@serialport/binding-mock@^9.0.2",
+  "_where": "F:\\vent-display\\node_modules\\serialport",
+  "bugs": {
+    "url": "https://github.com/serialport/node-serialport/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "@serialport/binding-abstract": "^9.0.2",
+    "debug": "^4.1.1"
+  },
+  "deprecated": false,
+  "description": "This stream does some neat stuff.",
+  "engines": {
+    "node": ">=8.6.0"
+  },
+  "gitHead": "df482d3af7660fd13a4ecc2de5ddcb70a02417f4",
+  "homepage": "https://github.com/serialport/node-serialport#readme",
+  "keywords": [
+    "serialport-binding"
+  ],
+  "license": "MIT",
+  "main": "lib",
+  "name": "@serialport/binding-mock",
+  "publishConfig": {
+    "access": "public"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/serialport/node-serialport.git"
+  },
+  "version": "9.0.2"
+}
diff --git a/node_modules/@serialport/bindings/.prebuild-installrc b/node_modules/@serialport/bindings/.prebuild-installrc
new file mode 100644
index 0000000..dc9ece4
--- /dev/null
+++ b/node_modules/@serialport/bindings/.prebuild-installrc
@@ -0,0 +1,3 @@
+{
+  "tag-prefix": "@serialport/bindings@"
+}
diff --git a/node_modules/@serialport/bindings/CHANGELOG.md b/node_modules/@serialport/bindings/CHANGELOG.md
new file mode 100644
index 0000000..cfb62b1
--- /dev/null
+++ b/node_modules/@serialport/bindings/CHANGELOG.md
@@ -0,0 +1,82 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [9.0.4](https://github.com/serialport/node-serialport/compare/v9.0.3...v9.0.4) (2020-12-17)
+
+**Note:** Version bump only for package @serialport/bindings
+
+
+
+
+
+## [9.0.3](https://github.com/serialport/node-serialport/compare/v9.0.2...v9.0.3) (2020-12-04)
+
+**Note:** Version bump only for package @serialport/bindings
+
+
+
+
+
+## [9.0.2](https://github.com/serialport/node-serialport/compare/v9.0.1...v9.0.2) (2020-10-16)
+
+**Note:** Version bump only for package @serialport/bindings
+
+
+
+
+
+## [9.0.1](https://github.com/serialport/node-serialport/compare/v9.0.0...v9.0.1) (2020-08-08)
+
+
+### Bug Fixes
+
+* disconnects should now work again on unix based systems ([#2120](https://github.com/serialport/node-serialport/issues/2120)) ([2801301](https://github.com/serialport/node-serialport/commit/2801301d1467152753c2012c7968947cf7f49c82))
+
+
+
+
+
+# [9.0.0](https://github.com/serialport/node-serialport/compare/v8.0.8...v9.0.0) (2020-05-10)
+
+
+### chore
+
+* build on node 14 and drop node 8 and 32bit linux builds ([#2079](https://github.com/serialport/node-serialport/issues/2079)) ([e0c232c](https://github.com/serialport/node-serialport/commit/e0c232c77ade7ab188dade1dc0cc7af134ce3a95))
+
+
+### BREAKING CHANGES
+
+* Dropping node 8 and 32bit linux builds
+
+
+
+
+
+## [8.0.8](https://github.com/serialport/node-serialport/compare/v8.0.7...v8.0.8) (2020-05-07)
+
+
+### Bug Fixes
+
+* reject on non-zero exit codes ([#2046](https://github.com/serialport/node-serialport/issues/2046)) ([6ee5c84](https://github.com/serialport/node-serialport/commit/6ee5c8471fd1e041ebfba736f1eb708d2764b63e))
+
+
+
+
+
+## [8.0.7](https://github.com/serialport/node-serialport/compare/v8.0.6...v8.0.7) (2020-01-30)
+
+**Note:** Version bump only for package @serialport/bindings
+
+
+
+
+
+## [8.0.6](https://github.com/serialport/node-serialport/compare/v8.0.5...v8.0.6) (2019-12-25)
+
+
+### Bug Fixes
+
+* bindings.close() should cause a canceled read error ([#1972](https://github.com/serialport/node-serialport/issues/1972)) ([50f967e](https://github.com/serialport/node-serialport/commit/50f967e788f362da57d782829712542c8f15f8c8))
+* No prebuilt binaries found with electron-builder ([#2003](https://github.com/serialport/node-serialport/issues/2003)) ([16f9662](https://github.com/serialport/node-serialport/commit/16f966233930bc7c7302d2b7a53d70282b42e165))
diff --git a/node_modules/@serialport/bindings/LICENSE b/node_modules/@serialport/bindings/LICENSE
new file mode 100644
index 0000000..800d776
--- /dev/null
+++ b/node_modules/@serialport/bindings/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright 2010 Christopher Williams. All rights reserved.
+
+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/@serialport/bindings/README.md b/node_modules/@serialport/bindings/README.md
new file mode 100644
index 0000000..f559f07
--- /dev/null
+++ b/node_modules/@serialport/bindings/README.md
@@ -0,0 +1,13 @@
+# @serialport/Bindings
+
+The `Binding` is how Node-SerialPort talks to the underlying system. By default, we auto detect Windows, Linux and OS X, and load the appropriate module for your system. You can assign `SerialPort.Binding` to any binding you like. Find more by searching ["serialport-binding" at npm](https://www.npmjs.com/search?q=serialport-binding).
+
+Learn more at our [bindings documentation](https://serialport.io/docs/api-bindings) page.
+
+# Android users
+
+When using termux there is a way to compile serialport to be used under Android
+
+```sh
+CFLAGS=-fPIC CXXFLAGS=-fPIC yarn rebuild
+```
diff --git a/node_modules/@serialport/bindings/binding.gyp b/node_modules/@serialport/bindings/binding.gyp
new file mode 100644
index 0000000..2aa5875
--- /dev/null
+++ b/node_modules/@serialport/bindings/binding.gyp
@@ -0,0 +1,67 @@
+{
+  'targets': [{
+    'target_name': 'bindings',
+    'sources': [
+      'src/serialport.cpp'
+    ],
+    'include_dirs': [
+      '<!(node -e "require(\'nan\')")'
+    ],
+    'conditions': [
+      ['OS=="win"',
+        {
+          'sources': [
+            'src/serialport_win.cpp'
+          ],
+          'msvs_settings': {
+            'VCCLCompilerTool': {
+              'ExceptionHandling': '2',
+              'DisableSpecificWarnings': [ '4530', '4506' ],
+            }
+          }
+        }
+      ],
+      ['OS=="mac"',
+        {
+          'sources': [
+            'src/serialport_unix.cpp',
+            'src/poller.cpp',
+            'src/darwin_list.cpp'
+          ],
+          'xcode_settings': {
+            'MACOSX_DEPLOYMENT_TARGET': '10.9',
+            'OTHER_LDFLAGS': [
+              '-framework CoreFoundation -framework IOKit'
+            ]
+          }
+        }
+      ],
+      ['OS=="linux"',
+        {
+          'sources': [
+            'src/serialport_unix.cpp',
+            'src/poller.cpp',
+            'src/serialport_linux.cpp'
+          ]
+        }
+      ],
+      ['OS=="android"',
+        {
+          'sources': [
+            'src/serialport_unix.cpp',
+            'src/poller.cpp',
+            'src/serialport_linux.cpp'
+          ]
+        }
+      ],
+      ['OS!="win"',
+        {
+          'sources': [
+            'src/serialport_unix.cpp',
+            'src/poller.cpp'
+          ]
+        }
+      ]
+    ]
+  }],
+}
diff --git a/node_modules/@serialport/bindings/build/Release/bindings.node b/node_modules/@serialport/bindings/build/Release/bindings.node
new file mode 100644
index 0000000000000000000000000000000000000000..6c831c28e428b51a67c8487ee59cec5df1a88783
GIT binary patch
literal 211456
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

literal 0
HcmV?d00001

diff --git a/node_modules/@serialport/bindings/lib/darwin.js b/node_modules/@serialport/bindings/lib/darwin.js
new file mode 100644
index 0000000..40302b9
--- /dev/null
+++ b/node_modules/@serialport/bindings/lib/darwin.js
@@ -0,0 +1,110 @@
+const { promisify } = require('util')
+const binding = require('bindings')('bindings.node')
+const AbstractBinding = require('@serialport/binding-abstract')
+const Poller = require('./poller')
+const unixRead = require('./unix-read')
+const unixWrite = require('./unix-write')
+const { wrapWithHiddenComName } = require('./legacy')
+
+const defaultBindingOptions = Object.freeze({
+  vmin: 1,
+  vtime: 0,
+})
+
+const asyncList = promisify(binding.list)
+const asyncOpen = promisify(binding.open)
+const asyncClose = promisify(binding.close)
+const asyncUpdate = promisify(binding.update)
+const asyncSet = promisify(binding.set)
+const asyncGet = promisify(binding.get)
+const asyncGetBaudRate = promisify(binding.getBaudRate)
+const asyncDrain = promisify(binding.drain)
+const asyncFlush = promisify(binding.flush)
+
+/**
+ * The Darwin binding layer for OSX
+ */
+class DarwinBinding extends AbstractBinding {
+  static list() {
+    return wrapWithHiddenComName(asyncList())
+  }
+
+  constructor(opt = {}) {
+    super(opt)
+    this.bindingOptions = { ...defaultBindingOptions, ...opt.bindingOptions }
+    this.fd = null
+    this.writeOperation = null
+  }
+
+  get isOpen() {
+    return this.fd !== null
+  }
+
+  async open(path, options) {
+    await super.open(path, options)
+    this.openOptions = { ...this.bindingOptions, ...options }
+    const fd = await asyncOpen(path, this.openOptions)
+    this.fd = fd
+    this.poller = new Poller(fd)
+  }
+
+  async close() {
+    await super.close()
+    const fd = this.fd
+    this.poller.stop()
+    this.poller.destroy()
+    this.poller = null
+    this.openOptions = null
+    this.fd = null
+    return asyncClose(fd)
+  }
+
+  async read(buffer, offset, length) {
+    await super.read(buffer, offset, length)
+    return unixRead({ binding: this, buffer, offset, length })
+  }
+
+  async write(buffer) {
+    this.writeOperation = super.write(buffer).then(async () => {
+      if (buffer.length === 0) {
+        return
+      }
+      await unixWrite({ binding: this, buffer })
+      this.writeOperation = null
+    })
+    return this.writeOperation
+  }
+
+  async update(options) {
+    await super.update(options)
+    return asyncUpdate(this.fd, options)
+  }
+
+  async set(options) {
+    await super.set(options)
+    return asyncSet(this.fd, options)
+  }
+
+  async get() {
+    await super.get()
+    return asyncGet(this.fd)
+  }
+
+  async getBaudRate() {
+    await super.get()
+    return asyncGetBaudRate(this.fd)
+  }
+
+  async drain() {
+    await super.drain()
+    await this.writeOperation
+    return asyncDrain(this.fd)
+  }
+
+  async flush() {
+    await super.flush()
+    return asyncFlush(this.fd)
+  }
+}
+
+module.exports = DarwinBinding
diff --git a/node_modules/@serialport/bindings/lib/index.js b/node_modules/@serialport/bindings/lib/index.js
new file mode 100644
index 0000000..af4e228
--- /dev/null
+++ b/node_modules/@serialport/bindings/lib/index.js
@@ -0,0 +1,15 @@
+const debug = require('debug')('serialport/bindings')
+
+switch (process.platform) {
+  case 'win32':
+    debug('loading WindowsBinding')
+    module.exports = require('./win32')
+    break
+  case 'darwin':
+    debug('loading DarwinBinding')
+    module.exports = require('./darwin')
+    break
+  default:
+    debug('loading LinuxBinding')
+    module.exports = require('./linux')
+}
diff --git a/node_modules/@serialport/bindings/lib/legacy.js b/node_modules/@serialport/bindings/lib/legacy.js
new file mode 100644
index 0000000..9cd2b70
--- /dev/null
+++ b/node_modules/@serialport/bindings/lib/legacy.js
@@ -0,0 +1,26 @@
+let warningSent = false
+
+const wrapWithHiddenComName = async portsPromise => {
+  const ports = await portsPromise
+  return ports.map(port => {
+    const newPort = { ...port }
+    return Object.defineProperties(newPort, {
+      comName: {
+        get() {
+          if (!warningSent) {
+            warningSent = true
+            console.warn(
+              `"PortInfo.comName" has been deprecated. You should now use "PortInfo.path". The property will be removed in the next major release.`
+            )
+          }
+          return newPort.path
+        },
+        enumerable: false,
+      },
+    })
+  })
+}
+
+module.exports = {
+  wrapWithHiddenComName,
+}
diff --git a/node_modules/@serialport/bindings/lib/linux-list.js b/node_modules/@serialport/bindings/lib/linux-list.js
new file mode 100644
index 0000000..63cb95a
--- /dev/null
+++ b/node_modules/@serialport/bindings/lib/linux-list.js
@@ -0,0 +1,100 @@
+const childProcess = require('child_process')
+const Readline = require('@serialport/parser-readline')
+
+// get only serial port names
+function checkPathOfDevice(path) {
+  return /(tty(S|WCH|ACM|USB|AMA|MFD|O|XRUSB)|rfcomm)/.test(path) && path
+}
+
+function propName(name) {
+  return {
+    DEVNAME: 'path',
+    ID_VENDOR_ENC: 'manufacturer',
+    ID_SERIAL_SHORT: 'serialNumber',
+    ID_VENDOR_ID: 'vendorId',
+    ID_MODEL_ID: 'productId',
+    DEVLINKS: 'pnpId',
+  }[name.toUpperCase()]
+}
+
+function decodeHexEscape(str) {
+  return str.replace(/\\x([a-fA-F0-9]{2})/g, (a, b) => {
+    return String.fromCharCode(parseInt(b, 16))
+  })
+}
+
+function propVal(name, val) {
+  if (name === 'pnpId') {
+    const match = val.match(/\/by-id\/([^\s]+)/)
+    return (match && match[1]) || undefined
+  }
+  if (name === 'manufacturer') {
+    return decodeHexEscape(val)
+  }
+  if (/^0x/.test(val)) {
+    return val.substr(2)
+  }
+  return val
+}
+
+function listLinux() {
+  return new Promise((resolve, reject) => {
+    const ports = []
+    const ude = childProcess.spawn('udevadm', ['info', '-e'])
+    const lines = ude.stdout.pipe(new Readline())
+    ude.on('close', code => code && reject(new Error(`Error listing ports udevadm exited with error code: ${code}`)))
+    ude.on('error', reject)
+    lines.on('error', reject)
+
+    let port = {}
+    let skipPort = false
+    lines.on('data', line => {
+      const lineType = line.slice(0, 1)
+      const data = line.slice(3)
+      // new port entry
+      if (lineType === 'P') {
+        port = {
+          manufacturer: undefined,
+          serialNumber: undefined,
+          pnpId: undefined,
+          locationId: undefined,
+          vendorId: undefined,
+          productId: undefined,
+        }
+        skipPort = false
+        return
+      }
+
+      if (skipPort) {
+        return
+      }
+
+      // Check dev name and save port if it matches flag to skip the rest of the data if not
+      if (lineType === 'N') {
+        if (checkPathOfDevice(data)) {
+          ports.push(port)
+        } else {
+          skipPort = true
+        }
+        return
+      }
+
+      // parse data about each port
+      if (lineType === 'E') {
+        const keyValue = data.match(/^(.+)=(.*)/)
+        if (!keyValue) {
+          return
+        }
+        const key = propName(keyValue[1])
+        if (!key) {
+          return
+        }
+        port[key] = propVal(key, keyValue[2])
+      }
+    })
+
+    lines.on('finish', () => resolve(ports))
+  })
+}
+
+module.exports = listLinux
diff --git a/node_modules/@serialport/bindings/lib/linux.js b/node_modules/@serialport/bindings/lib/linux.js
new file mode 100644
index 0000000..69d4144
--- /dev/null
+++ b/node_modules/@serialport/bindings/lib/linux.js
@@ -0,0 +1,110 @@
+const { promisify } = require('util')
+const binding = require('bindings')('bindings.node')
+const AbstractBinding = require('@serialport/binding-abstract')
+const linuxList = require('./linux-list')
+const Poller = require('./poller')
+const unixRead = require('./unix-read')
+const unixWrite = require('./unix-write')
+const { wrapWithHiddenComName } = require('./legacy')
+
+const defaultBindingOptions = Object.freeze({
+  vmin: 1,
+  vtime: 0,
+})
+
+const asyncOpen = promisify(binding.open)
+const asyncClose = promisify(binding.close)
+const asyncUpdate = promisify(binding.update)
+const asyncSet = promisify(binding.set)
+const asyncGet = promisify(binding.get)
+const asyncGetBaudRate = promisify(binding.getBaudRate)
+const asyncDrain = promisify(binding.drain)
+const asyncFlush = promisify(binding.flush)
+
+/**
+ * The linux binding layer
+ */
+class LinuxBinding extends AbstractBinding {
+  static list() {
+    return wrapWithHiddenComName(linuxList())
+  }
+
+  constructor(opt = {}) {
+    super(opt)
+    this.bindingOptions = { ...defaultBindingOptions, ...opt.bindingOptions }
+    this.fd = null
+    this.writeOperation = null
+  }
+
+  get isOpen() {
+    return this.fd !== null
+  }
+
+  async open(path, options) {
+    await super.open(path, options)
+    this.openOptions = { ...this.bindingOptions, ...options }
+    const fd = await asyncOpen(path, this.openOptions)
+    this.fd = fd
+    this.poller = new Poller(fd)
+  }
+
+  async close() {
+    await super.close()
+    const fd = this.fd
+    this.poller.stop()
+    this.poller.destroy()
+    this.poller = null
+    this.openOptions = null
+    this.fd = null
+    return asyncClose(fd)
+  }
+
+  async read(buffer, offset, length) {
+    await super.read(buffer, offset, length)
+    return unixRead({ binding: this, buffer, offset, length })
+  }
+
+  async write(buffer) {
+    this.writeOperation = super.write(buffer).then(async () => {
+      if (buffer.length === 0) {
+        return
+      }
+      await unixWrite({ binding: this, buffer })
+      this.writeOperation = null
+    })
+    return this.writeOperation
+  }
+
+  async update(options) {
+    await super.update(options)
+    return asyncUpdate(this.fd, options)
+  }
+
+  async set(options) {
+    await super.set(options)
+    return asyncSet(this.fd, options)
+  }
+
+  async get() {
+    await super.get()
+    return asyncGet(this.fd)
+  }
+
+  async getBaudRate() {
+    await super.get()
+    return asyncGetBaudRate(this.fd)
+  }
+
+  async drain() {
+    await super.drain()
+    await this.writeOperation
+    return asyncDrain(this.fd)
+  }
+
+  async flush() {
+    await super.flush()
+    return asyncFlush(this.fd)
+  }
+}
+
+module.exports = LinuxBinding
diff --git a/node_modules/@serialport/bindings/lib/poller.js b/node_modules/@serialport/bindings/lib/poller.js
new file mode 100644
index 0000000..085ac02
--- /dev/null
+++ b/node_modules/@serialport/bindings/lib/poller.js
@@ -0,0 +1,111 @@
+const debug = require('debug')
+const logger = debug('serialport/bindings/poller')
+const EventEmitter = require('events')
+const PollerBindings = require('bindings')('bindings.node').Poller
+
+const EVENTS = {
+  UV_READABLE: 0b0001,
+  UV_WRITABLE: 0b0010,
+  UV_DISCONNECT: 0b0100,
+}
+
+function handleEvent(error, eventFlag) {
+  if (error) {
+    logger('error', error)
+    this.emit('readable', error)
+    this.emit('writable', error)
+    this.emit('disconnect', error)
+    return
+  }
+  if (eventFlag & EVENTS.UV_READABLE) {
+    logger('received "readable"')
+    this.emit('readable', null)
+  }
+  if (eventFlag & EVENTS.UV_WRITABLE) {
+    logger('received "writable"')
+    this.emit('writable', null)
+  }
+  if (eventFlag & EVENTS.UV_DISCONNECT) {
+    logger('received "disconnect"')
+    this.emit('disconnect', null)
+  }
+}
+
+/**
+ * Polls unix systems for readable or writable states of a file or serialport
+ */
+class Poller extends EventEmitter {
+  constructor(fd, FDPoller = PollerBindings) {
+    logger('Creating poller')
+    super()
+    this.poller = new FDPoller(fd, handleEvent.bind(this))
+  }
+  /**
+   * Wait for the next event to occur
+   * @param {string} event ('readable'|'writable'|'disconnect')
+   * @returns {Poller} returns itself
+   */
+  once(event, callback) {
+    switch (event) {
+      case 'readable':
+        this.poll(EVENTS.UV_READABLE)
+        break
+      case 'writable':
+        this.poll(EVENTS.UV_WRITABLE)
+        break
+      case 'disconnect':
+        this.poll(EVENTS.UV_DISCONNECT)
+        break
+    }
+    return super.once(event, callback)
+  }
+
+  /**
+   * Ask the bindings to listen for an event, it is recommend to use `.once()` for easy use
+   * @param {EVENTS} eventFlag polls for an event or group of events based upon a flag.
+   * @returns {undefined}
+   */
+  poll(eventFlag) {
+    eventFlag = eventFlag || 0
+
+    if (eventFlag & EVENTS.UV_READABLE) {
+      logger('Polling for "readable"')
+    }
+    if (eventFlag & EVENTS.UV_WRITABLE) {
+      logger('Polling for "writable"')
+    }
+    if (eventFlag & EVENTS.UV_DISCONNECT) {
+      logger('Polling for "disconnect"')
+    }
+
+    this.poller.poll(eventFlag)
+  }
+
+  /**
+   * Stop listening for events and cancel all outstanding listening with an error
+   * @returns {undefined}
+   */
+  stop() {
+    logger('Stopping poller')
+    this.poller.stop()
+    this.emitCanceled()
+  }
+
+  destroy() {
+    logger('Destroying poller')
+    this.poller.destroy()
+    this.emitCanceled()
+  }
+
+  emitCanceled() {
+    const err = new Error('Canceled')
+    err.canceled = true
+    this.emit('readable', err)
+    this.emit('writable', err)
+    this.emit('disconnect', err)
+  }
+}
+
+Poller.EVENTS = EVENTS
+
+module.exports = Poller
diff --git a/node_modules/@serialport/bindings/lib/unix-read.js b/node_modules/@serialport/bindings/lib/unix-read.js
new file mode 100644
index 0000000..ea3107d
--- /dev/null
+++ b/node_modules/@serialport/bindings/lib/unix-read.js
@@ -0,0 +1,57 @@
+const fs = require('fs')
+const debug = require('debug')
+const logger = debug('serialport/bindings/unixRead')
+const { promisify } = require('util')
+
+const readAsync = promisify(fs.read)
+
+const readable = binding => {
+  return new Promise((resolve, reject) => {
+    binding.poller.once('readable', err => (err ? reject(err) : resolve()))
+  })
+}
+
+const unixRead = async ({ binding, buffer, offset, length, fsReadAsync = readAsync }) => {
+  logger('Starting read')
+  if (!binding.isOpen) {
+    const err = new Error('Port is not open')
+    err.canceled = true
+    throw err
+  }
+
+  try {
+    const { bytesRead } = await fsReadAsync(binding.fd, buffer, offset, length, null)
+    if (bytesRead === 0) {
+      return unixRead({ binding, buffer, offset, length, fsReadAsync })
+    }
+    logger('Finished read', bytesRead, 'bytes')
+    return { bytesRead, buffer }
+  } catch (err) {
+    logger('read error', err)
+    if (err.code === 'EAGAIN' || err.code === 'EWOULDBLOCK' || err.code === 'EINTR') {
+      if (!binding.isOpen) {
+        const err = new Error('Port is not open')
+        err.canceled = true
+        throw err
+      }
+      logger('waiting for readable because of code:', err.code)
+      await readable(binding)
+      return unixRead({ binding, buffer, offset, length, fsReadAsync })
+    }
+
+    const disconnectError =
+      err.code === 'EBADF' || // Bad file number means we got closed
+      err.code === 'ENXIO' || // No such device or address probably usb disconnect
+      err.code === 'UNKNOWN' ||
+      err.errno === -1 // generic error
+
+    if (disconnectError) {
+      err.disconnect = true
+      logger('disconnecting', err)
+    }
+
+    throw err
+  }
+}
+
+module.exports = unixRead
diff --git a/node_modules/@serialport/bindings/lib/unix-write.js b/node_modules/@serialport/bindings/lib/unix-write.js
new file mode 100644
index 0000000..dd8cd34
--- /dev/null
+++ b/node_modules/@serialport/bindings/lib/unix-write.js
@@ -0,0 +1,57 @@
+const fs = require('fs')
+const debug = require('debug')
+const logger = debug('serialport/bindings/unixWrite')
+const { promisify } = require('util')
+
+const writeAsync = promisify(fs.write)
+
+const writable = binding => {
+  return new Promise((resolve, reject) => {
+    binding.poller.once('writable', err => (err ? reject(err) : resolve()))
+  })
+}
+
+const unixWrite = async ({ binding, buffer, offset = 0, fsWriteAsync = writeAsync }) => {
+  const bytesToWrite = buffer.length - offset
+  logger('Starting write', buffer.length, 'bytes offset', offset, 'bytesToWrite', bytesToWrite)
+  if (!binding.isOpen) {
+    throw new Error('Port is not open')
+  }
+  try {
+    const { bytesWritten } = await fsWriteAsync(binding.fd, buffer, offset, bytesToWrite)
+    logger('write returned: wrote', bytesWritten, 'bytes')
+    if (bytesWritten + offset < buffer.length) {
+      if (!binding.isOpen) {
+        throw new Error('Port is not open')
+      }
+      return unixWrite({ binding, buffer, offset: bytesWritten + offset, fsWriteAsync })
+    }
+
+    logger('Finished writing', bytesWritten + offset, 'bytes')
+  } catch (err) {
+    logger('write errored', err)
+    if (err.code === 'EAGAIN' || err.code === 'EWOULDBLOCK' || err.code === 'EINTR') {
+      if (!binding.isOpen) {
+        throw new Error('Port is not open')
+      }
+      logger('waiting for writable because of code:', err.code)
+      await writable(binding)
+      return unixWrite({ binding, buffer, offset, fsWriteAsync })
+    }
+
+    const disconnectError =
+      err.code === 'EBADF' || // Bad file number means we got closed
+      err.code === 'ENXIO' || // No such device or address probably usb disconnect
+      err.code === 'UNKNOWN' ||
+      err.errno === -1 // generic error
+
+    if (disconnectError) {
+      err.disconnect = true
+      logger('disconnecting', err)
+    }
+
+    logger('error', err)
+    throw err
+  }
+}
+module.exports = unixWrite
diff --git a/node_modules/@serialport/bindings/lib/win32-sn-parser.js b/node_modules/@serialport/bindings/lib/win32-sn-parser.js
new file mode 100644
index 0000000..6322f6b
--- /dev/null
+++ b/node_modules/@serialport/bindings/lib/win32-sn-parser.js
@@ -0,0 +1,14 @@
+const PARSERS = [/USB\\(?:.+)\\(.+)/, /FTDIBUS\\(?:.+)\+(.+?)A?\\.+/]
+
+module.exports = pnpId => {
+  if (!pnpId) {
+    return null
+  }
+  for (const parser of PARSERS) {
+    const sn = pnpId.match(parser)
+    if (sn) {
+      return sn[1]
+    }
+  }
+  return null
+}
diff --git a/node_modules/@serialport/bindings/lib/win32.js b/node_modules/@serialport/bindings/lib/win32.js
new file mode 100644
index 0000000..414f275
--- /dev/null
+++ b/node_modules/@serialport/bindings/lib/win32.js
@@ -0,0 +1,123 @@
+const binding = require('bindings')('bindings.node')
+const AbstractBinding = require('@serialport/binding-abstract')
+const { promisify } = require('util')
+const serialNumParser = require('./win32-sn-parser')
+
+const asyncList = promisify(binding.list)
+const asyncOpen = promisify(binding.open)
+const asyncClose = promisify(binding.close)
+const asyncRead = promisify(binding.read)
+const asyncWrite = promisify(binding.write)
+const asyncUpdate = promisify(binding.update)
+const asyncSet = promisify(binding.set)
+const asyncGet = promisify(binding.get)
+const asyncGetBaudRate = promisify(binding.getBaudRate)
+const asyncDrain = promisify(binding.drain)
+const asyncFlush = promisify(binding.flush)
+const { wrapWithHiddenComName } = require('./legacy')
+
+/**
+ * The Windows binding layer
+ */
+class WindowsBinding extends AbstractBinding {
+  static async list() {
+    const ports = await asyncList()
+    // Grab the serial number from the pnp id
+    return wrapWithHiddenComName(
+      ports.map(port => {
+        if (port.pnpId && !port.serialNumber) {
+          const serialNumber = serialNumParser(port.pnpId)
+          if (serialNumber) {
+            return {
+              ...port,
+              serialNumber,
+            }
+          }
+        }
+        return port
+      })
+    )
+  }
+
+  constructor(opt = {}) {
+    super(opt)
+    this.bindingOptions = { ...opt.bindingOptions }
+    this.fd = null
+    this.writeOperation = null
+  }
+
+  get isOpen() {
+    return this.fd !== null
+  }
+
+  async open(path, options) {
+    await super.open(path, options)
+    this.openOptions = { ...this.bindingOptions, ...options }
+    const fd = await asyncOpen(path, this.openOptions)
+    this.fd = fd
+  }
+
+  async close() {
+    await super.close()
+    const fd = this.fd
+    this.fd = null
+    return asyncClose(fd)
+  }
+
+  async read(buffer, offset, length) {
+    await super.read(buffer, offset, length)
+    try {
+      const bytesRead = await asyncRead(this.fd, buffer, offset, length)
+      return { bytesRead, buffer }
+    } catch (err) {
+      if (!this.isOpen) {
+        err.canceled = true
+      }
+      throw err
+    }
+  }
+
+  async write(buffer) {
+    this.writeOperation = super.write(buffer).then(async () => {
+      if (buffer.length === 0) {
+        return
+      }
+      await asyncWrite(this.fd, buffer)
+      this.writeOperation = null
+    })
+    return this.writeOperation
+  }
+
+  async update(options) {
+    await super.update(options)
+    return asyncUpdate(this.fd, options)
+  }
+
+  async set(options) {
+    await super.set(options)
+    return asyncSet(this.fd, options)
+  }
+
+  async get() {
+    await super.get()
+    return asyncGet(this.fd)
+  }
+
+  async getBaudRate() {
+    await super.get()
+    return asyncGetBaudRate(this.fd)
+  }
+
+  async drain() {
+    await super.drain()
+    await this.writeOperation
+    return asyncDrain(this.fd)
+  }
+
+  async flush() {
+    await super.flush()
+    return asyncFlush(this.fd)
+  }
+}
+
+module.exports = WindowsBinding
diff --git a/node_modules/@serialport/bindings/package.json b/node_modules/@serialport/bindings/package.json
new file mode 100644
index 0000000..cbc5cb7
--- /dev/null
+++ b/node_modules/@serialport/bindings/package.json
@@ -0,0 +1,81 @@
+{
+  "_from": "@serialport/bindings@^9.0.4",
+  "_id": "@serialport/bindings@9.0.4",
+  "_inBundle": false,
+  "_integrity": "sha512-6dlE1vm5c1xk667f1Zm7D+msbHJ9jdnUr9l8DResKpj2iCBzbCNsW+yCYq26WxzXWc1L2HUaS3/aL+k0wm5amg==",
+  "_location": "/@serialport/bindings",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "@serialport/bindings@^9.0.4",
+    "name": "@serialport/bindings",
+    "escapedName": "@serialport%2fbindings",
+    "scope": "@serialport",
+    "rawSpec": "^9.0.4",
+    "saveSpec": null,
+    "fetchSpec": "^9.0.4"
+  },
+  "_requiredBy": [
+    "/serialport"
+  ],
+  "_resolved": "https://registry.npmjs.org/@serialport/bindings/-/bindings-9.0.4.tgz",
+  "_shasum": "c8c24caf32d666a49a47b474ebd3f834f21481b3",
+  "_spec": "@serialport/bindings@^9.0.4",
+  "_where": "F:\\vent-display\\node_modules\\serialport",
+  "bugs": {
+    "url": "https://github.com/serialport/node-serialport/issues"
+  },
+  "bundleDependencies": false,
+  "cc": {
+    "filter": [
+      "legal/copyright",
+      "build/include"
+    ],
+    "files": [
+      "src/*.cpp",
+      "src/*.h"
+    ],
+    "linelength": "120"
+  },
+  "dependencies": {
+    "@serialport/binding-abstract": "^9.0.2",
+    "@serialport/parser-readline": "^9.0.1",
+    "bindings": "^1.5.0",
+    "debug": "^4.3.1",
+    "nan": "^2.14.2",
+    "prebuild-install": "^6.0.0"
+  },
+  "deprecated": false,
+  "description": "The `Binding` is how Node-SerialPort talks to the underlying system. By default, we auto detect Windows, Linux and OS X, and load the appropriate module for your system. You can assign `SerialPort.Binding` to any binding you like. Find more by searching [\"serialport-binding\" at npm](https://www.npmjs.com/search?q=serialport-binding).",
+  "devDependencies": {
+    "@serialport/binding-mock": "^9.0.2",
+    "node-abi": "^2.19.3"
+  },
+  "engines": {
+    "node": ">=8.6.0"
+  },
+  "gitHead": "b8b12c0671f783193e2b798cb3d8ef67edd2de4b",
+  "gypfile": true,
+  "homepage": "https://github.com/serialport/node-serialport#readme",
+  "keywords": [
+    "serialport-binding"
+  ],
+  "license": "MIT",
+  "main": "lib",
+  "name": "@serialport/bindings",
+  "publishConfig": {
+    "access": "public"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/serialport/node-serialport.git"
+  },
+  "scripts": {
+    "install": "prebuild-install --tag-prefix @serialport/bindings@ || node-gyp rebuild",
+    "lint": "cc --verbose",
+    "prebuild": "prebuild --all --force --strip --verbose --tag-prefix @serialport/bindings@",
+    "rebuild": "node-gyp rebuild"
+  },
+  "version": "9.0.4"
+}
diff --git a/node_modules/@serialport/bindings/src/darwin_list.cpp b/node_modules/@serialport/bindings/src/darwin_list.cpp
new file mode 100644
index 0000000..a3f5d65
--- /dev/null
+++ b/node_modules/@serialport/bindings/src/darwin_list.cpp
@@ -0,0 +1,359 @@
+#include "./darwin_list.h"
+
+#include <IOKit/IOKitLib.h>
+#include <IOKit/IOCFPlugIn.h>
+#include <IOKit/usb/IOUSBLib.h>
+#include <IOKit/serial/IOSerialKeys.h>
+
+#if defined(MAC_OS_X_VERSION_10_4) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4)
+#include <sys/ioctl.h>
+#include <IOKit/serial/ioss.h>
+#endif
+
+#include <string>
+#include <list>
+
+uv_mutex_t list_mutex;
+Boolean lockInitialised = FALSE;
+
+NAN_METHOD(List) {
+  // callback
+  if (!info[0]->IsFunction()) {
+    Nan::ThrowTypeError("First argument must be a function");
+    return;
+  }
+
+  ListBaton* baton = new ListBaton();
+  snprintf(baton->errorString, sizeof(baton->errorString), "");
+  baton->callback.Reset(info[0].As<v8::Function>());
+
+  uv_work_t* req = new uv_work_t();
+  req->data = baton;
+  uv_queue_work(uv_default_loop(), req, EIO_List, (uv_after_work_cb)EIO_AfterList);
+}
+
+void setIfNotEmpty(v8::Local<v8::Object> item, std::string key, const char *value) {
+  v8::Local<v8::String> v8key = Nan::New<v8::String>(key).ToLocalChecked();
+  if (strlen(value) > 0) {
+    Nan::Set(item, v8key, Nan::New<v8::String>(value).ToLocalChecked());
+  } else {
+    Nan::Set(item, v8key, Nan::Undefined());
+  }
+}
+
+
+// Function prototypes
+static kern_return_t FindModems(io_iterator_t *matchingServices);
+static io_service_t GetUsbDevice(io_service_t service);
+static stDeviceListItem* GetSerialDevices();
+
+
+static kern_return_t FindModems(io_iterator_t *matchingServices) {
+    kern_return_t     kernResult;
+    CFMutableDictionaryRef  classesToMatch;
+    classesToMatch = IOServiceMatching(kIOSerialBSDServiceValue);
+    if (classesToMatch != NULL) {
+        CFDictionarySetValue(classesToMatch,
+                             CFSTR(kIOSerialBSDTypeKey),
+                             CFSTR(kIOSerialBSDAllTypes));
+    }
+
+    kernResult = IOServiceGetMatchingServices(kIOMasterPortDefault, classesToMatch, matchingServices);
+
+    return kernResult;
+}
+
+static io_service_t GetUsbDevice(io_service_t service) {
+  IOReturn status;
+  io_iterator_t   iterator = 0;
+  io_service_t    device = 0;
+
+  if (!service) {
+    return device;
+  }
+
+  status = IORegistryEntryCreateIterator(service,
+                                         kIOServicePlane,
+                                         (kIORegistryIterateParents | kIORegistryIterateRecursively),
+                                         &iterator);
+
+  if (status == kIOReturnSuccess) {
+    io_service_t currentService;
+    while ((currentService = IOIteratorNext(iterator)) && device == 0) {
+      io_name_t serviceName;
+      status = IORegistryEntryGetNameInPlane(currentService, kIOServicePlane, serviceName);
+      if (status == kIOReturnSuccess && IOObjectConformsTo(currentService, kIOUSBDeviceClassName)) {
+        device = currentService;
+      } else {
+        // Release the service object which is no longer needed
+        (void) IOObjectRelease(currentService);
+      }
+    }
+
+    // Release the iterator
+    (void) IOObjectRelease(iterator);
+  }
+
+  return device;
+}
+
+static void ExtractUsbInformation(stSerialDevice *serialDevice, IOUSBDeviceInterface  **deviceInterface) {
+  kern_return_t kernResult;
+  UInt32 locationID;
+  kernResult = (*deviceInterface)->GetLocationID(deviceInterface, &locationID);
+  if (KERN_SUCCESS == kernResult) {
+    snprintf(serialDevice->locationId, sizeof(serialDevice->locationId), "%08x", locationID);
+  }
+
+  UInt16 vendorID;
+  kernResult = (*deviceInterface)->GetDeviceVendor(deviceInterface, &vendorID);
+  if (KERN_SUCCESS == kernResult) {
+    snprintf(serialDevice->vendorId, sizeof(serialDevice->vendorId), "%04x", vendorID);
+  }
+
+  UInt16 productID;
+  kernResult = (*deviceInterface)->GetDeviceProduct(deviceInterface, &productID);
+  if (KERN_SUCCESS == kernResult) {
+    snprintf(serialDevice->productId, sizeof(serialDevice->productId), "%04x", productID);
+  }
+}
+
+static stDeviceListItem* GetSerialDevices() {
+  char bsdPath[MAXPATHLEN];
+
+  io_iterator_t serialPortIterator;
+  FindModems(&serialPortIterator);
+
+  kern_return_t kernResult = KERN_FAILURE;
+  Boolean modemFound = false;
+
+  // Initialize the returned path
+  *bsdPath = '\0';
+
+  stDeviceListItem* devices = NULL;
+  stDeviceListItem* lastDevice = NULL;
+  int length = 0;
+
+  io_service_t modemService;
+  while ((modemService = IOIteratorNext(serialPortIterator))) {
+    CFTypeRef bsdPathAsCFString;
+    bsdPathAsCFString = IORegistryEntrySearchCFProperty(
+      modemService,
+      kIOServicePlane,
+      CFSTR(kIODialinDeviceKey),
+      kCFAllocatorDefault,
+      kIORegistryIterateRecursively);
+
+    if (bsdPathAsCFString) {
+      Boolean result;
+
+      // Convert the path from a CFString to a C (NUL-terminated)
+      result = CFStringGetCString((CFStringRef) bsdPathAsCFString,
+                    bsdPath,
+                    sizeof(bsdPath),
+                    kCFStringEncodingUTF8);
+      CFRelease(bsdPathAsCFString);
+
+      if (result) {
+        stDeviceListItem *deviceListItem = reinterpret_cast<stDeviceListItem*>( malloc(sizeof(stDeviceListItem)));
+        stSerialDevice *serialDevice = &(deviceListItem->value);
+        snprintf(serialDevice->port, sizeof(serialDevice->port), "%s", bsdPath);
+        memset(serialDevice->locationId, 0, sizeof(serialDevice->locationId));
+        memset(serialDevice->vendorId, 0, sizeof(serialDevice->vendorId));
+        memset(serialDevice->productId, 0, sizeof(serialDevice->productId));
+        serialDevice->manufacturer[0] = '\0';
+        serialDevice->serialNumber[0] = '\0';
+        deviceListItem->next = NULL;
+        deviceListItem->length = &length;
+
+        if (devices == NULL) {
+          devices = deviceListItem;
+        } else {
+          lastDevice->next = deviceListItem;
+        }
+
+        lastDevice = deviceListItem;
+        length++;
+
+        modemFound = true;
+        kernResult = KERN_SUCCESS;
+
+        uv_mutex_lock(&list_mutex);
+
+        io_service_t device = GetUsbDevice(modemService);
+
+        if (device) {
+          CFStringRef manufacturerAsCFString = (CFStringRef) IORegistryEntryCreateCFProperty(device,
+                      CFSTR(kUSBVendorString),
+                      kCFAllocatorDefault,
+                      0);
+
+          if (manufacturerAsCFString) {
+            Boolean result;
+            char    manufacturer[MAXPATHLEN];
+
+            // Convert from a CFString to a C (NUL-terminated)
+            result = CFStringGetCString(manufacturerAsCFString,
+                          manufacturer,
+                          sizeof(manufacturer),
+                          kCFStringEncodingUTF8);
+
+            if (result) {
+              snprintf(serialDevice->manufacturer, sizeof(serialDevice->manufacturer), "%s", manufacturer);
+            }
+
+            CFRelease(manufacturerAsCFString);
+          }
+
+          CFStringRef serialNumberAsCFString = (CFStringRef) IORegistryEntrySearchCFProperty(device,
+                      kIOServicePlane,
+                      CFSTR(kUSBSerialNumberString),
+                      kCFAllocatorDefault,
+                      kIORegistryIterateRecursively);
+
+          if (serialNumberAsCFString) {
+            Boolean result;
+            char    serialNumber[MAXPATHLEN];
+
+            // Convert from a CFString to a C (NUL-terminated)
+            result = CFStringGetCString(serialNumberAsCFString,
+                          serialNumber,
+                          sizeof(serialNumber),
+                          kCFStringEncodingUTF8);
+
+            if (result) {
+              snprintf(serialDevice->serialNumber, sizeof(serialDevice->serialNumber), "%s", serialNumber);
+            }
+
+            CFRelease(serialNumberAsCFString);
+          }
+
+          IOCFPlugInInterface **plugInInterface = NULL;
+          SInt32        score;
+          HRESULT       res;
+
+          IOUSBDeviceInterface  **deviceInterface = NULL;
+
+          kernResult = IOCreatePlugInInterfaceForService(device, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID,
+                               &plugInInterface, &score);
+
+          if ((kIOReturnSuccess != kernResult) || !plugInInterface) {
+            continue;
+          }
+
+          // Use the plugin interface to retrieve the device interface.
+          res = (*plugInInterface)->QueryInterface(plugInInterface, CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID),
+                               reinterpret_cast<LPVOID*> (&deviceInterface));
+
+          // Now done with the plugin interface.
+          (*plugInInterface)->Release(plugInInterface);
+
+          if (res || deviceInterface == NULL) {
+            continue;
+          }
+
+          // Extract the desired Information
+          ExtractUsbInformation(serialDevice, deviceInterface);
+
+          // Release the Interface
+          (*deviceInterface)->Release(deviceInterface);
+
+          // Release the device
+          (void) IOObjectRelease(device);
+        }
+
+        uv_mutex_unlock(&list_mutex);
+      }
+    }
+
+    // Release the io_service_t now that we are done with it.
+    (void) IOObjectRelease(modemService);
+  }
+
+  IOObjectRelease(serialPortIterator);  // Release the iterator.
+
+  return devices;
+}
+
+void EIO_List(uv_work_t* req) {
+  ListBaton* data = static_cast<ListBaton*>(req->data);
+
+  if (!lockInitialised) {
+    uv_mutex_init(&list_mutex);
+    lockInitialised = TRUE;
+  }
+
+  stDeviceListItem* devices = GetSerialDevices();
+  if (devices != NULL && *(devices->length) > 0) {
+    stDeviceListItem* next = devices;
+
+    for (int i = 0, len = *(devices->length); i < len; i++) {
+      stSerialDevice device = (* next).value;
+
+      ListResultItem* resultItem = new ListResultItem();
+      resultItem->path = device.port;
+
+      if (*device.locationId) {
+        resultItem->locationId = device.locationId;
+      }
+      if (*device.vendorId) {
+        resultItem->vendorId = device.vendorId;
+      }
+      if (*device.productId) {
+        resultItem->productId = device.productId;
+      }
+      if (*device.manufacturer) {
+        resultItem->manufacturer = device.manufacturer;
+      }
+      if (*device.serialNumber) {
+        resultItem->serialNumber = device.serialNumber;
+      }
+      data->results.push_back(resultItem);
+
+      stDeviceListItem* current = next;
+
+      if (next->next != NULL) {
+        next = next->next;
+      }
+
+      free(current);
+    }
+  }
+}
+
+void EIO_AfterList(uv_work_t* req) {
+  Nan::HandleScope scope;
+
+  ListBaton* data = static_cast<ListBaton*>(req->data);
+
+  v8::Local<v8::Value> argv[2];
+  if (data->errorString[0]) {
+    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
+    argv[1] = Nan::Undefined();
+  } else {
+    v8::Local<v8::Array> results = Nan::New<v8::Array>();
+    int i = 0;
+    for (std::list<ListResultItem*>::iterator it = data->results.begin(); it != data->results.end(); ++it, i++) {
+      v8::Local<v8::Object> item = Nan::New<v8::Object>();
+
+      setIfNotEmpty(item, "path", (*it)->path.c_str());
+      setIfNotEmpty(item, "manufacturer", (*it)->manufacturer.c_str());
+      setIfNotEmpty(item, "serialNumber", (*it)->serialNumber.c_str());
+      setIfNotEmpty(item, "pnpId", (*it)->pnpId.c_str());
+      setIfNotEmpty(item, "locationId", (*it)->locationId.c_str());
+      setIfNotEmpty(item, "vendorId", (*it)->vendorId.c_str());
+      setIfNotEmpty(item, "productId", (*it)->productId.c_str());
+
+      Nan::Set(results, i, item);
+    }
+    argv[0] = Nan::Null();
+    argv[1] = results;
+  }
+  data->callback.Call(2, argv, data);
+
+  for (std::list<ListResultItem*>::iterator it = data->results.begin(); it != data->results.end(); ++it) {
+    delete *it;
+  }
+  delete data;
+  delete req;
+}
diff --git a/node_modules/@serialport/bindings/src/darwin_list.h b/node_modules/@serialport/bindings/src/darwin_list.h
new file mode 100644
index 0000000..2459a88
--- /dev/null
+++ b/node_modules/@serialport/bindings/src/darwin_list.h
@@ -0,0 +1,46 @@
+#ifndef PACKAGES_SERIALPORT_SRC_DARWIN_LIST_H_
+#define PACKAGES_SERIALPORT_SRC_DARWIN_LIST_H_
+#include <sys/param.h>  // For MAXPATHLEN
+#include <nan.h>
+#include <list>
+#include <string>
+
+#define ERROR_STRING_SIZE 1024
+
+NAN_METHOD(List);
+void EIO_List(uv_work_t* req);
+void EIO_AfterList(uv_work_t* req);
+
+struct ListResultItem {
+  std::string path;
+  std::string manufacturer;
+  std::string serialNumber;
+  std::string pnpId;
+  std::string locationId;
+  std::string vendorId;
+  std::string productId;
+};
+
+struct ListBaton : public Nan::AsyncResource {
+  ListBaton() : AsyncResource("node-serialport:ListBaton"), errorString() {}
+  Nan::Callback callback;
+  std::list<ListResultItem*> results;
+  char errorString[ERROR_STRING_SIZE];
+};
+
+typedef struct SerialDevice {
+    char port[MAXPATHLEN];
+    char locationId[MAXPATHLEN];
+    char vendorId[MAXPATHLEN];
+    char productId[MAXPATHLEN];
+    char manufacturer[MAXPATHLEN];
+    char serialNumber[MAXPATHLEN];
+} stSerialDevice;
+
+typedef struct DeviceListItem {
+    struct SerialDevice value;
+    struct DeviceListItem *next;
+    int* length;
+} stDeviceListItem;
+
+#endif  // PACKAGES_SERIALPORT_SRC_DARWIN_LIST_H_
diff --git a/node_modules/@serialport/bindings/src/poller.cpp b/node_modules/@serialport/bindings/src/poller.cpp
new file mode 100644
index 0000000..e2d9201
--- /dev/null
+++ b/node_modules/@serialport/bindings/src/poller.cpp
@@ -0,0 +1,142 @@
+#include <nan.h>
+#include "./poller.h"
+
+Poller::Poller(int fd) : AsyncResource("node-serialport:poller") {
+  Nan::HandleScope scope;
+  this->fd = fd;
+  this->poll_handle = new uv_poll_t();
+  memset(this->poll_handle, 0, sizeof(uv_poll_t));
+  poll_handle->data = this;
+  int status = uv_poll_init(uv_default_loop(), poll_handle, fd);
+  if (0 != status) {
+    Nan::ThrowError(uv_strerror(status));
+    return;
+  }
+  uv_poll_init_success = true;
+}
+
+Poller::~Poller() {
+  // if we call uv_poll_stop after uv_poll_init failed we segfault
+  if (uv_poll_init_success) {
+    uv_poll_stop(poll_handle);
+    uv_close(reinterpret_cast<uv_handle_t*> (poll_handle), Poller::onClose);
+  } else {
+    delete poll_handle;
+  }
+}
+
+void Poller::onClose(uv_handle_t* poll_handle) {
+  // fprintf(stdout, "~Poller is closed\n");
+  delete poll_handle;
+}
+
+// Events can be UV_READABLE | UV_WRITABLE | UV_DISCONNECT
+void Poller::poll(int events) {
+  // fprintf(stdout, "Poller:poll for %d\n", events);
+  this->events = this->events | events;
+  int status = uv_poll_start(poll_handle, events, Poller::onData);
+  if (0 != status) {
+    Nan::ThrowTypeError(uv_strerror(status));
+    return;
+  }
+}
+
+void Poller::stop() {
+  int status = uv_poll_stop(poll_handle);
+  if (0 != status) {
+    Nan::ThrowTypeError(uv_strerror(status));
+    return;
+  }
+}
+
+int Poller::_stop() {
+  return uv_poll_stop(poll_handle);
+}
+
+void Poller::onData(uv_poll_t* handle, int status, int events) {
+  Nan::HandleScope scope;
+  Poller* obj = static_cast<Poller*>(handle->data);
+  v8::Local<v8::Value> argv[2];
+
+  // if Error
+  if (0 != status) {
+    // fprintf(stdout, "OnData Error status=%s events=%d\n", uv_strerror(status), events);
+    argv[0] = v8::Exception::Error(Nan::New<v8::String>(uv_strerror(status)).ToLocalChecked());
+    argv[1] = Nan::Undefined();
+    obj->_stop(); // doesn't matter if this errors
+  } else {
+    // fprintf(stdout, "OnData status=%d events=%d subscribed=%d\n", status, events, obj->events);
+    argv[0] = Nan::Null();
+    argv[1] = Nan::New<v8::Integer>(events);
+    // remove triggered events from the poll
+    int newEvents = obj->events & ~events;
+    obj->poll(newEvents);
+  }
+
+  obj->callback.Call(2, argv, obj);
+}
+
+NAN_MODULE_INIT(Poller::Init) {
+  v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
+  tpl->SetClassName(Nan::New("Poller").ToLocalChecked());
+  tpl->InstanceTemplate()->SetInternalFieldCount(1);
+
+  Nan::SetPrototypeMethod(tpl, "poll", poll);
+  Nan::SetPrototypeMethod(tpl, "stop", stop);
+  Nan::SetPrototypeMethod(tpl, "destroy", destroy);
+
+  constructor().Reset(Nan::GetFunction(tpl).ToLocalChecked());
+  Nan::Set(target, Nan::New("Poller").ToLocalChecked(), Nan::GetFunction(tpl).ToLocalChecked());
+}
+
+NAN_METHOD(Poller::New) {
+  if (!info.IsConstructCall()) {
+    const int argc = 2;
+    v8::Local<v8::Value> argv[argc] = {info[0], info[1]};
+    v8::Local<v8::Function> cons = Nan::New(constructor());
+    info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked());
+    return;
+  }
+
+  if (!info[0]->IsInt32()) {
+    Nan::ThrowTypeError("fd must be an int");
+    return;
+  }
+  int fd = Nan::To<int>(info[0]).FromJust();
+
+  if (!info[1]->IsFunction()) {
+    Nan::ThrowTypeError("cb must be a function");
+    return;
+  }
+
+  Poller *obj = new Poller(fd);
+  obj->callback.Reset(info[1].As<v8::Function>());
+  obj->Wrap(info.This());
+  info.GetReturnValue().Set(info.This());
+}
+
+NAN_METHOD(Poller::poll) {
+  Poller* obj = Nan::ObjectWrap::Unwrap<Poller>(info.Holder());
+  if (!info[0]->IsInt32()) {
+    Nan::ThrowTypeError("events must be an int");
+    return;
+  }
+  int events = Nan::To<int>(info[0]).FromJust();
+  obj->poll(events);
+}
+
+NAN_METHOD(Poller::stop) {
+  Poller* obj = Nan::ObjectWrap::Unwrap<Poller>(info.Holder());
+  obj->stop();
+}
+
+NAN_METHOD(Poller::destroy) {
+  Poller* obj = Nan::ObjectWrap::Unwrap<Poller>(info.Holder());
+  obj->persistent().Reset();
+  delete obj;
+}
+
+inline Nan::Persistent<v8::Function> & Poller::constructor() {
+  static Nan::Persistent<v8::Function> my_constructor;
+  return my_constructor;
+}
diff --git a/node_modules/@serialport/bindings/src/poller.h b/node_modules/@serialport/bindings/src/poller.h
new file mode 100644
index 0000000..3b15a2d
--- /dev/null
+++ b/node_modules/@serialport/bindings/src/poller.h
@@ -0,0 +1,34 @@
+#ifndef PACKAGES_SERIALPORT_SRC_POLLER_H_
+#define PACKAGES_SERIALPORT_SRC_POLLER_H_
+
+#include <nan.h>
+
+class Poller : public Nan::ObjectWrap, public Nan::AsyncResource {
+ public:
+  static NAN_MODULE_INIT(Init);
+  static void onData(uv_poll_t* handle, int status, int events);
+  static void onClose(uv_handle_t* poll_handle);
+
+ private:
+  int fd;
+  uv_poll_t* poll_handle;
+  Nan::Callback callback;
+  bool uv_poll_init_success = false;
+
+  // can this be read off of poll_handle?
+  int events = 0;
+
+  explicit Poller(int fd);
+  ~Poller();
+  void poll(int events);
+  void stop();
+  int _stop();
+
+  static NAN_METHOD(New);
+  static NAN_METHOD(poll);
+  static NAN_METHOD(stop);
+  static NAN_METHOD(destroy);
+  static inline Nan::Persistent<v8::Function> & constructor();
+};
+
+#endif  // PACKAGES_SERIALPORT_SRC_POLLER_H_
diff --git a/node_modules/@serialport/bindings/src/serialport.cpp b/node_modules/@serialport/bindings/src/serialport.cpp
new file mode 100644
index 0000000..ce21981
--- /dev/null
+++ b/node_modules/@serialport/bindings/src/serialport.cpp
@@ -0,0 +1,483 @@
+#include "./serialport.h"
+
+#ifdef __APPLE__
+  #include "./darwin_list.h"
+#endif
+
+#ifdef WIN32
+  #define strncasecmp strnicmp
+  #include "./serialport_win.h"
+#else
+  #include "./poller.h"
+#endif
+
+v8::Local<v8::Value> getValueFromObject(v8::Local<v8::Object> options, std::string key) {
+  v8::Local<v8::String> v8str = Nan::New<v8::String>(key).ToLocalChecked();
+  return Nan::Get(options, v8str).ToLocalChecked();
+}
+
+int getIntFromObject(v8::Local<v8::Object> options, std::string key) {
+  return Nan::To<v8::Int32>(getValueFromObject(options, key)).ToLocalChecked()->Value();
+}
+
+bool getBoolFromObject(v8::Local<v8::Object> options, std::string key) {
+  return Nan::To<v8::Boolean>(getValueFromObject(options, key)).ToLocalChecked()->Value();
+}
+
+v8::Local<v8::String> getStringFromObj(v8::Local<v8::Object> options, std::string key) {
+  return Nan::To<v8::String>(getValueFromObject(options, key)).ToLocalChecked();
+}
+
+double getDoubleFromObject(v8::Local<v8::Object> options, std::string key) {
+  return Nan::To<double>(getValueFromObject(options, key)).FromMaybe(0);
+}
+
+NAN_METHOD(Open) {
+  // path
+  if (!info[0]->IsString()) {
+    Nan::ThrowTypeError("First argument must be a string");
+    return;
+  }
+  Nan::Utf8String path(info[0]);
+
+  // options
+  if (!info[1]->IsObject()) {
+    Nan::ThrowTypeError("Second argument must be an object");
+    return;
+  }
+  v8::Local<v8::Object> options = Nan::To<v8::Object>(info[1]).ToLocalChecked();
+
+  // callback
+  if (!info[2]->IsFunction()) {
+    Nan::ThrowTypeError("Third argument must be a function");
+    return;
+  }
+
+  OpenBaton* baton = new OpenBaton();
+  snprintf(baton->path, sizeof(baton->path), "%s", *path);
+  baton->baudRate = getIntFromObject(options, "baudRate");
+  baton->dataBits = getIntFromObject(options, "dataBits");
+  baton->parity = ToParityEnum(getStringFromObj(options, "parity"));
+  baton->stopBits = ToStopBitEnum(getDoubleFromObject(options, "stopBits"));
+  baton->rtscts = getBoolFromObject(options, "rtscts");
+  baton->xon = getBoolFromObject(options, "xon");
+  baton->xoff = getBoolFromObject(options, "xoff");
+  baton->xany = getBoolFromObject(options, "xany");
+  baton->hupcl = getBoolFromObject(options, "hupcl");
+  baton->lock = getBoolFromObject(options, "lock");
+  baton->callback.Reset(info[2].As<v8::Function>());
+
+  #ifndef WIN32
+    baton->vmin = getIntFromObject(options, "vmin");
+    baton->vtime = getIntFromObject(options, "vtime");
+  #endif
+
+  uv_work_t* req = new uv_work_t();
+  req->data = baton;
+
+  uv_queue_work(uv_default_loop(), req, EIO_Open, (uv_after_work_cb)EIO_AfterOpen);
+}
+
+void EIO_AfterOpen(uv_work_t* req) {
+  Nan::HandleScope scope;
+
+  OpenBaton* data = static_cast<OpenBaton*>(req->data);
+
+  v8::Local<v8::Value> argv[2];
+  if (data->errorString[0]) {
+    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
+    argv[1] = Nan::Undefined();
+  } else {
+    argv[0] = Nan::Null();
+    argv[1] = Nan::New<v8::Int32>(data->result);
+  }
+
+  data->callback.Call(2, argv, data);
+  delete data;
+  delete req;
+}
+
+NAN_METHOD(Update) {
+  // file descriptor
+  if (!info[0]->IsInt32()) {
+    Nan::ThrowTypeError("First argument must be an int");
+    return;
+  }
+  int fd = Nan::To<int>(info[0]).FromJust();
+
+  // options
+  if (!info[1]->IsObject()) {
+    Nan::ThrowTypeError("Second argument must be an object");
+    return;
+  }
+  v8::Local<v8::Object> options = Nan::To<v8::Object>(info[1]).ToLocalChecked();
+
+  if (!Nan::Has(options, Nan::New<v8::String>("baudRate").ToLocalChecked()).FromMaybe(false)) {
+    Nan::ThrowTypeError("\"baudRate\" must be set on options object");
+    return;
+  }
+
+  // callback
+  if (!info[2]->IsFunction()) {
+    Nan::ThrowTypeError("Third argument must be a function");
+    return;
+  }
+
+  ConnectionOptionsBaton* baton = new ConnectionOptionsBaton();
+
+  baton->fd = fd;
+  baton->baudRate = getIntFromObject(options, "baudRate");
+  baton->callback.Reset(info[2].As<v8::Function>());
+
+  uv_work_t* req = new uv_work_t();
+  req->data = baton;
+
+  uv_queue_work(uv_default_loop(), req, EIO_Update, (uv_after_work_cb)EIO_AfterUpdate);
+}
+
+void EIO_AfterUpdate(uv_work_t* req) {
+  Nan::HandleScope scope;
+
+  ConnectionOptionsBaton* data = static_cast<ConnectionOptionsBaton*>(req->data);
+
+  v8::Local<v8::Value> argv[1];
+  if (data->errorString[0]) {
+    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
+  } else {
+    argv[0] = Nan::Null();
+  }
+
+  data->callback.Call(1, argv, data);
+
+  delete data;
+  delete req;
+}
+
+NAN_METHOD(Close) {
+  // file descriptor
+  if (!info[0]->IsInt32()) {
+    Nan::ThrowTypeError("First argument must be an int");
+    return;
+  }
+
+  // callback
+  if (!info[1]->IsFunction()) {
+    Nan::ThrowTypeError("Second argument must be a function");
+    return;
+  }
+
+  VoidBaton* baton = new VoidBaton();
+  baton->fd = Nan::To<v8::Int32>(info[0]).ToLocalChecked()->Value();
+  baton->callback.Reset(info[1].As<v8::Function>());
+
+  uv_work_t* req = new uv_work_t();
+  req->data = baton;
+  uv_queue_work(uv_default_loop(), req, EIO_Close, (uv_after_work_cb)EIO_AfterClose);
+}
+
+void EIO_AfterClose(uv_work_t* req) {
+  Nan::HandleScope scope;
+  VoidBaton* data = static_cast<VoidBaton*>(req->data);
+
+  v8::Local<v8::Value> argv[1];
+  if (data->errorString[0]) {
+    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
+  } else {
+    argv[0] = Nan::Null();
+  }
+  data->callback.Call(1, argv, data);
+
+  delete data;
+  delete req;
+}
+
+NAN_METHOD(Flush) {
+  // file descriptor
+  if (!info[0]->IsInt32()) {
+    Nan::ThrowTypeError("First argument must be an int");
+    return;
+  }
+  int fd = Nan::To<int>(info[0]).FromJust();
+
+  // callback
+  if (!info[1]->IsFunction()) {
+    Nan::ThrowTypeError("Second argument must be a function");
+    return;
+  }
+  v8::Local<v8::Function> callback = info[1].As<v8::Function>();
+
+  VoidBaton* baton = new VoidBaton();
+  baton->fd = fd;
+  baton->callback.Reset(callback);
+
+  uv_work_t* req = new uv_work_t();
+  req->data = baton;
+  uv_queue_work(uv_default_loop(), req, EIO_Flush, (uv_after_work_cb)EIO_AfterFlush);
+}
+
+void EIO_AfterFlush(uv_work_t* req) {
+  Nan::HandleScope scope;
+
+  VoidBaton* data = static_cast<VoidBaton*>(req->data);
+
+  v8::Local<v8::Value> argv[1];
+
+  if (data->errorString[0]) {
+    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
+  } else {
+    argv[0] = Nan::Null();
+  }
+
+  data->callback.Call(1, argv, data);
+
+  delete data;
+  delete req;
+}
+
+NAN_METHOD(Set) {
+  // file descriptor
+  if (!info[0]->IsInt32()) {
+    Nan::ThrowTypeError("First argument must be an int");
+    return;
+  }
+  int fd = Nan::To<int>(info[0]).FromJust();
+
+  // options
+  if (!info[1]->IsObject()) {
+    Nan::ThrowTypeError("Second argument must be an object");
+    return;
+  }
+  v8::Local<v8::Object> options = Nan::To<v8::Object>(info[1]).ToLocalChecked();
+
+  // callback
+  if (!info[2]->IsFunction()) {
+    Nan::ThrowTypeError("Third argument must be a function");
+    return;
+  }
+  v8::Local<v8::Function> callback = info[2].As<v8::Function>();
+
+  SetBaton* baton = new SetBaton();
+  baton->fd = fd;
+  baton->callback.Reset(callback);
+  baton->brk = getBoolFromObject(options, "brk");
+  baton->rts = getBoolFromObject(options, "rts");
+  baton->cts = getBoolFromObject(options, "cts");
+  baton->dtr = getBoolFromObject(options, "dtr");
+  baton->dsr = getBoolFromObject(options, "dsr");
+
+  uv_work_t* req = new uv_work_t();
+  req->data = baton;
+  uv_queue_work(uv_default_loop(), req, EIO_Set, (uv_after_work_cb)EIO_AfterSet);
+}
+
+void EIO_AfterSet(uv_work_t* req) {
+  Nan::HandleScope scope;
+
+  SetBaton* data = static_cast<SetBaton*>(req->data);
+
+  v8::Local<v8::Value> argv[1];
+
+  if (data->errorString[0]) {
+    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
+  } else {
+    argv[0] = Nan::Null();
+  }
+  data->callback.Call(1, argv, data);
+
+  delete data;
+  delete req;
+}
+
+NAN_METHOD(Get) {
+  // file descriptor
+  if (!info[0]->IsInt32()) {
+    Nan::ThrowTypeError("First argument must be an int");
+    return;
+  }
+  int fd = Nan::To<int>(info[0]).FromJust();
+
+  // callback
+  if (!info[1]->IsFunction()) {
+    Nan::ThrowTypeError("Second argument must be a function");
+    return;
+  }
+
+  GetBaton* baton = new GetBaton();
+  baton->fd = fd;
+  baton->cts = false;
+  baton->dsr = false;
+  baton->dcd = false;
+  baton->callback.Reset(info[1].As<v8::Function>());
+
+  uv_work_t* req = new uv_work_t();
+  req->data = baton;
+  uv_queue_work(uv_default_loop(), req, EIO_Get, (uv_after_work_cb)EIO_AfterGet);
+}
+
+void EIO_AfterGet(uv_work_t* req) {
+  Nan::HandleScope scope;
+
+  GetBaton* data = static_cast<GetBaton*>(req->data);
+
+  v8::Local<v8::Value> argv[2];
+
+  if (data->errorString[0]) {
+    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
+    argv[1] = Nan::Undefined();
+  } else {
+    v8::Local<v8::Object> results = Nan::New<v8::Object>();
+    Nan::Set(results, Nan::New<v8::String>("cts").ToLocalChecked(), Nan::New<v8::Boolean>(data->cts));
+    Nan::Set(results, Nan::New<v8::String>("dsr").ToLocalChecked(), Nan::New<v8::Boolean>(data->dsr));
+    Nan::Set(results, Nan::New<v8::String>("dcd").ToLocalChecked(), Nan::New<v8::Boolean>(data->dcd));
+
+    argv[0] = Nan::Null();
+    argv[1] = results;
+  }
+  data->callback.Call(2, argv, data);
+
+  delete data;
+  delete req;
+}
+
+NAN_METHOD(GetBaudRate) {
+  // file descriptor
+  if (!info[0]->IsInt32()) {
+    Nan::ThrowTypeError("First argument must be an int");
+    return;
+  }
+  int fd = Nan::To<int>(info[0]).FromJust();
+
+  // callback
+  if (!info[1]->IsFunction()) {
+    Nan::ThrowTypeError("Second argument must be a function");
+    return;
+  }
+
+  GetBaudRateBaton* baton = new GetBaudRateBaton();
+  baton->fd = fd;
+  baton->baudRate = 0;
+  baton->callback.Reset(info[1].As<v8::Function>());
+
+  uv_work_t* req = new uv_work_t();
+  req->data = baton;
+  uv_queue_work(uv_default_loop(), req, EIO_GetBaudRate, (uv_after_work_cb)EIO_AfterGetBaudRate);
+}
+
+void EIO_AfterGetBaudRate(uv_work_t* req) {
+  Nan::HandleScope scope;
+
+  GetBaudRateBaton* data = static_cast<GetBaudRateBaton*>(req->data);
+
+  v8::Local<v8::Value> argv[2];
+
+  if (data->errorString[0]) {
+    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
+    argv[1] = Nan::Undefined();
+  } else {
+    v8::Local<v8::Object> results = Nan::New<v8::Object>();
+    Nan::Set(results, Nan::New<v8::String>("baudRate").ToLocalChecked(), Nan::New<v8::Integer>(data->baudRate));
+
+    argv[0] = Nan::Null();
+    argv[1] = results;
+  }
+  data->callback.Call(2, argv, data);
+
+  delete data;
+  delete req;
+}
+
+NAN_METHOD(Drain) {
+  // file descriptor
+  if (!info[0]->IsInt32()) {
+    Nan::ThrowTypeError("First argument must be an int");
+    return;
+  }
+  int fd = Nan::To<int>(info[0]).FromJust();
+
+  // callback
+  if (!info[1]->IsFunction()) {
+    Nan::ThrowTypeError("Second argument must be a function");
+    return;
+  }
+
+  VoidBaton* baton = new VoidBaton();
+  baton->fd = fd;
+  baton->callback.Reset(info[1].As<v8::Function>());
+
+  uv_work_t* req = new uv_work_t();
+  req->data = baton;
+  uv_queue_work(uv_default_loop(), req, EIO_Drain, (uv_after_work_cb)EIO_AfterDrain);
+}
+
+void EIO_AfterDrain(uv_work_t* req) {
+  Nan::HandleScope scope;
+
+  VoidBaton* data = static_cast<VoidBaton*>(req->data);
+
+  v8::Local<v8::Value> argv[1];
+
+  if (data->errorString[0]) {
+    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
+  } else {
+    argv[0] = Nan::Null();
+  }
+  data->callback.Call(1, argv, data);
+
+  delete data;
+  delete req;
+}
+
+SerialPortParity NAN_INLINE(ToParityEnum(const v8::Local<v8::String>& v8str)) {
+  Nan::HandleScope scope;
+  Nan::Utf8String str(v8str);
+  size_t count = strlen(*str);
+  SerialPortParity parity = SERIALPORT_PARITY_NONE;
+  if (!strncasecmp(*str, "none", count)) {
+    parity = SERIALPORT_PARITY_NONE;
+  } else if (!strncasecmp(*str, "even", count)) {
+    parity = SERIALPORT_PARITY_EVEN;
+  } else if (!strncasecmp(*str, "mark", count)) {
+    parity = SERIALPORT_PARITY_MARK;
+  } else if (!strncasecmp(*str, "odd", count)) {
+    parity = SERIALPORT_PARITY_ODD;
+  } else if (!strncasecmp(*str, "space", count)) {
+    parity = SERIALPORT_PARITY_SPACE;
+  }
+  return parity;
+}
+
+SerialPortStopBits NAN_INLINE(ToStopBitEnum(double stopBits)) {
+  if (stopBits > 1.4 && stopBits < 1.6) {
+    return SERIALPORT_STOPBITS_ONE_FIVE;
+  }
+  if (stopBits == 2) {
+    return SERIALPORT_STOPBITS_TWO;
+  }
+  return SERIALPORT_STOPBITS_ONE;
+}
+
+NAN_MODULE_INIT(init) {
+  Nan::HandleScope scope;
+  Nan::SetMethod(target, "set", Set);
+  Nan::SetMethod(target, "get", Get);
+  Nan::SetMethod(target, "getBaudRate", GetBaudRate);
+  Nan::SetMethod(target, "open", Open);
+  Nan::SetMethod(target, "update", Update);
+  Nan::SetMethod(target, "close", Close);
+  Nan::SetMethod(target, "flush", Flush);
+  Nan::SetMethod(target, "drain", Drain);
+
+  #ifdef __APPLE__
+  Nan::SetMethod(target, "list", List);
+  #endif
+
+  #ifdef WIN32
+  Nan::SetMethod(target, "write", Write);
+  Nan::SetMethod(target, "read", Read);
+  Nan::SetMethod(target, "list", List);
+  #else
+  Poller::Init(target);
+  #endif
+}
+
+NODE_MODULE(serialport, init);
diff --git a/node_modules/@serialport/bindings/src/serialport.h b/node_modules/@serialport/bindings/src/serialport.h
new file mode 100644
index 0000000..a7d656e
--- /dev/null
+++ b/node_modules/@serialport/bindings/src/serialport.h
@@ -0,0 +1,138 @@
+#ifndef PACKAGES_SERIALPORT_SRC_SERIALPORT_H_
+#define PACKAGES_SERIALPORT_SRC_SERIALPORT_H_
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <nan.h>
+#include <string>
+
+#define ERROR_STRING_SIZE 1024
+
+NAN_METHOD(Open);
+void EIO_Open(uv_work_t* req);
+void EIO_AfterOpen(uv_work_t* req);
+
+NAN_METHOD(Update);
+void EIO_Update(uv_work_t* req);
+void EIO_AfterUpdate(uv_work_t* req);
+
+NAN_METHOD(Close);
+void EIO_Close(uv_work_t* req);
+void EIO_AfterClose(uv_work_t* req);
+
+NAN_METHOD(Flush);
+void EIO_Flush(uv_work_t* req);
+void EIO_AfterFlush(uv_work_t* req);
+
+NAN_METHOD(Set);
+void EIO_Set(uv_work_t* req);
+void EIO_AfterSet(uv_work_t* req);
+
+NAN_METHOD(Get);
+void EIO_Get(uv_work_t* req);
+void EIO_AfterGet(uv_work_t* req);
+
+NAN_METHOD(GetBaudRate);
+void EIO_GetBaudRate(uv_work_t* req);
+void EIO_AfterGetBaudRate(uv_work_t* req);
+
+NAN_METHOD(Drain);
+void EIO_Drain(uv_work_t* req);
+void EIO_AfterDrain(uv_work_t* req);
+
+enum SerialPortParity {
+  SERIALPORT_PARITY_NONE  = 1,
+  SERIALPORT_PARITY_MARK  = 2,
+  SERIALPORT_PARITY_EVEN  = 3,
+  SERIALPORT_PARITY_ODD   = 4,
+  SERIALPORT_PARITY_SPACE = 5
+};
+
+enum SerialPortStopBits {
+  SERIALPORT_STOPBITS_ONE      = 1,
+  SERIALPORT_STOPBITS_ONE_FIVE = 2,
+  SERIALPORT_STOPBITS_TWO      = 3
+};
+
+SerialPortParity ToParityEnum(const v8::Local<v8::String>& str);
+SerialPortStopBits ToStopBitEnum(double stopBits);
+
+struct OpenBaton : public Nan::AsyncResource {
+  OpenBaton() :
+    AsyncResource("node-serialport:OpenBaton"), errorString(), path() {}
+  char errorString[ERROR_STRING_SIZE];
+  Nan::Callback callback;
+  char path[1024];
+  int fd = 0;
+  int result = 0;
+  int baudRate = 0;
+  int dataBits = 0;
+  bool rtscts = false;
+  bool xon = false;
+  bool xoff = false;
+  bool xany = false;
+  bool dsrdtr = false;
+  bool hupcl = false;
+  bool lock = false;
+  SerialPortParity parity;
+  SerialPortStopBits stopBits;
+#ifndef WIN32
+  uint8_t vmin = 0;
+  uint8_t vtime = 0;
+#endif
+};
+
+struct ConnectionOptions {
+  ConnectionOptions() : errorString() {}
+  char errorString[ERROR_STRING_SIZE];
+  int fd = 0;
+  int baudRate = 0;
+};
+struct ConnectionOptionsBaton : ConnectionOptions, Nan::AsyncResource {
+  ConnectionOptionsBaton() :
+    AsyncResource("node-serialport:ConnectionOptionsBaton") {}
+  Nan::Callback callback;
+};
+
+struct SetBaton : public Nan::AsyncResource {
+  SetBaton() : AsyncResource("node-serialport:SetBaton"), errorString() {}
+  int fd = 0;
+  Nan::Callback callback;
+  int result = 0;
+  char errorString[ERROR_STRING_SIZE];
+  bool rts = false;
+  bool cts = false;
+  bool dtr = false;
+  bool dsr = false;
+  bool brk = false;
+};
+
+struct GetBaton : public Nan::AsyncResource {
+  GetBaton() : AsyncResource("node-serialport:GetBaton"), errorString() {}
+  int fd = 0;
+  Nan::Callback callback;
+  char errorString[ERROR_STRING_SIZE];
+  bool cts = false;
+  bool dsr = false;
+  bool dcd = false;
+};
+
+struct GetBaudRateBaton : public Nan::AsyncResource {
+  GetBaudRateBaton() :
+    AsyncResource("node-serialport:GetBaudRateBaton"), errorString() {}
+  int fd = 0;
+  Nan::Callback callback;
+  char errorString[ERROR_STRING_SIZE];
+  int baudRate = 0;
+};
+
+struct VoidBaton : public Nan::AsyncResource {
+  VoidBaton() : AsyncResource("node-serialport:VoidBaton"), errorString() {}
+  int fd = 0;
+  Nan::Callback callback;
+  char errorString[ERROR_STRING_SIZE];
+};
+
+int setup(int fd, OpenBaton *data);
+int setBaudRate(ConnectionOptions *data);
+#endif  // PACKAGES_SERIALPORT_SRC_SERIALPORT_H_
diff --git a/node_modules/@serialport/bindings/src/serialport_linux.cpp b/node_modules/@serialport/bindings/src/serialport_linux.cpp
new file mode 100644
index 0000000..c87f6a5
--- /dev/null
+++ b/node_modules/@serialport/bindings/src/serialport_linux.cpp
@@ -0,0 +1,39 @@
+#if defined(__linux__)
+
+#include <sys/ioctl.h>
+#include <asm/ioctls.h>
+#include <asm/termbits.h>
+
+// Uses the termios2 interface to set nonstandard baud rates
+int linuxSetCustomBaudRate(const int fd, const unsigned int baudrate) {
+    struct termios2 t;
+
+    if (ioctl(fd, TCGETS2, &t)) {
+      return -1;
+    }
+
+    t.c_cflag &= ~CBAUD;
+    t.c_cflag |= BOTHER;
+    t.c_ospeed = t.c_ispeed = baudrate;
+
+    if (ioctl(fd, TCSETS2, &t)) {
+      return -2;
+    }
+
+    return 0;
+}
+
+// Uses termios2 interface to retrieve system reported baud rate
+int linuxGetSystemBaudRate(const int fd, int* const outbaud) {
+  struct termios2 t;
+
+  if (ioctl(fd, TCGETS2, &t)) {
+    return -1;
+  }
+
+  *outbaud = static_cast<int>(t.c_ospeed);
+
+  return 0;
+}
+
+#endif
diff --git a/node_modules/@serialport/bindings/src/serialport_linux.h b/node_modules/@serialport/bindings/src/serialport_linux.h
new file mode 100644
index 0000000..dc38b06
--- /dev/null
+++ b/node_modules/@serialport/bindings/src/serialport_linux.h
@@ -0,0 +1,8 @@
+#ifndef PACKAGES_SERIALPORT_SRC_SERIALPORT_LINUX_H_
+#define PACKAGES_SERIALPORT_SRC_SERIALPORT_LINUX_H_
+
+int linuxSetCustomBaudRate(const int fd, const unsigned int baudrate);
+int linuxGetSystemBaudRate(const int fd, int* const outbaud);
+
+#endif  // PACKAGES_SERIALPORT_SRC_SERIALPORT_LINUX_H_
+
diff --git a/node_modules/@serialport/bindings/src/serialport_unix.cpp b/node_modules/@serialport/bindings/src/serialport_unix.cpp
new file mode 100644
index 0000000..30d8591
--- /dev/null
+++ b/node_modules/@serialport/bindings/src/serialport_unix.cpp
@@ -0,0 +1,400 @@
+#include "serialport_unix.h"
+#include "serialport.h"
+
+#include <sys/file.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <termios.h>
+
+#ifdef __APPLE__
+#include <AvailabilityMacros.h>
+#include <sys/param.h>
+#endif
+
+#if defined(MAC_OS_X_VERSION_10_4) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4)
+#include <sys/ioctl.h>
+#include <IOKit/serial/ioss.h>
+
+#elif defined(__OpenBSD__)
+#include <sys/ioctl.h>
+
+#elif defined(__linux__)
+#include <sys/ioctl.h>
+#include <linux/serial.h>
+#include "serialport_linux.h"
+#endif
+
+int ToStopBitsConstant(SerialPortStopBits stopBits);
+
+int ToBaudConstant(int baudRate) {
+  switch (baudRate) {
+    case 0: return B0;
+    case 50: return B50;
+    case 75: return B75;
+    case 110: return B110;
+    case 134: return B134;
+    case 150: return B150;
+    case 200: return B200;
+    case 300: return B300;
+    case 600: return B600;
+    case 1200: return B1200;
+    case 1800: return B1800;
+    case 2400: return B2400;
+    case 4800: return B4800;
+    case 9600: return B9600;
+    case 19200: return B19200;
+    case 38400: return B38400;
+    case 57600: return B57600;
+    case 115200: return B115200;
+    case 230400: return B230400;
+#if defined(__linux__)
+    case 460800: return B460800;
+    case 500000: return B500000;
+    case 576000: return B576000;
+    case 921600: return B921600;
+    case 1000000: return B1000000;
+    case 1152000: return B1152000;
+    case 1500000: return B1500000;
+    case 2000000: return B2000000;
+    case 2500000: return B2500000;
+    case 3000000: return B3000000;
+    case 3500000: return B3500000;
+    case 4000000: return B4000000;
+#endif
+  }
+  return -1;
+}
+
+int ToDataBitsConstant(int dataBits) {
+  switch (dataBits) {
+    case 8: default: return CS8;
+    case 7: return CS7;
+    case 6: return CS6;
+    case 5: return CS5;
+  }
+  return -1;
+}
+
+void EIO_Open(uv_work_t* req) {
+  OpenBaton* data = static_cast<OpenBaton*>(req->data);
+
+  int flags = (O_RDWR | O_NOCTTY | O_NONBLOCK | O_CLOEXEC | O_SYNC);
+  int fd = open(data->path, flags);
+
+  if (-1 == fd) {
+    snprintf(data->errorString, sizeof(data->errorString), "Error: %s, cannot open %s", strerror(errno), data->path);
+    return;
+  }
+
+  if (-1 == setup(fd, data)) {
+    close(fd);
+    return;
+  }
+
+  data->result = fd;
+}
+
+int setBaudRate(ConnectionOptions *data) {
+  // lookup the standard baudrates from the table
+  int baudRate = ToBaudConstant(data->baudRate);
+  int fd = data->fd;
+
+  // get port options
+  struct termios options;
+  if (-1 == tcgetattr(fd, &options)) {
+    snprintf(data->errorString, sizeof(data->errorString),
+             "Error: %s setting custom baud rate of %d", strerror(errno), data->baudRate);
+    return -1;
+  }
+
+  // If there is a custom baud rate on linux you can do the following trick with B38400
+  #if defined(__linux__) && defined(ASYNC_SPD_CUST)
+    if (baudRate == -1) {
+      int err = linuxSetCustomBaudRate(fd, data->baudRate);
+
+      if (err == -1) {
+        snprintf(data->errorString, sizeof(data->errorString),
+                 "Error: %s || while retrieving termios2 info", strerror(errno));
+        return -1;
+      } else if (err == -2) {
+        snprintf(data->errorString, sizeof(data->errorString),
+                 "Error: %s || while setting custom baud rate of %d", strerror(errno), data->baudRate);
+        return -1;
+      }
+
+      return 1;
+    }
+  #endif
+
+  // On OS X, starting with Tiger, we can set a custom baud rate with ioctl
+  #if defined(MAC_OS_X_VERSION_10_4) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4)
+    if (-1 == baudRate) {
+      speed_t speed = data->baudRate;
+      if (-1 == ioctl(fd, IOSSIOSPEED, &speed)) {
+        snprintf(data->errorString, sizeof(data->errorString),
+                 "Error: %s calling ioctl(.., IOSSIOSPEED, %ld )", strerror(errno), speed);
+        return -1;
+      } else {
+        tcflush(fd, TCIOFLUSH);
+        return 1;
+      }
+    }
+  #endif
+
+  if (-1 == baudRate) {
+    snprintf(data->errorString, sizeof(data->errorString),
+             "Error baud rate of %d is not supported on your platform", data->baudRate);
+    return -1;
+  }
+
+  // If we have a good baud rate set it and lets go
+  cfsetospeed(&options, baudRate);
+  cfsetispeed(&options, baudRate);
+  // throw away all the buffered data
+  tcflush(fd, TCIOFLUSH);
+  // make the changes now
+  tcsetattr(fd, TCSANOW, &options);
+  return 1;
+}
+
+void EIO_Update(uv_work_t* req) {
+  ConnectionOptionsBaton* data = static_cast<ConnectionOptionsBaton*>(req->data);
+  setBaudRate(data);
+}
+
+int setup(int fd, OpenBaton *data) {
+  int dataBits = ToDataBitsConstant(data->dataBits);
+  if (-1 == dataBits) {
+    snprintf(data->errorString, sizeof(data->errorString),
+             "Invalid data bits setting %d", data->dataBits);
+    return -1;
+  }
+
+  // Snow Leopard doesn't have O_CLOEXEC
+  if (-1 == fcntl(fd, F_SETFD, FD_CLOEXEC)) {
+    snprintf(data->errorString, sizeof(data->errorString), "Error %s Cannot open %s", strerror(errno), data->path);
+    return -1;
+  }
+
+  // Get port configuration for modification
+  struct termios options;
+  tcgetattr(fd, &options);
+
+  // IGNPAR: ignore bytes with parity errors
+  options.c_iflag = IGNPAR;
+
+  // ICRNL: map CR to NL (otherwise a CR input on the other computer will not terminate input)
+  // Future potential option
+  // options.c_iflag = ICRNL;
+  // otherwise make device raw (no other input processing)
+
+  // Specify data bits
+  options.c_cflag &= ~CSIZE;
+  options.c_cflag |= dataBits;
+
+  options.c_cflag &= ~(CRTSCTS);
+
+  if (data->rtscts) {
+    options.c_cflag |= CRTSCTS;
+    // evaluate specific flow control options
+  }
+
+  options.c_iflag &= ~(IXON | IXOFF | IXANY);
+
+  if (data->xon) {
+    options.c_iflag |= IXON;
+  }
+
+  if (data->xoff) {
+    options.c_iflag |= IXOFF;
+  }
+
+  if (data->xany) {
+    options.c_iflag |= IXANY;
+  }
+
+  switch (data->parity) {
+  case SERIALPORT_PARITY_NONE:
+    options.c_cflag &= ~PARENB;
+    // options.c_cflag &= ~CSTOPB;
+    // options.c_cflag &= ~CSIZE;
+    // options.c_cflag |= CS8;
+    break;
+  case SERIALPORT_PARITY_ODD:
+    options.c_cflag |= PARENB;
+    options.c_cflag |= PARODD;
+    // options.c_cflag &= ~CSTOPB;
+    // options.c_cflag &= ~CSIZE;
+    // options.c_cflag |= CS7;
+    break;
+  case SERIALPORT_PARITY_EVEN:
+    options.c_cflag |= PARENB;
+    options.c_cflag &= ~PARODD;
+    // options.c_cflag &= ~CSTOPB;
+    // options.c_cflag &= ~CSIZE;
+    // options.c_cflag |= CS7;
+    break;
+  default:
+    snprintf(data->errorString, sizeof(data->errorString), "Invalid parity setting %d", data->parity);
+    return -1;
+  }
+
+  switch (data->stopBits) {
+  case SERIALPORT_STOPBITS_ONE:
+    options.c_cflag &= ~CSTOPB;
+    break;
+  case SERIALPORT_STOPBITS_TWO:
+    options.c_cflag |= CSTOPB;
+    break;
+  default:
+    snprintf(data->errorString, sizeof(data->errorString), "Invalid stop bits setting %d", data->stopBits);
+    return -1;
+  }
+
+  options.c_cflag |= CLOCAL;  // ignore status lines
+  options.c_cflag |= CREAD;   // enable receiver
+  if (data->hupcl) {
+    options.c_cflag |= HUPCL;  // drop DTR (i.e. hangup) on close
+  }
+
+  // Raw output
+  options.c_oflag = 0;
+
+  // ICANON makes partial lines not readable. It should be optional.
+  // It works with ICRNL.
+  options.c_lflag = 0;  // ICANON;
+  options.c_cc[VMIN]= data->vmin;
+  options.c_cc[VTIME]= data->vtime;
+
+  // Note that tcsetattr() returns success if any of the requested changes could be successfully carried out.
+  // Therefore, when making multiple changes it may be necessary to follow this call with a further call to
+  // tcgetattr() to check that all changes have been performed successfully.
+  // This also fails on OSX
+  tcsetattr(fd, TCSANOW, &options);
+
+  if (data->lock) {
+    if (-1 == flock(fd, LOCK_EX | LOCK_NB)) {
+      snprintf(data->errorString, sizeof(data->errorString), "Error %s Cannot lock port", strerror(errno));
+      return -1;
+    }
+  }
+
+  // Copy the connection options into the ConnectionOptionsBaton to set the baud rate
+  ConnectionOptions* connectionOptions = new ConnectionOptions();
+  connectionOptions->fd = fd;
+  connectionOptions->baudRate = data->baudRate;
+
+  if (-1 == setBaudRate(connectionOptions)) {
+    strncpy(data->errorString, connectionOptions->errorString, sizeof(data->errorString));
+    delete(connectionOptions);
+    return -1;
+  }
+  delete(connectionOptions);
+
+  // flush all unread and wrote data up to this point because it could have been received or sent with bad settings
+  // Not needed since setBaudRate does this for us
+  // tcflush(fd, TCIOFLUSH);
+
+  return 1;
+}
+
+void EIO_Close(uv_work_t* req) {
+  VoidBaton* data = static_cast<VoidBaton*>(req->data);
+
+  if (-1 == close(data->fd)) {
+    snprintf(data->errorString, sizeof(data->errorString),
+             "Error: %s, unable to close fd %d", strerror(errno), data->fd);
+  }
+}
+
+void EIO_Set(uv_work_t* req) {
+  SetBaton* data = static_cast<SetBaton*>(req->data);
+
+  int bits;
+  ioctl(data->fd, TIOCMGET, &bits);
+
+  bits &= ~(TIOCM_RTS | TIOCM_CTS | TIOCM_DTR | TIOCM_DSR);
+
+  if (data->rts) {
+    bits |= TIOCM_RTS;
+  }
+
+  if (data->cts) {
+    bits |= TIOCM_CTS;
+  }
+
+  if (data->dtr) {
+    bits |= TIOCM_DTR;
+  }
+
+  if (data->dsr) {
+    bits |= TIOCM_DSR;
+  }
+
+  int result = 0;
+  if (data->brk) {
+    result = ioctl(data->fd, TIOCSBRK, NULL);
+  } else {
+    result = ioctl(data->fd, TIOCCBRK, NULL);
+  }
+
+  if (-1 == result) {
+    snprintf(data->errorString, sizeof(data->errorString), "Error: %s, cannot set", strerror(errno));
+    return;
+  }
+
+  if (-1 == ioctl(data->fd, TIOCMSET, &bits)) {
+    snprintf(data->errorString, sizeof(data->errorString), "Error: %s, cannot set", strerror(errno));
+    return;
+  }
+}
+
+void EIO_Get(uv_work_t* req) {
+  GetBaton* data = static_cast<GetBaton*>(req->data);
+
+  int bits;
+  if (-1 == ioctl(data->fd, TIOCMGET, &bits)) {
+    snprintf(data->errorString, sizeof(data->errorString), "Error: %s, cannot get", strerror(errno));
+    return;
+  }
+
+  data->cts = bits & TIOCM_CTS;
+  data->dsr = bits & TIOCM_DSR;
+  data->dcd = bits & TIOCM_CD;
+}
+
+void EIO_GetBaudRate(uv_work_t* req) {
+  GetBaudRateBaton* data = static_cast<GetBaudRateBaton*>(req->data);
+  int outbaud = -1;
+
+  #if defined(__linux__) && defined(ASYNC_SPD_CUST)
+  if (-1 == linuxGetSystemBaudRate(data->fd, &outbaud)) {
+    snprintf(data->errorString, sizeof(data->errorString), "Error: %s, cannot get baud rate", strerror(errno));
+    return;
+  }
+  #else
+  snprintf(data->errorString, sizeof(data->errorString), "Error: System baud rate check not implemented on this platform");
+  return;
+  #endif
+
+  data->baudRate = outbaud;
+}
+
+void EIO_Flush(uv_work_t* req) {
+  VoidBaton* data = static_cast<VoidBaton*>(req->data);
+
+  if (-1 == tcflush(data->fd, TCIOFLUSH)) {
+    snprintf(data->errorString, sizeof(data->errorString), "Error: %s, cannot flush", strerror(errno));
+    return;
+  }
+}
+
+void EIO_Drain(uv_work_t* req) {
+  VoidBaton* data = static_cast<VoidBaton*>(req->data);
+
+  if (-1 == tcdrain(data->fd)) {
+    snprintf(data->errorString, sizeof(data->errorString), "Error: %s, cannot drain", strerror(errno));
+    return;
+  }
+}
diff --git a/node_modules/@serialport/bindings/src/serialport_unix.h b/node_modules/@serialport/bindings/src/serialport_unix.h
new file mode 100644
index 0000000..08b11e0
--- /dev/null
+++ b/node_modules/@serialport/bindings/src/serialport_unix.h
@@ -0,0 +1,7 @@
+#ifndef PACKAGES_SERIALPORT_SRC_SERIALPORT_UNIX_H_
+#define PACKAGES_SERIALPORT_SRC_SERIALPORT_UNIX_H_
+
+int ToBaudConstant(int baudRate);
+int ToDataBitsConstant(int dataBits);
+
+#endif  // PACKAGES_SERIALPORT_SRC_SERIALPORT_UNIX_H_
diff --git a/node_modules/@serialport/bindings/src/serialport_win.cpp b/node_modules/@serialport/bindings/src/serialport_win.cpp
new file mode 100644
index 0000000..ea9d5fa
--- /dev/null
+++ b/node_modules/@serialport/bindings/src/serialport_win.cpp
@@ -0,0 +1,953 @@
+#include "./serialport.h"
+#include "./serialport_win.h"
+#include <nan.h>
+#include <list>
+#include <vector>
+#include <string.h>
+#include <windows.h>
+#include <Setupapi.h>
+#include <initguid.h>
+#include <devpkey.h>
+#include <devguid.h>
+#pragma comment(lib, "setupapi.lib")
+
+#define ARRAY_SIZE(arr)     (sizeof(arr)/sizeof(arr[0]))
+
+#define MAX_BUFFER_SIZE 1000
+
+// As per https://msdn.microsoft.com/en-us/library/windows/desktop/ms724872(v=vs.85).aspx
+#define MAX_REGISTRY_KEY_SIZE 255
+
+// Declare type of pointer to CancelIoEx function
+typedef BOOL (WINAPI *CancelIoExType)(HANDLE hFile, LPOVERLAPPED lpOverlapped);
+
+static inline HANDLE int2handle(int ptr) {
+  return reinterpret_cast<HANDLE>(static_cast<uintptr_t>(ptr));
+}
+
+std::list<int> g_closingHandles;
+
+void ErrorCodeToString(const char* prefix, int errorCode, char *errorStr) {
+  switch (errorCode) {
+  case ERROR_FILE_NOT_FOUND:
+    _snprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, "%s: File not found", prefix);
+    break;
+  case ERROR_INVALID_HANDLE:
+    _snprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, "%s: Invalid handle", prefix);
+    break;
+  case ERROR_ACCESS_DENIED:
+    _snprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, "%s: Access denied", prefix);
+    break;
+  case ERROR_OPERATION_ABORTED:
+    _snprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, "%s: Operation aborted", prefix);
+    break;
+  case ERROR_INVALID_PARAMETER:
+    _snprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, "%s: The parameter is incorrect", prefix);
+    break;
+  default:
+    _snprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, "%s: Unknown error code %d", prefix, errorCode);
+    break;
+  }
+}
+
+void AsyncCloseCallback(uv_handle_t* handle) {
+  uv_async_t* async = reinterpret_cast<uv_async_t*>(handle);
+  delete async;
+}
+
+void EIO_Open(uv_work_t* req) {
+  OpenBaton* data = static_cast<OpenBaton*>(req->data);
+
+  char originalPath[1024];
+  strncpy_s(originalPath, sizeof(originalPath), data->path, _TRUNCATE);
+  // data->path is char[1024] but on Windows it has the form "COMx\0" or "COMxx\0"
+  // We want to prepend "\\\\.\\" to it before we call CreateFile
+  strncpy(data->path + 20, data->path, 10);
+  strncpy(data->path, "\\\\.\\", 4);
+  strncpy(data->path + 4, data->path + 20, 10);
+
+  int shareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
+  if (data->lock) {
+    shareMode = 0;
+  }
+
+  HANDLE file = CreateFile(
+    data->path,
+    GENERIC_READ | GENERIC_WRITE,
+    shareMode,  // dwShareMode 0 Prevents other processes from opening if they request delete, read, or write access
+    NULL,
+    OPEN_EXISTING,
+    FILE_FLAG_OVERLAPPED,  // allows for reading and writing at the same time and sets the handle for asynchronous I/O
+    NULL);
+
+  if (file == INVALID_HANDLE_VALUE) {
+    DWORD errorCode = GetLastError();
+    char temp[100];
+    _snprintf_s(temp, sizeof(temp), _TRUNCATE, "Opening %s", originalPath);
+    ErrorCodeToString(temp, errorCode, data->errorString);
+    return;
+  }
+
+  DCB dcb = { 0 };
+  SecureZeroMemory(&dcb, sizeof(DCB));
+  dcb.DCBlength = sizeof(DCB);
+
+  if (!GetCommState(file, &dcb)) {
+    ErrorCodeToString("Open (GetCommState)", GetLastError(), data->errorString);
+    CloseHandle(file);
+    return;
+  }
+
+  if (data->hupcl) {
+    dcb.fDtrControl = DTR_CONTROL_ENABLE;
+  } else {
+    dcb.fDtrControl = DTR_CONTROL_DISABLE;  // disable DTR to avoid reset
+  }
+
+  dcb.Parity = NOPARITY;
+  dcb.ByteSize = 8;
+  dcb.StopBits = ONESTOPBIT;
+
+
+  dcb.fOutxDsrFlow = FALSE;
+  dcb.fOutxCtsFlow = FALSE;
+
+  if (data->xon) {
+    dcb.fOutX = TRUE;
+  } else {
+    dcb.fOutX = FALSE;
+  }
+
+  if (data->xoff) {
+    dcb.fInX = TRUE;
+  } else {
+    dcb.fInX = FALSE;
+  }
+
+  if (data->rtscts) {
+    dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
+    dcb.fOutxCtsFlow = TRUE;
+  } else {
+    dcb.fRtsControl = RTS_CONTROL_DISABLE;
+  }
+
+  dcb.fBinary = true;
+  dcb.BaudRate = data->baudRate;
+  dcb.ByteSize = data->dataBits;
+
+  switch (data->parity) {
+  case SERIALPORT_PARITY_NONE:
+    dcb.Parity = NOPARITY;
+    break;
+  case SERIALPORT_PARITY_MARK:
+    dcb.Parity = MARKPARITY;
+    break;
+  case SERIALPORT_PARITY_EVEN:
+    dcb.Parity = EVENPARITY;
+    break;
+  case SERIALPORT_PARITY_ODD:
+    dcb.Parity = ODDPARITY;
+    break;
+  case SERIALPORT_PARITY_SPACE:
+    dcb.Parity = SPACEPARITY;
+    break;
+  }
+
+  switch (data->stopBits) {
+  case SERIALPORT_STOPBITS_ONE:
+    dcb.StopBits = ONESTOPBIT;
+    break;
+  case SERIALPORT_STOPBITS_ONE_FIVE:
+    dcb.StopBits = ONE5STOPBITS;
+    break;
+  case SERIALPORT_STOPBITS_TWO:
+    dcb.StopBits = TWOSTOPBITS;
+    break;
+  }
+
+  if (!SetCommState(file, &dcb)) {
+    ErrorCodeToString("Open (SetCommState)", GetLastError(), data->errorString);
+    CloseHandle(file);
+    return;
+  }
+
+  // Set the timeouts for read and write operations.
+  // Read operation will wait for at least 1 byte to be received.
+  COMMTIMEOUTS commTimeouts = {};
+  commTimeouts.ReadIntervalTimeout = 0;          // Never timeout, always wait for data.
+  commTimeouts.ReadTotalTimeoutMultiplier = 0;   // Do not allow big read timeout when big read buffer used
+  commTimeouts.ReadTotalTimeoutConstant = 0;     // Total read timeout (period of read loop)
+  commTimeouts.WriteTotalTimeoutConstant = 0;    // Const part of write timeout
+  commTimeouts.WriteTotalTimeoutMultiplier = 0;  // Variable part of write timeout (per byte)
+
+  if (!SetCommTimeouts(file, &commTimeouts)) {
+    ErrorCodeToString("Open (SetCommTimeouts)", GetLastError(), data->errorString);
+    CloseHandle(file);
+    return;
+  }
+
+  // Remove garbage data in RX/TX queues
+  PurgeComm(file, PURGE_RXCLEAR);
+  PurgeComm(file, PURGE_TXCLEAR);
+
+  data->result = static_cast<int>(reinterpret_cast<uintptr_t>(file));
+}
+
+void EIO_Update(uv_work_t* req) {
+  ConnectionOptionsBaton* data = static_cast<ConnectionOptionsBaton*>(req->data);
+
+  DCB dcb = { 0 };
+  SecureZeroMemory(&dcb, sizeof(DCB));
+  dcb.DCBlength = sizeof(DCB);
+
+  if (!GetCommState(int2handle(data->fd), &dcb)) {
+    ErrorCodeToString("Update (GetCommState)", GetLastError(), data->errorString);
+    return;
+  }
+
+  dcb.BaudRate = data->baudRate;
+
+  if (!SetCommState(int2handle(data->fd), &dcb)) {
+    ErrorCodeToString("Update (SetCommState)", GetLastError(), data->errorString);
+    return;
+  }
+}
+
+void EIO_Set(uv_work_t* req) {
+  SetBaton* data = static_cast<SetBaton*>(req->data);
+
+  if (data->rts) {
+    EscapeCommFunction(int2handle(data->fd), SETRTS);
+  } else {
+    EscapeCommFunction(int2handle(data->fd), CLRRTS);
+  }
+
+  if (data->dtr) {
+    EscapeCommFunction(int2handle(data->fd), SETDTR);
+  } else {
+    EscapeCommFunction(int2handle(data->fd), CLRDTR);
+  }
+
+  if (data->brk) {
+    EscapeCommFunction(int2handle(data->fd), SETBREAK);
+  } else {
+    EscapeCommFunction(int2handle(data->fd), CLRBREAK);
+  }
+
+  DWORD bits = 0;
+
+  GetCommMask(int2handle(data->fd), &bits);
+
+  bits &= ~(EV_CTS | EV_DSR);
+
+  if (data->cts) {
+    bits |= EV_CTS;
+  }
+
+  if (data->dsr) {
+    bits |= EV_DSR;
+  }
+
+  if (!SetCommMask(int2handle(data->fd), bits)) {
+    ErrorCodeToString("Setting options on COM port (SetCommMask)", GetLastError(), data->errorString);
+    return;
+  }
+}
+
+void EIO_Get(uv_work_t* req) {
+  GetBaton* data = static_cast<GetBaton*>(req->data);
+
+  DWORD bits = 0;
+  if (!GetCommModemStatus(int2handle(data->fd), &bits)) {
+    ErrorCodeToString("Getting control settings on COM port (GetCommModemStatus)", GetLastError(), data->errorString);
+    return;
+  }
+
+  data->cts = bits & MS_CTS_ON;
+  data->dsr = bits & MS_DSR_ON;
+  data->dcd = bits & MS_RLSD_ON;
+}
+
+void EIO_GetBaudRate(uv_work_t* req) {
+  GetBaudRateBaton* data = static_cast<GetBaudRateBaton*>(req->data);
+
+  DCB dcb = { 0 };
+  SecureZeroMemory(&dcb, sizeof(DCB));
+  dcb.DCBlength = sizeof(DCB);
+
+  if (!GetCommState(int2handle(data->fd), &dcb)) {
+    ErrorCodeToString("Getting baud rate (GetCommState)", GetLastError(), data->errorString);
+    return;
+  }
+
+  data->baudRate = static_cast<int>(dcb.BaudRate);
+}
+
+bool IsClosingHandle(int fd) {
+  for (std::list<int>::iterator it = g_closingHandles.begin(); it != g_closingHandles.end(); ++it) {
+    if (fd == *it) {
+      g_closingHandles.remove(fd);
+      return true;
+    }
+  }
+  return false;
+}
+
+NAN_METHOD(Write) {
+  // file descriptor
+  if (!info[0]->IsInt32()) {
+    Nan::ThrowTypeError("First argument must be an int");
+    return;
+  }
+  int fd = Nan::To<int>(info[0]).FromJust();
+
+  // buffer
+  if (!info[1]->IsObject() || !node::Buffer::HasInstance(info[1])) {
+    Nan::ThrowTypeError("Second argument must be a buffer");
+    return;
+  }
+  v8::Local<v8::Object> buffer = Nan::To<v8::Object>(info[1]).ToLocalChecked();
+  char* bufferData = node::Buffer::Data(buffer);
+  size_t bufferLength = node::Buffer::Length(buffer);
+
+  // callback
+  if (!info[2]->IsFunction()) {
+    Nan::ThrowTypeError("Third argument must be a function");
+    return;
+  }
+
+  WriteBaton* baton = new WriteBaton();
+  baton->fd = fd;
+  baton->buffer.Reset(buffer);
+  baton->bufferData = bufferData;
+  baton->bufferLength = bufferLength;
+  baton->offset = 0;
+  baton->callback.Reset(info[2].As<v8::Function>());
+  baton->complete = false;
+
+  uv_async_t* async = new uv_async_t;
+  uv_async_init(uv_default_loop(), async, EIO_AfterWrite);
+  async->data = baton;
+  // WriteFileEx requires a thread that can block. Create a new thread to
+  // run the write operation, saving the handle so it can be deallocated later.
+  baton->hThread = CreateThread(NULL, 0, WriteThread, async, 0, NULL);
+}
+
+void __stdcall WriteIOCompletion(DWORD errorCode, DWORD bytesTransferred, OVERLAPPED* ov) {
+  WriteBaton* baton = static_cast<WriteBaton*>(ov->hEvent);
+  DWORD bytesWritten;
+  if (!GetOverlappedResult(int2handle(baton->fd), ov, &bytesWritten, TRUE)) {
+    errorCode = GetLastError();
+    ErrorCodeToString("Writing to COM port (GetOverlappedResult)", errorCode, baton->errorString);
+    baton->complete = true;
+    return;
+  }
+  if (bytesWritten) {
+    baton->offset += bytesWritten;
+    if (baton->offset >= baton->bufferLength) {
+      baton->complete = true;
+    }
+  }
+}
+
+DWORD __stdcall WriteThread(LPVOID param) {
+  uv_async_t* async = static_cast<uv_async_t*>(param);
+  WriteBaton* baton = static_cast<WriteBaton*>(async->data);
+
+  OVERLAPPED* ov = new OVERLAPPED;
+  memset(ov, 0, sizeof(OVERLAPPED));
+  ov->hEvent = static_cast<void*>(baton);
+
+  while (!baton->complete) {
+    char* offsetPtr = baton->bufferData + baton->offset;
+    // WriteFileEx requires calling GetLastError even upon success. Clear the error beforehand.
+    SetLastError(0);
+    WriteFileEx(int2handle(baton->fd), offsetPtr,
+                static_cast<DWORD>(baton->bufferLength - baton->offset), ov, WriteIOCompletion);
+    // Error codes when call is successful, such as ERROR_MORE_DATA.
+    DWORD lastError = GetLastError();
+    if (lastError != ERROR_SUCCESS) {
+      ErrorCodeToString("Writing to COM port (WriteFileEx)", lastError, baton->errorString);
+      break;
+    }
+    // IOCompletion routine is only called once this thread is in an alertable wait state.
+    SleepEx(INFINITE, TRUE);
+  }
+  delete ov;
+  // Signal the main thread to run the callback.
+  uv_async_send(async);
+  ExitThread(0);
+}
+
+void EIO_AfterWrite(uv_async_t* req) {
+  Nan::HandleScope scope;
+  WriteBaton* baton = static_cast<WriteBaton*>(req->data);
+  WaitForSingleObject(baton->hThread, INFINITE);
+  CloseHandle(baton->hThread);
+  uv_close(reinterpret_cast<uv_handle_t*>(req), AsyncCloseCallback);
+
+  v8::Local<v8::Value> argv[1];
+  if (baton->errorString[0]) {
+    argv[0] = v8::Exception::Error(Nan::New<v8::String>(baton->errorString).ToLocalChecked());
+  } else {
+    argv[0] = Nan::Null();
+  }
+  baton->callback.Call(1, argv, baton);
+  baton->buffer.Reset();
+  delete baton;
+}
+
+NAN_METHOD(Read) {
+  // file descriptor
+  if (!info[0]->IsInt32()) {
+    Nan::ThrowTypeError("First argument must be a fd");
+    return;
+  }
+  int fd = Nan::To<int>(info[0]).FromJust();
+
+  // buffer
+  if (!info[1]->IsObject() || !node::Buffer::HasInstance(info[1])) {
+    Nan::ThrowTypeError("Second argument must be a buffer");
+    return;
+  }
+  v8::Local<v8::Object> buffer = Nan::To<v8::Object>(info[1]).ToLocalChecked();
+  size_t bufferLength = node::Buffer::Length(buffer);
+
+  // offset
+  if (!info[2]->IsInt32()) {
+    Nan::ThrowTypeError("Third argument must be an int");
+    return;
+  }
+  int offset = Nan::To<v8::Int32>(info[2]).ToLocalChecked()->Value();
+
+  // bytes to read
+  if (!info[3]->IsInt32()) {
+    Nan::ThrowTypeError("Fourth argument must be an int");
+    return;
+  }
+  size_t bytesToRead = Nan::To<v8::Int32>(info[3]).ToLocalChecked()->Value();
+
+  if ((bytesToRead + offset) > bufferLength) {
+    Nan::ThrowTypeError("'bytesToRead' + 'offset' cannot be larger than the buffer's length");
+    return;
+  }
+
+  // callback
+  if (!info[4]->IsFunction()) {
+    Nan::ThrowTypeError("Fifth argument must be a function");
+    return;
+  }
+
+  ReadBaton* baton = new ReadBaton();
+  baton->fd = fd;
+  baton->offset = offset;
+  baton->bytesToRead = bytesToRead;
+  baton->bufferLength = bufferLength;
+  baton->bufferData = node::Buffer::Data(buffer);
+  baton->callback.Reset(info[4].As<v8::Function>());
+  baton->complete = false;
+
+  uv_async_t* async = new uv_async_t;
+  uv_async_init(uv_default_loop(), async, EIO_AfterRead);
+  async->data = baton;
+  // ReadFileEx requires a thread that can block. Create a new thread to
+  // run the read operation, saving the handle so it can be deallocated later.
+  baton->hThread = CreateThread(NULL, 0, ReadThread, async, 0, NULL);
+}
+
+void __stdcall ReadIOCompletion(DWORD errorCode, DWORD bytesTransferred, OVERLAPPED* ov) {
+  ReadBaton* baton = static_cast<ReadBaton*>(ov->hEvent);
+
+  if (errorCode) {
+    ErrorCodeToString("Reading from COM port (ReadIOCompletion)", errorCode, baton->errorString);
+    baton->complete = true;
+    return;
+  }
+
+  DWORD lastError;
+  if (!GetOverlappedResult(int2handle(baton->fd), ov, &bytesTransferred, TRUE)) {
+    lastError = GetLastError();
+    ErrorCodeToString("Reading from COM port (GetOverlappedResult)", lastError, baton->errorString);
+    baton->complete = true;
+    return;
+  }
+  if (bytesTransferred) {
+    baton->bytesToRead -= bytesTransferred;
+    baton->bytesRead += bytesTransferred;
+    baton->offset += bytesTransferred;
+  }
+
+  // ReadFileEx and GetOverlappedResult retrieved only 1 byte. Read any additional data in the input
+  // buffer. Set the timeout to MAXDWORD in order to disable timeouts, so the read operation will
+  // return immediately no matter how much data is available.
+  COMMTIMEOUTS commTimeouts = {};
+  commTimeouts.ReadIntervalTimeout = MAXDWORD;
+  if (!SetCommTimeouts(int2handle(baton->fd), &commTimeouts)) {
+    lastError = GetLastError();
+    ErrorCodeToString("Setting COM timeout (SetCommTimeouts)", lastError, baton->errorString);
+    baton->complete = true;
+    return;
+  }
+
+  // Store additional data after whatever data has already been read.
+  char* offsetPtr = baton->bufferData + baton->offset;
+
+  // ReadFile, unlike ReadFileEx, needs an event in the overlapped structure.
+  memset(ov, 0, sizeof(OVERLAPPED));
+  ov->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+  if (!ReadFile(int2handle(baton->fd), offsetPtr, baton->bytesToRead, &bytesTransferred, ov)) {
+    errorCode = GetLastError();
+
+    if (errorCode != ERROR_IO_PENDING) {
+      ErrorCodeToString("Reading from COM port (ReadFile)", errorCode, baton->errorString);
+      baton->complete = true;
+      CloseHandle(ov->hEvent);
+      return;
+    }
+
+    if (!GetOverlappedResult(int2handle(baton->fd), ov, &bytesTransferred, TRUE)) {
+      lastError = GetLastError();
+      ErrorCodeToString("Reading from COM port (GetOverlappedResult)", lastError, baton->errorString);
+      baton->complete = true;
+      CloseHandle(ov->hEvent);
+      return;
+    }
+  }
+  CloseHandle(ov->hEvent);
+
+  baton->bytesToRead -= bytesTransferred;
+  baton->bytesRead += bytesTransferred;
+  baton->complete = true;
+}
+
+DWORD __stdcall ReadThread(LPVOID param) {
+  uv_async_t* async = static_cast<uv_async_t*>(param);
+  ReadBaton* baton = static_cast<ReadBaton*>(async->data);
+  DWORD lastError;
+
+  OVERLAPPED* ov = new OVERLAPPED;
+  memset(ov, 0, sizeof(OVERLAPPED));
+  ov->hEvent = static_cast<void*>(baton);
+
+  while (!baton->complete) {
+    // Reset the read timeout to 0, so that it will block until more data arrives.
+    COMMTIMEOUTS commTimeouts = {};
+    commTimeouts.ReadIntervalTimeout = 0;
+    if (!SetCommTimeouts(int2handle(baton->fd), &commTimeouts)) {
+      lastError = GetLastError();
+      ErrorCodeToString("Setting COM timeout (SetCommTimeouts)", lastError, baton->errorString);
+      break;
+    }
+    // ReadFileEx doesn't use overlapped's hEvent, so it is reserved for user data.
+    ov->hEvent = static_cast<HANDLE>(baton);
+    char* offsetPtr = baton->bufferData + baton->offset;
+    // ReadFileEx requires calling GetLastError even upon success. Clear the error beforehand.
+    SetLastError(0);
+    // Only read 1 byte, so that the callback will be triggered once any data arrives.
+    ReadFileEx(int2handle(baton->fd), offsetPtr, 1, ov, ReadIOCompletion);
+    // Error codes when call is successful, such as ERROR_MORE_DATA.
+    lastError = GetLastError();
+    if (lastError != ERROR_SUCCESS) {
+      ErrorCodeToString("Reading from COM port (ReadFileEx)", lastError, baton->errorString);
+      break;
+    }
+    // IOCompletion routine is only called once this thread is in an alertable wait state.
+    SleepEx(INFINITE, TRUE);
+  }
+  delete ov;
+  // Signal the main thread to run the callback.
+  uv_async_send(async);
+  ExitThread(0);
+}
+
+void EIO_AfterRead(uv_async_t* req) {
+  Nan::HandleScope scope;
+  ReadBaton* baton = static_cast<ReadBaton*>(req->data);
+  WaitForSingleObject(baton->hThread, INFINITE);
+  CloseHandle(baton->hThread);
+  uv_close(reinterpret_cast<uv_handle_t*>(req), AsyncCloseCallback);
+
+  v8::Local<v8::Value> argv[2];
+  if (baton->errorString[0]) {
+    argv[0] = Nan::Error(baton->errorString);
+    argv[1] = Nan::Undefined();
+  } else {
+    argv[0] = Nan::Null();
+    argv[1] = Nan::New<v8::Integer>(static_cast<int>(baton->bytesRead));
+  }
+
+  baton->callback.Call(2, argv, baton);
+  delete baton;
+}
+
+void EIO_Close(uv_work_t* req) {
+  VoidBaton* data = static_cast<VoidBaton*>(req->data);
+
+  g_closingHandles.push_back(data->fd);
+
+  HMODULE hKernel32 = LoadLibrary("kernel32.dll");
+  // Look up function address
+  CancelIoExType pCancelIoEx = (CancelIoExType)GetProcAddress(hKernel32, "CancelIoEx");
+  // Do something with it
+  if (pCancelIoEx) {
+    // Function exists so call it
+    // Cancel all pending IO Requests for the current device
+    pCancelIoEx(int2handle(data->fd), NULL);
+  }
+  if (!CloseHandle(int2handle(data->fd))) {
+    ErrorCodeToString("Closing connection (CloseHandle)", GetLastError(), data->errorString);
+    return;
+  }
+}
+
+char *copySubstring(char *someString, int n) {
+  char *new_ = reinterpret_cast<char*>(malloc(sizeof(char)*n + 1));
+  strncpy_s(new_, n + 1, someString, n);
+  new_[n] = '\0';
+  return new_;
+}
+
+NAN_METHOD(List) {
+  // callback
+  if (!info[0]->IsFunction()) {
+    Nan::ThrowTypeError("First argument must be a function");
+    return;
+  }
+
+  ListBaton* baton = new ListBaton();
+  snprintf(baton->errorString, sizeof(baton->errorString), "");
+  baton->callback.Reset(info[0].As<v8::Function>());
+
+  uv_work_t* req = new uv_work_t();
+  req->data = baton;
+  uv_queue_work(uv_default_loop(), req, EIO_List, (uv_after_work_cb)EIO_AfterList);
+}
+
+// It's possible that the s/n is a construct and not the s/n of the parent USB
+// composite device. This performs some convoluted registry lookups to fetch the USB s/n.
+void getSerialNumber(const char *vid,
+                     const char *pid,
+                     const HDEVINFO hDevInfo,
+                     SP_DEVINFO_DATA deviceInfoData,
+                     const unsigned int maxSerialNumberLength,
+                     char* serialNumber) {
+  _snprintf_s(serialNumber, maxSerialNumberLength, _TRUNCATE, "");
+  if (vid == NULL || pid == NULL) {
+    return;
+  }
+
+  DWORD dwSize;
+  WCHAR szWUuidBuffer[MAX_BUFFER_SIZE];
+  WCHAR containerUuid[MAX_BUFFER_SIZE];
+
+
+  // Fetch the "Container ID" for this device node. In USB context, this "Container
+  // ID" refers to the composite USB device, i.e. the USB device as a whole, not
+  // just one of its interfaces with a serial port driver attached.
+
+  // From https://stackoverflow.com/questions/3438366/setupdigetdeviceproperty-usage-example:
+  // Because this is not compiled with UNICODE defined, the call to SetupDiGetDevicePropertyW
+  // has to be setup manually.
+  DEVPROPTYPE ulPropertyType;
+  typedef BOOL (WINAPI *FN_SetupDiGetDevicePropertyW)(
+    __in       HDEVINFO DeviceInfoSet,
+    __in       PSP_DEVINFO_DATA DeviceInfoData,
+    __in       const DEVPROPKEY *PropertyKey,
+    __out      DEVPROPTYPE *PropertyType,
+    __out_opt  PBYTE PropertyBuffer,
+    __in       DWORD PropertyBufferSize,
+    __out_opt  PDWORD RequiredSize,
+    __in       DWORD Flags);
+
+  FN_SetupDiGetDevicePropertyW fn_SetupDiGetDevicePropertyW = (FN_SetupDiGetDevicePropertyW)
+        GetProcAddress(GetModuleHandle(TEXT("Setupapi.dll")), "SetupDiGetDevicePropertyW");
+
+  if (fn_SetupDiGetDevicePropertyW (
+        hDevInfo,
+        &deviceInfoData,
+        &DEVPKEY_Device_ContainerId,
+        &ulPropertyType,
+        reinterpret_cast<BYTE*>(szWUuidBuffer),
+        sizeof(szWUuidBuffer),
+        &dwSize,
+        0)) {
+    szWUuidBuffer[dwSize] = '\0';
+
+    // Given the UUID bytes, build up a (widechar) string from it. There's some mangling
+    // going on.
+    StringFromGUID2((REFGUID)szWUuidBuffer, containerUuid, ARRAY_SIZE(containerUuid));
+  } else {
+    // Container UUID could not be fetched, return empty serial number.
+    return;
+  }
+
+  // NOTE: Devices might have a containerUuid like {00000000-0000-0000-FFFF-FFFFFFFFFFFF}
+  // This means they're non-removable, and are not handled (yet).
+  // Maybe they should inherit the s/n from somewhere else.
+
+  // Sanitize input - for whatever reason, StringFromGUID2() returns a WCHAR* but
+  // the comparisons later need a plain old char*, in lowercase ASCII.
+  char wantedUuid[MAX_BUFFER_SIZE];
+  _snprintf_s(wantedUuid, MAX_BUFFER_SIZE, _TRUNCATE, "%ws", containerUuid);
+  strlwr(wantedUuid);
+
+  // Iterate through all the USB devices with the given VendorID/ProductID
+
+  HKEY vendorProductHKey;
+  DWORD retCode;
+  char hkeyPath[MAX_BUFFER_SIZE];
+
+  _snprintf_s(hkeyPath, MAX_BUFFER_SIZE, _TRUNCATE, "SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_%s&PID_%s", vid, pid);
+
+  retCode = RegOpenKeyEx(
+    HKEY_LOCAL_MACHINE,
+    hkeyPath,
+    0,
+    KEY_READ,
+    &vendorProductHKey);
+
+  if (retCode == ERROR_SUCCESS) {
+    DWORD    serialNumbersCount = 0;       // number of subkeys
+
+    // Fetch how many subkeys there are for this VendorID/ProductID pair.
+    // That's the number of devices for this VendorID/ProductID known to this machine.
+
+    retCode = RegQueryInfoKey(
+        vendorProductHKey,    // hkey handle
+        NULL,      // buffer for class name
+        NULL,      // size of class string
+        NULL,      // reserved
+        &serialNumbersCount,  // number of subkeys
+        NULL,      // longest subkey size
+        NULL,      // longest class string
+        NULL,      // number of values for this key
+        NULL,      // longest value name
+        NULL,      // longest value data
+        NULL,      // security descriptor
+        NULL);     // last write time
+
+    if (retCode == ERROR_SUCCESS && serialNumbersCount > 0) {
+        for (unsigned int i=0; i < serialNumbersCount; i++) {
+          // Each of the subkeys here is the serial number of a USB device with the
+          // given VendorId/ProductId. Now fetch the string for the S/N.
+          DWORD serialNumberLength = maxSerialNumberLength;
+          retCode = RegEnumKeyEx(vendorProductHKey,
+                                  i,
+                                  serialNumber,
+                                  &serialNumberLength,
+                                  NULL,
+                                  NULL,
+                                  NULL,
+                                  NULL);
+
+          if (retCode == ERROR_SUCCESS) {
+            // Lookup info for VID_(vendorId)&PID_(productId)\(serialnumber)
+
+            _snprintf_s(hkeyPath, MAX_BUFFER_SIZE, _TRUNCATE,
+                        "SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_%s&PID_%s\\%s",
+                        vid, pid, serialNumber);
+
+            HKEY deviceHKey;
+
+            if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, hkeyPath, 0, KEY_READ, &deviceHKey) == ERROR_SUCCESS) {
+                char readUuid[MAX_BUFFER_SIZE];
+                DWORD readSize = sizeof(readUuid);
+
+                // Query VID_(vendorId)&PID_(productId)\(serialnumber)\ContainerID
+                DWORD retCode = RegQueryValueEx(deviceHKey, "ContainerID", NULL, NULL, (LPBYTE)&readUuid, &readSize);
+                if (retCode == ERROR_SUCCESS) {
+                    readUuid[readSize] = '\0';
+                    if (strcmp(wantedUuid, readUuid) == 0) {
+                        // The ContainerID UUIDs match, return now that serialNumber has
+                        // the right value.
+                        RegCloseKey(deviceHKey);
+                        RegCloseKey(vendorProductHKey);
+                        return;
+                    }
+                }
+            }
+            RegCloseKey(deviceHKey);
+          }
+       }
+    }
+
+    /* In case we did not obtain the path, for whatever reason, we close the key and return an empty string. */
+    RegCloseKey(vendorProductHKey);
+  }
+
+  _snprintf_s(serialNumber, maxSerialNumberLength, _TRUNCATE, "");
+  return;
+}
+
+void EIO_List(uv_work_t* req) {
+  ListBaton* data = static_cast<ListBaton*>(req->data);
+
+  GUID *guidDev = (GUID*)& GUID_DEVCLASS_PORTS;  // NOLINT
+  HDEVINFO hDevInfo = SetupDiGetClassDevs(guidDev, NULL, NULL, DIGCF_PRESENT | DIGCF_PROFILE);
+  SP_DEVINFO_DATA deviceInfoData;
+
+  int memberIndex = 0;
+  DWORD dwSize, dwPropertyRegDataType;
+  char szBuffer[MAX_BUFFER_SIZE];
+  char *pnpId;
+  char *vendorId;
+  char *productId;
+  char *name;
+  char *manufacturer;
+  char *locationId;
+  char serialNumber[MAX_REGISTRY_KEY_SIZE];
+  bool isCom;
+  while (true) {
+    pnpId = NULL;
+    vendorId = NULL;
+    productId = NULL;
+    name = NULL;
+    manufacturer = NULL;
+    locationId = NULL;
+
+    ZeroMemory(&deviceInfoData, sizeof(SP_DEVINFO_DATA));
+    deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
+
+    if (SetupDiEnumDeviceInfo(hDevInfo, memberIndex, &deviceInfoData) == FALSE) {
+      if (GetLastError() == ERROR_NO_MORE_ITEMS) {
+        break;
+      }
+    }
+
+    dwSize = sizeof(szBuffer);
+    SetupDiGetDeviceInstanceId(hDevInfo, &deviceInfoData, szBuffer, dwSize, &dwSize);
+    szBuffer[dwSize] = '\0';
+    pnpId = strdup(szBuffer);
+
+    vendorId = strstr(szBuffer, "VID_");
+    if (vendorId) {
+      vendorId += 4;
+      vendorId = copySubstring(vendorId, 4);
+    }
+    productId = strstr(szBuffer, "PID_");
+    if (productId) {
+      productId += 4;
+      productId = copySubstring(productId, 4);
+    }
+
+    getSerialNumber(vendorId, productId, hDevInfo, deviceInfoData, MAX_REGISTRY_KEY_SIZE, serialNumber);
+
+    if (SetupDiGetDeviceRegistryProperty(hDevInfo, &deviceInfoData,
+                                         SPDRP_LOCATION_INFORMATION, &dwPropertyRegDataType,
+                                         reinterpret_cast<BYTE*>(szBuffer),
+                                         sizeof(szBuffer), &dwSize)) {
+      locationId = strdup(szBuffer);
+    }
+    if (SetupDiGetDeviceRegistryProperty(hDevInfo, &deviceInfoData,
+                                         SPDRP_MFG, &dwPropertyRegDataType,
+                                         reinterpret_cast<BYTE*>(szBuffer),
+                                         sizeof(szBuffer), &dwSize)) {
+      manufacturer = strdup(szBuffer);
+    }
+
+    HKEY hkey = SetupDiOpenDevRegKey(hDevInfo, &deviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
+    if (hkey != INVALID_HANDLE_VALUE) {
+      dwSize = sizeof(szBuffer);
+      if (RegQueryValueEx(hkey, "PortName", NULL, NULL, (LPBYTE)&szBuffer, &dwSize) == ERROR_SUCCESS) {
+        szBuffer[dwSize] = '\0';
+        name = strdup(szBuffer);
+        isCom = strstr(szBuffer, "COM") != NULL;
+      }
+    }
+    if (isCom) {
+      ListResultItem* resultItem = new ListResultItem();
+      resultItem->path = name;
+      resultItem->manufacturer = manufacturer;
+      resultItem->pnpId = pnpId;
+      if (vendorId) {
+        resultItem->vendorId = vendorId;
+      }
+      if (productId) {
+        resultItem->productId = productId;
+      }
+      resultItem->serialNumber = serialNumber;
+      if (locationId) {
+        resultItem->locationId = locationId;
+      }
+      data->results.push_back(resultItem);
+    }
+    free(pnpId);
+    free(vendorId);
+    free(productId);
+    free(locationId);
+    free(manufacturer);
+    free(name);
+
+    RegCloseKey(hkey);
+    memberIndex++;
+  }
+  if (hDevInfo) {
+    SetupDiDestroyDeviceInfoList(hDevInfo);
+  }
+}
+
+void setIfNotEmpty(v8::Local<v8::Object> item, std::string key, const char *value) {
+  v8::Local<v8::String> v8key = Nan::New<v8::String>(key).ToLocalChecked();
+  if (strlen(value) > 0) {
+    Nan::Set(item, v8key, Nan::New<v8::String>(value).ToLocalChecked());
+  } else {
+    Nan::Set(item, v8key, Nan::Undefined());
+  }
+}
+
+void EIO_AfterList(uv_work_t* req) {
+  Nan::HandleScope scope;
+
+  ListBaton* data = static_cast<ListBaton*>(req->data);
+
+  v8::Local<v8::Value> argv[2];
+  if (data->errorString[0]) {
+    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
+    argv[1] = Nan::Undefined();
+  } else {
+    v8::Local<v8::Array> results = Nan::New<v8::Array>();
+    int i = 0;
+    for (std::list<ListResultItem*>::iterator it = data->results.begin(); it != data->results.end(); ++it, i++) {
+      v8::Local<v8::Object> item = Nan::New<v8::Object>();
+
+      setIfNotEmpty(item, "path", (*it)->path.c_str());
+      setIfNotEmpty(item, "manufacturer", (*it)->manufacturer.c_str());
+      setIfNotEmpty(item, "serialNumber", (*it)->serialNumber.c_str());
+      setIfNotEmpty(item, "pnpId", (*it)->pnpId.c_str());
+      setIfNotEmpty(item, "locationId", (*it)->locationId.c_str());
+      setIfNotEmpty(item, "vendorId", (*it)->vendorId.c_str());
+      setIfNotEmpty(item, "productId", (*it)->productId.c_str());
+
+      Nan::Set(results, i, item);
+    }
+    argv[0] = Nan::Null();
+    argv[1] = results;
+  }
+  data->callback.Call(2, argv, data);
+
+  for (std::list<ListResultItem*>::iterator it = data->results.begin(); it != data->results.end(); ++it) {
+    delete *it;
+  }
+  delete data;
+  delete req;
+}
+
+
+void EIO_Flush(uv_work_t* req) {
+  VoidBaton* data = static_cast<VoidBaton*>(req->data);
+
+  DWORD purge_all = PURGE_RXCLEAR | PURGE_TXABORT | PURGE_TXCLEAR;
+  if (!PurgeComm(int2handle(data->fd), purge_all)) {
+    ErrorCodeToString("Flushing connection (PurgeComm)", GetLastError(), data->errorString);
+    return;
+  }
+}
+
+void EIO_Drain(uv_work_t* req) {
+  VoidBaton* data = static_cast<VoidBaton*>(req->data);
+
+  if (!FlushFileBuffers(int2handle(data->fd))) {
+    ErrorCodeToString("Draining connection (FlushFileBuffers)", GetLastError(), data->errorString);
+    return;
+  }
+}
diff --git a/node_modules/@serialport/bindings/src/serialport_win.h b/node_modules/@serialport/bindings/src/serialport_win.h
new file mode 100644
index 0000000..503134f
--- /dev/null
+++ b/node_modules/@serialport/bindings/src/serialport_win.h
@@ -0,0 +1,74 @@
+#ifndef PACKAGES_SERIALPORT_SRC_SERIALPORT_WIN_H_
+#define PACKAGES_SERIALPORT_SRC_SERIALPORT_WIN_H_
+// #include <stdio.h>
+// #include <stdlib.h>
+// #include <string.h>
+#include <nan.h>
+#include <list>
+#include <string>
+
+#define ERROR_STRING_SIZE 1024
+
+struct WriteBaton : public Nan::AsyncResource {
+  WriteBaton() : AsyncResource("node-serialport:WriteBaton"), bufferData(), errorString() {}
+  int fd = 0;
+  char* bufferData = nullptr;
+  size_t bufferLength = 0;
+  size_t offset = 0;
+  size_t bytesWritten = 0;
+  void* hThread = nullptr;
+  bool complete = false;
+  Nan::Persistent<v8::Object> buffer;
+  Nan::Callback callback;
+  int result = 0;
+  char errorString[ERROR_STRING_SIZE];
+};
+
+NAN_METHOD(Write);
+void EIO_Write(uv_work_t* req);
+void EIO_AfterWrite(uv_async_t* req);
+DWORD __stdcall WriteThread(LPVOID param);
+
+
+struct ReadBaton : public Nan::AsyncResource {
+  ReadBaton() : AsyncResource("node-serialport:ReadBaton"), errorString() {}
+  int fd = 0;
+  char* bufferData = nullptr;
+  size_t bufferLength = 0;
+  size_t bytesRead = 0;
+  size_t bytesToRead = 0;
+  size_t offset = 0;
+  void* hThread = nullptr;
+  bool complete = false;
+  char errorString[ERROR_STRING_SIZE];
+  Nan::Callback callback;
+};
+
+NAN_METHOD(Read);
+void EIO_Read(uv_work_t* req);
+void EIO_AfterRead(uv_async_t* req);
+DWORD __stdcall ReadThread(LPVOID param);
+
+
+NAN_METHOD(List);
+void EIO_List(uv_work_t* req);
+void EIO_AfterList(uv_work_t* req);
+
+struct ListResultItem {
+  std::string path;
+  std::string manufacturer;
+  std::string serialNumber;
+  std::string pnpId;
+  std::string locationId;
+  std::string vendorId;
+  std::string productId;
+};
+
+struct ListBaton : public Nan::AsyncResource {
+  ListBaton() : AsyncResource("node-serialport:ListBaton") {}
+  Nan::Callback callback;
+  std::list<ListResultItem*> results;
+  char errorString[ERROR_STRING_SIZE] = "";
+};
+
+#endif  // PACKAGES_SERIALPORT_SRC_SERIALPORT_WIN_H_
diff --git a/node_modules/@serialport/parser-byte-length/CHANGELOG.md b/node_modules/@serialport/parser-byte-length/CHANGELOG.md
new file mode 100644
index 0000000..281b58a
--- /dev/null
+++ b/node_modules/@serialport/parser-byte-length/CHANGELOG.md
@@ -0,0 +1,24 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [9.0.1](https://github.com/serialport/node-serialport/compare/v9.0.0...v9.0.1) (2020-08-08)
+
+**Note:** Version bump only for package @serialport/parser-byte-length
+
+
+
+
+
+# [9.0.0](https://github.com/serialport/node-serialport/compare/v8.0.8...v9.0.0) (2020-05-10)
+
+**Note:** Version bump only for package @serialport/parser-byte-length
+
+
+
+
+
+## [8.0.6](https://github.com/serialport/node-serialport/compare/v8.0.5...v8.0.6) (2019-12-25)
+
+**Note:** Version bump only for package @serialport/parser-byte-length
diff --git a/node_modules/@serialport/parser-byte-length/LICENSE b/node_modules/@serialport/parser-byte-length/LICENSE
new file mode 100644
index 0000000..800d776
--- /dev/null
+++ b/node_modules/@serialport/parser-byte-length/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright 2010 Christopher Williams. All rights reserved.
+
+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/@serialport/parser-byte-length/README.md b/node_modules/@serialport/parser-byte-length/README.md
new file mode 100644
index 0000000..3a83f47
--- /dev/null
+++ b/node_modules/@serialport/parser-byte-length/README.md
@@ -0,0 +1 @@
+See our api docs https://serialport.io/docs/api-parser-byte-length
diff --git a/node_modules/@serialport/parser-byte-length/lib/index.js b/node_modules/@serialport/parser-byte-length/lib/index.js
new file mode 100644
index 0000000..a54e192
--- /dev/null
+++ b/node_modules/@serialport/parser-byte-length/lib/index.js
@@ -0,0 +1,55 @@
+const { Transform } = require('stream')
+
+/**
+ * Emit data every number of bytes
+ * @extends Transform
+ * @param {Object} options parser options object
+ * @param {Number} options.length the number of bytes on each data event
+ * @summary A transform stream that emits data as a buffer after a specific number of bytes are received. Runs in O(n) time.
+ * @example
+const SerialPort = require('serialport')
+const ByteLength = require('@serialport/parser-byte-length')
+const port = new SerialPort('/dev/tty-usbserial1')
+const parser = port.pipe(new ByteLength({length: 8}))
+parser.on('data', console.log) // will have 8 bytes per data event
+ */
+class ByteLengthParser extends Transform {
+  constructor(options = {}) {
+    super(options)
+
+    if (typeof options.length !== 'number') {
+      throw new TypeError('"length" is not a number')
+    }
+
+    if (options.length < 1) {
+      throw new TypeError('"length" is not greater than 0')
+    }
+
+    this.length = options.length
+    this.position = 0
+    this.buffer = Buffer.alloc(this.length)
+  }
+
+  _transform(chunk, encoding, cb) {
+    let cursor = 0
+    while (cursor < chunk.length) {
+      this.buffer[this.position] = chunk[cursor]
+      cursor++
+      this.position++
+      if (this.position === this.length) {
+        this.push(this.buffer)
+        this.buffer = Buffer.alloc(this.length)
+        this.position = 0
+      }
+    }
+    cb()
+  }
+
+  _flush(cb) {
+    this.push(this.buffer.slice(0, this.position))
+    this.buffer = Buffer.alloc(this.length)
+    cb()
+  }
+}
+
+module.exports = ByteLengthParser
diff --git a/node_modules/@serialport/parser-byte-length/package.json b/node_modules/@serialport/parser-byte-length/package.json
new file mode 100644
index 0000000..c159c41
--- /dev/null
+++ b/node_modules/@serialport/parser-byte-length/package.json
@@ -0,0 +1,48 @@
+{
+  "_from": "@serialport/parser-byte-length@^9.0.1",
+  "_id": "@serialport/parser-byte-length@9.0.1",
+  "_inBundle": false,
+  "_integrity": "sha512-1Ikv4lgCNw8OMf35yCpgzjHwkpgBEkhBuXFXIdWZk+ixaHFLlAtp03QxGPZBmzHMK58WDmEQoBHC1V5BkkAKSQ==",
+  "_location": "/@serialport/parser-byte-length",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "@serialport/parser-byte-length@^9.0.1",
+    "name": "@serialport/parser-byte-length",
+    "escapedName": "@serialport%2fparser-byte-length",
+    "scope": "@serialport",
+    "rawSpec": "^9.0.1",
+    "saveSpec": null,
+    "fetchSpec": "^9.0.1"
+  },
+  "_requiredBy": [
+    "/serialport"
+  ],
+  "_resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-9.0.1.tgz",
+  "_shasum": "31c0bf3a9717f1a69c1c20e34c7d367eb2b5151d",
+  "_spec": "@serialport/parser-byte-length@^9.0.1",
+  "_where": "F:\\vent-display\\node_modules\\serialport",
+  "bugs": {
+    "url": "https://github.com/serialport/node-serialport/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "See our api docs https://serialport.io/docs/api-parser-byte-length",
+  "engines": {
+    "node": ">=8.6.0"
+  },
+  "gitHead": "19fb5f8d2a76854c154c0f89e908a478ee915ee6",
+  "homepage": "https://github.com/serialport/node-serialport#readme",
+  "license": "MIT",
+  "main": "lib",
+  "name": "@serialport/parser-byte-length",
+  "publishConfig": {
+    "access": "public"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/serialport/node-serialport.git"
+  },
+  "version": "9.0.1"
+}
diff --git a/node_modules/@serialport/parser-cctalk/CHANGELOG.md b/node_modules/@serialport/parser-cctalk/CHANGELOG.md
new file mode 100644
index 0000000..f959ec3
--- /dev/null
+++ b/node_modules/@serialport/parser-cctalk/CHANGELOG.md
@@ -0,0 +1,24 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [9.0.1](https://github.com/serialport/node-serialport/compare/v9.0.0...v9.0.1) (2020-08-08)
+
+**Note:** Version bump only for package @serialport/parser-cctalk
+
+
+
+
+
+# [9.0.0](https://github.com/serialport/node-serialport/compare/v8.0.8...v9.0.0) (2020-05-10)
+
+**Note:** Version bump only for package @serialport/parser-cctalk
+
+
+
+
+
+## [8.0.6](https://github.com/serialport/node-serialport/compare/v8.0.5...v8.0.6) (2019-12-25)
+
+**Note:** Version bump only for package @serialport/parser-cctalk
diff --git a/node_modules/@serialport/parser-cctalk/LICENSE b/node_modules/@serialport/parser-cctalk/LICENSE
new file mode 100644
index 0000000..800d776
--- /dev/null
+++ b/node_modules/@serialport/parser-cctalk/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright 2010 Christopher Williams. All rights reserved.
+
+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/@serialport/parser-cctalk/README.md b/node_modules/@serialport/parser-cctalk/README.md
new file mode 100644
index 0000000..a6bb54a
--- /dev/null
+++ b/node_modules/@serialport/parser-cctalk/README.md
@@ -0,0 +1 @@
+See our api docs https://node-serialport.github.io/node-serialport/CCTalkParser.html
diff --git a/node_modules/@serialport/parser-cctalk/lib/index.js b/node_modules/@serialport/parser-cctalk/lib/index.js
new file mode 100644
index 0000000..bfea1eb
--- /dev/null
+++ b/node_modules/@serialport/parser-cctalk/lib/index.js
@@ -0,0 +1,52 @@
+const { Transform } = require('stream')
+
+/**
+ * Parse the CCTalk protocol
+ * @extends Transform
+ * @summary A transform stream that emits CCTalk packets as they are received.
+ * @example
+const SerialPort = require('serialport')
+const CCTalk = require('@serialport/parser-cctalk')
+const port = new SerialPort('/dev/ttyUSB0')
+const parser = port.pipe(new CCtalk())
+parser.on('data', console.log)
+ */
+class CCTalkParser extends Transform {
+  constructor(maxDelayBetweenBytesMs = 50) {
+    super()
+    this.array = []
+    this.cursor = 0
+    this.lastByteFetchTime = 0
+    this.maxDelayBetweenBytesMs = maxDelayBetweenBytesMs
+  }
+  _transform(buffer, _, cb) {
+    if (this.maxDelayBetweenBytesMs > 0) {
+      const now = Date.now()
+      if (now - this.lastByteFetchTime > this.maxDelayBetweenBytesMs) {
+        this.array = []
+        this.cursor = 0
+      }
+      this.lastByteFetchTime = now
+    }
+
+    this.cursor += buffer.length
+    // TODO: Better Faster es7 no supported by node 4
+    // ES7 allows directly push [...buffer]
+    // this.array = this.array.concat(Array.from(buffer)) //Slower ?!?
+    Array.from(buffer).map(byte => this.array.push(byte))
+    while (this.cursor > 1 && this.cursor >= this.array[1] + 5) {
+      // full frame accumulated
+      // copy command from the array
+      const FullMsgLength = this.array[1] + 5
+
+      const frame = Buffer.from(this.array.slice(0, FullMsgLength))
+      // Preserve Extra Data
+      this.array = this.array.slice(frame.length, this.array.length)
+      this.cursor -= FullMsgLength
+      this.push(frame)
+    }
+    cb()
+  }
+}
+
+module.exports = CCTalkParser
diff --git a/node_modules/@serialport/parser-cctalk/package.json b/node_modules/@serialport/parser-cctalk/package.json
new file mode 100644
index 0000000..5bede74
--- /dev/null
+++ b/node_modules/@serialport/parser-cctalk/package.json
@@ -0,0 +1,48 @@
+{
+  "_from": "@serialport/parser-cctalk@^9.0.1",
+  "_id": "@serialport/parser-cctalk@9.0.1",
+  "_inBundle": false,
+  "_integrity": "sha512-GtMda2DeJ+23bNqOc79JYV06dax2n3FLLFM3zA7nfReCOi98QbuDj4TUbFESMOnp4DB0oMO0GYHCR9gHOedTkg==",
+  "_location": "/@serialport/parser-cctalk",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "@serialport/parser-cctalk@^9.0.1",
+    "name": "@serialport/parser-cctalk",
+    "escapedName": "@serialport%2fparser-cctalk",
+    "scope": "@serialport",
+    "rawSpec": "^9.0.1",
+    "saveSpec": null,
+    "fetchSpec": "^9.0.1"
+  },
+  "_requiredBy": [
+    "/serialport"
+  ],
+  "_resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-9.0.1.tgz",
+  "_shasum": "1f1a28e9badfa978ef68bf1fd5fb63d968347de2",
+  "_spec": "@serialport/parser-cctalk@^9.0.1",
+  "_where": "F:\\vent-display\\node_modules\\serialport",
+  "bugs": {
+    "url": "https://github.com/serialport/node-serialport/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "See our api docs https://node-serialport.github.io/node-serialport/CCTalkParser.html",
+  "engines": {
+    "node": ">=8.6.0"
+  },
+  "gitHead": "19fb5f8d2a76854c154c0f89e908a478ee915ee6",
+  "homepage": "https://github.com/serialport/node-serialport#readme",
+  "license": "MIT",
+  "main": "lib",
+  "name": "@serialport/parser-cctalk",
+  "publishConfig": {
+    "access": "public"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/serialport/node-serialport.git"
+  },
+  "version": "9.0.1"
+}
diff --git a/node_modules/@serialport/parser-delimiter/CHANGELOG.md b/node_modules/@serialport/parser-delimiter/CHANGELOG.md
new file mode 100644
index 0000000..dd3f07b
--- /dev/null
+++ b/node_modules/@serialport/parser-delimiter/CHANGELOG.md
@@ -0,0 +1,24 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [9.0.1](https://github.com/serialport/node-serialport/compare/v9.0.0...v9.0.1) (2020-08-08)
+
+**Note:** Version bump only for package @serialport/parser-delimiter
+
+
+
+
+
+# [9.0.0](https://github.com/serialport/node-serialport/compare/v8.0.8...v9.0.0) (2020-05-10)
+
+**Note:** Version bump only for package @serialport/parser-delimiter
+
+
+
+
+
+## [8.0.6](https://github.com/serialport/node-serialport/compare/v8.0.5...v8.0.6) (2019-12-25)
+
+**Note:** Version bump only for package @serialport/parser-delimiter
diff --git a/node_modules/@serialport/parser-delimiter/LICENSE b/node_modules/@serialport/parser-delimiter/LICENSE
new file mode 100644
index 0000000..800d776
--- /dev/null
+++ b/node_modules/@serialport/parser-delimiter/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright 2010 Christopher Williams. All rights reserved.
+
+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/@serialport/parser-delimiter/README.md b/node_modules/@serialport/parser-delimiter/README.md
new file mode 100644
index 0000000..b60cf12
--- /dev/null
+++ b/node_modules/@serialport/parser-delimiter/README.md
@@ -0,0 +1 @@
+See our api docs https://serialport.io/docs/api-parser-delimiter
diff --git a/node_modules/@serialport/parser-delimiter/lib/index.js b/node_modules/@serialport/parser-delimiter/lib/index.js
new file mode 100644
index 0000000..1d10148
--- /dev/null
+++ b/node_modules/@serialport/parser-delimiter/lib/index.js
@@ -0,0 +1,49 @@
+const { Transform } = require('stream')
+
+/**
+ * A transform stream that emits data each time a byte sequence is received.
+ * @extends Transform
+ * @summary To use the `Delimiter` parser, provide a delimiter as a string, buffer, or array of bytes. Runs in O(n) time.
+ * @example
+const SerialPort = require('serialport')
+const Delimiter = require('@serialport/parser-delimiter')
+const port = new SerialPort('/dev/tty-usbserial1')
+const parser = port.pipe(new Delimiter({ delimiter: '\n' }))
+parser.on('data', console.log)
+ */
+class DelimiterParser extends Transform {
+  constructor(options = {}) {
+    super(options)
+
+    if (options.delimiter === undefined) {
+      throw new TypeError('"delimiter" is not a bufferable object')
+    }
+
+    if (options.delimiter.length === 0) {
+      throw new TypeError('"delimiter" has a 0 or undefined length')
+    }
+
+    this.includeDelimiter = options.includeDelimiter !== undefined ? options.includeDelimiter : false
+    this.delimiter = Buffer.from(options.delimiter)
+    this.buffer = Buffer.alloc(0)
+  }
+
+  _transform(chunk, encoding, cb) {
+    let data = Buffer.concat([this.buffer, chunk])
+    let position
+    while ((position = data.indexOf(this.delimiter)) !== -1) {
+      this.push(data.slice(0, position + (this.includeDelimiter ? this.delimiter.length : 0)))
+      data = data.slice(position + this.delimiter.length)
+    }
+    this.buffer = data
+    cb()
+  }
+
+  _flush(cb) {
+    this.push(this.buffer)
+    this.buffer = Buffer.alloc(0)
+    cb()
+  }
+}
+
+module.exports = DelimiterParser
diff --git a/node_modules/@serialport/parser-delimiter/package.json b/node_modules/@serialport/parser-delimiter/package.json
new file mode 100644
index 0000000..4150c76
--- /dev/null
+++ b/node_modules/@serialport/parser-delimiter/package.json
@@ -0,0 +1,49 @@
+{
+  "_from": "@serialport/parser-delimiter@^9.0.1",
+  "_id": "@serialport/parser-delimiter@9.0.1",
+  "_inBundle": false,
+  "_integrity": "sha512-+oaSl5zEu47OlrRiF5p5tn2qgGqYuhVcE+NI+Pv4E1xsNB/A0fFxxMv/8XUw466CRLEJ5IESIB9qbFvKE6ltaQ==",
+  "_location": "/@serialport/parser-delimiter",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "@serialport/parser-delimiter@^9.0.1",
+    "name": "@serialport/parser-delimiter",
+    "escapedName": "@serialport%2fparser-delimiter",
+    "scope": "@serialport",
+    "rawSpec": "^9.0.1",
+    "saveSpec": null,
+    "fetchSpec": "^9.0.1"
+  },
+  "_requiredBy": [
+    "/@serialport/parser-readline",
+    "/serialport"
+  ],
+  "_resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-9.0.1.tgz",
+  "_shasum": "3778663eb8bf8028d77f7677f95aefb52c32cb0d",
+  "_spec": "@serialport/parser-delimiter@^9.0.1",
+  "_where": "F:\\vent-display\\node_modules\\serialport",
+  "bugs": {
+    "url": "https://github.com/serialport/node-serialport/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "See our api docs https://serialport.io/docs/api-parser-delimiter",
+  "engines": {
+    "node": ">=8.6.0"
+  },
+  "gitHead": "19fb5f8d2a76854c154c0f89e908a478ee915ee6",
+  "homepage": "https://github.com/serialport/node-serialport#readme",
+  "license": "MIT",
+  "main": "lib",
+  "name": "@serialport/parser-delimiter",
+  "publishConfig": {
+    "access": "public"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/serialport/node-serialport.git"
+  },
+  "version": "9.0.1"
+}
diff --git a/node_modules/@serialport/parser-readline/CHANGELOG.md b/node_modules/@serialport/parser-readline/CHANGELOG.md
new file mode 100644
index 0000000..f8a58c5
--- /dev/null
+++ b/node_modules/@serialport/parser-readline/CHANGELOG.md
@@ -0,0 +1,24 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [9.0.1](https://github.com/serialport/node-serialport/compare/v9.0.0...v9.0.1) (2020-08-08)
+
+**Note:** Version bump only for package @serialport/parser-readline
+
+
+
+
+
+# [9.0.0](https://github.com/serialport/node-serialport/compare/v8.0.8...v9.0.0) (2020-05-10)
+
+**Note:** Version bump only for package @serialport/parser-readline
+
+
+
+
+
+## [8.0.6](https://github.com/serialport/node-serialport/compare/v8.0.5...v8.0.6) (2019-12-25)
+
+**Note:** Version bump only for package @serialport/parser-readline
diff --git a/node_modules/@serialport/parser-readline/LICENSE b/node_modules/@serialport/parser-readline/LICENSE
new file mode 100644
index 0000000..800d776
--- /dev/null
+++ b/node_modules/@serialport/parser-readline/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright 2010 Christopher Williams. All rights reserved.
+
+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/@serialport/parser-readline/README.md b/node_modules/@serialport/parser-readline/README.md
new file mode 100644
index 0000000..6c9669c
--- /dev/null
+++ b/node_modules/@serialport/parser-readline/README.md
@@ -0,0 +1 @@
+See our api docs See our api docs https://serialport.io/docs/api-parser-readline
diff --git a/node_modules/@serialport/parser-readline/lib/index.js b/node_modules/@serialport/parser-readline/lib/index.js
new file mode 100644
index 0000000..795f608
--- /dev/null
+++ b/node_modules/@serialport/parser-readline/lib/index.js
@@ -0,0 +1,30 @@
+const DelimiterParser = require('@serialport/parser-delimiter')
+
+/**
+ *  A transform stream that emits data after a newline delimiter is received.
+ * @summary To use the `Readline` parser, provide a delimiter (defaults to `\n`). Data is emitted as string controllable by the `encoding` option (defaults to `utf8`).
+ * @extends DelimiterParser
+ * @example
+const SerialPort = require('serialport')
+const Readline = require('@serialport/parser-readline')
+const port = new SerialPort('/dev/tty-usbserial1')
+const parser = port.pipe(new Readline({ delimiter: '\r\n' }))
+parser.on('data', console.log)
+*/
+class ReadLineParser extends DelimiterParser {
+  constructor(options) {
+    const opts = {
+      delimiter: Buffer.from('\n', 'utf8'),
+      encoding: 'utf8',
+      ...options,
+    }
+
+    if (typeof opts.delimiter === 'string') {
+      opts.delimiter = Buffer.from(opts.delimiter, opts.encoding)
+    }
+
+    super(opts)
+  }
+}
+
+module.exports = ReadLineParser
diff --git a/node_modules/@serialport/parser-readline/package.json b/node_modules/@serialport/parser-readline/package.json
new file mode 100644
index 0000000..0c813c0
--- /dev/null
+++ b/node_modules/@serialport/parser-readline/package.json
@@ -0,0 +1,52 @@
+{
+  "_from": "@serialport/parser-readline@^9.0.1",
+  "_id": "@serialport/parser-readline@9.0.1",
+  "_inBundle": false,
+  "_integrity": "sha512-38058gxvyfgdeLpg3aUyD98NuWkVB9yyTLpcSdeQ3GYiupivwH6Tdy/SKPmxlHIw3Ml2qil5MR2mtW2fLPB5CQ==",
+  "_location": "/@serialport/parser-readline",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "@serialport/parser-readline@^9.0.1",
+    "name": "@serialport/parser-readline",
+    "escapedName": "@serialport%2fparser-readline",
+    "scope": "@serialport",
+    "rawSpec": "^9.0.1",
+    "saveSpec": null,
+    "fetchSpec": "^9.0.1"
+  },
+  "_requiredBy": [
+    "/@serialport/bindings",
+    "/serialport"
+  ],
+  "_resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-9.0.1.tgz",
+  "_shasum": "f7c8b6c2cba17e8b20faf59d36f8c7d046887aa9",
+  "_spec": "@serialport/parser-readline@^9.0.1",
+  "_where": "F:\\vent-display\\node_modules\\serialport",
+  "bugs": {
+    "url": "https://github.com/serialport/node-serialport/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "@serialport/parser-delimiter": "^9.0.1"
+  },
+  "deprecated": false,
+  "description": "See our api docs See our api docs https://serialport.io/docs/api-parser-readline",
+  "engines": {
+    "node": ">=8.6.0"
+  },
+  "gitHead": "19fb5f8d2a76854c154c0f89e908a478ee915ee6",
+  "homepage": "https://github.com/serialport/node-serialport#readme",
+  "license": "MIT",
+  "main": "lib",
+  "name": "@serialport/parser-readline",
+  "publishConfig": {
+    "access": "public"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/serialport/node-serialport.git"
+  },
+  "version": "9.0.1"
+}
diff --git a/node_modules/@serialport/parser-ready/CHANGELOG.md b/node_modules/@serialport/parser-ready/CHANGELOG.md
new file mode 100644
index 0000000..8f4fd00
--- /dev/null
+++ b/node_modules/@serialport/parser-ready/CHANGELOG.md
@@ -0,0 +1,24 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [9.0.1](https://github.com/serialport/node-serialport/compare/v9.0.0...v9.0.1) (2020-08-08)
+
+**Note:** Version bump only for package @serialport/parser-ready
+
+
+
+
+
+# [9.0.0](https://github.com/serialport/node-serialport/compare/v8.0.8...v9.0.0) (2020-05-10)
+
+**Note:** Version bump only for package @serialport/parser-ready
+
+
+
+
+
+## [8.0.6](https://github.com/serialport/node-serialport/compare/v8.0.5...v8.0.6) (2019-12-25)
+
+**Note:** Version bump only for package @serialport/parser-ready
diff --git a/node_modules/@serialport/parser-ready/LICENSE b/node_modules/@serialport/parser-ready/LICENSE
new file mode 100644
index 0000000..800d776
--- /dev/null
+++ b/node_modules/@serialport/parser-ready/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright 2010 Christopher Williams. All rights reserved.
+
+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/@serialport/parser-ready/README.md b/node_modules/@serialport/parser-ready/README.md
new file mode 100644
index 0000000..a868a08
--- /dev/null
+++ b/node_modules/@serialport/parser-ready/README.md
@@ -0,0 +1 @@
+See our api docs https://serialport.io/docs/api-parser-ready
diff --git a/node_modules/@serialport/parser-ready/lib/index.js b/node_modules/@serialport/parser-ready/lib/index.js
new file mode 100644
index 0000000..2f74158
--- /dev/null
+++ b/node_modules/@serialport/parser-ready/lib/index.js
@@ -0,0 +1,63 @@
+const { Transform } = require('stream')
+
+/**
+ * A transform stream that waits for a sequence of "ready" bytes before emitting a ready event and emitting data events
+ * @summary To use the `Ready` parser provide a byte start sequence. After the bytes have been received a ready event is fired and data events are passed through.
+ * @extends Transform
+ * @example
+const SerialPort = require('serialport')
+const Ready = require('@serialport/parser-ready')
+const port = new SerialPort('/dev/tty-usbserial1')
+const parser = port.pipe(new Ready({ delimiter: 'READY' }))
+parser.on('ready', () => console.log('the ready byte sequence has been received'))
+parser.on('data', console.log) // all data after READY is received
+ */
+class ReadyParser extends Transform {
+  /**
+   *
+   * @param {object} options options for the parser
+   * @param {string|Buffer|array} options.delimiter data to look for before emitted "ready"
+   */
+  constructor(options = {}) {
+    if (options.delimiter === undefined) {
+      throw new TypeError('"delimiter" is not a bufferable object')
+    }
+
+    if (options.delimiter.length === 0) {
+      throw new TypeError('"delimiter" has a 0 or undefined length')
+    }
+
+    super(options)
+    this.delimiter = Buffer.from(options.delimiter)
+    this.readOffset = 0
+    this.ready = false
+  }
+
+  _transform(chunk, encoding, cb) {
+    if (this.ready) {
+      this.push(chunk)
+      return cb()
+    }
+    const delimiter = this.delimiter
+    let chunkOffset = 0
+    while (this.readOffset < delimiter.length && chunkOffset < chunk.length) {
+      if (delimiter[this.readOffset] === chunk[chunkOffset]) {
+        this.readOffset++
+      } else {
+        this.readOffset = 0
+      }
+      chunkOffset++
+    }
+    if (this.readOffset === delimiter.length) {
+      this.ready = true
+      this.emit('ready')
+      const chunkRest = chunk.slice(chunkOffset)
+      if (chunkRest.length > 0) {
+        this.push(chunkRest)
+      }
+    }
+    cb()
+  }
+}
+
+module.exports = ReadyParser
diff --git a/node_modules/@serialport/parser-ready/package.json b/node_modules/@serialport/parser-ready/package.json
new file mode 100644
index 0000000..47d40e6
--- /dev/null
+++ b/node_modules/@serialport/parser-ready/package.json
@@ -0,0 +1,48 @@
+{
+  "_from": "@serialport/parser-ready@^9.0.1",
+  "_id": "@serialport/parser-ready@9.0.1",
+  "_inBundle": false,
+  "_integrity": "sha512-lgzGkVJaaV1rJVx26WwI2UKyPxc0vu1rsOeldzA3VVbF+ABrblUQA06+cRPpT6k96GY+X4+1fB1rWuPpt8HbgQ==",
+  "_location": "/@serialport/parser-ready",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "@serialport/parser-ready@^9.0.1",
+    "name": "@serialport/parser-ready",
+    "escapedName": "@serialport%2fparser-ready",
+    "scope": "@serialport",
+    "rawSpec": "^9.0.1",
+    "saveSpec": null,
+    "fetchSpec": "^9.0.1"
+  },
+  "_requiredBy": [
+    "/serialport"
+  ],
+  "_resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-9.0.1.tgz",
+  "_shasum": "3d1c7319f0de8077f490238dde13aeff59f6da22",
+  "_spec": "@serialport/parser-ready@^9.0.1",
+  "_where": "F:\\vent-display\\node_modules\\serialport",
+  "bugs": {
+    "url": "https://github.com/serialport/node-serialport/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "See our api docs https://serialport.io/docs/api-parser-ready",
+  "engines": {
+    "node": ">=8.6.0"
+  },
+  "gitHead": "19fb5f8d2a76854c154c0f89e908a478ee915ee6",
+  "homepage": "https://github.com/serialport/node-serialport#readme",
+  "license": "MIT",
+  "main": "lib",
+  "name": "@serialport/parser-ready",
+  "publishConfig": {
+    "access": "public"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/serialport/node-serialport.git"
+  },
+  "version": "9.0.1"
+}
diff --git a/node_modules/@serialport/parser-regex/CHANGELOG.md b/node_modules/@serialport/parser-regex/CHANGELOG.md
new file mode 100644
index 0000000..5150d72
--- /dev/null
+++ b/node_modules/@serialport/parser-regex/CHANGELOG.md
@@ -0,0 +1,24 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [9.0.1](https://github.com/serialport/node-serialport/compare/v9.0.0...v9.0.1) (2020-08-08)
+
+**Note:** Version bump only for package @serialport/parser-regex
+
+
+
+
+
+# [9.0.0](https://github.com/serialport/node-serialport/compare/v8.0.8...v9.0.0) (2020-05-10)
+
+**Note:** Version bump only for package @serialport/parser-regex
+
+
+
+
+
+## [8.0.6](https://github.com/serialport/node-serialport/compare/v8.0.5...v8.0.6) (2019-12-25)
+
+**Note:** Version bump only for package @serialport/parser-regex
diff --git a/node_modules/@serialport/parser-regex/LICENSE b/node_modules/@serialport/parser-regex/LICENSE
new file mode 100644
index 0000000..800d776
--- /dev/null
+++ b/node_modules/@serialport/parser-regex/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright 2010 Christopher Williams. All rights reserved.
+
+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/@serialport/parser-regex/README.md b/node_modules/@serialport/parser-regex/README.md
new file mode 100644
index 0000000..bba891c
--- /dev/null
+++ b/node_modules/@serialport/parser-regex/README.md
@@ -0,0 +1 @@
+See our api docs https://serialport.io/docs/api-parser-regex
diff --git a/node_modules/@serialport/parser-regex/lib/index.js b/node_modules/@serialport/parser-regex/lib/index.js
new file mode 100644
index 0000000..ad7175e
--- /dev/null
+++ b/node_modules/@serialport/parser-regex/lib/index.js
@@ -0,0 +1,53 @@
+const { Transform } = require('stream')
+
+/**
+ * A transform stream that uses a regular expression to split the incoming text upon.
+ *
+ * To use the `Regex` parser provide a regular expression to split the incoming text upon. Data is emitted as string controllable by the `encoding` option (defaults to `utf8`).
+ * @extends Transform
+ * @example
+const SerialPort = require('serialport')
+const Regex = require('@serialport/parser-regex')
+const port = new SerialPort('/dev/tty-usbserial1')
+const parser = port.pipe(new Regex({ regex: /[\r\n]+/ }))
+parser.on('data', console.log)
+ */
+class RegexParser extends Transform {
+  constructor(options) {
+    const opts = {
+      encoding: 'utf8',
+      ...options,
+    }
+
+    if (opts.regex === undefined) {
+      throw new TypeError('"options.regex" must be a regular expression pattern or object')
+    }
+
+    if (!(opts.regex instanceof RegExp)) {
+      opts.regex = new RegExp(opts.regex)
+    }
+    super(opts)
+
+    this.regex = opts.regex
+    this.data = ''
+  }
+
+  _transform(chunk, encoding, cb) {
+    const data = this.data + chunk
+    const parts = data.split(this.regex)
+    this.data = parts.pop()
+
+    parts.forEach(part => {
+      this.push(part)
+    })
+    cb()
+  }
+
+  _flush(cb) {
+    this.push(this.data)
+    this.data = ''
+    cb()
+  }
+}
+
+module.exports = RegexParser
diff --git a/node_modules/@serialport/parser-regex/package.json b/node_modules/@serialport/parser-regex/package.json
new file mode 100644
index 0000000..d1694e8
--- /dev/null
+++ b/node_modules/@serialport/parser-regex/package.json
@@ -0,0 +1,48 @@
+{
+  "_from": "@serialport/parser-regex@^9.0.1",
+  "_id": "@serialport/parser-regex@9.0.1",
+  "_inBundle": false,
+  "_integrity": "sha512-BHTV+Lkl+J8hSecFtDRENaR4fgA6tw44J+dmA1vEKEyum0iDN4bihbu8yvztYyo4PhBGUKDfm/PnD5EkJm0dPA==",
+  "_location": "/@serialport/parser-regex",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "@serialport/parser-regex@^9.0.1",
+    "name": "@serialport/parser-regex",
+    "escapedName": "@serialport%2fparser-regex",
+    "scope": "@serialport",
+    "rawSpec": "^9.0.1",
+    "saveSpec": null,
+    "fetchSpec": "^9.0.1"
+  },
+  "_requiredBy": [
+    "/serialport"
+  ],
+  "_resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-9.0.1.tgz",
+  "_shasum": "b1470c385ff9f9341e0c202a4d08d4cd600829da",
+  "_spec": "@serialport/parser-regex@^9.0.1",
+  "_where": "F:\\vent-display\\node_modules\\serialport",
+  "bugs": {
+    "url": "https://github.com/serialport/node-serialport/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "See our api docs https://serialport.io/docs/api-parser-regex",
+  "engines": {
+    "node": ">=8.6.0"
+  },
+  "gitHead": "19fb5f8d2a76854c154c0f89e908a478ee915ee6",
+  "homepage": "https://github.com/serialport/node-serialport#readme",
+  "license": "MIT",
+  "main": "lib",
+  "name": "@serialport/parser-regex",
+  "publishConfig": {
+    "access": "public"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/serialport/node-serialport.git"
+  },
+  "version": "9.0.1"
+}
diff --git a/node_modules/@serialport/stream/CHANGELOG.md b/node_modules/@serialport/stream/CHANGELOG.md
new file mode 100644
index 0000000..d776d33
--- /dev/null
+++ b/node_modules/@serialport/stream/CHANGELOG.md
@@ -0,0 +1,36 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [9.0.2](https://github.com/serialport/node-serialport/compare/v9.0.1...v9.0.2) (2020-10-16)
+
+**Note:** Version bump only for package @serialport/stream
+
+
+
+
+
+## [9.0.1](https://github.com/serialport/node-serialport/compare/v9.0.0...v9.0.1) (2020-08-08)
+
+**Note:** Version bump only for package @serialport/stream
+
+
+
+
+
+# [9.0.0](https://github.com/serialport/node-serialport/compare/v8.0.8...v9.0.0) (2020-05-10)
+
+**Note:** Version bump only for package @serialport/stream
+
+
+
+
+
+## [8.0.6](https://github.com/serialport/node-serialport/compare/v8.0.5...v8.0.6) (2019-12-25)
+
+
+### Bug Fixes
+
+* bindings.close() should cause a canceled read error ([#1972](https://github.com/serialport/node-serialport/issues/1972)) ([50f967e](https://github.com/serialport/node-serialport/commit/50f967e788f362da57d782829712542c8f15f8c8))
+* stream required bindings-mock as a dep ([#1970](https://github.com/serialport/node-serialport/issues/1970)) ([e978b7e](https://github.com/serialport/node-serialport/commit/e978b7eb244b87a6be2ae914965adeb1f4562935))
diff --git a/node_modules/@serialport/stream/LICENSE b/node_modules/@serialport/stream/LICENSE
new file mode 100644
index 0000000..800d776
--- /dev/null
+++ b/node_modules/@serialport/stream/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright 2010 Christopher Williams. All rights reserved.
+
+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/@serialport/stream/README.md b/node_modules/@serialport/stream/README.md
new file mode 100644
index 0000000..d568e96
--- /dev/null
+++ b/node_modules/@serialport/stream/README.md
@@ -0,0 +1,16 @@
+# @serialport/Stream
+
+The serialport stream interface. This package requires bindings to work.
+
+You'd use this if you want to keep your package size down by requiring only the parts of serialport that you want to use. It is used internally in the `serialport` package.
+
+This is how you use it.
+```js
+
+const SerialPort = require('@serialport/stream')
+const Binding = require('@serialport/bindings')
+SerialPort.Binding = Binding
+const port = new Serialport('/dev/ttyay')
+```
+
+Learn more at our [stream documentation](https://serialport.io/docs/api-stream) page.
diff --git a/node_modules/@serialport/stream/lib/index.js b/node_modules/@serialport/stream/lib/index.js
new file mode 100644
index 0000000..92b042c
--- /dev/null
+++ b/node_modules/@serialport/stream/lib/index.js
@@ -0,0 +1,656 @@
+const stream = require('stream')
+const util = require('util')
+const debug = require('debug')('serialport/stream')
+
+//  VALIDATION
+const DATABITS = Object.freeze([5, 6, 7, 8])
+const STOPBITS = Object.freeze([1, 1.5, 2])
+const PARITY = Object.freeze(['none', 'even', 'mark', 'odd', 'space'])
+const FLOWCONTROLS = Object.freeze(['xon', 'xoff', 'xany', 'rtscts'])
+
+const defaultSettings = Object.freeze({
+  autoOpen: true,
+  endOnClose: false,
+  baudRate: 9600,
+  dataBits: 8,
+  hupcl: true,
+  lock: true,
+  parity: 'none',
+  rtscts: false,
+  stopBits: 1,
+  xany: false,
+  xoff: false,
+  xon: false,
+  highWaterMark: 64 * 1024,
+})
+
+const defaultSetFlags = Object.freeze({
+  brk: false,
+  cts: false,
+  dtr: true,
+  dts: false,
+  rts: true,
+})
+
+function allocNewReadPool(poolSize) {
+  const pool = Buffer.allocUnsafe(poolSize)
+  pool.used = 0
+  return pool
+}
+
+/**
+ * A callback called with an error or null.
+ * @typedef {function} errorCallback
+ * @param {?error} error
+ */
+
+/**
+ * A callback called with an error or an object with the modem line values (cts, dsr, dcd).
+ * @typedef {function} modemBitsCallback
+ * @param {?error} error
+ * @param {?object} status
+ * @param {boolean} [status.cts=false]
+ * @param {boolean} [status.dsr=false]
+ * @param {boolean} [status.dcd=false]
+ */
+
+/**
+ * @typedef {Object} openOptions
+ * @property {boolean} [autoOpen=true] Automatically opens the port on `nextTick`.
+ * @property {number=} [baudRate=9600] The baud rate of the port to be opened. This should match one of the commonly available baud rates, such as 110, 300, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, or 115200. Custom rates are supported best effort per platform. The device connected to the serial port is not guaranteed to support the requested baud rate, even if the port itself supports that baud rate.
+ * @property {number} [dataBits=8] Must be one of these: 8, 7, 6, or 5.
+ * @property {number} [highWaterMark=65536] The size of the read and write buffers defaults to 64k.
+ * @property {boolean} [lock=true] Prevent other processes from opening the port. Windows does not currently support `false`.
+ * @property {number} [stopBits=1] Must be one of these: 1 or 2.
+ * @property {string} [parity=none] Must be one of these: 'none', 'even', 'mark', 'odd', 'space'.
+ * @property {boolean} [rtscts=false] flow control setting
+ * @property {boolean} [xon=false] flow control setting
+ * @property {boolean} [xoff=false] flow control setting
+ * @property {boolean} [xany=false] flow control setting
+ * @property {object=} bindingOptions sets binding-specific options
+ * @property {Binding=} binding The hardware access binding. `Bindings` are how Node-Serialport talks to the underlying system. By default we auto detect Windows (`WindowsBinding`), Linux (`LinuxBinding`) and OS X (`DarwinBinding`) and load the appropriate module for your system.
+ * @property {number} [bindingOptions.vmin=1] see [`man termios`](http://linux.die.net/man/3/termios) LinuxBinding and DarwinBinding
+ * @property {number} [bindingOptions.vtime=0] see [`man termios`](http://linux.die.net/man/3/termios) LinuxBinding and DarwinBinding
+ */
+
+/**
+ * Create a new serial port object for the `path`. In the case of invalid arguments or invalid options, when constructing a new SerialPort it will throw an error. The port will open automatically by default, which is the equivalent of calling `port.open(openCallback)` in the next tick. You can disable this by setting the option `autoOpen` to `false`.
+ * @class SerialPort
+ * @param {string} path - The system path of the serial port you want to open. For example, `/dev/tty.XXX` on Mac/Linux, or `COM1` on Windows.
+ * @param {openOptions=} options - Port configuration options
+ * @param {errorCallback=} openCallback - Called after a connection is opened. If this is not provided and an error occurs, it will be emitted on the port's `error` event. The callback will NOT be called if `autoOpen` is set to `false` in the `openOptions` as the open will not be performed.
+ * @property {number} baudRate The port's baudRate. Use `.update` to change it. Read-only.
+ * @property {object} binding The binding object backing the port. Read-only.
+ * @property {boolean} isOpen `true` if the port is open, `false` otherwise. Read-only. (`since 5.0.0`)
+ * @property {string} path The system path or name of the serial port. Read-only.
+ * @throws {TypeError} When given invalid arguments, a `TypeError` will be thrown.
+ * @emits open
+ * @emits data
+ * @emits close
+ * @emits error
+ * @alias module:serialport
+ */
+function SerialPort(path, options, openCallback) {
+  if (!(this instanceof SerialPort)) {
+    return new SerialPort(path, options, openCallback)
+  }
+
+  if (options instanceof Function) {
+    openCallback = options
+    options = {}
+  }
+
+  const settings = { ...defaultSettings, ...options }
+
+  stream.Duplex.call(this, {
+    highWaterMark: settings.highWaterMark,
+  })
+
+  const Binding = settings.binding || SerialPort.Binding
+
+  if (!Binding) {
+    throw new TypeError('"Bindings" is invalid pass it as `options.binding` or set it on `SerialPort.Binding`')
+  }
+
+  if (!path) {
+    throw new TypeError(`"path" is not defined: ${path}`)
+  }
+
+  if (settings.baudrate) {
+    throw new TypeError(`"baudrate" is an unknown option, did you mean "baudRate"?`)
+  }
+
+  if (typeof settings.baudRate !== 'number') {
+    throw new TypeError(`"baudRate" must be a number: ${settings.baudRate}`)
+  }
+
+  if (DATABITS.indexOf(settings.dataBits) === -1) {
+    throw new TypeError(`"databits" is invalid: ${settings.dataBits}`)
+  }
+
+  if (STOPBITS.indexOf(settings.stopBits) === -1) {
+    throw new TypeError(`"stopbits" is invalid: ${settings.stopbits}`)
+  }
+
+  if (PARITY.indexOf(settings.parity) === -1) {
+    throw new TypeError(`"parity" is invalid: ${settings.parity}`)
+  }
+
+  FLOWCONTROLS.forEach(control => {
+    if (typeof settings[control] !== 'boolean') {
+      throw new TypeError(`"${control}" is not boolean: ${settings[control]}`)
+    }
+  })
+
+  const binding = new Binding({
+    bindingOptions: settings.bindingOptions,
+  })
+
+  Object.defineProperties(this, {
+    binding: {
+      enumerable: true,
+      value: binding,
+    },
+    path: {
+      enumerable: true,
+      value: path,
+    },
+    settings: {
+      enumerable: true,
+      value: settings,
+    },
+  })
+
+  this.opening = false
+  this.closing = false
+  this._pool = allocNewReadPool(this.settings.highWaterMark)
+  this._kMinPoolSpace = 128
+
+  if (this.settings.autoOpen) {
+    this.open(openCallback)
+  }
+}
+
+util.inherits(SerialPort, stream.Duplex)
+
+Object.defineProperties(SerialPort.prototype, {
+  isOpen: {
+    enumerable: true,
+    get() {
+      return this.binding.isOpen && !this.closing
+    },
+  },
+  baudRate: {
+    enumerable: true,
+    get() {
+      return this.settings.baudRate
+    },
+  },
+})
+
+/**
+ * The `error` event's callback is called with an error object whenever there is an error.
+ * @event error
+ */
+
+SerialPort.prototype._error = function (error, callback) {
+  if (callback) {
+    callback.call(this, error)
+  } else {
+    this.emit('error', error)
+  }
+}
+
+SerialPort.prototype._asyncError = function (error, callback) {
+  process.nextTick(() => this._error(error, callback))
+}
+
+/**
+ * The `open` event's callback is called with no arguments when the port is opened and ready for writing. This happens if you have the constructor open immediately (which opens in the next tick) or if you open the port manually with `open()`. See [Useage/Opening a Port](#opening-a-port) for more information.
+ * @event open
+ */
+
+/**
+ * Opens a connection to the given serial port.
+ * @param {errorCallback=} openCallback - Called after a connection is opened. If this is not provided and an error occurs, it will be emitted on the port's `error` event.
+ * @emits open
+ * @returns {undefined}
+ */
+SerialPort.prototype.open = function (openCallback) {
+  if (this.isOpen) {
+    return this._asyncError(new Error('Port is already open'), openCallback)
+  }
+
+  if (this.opening) {
+    return this._asyncError(new Error('Port is opening'), openCallback)
+  }
+
+  this.opening = true
+  debug('opening', `path: ${this.path}`)
+  this.binding.open(this.path, this.settings).then(
+    () => {
+      debug('opened', `path: ${this.path}`)
+      this.opening = false
+      this.emit('open')
+      if (openCallback) {
+        openCallback.call(this, null)
+      }
+    },
+    err => {
+      this.opening = false
+      debug('Binding #open had an error', err)
+      this._error(err, openCallback)
+    }
+  )
+}
+
+/**
+ * Changes the baud rate for an open port. Throws if you provide a bad argument. Emits an error or calls the callback if the baud rate isn't supported.
+ * @param {object=} options Only supports `baudRate`.
+ * @param {number=} [options.baudRate] The baud rate of the port to be opened. This should match one of the commonly available baud rates, such as 110, 300, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, or 115200. Custom rates are supported best effort per platform. The device connected to the serial port is not guaranteed to support the requested baud rate, even if the port itself supports that baud rate.
+ * @param {errorCallback=} [callback] Called once the port's baud rate changes. If `.update` is called without a callback, and there is an error, an error event is emitted.
+ * @returns {undefined}
+ */
+SerialPort.prototype.update = function (options, callback) {
+  if (typeof options !== 'object') {
+    throw TypeError('"options" is not an object')
+  }
+
+  if (!this.isOpen) {
+    debug('update attempted, but port is not open')
+    return this._asyncError(new Error('Port is not open'), callback)
+  }
+
+  const settings = { ...defaultSettings, ...options }
+  this.settings.baudRate = settings.baudRate
+
+  debug('update', `baudRate: ${settings.baudRate}`)
+  this.binding.update(this.settings).then(
+    () => {
+      debug('binding.update', 'finished')
+      if (callback) {
+        callback.call(this, null)
+      }
+    },
+    err => {
+      debug('binding.update', 'error', err)
+      return this._error(err, callback)
+    }
+  )
+}
+
+/**
+ * Writes data to the given serial port. Buffers written data if the port is not open.
+
+The write operation is non-blocking. When it returns, data might still not have been written to the serial port. See `drain()`.
+
+Some devices, like the Arduino, reset when you open a connection to them. In such cases, immediately writing to the device will cause lost data as they wont be ready to receive the data. This is often worked around by having the Arduino send a "ready" byte that your Node program waits for before writing. You can also often get away with waiting around 400ms.
+
+If a port is disconnected during a write, the write will error in addition to the `close` event.
+
+From the [stream docs](https://nodejs.org/api/stream.html#stream_writable_write_chunk_encoding_callback) write errors don't always provide the error in the callback, sometimes they use the error event.
+> If an error occurs, the callback may or may not be called with the error as its first argument. To reliably detect write errors, add a listener for the 'error' event.
+
+In addition to the usual `stream.write` arguments (`String` and `Buffer`), `write()` can accept arrays of bytes (positive numbers under 256) which is passed to `Buffer.from([])` for conversion. This extra functionality is pretty sweet.
+ * @method SerialPort.prototype.write
+ * @param  {(string|array|buffer)} data Accepts a [`Buffer`](http://nodejs.org/api/buffer.html) object, or a type that is accepted by the `Buffer` constructor (e.g. an array of bytes or a string).
+ * @param  {string=} encoding The encoding, if chunk is a string. Defaults to `'utf8'`. Also accepts `'ascii'`, `'base64'`, `'binary'`, and `'hex'` See [Buffers and Character Encodings](https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings) for all available options.
+ * @param  {function=} callback Called once the write operation finishes. Data may not yet be flushed to the underlying port. No arguments.
+ * @returns {boolean} `false` if the stream wishes for the calling code to wait for the `'drain'` event to be emitted before continuing to write additional data; otherwise `true`.
+ * @since 5.0.0
+ */
+const superWrite = SerialPort.prototype.write
+SerialPort.prototype.write = function (data, encoding, callback) {
+  if (Array.isArray(data)) {
+    data = Buffer.from(data)
+  }
+  return superWrite.call(this, data, encoding, callback)
+}
+
+SerialPort.prototype._write = function (data, encoding, callback) {
+  if (!this.isOpen) {
+    return this.once('open', function afterOpenWrite() {
+      this._write(data, encoding, callback)
+    })
+  }
+  debug('_write', `${data.length} bytes of data`)
+  this.binding.write(data).then(
+    () => {
+      debug('binding.write', 'write finished')
+      callback(null)
+    },
+    err => {
+      debug('binding.write', 'error', err)
+      if (!err.canceled) {
+        this._disconnected(err)
+      }
+      callback(err)
+    }
+  )
+}
+
+SerialPort.prototype._writev = function (data, callback) {
+  debug('_writev', `${data.length} chunks of data`)
+  const dataV = data.map(write => write.chunk)
+  this._write(Buffer.concat(dataV), null, callback)
+}
+
+/**
+ * Request a number of bytes from the SerialPort. The `read()` method pulls some data out of the internal buffer and returns it. If no data is available to be read, null is returned. By default, the data is returned as a `Buffer` object unless an encoding has been specified using the `.setEncoding()` method.
+ * @method SerialPort.prototype.read
+ * @param {number=} size Specify how many bytes of data to return, if available
+ * @returns {(string|Buffer|null)} The data from internal buffers
+ * @since 5.0.0
+ */
+
+/**
+ * Listening for the `data` event puts the port in flowing mode. Data is emitted as soon as it's received. Data is a `Buffer` object with a varying amount of data in it. The `readLine` parser converts the data into string lines. See the [parsers](https://serialport.io/docs/api-parsers-overview) section for more information on parsers, and the [Node.js stream documentation](https://nodejs.org/api/stream.html#stream_event_data) for more information on the data event.
+ * @event data
+ */
+
+SerialPort.prototype._read = function (bytesToRead) {
+  if (!this.isOpen) {
+    debug('_read', 'queueing _read for after open')
+    this.once('open', () => {
+      this._read(bytesToRead)
+    })
+    return
+  }
+
+  if (!this._pool || this._pool.length - this._pool.used < this._kMinPoolSpace) {
+    debug('_read', 'discarding the read buffer pool because it is below kMinPoolSpace')
+    this._pool = allocNewReadPool(this.settings.highWaterMark)
+  }
+
+  // Grab another reference to the pool in the case that while we're
+  // in the thread pool another read() finishes up the pool, and
+  // allocates a new one.
+  const pool = this._pool
+  // Read the smaller of rest of the pool or however many bytes we want
+  const toRead = Math.min(pool.length - pool.used, bytesToRead)
+  const start = pool.used
+
+  // the actual read.
+  debug('_read', `reading`, { start, toRead })
+  this.binding.read(pool, start, toRead).then(
+    ({ bytesRead }) => {
+      debug('binding.read', `finished`, { bytesRead })
+      // zero bytes means read means we've hit EOF? Maybe this should be an error
+      if (bytesRead === 0) {
+        debug('binding.read', 'Zero bytes read closing readable stream')
+        this.push(null)
+        return
+      }
+      pool.used += bytesRead
+      this.push(pool.slice(start, start + bytesRead))
+    },
+    err => {
+      debug('binding.read', `error`, err)
+      if (!err.canceled) {
+        this._disconnected(err)
+      }
+      this._read(bytesToRead) // prime to read more once we're reconnected
+    }
+  )
+}
+
+SerialPort.prototype._disconnected = function (err) {
+  if (!this.isOpen) {
+    debug('disconnected aborted because already closed', err)
+    return
+  }
+  debug('disconnected', err)
+  err.disconnected = true
+  this.close(null, err)
+}
+
+/**
+ * The `close` event's callback is called with no arguments when the port is closed. In the case of a disconnect it will be called with a Disconnect Error object (`err.disconnected == true`). In the event of a close error (unlikely), an error event is triggered.
+ * @event close
+ */
+
+/**
+ * Closes an open connection.
+ *
+ * If there are in progress writes when the port is closed the writes will error.
+ * @param {errorCallback} callback Called once a connection is closed.
+ * @param {Error} disconnectError used internally to propagate a disconnect error
+ * @emits close
+ * @returns {undefined}
+ */
+SerialPort.prototype.close = function (callback, disconnectError) {
+  disconnectError = disconnectError || null
+
+  if (!this.isOpen) {
+    debug('close attempted, but port is not open')
+    return this._asyncError(new Error('Port is not open'), callback)
+  }
+
+  this.closing = true
+  debug('#close')
+  this.binding.close().then(
+    () => {
+      this.closing = false
+      debug('binding.close', 'finished')
+      this.emit('close', disconnectError)
+      if (this.settings.endOnClose) {
+        this.emit('end')
+      }
+      if (callback) {
+        callback.call(this, disconnectError)
+      }
+    },
+    err => {
+      this.closing = false
+      debug('binding.close', 'had an error', err)
+      return this._error(err, callback)
+    }
+  )
+}
+
+/**
+ * Set control flags on an open port. Uses [`SetCommMask`](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363257(v=vs.85).aspx) for Windows and [`ioctl`](http://linux.die.net/man/4/tty_ioctl) for OS X and Linux.
+ * @param {object=} options All options are operating system default when the port is opened. Every flag is set on each call to the provided or default values. If options isn't provided default options is used.
+ * @param {Boolean} [options.brk=false] sets the brk flag
+ * @param {Boolean} [options.cts=false] sets the cts flag
+ * @param {Boolean} [options.dsr=false] sets the dsr flag
+ * @param {Boolean} [options.dtr=true] sets the dtr flag
+ * @param {Boolean} [options.rts=true] sets the rts flag
+ * @param {errorCallback=} callback Called once the port's flags have been set.
+ * @since 5.0.0
+ * @returns {undefined}
+ */
+SerialPort.prototype.set = function (options, callback) {
+  if (typeof options !== 'object') {
+    throw TypeError('"options" is not an object')
+  }
+
+  if (!this.isOpen) {
+    debug('set attempted, but port is not open')
+    return this._asyncError(new Error('Port is not open'), callback)
+  }
+
+  const settings = { ...defaultSetFlags, ...options }
+  debug('#set', settings)
+  this.binding.set(settings).then(
+    () => {
+      debug('binding.set', 'finished')
+      if (callback) {
+        callback.call(this, null)
+      }
+    },
+    err => {
+      debug('binding.set', 'had an error', err)
+      return this._error(err, callback)
+    }
+  )
+}
+
+/**
+ * Returns the control flags (CTS, DSR, DCD) on the open port.
+ * Uses [`GetCommModemStatus`](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363258(v=vs.85).aspx) for Windows and [`ioctl`](http://linux.die.net/man/4/tty_ioctl) for mac and linux.
+ * @param {modemBitsCallback=} callback Called once the modem bits are retrieved.
+ * @returns {undefined}
+ */
+SerialPort.prototype.get = function (callback) {
+  if (!this.isOpen) {
+    debug('get attempted, but port is not open')
+    return this._asyncError(new Error('Port is not open'), callback)
+  }
+
+  debug('#get')
+  this.binding.get().then(
+    status => {
+      debug('binding.get', 'finished')
+      if (callback) {
+        callback.call(this, null, status)
+      }
+    },
+    err => {
+      debug('binding.get', 'had an error', err)
+      return this._error(err, callback)
+    }
+  )
+}
+
+/**
+ * Flush discards data received but not read, and written but not transmitted by the operating system. For more technical details, see [`tcflush(fd, TCIOFLUSH)`](http://linux.die.net/man/3/tcflush) for Mac/Linux and [`FlushFileBuffers`](http://msdn.microsoft.com/en-us/library/windows/desktop/aa364439) for Windows.
+ * @param  {errorCallback=} callback Called once the flush operation finishes.
+ * @returns {undefined}
+ */
+SerialPort.prototype.flush = function (callback) {
+  if (!this.isOpen) {
+    debug('flush attempted, but port is not open')
+    return this._asyncError(new Error('Port is not open'), callback)
+  }
+
+  debug('#flush')
+  this.binding.flush().then(
+    () => {
+      debug('binding.flush', 'finished')
+      if (callback) {
+        callback.call(this, null)
+      }
+    },
+    err => {
+      debug('binding.flush', 'had an error', err)
+      return this._error(err, callback)
+    }
+  )
+}
+
+/**
+ * Waits until all output data is transmitted to the serial port. After any pending write has completed it calls [`tcdrain()`](http://linux.die.net/man/3/tcdrain) or [FlushFileBuffers()](https://msdn.microsoft.com/en-us/library/windows/desktop/aa364439(v=vs.85).aspx) to ensure it has been written to the device.
+ * @param {errorCallback=} callback Called once the drain operation returns.
+ * @returns {undefined}
+ * @example
+Write the `data` and wait until it has finished transmitting to the target serial port before calling the callback. This will queue until the port is open and writes are finished.
+
+```js
+function writeAndDrain (data, callback) {
+  port.write(data);
+  port.drain(callback);
+}
+```
+ */
+SerialPort.prototype.drain = function (callback) {
+  debug('drain')
+  if (!this.isOpen) {
+    debug('drain queuing on port open')
+    return this.once('open', () => {
+      this.drain(callback)
+    })
+  }
+  this.binding.drain().then(
+    () => {
+      debug('binding.drain', 'finished')
+      if (callback) {
+        callback.call(this, null)
+      }
+    },
+    err => {
+      debug('binding.drain', 'had an error', err)
+      return this._error(err, callback)
+    }
+  )
+}
+
+/**
+ * The `pause()` method causes a stream in flowing mode to stop emitting 'data' events, switching out of flowing mode. Any data that becomes available remains in the internal buffer.
+ * @method SerialPort.prototype.pause
+ * @see resume
+ * @since 5.0.0
+ * @returns `this`
+ */
+
+/**
+ * The `resume()` method causes an explicitly paused, `Readable` stream to resume emitting 'data' events, switching the stream into flowing mode.
+ * @method SerialPort.prototype.resume
+ * @see pause
+ * @since 5.0.0
+ * @returns `this`
+ */
+
+/**
+ * Retrieves a list of available serial ports with metadata. Only the `path` is guaranteed. If unavailable the other fields will be undefined. The `path` is either the path or an identifier (eg `COM1`) used to open the SerialPort.
+ *
+ * We make an effort to identify the hardware attached and have consistent results between systems. Linux and OS X are mostly consistent. Windows relies on 3rd party device drivers for the information and is unable to guarantee the information. On windows If you have a USB connected device can we provide a serial number otherwise it will be `undefined`. The `pnpId` and `locationId` are not the same or present on all systems. The examples below were run with the same Arduino Uno.
+ * @type {function}
+ * @returns {Promise} Resolves with the list of available serial ports.
+ * @example
+```js
+// OSX example port
+{
+  path: '/dev/tty.usbmodem1421',
+  manufacturer: 'Arduino (www.arduino.cc)',
+  serialNumber: '752303138333518011C1',
+  pnpId: undefined,
+  locationId: '14500000',
+  productId: '0043',
+  vendorId: '2341'
+}
+
+// Linux example port
+{
+  path: '/dev/ttyACM0',
+  manufacturer: 'Arduino (www.arduino.cc)',
+  serialNumber: '752303138333518011C1',
+  pnpId: 'usb-Arduino__www.arduino.cc__0043_752303138333518011C1-if00',
+  locationId: undefined,
+  productId: '0043',
+  vendorId: '2341'
+}
+
+// Windows example port
+{
+  path: 'COM3',
+  manufacturer: 'Arduino LLC (www.arduino.cc)',
+  serialNumber: '752303138333518011C1',
+  pnpId: 'USB\\VID_2341&PID_0043\\752303138333518011C1',
+  locationId: 'Port_#0003.Hub_#0001',
+  productId: '0043',
+  vendorId: '2341'
+}
+```
+
+```js
+var SerialPort = require('serialport');
+
+// promise approach
+SerialPort.list()
+  .then(ports) {...});
+  .catch(err) {...});
+```
+ */
+SerialPort.list = async function (callback) {
+  debug('.list')
+  if (!SerialPort.Binding) {
+    throw new TypeError('No Binding set on `SerialPort.Binding`')
+  }
+  if (callback) {
+    throw new TypeError('SerialPort.list no longer takes a callback and only returns a promise')
+  }
+  return SerialPort.Binding.list()
+}
+
+module.exports = SerialPort
diff --git a/node_modules/@serialport/stream/package.json b/node_modules/@serialport/stream/package.json
new file mode 100644
index 0000000..396448f
--- /dev/null
+++ b/node_modules/@serialport/stream/package.json
@@ -0,0 +1,54 @@
+{
+  "_from": "@serialport/stream@^9.0.2",
+  "_id": "@serialport/stream@9.0.2",
+  "_inBundle": false,
+  "_integrity": "sha512-0RkVe+gvwZu/PPfbb7ExQ+euGoCTGKD/B8TQ5fuhe+eKk1sh73RwjKmu9gp6veSNqx9Zljnh1dF6mhdEKWZpSA==",
+  "_location": "/@serialport/stream",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "@serialport/stream@^9.0.2",
+    "name": "@serialport/stream",
+    "escapedName": "@serialport%2fstream",
+    "scope": "@serialport",
+    "rawSpec": "^9.0.2",
+    "saveSpec": null,
+    "fetchSpec": "^9.0.2"
+  },
+  "_requiredBy": [
+    "/serialport"
+  ],
+  "_resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-9.0.2.tgz",
+  "_shasum": "33db73528adec44a1a186e7cecdd07951644d1c4",
+  "_spec": "@serialport/stream@^9.0.2",
+  "_where": "F:\\vent-display\\node_modules\\serialport",
+  "bugs": {
+    "url": "https://github.com/serialport/node-serialport/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "debug": "^4.1.1"
+  },
+  "deprecated": false,
+  "description": "The serialport stream interface. This package requires bindings to work.",
+  "devDependencies": {
+    "@serialport/binding-mock": "^9.0.2"
+  },
+  "engines": {
+    "node": ">=8.6.0"
+  },
+  "gitHead": "df482d3af7660fd13a4ecc2de5ddcb70a02417f4",
+  "homepage": "https://github.com/serialport/node-serialport#readme",
+  "license": "MIT",
+  "main": "lib",
+  "name": "@serialport/stream",
+  "publishConfig": {
+    "access": "public"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/serialport/node-serialport.git"
+  },
+  "version": "9.0.2"
+}
diff --git a/node_modules/ansi-regex/index.js b/node_modules/ansi-regex/index.js
new file mode 100644
index 0000000..b9574ed
--- /dev/null
+++ b/node_modules/ansi-regex/index.js
@@ -0,0 +1,4 @@
+'use strict';
+module.exports = function () {
+	return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]/g;
+};
diff --git a/node_modules/ansi-regex/license b/node_modules/ansi-regex/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/ansi-regex/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/ansi-regex/package.json b/node_modules/ansi-regex/package.json
new file mode 100644
index 0000000..294a322
--- /dev/null
+++ b/node_modules/ansi-regex/package.json
@@ -0,0 +1,108 @@
+{
+  "_from": "ansi-regex@^2.0.0",
+  "_id": "ansi-regex@2.1.1",
+  "_inBundle": false,
+  "_integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+  "_location": "/ansi-regex",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "ansi-regex@^2.0.0",
+    "name": "ansi-regex",
+    "escapedName": "ansi-regex",
+    "rawSpec": "^2.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^2.0.0"
+  },
+  "_requiredBy": [
+    "/strip-ansi"
+  ],
+  "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+  "_shasum": "c3b33ab5ee360d86e0e628f0468ae7ef27d654df",
+  "_spec": "ansi-regex@^2.0.0",
+  "_where": "F:\\vent-display\\node_modules\\strip-ansi",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "bugs": {
+    "url": "https://github.com/chalk/ansi-regex/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Regular expression for matching ANSI escape codes",
+  "devDependencies": {
+    "ava": "0.17.0",
+    "xo": "0.16.0"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/chalk/ansi-regex#readme",
+  "keywords": [
+    "ansi",
+    "styles",
+    "color",
+    "colour",
+    "colors",
+    "terminal",
+    "console",
+    "cli",
+    "string",
+    "tty",
+    "escape",
+    "formatting",
+    "rgb",
+    "256",
+    "shell",
+    "xterm",
+    "command-line",
+    "text",
+    "regex",
+    "regexp",
+    "re",
+    "match",
+    "test",
+    "find",
+    "pattern"
+  ],
+  "license": "MIT",
+  "maintainers": [
+    {
+      "name": "Sindre Sorhus",
+      "email": "sindresorhus@gmail.com",
+      "url": "sindresorhus.com"
+    },
+    {
+      "name": "Joshua Appelman",
+      "email": "jappelman@xebia.com",
+      "url": "jbnicolai.com"
+    },
+    {
+      "name": "JD Ballard",
+      "email": "i.am.qix@gmail.com",
+      "url": "github.com/qix-"
+    }
+  ],
+  "name": "ansi-regex",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/chalk/ansi-regex.git"
+  },
+  "scripts": {
+    "test": "xo && ava --verbose",
+    "view-supported": "node fixtures/view-codes.js"
+  },
+  "version": "2.1.1",
+  "xo": {
+    "rules": {
+      "guard-for-in": 0,
+      "no-loop-func": 0
+    }
+  }
+}
diff --git a/node_modules/ansi-regex/readme.md b/node_modules/ansi-regex/readme.md
new file mode 100644
index 0000000..6a928ed
--- /dev/null
+++ b/node_modules/ansi-regex/readme.md
@@ -0,0 +1,39 @@
+# ansi-regex [![Build Status](https://travis-ci.org/chalk/ansi-regex.svg?branch=master)](https://travis-ci.org/chalk/ansi-regex)
+
+> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
+
+
+## Install
+
+```
+$ npm install --save ansi-regex
+```
+
+
+## Usage
+
+```js
+const ansiRegex = require('ansi-regex');
+
+ansiRegex().test('\u001b[4mcake\u001b[0m');
+//=> true
+
+ansiRegex().test('cake');
+//=> false
+
+'\u001b[4mcake\u001b[0m'.match(ansiRegex());
+//=> ['\u001b[4m', '\u001b[0m']
+```
+
+## FAQ
+
+### Why do you test for codes not in the ECMA 48 standard?
+
+Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. If I recall correctly, we test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them.
+
+On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out.
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/aproba/LICENSE b/node_modules/aproba/LICENSE
new file mode 100644
index 0000000..f4be44d
--- /dev/null
+++ b/node_modules/aproba/LICENSE
@@ -0,0 +1,14 @@
+Copyright (c) 2015, Rebecca Turner <me@re-becca.org>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
diff --git a/node_modules/aproba/README.md b/node_modules/aproba/README.md
new file mode 100644
index 0000000..0bfc594
--- /dev/null
+++ b/node_modules/aproba/README.md
@@ -0,0 +1,94 @@
+aproba
+======
+
+A ridiculously light-weight function argument validator
+
+```
+var validate = require("aproba")
+
+function myfunc(a, b, c) {
+  // `a` must be a string, `b` a number, `c` a function
+  validate('SNF', arguments) // [a,b,c] is also valid
+}
+
+myfunc('test', 23, function () {}) // ok
+myfunc(123, 23, function () {}) // type error
+myfunc('test', 23) // missing arg error
+myfunc('test', 23, function () {}, true) // too many args error
+
+```
+
+Valid types are:
+
+| type | description
+| :--: | :----------
+| *    | matches any type
+| A    | `Array.isArray` OR an `arguments` object
+| S    | typeof == string
+| N    | typeof == number
+| F    | typeof == function
+| O    | typeof == object and not type A and not type E
+| B    | typeof == boolean
+| E    | `instanceof Error` OR `null` **(special: see below)**
+| Z    | == `null`
+
+Validation failures throw one of three exception types, distinguished by a
+`code` property of `EMISSINGARG`, `EINVALIDTYPE` or `ETOOMANYARGS`.
+
+If you pass in an invalid type then it will throw with a code of
+`EUNKNOWNTYPE`.
+
+If an **error** argument is found and is not null then the remaining
+arguments are optional.  That is, if you say `ESO` then that's like using a
+non-magical `E` in: `E|ESO|ZSO`.
+
+### But I have optional arguments?!
+
+You can provide more than one signature by separating them with pipes `|`.
+If any signature matches the arguments then they'll be considered valid.
+
+So for example, say you wanted to write a signature for
+`fs.createWriteStream`.  The docs for it describe it thusly:
+
+```
+fs.createWriteStream(path[, options])
+```
+
+This would be a signature of `SO|S`.  That is, a string and and object, or
+just a string.
+
+Now, if you read the full `fs` docs, you'll see that actually path can ALSO
+be a buffer.  And options can be a string, that is:
+```
+path <String> | <Buffer>
+options <String> | <Object>
+```
+
+To reproduce this you have to fully enumerate all of the possible
+combinations and that implies a signature of `SO|SS|OO|OS|S|O`.  The
+awkwardness is a feature: It reminds you of the complexity you're adding to
+your API when you do this sort of thing.
+
+
+### Browser support
+
+This has no dependencies and should work in browsers, though you'll have
+noisier stack traces.
+
+### Why this exists
+
+I wanted a very simple argument validator. It needed to do two things:
+
+1. Be more concise and easier to use than assertions
+
+2. Not encourage an infinite bikeshed of DSLs
+
+This is why types are specified by a single character and there's no such
+thing as an optional argument. 
+
+This is not intended to validate user data. This is specifically about
+asserting the interface of your functions.
+
+If you need greater validation, I encourage you to write them by hand or
+look elsewhere.
+
diff --git a/node_modules/aproba/index.js b/node_modules/aproba/index.js
new file mode 100644
index 0000000..6f3f797
--- /dev/null
+++ b/node_modules/aproba/index.js
@@ -0,0 +1,105 @@
+'use strict'
+
+function isArguments (thingy) {
+  return thingy != null && typeof thingy === 'object' && thingy.hasOwnProperty('callee')
+}
+
+var types = {
+  '*': {label: 'any', check: function () { return true }},
+  A: {label: 'array', check: function (thingy) { return Array.isArray(thingy) || isArguments(thingy) }},
+  S: {label: 'string', check: function (thingy) { return typeof thingy === 'string' }},
+  N: {label: 'number', check: function (thingy) { return typeof thingy === 'number' }},
+  F: {label: 'function', check: function (thingy) { return typeof thingy === 'function' }},
+  O: {label: 'object', check: function (thingy) { return typeof thingy === 'object' && thingy != null && !types.A.check(thingy) && !types.E.check(thingy) }},
+  B: {label: 'boolean', check: function (thingy) { return typeof thingy === 'boolean' }},
+  E: {label: 'error', check: function (thingy) { return thingy instanceof Error }},
+  Z: {label: 'null', check: function (thingy) { return thingy == null }}
+}
+
+function addSchema (schema, arity) {
+  var group = arity[schema.length] = arity[schema.length] || []
+  if (group.indexOf(schema) === -1) group.push(schema)
+}
+
+var validate = module.exports = function (rawSchemas, args) {
+  if (arguments.length !== 2) throw wrongNumberOfArgs(['SA'], arguments.length)
+  if (!rawSchemas) throw missingRequiredArg(0, 'rawSchemas')
+  if (!args) throw missingRequiredArg(1, 'args')
+  if (!types.S.check(rawSchemas)) throw invalidType(0, ['string'], rawSchemas)
+  if (!types.A.check(args)) throw invalidType(1, ['array'], args)
+  var schemas = rawSchemas.split('|')
+  var arity = {}
+
+  schemas.forEach(function (schema) {
+    for (var ii = 0; ii < schema.length; ++ii) {
+      var type = schema[ii]
+      if (!types[type]) throw unknownType(ii, type)
+    }
+    if (/E.*E/.test(schema)) throw moreThanOneError(schema)
+    addSchema(schema, arity)
+    if (/E/.test(schema)) {
+      addSchema(schema.replace(/E.*$/, 'E'), arity)
+      addSchema(schema.replace(/E/, 'Z'), arity)
+      if (schema.length === 1) addSchema('', arity)
+    }
+  })
+  var matching = arity[args.length]
+  if (!matching) {
+    throw wrongNumberOfArgs(Object.keys(arity), args.length)
+  }
+  for (var ii = 0; ii < args.length; ++ii) {
+    var newMatching = matching.filter(function (schema) {
+      var type = schema[ii]
+      var typeCheck = types[type].check
+      return typeCheck(args[ii])
+    })
+    if (!newMatching.length) {
+      var labels = matching.map(function (schema) {
+        return types[schema[ii]].label
+      }).filter(function (schema) { return schema != null })
+      throw invalidType(ii, labels, args[ii])
+    }
+    matching = newMatching
+  }
+}
+
+function missingRequiredArg (num) {
+  return newException('EMISSINGARG', 'Missing required argument #' + (num + 1))
+}
+
+function unknownType (num, type) {
+  return newException('EUNKNOWNTYPE', 'Unknown type ' + type + ' in argument #' + (num + 1))
+}
+
+function invalidType (num, expectedTypes, value) {
+  var valueType
+  Object.keys(types).forEach(function (typeCode) {
+    if (types[typeCode].check(value)) valueType = types[typeCode].label
+  })
+  return newException('EINVALIDTYPE', 'Argument #' + (num + 1) + ': Expected ' +
+    englishList(expectedTypes) + ' but got ' + valueType)
+}
+
+function englishList (list) {
+  return list.join(', ').replace(/, ([^,]+)$/, ' or $1')
+}
+
+function wrongNumberOfArgs (expected, got) {
+  var english = englishList(expected)
+  var args = expected.every(function (ex) { return ex.length === 1 })
+    ? 'argument'
+    : 'arguments'
+  return newException('EWRONGARGCOUNT', 'Expected ' + english + ' ' + args + ' but got ' + got)
+}
+
+function moreThanOneError (schema) {
+  return newException('ETOOMANYERRORTYPES',
+    'Only one error type per argument signature is allowed, more than one found in "' + schema + '"')
+}
+
+function newException (code, msg) {
+  var e = new Error(msg)
+  e.code = code
+  if (Error.captureStackTrace) Error.captureStackTrace(e, validate)
+  return e
+}
diff --git a/node_modules/aproba/package.json b/node_modules/aproba/package.json
new file mode 100644
index 0000000..5b507e4
--- /dev/null
+++ b/node_modules/aproba/package.json
@@ -0,0 +1,62 @@
+{
+  "_from": "aproba@^1.0.3",
+  "_id": "aproba@1.2.0",
+  "_inBundle": false,
+  "_integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+  "_location": "/aproba",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "aproba@^1.0.3",
+    "name": "aproba",
+    "escapedName": "aproba",
+    "rawSpec": "^1.0.3",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.3"
+  },
+  "_requiredBy": [
+    "/gauge"
+  ],
+  "_resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+  "_shasum": "6802e6264efd18c790a1b0d517f0f2627bf2c94a",
+  "_spec": "aproba@^1.0.3",
+  "_where": "F:\\vent-display\\node_modules\\gauge",
+  "author": {
+    "name": "Rebecca Turner",
+    "email": "me@re-becca.org"
+  },
+  "bugs": {
+    "url": "https://github.com/iarna/aproba/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {},
+  "deprecated": false,
+  "description": "A ridiculously light-weight argument validator (now browser friendly)",
+  "devDependencies": {
+    "standard": "^10.0.3",
+    "tap": "^10.0.2"
+  },
+  "directories": {
+    "test": "test"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/iarna/aproba",
+  "keywords": [
+    "argument",
+    "validate"
+  ],
+  "license": "ISC",
+  "main": "index.js",
+  "name": "aproba",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/iarna/aproba.git"
+  },
+  "scripts": {
+    "test": "standard && tap -j3 test/*.js"
+  },
+  "version": "1.2.0"
+}
diff --git a/node_modules/are-we-there-yet/CHANGES.md b/node_modules/are-we-there-yet/CHANGES.md
new file mode 100644
index 0000000..21f3b1c
--- /dev/null
+++ b/node_modules/are-we-there-yet/CHANGES.md
@@ -0,0 +1,37 @@
+Hi, figured we could actually use a changelog now:
+
+## 1.1.5 2018-05-24
+
+* [#92](https://github.com/iarna/are-we-there-yet/pull/92) Fix bug where
+  `finish` would throw errors when including `TrackerStream` objects in
+  `TrackerGroup` collections.  (@brianloveswords)
+
+## 1.1.4 2017-04-21
+
+* Fix typo in package.json
+
+## 1.1.3 2017-04-21
+
+* Improve documentation and limit files included in the distribution.
+
+## 1.1.2 2016-03-15
+
+* Add tracker group cycle detection and tests for it
+
+## 1.1.1 2016-01-29
+
+* Fix a typo in stream completion tracker
+
+## 1.1.0 2016-01-29
+
+* Rewrote completion percent computation to be low impact– no more walking a
+  tree of completion groups every time we need this info.  Previously, with
+  medium sized tree of completion groups, even a relatively modest number of
+  calls to the top level `completed()` method would result in absurd numbers
+  of calls overall as it walked down the tree. We now, instead, keep track as
+  we bubble up changes, so the computation is limited to when data changes and
+  to the depth of that one branch, instead of _every_ node. (Plus, we were already
+  incurring _this_ cost, since we already bubbled out changes.)
+* Moved different tracker types out to their own files.
+* Made tests test for TOO MANY events too.
+* Standarized the source code formatting
diff --git a/node_modules/are-we-there-yet/LICENSE b/node_modules/are-we-there-yet/LICENSE
new file mode 100644
index 0000000..af45880
--- /dev/null
+++ b/node_modules/are-we-there-yet/LICENSE
@@ -0,0 +1,5 @@
+Copyright (c) 2015, Rebecca Turner
+
+Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/are-we-there-yet/README.md b/node_modules/are-we-there-yet/README.md
new file mode 100644
index 0000000..7e2b42d
--- /dev/null
+++ b/node_modules/are-we-there-yet/README.md
@@ -0,0 +1,195 @@
+are-we-there-yet
+----------------
+
+Track complex hiearchies of asynchronous task completion statuses.  This is
+intended to give you a way of recording and reporting the progress of the big
+recursive fan-out and gather type workflows that are so common in async.
+
+What you do with this completion data is up to you, but the most common use case is to
+feed it to one of the many progress bar modules.
+
+Most progress bar modules include a rudamentary version of this, but my
+needs were more complex.
+
+Usage
+=====
+
+```javascript
+var TrackerGroup = require("are-we-there-yet").TrackerGroup
+
+var top = new TrackerGroup("program")
+
+var single = top.newItem("one thing", 100)
+single.completeWork(20)
+
+console.log(top.completed()) // 0.2
+
+fs.stat("file", function(er, stat) {
+  if (er) throw er  
+  var stream = top.newStream("file", stat.size)
+  console.log(top.completed()) // now 0.1 as single is 50% of the job and is 20% complete
+                              // and 50% * 20% == 10%
+  fs.createReadStream("file").pipe(stream).on("data", function (chunk) {
+    // do stuff with chunk
+  })
+  top.on("change", function (name) {
+    // called each time a chunk is read from "file"
+    // top.completed() will start at 0.1 and fill up to 0.6 as the file is read
+  })
+})
+```
+
+Shared Methods
+==============
+
+* var completed = tracker.completed()
+
+Implemented in: `Tracker`, `TrackerGroup`, `TrackerStream`
+
+Returns the ratio of completed work to work to be done. Range of 0 to 1.
+
+* tracker.finish()
+
+Implemented in: `Tracker`, `TrackerGroup`
+
+Marks the tracker as completed. With a TrackerGroup this marks all of its
+components as completed.
+
+Marks all of the components of this tracker as finished, which in turn means
+that `tracker.completed()` for this will now be 1.
+
+This will result in one or more `change` events being emitted.
+
+Events
+======
+
+All tracker objects emit `change` events with the following arguments:
+
+```
+function (name, completed, tracker)
+```
+
+`name` is the name of the tracker that originally emitted the event,
+or if it didn't have one, the first containing tracker group that had one.
+
+`completed` is the percent complete (as returned by `tracker.completed()` method).
+
+`tracker` is the tracker object that you are listening for events on.
+
+TrackerGroup
+============
+
+* var tracker = new TrackerGroup(**name**)
+
+  * **name** *(optional)* - The name of this tracker group, used in change
+    notifications if the component updating didn't have a name. Defaults to undefined.
+
+Creates a new empty tracker aggregation group. These are trackers whose
+completion status is determined by the completion status of other trackers.
+
+* tracker.addUnit(**otherTracker**, **weight**)
+
+  * **otherTracker** - Any of the other are-we-there-yet tracker objects
+  * **weight** *(optional)* - The weight to give the tracker, defaults to 1.
+
+Adds the **otherTracker** to this aggregation group. The weight determines
+how long you expect this tracker to take to complete in proportion to other
+units.  So for instance, if you add one tracker with a weight of 1 and
+another with a weight of 2, you're saying the second will take twice as long
+to complete as the first.  As such, the first will account for 33% of the
+completion of this tracker and the second will account for the other 67%.
+
+Returns **otherTracker**.
+
+* var subGroup = tracker.newGroup(**name**, **weight**)
+
+The above is exactly equivalent to:
+
+```javascript
+  var subGroup = tracker.addUnit(new TrackerGroup(name), weight)
+```
+
+* var subItem = tracker.newItem(**name**, **todo**, **weight**)
+
+The above is exactly equivalent to:
+
+```javascript
+  var subItem = tracker.addUnit(new Tracker(name, todo), weight)
+```
+
+* var subStream = tracker.newStream(**name**, **todo**, **weight**)
+
+The above is exactly equivalent to:
+
+```javascript
+  var subStream = tracker.addUnit(new TrackerStream(name, todo), weight)
+```
+
+* console.log( tracker.debug() )
+
+Returns a tree showing the completion of this tracker group and all of its
+children, including recursively entering all of the children.
+
+Tracker
+=======
+
+* var tracker = new Tracker(**name**, **todo**)
+
+  * **name** *(optional)* The name of this counter to report in change
+    events.  Defaults to undefined.
+  * **todo** *(optional)* The amount of work todo (a number). Defaults to 0.
+
+Ordinarily these are constructed as a part of a tracker group (via
+`newItem`).
+
+* var completed = tracker.completed()
+
+Returns the ratio of completed work to work to be done. Range of 0 to 1. If
+total work to be done is 0 then it will return 0.
+
+* tracker.addWork(**todo**)
+
+  * **todo** A number to add to the amount of work to be done.
+
+Increases the amount of work to be done, thus decreasing the completion
+percentage.  Triggers a `change` event.
+
+* tracker.completeWork(**completed**)
+
+  * **completed** A number to add to the work complete
+
+Increase the amount of work complete, thus increasing the completion percentage.
+Will never increase the work completed past the amount of work todo. That is,
+percentages > 100% are not allowed. Triggers a `change` event.
+
+* tracker.finish()
+
+Marks this tracker as finished, tracker.completed() will now be 1. Triggers
+a `change` event.
+
+TrackerStream
+=============
+
+* var tracker = new TrackerStream(**name**, **size**, **options**)
+
+  * **name** *(optional)* The name of this counter to report in change
+    events.  Defaults to undefined.
+  * **size** *(optional)* The number of bytes being sent through this stream.
+  * **options** *(optional)* A hash of stream options
+
+The tracker stream object is a pass through stream that updates an internal
+tracker object each time a block passes through.  It's intended to track
+downloads, file extraction and other related activities. You use it by piping
+your data source into it and then using it as your data source.
+
+If your data has a length attribute then that's used as the amount of work
+completed when the chunk is passed through.  If it does not (eg, object
+streams) then each chunk counts as completing 1 unit of work, so your size
+should be the total number of objects being streamed.
+
+* tracker.addWork(**todo**)
+
+  * **todo** Increase the expected overall size by **todo** bytes.
+
+Increases the amount of work to be done, thus decreasing the completion
+percentage.  Triggers a `change` event.
diff --git a/node_modules/are-we-there-yet/index.js b/node_modules/are-we-there-yet/index.js
new file mode 100644
index 0000000..57d8743
--- /dev/null
+++ b/node_modules/are-we-there-yet/index.js
@@ -0,0 +1,4 @@
+'use strict'
+exports.TrackerGroup = require('./tracker-group.js')
+exports.Tracker = require('./tracker.js')
+exports.TrackerStream = require('./tracker-stream.js')
diff --git a/node_modules/are-we-there-yet/package.json b/node_modules/are-we-there-yet/package.json
new file mode 100644
index 0000000..ed8c7a1
--- /dev/null
+++ b/node_modules/are-we-there-yet/package.json
@@ -0,0 +1,63 @@
+{
+  "_from": "are-we-there-yet@~1.1.2",
+  "_id": "are-we-there-yet@1.1.5",
+  "_inBundle": false,
+  "_integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+  "_location": "/are-we-there-yet",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "are-we-there-yet@~1.1.2",
+    "name": "are-we-there-yet",
+    "escapedName": "are-we-there-yet",
+    "rawSpec": "~1.1.2",
+    "saveSpec": null,
+    "fetchSpec": "~1.1.2"
+  },
+  "_requiredBy": [
+    "/npmlog"
+  ],
+  "_resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
+  "_shasum": "4b35c2944f062a8bfcda66410760350fe9ddfc21",
+  "_spec": "are-we-there-yet@~1.1.2",
+  "_where": "F:\\vent-display\\node_modules\\npmlog",
+  "author": {
+    "name": "Rebecca Turner",
+    "url": "http://re-becca.org"
+  },
+  "bugs": {
+    "url": "https://github.com/iarna/are-we-there-yet/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "delegates": "^1.0.0",
+    "readable-stream": "^2.0.6"
+  },
+  "deprecated": false,
+  "description": "Keep track of the overall completion of many disparate processes",
+  "devDependencies": {
+    "standard": "^11.0.1",
+    "tap": "^12.0.1"
+  },
+  "files": [
+    "index.js",
+    "tracker-base.js",
+    "tracker-group.js",
+    "tracker-stream.js",
+    "tracker.js",
+    "CHANGES.md"
+  ],
+  "homepage": "https://github.com/iarna/are-we-there-yet",
+  "license": "ISC",
+  "main": "index.js",
+  "name": "are-we-there-yet",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/iarna/are-we-there-yet.git"
+  },
+  "scripts": {
+    "test": "standard && tap test/*.js"
+  },
+  "version": "1.1.5"
+}
diff --git a/node_modules/are-we-there-yet/tracker-base.js b/node_modules/are-we-there-yet/tracker-base.js
new file mode 100644
index 0000000..6f43687
--- /dev/null
+++ b/node_modules/are-we-there-yet/tracker-base.js
@@ -0,0 +1,11 @@
+'use strict'
+var EventEmitter = require('events').EventEmitter
+var util = require('util')
+
+var trackerId = 0
+var TrackerBase = module.exports = function (name) {
+  EventEmitter.call(this)
+  this.id = ++trackerId
+  this.name = name
+}
+util.inherits(TrackerBase, EventEmitter)
diff --git a/node_modules/are-we-there-yet/tracker-group.js b/node_modules/are-we-there-yet/tracker-group.js
new file mode 100644
index 0000000..9759e12
--- /dev/null
+++ b/node_modules/are-we-there-yet/tracker-group.js
@@ -0,0 +1,107 @@
+'use strict'
+var util = require('util')
+var TrackerBase = require('./tracker-base.js')
+var Tracker = require('./tracker.js')
+var TrackerStream = require('./tracker-stream.js')
+
+var TrackerGroup = module.exports = function (name) {
+  TrackerBase.call(this, name)
+  this.parentGroup = null
+  this.trackers = []
+  this.completion = {}
+  this.weight = {}
+  this.totalWeight = 0
+  this.finished = false
+  this.bubbleChange = bubbleChange(this)
+}
+util.inherits(TrackerGroup, TrackerBase)
+
+function bubbleChange (trackerGroup) {
+  return function (name, completed, tracker) {
+    trackerGroup.completion[tracker.id] = completed
+    if (trackerGroup.finished) return
+    trackerGroup.emit('change', name || trackerGroup.name, trackerGroup.completed(), trackerGroup)
+  }
+}
+
+TrackerGroup.prototype.nameInTree = function () {
+  var names = []
+  var from = this
+  while (from) {
+    names.unshift(from.name)
+    from = from.parentGroup
+  }
+  return names.join('/')
+}
+
+TrackerGroup.prototype.addUnit = function (unit, weight) {
+  if (unit.addUnit) {
+    var toTest = this
+    while (toTest) {
+      if (unit === toTest) {
+        throw new Error(
+          'Attempted to add tracker group ' +
+          unit.name + ' to tree that already includes it ' +
+          this.nameInTree(this))
+      }
+      toTest = toTest.parentGroup
+    }
+    unit.parentGroup = this
+  }
+  this.weight[unit.id] = weight || 1
+  this.totalWeight += this.weight[unit.id]
+  this.trackers.push(unit)
+  this.completion[unit.id] = unit.completed()
+  unit.on('change', this.bubbleChange)
+  if (!this.finished) this.emit('change', unit.name, this.completion[unit.id], unit)
+  return unit
+}
+
+TrackerGroup.prototype.completed = function () {
+  if (this.trackers.length === 0) return 0
+  var valPerWeight = 1 / this.totalWeight
+  var completed = 0
+  for (var ii = 0; ii < this.trackers.length; ii++) {
+    var trackerId = this.trackers[ii].id
+    completed += valPerWeight * this.weight[trackerId] * this.completion[trackerId]
+  }
+  return completed
+}
+
+TrackerGroup.prototype.newGroup = function (name, weight) {
+  return this.addUnit(new TrackerGroup(name), weight)
+}
+
+TrackerGroup.prototype.newItem = function (name, todo, weight) {
+  return this.addUnit(new Tracker(name, todo), weight)
+}
+
+TrackerGroup.prototype.newStream = function (name, todo, weight) {
+  return this.addUnit(new TrackerStream(name, todo), weight)
+}
+
+TrackerGroup.prototype.finish = function () {
+  this.finished = true
+  if (!this.trackers.length) this.addUnit(new Tracker(), 1, true)
+  for (var ii = 0; ii < this.trackers.length; ii++) {
+    var tracker = this.trackers[ii]
+    tracker.finish()
+    tracker.removeListener('change', this.bubbleChange)
+  }
+  this.emit('change', this.name, 1, this)
+}
+
+var buffer = '                                  '
+TrackerGroup.prototype.debug = function (depth) {
+  depth = depth || 0
+  var indent = depth ? buffer.substr(0, depth) : ''
+  var output = indent + (this.name || 'top') + ': ' + this.completed() + '\n'
+  this.trackers.forEach(function (tracker) {
+    if (tracker instanceof TrackerGroup) {
+      output += tracker.debug(depth + 1)
+    } else {
+      output += indent + ' ' + tracker.name + ': ' + tracker.completed() + '\n'
+    }
+  })
+  return output
+}
diff --git a/node_modules/are-we-there-yet/tracker-stream.js b/node_modules/are-we-there-yet/tracker-stream.js
new file mode 100644
index 0000000..e1cf850
--- /dev/null
+++ b/node_modules/are-we-there-yet/tracker-stream.js
@@ -0,0 +1,36 @@
+'use strict'
+var util = require('util')
+var stream = require('readable-stream')
+var delegate = require('delegates')
+var Tracker = require('./tracker.js')
+
+var TrackerStream = module.exports = function (name, size, options) {
+  stream.Transform.call(this, options)
+  this.tracker = new Tracker(name, size)
+  this.name = name
+  this.id = this.tracker.id
+  this.tracker.on('change', delegateChange(this))
+}
+util.inherits(TrackerStream, stream.Transform)
+
+function delegateChange (trackerStream) {
+  return function (name, completion, tracker) {
+    trackerStream.emit('change', name, completion, trackerStream)
+  }
+}
+
+TrackerStream.prototype._transform = function (data, encoding, cb) {
+  this.tracker.completeWork(data.length ? data.length : 1)
+  this.push(data)
+  cb()
+}
+
+TrackerStream.prototype._flush = function (cb) {
+  this.tracker.finish()
+  cb()
+}
+
+delegate(TrackerStream.prototype, 'tracker')
+  .method('completed')
+  .method('addWork')
+  .method('finish')
diff --git a/node_modules/are-we-there-yet/tracker.js b/node_modules/are-we-there-yet/tracker.js
new file mode 100644
index 0000000..68c2339
--- /dev/null
+++ b/node_modules/are-we-there-yet/tracker.js
@@ -0,0 +1,30 @@
+'use strict'
+var util = require('util')
+var TrackerBase = require('./tracker-base.js')
+
+var Tracker = module.exports = function (name, todo) {
+  TrackerBase.call(this, name)
+  this.workDone = 0
+  this.workTodo = todo || 0
+}
+util.inherits(Tracker, TrackerBase)
+
+Tracker.prototype.completed = function () {
+  return this.workTodo === 0 ? 0 : this.workDone / this.workTodo
+}
+
+Tracker.prototype.addWork = function (work) {
+  this.workTodo += work
+  this.emit('change', this.name, this.completed(), this)
+}
+
+Tracker.prototype.completeWork = function (work) {
+  this.workDone += work
+  if (this.workDone > this.workTodo) this.workDone = this.workTodo
+  this.emit('change', this.name, this.completed(), this)
+}
+
+Tracker.prototype.finish = function () {
+  this.workTodo = this.workDone = 1
+  this.emit('change', this.name, 1, this)
+}
diff --git a/node_modules/base64-js/LICENSE b/node_modules/base64-js/LICENSE
new file mode 100644
index 0000000..6d52b8a
--- /dev/null
+++ b/node_modules/base64-js/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Jameson Little
+
+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/base64-js/README.md b/node_modules/base64-js/README.md
new file mode 100644
index 0000000..b42a48f
--- /dev/null
+++ b/node_modules/base64-js/README.md
@@ -0,0 +1,34 @@
+base64-js
+=========
+
+`base64-js` does basic base64 encoding/decoding in pure JS.
+
+[![build status](https://secure.travis-ci.org/beatgammit/base64-js.png)](http://travis-ci.org/beatgammit/base64-js)
+
+Many browsers already have base64 encoding/decoding functionality, but it is for text data, not all-purpose binary data.
+
+Sometimes encoding/decoding binary data in the browser is useful, and that is what this module does.
+
+## install
+
+With [npm](https://npmjs.org) do:
+
+`npm install base64-js` and `var base64js = require('base64-js')`
+
+For use in web browsers do:
+
+`<script src="base64js.min.js"></script>`
+
+[Get supported base64-js with the Tidelift Subscription](https://tidelift.com/subscription/pkg/npm-base64-js?utm_source=npm-base64-js&utm_medium=referral&utm_campaign=readme)
+
+## methods
+
+`base64js` has three exposed functions, `byteLength`, `toByteArray` and `fromByteArray`, which both take a single argument.
+
+* `byteLength` - Takes a base64 string and returns length of byte array
+* `toByteArray` - Takes a base64 string and returns a byte array
+* `fromByteArray` - Takes a byte array and returns a base64 string
+
+## license
+
+MIT
diff --git a/node_modules/base64-js/base64js.min.js b/node_modules/base64-js/base64js.min.js
new file mode 100644
index 0000000..908ac83
--- /dev/null
+++ b/node_modules/base64-js/base64js.min.js
@@ -0,0 +1 @@
+(function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"==typeof window?"undefined"==typeof global?"undefined"==typeof self?this:self:global:window,b.base64js=a()}})(function(){return function(){function b(d,e,g){function a(j,i){if(!e[j]){if(!d[j]){var f="function"==typeof require&&require;if(!i&&f)return f(j,!0);if(h)return h(j,!0);var c=new Error("Cannot find module '"+j+"'");throw c.code="MODULE_NOT_FOUND",c}var k=e[j]={exports:{}};d[j][0].call(k.exports,function(b){var c=d[j][1][b];return a(c||b)},k,k.exports,b,d,e,g)}return e[j].exports}for(var h="function"==typeof require&&require,c=0;c<g.length;c++)a(g[c]);return a}return b}()({"/":[function(a,b,c){'use strict';function d(a){var b=a.length;if(0<b%4)throw new Error("Invalid string. Length must be a multiple of 4");var c=a.indexOf("=");-1===c&&(c=b);var d=c===b?0:4-c%4;return[c,d]}function e(a,b,c){return 3*(b+c)/4-c}function f(a){var b,c,f=d(a),g=f[0],h=f[1],j=new m(e(a,g,h)),k=0,n=0<h?g-4:g;for(c=0;c<n;c+=4)b=l[a.charCodeAt(c)]<<18|l[a.charCodeAt(c+1)]<<12|l[a.charCodeAt(c+2)]<<6|l[a.charCodeAt(c+3)],j[k++]=255&b>>16,j[k++]=255&b>>8,j[k++]=255&b;return 2===h&&(b=l[a.charCodeAt(c)]<<2|l[a.charCodeAt(c+1)]>>4,j[k++]=255&b),1===h&&(b=l[a.charCodeAt(c)]<<10|l[a.charCodeAt(c+1)]<<4|l[a.charCodeAt(c+2)]>>2,j[k++]=255&b>>8,j[k++]=255&b),j}function g(a){return k[63&a>>18]+k[63&a>>12]+k[63&a>>6]+k[63&a]}function h(a,b,c){for(var d,e=[],f=b;f<c;f+=3)d=(16711680&a[f]<<16)+(65280&a[f+1]<<8)+(255&a[f+2]),e.push(g(d));return e.join("")}function j(a){for(var b,c=a.length,d=c%3,e=[],f=16383,g=0,j=c-d;g<j;g+=f)e.push(h(a,g,g+f>j?j:g+f));return 1===d?(b=a[c-1],e.push(k[b>>2]+k[63&b<<4]+"==")):2===d&&(b=(a[c-2]<<8)+a[c-1],e.push(k[b>>10]+k[63&b>>4]+k[63&b<<2]+"=")),e.join("")}c.byteLength=function(a){var b=d(a),c=b[0],e=b[1];return 3*(c+e)/4-e},c.toByteArray=f,c.fromByteArray=j;for(var k=[],l=[],m="undefined"==typeof Uint8Array?Array:Uint8Array,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=0,p=n.length;o<p;++o)k[o]=n[o],l[n.charCodeAt(o)]=o;l[45]=62,l[95]=63},{}]},{},[])("/")});
\ No newline at end of file
diff --git a/node_modules/base64-js/index.d.ts b/node_modules/base64-js/index.d.ts
new file mode 100644
index 0000000..7d9fa1d
--- /dev/null
+++ b/node_modules/base64-js/index.d.ts
@@ -0,0 +1,3 @@
+export function byteLength(b64: string): number;
+export function toByteArray(b64: string): Uint8Array;
+export function fromByteArray(uint8: Uint8Array): string;
diff --git a/node_modules/base64-js/index.js b/node_modules/base64-js/index.js
new file mode 100644
index 0000000..0599f3e
--- /dev/null
+++ b/node_modules/base64-js/index.js
@@ -0,0 +1,150 @@
+'use strict'
+
+exports.byteLength = byteLength
+exports.toByteArray = toByteArray
+exports.fromByteArray = fromByteArray
+
+var lookup = []
+var revLookup = []
+var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
+
+var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
+for (var i = 0, len = code.length; i < len; ++i) {
+  lookup[i] = code[i]
+  revLookup[code.charCodeAt(i)] = i
+}
+
+// Support decoding URL-safe base64 strings, as Node.js does.
+// See: https://en.wikipedia.org/wiki/Base64#URL_applications
+revLookup['-'.charCodeAt(0)] = 62
+revLookup['_'.charCodeAt(0)] = 63
+
+function getLens (b64) {
+  var len = b64.length
+
+  if (len % 4 > 0) {
+    throw new Error('Invalid string. Length must be a multiple of 4')
+  }
+
+  // Trim off extra bytes after placeholder bytes are found
+  // See: https://github.com/beatgammit/base64-js/issues/42
+  var validLen = b64.indexOf('=')
+  if (validLen === -1) validLen = len
+
+  var placeHoldersLen = validLen === len
+    ? 0
+    : 4 - (validLen % 4)
+
+  return [validLen, placeHoldersLen]
+}
+
+// base64 is 4/3 + up to two characters of the original data
+function byteLength (b64) {
+  var lens = getLens(b64)
+  var validLen = lens[0]
+  var placeHoldersLen = lens[1]
+  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
+}
+
+function _byteLength (b64, validLen, placeHoldersLen) {
+  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
+}
+
+function toByteArray (b64) {
+  var tmp
+  var lens = getLens(b64)
+  var validLen = lens[0]
+  var placeHoldersLen = lens[1]
+
+  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
+
+  var curByte = 0
+
+  // if there are placeholders, only get up to the last complete 4 chars
+  var len = placeHoldersLen > 0
+    ? validLen - 4
+    : validLen
+
+  var i
+  for (i = 0; i < len; i += 4) {
+    tmp =
+      (revLookup[b64.charCodeAt(i)] << 18) |
+      (revLookup[b64.charCodeAt(i + 1)] << 12) |
+      (revLookup[b64.charCodeAt(i + 2)] << 6) |
+      revLookup[b64.charCodeAt(i + 3)]
+    arr[curByte++] = (tmp >> 16) & 0xFF
+    arr[curByte++] = (tmp >> 8) & 0xFF
+    arr[curByte++] = tmp & 0xFF
+  }
+
+  if (placeHoldersLen === 2) {
+    tmp =
+      (revLookup[b64.charCodeAt(i)] << 2) |
+      (revLookup[b64.charCodeAt(i + 1)] >> 4)
+    arr[curByte++] = tmp & 0xFF
+  }
+
+  if (placeHoldersLen === 1) {
+    tmp =
+      (revLookup[b64.charCodeAt(i)] << 10) |
+      (revLookup[b64.charCodeAt(i + 1)] << 4) |
+      (revLookup[b64.charCodeAt(i + 2)] >> 2)
+    arr[curByte++] = (tmp >> 8) & 0xFF
+    arr[curByte++] = tmp & 0xFF
+  }
+
+  return arr
+}
+
+function tripletToBase64 (num) {
+  return lookup[num >> 18 & 0x3F] +
+    lookup[num >> 12 & 0x3F] +
+    lookup[num >> 6 & 0x3F] +
+    lookup[num & 0x3F]
+}
+
+function encodeChunk (uint8, start, end) {
+  var tmp
+  var output = []
+  for (var i = start; i < end; i += 3) {
+    tmp =
+      ((uint8[i] << 16) & 0xFF0000) +
+      ((uint8[i + 1] << 8) & 0xFF00) +
+      (uint8[i + 2] & 0xFF)
+    output.push(tripletToBase64(tmp))
+  }
+  return output.join('')
+}
+
+function fromByteArray (uint8) {
+  var tmp
+  var len = uint8.length
+  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
+  var parts = []
+  var maxChunkLength = 16383 // must be multiple of 3
+
+  // go through the array every three bytes, we'll deal with trailing stuff later
+  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
+    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
+  }
+
+  // pad the end with zeros, but make sure to not forget the extra bytes
+  if (extraBytes === 1) {
+    tmp = uint8[len - 1]
+    parts.push(
+      lookup[tmp >> 2] +
+      lookup[(tmp << 4) & 0x3F] +
+      '=='
+    )
+  } else if (extraBytes === 2) {
+    tmp = (uint8[len - 2] << 8) + uint8[len - 1]
+    parts.push(
+      lookup[tmp >> 10] +
+      lookup[(tmp >> 4) & 0x3F] +
+      lookup[(tmp << 2) & 0x3F] +
+      '='
+    )
+  }
+
+  return parts.join('')
+}
diff --git a/node_modules/base64-js/package.json b/node_modules/base64-js/package.json
new file mode 100644
index 0000000..2ac6d59
--- /dev/null
+++ b/node_modules/base64-js/package.json
@@ -0,0 +1,75 @@
+{
+  "_from": "base64-js@^1.3.1",
+  "_id": "base64-js@1.5.1",
+  "_inBundle": false,
+  "_integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+  "_location": "/base64-js",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "base64-js@^1.3.1",
+    "name": "base64-js",
+    "escapedName": "base64-js",
+    "rawSpec": "^1.3.1",
+    "saveSpec": null,
+    "fetchSpec": "^1.3.1"
+  },
+  "_requiredBy": [
+    "/buffer"
+  ],
+  "_resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+  "_shasum": "1b1b440160a5bf7ad40b650f095963481903930a",
+  "_spec": "base64-js@^1.3.1",
+  "_where": "F:\\vent-display\\node_modules\\buffer",
+  "author": {
+    "name": "T. Jameson Little",
+    "email": "t.jameson.little@gmail.com"
+  },
+  "bugs": {
+    "url": "https://github.com/beatgammit/base64-js/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Base64 encoding/decoding in pure JS",
+  "devDependencies": {
+    "babel-minify": "^0.5.1",
+    "benchmark": "^2.1.4",
+    "browserify": "^16.3.0",
+    "standard": "*",
+    "tape": "4.x"
+  },
+  "funding": [
+    {
+      "type": "github",
+      "url": "https://github.com/sponsors/feross"
+    },
+    {
+      "type": "patreon",
+      "url": "https://www.patreon.com/feross"
+    },
+    {
+      "type": "consulting",
+      "url": "https://feross.org/support"
+    }
+  ],
+  "homepage": "https://github.com/beatgammit/base64-js",
+  "keywords": [
+    "base64"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "base64-js",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/beatgammit/base64-js.git"
+  },
+  "scripts": {
+    "build": "browserify -s base64js -r ./ | minify > base64js.min.js",
+    "lint": "standard",
+    "test": "npm run lint && npm run unit",
+    "unit": "tape test/*.js"
+  },
+  "typings": "index.d.ts",
+  "version": "1.5.1"
+}
diff --git a/node_modules/bindings/LICENSE.md b/node_modules/bindings/LICENSE.md
new file mode 100644
index 0000000..5a92289
--- /dev/null
+++ b/node_modules/bindings/LICENSE.md
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) 2012 Nathan Rajlich &lt;nathan@tootallnate.net&gt;
+
+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/bindings/README.md b/node_modules/bindings/README.md
new file mode 100644
index 0000000..5b3e7a8
--- /dev/null
+++ b/node_modules/bindings/README.md
@@ -0,0 +1,98 @@
+node-bindings
+=============
+### Helper module for loading your native module's `.node` file
+
+This is a helper module for authors of Node.js native addon modules.
+It is basically the "swiss army knife" of `require()`ing your native module's
+`.node` file.
+
+Throughout the course of Node's native addon history, addons have ended up being
+compiled in a variety of different places, depending on which build tool and which
+version of node was used. To make matters worse, now the `gyp` build tool can
+produce either a __Release__ or __Debug__ build, each being built into different
+locations.
+
+This module checks _all_ the possible locations that a native addon would be built
+at, and returns the first one that loads successfully.
+
+
+Installation
+------------
+
+Install with `npm`:
+
+``` bash
+$ npm install --save bindings
+```
+
+Or add it to the `"dependencies"` section of your `package.json` file.
+
+
+Example
+-------
+
+`require()`ing the proper bindings file for the current node version, platform
+and architecture is as simple as:
+
+``` js
+var bindings = require('bindings')('binding.node')
+
+// Use your bindings defined in your C files
+bindings.your_c_function()
+```
+
+
+Nice Error Output
+-----------------
+
+When the `.node` file could not be loaded, `node-bindings` throws an Error with
+a nice error message telling you exactly what was tried. You can also check the
+`err.tries` Array property.
+
+```
+Error: Could not load the bindings file. Tried:
+ → /Users/nrajlich/ref/build/binding.node
+ → /Users/nrajlich/ref/build/Debug/binding.node
+ → /Users/nrajlich/ref/build/Release/binding.node
+ → /Users/nrajlich/ref/out/Debug/binding.node
+ → /Users/nrajlich/ref/Debug/binding.node
+ → /Users/nrajlich/ref/out/Release/binding.node
+ → /Users/nrajlich/ref/Release/binding.node
+ → /Users/nrajlich/ref/build/default/binding.node
+ → /Users/nrajlich/ref/compiled/0.8.2/darwin/x64/binding.node
+    at bindings (/Users/nrajlich/ref/node_modules/bindings/bindings.js:84:13)
+    at Object.<anonymous> (/Users/nrajlich/ref/lib/ref.js:5:47)
+    at Module._compile (module.js:449:26)
+    at Object.Module._extensions..js (module.js:467:10)
+    at Module.load (module.js:356:32)
+    at Function.Module._load (module.js:312:12)
+    ...
+```
+
+The searching for the `.node` file will originate from the first directory in which has a `package.json` file is found.
+
+License
+-------
+
+(The MIT License)
+
+Copyright (c) 2012 Nathan Rajlich &lt;nathan@tootallnate.net&gt;
+
+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/bindings/bindings.js b/node_modules/bindings/bindings.js
new file mode 100644
index 0000000..727413a
--- /dev/null
+++ b/node_modules/bindings/bindings.js
@@ -0,0 +1,221 @@
+/**
+ * Module dependencies.
+ */
+
+var fs = require('fs'),
+  path = require('path'),
+  fileURLToPath = require('file-uri-to-path'),
+  join = path.join,
+  dirname = path.dirname,
+  exists =
+    (fs.accessSync &&
+      function(path) {
+        try {
+          fs.accessSync(path);
+        } catch (e) {
+          return false;
+        }
+        return true;
+      }) ||
+    fs.existsSync ||
+    path.existsSync,
+  defaults = {
+    arrow: process.env.NODE_BINDINGS_ARROW || ' → ',
+    compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled',
+    platform: process.platform,
+    arch: process.arch,
+    nodePreGyp:
+      'node-v' +
+      process.versions.modules +
+      '-' +
+      process.platform +
+      '-' +
+      process.arch,
+    version: process.versions.node,
+    bindings: 'bindings.node',
+    try: [
+      // node-gyp's linked version in the "build" dir
+      ['module_root', 'build', 'bindings'],
+      // node-waf and gyp_addon (a.k.a node-gyp)
+      ['module_root', 'build', 'Debug', 'bindings'],
+      ['module_root', 'build', 'Release', 'bindings'],
+      // Debug files, for development (legacy behavior, remove for node v0.9)
+      ['module_root', 'out', 'Debug', 'bindings'],
+      ['module_root', 'Debug', 'bindings'],
+      // Release files, but manually compiled (legacy behavior, remove for node v0.9)
+      ['module_root', 'out', 'Release', 'bindings'],
+      ['module_root', 'Release', 'bindings'],
+      // Legacy from node-waf, node <= 0.4.x
+      ['module_root', 'build', 'default', 'bindings'],
+      // Production "Release" buildtype binary (meh...)
+      ['module_root', 'compiled', 'version', 'platform', 'arch', 'bindings'],
+      // node-qbs builds
+      ['module_root', 'addon-build', 'release', 'install-root', 'bindings'],
+      ['module_root', 'addon-build', 'debug', 'install-root', 'bindings'],
+      ['module_root', 'addon-build', 'default', 'install-root', 'bindings'],
+      // node-pre-gyp path ./lib/binding/{node_abi}-{platform}-{arch}
+      ['module_root', 'lib', 'binding', 'nodePreGyp', 'bindings']
+    ]
+  };
+
+/**
+ * The main `bindings()` function loads the compiled bindings for a given module.
+ * It uses V8's Error API to determine the parent filename that this function is
+ * being invoked from, which is then used to find the root directory.
+ */
+
+function bindings(opts) {
+  // Argument surgery
+  if (typeof opts == 'string') {
+    opts = { bindings: opts };
+  } else if (!opts) {
+    opts = {};
+  }
+
+  // maps `defaults` onto `opts` object
+  Object.keys(defaults).map(function(i) {
+    if (!(i in opts)) opts[i] = defaults[i];
+  });
+
+  // Get the module root
+  if (!opts.module_root) {
+    opts.module_root = exports.getRoot(exports.getFileName());
+  }
+
+  // Ensure the given bindings name ends with .node
+  if (path.extname(opts.bindings) != '.node') {
+    opts.bindings += '.node';
+  }
+
+  // https://github.com/webpack/webpack/issues/4175#issuecomment-342931035
+  var requireFunc =
+    typeof __webpack_require__ === 'function'
+      ? __non_webpack_require__
+      : require;
+
+  var tries = [],
+    i = 0,
+    l = opts.try.length,
+    n,
+    b,
+    err;
+
+  for (; i < l; i++) {
+    n = join.apply(
+      null,
+      opts.try[i].map(function(p) {
+        return opts[p] || p;
+      })
+    );
+    tries.push(n);
+    try {
+      b = opts.path ? requireFunc.resolve(n) : requireFunc(n);
+      if (!opts.path) {
+        b.path = n;
+      }
+      return b;
+    } catch (e) {
+      if (e.code !== 'MODULE_NOT_FOUND' &&
+          e.code !== 'QUALIFIED_PATH_RESOLUTION_FAILED' &&
+          !/not find/i.test(e.message)) {
+        throw e;
+      }
+    }
+  }
+
+  err = new Error(
+    'Could not locate the bindings file. Tried:\n' +
+      tries
+        .map(function(a) {
+          return opts.arrow + a;
+        })
+        .join('\n')
+  );
+  err.tries = tries;
+  throw err;
+}
+module.exports = exports = bindings;
+
+/**
+ * Gets the filename of the JavaScript file that invokes this function.
+ * Used to help find the root directory of a module.
+ * Optionally accepts an filename argument to skip when searching for the invoking filename
+ */
+
+exports.getFileName = function getFileName(calling_file) {
+  var origPST = Error.prepareStackTrace,
+    origSTL = Error.stackTraceLimit,
+    dummy = {},
+    fileName;
+
+  Error.stackTraceLimit = 10;
+
+  Error.prepareStackTrace = function(e, st) {
+    for (var i = 0, l = st.length; i < l; i++) {
+      fileName = st[i].getFileName();
+      if (fileName !== __filename) {
+        if (calling_file) {
+          if (fileName !== calling_file) {
+            return;
+          }
+        } else {
+          return;
+        }
+      }
+    }
+  };
+
+  // run the 'prepareStackTrace' function above
+  Error.captureStackTrace(dummy);
+  dummy.stack;
+
+  // cleanup
+  Error.prepareStackTrace = origPST;
+  Error.stackTraceLimit = origSTL;
+
+  // handle filename that starts with "file://"
+  var fileSchema = 'file://';
+  if (fileName.indexOf(fileSchema) === 0) {
+    fileName = fileURLToPath(fileName);
+  }
+
+  return fileName;
+};
+
+/**
+ * Gets the root directory of a module, given an arbitrary filename
+ * somewhere in the module tree. The "root directory" is the directory
+ * containing the `package.json` file.
+ *
+ *   In:  /home/nate/node-native-module/lib/index.js
+ *   Out: /home/nate/node-native-module
+ */
+
+exports.getRoot = function getRoot(file) {
+  var dir = dirname(file),
+    prev;
+  while (true) {
+    if (dir === '.') {
+      // Avoids an infinite loop in rare cases, like the REPL
+      dir = process.cwd();
+    }
+    if (
+      exists(join(dir, 'package.json')) ||
+      exists(join(dir, 'node_modules'))
+    ) {
+      // Found the 'package.json' file or 'node_modules' dir; we're done
+      return dir;
+    }
+    if (prev === dir) {
+      // Got to the top
+      throw new Error(
+        'Could not find module root given file: "' +
+          file +
+          '". Do you have a `package.json` file? '
+      );
+    }
+    // Try the parent dir next
+    prev = dir;
+    dir = join(dir, '..');
+  }
+};
diff --git a/node_modules/bindings/package.json b/node_modules/bindings/package.json
new file mode 100644
index 0000000..d0f2394
--- /dev/null
+++ b/node_modules/bindings/package.json
@@ -0,0 +1,57 @@
+{
+  "_from": "bindings@^1.5.0",
+  "_id": "bindings@1.5.0",
+  "_inBundle": false,
+  "_integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+  "_location": "/bindings",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "bindings@^1.5.0",
+    "name": "bindings",
+    "escapedName": "bindings",
+    "rawSpec": "^1.5.0",
+    "saveSpec": null,
+    "fetchSpec": "^1.5.0"
+  },
+  "_requiredBy": [
+    "/@serialport/bindings"
+  ],
+  "_resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+  "_shasum": "10353c9e945334bc0511a6d90b38fbc7c9c504df",
+  "_spec": "bindings@^1.5.0",
+  "_where": "F:\\vent-display\\node_modules\\@serialport\\bindings",
+  "author": {
+    "name": "Nathan Rajlich",
+    "email": "nathan@tootallnate.net",
+    "url": "http://tootallnate.net"
+  },
+  "bugs": {
+    "url": "https://github.com/TooTallNate/node-bindings/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "file-uri-to-path": "1.0.0"
+  },
+  "deprecated": false,
+  "description": "Helper module for loading your native module's .node file",
+  "homepage": "https://github.com/TooTallNate/node-bindings",
+  "keywords": [
+    "native",
+    "addon",
+    "bindings",
+    "gyp",
+    "waf",
+    "c",
+    "c++"
+  ],
+  "license": "MIT",
+  "main": "./bindings.js",
+  "name": "bindings",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/TooTallNate/node-bindings.git"
+  },
+  "version": "1.5.0"
+}
diff --git a/node_modules/bl/.travis.yml b/node_modules/bl/.travis.yml
new file mode 100644
index 0000000..e0df89c
--- /dev/null
+++ b/node_modules/bl/.travis.yml
@@ -0,0 +1,16 @@
+sudo: false
+language: node_js
+node_js:
+  - '6'
+  - '8'
+  - '10'
+  - '12'
+  - '14'
+  - lts/*
+branches:
+  only:
+    - master
+notifications:
+  email:
+    - rod@vagg.org
+    - matteo.collina@gmail.com
diff --git a/node_modules/bl/BufferList.js b/node_modules/bl/BufferList.js
new file mode 100644
index 0000000..802020f
--- /dev/null
+++ b/node_modules/bl/BufferList.js
@@ -0,0 +1,396 @@
+'use strict'
+
+const { Buffer } = require('buffer')
+const symbol = Symbol.for('BufferList')
+
+function BufferList (buf) {
+  if (!(this instanceof BufferList)) {
+    return new BufferList(buf)
+  }
+
+  BufferList._init.call(this, buf)
+}
+
+BufferList._init = function _init (buf) {
+  Object.defineProperty(this, symbol, { value: true })
+
+  this._bufs = []
+  this.length = 0
+
+  if (buf) {
+    this.append(buf)
+  }
+}
+
+BufferList.prototype._new = function _new (buf) {
+  return new BufferList(buf)
+}
+
+BufferList.prototype._offset = function _offset (offset) {
+  if (offset === 0) {
+    return [0, 0]
+  }
+
+  let tot = 0
+
+  for (let i = 0; i < this._bufs.length; i++) {
+    const _t = tot + this._bufs[i].length
+    if (offset < _t || i === this._bufs.length - 1) {
+      return [i, offset - tot]
+    }
+    tot = _t
+  }
+}
+
+BufferList.prototype._reverseOffset = function (blOffset) {
+  const bufferId = blOffset[0]
+  let offset = blOffset[1]
+
+  for (let i = 0; i < bufferId; i++) {
+    offset += this._bufs[i].length
+  }
+
+  return offset
+}
+
+BufferList.prototype.get = function get (index) {
+  if (index > this.length || index < 0) {
+    return undefined
+  }
+
+  const offset = this._offset(index)
+
+  return this._bufs[offset[0]][offset[1]]
+}
+
+BufferList.prototype.slice = function slice (start, end) {
+  if (typeof start === 'number' && start < 0) {
+    start += this.length
+  }
+
+  if (typeof end === 'number' && end < 0) {
+    end += this.length
+  }
+
+  return this.copy(null, 0, start, end)
+}
+
+BufferList.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) {
+  if (typeof srcStart !== 'number' || srcStart < 0) {
+    srcStart = 0
+  }
+
+  if (typeof srcEnd !== 'number' || srcEnd > this.length) {
+    srcEnd = this.length
+  }
+
+  if (srcStart >= this.length) {
+    return dst || Buffer.alloc(0)
+  }
+
+  if (srcEnd <= 0) {
+    return dst || Buffer.alloc(0)
+  }
+
+  const copy = !!dst
+  const off = this._offset(srcStart)
+  const len = srcEnd - srcStart
+  let bytes = len
+  let bufoff = (copy && dstStart) || 0
+  let start = off[1]
+
+  // copy/slice everything
+  if (srcStart === 0 && srcEnd === this.length) {
+    if (!copy) {
+      // slice, but full concat if multiple buffers
+      return this._bufs.length === 1
+        ? this._bufs[0]
+        : Buffer.concat(this._bufs, this.length)
+    }
+
+    // copy, need to copy individual buffers
+    for (let i = 0; i < this._bufs.length; i++) {
+      this._bufs[i].copy(dst, bufoff)
+      bufoff += this._bufs[i].length
+    }
+
+    return dst
+  }
+
+  // easy, cheap case where it's a subset of one of the buffers
+  if (bytes <= this._bufs[off[0]].length - start) {
+    return copy
+      ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes)
+      : this._bufs[off[0]].slice(start, start + bytes)
+  }
+
+  if (!copy) {
+    // a slice, we need something to copy in to
+    dst = Buffer.allocUnsafe(len)
+  }
+
+  for (let i = off[0]; i < this._bufs.length; i++) {
+    const l = this._bufs[i].length - start
+
+    if (bytes > l) {
+      this._bufs[i].copy(dst, bufoff, start)
+      bufoff += l
+    } else {
+      this._bufs[i].copy(dst, bufoff, start, start + bytes)
+      bufoff += l
+      break
+    }
+
+    bytes -= l
+
+    if (start) {
+      start = 0
+    }
+  }
+
+  // safeguard so that we don't return uninitialized memory
+  if (dst.length > bufoff) return dst.slice(0, bufoff)
+
+  return dst
+}
+
+BufferList.prototype.shallowSlice = function shallowSlice (start, end) {
+  start = start || 0
+  end = typeof end !== 'number' ? this.length : end
+
+  if (start < 0) {
+    start += this.length
+  }
+
+  if (end < 0) {
+    end += this.length
+  }
+
+  if (start === end) {
+    return this._new()
+  }
+
+  const startOffset = this._offset(start)
+  const endOffset = this._offset(end)
+  const buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1)
+
+  if (endOffset[1] === 0) {
+    buffers.pop()
+  } else {
+    buffers[buffers.length - 1] = buffers[buffers.length - 1].slice(0, endOffset[1])
+  }
+
+  if (startOffset[1] !== 0) {
+    buffers[0] = buffers[0].slice(startOffset[1])
+  }
+
+  return this._new(buffers)
+}
+
+BufferList.prototype.toString = function toString (encoding, start, end) {
+  return this.slice(start, end).toString(encoding)
+}
+
+BufferList.prototype.consume = function consume (bytes) {
+  // first, normalize the argument, in accordance with how Buffer does it
+  bytes = Math.trunc(bytes)
+  // do nothing if not a positive number
+  if (Number.isNaN(bytes) || bytes <= 0) return this
+
+  while (this._bufs.length) {
+    if (bytes >= this._bufs[0].length) {
+      bytes -= this._bufs[0].length
+      this.length -= this._bufs[0].length
+      this._bufs.shift()
+    } else {
+      this._bufs[0] = this._bufs[0].slice(bytes)
+      this.length -= bytes
+      break
+    }
+  }
+
+  return this
+}
+
+BufferList.prototype.duplicate = function duplicate () {
+  const copy = this._new()
+
+  for (let i = 0; i < this._bufs.length; i++) {
+    copy.append(this._bufs[i])
+  }
+
+  return copy
+}
+
+BufferList.prototype.append = function append (buf) {
+  if (buf == null) {
+    return this
+  }
+
+  if (buf.buffer) {
+    // append a view of the underlying ArrayBuffer
+    this._appendBuffer(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength))
+  } else if (Array.isArray(buf)) {
+    for (let i = 0; i < buf.length; i++) {
+      this.append(buf[i])
+    }
+  } else if (this._isBufferList(buf)) {
+    // unwrap argument into individual BufferLists
+    for (let i = 0; i < buf._bufs.length; i++) {
+      this.append(buf._bufs[i])
+    }
+  } else {
+    // coerce number arguments to strings, since Buffer(number) does
+    // uninitialized memory allocation
+    if (typeof buf === 'number') {
+      buf = buf.toString()
+    }
+
+    this._appendBuffer(Buffer.from(buf))
+  }
+
+  return this
+}
+
+BufferList.prototype._appendBuffer = function appendBuffer (buf) {
+  this._bufs.push(buf)
+  this.length += buf.length
+}
+
+BufferList.prototype.indexOf = function (search, offset, encoding) {
+  if (encoding === undefined && typeof offset === 'string') {
+    encoding = offset
+    offset = undefined
+  }
+
+  if (typeof search === 'function' || Array.isArray(search)) {
+    throw new TypeError('The "value" argument must be one of type string, Buffer, BufferList, or Uint8Array.')
+  } else if (typeof search === 'number') {
+    search = Buffer.from([search])
+  } else if (typeof search === 'string') {
+    search = Buffer.from(search, encoding)
+  } else if (this._isBufferList(search)) {
+    search = search.slice()
+  } else if (Array.isArray(search.buffer)) {
+    search = Buffer.from(search.buffer, search.byteOffset, search.byteLength)
+  } else if (!Buffer.isBuffer(search)) {
+    search = Buffer.from(search)
+  }
+
+  offset = Number(offset || 0)
+
+  if (isNaN(offset)) {
+    offset = 0
+  }
+
+  if (offset < 0) {
+    offset = this.length + offset
+  }
+
+  if (offset < 0) {
+    offset = 0
+  }
+
+  if (search.length === 0) {
+    return offset > this.length ? this.length : offset
+  }
+
+  const blOffset = this._offset(offset)
+  let blIndex = blOffset[0] // index of which internal buffer we're working on
+  let buffOffset = blOffset[1] // offset of the internal buffer we're working on
+
+  // scan over each buffer
+  for (; blIndex < this._bufs.length; blIndex++) {
+    const buff = this._bufs[blIndex]
+
+    while (buffOffset < buff.length) {
+      const availableWindow = buff.length - buffOffset
+
+      if (availableWindow >= search.length) {
+        const nativeSearchResult = buff.indexOf(search, buffOffset)
+
+        if (nativeSearchResult !== -1) {
+          return this._reverseOffset([blIndex, nativeSearchResult])
+        }
+
+        buffOffset = buff.length - search.length + 1 // end of native search window
+      } else {
+        const revOffset = this._reverseOffset([blIndex, buffOffset])
+
+        if (this._match(revOffset, search)) {
+          return revOffset
+        }
+
+        buffOffset++
+      }
+    }
+
+    buffOffset = 0
+  }
+
+  return -1
+}
+
+BufferList.prototype._match = function (offset, search) {
+  if (this.length - offset < search.length) {
+    return false
+  }
+
+  for (let searchOffset = 0; searchOffset < search.length; searchOffset++) {
+    if (this.get(offset + searchOffset) !== search[searchOffset]) {
+      return false
+    }
+  }
+  return true
+}
+
+;(function () {
+  const methods = {
+    readDoubleBE: 8,
+    readDoubleLE: 8,
+    readFloatBE: 4,
+    readFloatLE: 4,
+    readInt32BE: 4,
+    readInt32LE: 4,
+    readUInt32BE: 4,
+    readUInt32LE: 4,
+    readInt16BE: 2,
+    readInt16LE: 2,
+    readUInt16BE: 2,
+    readUInt16LE: 2,
+    readInt8: 1,
+    readUInt8: 1,
+    readIntBE: null,
+    readIntLE: null,
+    readUIntBE: null,
+    readUIntLE: null
+  }
+
+  for (const m in methods) {
+    (function (m) {
+      if (methods[m] === null) {
+        BufferList.prototype[m] = function (offset, byteLength) {
+          return this.slice(offset, offset + byteLength)[m](0, byteLength)
+        }
+      } else {
+        BufferList.prototype[m] = function (offset) {
+          return this.slice(offset, offset + methods[m])[m](0)
+        }
+      }
+    }(m))
+  }
+}())
+
+// Used internally by the class and also as an indicator of this object being
+// a `BufferList`. It's not possible to use `instanceof BufferList` in a browser
+// environment because there could be multiple different copies of the
+// BufferList class and some `BufferList`s might be `BufferList`s.
+BufferList.prototype._isBufferList = function _isBufferList (b) {
+  return b instanceof BufferList || BufferList.isBufferList(b)
+}
+
+BufferList.isBufferList = function isBufferList (b) {
+  return b != null && b[symbol]
+}
+
+module.exports = BufferList
diff --git a/node_modules/bl/LICENSE.md b/node_modules/bl/LICENSE.md
new file mode 100644
index 0000000..ecbe516
--- /dev/null
+++ b/node_modules/bl/LICENSE.md
@@ -0,0 +1,13 @@
+The MIT License (MIT)
+=====================
+
+Copyright (c) 2013-2019 bl contributors
+----------------------------------
+
+*bl contributors listed at <https://github.com/rvagg/bl#contributors>*
+
+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/bl/README.md b/node_modules/bl/README.md
new file mode 100644
index 0000000..9680b1d
--- /dev/null
+++ b/node_modules/bl/README.md
@@ -0,0 +1,247 @@
+# bl *(BufferList)*
+
+[![Build Status](https://api.travis-ci.com/rvagg/bl.svg?branch=master)](https://travis-ci.com/rvagg/bl/)
+
+**A Node.js Buffer list collector, reader and streamer thingy.**
+
+[![NPM](https://nodei.co/npm/bl.svg)](https://nodei.co/npm/bl/)
+
+**bl** is a storage object for collections of Node Buffers, exposing them with the main Buffer readable API. Also works as a duplex stream so you can collect buffers from a stream that emits them and emit buffers to a stream that consumes them!
+
+The original buffers are kept intact and copies are only done as necessary. Any reads that require the use of a single original buffer will return a slice of that buffer only (which references the same memory as the original buffer). Reads that span buffers perform concatenation as required and return the results transparently.
+
+```js
+const { BufferList } = require('bl')
+
+const bl = new BufferList()
+bl.append(Buffer.from('abcd'))
+bl.append(Buffer.from('efg'))
+bl.append('hi')                     // bl will also accept & convert Strings
+bl.append(Buffer.from('j'))
+bl.append(Buffer.from([ 0x3, 0x4 ]))
+
+console.log(bl.length) // 12
+
+console.log(bl.slice(0, 10).toString('ascii')) // 'abcdefghij'
+console.log(bl.slice(3, 10).toString('ascii')) // 'defghij'
+console.log(bl.slice(3, 6).toString('ascii'))  // 'def'
+console.log(bl.slice(3, 8).toString('ascii'))  // 'defgh'
+console.log(bl.slice(5, 10).toString('ascii')) // 'fghij'
+
+console.log(bl.indexOf('def')) // 3
+console.log(bl.indexOf('asdf')) // -1
+
+// or just use toString!
+console.log(bl.toString())               // 'abcdefghij\u0003\u0004'
+console.log(bl.toString('ascii', 3, 8))  // 'defgh'
+console.log(bl.toString('ascii', 5, 10)) // 'fghij'
+
+// other standard Buffer readables
+console.log(bl.readUInt16BE(10)) // 0x0304
+console.log(bl.readUInt16LE(10)) // 0x0403
+```
+
+Give it a callback in the constructor and use it just like **[concat-stream](https://github.com/maxogden/node-concat-stream)**:
+
+```js
+const { BufferListStream } = require('bl')
+const fs = require('fs')
+
+fs.createReadStream('README.md')
+  .pipe(BufferListStream((err, data) => { // note 'new' isn't strictly required
+    // `data` is a complete Buffer object containing the full data
+    console.log(data.toString())
+  }))
+```
+
+Note that when you use the *callback* method like this, the resulting `data` parameter is a concatenation of all `Buffer` objects in the list. If you want to avoid the overhead of this concatenation (in cases of extreme performance consciousness), then avoid the *callback* method and just listen to `'end'` instead, like a standard Stream.
+
+Or to fetch a URL using [hyperquest](https://github.com/substack/hyperquest) (should work with [request](http://github.com/mikeal/request) and even plain Node http too!):
+
+```js
+const hyperquest = require('hyperquest')
+const { BufferListStream } = require('bl')
+
+const url = 'https://raw.github.com/rvagg/bl/master/README.md'
+
+hyperquest(url).pipe(BufferListStream((err, data) => {
+  console.log(data.toString())
+}))
+```
+
+Or, use it as a readable stream to recompose a list of Buffers to an output source:
+
+```js
+const { BufferListStream } = require('bl')
+const fs = require('fs')
+
+var bl = new BufferListStream()
+bl.append(Buffer.from('abcd'))
+bl.append(Buffer.from('efg'))
+bl.append(Buffer.from('hi'))
+bl.append(Buffer.from('j'))
+
+bl.pipe(fs.createWriteStream('gibberish.txt'))
+```
+
+## API
+
+  * <a href="#ctor"><code><b>new BufferList([ buf ])</b></code></a>
+  * <a href="#isBufferList"><code><b>BufferList.isBufferList(obj)</b></code></a>
+  * <a href="#length"><code>bl.<b>length</b></code></a>
+  * <a href="#append"><code>bl.<b>append(buffer)</b></code></a>
+  * <a href="#get"><code>bl.<b>get(index)</b></code></a>
+  * <a href="#indexOf"><code>bl.<b>indexOf(value[, byteOffset][, encoding])</b></code></a>
+  * <a href="#slice"><code>bl.<b>slice([ start[, end ] ])</b></code></a>
+  * <a href="#shallowSlice"><code>bl.<b>shallowSlice([ start[, end ] ])</b></code></a>
+  * <a href="#copy"><code>bl.<b>copy(dest, [ destStart, [ srcStart [, srcEnd ] ] ])</b></code></a>
+  * <a href="#duplicate"><code>bl.<b>duplicate()</b></code></a>
+  * <a href="#consume"><code>bl.<b>consume(bytes)</b></code></a>
+  * <a href="#toString"><code>bl.<b>toString([encoding, [ start, [ end ]]])</b></code></a>
+  * <a href="#readXX"><code>bl.<b>readDoubleBE()</b></code>, <code>bl.<b>readDoubleLE()</b></code>, <code>bl.<b>readFloatBE()</b></code>, <code>bl.<b>readFloatLE()</b></code>, <code>bl.<b>readInt32BE()</b></code>, <code>bl.<b>readInt32LE()</b></code>, <code>bl.<b>readUInt32BE()</b></code>, <code>bl.<b>readUInt32LE()</b></code>, <code>bl.<b>readInt16BE()</b></code>, <code>bl.<b>readInt16LE()</b></code>, <code>bl.<b>readUInt16BE()</b></code>, <code>bl.<b>readUInt16LE()</b></code>, <code>bl.<b>readInt8()</b></code>, <code>bl.<b>readUInt8()</b></code></a>
+  * <a href="#ctorStream"><code><b>new BufferListStream([ callback ])</b></code></a>
+
+--------------------------------------------------------
+<a name="ctor"></a>
+### new BufferList([ Buffer | Buffer array | BufferList | BufferList array | String ])
+No arguments are _required_ for the constructor, but you can initialise the list by passing in a single `Buffer` object or an array of `Buffer` objects.
+
+`new` is not strictly required, if you don't instantiate a new object, it will be done automatically for you so you can create a new instance simply with:
+
+```js
+const { BufferList } = require('bl')
+const bl = BufferList()
+
+// equivalent to:
+
+const { BufferList } = require('bl')
+const bl = new BufferList()
+```
+
+--------------------------------------------------------
+<a name="isBufferList"></a>
+### BufferList.isBufferList(obj)
+Determines if the passed object is a `BufferList`. It will return `true` if the passed object is an instance of `BufferList` **or** `BufferListStream` and `false` otherwise.
+
+N.B. this won't return `true` for `BufferList` or `BufferListStream` instances created by versions of this library before this static method was added.
+
+--------------------------------------------------------
+<a name="length"></a>
+### bl.length
+Get the length of the list in bytes. This is the sum of the lengths of all of the buffers contained in the list, minus any initial offset for a semi-consumed buffer at the beginning. Should accurately represent the total number of bytes that can be read from the list.
+
+--------------------------------------------------------
+<a name="append"></a>
+### bl.append(Buffer | Buffer array | BufferList | BufferList array | String)
+`append(buffer)` adds an additional buffer or BufferList to the internal list. `this` is returned so it can be chained.
+
+--------------------------------------------------------
+<a name="get"></a>
+### bl.get(index)
+`get()` will return the byte at the specified index.
+
+--------------------------------------------------------
+<a name="indexOf"></a>
+### bl.indexOf(value[, byteOffset][, encoding])
+`get()` will return the byte at the specified index.
+`indexOf()` method returns the first index at which a given element can be found in the BufferList, or -1 if it is not present.
+
+--------------------------------------------------------
+<a name="slice"></a>
+### bl.slice([ start, [ end ] ])
+`slice()` returns a new `Buffer` object containing the bytes within the range specified. Both `start` and `end` are optional and will default to the beginning and end of the list respectively.
+
+If the requested range spans a single internal buffer then a slice of that buffer will be returned which shares the original memory range of that Buffer. If the range spans multiple buffers then copy operations will likely occur to give you a uniform Buffer.
+
+--------------------------------------------------------
+<a name="shallowSlice"></a>
+### bl.shallowSlice([ start, [ end ] ])
+`shallowSlice()` returns a new `BufferList` object containing the bytes within the range specified. Both `start` and `end` are optional and will default to the beginning and end of the list respectively.
+
+No copies will be performed. All buffers in the result share memory with the original list.
+
+--------------------------------------------------------
+<a name="copy"></a>
+### bl.copy(dest, [ destStart, [ srcStart [, srcEnd ] ] ])
+`copy()` copies the content of the list in the `dest` buffer, starting from `destStart` and containing the bytes within the range specified with `srcStart` to `srcEnd`. `destStart`, `start` and `end` are optional and will default to the beginning of the `dest` buffer, and the beginning and end of the list respectively.
+
+--------------------------------------------------------
+<a name="duplicate"></a>
+### bl.duplicate()
+`duplicate()` performs a **shallow-copy** of the list. The internal Buffers remains the same, so if you change the underlying Buffers, the change will be reflected in both the original and the duplicate. This method is needed if you want to call `consume()` or `pipe()` and still keep the original list.Example:
+
+```js
+var bl = new BufferListStream()
+
+bl.append('hello')
+bl.append(' world')
+bl.append('\n')
+
+bl.duplicate().pipe(process.stdout, { end: false })
+
+console.log(bl.toString())
+```
+
+--------------------------------------------------------
+<a name="consume"></a>
+### bl.consume(bytes)
+`consume()` will shift bytes *off the start of the list*. The number of bytes consumed don't need to line up with the sizes of the internal Buffers&mdash;initial offsets will be calculated accordingly in order to give you a consistent view of the data.
+
+--------------------------------------------------------
+<a name="toString"></a>
+### bl.toString([encoding, [ start, [ end ]]])
+`toString()` will return a string representation of the buffer. The optional `start` and `end` arguments are passed on to `slice()`, while the `encoding` is passed on to `toString()` of the resulting Buffer. See the [Buffer#toString()](http://nodejs.org/docs/latest/api/buffer.html#buffer_buf_tostring_encoding_start_end) documentation for more information.
+
+--------------------------------------------------------
+<a name="readXX"></a>
+### bl.readDoubleBE(), bl.readDoubleLE(), bl.readFloatBE(), bl.readFloatLE(), bl.readInt32BE(), bl.readInt32LE(), bl.readUInt32BE(), bl.readUInt32LE(), bl.readInt16BE(), bl.readInt16LE(), bl.readUInt16BE(), bl.readUInt16LE(), bl.readInt8(), bl.readUInt8()
+
+All of the standard byte-reading methods of the `Buffer` interface are implemented and will operate across internal Buffer boundaries transparently.
+
+See the <b><code>[Buffer](http://nodejs.org/docs/latest/api/buffer.html)</code></b> documentation for how these work.
+
+--------------------------------------------------------
+<a name="ctorStream"></a>
+### new BufferListStream([ callback | Buffer | Buffer array | BufferList | BufferList array | String ])
+**BufferListStream** is a Node **[Duplex Stream](http://nodejs.org/docs/latest/api/stream.html#stream_class_stream_duplex)**, so it can be read from and written to like a standard Node stream. You can also `pipe()` to and from a **BufferListStream** instance.
+
+The constructor takes an optional callback, if supplied, the callback will be called with an error argument followed by a reference to the **bl** instance, when `bl.end()` is called (i.e. from a piped stream). This is a convenient method of collecting the entire contents of a stream, particularly when the stream is *chunky*, such as a network stream.
+
+Normally, no arguments are required for the constructor, but you can initialise the list by passing in a single `Buffer` object or an array of `Buffer` object.
+
+`new` is not strictly required, if you don't instantiate a new object, it will be done automatically for you so you can create a new instance simply with:
+
+```js
+const { BufferListStream } = require('bl')
+const bl = BufferListStream()
+
+// equivalent to:
+
+const { BufferListStream } = require('bl')
+const bl = new BufferListStream()
+```
+
+N.B. For backwards compatibility reasons, `BufferListStream` is the **default** export when you `require('bl')`:
+
+```js
+const { BufferListStream } = require('bl')
+// equivalent to:
+const BufferListStream = require('bl')
+```
+
+--------------------------------------------------------
+
+## Contributors
+
+**bl** is brought to you by the following hackers:
+
+ * [Rod Vagg](https://github.com/rvagg)
+ * [Matteo Collina](https://github.com/mcollina)
+ * [Jarett Cruger](https://github.com/jcrugzz)
+
+<a name="license"></a>
+## License &amp; copyright
+
+Copyright (c) 2013-2019 bl contributors (listed above).
+
+bl is licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE.md file for more details.
diff --git a/node_modules/bl/bl.js b/node_modules/bl/bl.js
new file mode 100644
index 0000000..40228f8
--- /dev/null
+++ b/node_modules/bl/bl.js
@@ -0,0 +1,84 @@
+'use strict'
+
+const DuplexStream = require('readable-stream').Duplex
+const inherits = require('inherits')
+const BufferList = require('./BufferList')
+
+function BufferListStream (callback) {
+  if (!(this instanceof BufferListStream)) {
+    return new BufferListStream(callback)
+  }
+
+  if (typeof callback === 'function') {
+    this._callback = callback
+
+    const piper = function piper (err) {
+      if (this._callback) {
+        this._callback(err)
+        this._callback = null
+      }
+    }.bind(this)
+
+    this.on('pipe', function onPipe (src) {
+      src.on('error', piper)
+    })
+    this.on('unpipe', function onUnpipe (src) {
+      src.removeListener('error', piper)
+    })
+
+    callback = null
+  }
+
+  BufferList._init.call(this, callback)
+  DuplexStream.call(this)
+}
+
+inherits(BufferListStream, DuplexStream)
+Object.assign(BufferListStream.prototype, BufferList.prototype)
+
+BufferListStream.prototype._new = function _new (callback) {
+  return new BufferListStream(callback)
+}
+
+BufferListStream.prototype._write = function _write (buf, encoding, callback) {
+  this._appendBuffer(buf)
+
+  if (typeof callback === 'function') {
+    callback()
+  }
+}
+
+BufferListStream.prototype._read = function _read (size) {
+  if (!this.length) {
+    return this.push(null)
+  }
+
+  size = Math.min(size, this.length)
+  this.push(this.slice(0, size))
+  this.consume(size)
+}
+
+BufferListStream.prototype.end = function end (chunk) {
+  DuplexStream.prototype.end.call(this, chunk)
+
+  if (this._callback) {
+    this._callback(null, this.slice())
+    this._callback = null
+  }
+}
+
+BufferListStream.prototype._destroy = function _destroy (err, cb) {
+  this._bufs.length = 0
+  this.length = 0
+  cb(err)
+}
+
+BufferListStream.prototype._isBufferList = function _isBufferList (b) {
+  return b instanceof BufferListStream || b instanceof BufferList || BufferListStream.isBufferList(b)
+}
+
+BufferListStream.isBufferList = BufferList.isBufferList
+
+module.exports = BufferListStream
+module.exports.BufferListStream = BufferListStream
+module.exports.BufferList = BufferList
diff --git a/node_modules/bl/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/bl/node_modules/readable-stream/CONTRIBUTING.md
new file mode 100644
index 0000000..f478d58
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/CONTRIBUTING.md
@@ -0,0 +1,38 @@
+# Developer's Certificate of Origin 1.1
+
+By making a contribution to this project, I certify that:
+
+* (a) The contribution was created in whole or in part by me and I
+  have the right to submit it under the open source license
+  indicated in the file; or
+
+* (b) The contribution is based upon previous work that, to the best
+  of my knowledge, is covered under an appropriate open source
+  license and I have the right under that license to submit that
+  work with modifications, whether created in whole or in part
+  by me, under the same open source license (unless I am
+  permitted to submit under a different license), as indicated
+  in the file; or
+
+* (c) The contribution was provided directly to me by some other
+  person who certified (a), (b) or (c) and I have not modified
+  it.
+
+* (d) I understand and agree that this project and the contribution
+  are public and that a record of the contribution (including all
+  personal information I submit with it, including my sign-off) is
+  maintained indefinitely and may be redistributed consistent with
+  this project or the open source license(s) involved.
+
+## Moderation Policy
+
+The [Node.js Moderation Policy] applies to this WG.
+
+## Code of Conduct
+
+The [Node.js Code of Conduct][] applies to this WG.
+
+[Node.js Code of Conduct]:
+https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md
+[Node.js Moderation Policy]:
+https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md
diff --git a/node_modules/bl/node_modules/readable-stream/GOVERNANCE.md b/node_modules/bl/node_modules/readable-stream/GOVERNANCE.md
new file mode 100644
index 0000000..16ffb93
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/GOVERNANCE.md
@@ -0,0 +1,136 @@
+### Streams Working Group
+
+The Node.js Streams is jointly governed by a Working Group
+(WG)
+that is responsible for high-level guidance of the project.
+
+The WG has final authority over this project including:
+
+* Technical direction
+* Project governance and process (including this policy)
+* Contribution policy
+* GitHub repository hosting
+* Conduct guidelines
+* Maintaining the list of additional Collaborators
+
+For the current list of WG members, see the project
+[README.md](./README.md#current-project-team-members).
+
+### Collaborators
+
+The readable-stream GitHub repository is
+maintained by the WG and additional Collaborators who are added by the
+WG on an ongoing basis.
+
+Individuals making significant and valuable contributions are made
+Collaborators and given commit-access to the project. These
+individuals are identified by the WG and their addition as
+Collaborators is discussed during the WG meeting.
+
+_Note:_ If you make a significant contribution and are not considered
+for commit-access log an issue or contact a WG member directly and it
+will be brought up in the next WG meeting.
+
+Modifications of the contents of the readable-stream repository are
+made on
+a collaborative basis. Anybody with a GitHub account may propose a
+modification via pull request and it will be considered by the project
+Collaborators. All pull requests must be reviewed and accepted by a
+Collaborator with sufficient expertise who is able to take full
+responsibility for the change. In the case of pull requests proposed
+by an existing Collaborator, an additional Collaborator is required
+for sign-off. Consensus should be sought if additional Collaborators
+participate and there is disagreement around a particular
+modification. See _Consensus Seeking Process_ below for further detail
+on the consensus model used for governance.
+
+Collaborators may opt to elevate significant or controversial
+modifications, or modifications that have not found consensus to the
+WG for discussion by assigning the ***WG-agenda*** tag to a pull
+request or issue. The WG should serve as the final arbiter where
+required.
+
+For the current list of Collaborators, see the project
+[README.md](./README.md#members).
+
+### WG Membership
+
+WG seats are not time-limited.  There is no fixed size of the WG.
+However, the expected target is between 6 and 12, to ensure adequate
+coverage of important areas of expertise, balanced with the ability to
+make decisions efficiently.
+
+There is no specific set of requirements or qualifications for WG
+membership beyond these rules.
+
+The WG may add additional members to the WG by unanimous consensus.
+
+A WG member may be removed from the WG by voluntary resignation, or by
+unanimous consensus of all other WG members.
+
+Changes to WG membership should be posted in the agenda, and may be
+suggested as any other agenda item (see "WG Meetings" below).
+
+If an addition or removal is proposed during a meeting, and the full
+WG is not in attendance to participate, then the addition or removal
+is added to the agenda for the subsequent meeting.  This is to ensure
+that all members are given the opportunity to participate in all
+membership decisions.  If a WG member is unable to attend a meeting
+where a planned membership decision is being made, then their consent
+is assumed.
+
+No more than 1/3 of the WG members may be affiliated with the same
+employer.  If removal or resignation of a WG member, or a change of
+employment by a WG member, creates a situation where more than 1/3 of
+the WG membership shares an employer, then the situation must be
+immediately remedied by the resignation or removal of one or more WG
+members affiliated with the over-represented employer(s).
+
+### WG Meetings
+
+The WG meets occasionally on a Google Hangout On Air. A designated moderator
+approved by the WG runs the meeting. Each meeting should be
+published to YouTube.
+
+Items are added to the WG agenda that are considered contentious or
+are modifications of governance, contribution policy, WG membership,
+or release process.
+
+The intention of the agenda is not to approve or review all patches;
+that should happen continuously on GitHub and be handled by the larger
+group of Collaborators.
+
+Any community member or contributor can ask that something be added to
+the next meeting's agenda by logging a GitHub Issue. Any Collaborator,
+WG member or the moderator can add the item to the agenda by adding
+the ***WG-agenda*** tag to the issue.
+
+Prior to each WG meeting the moderator will share the Agenda with
+members of the WG. WG members can add any items they like to the
+agenda at the beginning of each meeting. The moderator and the WG
+cannot veto or remove items.
+
+The WG may invite persons or representatives from certain projects to
+participate in a non-voting capacity.
+
+The moderator is responsible for summarizing the discussion of each
+agenda item and sends it as a pull request after the meeting.
+
+### Consensus Seeking Process
+
+The WG follows a
+[Consensus
+Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making)
+decision-making model.
+
+When an agenda item has appeared to reach a consensus the moderator
+will ask "Does anyone object?" as a final call for dissent from the
+consensus.
+
+If an agenda item cannot reach a consensus a WG member can call for
+either a closing vote or a vote to table the issue to the next
+meeting. The call for a vote must be seconded by a majority of the WG
+or else the discussion will continue. Simple majority wins.
+
+Note that changes to WG membership require a majority consensus.  See
+"WG Membership" above.
diff --git a/node_modules/bl/node_modules/readable-stream/LICENSE b/node_modules/bl/node_modules/readable-stream/LICENSE
new file mode 100644
index 0000000..2873b3b
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/LICENSE
@@ -0,0 +1,47 @@
+Node.js is licensed for use as follows:
+
+"""
+Copyright Node.js contributors. All rights reserved.
+
+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.
+"""
+
+This license applies to parts of Node.js originating from the
+https://github.com/joyent/node repository:
+
+"""
+Copyright Joyent, Inc. and other Node contributors. All rights reserved.
+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/bl/node_modules/readable-stream/README.md b/node_modules/bl/node_modules/readable-stream/README.md
new file mode 100644
index 0000000..6f035ab
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/README.md
@@ -0,0 +1,106 @@
+# readable-stream
+
+***Node.js core streams for userland*** [![Build Status](https://travis-ci.com/nodejs/readable-stream.svg?branch=master)](https://travis-ci.com/nodejs/readable-stream)
+
+
+[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/)
+[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/)
+
+
+[![Sauce Test Status](https://saucelabs.com/browser-matrix/readabe-stream.svg)](https://saucelabs.com/u/readabe-stream)
+
+```bash
+npm install --save readable-stream
+```
+
+This package is a mirror of the streams implementations in Node.js.
+
+Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v10.19.0/docs/api/stream.html).
+
+If you want to guarantee a stable streams base, regardless of what version of
+Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).
+
+As of version 2.0.0 **readable-stream** uses semantic versioning.
+
+## Version 3.x.x
+
+v3.x.x of `readable-stream` is a cut from Node 10. This version supports Node 6, 8, and 10, as well as evergreen browsers, IE 11 and latest Safari. The breaking changes introduced by v3 are composed by the combined breaking changes in [Node v9](https://nodejs.org/en/blog/release/v9.0.0/) and [Node v10](https://nodejs.org/en/blog/release/v10.0.0/), as follows:
+
+1. Error codes: https://github.com/nodejs/node/pull/13310,
+   https://github.com/nodejs/node/pull/13291,
+   https://github.com/nodejs/node/pull/16589,
+   https://github.com/nodejs/node/pull/15042,
+   https://github.com/nodejs/node/pull/15665,
+   https://github.com/nodejs/readable-stream/pull/344
+2. 'readable' have precedence over flowing
+   https://github.com/nodejs/node/pull/18994
+3. make virtual methods errors consistent
+   https://github.com/nodejs/node/pull/18813
+4. updated streams error handling
+   https://github.com/nodejs/node/pull/18438
+5. writable.end should return this.
+   https://github.com/nodejs/node/pull/18780
+6. readable continues to read when push('')
+   https://github.com/nodejs/node/pull/18211
+7. add custom inspect to BufferList
+   https://github.com/nodejs/node/pull/17907
+8. always defer 'readable' with nextTick
+   https://github.com/nodejs/node/pull/17979
+
+## Version 2.x.x
+v2.x.x of `readable-stream` is a cut of the stream module from Node 8 (there have been no semver-major changes from Node 4 to 8). This version supports all Node.js versions from 0.8, as well as evergreen browsers and IE 10 & 11.
+
+### Big Thanks
+
+Cross-browser Testing Platform and Open Source <3 Provided by [Sauce Labs][sauce]
+
+# Usage
+
+You can swap your `require('stream')` with `require('readable-stream')`
+without any changes, if you are just using one of the main classes and
+functions.
+
+```js
+const {
+  Readable,
+  Writable,
+  Transform,
+  Duplex,
+  pipeline,
+  finished
+} = require('readable-stream')
+````
+
+Note that `require('stream')` will return `Stream`, while
+`require('readable-stream')` will return `Readable`. We discourage using
+whatever is exported directly, but rather use one of the properties as
+shown in the example above.
+
+# Streams Working Group
+
+`readable-stream` is maintained by the Streams Working Group, which
+oversees the development and maintenance of the Streams API within
+Node.js. The responsibilities of the Streams Working Group include:
+
+* Addressing stream issues on the Node.js issue tracker.
+* Authoring and editing stream documentation within the Node.js project.
+* Reviewing changes to stream subclasses within the Node.js project.
+* Redirecting changes to streams from the Node.js project to this
+  project.
+* Assisting in the implementation of stream providers within Node.js.
+* Recommending versions of `readable-stream` to be included in Node.js.
+* Messaging about the future of streams to give the community advance
+  notice of changes.
+
+<a name="members"></a>
+## Team Members
+
+* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) &lt;calvin.metcalf@gmail.com&gt;
+  - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242
+* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) &lt;mathiasbuus@gmail.com&gt;
+* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) &lt;matteo.collina@gmail.com&gt;
+  - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E
+* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) &lt;shestak.irina@gmail.com&gt;
+* **Yoshua Wyuts** ([@yoshuawuyts](https://github.com/yoshuawuyts)) &lt;yoshuawuyts@gmail.com&gt;
+
+[sauce]: https://saucelabs.com
diff --git a/node_modules/bl/node_modules/readable-stream/errors-browser.js b/node_modules/bl/node_modules/readable-stream/errors-browser.js
new file mode 100644
index 0000000..fb8e73e
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/errors-browser.js
@@ -0,0 +1,127 @@
+'use strict';
+
+function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
+
+var codes = {};
+
+function createErrorType(code, message, Base) {
+  if (!Base) {
+    Base = Error;
+  }
+
+  function getMessage(arg1, arg2, arg3) {
+    if (typeof message === 'string') {
+      return message;
+    } else {
+      return message(arg1, arg2, arg3);
+    }
+  }
+
+  var NodeError =
+  /*#__PURE__*/
+  function (_Base) {
+    _inheritsLoose(NodeError, _Base);
+
+    function NodeError(arg1, arg2, arg3) {
+      return _Base.call(this, getMessage(arg1, arg2, arg3)) || this;
+    }
+
+    return NodeError;
+  }(Base);
+
+  NodeError.prototype.name = Base.name;
+  NodeError.prototype.code = code;
+  codes[code] = NodeError;
+} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js
+
+
+function oneOf(expected, thing) {
+  if (Array.isArray(expected)) {
+    var len = expected.length;
+    expected = expected.map(function (i) {
+      return String(i);
+    });
+
+    if (len > 2) {
+      return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1];
+    } else if (len === 2) {
+      return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]);
+    } else {
+      return "of ".concat(thing, " ").concat(expected[0]);
+    }
+  } else {
+    return "of ".concat(thing, " ").concat(String(expected));
+  }
+} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
+
+
+function startsWith(str, search, pos) {
+  return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
+} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
+
+
+function endsWith(str, search, this_len) {
+  if (this_len === undefined || this_len > str.length) {
+    this_len = str.length;
+  }
+
+  return str.substring(this_len - search.length, this_len) === search;
+} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
+
+
+function includes(str, search, start) {
+  if (typeof start !== 'number') {
+    start = 0;
+  }
+
+  if (start + search.length > str.length) {
+    return false;
+  } else {
+    return str.indexOf(search, start) !== -1;
+  }
+}
+
+createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {
+  return 'The value "' + value + '" is invalid for option "' + name + '"';
+}, TypeError);
+createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {
+  // determiner: 'must be' or 'must not be'
+  var determiner;
+
+  if (typeof expected === 'string' && startsWith(expected, 'not ')) {
+    determiner = 'must not be';
+    expected = expected.replace(/^not /, '');
+  } else {
+    determiner = 'must be';
+  }
+
+  var msg;
+
+  if (endsWith(name, ' argument')) {
+    // For cases like 'first argument'
+    msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
+  } else {
+    var type = includes(name, '.') ? 'property' : 'argument';
+    msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
+  }
+
+  msg += ". Received type ".concat(typeof actual);
+  return msg;
+}, TypeError);
+createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');
+createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {
+  return 'The ' + name + ' method is not implemented';
+});
+createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');
+createErrorType('ERR_STREAM_DESTROYED', function (name) {
+  return 'Cannot call ' + name + ' after a stream was destroyed';
+});
+createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');
+createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');
+createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');
+createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
+createErrorType('ERR_UNKNOWN_ENCODING', function (arg) {
+  return 'Unknown encoding: ' + arg;
+}, TypeError);
+createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');
+module.exports.codes = codes;
diff --git a/node_modules/bl/node_modules/readable-stream/errors.js b/node_modules/bl/node_modules/readable-stream/errors.js
new file mode 100644
index 0000000..8471526
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/errors.js
@@ -0,0 +1,116 @@
+'use strict';
+
+const codes = {};
+
+function createErrorType(code, message, Base) {
+  if (!Base) {
+    Base = Error
+  }
+
+  function getMessage (arg1, arg2, arg3) {
+    if (typeof message === 'string') {
+      return message
+    } else {
+      return message(arg1, arg2, arg3)
+    }
+  }
+
+  class NodeError extends Base {
+    constructor (arg1, arg2, arg3) {
+      super(getMessage(arg1, arg2, arg3));
+    }
+  }
+
+  NodeError.prototype.name = Base.name;
+  NodeError.prototype.code = code;
+
+  codes[code] = NodeError;
+}
+
+// https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js
+function oneOf(expected, thing) {
+  if (Array.isArray(expected)) {
+    const len = expected.length;
+    expected = expected.map((i) => String(i));
+    if (len > 2) {
+      return `one of ${thing} ${expected.slice(0, len - 1).join(', ')}, or ` +
+             expected[len - 1];
+    } else if (len === 2) {
+      return `one of ${thing} ${expected[0]} or ${expected[1]}`;
+    } else {
+      return `of ${thing} ${expected[0]}`;
+    }
+  } else {
+    return `of ${thing} ${String(expected)}`;
+  }
+}
+
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
+function startsWith(str, search, pos) {
+	return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
+}
+
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
+function endsWith(str, search, this_len) {
+	if (this_len === undefined || this_len > str.length) {
+		this_len = str.length;
+	}
+	return str.substring(this_len - search.length, this_len) === search;
+}
+
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
+function includes(str, search, start) {
+  if (typeof start !== 'number') {
+    start = 0;
+  }
+
+  if (start + search.length > str.length) {
+    return false;
+  } else {
+    return str.indexOf(search, start) !== -1;
+  }
+}
+
+createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {
+  return 'The value "' + value + '" is invalid for option "' + name + '"'
+}, TypeError);
+createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {
+  // determiner: 'must be' or 'must not be'
+  let determiner;
+  if (typeof expected === 'string' && startsWith(expected, 'not ')) {
+    determiner = 'must not be';
+    expected = expected.replace(/^not /, '');
+  } else {
+    determiner = 'must be';
+  }
+
+  let msg;
+  if (endsWith(name, ' argument')) {
+    // For cases like 'first argument'
+    msg = `The ${name} ${determiner} ${oneOf(expected, 'type')}`;
+  } else {
+    const type = includes(name, '.') ? 'property' : 'argument';
+    msg = `The "${name}" ${type} ${determiner} ${oneOf(expected, 'type')}`;
+  }
+
+  msg += `. Received type ${typeof actual}`;
+  return msg;
+}, TypeError);
+createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');
+createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {
+  return 'The ' + name + ' method is not implemented'
+});
+createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');
+createErrorType('ERR_STREAM_DESTROYED', function (name) {
+  return 'Cannot call ' + name + ' after a stream was destroyed';
+});
+createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');
+createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');
+createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');
+createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
+createErrorType('ERR_UNKNOWN_ENCODING', function (arg) {
+  return 'Unknown encoding: ' + arg
+}, TypeError);
+createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');
+
+module.exports.codes = codes;
diff --git a/node_modules/bl/node_modules/readable-stream/experimentalWarning.js b/node_modules/bl/node_modules/readable-stream/experimentalWarning.js
new file mode 100644
index 0000000..78e8414
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/experimentalWarning.js
@@ -0,0 +1,17 @@
+'use strict'
+
+var experimentalWarnings = new Set();
+
+function emitExperimentalWarning(feature) {
+  if (experimentalWarnings.has(feature)) return;
+  var msg = feature + ' is an experimental feature. This feature could ' +
+       'change at any time';
+  experimentalWarnings.add(feature);
+  process.emitWarning(msg, 'ExperimentalWarning');
+}
+
+function noop() {}
+
+module.exports.emitExperimentalWarning = process.emitWarning
+  ? emitExperimentalWarning
+  : noop;
diff --git a/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js
new file mode 100644
index 0000000..6752519
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js
@@ -0,0 +1,139 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+// a duplex stream is just a stream that is both readable and writable.
+// Since JS doesn't have multiple prototypal inheritance, this class
+// prototypally inherits from Readable, and then parasitically from
+// Writable.
+'use strict';
+/*<replacement>*/
+
+var objectKeys = Object.keys || function (obj) {
+  var keys = [];
+
+  for (var key in obj) {
+    keys.push(key);
+  }
+
+  return keys;
+};
+/*</replacement>*/
+
+
+module.exports = Duplex;
+
+var Readable = require('./_stream_readable');
+
+var Writable = require('./_stream_writable');
+
+require('inherits')(Duplex, Readable);
+
+{
+  // Allow the keys array to be GC'ed.
+  var keys = objectKeys(Writable.prototype);
+
+  for (var v = 0; v < keys.length; v++) {
+    var method = keys[v];
+    if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
+  }
+}
+
+function Duplex(options) {
+  if (!(this instanceof Duplex)) return new Duplex(options);
+  Readable.call(this, options);
+  Writable.call(this, options);
+  this.allowHalfOpen = true;
+
+  if (options) {
+    if (options.readable === false) this.readable = false;
+    if (options.writable === false) this.writable = false;
+
+    if (options.allowHalfOpen === false) {
+      this.allowHalfOpen = false;
+      this.once('end', onend);
+    }
+  }
+}
+
+Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._writableState.highWaterMark;
+  }
+});
+Object.defineProperty(Duplex.prototype, 'writableBuffer', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._writableState && this._writableState.getBuffer();
+  }
+});
+Object.defineProperty(Duplex.prototype, 'writableLength', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._writableState.length;
+  }
+}); // the no-half-open enforcer
+
+function onend() {
+  // If the writable side ended, then we're ok.
+  if (this._writableState.ended) return; // no more data can be written.
+  // But allow more writes to happen in this tick.
+
+  process.nextTick(onEndNT, this);
+}
+
+function onEndNT(self) {
+  self.end();
+}
+
+Object.defineProperty(Duplex.prototype, 'destroyed', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    if (this._readableState === undefined || this._writableState === undefined) {
+      return false;
+    }
+
+    return this._readableState.destroyed && this._writableState.destroyed;
+  },
+  set: function set(value) {
+    // we ignore the value if the stream
+    // has not been initialized yet
+    if (this._readableState === undefined || this._writableState === undefined) {
+      return;
+    } // backward compatibility, the user is explicitly
+    // managing destroyed
+
+
+    this._readableState.destroyed = value;
+    this._writableState.destroyed = value;
+  }
+});
\ No newline at end of file
diff --git a/node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js
new file mode 100644
index 0000000..32e7414
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js
@@ -0,0 +1,39 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+// a passthrough stream.
+// basically just the most minimal sort of Transform stream.
+// Every written chunk gets output as-is.
+'use strict';
+
+module.exports = PassThrough;
+
+var Transform = require('./_stream_transform');
+
+require('inherits')(PassThrough, Transform);
+
+function PassThrough(options) {
+  if (!(this instanceof PassThrough)) return new PassThrough(options);
+  Transform.call(this, options);
+}
+
+PassThrough.prototype._transform = function (chunk, encoding, cb) {
+  cb(null, chunk);
+};
\ No newline at end of file
diff --git a/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js
new file mode 100644
index 0000000..192d451
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js
@@ -0,0 +1,1124 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+'use strict';
+
+module.exports = Readable;
+/*<replacement>*/
+
+var Duplex;
+/*</replacement>*/
+
+Readable.ReadableState = ReadableState;
+/*<replacement>*/
+
+var EE = require('events').EventEmitter;
+
+var EElistenerCount = function EElistenerCount(emitter, type) {
+  return emitter.listeners(type).length;
+};
+/*</replacement>*/
+
+/*<replacement>*/
+
+
+var Stream = require('./internal/streams/stream');
+/*</replacement>*/
+
+
+var Buffer = require('buffer').Buffer;
+
+var OurUint8Array = global.Uint8Array || function () {};
+
+function _uint8ArrayToBuffer(chunk) {
+  return Buffer.from(chunk);
+}
+
+function _isUint8Array(obj) {
+  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
+/*<replacement>*/
+
+
+var debugUtil = require('util');
+
+var debug;
+
+if (debugUtil && debugUtil.debuglog) {
+  debug = debugUtil.debuglog('stream');
+} else {
+  debug = function debug() {};
+}
+/*</replacement>*/
+
+
+var BufferList = require('./internal/streams/buffer_list');
+
+var destroyImpl = require('./internal/streams/destroy');
+
+var _require = require('./internal/streams/state'),
+    getHighWaterMark = _require.getHighWaterMark;
+
+var _require$codes = require('../errors').codes,
+    ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
+    ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF,
+    ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
+    ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance.
+
+
+var StringDecoder;
+var createReadableStreamAsyncIterator;
+var from;
+
+require('inherits')(Readable, Stream);
+
+var errorOrDestroy = destroyImpl.errorOrDestroy;
+var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
+
+function prependListener(emitter, event, fn) {
+  // Sadly this is not cacheable as some libraries bundle their own
+  // event emitter implementation with them.
+  if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any
+  // userland ones.  NEVER DO THIS. This is here only because this code needs
+  // to continue to work with older versions of Node.js that do not include
+  // the prependListener() method. The goal is to eventually remove this hack.
+
+  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
+}
+
+function ReadableState(options, stream, isDuplex) {
+  Duplex = Duplex || require('./_stream_duplex');
+  options = options || {}; // Duplex streams are both readable and writable, but share
+  // the same options object.
+  // However, some cases require setting options to different
+  // values for the readable and the writable sides of the duplex stream.
+  // These options can be provided separately as readableXXX and writableXXX.
+
+  if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to
+  // make all the buffer merging and length checks go away
+
+  this.objectMode = !!options.objectMode;
+  if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer
+  // Note: 0 is a valid value, means "don't call _read preemptively ever"
+
+  this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the
+  // linked list can remove elements from the beginning faster than
+  // array.shift()
+
+  this.buffer = new BufferList();
+  this.length = 0;
+  this.pipes = null;
+  this.pipesCount = 0;
+  this.flowing = null;
+  this.ended = false;
+  this.endEmitted = false;
+  this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted
+  // immediately, or on a later tick.  We set this to true at first, because
+  // any actions that shouldn't happen until "later" should generally also
+  // not happen before the first read call.
+
+  this.sync = true; // whenever we return null, then we set a flag to say
+  // that we're awaiting a 'readable' event emission.
+
+  this.needReadable = false;
+  this.emittedReadable = false;
+  this.readableListening = false;
+  this.resumeScheduled = false;
+  this.paused = true; // Should close be emitted on destroy. Defaults to true.
+
+  this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish')
+
+  this.autoDestroy = !!options.autoDestroy; // has it been destroyed
+
+  this.destroyed = false; // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+
+  this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s
+
+  this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled
+
+  this.readingMore = false;
+  this.decoder = null;
+  this.encoding = null;
+
+  if (options.encoding) {
+    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+    this.decoder = new StringDecoder(options.encoding);
+    this.encoding = options.encoding;
+  }
+}
+
+function Readable(options) {
+  Duplex = Duplex || require('./_stream_duplex');
+  if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside
+  // the ReadableState constructor, at least with V8 6.5
+
+  var isDuplex = this instanceof Duplex;
+  this._readableState = new ReadableState(options, this, isDuplex); // legacy
+
+  this.readable = true;
+
+  if (options) {
+    if (typeof options.read === 'function') this._read = options.read;
+    if (typeof options.destroy === 'function') this._destroy = options.destroy;
+  }
+
+  Stream.call(this);
+}
+
+Object.defineProperty(Readable.prototype, 'destroyed', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    if (this._readableState === undefined) {
+      return false;
+    }
+
+    return this._readableState.destroyed;
+  },
+  set: function set(value) {
+    // we ignore the value if the stream
+    // has not been initialized yet
+    if (!this._readableState) {
+      return;
+    } // backward compatibility, the user is explicitly
+    // managing destroyed
+
+
+    this._readableState.destroyed = value;
+  }
+});
+Readable.prototype.destroy = destroyImpl.destroy;
+Readable.prototype._undestroy = destroyImpl.undestroy;
+
+Readable.prototype._destroy = function (err, cb) {
+  cb(err);
+}; // Manually shove something into the read() buffer.
+// This returns true if the highWaterMark has not been hit yet,
+// similar to how Writable.write() returns true if you should
+// write() some more.
+
+
+Readable.prototype.push = function (chunk, encoding) {
+  var state = this._readableState;
+  var skipChunkCheck;
+
+  if (!state.objectMode) {
+    if (typeof chunk === 'string') {
+      encoding = encoding || state.defaultEncoding;
+
+      if (encoding !== state.encoding) {
+        chunk = Buffer.from(chunk, encoding);
+        encoding = '';
+      }
+
+      skipChunkCheck = true;
+    }
+  } else {
+    skipChunkCheck = true;
+  }
+
+  return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
+}; // Unshift should *always* be something directly out of read()
+
+
+Readable.prototype.unshift = function (chunk) {
+  return readableAddChunk(this, chunk, null, true, false);
+};
+
+function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
+  debug('readableAddChunk', chunk);
+  var state = stream._readableState;
+
+  if (chunk === null) {
+    state.reading = false;
+    onEofChunk(stream, state);
+  } else {
+    var er;
+    if (!skipChunkCheck) er = chunkInvalid(state, chunk);
+
+    if (er) {
+      errorOrDestroy(stream, er);
+    } else if (state.objectMode || chunk && chunk.length > 0) {
+      if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
+        chunk = _uint8ArrayToBuffer(chunk);
+      }
+
+      if (addToFront) {
+        if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);
+      } else if (state.ended) {
+        errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
+      } else if (state.destroyed) {
+        return false;
+      } else {
+        state.reading = false;
+
+        if (state.decoder && !encoding) {
+          chunk = state.decoder.write(chunk);
+          if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
+        } else {
+          addChunk(stream, state, chunk, false);
+        }
+      }
+    } else if (!addToFront) {
+      state.reading = false;
+      maybeReadMore(stream, state);
+    }
+  } // We can push more data if we are below the highWaterMark.
+  // Also, if we have no data yet, we can stand some more bytes.
+  // This is to work around cases where hwm=0, such as the repl.
+
+
+  return !state.ended && (state.length < state.highWaterMark || state.length === 0);
+}
+
+function addChunk(stream, state, chunk, addToFront) {
+  if (state.flowing && state.length === 0 && !state.sync) {
+    state.awaitDrain = 0;
+    stream.emit('data', chunk);
+  } else {
+    // update the buffer info.
+    state.length += state.objectMode ? 1 : chunk.length;
+    if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
+    if (state.needReadable) emitReadable(stream);
+  }
+
+  maybeReadMore(stream, state);
+}
+
+function chunkInvalid(state, chunk) {
+  var er;
+
+  if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+    er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);
+  }
+
+  return er;
+}
+
+Readable.prototype.isPaused = function () {
+  return this._readableState.flowing === false;
+}; // backwards compatibility.
+
+
+Readable.prototype.setEncoding = function (enc) {
+  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+  var decoder = new StringDecoder(enc);
+  this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8
+
+  this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers:
+
+  var p = this._readableState.buffer.head;
+  var content = '';
+
+  while (p !== null) {
+    content += decoder.write(p.data);
+    p = p.next;
+  }
+
+  this._readableState.buffer.clear();
+
+  if (content !== '') this._readableState.buffer.push(content);
+  this._readableState.length = content.length;
+  return this;
+}; // Don't raise the hwm > 1GB
+
+
+var MAX_HWM = 0x40000000;
+
+function computeNewHighWaterMark(n) {
+  if (n >= MAX_HWM) {
+    // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE.
+    n = MAX_HWM;
+  } else {
+    // Get the next highest power of 2 to prevent increasing hwm excessively in
+    // tiny amounts
+    n--;
+    n |= n >>> 1;
+    n |= n >>> 2;
+    n |= n >>> 4;
+    n |= n >>> 8;
+    n |= n >>> 16;
+    n++;
+  }
+
+  return n;
+} // This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+
+
+function howMuchToRead(n, state) {
+  if (n <= 0 || state.length === 0 && state.ended) return 0;
+  if (state.objectMode) return 1;
+
+  if (n !== n) {
+    // Only flow one buffer at a time
+    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
+  } // If we're asking for more than the current hwm, then raise the hwm.
+
+
+  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
+  if (n <= state.length) return n; // Don't have enough
+
+  if (!state.ended) {
+    state.needReadable = true;
+    return 0;
+  }
+
+  return state.length;
+} // you can override either this method, or the async _read(n) below.
+
+
+Readable.prototype.read = function (n) {
+  debug('read', n);
+  n = parseInt(n, 10);
+  var state = this._readableState;
+  var nOrig = n;
+  if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we
+  // already have a bunch of data in the buffer, then just trigger
+  // the 'readable' event and move on.
+
+  if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) {
+    debug('read: emitReadable', state.length, state.ended);
+    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
+    return null;
+  }
+
+  n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up.
+
+  if (n === 0 && state.ended) {
+    if (state.length === 0) endReadable(this);
+    return null;
+  } // All the actual chunk generation logic needs to be
+  // *below* the call to _read.  The reason is that in certain
+  // synthetic stream cases, such as passthrough streams, _read
+  // may be a completely synchronous operation which may change
+  // the state of the read buffer, providing enough data when
+  // before there was *not* enough.
+  //
+  // So, the steps are:
+  // 1. Figure out what the state of things will be after we do
+  // a read from the buffer.
+  //
+  // 2. If that resulting state will trigger a _read, then call _read.
+  // Note that this may be asynchronous, or synchronous.  Yes, it is
+  // deeply ugly to write APIs this way, but that still doesn't mean
+  // that the Readable class should behave improperly, as streams are
+  // designed to be sync/async agnostic.
+  // Take note if the _read call is sync or async (ie, if the read call
+  // has returned yet), so that we know whether or not it's safe to emit
+  // 'readable' etc.
+  //
+  // 3. Actually pull the requested chunks out of the buffer and return.
+  // if we need a readable event, then we need to do some reading.
+
+
+  var doRead = state.needReadable;
+  debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some
+
+  if (state.length === 0 || state.length - n < state.highWaterMark) {
+    doRead = true;
+    debug('length less than watermark', doRead);
+  } // however, if we've ended, then there's no point, and if we're already
+  // reading, then it's unnecessary.
+
+
+  if (state.ended || state.reading) {
+    doRead = false;
+    debug('reading or ended', doRead);
+  } else if (doRead) {
+    debug('do read');
+    state.reading = true;
+    state.sync = true; // if the length is currently zero, then we *need* a readable event.
+
+    if (state.length === 0) state.needReadable = true; // call internal read method
+
+    this._read(state.highWaterMark);
+
+    state.sync = false; // If _read pushed data synchronously, then `reading` will be false,
+    // and we need to re-evaluate how much data we can return to the user.
+
+    if (!state.reading) n = howMuchToRead(nOrig, state);
+  }
+
+  var ret;
+  if (n > 0) ret = fromList(n, state);else ret = null;
+
+  if (ret === null) {
+    state.needReadable = state.length <= state.highWaterMark;
+    n = 0;
+  } else {
+    state.length -= n;
+    state.awaitDrain = 0;
+  }
+
+  if (state.length === 0) {
+    // If we have nothing in the buffer, then we want to know
+    // as soon as we *do* get something into the buffer.
+    if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick.
+
+    if (nOrig !== n && state.ended) endReadable(this);
+  }
+
+  if (ret !== null) this.emit('data', ret);
+  return ret;
+};
+
+function onEofChunk(stream, state) {
+  debug('onEofChunk');
+  if (state.ended) return;
+
+  if (state.decoder) {
+    var chunk = state.decoder.end();
+
+    if (chunk && chunk.length) {
+      state.buffer.push(chunk);
+      state.length += state.objectMode ? 1 : chunk.length;
+    }
+  }
+
+  state.ended = true;
+
+  if (state.sync) {
+    // if we are sync, wait until next tick to emit the data.
+    // Otherwise we risk emitting data in the flow()
+    // the readable code triggers during a read() call
+    emitReadable(stream);
+  } else {
+    // emit 'readable' now to make sure it gets picked up.
+    state.needReadable = false;
+
+    if (!state.emittedReadable) {
+      state.emittedReadable = true;
+      emitReadable_(stream);
+    }
+  }
+} // Don't emit readable right away in sync mode, because this can trigger
+// another read() call => stack overflow.  This way, it might trigger
+// a nextTick recursion warning, but that's not so bad.
+
+
+function emitReadable(stream) {
+  var state = stream._readableState;
+  debug('emitReadable', state.needReadable, state.emittedReadable);
+  state.needReadable = false;
+
+  if (!state.emittedReadable) {
+    debug('emitReadable', state.flowing);
+    state.emittedReadable = true;
+    process.nextTick(emitReadable_, stream);
+  }
+}
+
+function emitReadable_(stream) {
+  var state = stream._readableState;
+  debug('emitReadable_', state.destroyed, state.length, state.ended);
+
+  if (!state.destroyed && (state.length || state.ended)) {
+    stream.emit('readable');
+    state.emittedReadable = false;
+  } // The stream needs another readable event if
+  // 1. It is not flowing, as the flow mechanism will take
+  //    care of it.
+  // 2. It is not ended.
+  // 3. It is below the highWaterMark, so we can schedule
+  //    another readable later.
+
+
+  state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;
+  flow(stream);
+} // at this point, the user has presumably seen the 'readable' event,
+// and called read() to consume some data.  that may have triggered
+// in turn another _read(n) call, in which case reading = true if
+// it's in progress.
+// However, if we're not ended, or reading, and the length < hwm,
+// then go ahead and try to read some more preemptively.
+
+
+function maybeReadMore(stream, state) {
+  if (!state.readingMore) {
+    state.readingMore = true;
+    process.nextTick(maybeReadMore_, stream, state);
+  }
+}
+
+function maybeReadMore_(stream, state) {
+  // Attempt to read more data if we should.
+  //
+  // The conditions for reading more data are (one of):
+  // - Not enough data buffered (state.length < state.highWaterMark). The loop
+  //   is responsible for filling the buffer with enough data if such data
+  //   is available. If highWaterMark is 0 and we are not in the flowing mode
+  //   we should _not_ attempt to buffer any extra data. We'll get more data
+  //   when the stream consumer calls read() instead.
+  // - No data in the buffer, and the stream is in flowing mode. In this mode
+  //   the loop below is responsible for ensuring read() is called. Failing to
+  //   call read here would abort the flow and there's no other mechanism for
+  //   continuing the flow if the stream consumer has just subscribed to the
+  //   'data' event.
+  //
+  // In addition to the above conditions to keep reading data, the following
+  // conditions prevent the data from being read:
+  // - The stream has ended (state.ended).
+  // - There is already a pending 'read' operation (state.reading). This is a
+  //   case where the the stream has called the implementation defined _read()
+  //   method, but they are processing the call asynchronously and have _not_
+  //   called push() with new data. In this case we skip performing more
+  //   read()s. The execution ends in this method again after the _read() ends
+  //   up calling push() with more data.
+  while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) {
+    var len = state.length;
+    debug('maybeReadMore read 0');
+    stream.read(0);
+    if (len === state.length) // didn't get any data, stop spinning.
+      break;
+  }
+
+  state.readingMore = false;
+} // abstract method.  to be overridden in specific implementation classes.
+// call cb(er, data) where data is <= n in length.
+// for virtual (non-string, non-buffer) streams, "length" is somewhat
+// arbitrary, and perhaps not very meaningful.
+
+
+Readable.prototype._read = function (n) {
+  errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()'));
+};
+
+Readable.prototype.pipe = function (dest, pipeOpts) {
+  var src = this;
+  var state = this._readableState;
+
+  switch (state.pipesCount) {
+    case 0:
+      state.pipes = dest;
+      break;
+
+    case 1:
+      state.pipes = [state.pipes, dest];
+      break;
+
+    default:
+      state.pipes.push(dest);
+      break;
+  }
+
+  state.pipesCount += 1;
+  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
+  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
+  var endFn = doEnd ? onend : unpipe;
+  if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn);
+  dest.on('unpipe', onunpipe);
+
+  function onunpipe(readable, unpipeInfo) {
+    debug('onunpipe');
+
+    if (readable === src) {
+      if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
+        unpipeInfo.hasUnpiped = true;
+        cleanup();
+      }
+    }
+  }
+
+  function onend() {
+    debug('onend');
+    dest.end();
+  } // when the dest drains, it reduces the awaitDrain counter
+  // on the source.  This would be more elegant with a .once()
+  // handler in flow(), but adding and removing repeatedly is
+  // too slow.
+
+
+  var ondrain = pipeOnDrain(src);
+  dest.on('drain', ondrain);
+  var cleanedUp = false;
+
+  function cleanup() {
+    debug('cleanup'); // cleanup event handlers once the pipe is broken
+
+    dest.removeListener('close', onclose);
+    dest.removeListener('finish', onfinish);
+    dest.removeListener('drain', ondrain);
+    dest.removeListener('error', onerror);
+    dest.removeListener('unpipe', onunpipe);
+    src.removeListener('end', onend);
+    src.removeListener('end', unpipe);
+    src.removeListener('data', ondata);
+    cleanedUp = true; // if the reader is waiting for a drain event from this
+    // specific writer, then it would cause it to never start
+    // flowing again.
+    // So, if this is awaiting a drain, then we just call it now.
+    // If we don't know, then assume that we are waiting for one.
+
+    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
+  }
+
+  src.on('data', ondata);
+
+  function ondata(chunk) {
+    debug('ondata');
+    var ret = dest.write(chunk);
+    debug('dest.write', ret);
+
+    if (ret === false) {
+      // If the user unpiped during `dest.write()`, it is possible
+      // to get stuck in a permanently paused state if that write
+      // also returned false.
+      // => Check whether `dest` is still a piping destination.
+      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
+        debug('false write response, pause', state.awaitDrain);
+        state.awaitDrain++;
+      }
+
+      src.pause();
+    }
+  } // if the dest has an error, then stop piping into it.
+  // however, don't suppress the throwing behavior for this.
+
+
+  function onerror(er) {
+    debug('onerror', er);
+    unpipe();
+    dest.removeListener('error', onerror);
+    if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er);
+  } // Make sure our error handler is attached before userland ones.
+
+
+  prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once.
+
+  function onclose() {
+    dest.removeListener('finish', onfinish);
+    unpipe();
+  }
+
+  dest.once('close', onclose);
+
+  function onfinish() {
+    debug('onfinish');
+    dest.removeListener('close', onclose);
+    unpipe();
+  }
+
+  dest.once('finish', onfinish);
+
+  function unpipe() {
+    debug('unpipe');
+    src.unpipe(dest);
+  } // tell the dest that it's being piped to
+
+
+  dest.emit('pipe', src); // start the flow if it hasn't been started already.
+
+  if (!state.flowing) {
+    debug('pipe resume');
+    src.resume();
+  }
+
+  return dest;
+};
+
+function pipeOnDrain(src) {
+  return function pipeOnDrainFunctionResult() {
+    var state = src._readableState;
+    debug('pipeOnDrain', state.awaitDrain);
+    if (state.awaitDrain) state.awaitDrain--;
+
+    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
+      state.flowing = true;
+      flow(src);
+    }
+  };
+}
+
+Readable.prototype.unpipe = function (dest) {
+  var state = this._readableState;
+  var unpipeInfo = {
+    hasUnpiped: false
+  }; // if we're not piping anywhere, then do nothing.
+
+  if (state.pipesCount === 0) return this; // just one destination.  most common case.
+
+  if (state.pipesCount === 1) {
+    // passed in one, but it's not the right one.
+    if (dest && dest !== state.pipes) return this;
+    if (!dest) dest = state.pipes; // got a match.
+
+    state.pipes = null;
+    state.pipesCount = 0;
+    state.flowing = false;
+    if (dest) dest.emit('unpipe', this, unpipeInfo);
+    return this;
+  } // slow case. multiple pipe destinations.
+
+
+  if (!dest) {
+    // remove all.
+    var dests = state.pipes;
+    var len = state.pipesCount;
+    state.pipes = null;
+    state.pipesCount = 0;
+    state.flowing = false;
+
+    for (var i = 0; i < len; i++) {
+      dests[i].emit('unpipe', this, {
+        hasUnpiped: false
+      });
+    }
+
+    return this;
+  } // try to find the right one.
+
+
+  var index = indexOf(state.pipes, dest);
+  if (index === -1) return this;
+  state.pipes.splice(index, 1);
+  state.pipesCount -= 1;
+  if (state.pipesCount === 1) state.pipes = state.pipes[0];
+  dest.emit('unpipe', this, unpipeInfo);
+  return this;
+}; // set up data events if they are asked for
+// Ensure readable listeners eventually get something
+
+
+Readable.prototype.on = function (ev, fn) {
+  var res = Stream.prototype.on.call(this, ev, fn);
+  var state = this._readableState;
+
+  if (ev === 'data') {
+    // update readableListening so that resume() may be a no-op
+    // a few lines down. This is needed to support once('readable').
+    state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused
+
+    if (state.flowing !== false) this.resume();
+  } else if (ev === 'readable') {
+    if (!state.endEmitted && !state.readableListening) {
+      state.readableListening = state.needReadable = true;
+      state.flowing = false;
+      state.emittedReadable = false;
+      debug('on readable', state.length, state.reading);
+
+      if (state.length) {
+        emitReadable(this);
+      } else if (!state.reading) {
+        process.nextTick(nReadingNextTick, this);
+      }
+    }
+  }
+
+  return res;
+};
+
+Readable.prototype.addListener = Readable.prototype.on;
+
+Readable.prototype.removeListener = function (ev, fn) {
+  var res = Stream.prototype.removeListener.call(this, ev, fn);
+
+  if (ev === 'readable') {
+    // We need to check if there is someone still listening to
+    // readable and reset the state. However this needs to happen
+    // after readable has been emitted but before I/O (nextTick) to
+    // support once('readable', fn) cycles. This means that calling
+    // resume within the same tick will have no
+    // effect.
+    process.nextTick(updateReadableListening, this);
+  }
+
+  return res;
+};
+
+Readable.prototype.removeAllListeners = function (ev) {
+  var res = Stream.prototype.removeAllListeners.apply(this, arguments);
+
+  if (ev === 'readable' || ev === undefined) {
+    // We need to check if there is someone still listening to
+    // readable and reset the state. However this needs to happen
+    // after readable has been emitted but before I/O (nextTick) to
+    // support once('readable', fn) cycles. This means that calling
+    // resume within the same tick will have no
+    // effect.
+    process.nextTick(updateReadableListening, this);
+  }
+
+  return res;
+};
+
+function updateReadableListening(self) {
+  var state = self._readableState;
+  state.readableListening = self.listenerCount('readable') > 0;
+
+  if (state.resumeScheduled && !state.paused) {
+    // flowing needs to be set to true now, otherwise
+    // the upcoming resume will not flow.
+    state.flowing = true; // crude way to check if we should resume
+  } else if (self.listenerCount('data') > 0) {
+    self.resume();
+  }
+}
+
+function nReadingNextTick(self) {
+  debug('readable nexttick read 0');
+  self.read(0);
+} // pause() and resume() are remnants of the legacy readable stream API
+// If the user uses them, then switch into old mode.
+
+
+Readable.prototype.resume = function () {
+  var state = this._readableState;
+
+  if (!state.flowing) {
+    debug('resume'); // we flow only if there is no one listening
+    // for readable, but we still have to call
+    // resume()
+
+    state.flowing = !state.readableListening;
+    resume(this, state);
+  }
+
+  state.paused = false;
+  return this;
+};
+
+function resume(stream, state) {
+  if (!state.resumeScheduled) {
+    state.resumeScheduled = true;
+    process.nextTick(resume_, stream, state);
+  }
+}
+
+function resume_(stream, state) {
+  debug('resume', state.reading);
+
+  if (!state.reading) {
+    stream.read(0);
+  }
+
+  state.resumeScheduled = false;
+  stream.emit('resume');
+  flow(stream);
+  if (state.flowing && !state.reading) stream.read(0);
+}
+
+Readable.prototype.pause = function () {
+  debug('call pause flowing=%j', this._readableState.flowing);
+
+  if (this._readableState.flowing !== false) {
+    debug('pause');
+    this._readableState.flowing = false;
+    this.emit('pause');
+  }
+
+  this._readableState.paused = true;
+  return this;
+};
+
+function flow(stream) {
+  var state = stream._readableState;
+  debug('flow', state.flowing);
+
+  while (state.flowing && stream.read() !== null) {
+    ;
+  }
+} // wrap an old-style stream as the async data source.
+// This is *not* part of the readable stream interface.
+// It is an ugly unfortunate mess of history.
+
+
+Readable.prototype.wrap = function (stream) {
+  var _this = this;
+
+  var state = this._readableState;
+  var paused = false;
+  stream.on('end', function () {
+    debug('wrapped end');
+
+    if (state.decoder && !state.ended) {
+      var chunk = state.decoder.end();
+      if (chunk && chunk.length) _this.push(chunk);
+    }
+
+    _this.push(null);
+  });
+  stream.on('data', function (chunk) {
+    debug('wrapped data');
+    if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode
+
+    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
+
+    var ret = _this.push(chunk);
+
+    if (!ret) {
+      paused = true;
+      stream.pause();
+    }
+  }); // proxy all the other methods.
+  // important when wrapping filters and duplexes.
+
+  for (var i in stream) {
+    if (this[i] === undefined && typeof stream[i] === 'function') {
+      this[i] = function methodWrap(method) {
+        return function methodWrapReturnFunction() {
+          return stream[method].apply(stream, arguments);
+        };
+      }(i);
+    }
+  } // proxy certain important events.
+
+
+  for (var n = 0; n < kProxyEvents.length; n++) {
+    stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
+  } // when we try to consume some more bytes, simply unpause the
+  // underlying stream.
+
+
+  this._read = function (n) {
+    debug('wrapped _read', n);
+
+    if (paused) {
+      paused = false;
+      stream.resume();
+    }
+  };
+
+  return this;
+};
+
+if (typeof Symbol === 'function') {
+  Readable.prototype[Symbol.asyncIterator] = function () {
+    if (createReadableStreamAsyncIterator === undefined) {
+      createReadableStreamAsyncIterator = require('./internal/streams/async_iterator');
+    }
+
+    return createReadableStreamAsyncIterator(this);
+  };
+}
+
+Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._readableState.highWaterMark;
+  }
+});
+Object.defineProperty(Readable.prototype, 'readableBuffer', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._readableState && this._readableState.buffer;
+  }
+});
+Object.defineProperty(Readable.prototype, 'readableFlowing', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._readableState.flowing;
+  },
+  set: function set(state) {
+    if (this._readableState) {
+      this._readableState.flowing = state;
+    }
+  }
+}); // exposed for testing purposes only.
+
+Readable._fromList = fromList;
+Object.defineProperty(Readable.prototype, 'readableLength', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._readableState.length;
+  }
+}); // Pluck off n bytes from an array of buffers.
+// Length is the combined lengths of all the buffers in the list.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+
+function fromList(n, state) {
+  // nothing buffered
+  if (state.length === 0) return null;
+  var ret;
+  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
+    // read it all, truncate the list
+    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length);
+    state.buffer.clear();
+  } else {
+    // read part of list
+    ret = state.buffer.consume(n, state.decoder);
+  }
+  return ret;
+}
+
+function endReadable(stream) {
+  var state = stream._readableState;
+  debug('endReadable', state.endEmitted);
+
+  if (!state.endEmitted) {
+    state.ended = true;
+    process.nextTick(endReadableNT, state, stream);
+  }
+}
+
+function endReadableNT(state, stream) {
+  debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift.
+
+  if (!state.endEmitted && state.length === 0) {
+    state.endEmitted = true;
+    stream.readable = false;
+    stream.emit('end');
+
+    if (state.autoDestroy) {
+      // In case of duplex streams we need a way to detect
+      // if the writable side is ready for autoDestroy as well
+      var wState = stream._writableState;
+
+      if (!wState || wState.autoDestroy && wState.finished) {
+        stream.destroy();
+      }
+    }
+  }
+}
+
+if (typeof Symbol === 'function') {
+  Readable.from = function (iterable, opts) {
+    if (from === undefined) {
+      from = require('./internal/streams/from');
+    }
+
+    return from(Readable, iterable, opts);
+  };
+}
+
+function indexOf(xs, x) {
+  for (var i = 0, l = xs.length; i < l; i++) {
+    if (xs[i] === x) return i;
+  }
+
+  return -1;
+}
\ No newline at end of file
diff --git a/node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js
new file mode 100644
index 0000000..41a738c
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js
@@ -0,0 +1,201 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+// a transform stream is a readable/writable stream where you do
+// something with the data.  Sometimes it's called a "filter",
+// but that's not a great name for it, since that implies a thing where
+// some bits pass through, and others are simply ignored.  (That would
+// be a valid example of a transform, of course.)
+//
+// While the output is causally related to the input, it's not a
+// necessarily symmetric or synchronous transformation.  For example,
+// a zlib stream might take multiple plain-text writes(), and then
+// emit a single compressed chunk some time in the future.
+//
+// Here's how this works:
+//
+// The Transform stream has all the aspects of the readable and writable
+// stream classes.  When you write(chunk), that calls _write(chunk,cb)
+// internally, and returns false if there's a lot of pending writes
+// buffered up.  When you call read(), that calls _read(n) until
+// there's enough pending readable data buffered up.
+//
+// In a transform stream, the written data is placed in a buffer.  When
+// _read(n) is called, it transforms the queued up data, calling the
+// buffered _write cb's as it consumes chunks.  If consuming a single
+// written chunk would result in multiple output chunks, then the first
+// outputted bit calls the readcb, and subsequent chunks just go into
+// the read buffer, and will cause it to emit 'readable' if necessary.
+//
+// This way, back-pressure is actually determined by the reading side,
+// since _read has to be called to start processing a new chunk.  However,
+// a pathological inflate type of transform can cause excessive buffering
+// here.  For example, imagine a stream where every byte of input is
+// interpreted as an integer from 0-255, and then results in that many
+// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
+// 1kb of data being output.  In this case, you could write a very small
+// amount of input, and end up with a very large amount of output.  In
+// such a pathological inflating mechanism, there'd be no way to tell
+// the system to stop doing the transform.  A single 4MB write could
+// cause the system to run out of memory.
+//
+// However, even in such a pathological case, only a single written chunk
+// would be consumed, and then the rest would wait (un-transformed) until
+// the results of the previous transformed chunk were consumed.
+'use strict';
+
+module.exports = Transform;
+
+var _require$codes = require('../errors').codes,
+    ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
+    ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
+    ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING,
+    ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0;
+
+var Duplex = require('./_stream_duplex');
+
+require('inherits')(Transform, Duplex);
+
+function afterTransform(er, data) {
+  var ts = this._transformState;
+  ts.transforming = false;
+  var cb = ts.writecb;
+
+  if (cb === null) {
+    return this.emit('error', new ERR_MULTIPLE_CALLBACK());
+  }
+
+  ts.writechunk = null;
+  ts.writecb = null;
+  if (data != null) // single equals check for both `null` and `undefined`
+    this.push(data);
+  cb(er);
+  var rs = this._readableState;
+  rs.reading = false;
+
+  if (rs.needReadable || rs.length < rs.highWaterMark) {
+    this._read(rs.highWaterMark);
+  }
+}
+
+function Transform(options) {
+  if (!(this instanceof Transform)) return new Transform(options);
+  Duplex.call(this, options);
+  this._transformState = {
+    afterTransform: afterTransform.bind(this),
+    needTransform: false,
+    transforming: false,
+    writecb: null,
+    writechunk: null,
+    writeencoding: null
+  }; // start out asking for a readable event once data is transformed.
+
+  this._readableState.needReadable = true; // we have implemented the _read method, and done the other things
+  // that Readable wants before the first _read call, so unset the
+  // sync guard flag.
+
+  this._readableState.sync = false;
+
+  if (options) {
+    if (typeof options.transform === 'function') this._transform = options.transform;
+    if (typeof options.flush === 'function') this._flush = options.flush;
+  } // When the writable side finishes, then flush out anything remaining.
+
+
+  this.on('prefinish', prefinish);
+}
+
+function prefinish() {
+  var _this = this;
+
+  if (typeof this._flush === 'function' && !this._readableState.destroyed) {
+    this._flush(function (er, data) {
+      done(_this, er, data);
+    });
+  } else {
+    done(this, null, null);
+  }
+}
+
+Transform.prototype.push = function (chunk, encoding) {
+  this._transformState.needTransform = false;
+  return Duplex.prototype.push.call(this, chunk, encoding);
+}; // This is the part where you do stuff!
+// override this function in implementation classes.
+// 'chunk' is an input chunk.
+//
+// Call `push(newChunk)` to pass along transformed output
+// to the readable side.  You may call 'push' zero or more times.
+//
+// Call `cb(err)` when you are done with this chunk.  If you pass
+// an error, then that'll put the hurt on the whole operation.  If you
+// never call cb(), then you'll never get another chunk.
+
+
+Transform.prototype._transform = function (chunk, encoding, cb) {
+  cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()'));
+};
+
+Transform.prototype._write = function (chunk, encoding, cb) {
+  var ts = this._transformState;
+  ts.writecb = cb;
+  ts.writechunk = chunk;
+  ts.writeencoding = encoding;
+
+  if (!ts.transforming) {
+    var rs = this._readableState;
+    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
+  }
+}; // Doesn't matter what the args are here.
+// _transform does all the work.
+// That we got here means that the readable side wants more data.
+
+
+Transform.prototype._read = function (n) {
+  var ts = this._transformState;
+
+  if (ts.writechunk !== null && !ts.transforming) {
+    ts.transforming = true;
+
+    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
+  } else {
+    // mark that we need a transform, so that any data that comes in
+    // will get processed, now that we've asked for it.
+    ts.needTransform = true;
+  }
+};
+
+Transform.prototype._destroy = function (err, cb) {
+  Duplex.prototype._destroy.call(this, err, function (err2) {
+    cb(err2);
+  });
+};
+
+function done(stream, er, data) {
+  if (er) return stream.emit('error', er);
+  if (data != null) // single equals check for both `null` and `undefined`
+    stream.push(data); // TODO(BridgeAR): Write a test for these two error cases
+  // if there's nothing in the write buffer, then that means
+  // that nothing more will ever be provided
+
+  if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0();
+  if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING();
+  return stream.push(null);
+}
\ No newline at end of file
diff --git a/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js
new file mode 100644
index 0000000..a2634d7
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js
@@ -0,0 +1,697 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+// A bit simpler than readable streams.
+// Implement an async ._write(chunk, encoding, cb), and it'll handle all
+// the drain event emission and buffering.
+'use strict';
+
+module.exports = Writable;
+/* <replacement> */
+
+function WriteReq(chunk, encoding, cb) {
+  this.chunk = chunk;
+  this.encoding = encoding;
+  this.callback = cb;
+  this.next = null;
+} // It seems a linked list but it is not
+// there will be only 2 of these for each stream
+
+
+function CorkedRequest(state) {
+  var _this = this;
+
+  this.next = null;
+  this.entry = null;
+
+  this.finish = function () {
+    onCorkedFinish(_this, state);
+  };
+}
+/* </replacement> */
+
+/*<replacement>*/
+
+
+var Duplex;
+/*</replacement>*/
+
+Writable.WritableState = WritableState;
+/*<replacement>*/
+
+var internalUtil = {
+  deprecate: require('util-deprecate')
+};
+/*</replacement>*/
+
+/*<replacement>*/
+
+var Stream = require('./internal/streams/stream');
+/*</replacement>*/
+
+
+var Buffer = require('buffer').Buffer;
+
+var OurUint8Array = global.Uint8Array || function () {};
+
+function _uint8ArrayToBuffer(chunk) {
+  return Buffer.from(chunk);
+}
+
+function _isUint8Array(obj) {
+  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
+
+var destroyImpl = require('./internal/streams/destroy');
+
+var _require = require('./internal/streams/state'),
+    getHighWaterMark = _require.getHighWaterMark;
+
+var _require$codes = require('../errors').codes,
+    ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
+    ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
+    ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
+    ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE,
+    ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED,
+    ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES,
+    ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END,
+    ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING;
+
+var errorOrDestroy = destroyImpl.errorOrDestroy;
+
+require('inherits')(Writable, Stream);
+
+function nop() {}
+
+function WritableState(options, stream, isDuplex) {
+  Duplex = Duplex || require('./_stream_duplex');
+  options = options || {}; // Duplex streams are both readable and writable, but share
+  // the same options object.
+  // However, some cases require setting options to different
+  // values for the readable and the writable sides of the duplex stream,
+  // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.
+
+  if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream
+  // contains buffers or objects.
+
+  this.objectMode = !!options.objectMode;
+  if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false
+  // Note: 0 is a valid value, means that we always return false if
+  // the entire buffer is not flushed immediately on write()
+
+  this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called
+
+  this.finalCalled = false; // drain event flag.
+
+  this.needDrain = false; // at the start of calling end()
+
+  this.ending = false; // when end() has been called, and returned
+
+  this.ended = false; // when 'finish' is emitted
+
+  this.finished = false; // has it been destroyed
+
+  this.destroyed = false; // should we decode strings into buffers before passing to _write?
+  // this is here so that some node-core streams can optimize string
+  // handling at a lower level.
+
+  var noDecode = options.decodeStrings === false;
+  this.decodeStrings = !noDecode; // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+
+  this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement
+  // of how much we're waiting to get pushed to some underlying
+  // socket or file.
+
+  this.length = 0; // a flag to see when we're in the middle of a write.
+
+  this.writing = false; // when true all writes will be buffered until .uncork() call
+
+  this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately,
+  // or on a later tick.  We set this to true at first, because any
+  // actions that shouldn't happen until "later" should generally also
+  // not happen before the first write call.
+
+  this.sync = true; // a flag to know if we're processing previously buffered items, which
+  // may call the _write() callback in the same tick, so that we don't
+  // end up in an overlapped onwrite situation.
+
+  this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb)
+
+  this.onwrite = function (er) {
+    onwrite(stream, er);
+  }; // the callback that the user supplies to write(chunk,encoding,cb)
+
+
+  this.writecb = null; // the amount that is being written when _write is called.
+
+  this.writelen = 0;
+  this.bufferedRequest = null;
+  this.lastBufferedRequest = null; // number of pending user-supplied write callbacks
+  // this must be 0 before 'finish' can be emitted
+
+  this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs
+  // This is relevant for synchronous Transform streams
+
+  this.prefinished = false; // True if the error was already emitted and should not be thrown again
+
+  this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true.
+
+  this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end')
+
+  this.autoDestroy = !!options.autoDestroy; // count buffered requests
+
+  this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always
+  // one allocated and free to use, and we maintain at most two
+
+  this.corkedRequestsFree = new CorkedRequest(this);
+}
+
+WritableState.prototype.getBuffer = function getBuffer() {
+  var current = this.bufferedRequest;
+  var out = [];
+
+  while (current) {
+    out.push(current);
+    current = current.next;
+  }
+
+  return out;
+};
+
+(function () {
+  try {
+    Object.defineProperty(WritableState.prototype, 'buffer', {
+      get: internalUtil.deprecate(function writableStateBufferGetter() {
+        return this.getBuffer();
+      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
+    });
+  } catch (_) {}
+})(); // Test _writableState for inheritance to account for Duplex streams,
+// whose prototype chain only points to Readable.
+
+
+var realHasInstance;
+
+if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
+  realHasInstance = Function.prototype[Symbol.hasInstance];
+  Object.defineProperty(Writable, Symbol.hasInstance, {
+    value: function value(object) {
+      if (realHasInstance.call(this, object)) return true;
+      if (this !== Writable) return false;
+      return object && object._writableState instanceof WritableState;
+    }
+  });
+} else {
+  realHasInstance = function realHasInstance(object) {
+    return object instanceof this;
+  };
+}
+
+function Writable(options) {
+  Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too.
+  // `realHasInstance` is necessary because using plain `instanceof`
+  // would return false, as no `_writableState` property is attached.
+  // Trying to use the custom `instanceof` for Writable here will also break the
+  // Node.js LazyTransform implementation, which has a non-trivial getter for
+  // `_writableState` that would lead to infinite recursion.
+  // Checking for a Stream.Duplex instance is faster here instead of inside
+  // the WritableState constructor, at least with V8 6.5
+
+  var isDuplex = this instanceof Duplex;
+  if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options);
+  this._writableState = new WritableState(options, this, isDuplex); // legacy.
+
+  this.writable = true;
+
+  if (options) {
+    if (typeof options.write === 'function') this._write = options.write;
+    if (typeof options.writev === 'function') this._writev = options.writev;
+    if (typeof options.destroy === 'function') this._destroy = options.destroy;
+    if (typeof options.final === 'function') this._final = options.final;
+  }
+
+  Stream.call(this);
+} // Otherwise people can pipe Writable streams, which is just wrong.
+
+
+Writable.prototype.pipe = function () {
+  errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());
+};
+
+function writeAfterEnd(stream, cb) {
+  var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb
+
+  errorOrDestroy(stream, er);
+  process.nextTick(cb, er);
+} // Checks that a user-supplied chunk is valid, especially for the particular
+// mode the stream is in. Currently this means that `null` is never accepted
+// and undefined/non-string values are only allowed in object mode.
+
+
+function validChunk(stream, state, chunk, cb) {
+  var er;
+
+  if (chunk === null) {
+    er = new ERR_STREAM_NULL_VALUES();
+  } else if (typeof chunk !== 'string' && !state.objectMode) {
+    er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk);
+  }
+
+  if (er) {
+    errorOrDestroy(stream, er);
+    process.nextTick(cb, er);
+    return false;
+  }
+
+  return true;
+}
+
+Writable.prototype.write = function (chunk, encoding, cb) {
+  var state = this._writableState;
+  var ret = false;
+
+  var isBuf = !state.objectMode && _isUint8Array(chunk);
+
+  if (isBuf && !Buffer.isBuffer(chunk)) {
+    chunk = _uint8ArrayToBuffer(chunk);
+  }
+
+  if (typeof encoding === 'function') {
+    cb = encoding;
+    encoding = null;
+  }
+
+  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
+  if (typeof cb !== 'function') cb = nop;
+  if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
+    state.pendingcb++;
+    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
+  }
+  return ret;
+};
+
+Writable.prototype.cork = function () {
+  this._writableState.corked++;
+};
+
+Writable.prototype.uncork = function () {
+  var state = this._writableState;
+
+  if (state.corked) {
+    state.corked--;
+    if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
+  }
+};
+
+Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
+  // node::ParseEncoding() requires lower case.
+  if (typeof encoding === 'string') encoding = encoding.toLowerCase();
+  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding);
+  this._writableState.defaultEncoding = encoding;
+  return this;
+};
+
+Object.defineProperty(Writable.prototype, 'writableBuffer', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._writableState && this._writableState.getBuffer();
+  }
+});
+
+function decodeChunk(state, chunk, encoding) {
+  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
+    chunk = Buffer.from(chunk, encoding);
+  }
+
+  return chunk;
+}
+
+Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._writableState.highWaterMark;
+  }
+}); // if we're already writing something, then just put this
+// in the queue, and wait our turn.  Otherwise, call _write
+// If we return false, then we need a drain event, so set that flag.
+
+function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
+  if (!isBuf) {
+    var newChunk = decodeChunk(state, chunk, encoding);
+
+    if (chunk !== newChunk) {
+      isBuf = true;
+      encoding = 'buffer';
+      chunk = newChunk;
+    }
+  }
+
+  var len = state.objectMode ? 1 : chunk.length;
+  state.length += len;
+  var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false.
+
+  if (!ret) state.needDrain = true;
+
+  if (state.writing || state.corked) {
+    var last = state.lastBufferedRequest;
+    state.lastBufferedRequest = {
+      chunk: chunk,
+      encoding: encoding,
+      isBuf: isBuf,
+      callback: cb,
+      next: null
+    };
+
+    if (last) {
+      last.next = state.lastBufferedRequest;
+    } else {
+      state.bufferedRequest = state.lastBufferedRequest;
+    }
+
+    state.bufferedRequestCount += 1;
+  } else {
+    doWrite(stream, state, false, len, chunk, encoding, cb);
+  }
+
+  return ret;
+}
+
+function doWrite(stream, state, writev, len, chunk, encoding, cb) {
+  state.writelen = len;
+  state.writecb = cb;
+  state.writing = true;
+  state.sync = true;
+  if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
+  state.sync = false;
+}
+
+function onwriteError(stream, state, sync, er, cb) {
+  --state.pendingcb;
+
+  if (sync) {
+    // defer the callback if we are being called synchronously
+    // to avoid piling up things on the stack
+    process.nextTick(cb, er); // this can emit finish, and it will always happen
+    // after error
+
+    process.nextTick(finishMaybe, stream, state);
+    stream._writableState.errorEmitted = true;
+    errorOrDestroy(stream, er);
+  } else {
+    // the caller expect this to happen before if
+    // it is async
+    cb(er);
+    stream._writableState.errorEmitted = true;
+    errorOrDestroy(stream, er); // this can emit finish, but finish must
+    // always follow error
+
+    finishMaybe(stream, state);
+  }
+}
+
+function onwriteStateUpdate(state) {
+  state.writing = false;
+  state.writecb = null;
+  state.length -= state.writelen;
+  state.writelen = 0;
+}
+
+function onwrite(stream, er) {
+  var state = stream._writableState;
+  var sync = state.sync;
+  var cb = state.writecb;
+  if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK();
+  onwriteStateUpdate(state);
+  if (er) onwriteError(stream, state, sync, er, cb);else {
+    // Check if we're actually ready to finish, but don't emit yet
+    var finished = needFinish(state) || stream.destroyed;
+
+    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
+      clearBuffer(stream, state);
+    }
+
+    if (sync) {
+      process.nextTick(afterWrite, stream, state, finished, cb);
+    } else {
+      afterWrite(stream, state, finished, cb);
+    }
+  }
+}
+
+function afterWrite(stream, state, finished, cb) {
+  if (!finished) onwriteDrain(stream, state);
+  state.pendingcb--;
+  cb();
+  finishMaybe(stream, state);
+} // Must force callback to be called on nextTick, so that we don't
+// emit 'drain' before the write() consumer gets the 'false' return
+// value, and has a chance to attach a 'drain' listener.
+
+
+function onwriteDrain(stream, state) {
+  if (state.length === 0 && state.needDrain) {
+    state.needDrain = false;
+    stream.emit('drain');
+  }
+} // if there's something in the buffer waiting, then process it
+
+
+function clearBuffer(stream, state) {
+  state.bufferProcessing = true;
+  var entry = state.bufferedRequest;
+
+  if (stream._writev && entry && entry.next) {
+    // Fast case, write everything using _writev()
+    var l = state.bufferedRequestCount;
+    var buffer = new Array(l);
+    var holder = state.corkedRequestsFree;
+    holder.entry = entry;
+    var count = 0;
+    var allBuffers = true;
+
+    while (entry) {
+      buffer[count] = entry;
+      if (!entry.isBuf) allBuffers = false;
+      entry = entry.next;
+      count += 1;
+    }
+
+    buffer.allBuffers = allBuffers;
+    doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time
+    // as the hot path ends with doWrite
+
+    state.pendingcb++;
+    state.lastBufferedRequest = null;
+
+    if (holder.next) {
+      state.corkedRequestsFree = holder.next;
+      holder.next = null;
+    } else {
+      state.corkedRequestsFree = new CorkedRequest(state);
+    }
+
+    state.bufferedRequestCount = 0;
+  } else {
+    // Slow case, write chunks one-by-one
+    while (entry) {
+      var chunk = entry.chunk;
+      var encoding = entry.encoding;
+      var cb = entry.callback;
+      var len = state.objectMode ? 1 : chunk.length;
+      doWrite(stream, state, false, len, chunk, encoding, cb);
+      entry = entry.next;
+      state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then
+      // it means that we need to wait until it does.
+      // also, that means that the chunk and cb are currently
+      // being processed, so move the buffer counter past them.
+
+      if (state.writing) {
+        break;
+      }
+    }
+
+    if (entry === null) state.lastBufferedRequest = null;
+  }
+
+  state.bufferedRequest = entry;
+  state.bufferProcessing = false;
+}
+
+Writable.prototype._write = function (chunk, encoding, cb) {
+  cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()'));
+};
+
+Writable.prototype._writev = null;
+
+Writable.prototype.end = function (chunk, encoding, cb) {
+  var state = this._writableState;
+
+  if (typeof chunk === 'function') {
+    cb = chunk;
+    chunk = null;
+    encoding = null;
+  } else if (typeof encoding === 'function') {
+    cb = encoding;
+    encoding = null;
+  }
+
+  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks
+
+  if (state.corked) {
+    state.corked = 1;
+    this.uncork();
+  } // ignore unnecessary end() calls.
+
+
+  if (!state.ending) endWritable(this, state, cb);
+  return this;
+};
+
+Object.defineProperty(Writable.prototype, 'writableLength', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._writableState.length;
+  }
+});
+
+function needFinish(state) {
+  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
+}
+
+function callFinal(stream, state) {
+  stream._final(function (err) {
+    state.pendingcb--;
+
+    if (err) {
+      errorOrDestroy(stream, err);
+    }
+
+    state.prefinished = true;
+    stream.emit('prefinish');
+    finishMaybe(stream, state);
+  });
+}
+
+function prefinish(stream, state) {
+  if (!state.prefinished && !state.finalCalled) {
+    if (typeof stream._final === 'function' && !state.destroyed) {
+      state.pendingcb++;
+      state.finalCalled = true;
+      process.nextTick(callFinal, stream, state);
+    } else {
+      state.prefinished = true;
+      stream.emit('prefinish');
+    }
+  }
+}
+
+function finishMaybe(stream, state) {
+  var need = needFinish(state);
+
+  if (need) {
+    prefinish(stream, state);
+
+    if (state.pendingcb === 0) {
+      state.finished = true;
+      stream.emit('finish');
+
+      if (state.autoDestroy) {
+        // In case of duplex streams we need a way to detect
+        // if the readable side is ready for autoDestroy as well
+        var rState = stream._readableState;
+
+        if (!rState || rState.autoDestroy && rState.endEmitted) {
+          stream.destroy();
+        }
+      }
+    }
+  }
+
+  return need;
+}
+
+function endWritable(stream, state, cb) {
+  state.ending = true;
+  finishMaybe(stream, state);
+
+  if (cb) {
+    if (state.finished) process.nextTick(cb);else stream.once('finish', cb);
+  }
+
+  state.ended = true;
+  stream.writable = false;
+}
+
+function onCorkedFinish(corkReq, state, err) {
+  var entry = corkReq.entry;
+  corkReq.entry = null;
+
+  while (entry) {
+    var cb = entry.callback;
+    state.pendingcb--;
+    cb(err);
+    entry = entry.next;
+  } // reuse the free corkReq.
+
+
+  state.corkedRequestsFree.next = corkReq;
+}
+
+Object.defineProperty(Writable.prototype, 'destroyed', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    if (this._writableState === undefined) {
+      return false;
+    }
+
+    return this._writableState.destroyed;
+  },
+  set: function set(value) {
+    // we ignore the value if the stream
+    // has not been initialized yet
+    if (!this._writableState) {
+      return;
+    } // backward compatibility, the user is explicitly
+    // managing destroyed
+
+
+    this._writableState.destroyed = value;
+  }
+});
+Writable.prototype.destroy = destroyImpl.destroy;
+Writable.prototype._undestroy = destroyImpl.undestroy;
+
+Writable.prototype._destroy = function (err, cb) {
+  cb(err);
+};
\ No newline at end of file
diff --git a/node_modules/bl/node_modules/readable-stream/lib/internal/streams/async_iterator.js b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/async_iterator.js
new file mode 100644
index 0000000..9fb615a
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/async_iterator.js
@@ -0,0 +1,207 @@
+'use strict';
+
+var _Object$setPrototypeO;
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+var finished = require('./end-of-stream');
+
+var kLastResolve = Symbol('lastResolve');
+var kLastReject = Symbol('lastReject');
+var kError = Symbol('error');
+var kEnded = Symbol('ended');
+var kLastPromise = Symbol('lastPromise');
+var kHandlePromise = Symbol('handlePromise');
+var kStream = Symbol('stream');
+
+function createIterResult(value, done) {
+  return {
+    value: value,
+    done: done
+  };
+}
+
+function readAndResolve(iter) {
+  var resolve = iter[kLastResolve];
+
+  if (resolve !== null) {
+    var data = iter[kStream].read(); // we defer if data is null
+    // we can be expecting either 'end' or
+    // 'error'
+
+    if (data !== null) {
+      iter[kLastPromise] = null;
+      iter[kLastResolve] = null;
+      iter[kLastReject] = null;
+      resolve(createIterResult(data, false));
+    }
+  }
+}
+
+function onReadable(iter) {
+  // we wait for the next tick, because it might
+  // emit an error with process.nextTick
+  process.nextTick(readAndResolve, iter);
+}
+
+function wrapForNext(lastPromise, iter) {
+  return function (resolve, reject) {
+    lastPromise.then(function () {
+      if (iter[kEnded]) {
+        resolve(createIterResult(undefined, true));
+        return;
+      }
+
+      iter[kHandlePromise](resolve, reject);
+    }, reject);
+  };
+}
+
+var AsyncIteratorPrototype = Object.getPrototypeOf(function () {});
+var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = {
+  get stream() {
+    return this[kStream];
+  },
+
+  next: function next() {
+    var _this = this;
+
+    // if we have detected an error in the meanwhile
+    // reject straight away
+    var error = this[kError];
+
+    if (error !== null) {
+      return Promise.reject(error);
+    }
+
+    if (this[kEnded]) {
+      return Promise.resolve(createIterResult(undefined, true));
+    }
+
+    if (this[kStream].destroyed) {
+      // We need to defer via nextTick because if .destroy(err) is
+      // called, the error will be emitted via nextTick, and
+      // we cannot guarantee that there is no error lingering around
+      // waiting to be emitted.
+      return new Promise(function (resolve, reject) {
+        process.nextTick(function () {
+          if (_this[kError]) {
+            reject(_this[kError]);
+          } else {
+            resolve(createIterResult(undefined, true));
+          }
+        });
+      });
+    } // if we have multiple next() calls
+    // we will wait for the previous Promise to finish
+    // this logic is optimized to support for await loops,
+    // where next() is only called once at a time
+
+
+    var lastPromise = this[kLastPromise];
+    var promise;
+
+    if (lastPromise) {
+      promise = new Promise(wrapForNext(lastPromise, this));
+    } else {
+      // fast path needed to support multiple this.push()
+      // without triggering the next() queue
+      var data = this[kStream].read();
+
+      if (data !== null) {
+        return Promise.resolve(createIterResult(data, false));
+      }
+
+      promise = new Promise(this[kHandlePromise]);
+    }
+
+    this[kLastPromise] = promise;
+    return promise;
+  }
+}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () {
+  return this;
+}), _defineProperty(_Object$setPrototypeO, "return", function _return() {
+  var _this2 = this;
+
+  // destroy(err, cb) is a private API
+  // we can guarantee we have that here, because we control the
+  // Readable class this is attached to
+  return new Promise(function (resolve, reject) {
+    _this2[kStream].destroy(null, function (err) {
+      if (err) {
+        reject(err);
+        return;
+      }
+
+      resolve(createIterResult(undefined, true));
+    });
+  });
+}), _Object$setPrototypeO), AsyncIteratorPrototype);
+
+var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) {
+  var _Object$create;
+
+  var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, {
+    value: stream,
+    writable: true
+  }), _defineProperty(_Object$create, kLastResolve, {
+    value: null,
+    writable: true
+  }), _defineProperty(_Object$create, kLastReject, {
+    value: null,
+    writable: true
+  }), _defineProperty(_Object$create, kError, {
+    value: null,
+    writable: true
+  }), _defineProperty(_Object$create, kEnded, {
+    value: stream._readableState.endEmitted,
+    writable: true
+  }), _defineProperty(_Object$create, kHandlePromise, {
+    value: function value(resolve, reject) {
+      var data = iterator[kStream].read();
+
+      if (data) {
+        iterator[kLastPromise] = null;
+        iterator[kLastResolve] = null;
+        iterator[kLastReject] = null;
+        resolve(createIterResult(data, false));
+      } else {
+        iterator[kLastResolve] = resolve;
+        iterator[kLastReject] = reject;
+      }
+    },
+    writable: true
+  }), _Object$create));
+  iterator[kLastPromise] = null;
+  finished(stream, function (err) {
+    if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
+      var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise
+      // returned by next() and store the error
+
+      if (reject !== null) {
+        iterator[kLastPromise] = null;
+        iterator[kLastResolve] = null;
+        iterator[kLastReject] = null;
+        reject(err);
+      }
+
+      iterator[kError] = err;
+      return;
+    }
+
+    var resolve = iterator[kLastResolve];
+
+    if (resolve !== null) {
+      iterator[kLastPromise] = null;
+      iterator[kLastResolve] = null;
+      iterator[kLastReject] = null;
+      resolve(createIterResult(undefined, true));
+    }
+
+    iterator[kEnded] = true;
+  });
+  stream.on('readable', onReadable.bind(null, iterator));
+  return iterator;
+};
+
+module.exports = createReadableStreamAsyncIterator;
\ No newline at end of file
diff --git a/node_modules/bl/node_modules/readable-stream/lib/internal/streams/buffer_list.js b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/buffer_list.js
new file mode 100644
index 0000000..cdea425
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/buffer_list.js
@@ -0,0 +1,210 @@
+'use strict';
+
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
+
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+var _require = require('buffer'),
+    Buffer = _require.Buffer;
+
+var _require2 = require('util'),
+    inspect = _require2.inspect;
+
+var custom = inspect && inspect.custom || 'inspect';
+
+function copyBuffer(src, target, offset) {
+  Buffer.prototype.copy.call(src, target, offset);
+}
+
+module.exports =
+/*#__PURE__*/
+function () {
+  function BufferList() {
+    _classCallCheck(this, BufferList);
+
+    this.head = null;
+    this.tail = null;
+    this.length = 0;
+  }
+
+  _createClass(BufferList, [{
+    key: "push",
+    value: function push(v) {
+      var entry = {
+        data: v,
+        next: null
+      };
+      if (this.length > 0) this.tail.next = entry;else this.head = entry;
+      this.tail = entry;
+      ++this.length;
+    }
+  }, {
+    key: "unshift",
+    value: function unshift(v) {
+      var entry = {
+        data: v,
+        next: this.head
+      };
+      if (this.length === 0) this.tail = entry;
+      this.head = entry;
+      ++this.length;
+    }
+  }, {
+    key: "shift",
+    value: function shift() {
+      if (this.length === 0) return;
+      var ret = this.head.data;
+      if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
+      --this.length;
+      return ret;
+    }
+  }, {
+    key: "clear",
+    value: function clear() {
+      this.head = this.tail = null;
+      this.length = 0;
+    }
+  }, {
+    key: "join",
+    value: function join(s) {
+      if (this.length === 0) return '';
+      var p = this.head;
+      var ret = '' + p.data;
+
+      while (p = p.next) {
+        ret += s + p.data;
+      }
+
+      return ret;
+    }
+  }, {
+    key: "concat",
+    value: function concat(n) {
+      if (this.length === 0) return Buffer.alloc(0);
+      var ret = Buffer.allocUnsafe(n >>> 0);
+      var p = this.head;
+      var i = 0;
+
+      while (p) {
+        copyBuffer(p.data, ret, i);
+        i += p.data.length;
+        p = p.next;
+      }
+
+      return ret;
+    } // Consumes a specified amount of bytes or characters from the buffered data.
+
+  }, {
+    key: "consume",
+    value: function consume(n, hasStrings) {
+      var ret;
+
+      if (n < this.head.data.length) {
+        // `slice` is the same for buffers and strings.
+        ret = this.head.data.slice(0, n);
+        this.head.data = this.head.data.slice(n);
+      } else if (n === this.head.data.length) {
+        // First chunk is a perfect match.
+        ret = this.shift();
+      } else {
+        // Result spans more than one buffer.
+        ret = hasStrings ? this._getString(n) : this._getBuffer(n);
+      }
+
+      return ret;
+    }
+  }, {
+    key: "first",
+    value: function first() {
+      return this.head.data;
+    } // Consumes a specified amount of characters from the buffered data.
+
+  }, {
+    key: "_getString",
+    value: function _getString(n) {
+      var p = this.head;
+      var c = 1;
+      var ret = p.data;
+      n -= ret.length;
+
+      while (p = p.next) {
+        var str = p.data;
+        var nb = n > str.length ? str.length : n;
+        if (nb === str.length) ret += str;else ret += str.slice(0, n);
+        n -= nb;
+
+        if (n === 0) {
+          if (nb === str.length) {
+            ++c;
+            if (p.next) this.head = p.next;else this.head = this.tail = null;
+          } else {
+            this.head = p;
+            p.data = str.slice(nb);
+          }
+
+          break;
+        }
+
+        ++c;
+      }
+
+      this.length -= c;
+      return ret;
+    } // Consumes a specified amount of bytes from the buffered data.
+
+  }, {
+    key: "_getBuffer",
+    value: function _getBuffer(n) {
+      var ret = Buffer.allocUnsafe(n);
+      var p = this.head;
+      var c = 1;
+      p.data.copy(ret);
+      n -= p.data.length;
+
+      while (p = p.next) {
+        var buf = p.data;
+        var nb = n > buf.length ? buf.length : n;
+        buf.copy(ret, ret.length - n, 0, nb);
+        n -= nb;
+
+        if (n === 0) {
+          if (nb === buf.length) {
+            ++c;
+            if (p.next) this.head = p.next;else this.head = this.tail = null;
+          } else {
+            this.head = p;
+            p.data = buf.slice(nb);
+          }
+
+          break;
+        }
+
+        ++c;
+      }
+
+      this.length -= c;
+      return ret;
+    } // Make sure the linked list only shows the minimal necessary information.
+
+  }, {
+    key: custom,
+    value: function value(_, options) {
+      return inspect(this, _objectSpread({}, options, {
+        // Only inspect one level.
+        depth: 0,
+        // It should not recurse.
+        customInspect: false
+      }));
+    }
+  }]);
+
+  return BufferList;
+}();
\ No newline at end of file
diff --git a/node_modules/bl/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/destroy.js
new file mode 100644
index 0000000..3268a16
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/destroy.js
@@ -0,0 +1,105 @@
+'use strict'; // undocumented cb() API, needed for core, not for public API
+
+function destroy(err, cb) {
+  var _this = this;
+
+  var readableDestroyed = this._readableState && this._readableState.destroyed;
+  var writableDestroyed = this._writableState && this._writableState.destroyed;
+
+  if (readableDestroyed || writableDestroyed) {
+    if (cb) {
+      cb(err);
+    } else if (err) {
+      if (!this._writableState) {
+        process.nextTick(emitErrorNT, this, err);
+      } else if (!this._writableState.errorEmitted) {
+        this._writableState.errorEmitted = true;
+        process.nextTick(emitErrorNT, this, err);
+      }
+    }
+
+    return this;
+  } // we set destroyed to true before firing error callbacks in order
+  // to make it re-entrance safe in case destroy() is called within callbacks
+
+
+  if (this._readableState) {
+    this._readableState.destroyed = true;
+  } // if this is a duplex stream mark the writable part as destroyed as well
+
+
+  if (this._writableState) {
+    this._writableState.destroyed = true;
+  }
+
+  this._destroy(err || null, function (err) {
+    if (!cb && err) {
+      if (!_this._writableState) {
+        process.nextTick(emitErrorAndCloseNT, _this, err);
+      } else if (!_this._writableState.errorEmitted) {
+        _this._writableState.errorEmitted = true;
+        process.nextTick(emitErrorAndCloseNT, _this, err);
+      } else {
+        process.nextTick(emitCloseNT, _this);
+      }
+    } else if (cb) {
+      process.nextTick(emitCloseNT, _this);
+      cb(err);
+    } else {
+      process.nextTick(emitCloseNT, _this);
+    }
+  });
+
+  return this;
+}
+
+function emitErrorAndCloseNT(self, err) {
+  emitErrorNT(self, err);
+  emitCloseNT(self);
+}
+
+function emitCloseNT(self) {
+  if (self._writableState && !self._writableState.emitClose) return;
+  if (self._readableState && !self._readableState.emitClose) return;
+  self.emit('close');
+}
+
+function undestroy() {
+  if (this._readableState) {
+    this._readableState.destroyed = false;
+    this._readableState.reading = false;
+    this._readableState.ended = false;
+    this._readableState.endEmitted = false;
+  }
+
+  if (this._writableState) {
+    this._writableState.destroyed = false;
+    this._writableState.ended = false;
+    this._writableState.ending = false;
+    this._writableState.finalCalled = false;
+    this._writableState.prefinished = false;
+    this._writableState.finished = false;
+    this._writableState.errorEmitted = false;
+  }
+}
+
+function emitErrorNT(self, err) {
+  self.emit('error', err);
+}
+
+function errorOrDestroy(stream, err) {
+  // We have tests that rely on errors being emitted
+  // in the same tick, so changing this is semver major.
+  // For now when you opt-in to autoDestroy we allow
+  // the error to be emitted nextTick. In a future
+  // semver major update we should change the default to this.
+  var rState = stream._readableState;
+  var wState = stream._writableState;
+  if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err);
+}
+
+module.exports = {
+  destroy: destroy,
+  undestroy: undestroy,
+  errorOrDestroy: errorOrDestroy
+};
\ No newline at end of file
diff --git a/node_modules/bl/node_modules/readable-stream/lib/internal/streams/end-of-stream.js b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/end-of-stream.js
new file mode 100644
index 0000000..831f286
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/end-of-stream.js
@@ -0,0 +1,104 @@
+// Ported from https://github.com/mafintosh/end-of-stream with
+// permission from the author, Mathias Buus (@mafintosh).
+'use strict';
+
+var ERR_STREAM_PREMATURE_CLOSE = require('../../../errors').codes.ERR_STREAM_PREMATURE_CLOSE;
+
+function once(callback) {
+  var called = false;
+  return function () {
+    if (called) return;
+    called = true;
+
+    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+      args[_key] = arguments[_key];
+    }
+
+    callback.apply(this, args);
+  };
+}
+
+function noop() {}
+
+function isRequest(stream) {
+  return stream.setHeader && typeof stream.abort === 'function';
+}
+
+function eos(stream, opts, callback) {
+  if (typeof opts === 'function') return eos(stream, null, opts);
+  if (!opts) opts = {};
+  callback = once(callback || noop);
+  var readable = opts.readable || opts.readable !== false && stream.readable;
+  var writable = opts.writable || opts.writable !== false && stream.writable;
+
+  var onlegacyfinish = function onlegacyfinish() {
+    if (!stream.writable) onfinish();
+  };
+
+  var writableEnded = stream._writableState && stream._writableState.finished;
+
+  var onfinish = function onfinish() {
+    writable = false;
+    writableEnded = true;
+    if (!readable) callback.call(stream);
+  };
+
+  var readableEnded = stream._readableState && stream._readableState.endEmitted;
+
+  var onend = function onend() {
+    readable = false;
+    readableEnded = true;
+    if (!writable) callback.call(stream);
+  };
+
+  var onerror = function onerror(err) {
+    callback.call(stream, err);
+  };
+
+  var onclose = function onclose() {
+    var err;
+
+    if (readable && !readableEnded) {
+      if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
+      return callback.call(stream, err);
+    }
+
+    if (writable && !writableEnded) {
+      if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
+      return callback.call(stream, err);
+    }
+  };
+
+  var onrequest = function onrequest() {
+    stream.req.on('finish', onfinish);
+  };
+
+  if (isRequest(stream)) {
+    stream.on('complete', onfinish);
+    stream.on('abort', onclose);
+    if (stream.req) onrequest();else stream.on('request', onrequest);
+  } else if (writable && !stream._writableState) {
+    // legacy streams
+    stream.on('end', onlegacyfinish);
+    stream.on('close', onlegacyfinish);
+  }
+
+  stream.on('end', onend);
+  stream.on('finish', onfinish);
+  if (opts.error !== false) stream.on('error', onerror);
+  stream.on('close', onclose);
+  return function () {
+    stream.removeListener('complete', onfinish);
+    stream.removeListener('abort', onclose);
+    stream.removeListener('request', onrequest);
+    if (stream.req) stream.req.removeListener('finish', onfinish);
+    stream.removeListener('end', onlegacyfinish);
+    stream.removeListener('close', onlegacyfinish);
+    stream.removeListener('finish', onfinish);
+    stream.removeListener('end', onend);
+    stream.removeListener('error', onerror);
+    stream.removeListener('close', onclose);
+  };
+}
+
+module.exports = eos;
\ No newline at end of file
diff --git a/node_modules/bl/node_modules/readable-stream/lib/internal/streams/from-browser.js b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/from-browser.js
new file mode 100644
index 0000000..a4ce56f
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/from-browser.js
@@ -0,0 +1,3 @@
+module.exports = function () {
+  throw new Error('Readable.from is not available in the browser')
+};
diff --git a/node_modules/bl/node_modules/readable-stream/lib/internal/streams/from.js b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/from.js
new file mode 100644
index 0000000..6c41284
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/from.js
@@ -0,0 +1,64 @@
+'use strict';
+
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
+
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+var ERR_INVALID_ARG_TYPE = require('../../../errors').codes.ERR_INVALID_ARG_TYPE;
+
+function from(Readable, iterable, opts) {
+  var iterator;
+
+  if (iterable && typeof iterable.next === 'function') {
+    iterator = iterable;
+  } else if (iterable && iterable[Symbol.asyncIterator]) iterator = iterable[Symbol.asyncIterator]();else if (iterable && iterable[Symbol.iterator]) iterator = iterable[Symbol.iterator]();else throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable);
+
+  var readable = new Readable(_objectSpread({
+    objectMode: true
+  }, opts)); // Reading boolean to protect against _read
+  // being called before last iteration completion.
+
+  var reading = false;
+
+  readable._read = function () {
+    if (!reading) {
+      reading = true;
+      next();
+    }
+  };
+
+  function next() {
+    return _next2.apply(this, arguments);
+  }
+
+  function _next2() {
+    _next2 = _asyncToGenerator(function* () {
+      try {
+        var _ref = yield iterator.next(),
+            value = _ref.value,
+            done = _ref.done;
+
+        if (done) {
+          readable.push(null);
+        } else if (readable.push((yield value))) {
+          next();
+        } else {
+          reading = false;
+        }
+      } catch (err) {
+        readable.destroy(err);
+      }
+    });
+    return _next2.apply(this, arguments);
+  }
+
+  return readable;
+}
+
+module.exports = from;
\ No newline at end of file
diff --git a/node_modules/bl/node_modules/readable-stream/lib/internal/streams/pipeline.js b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/pipeline.js
new file mode 100644
index 0000000..6589909
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/pipeline.js
@@ -0,0 +1,97 @@
+// Ported from https://github.com/mafintosh/pump with
+// permission from the author, Mathias Buus (@mafintosh).
+'use strict';
+
+var eos;
+
+function once(callback) {
+  var called = false;
+  return function () {
+    if (called) return;
+    called = true;
+    callback.apply(void 0, arguments);
+  };
+}
+
+var _require$codes = require('../../../errors').codes,
+    ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS,
+    ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED;
+
+function noop(err) {
+  // Rethrow the error if it exists to avoid swallowing it
+  if (err) throw err;
+}
+
+function isRequest(stream) {
+  return stream.setHeader && typeof stream.abort === 'function';
+}
+
+function destroyer(stream, reading, writing, callback) {
+  callback = once(callback);
+  var closed = false;
+  stream.on('close', function () {
+    closed = true;
+  });
+  if (eos === undefined) eos = require('./end-of-stream');
+  eos(stream, {
+    readable: reading,
+    writable: writing
+  }, function (err) {
+    if (err) return callback(err);
+    closed = true;
+    callback();
+  });
+  var destroyed = false;
+  return function (err) {
+    if (closed) return;
+    if (destroyed) return;
+    destroyed = true; // request.destroy just do .end - .abort is what we want
+
+    if (isRequest(stream)) return stream.abort();
+    if (typeof stream.destroy === 'function') return stream.destroy();
+    callback(err || new ERR_STREAM_DESTROYED('pipe'));
+  };
+}
+
+function call(fn) {
+  fn();
+}
+
+function pipe(from, to) {
+  return from.pipe(to);
+}
+
+function popCallback(streams) {
+  if (!streams.length) return noop;
+  if (typeof streams[streams.length - 1] !== 'function') return noop;
+  return streams.pop();
+}
+
+function pipeline() {
+  for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) {
+    streams[_key] = arguments[_key];
+  }
+
+  var callback = popCallback(streams);
+  if (Array.isArray(streams[0])) streams = streams[0];
+
+  if (streams.length < 2) {
+    throw new ERR_MISSING_ARGS('streams');
+  }
+
+  var error;
+  var destroys = streams.map(function (stream, i) {
+    var reading = i < streams.length - 1;
+    var writing = i > 0;
+    return destroyer(stream, reading, writing, function (err) {
+      if (!error) error = err;
+      if (err) destroys.forEach(call);
+      if (reading) return;
+      destroys.forEach(call);
+      callback(error);
+    });
+  });
+  return streams.reduce(pipe);
+}
+
+module.exports = pipeline;
\ No newline at end of file
diff --git a/node_modules/bl/node_modules/readable-stream/lib/internal/streams/state.js b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/state.js
new file mode 100644
index 0000000..19887eb
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/state.js
@@ -0,0 +1,27 @@
+'use strict';
+
+var ERR_INVALID_OPT_VALUE = require('../../../errors').codes.ERR_INVALID_OPT_VALUE;
+
+function highWaterMarkFrom(options, isDuplex, duplexKey) {
+  return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null;
+}
+
+function getHighWaterMark(state, options, duplexKey, isDuplex) {
+  var hwm = highWaterMarkFrom(options, isDuplex, duplexKey);
+
+  if (hwm != null) {
+    if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) {
+      var name = isDuplex ? duplexKey : 'highWaterMark';
+      throw new ERR_INVALID_OPT_VALUE(name, hwm);
+    }
+
+    return Math.floor(hwm);
+  } // Default value
+
+
+  return state.objectMode ? 16 : 16 * 1024;
+}
+
+module.exports = {
+  getHighWaterMark: getHighWaterMark
+};
\ No newline at end of file
diff --git a/node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream-browser.js
new file mode 100644
index 0000000..9332a3f
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream-browser.js
@@ -0,0 +1 @@
+module.exports = require('events').EventEmitter;
diff --git a/node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream.js
new file mode 100644
index 0000000..ce2ad5b
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/lib/internal/streams/stream.js
@@ -0,0 +1 @@
+module.exports = require('stream');
diff --git a/node_modules/bl/node_modules/readable-stream/package.json b/node_modules/bl/node_modules/readable-stream/package.json
new file mode 100644
index 0000000..59e410c
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/package.json
@@ -0,0 +1,97 @@
+{
+  "_from": "readable-stream@^3.4.0",
+  "_id": "readable-stream@3.6.0",
+  "_inBundle": false,
+  "_integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+  "_location": "/bl/readable-stream",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "readable-stream@^3.4.0",
+    "name": "readable-stream",
+    "escapedName": "readable-stream",
+    "rawSpec": "^3.4.0",
+    "saveSpec": null,
+    "fetchSpec": "^3.4.0"
+  },
+  "_requiredBy": [
+    "/bl"
+  ],
+  "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+  "_shasum": "337bbda3adc0706bd3e024426a286d4b4b2c9198",
+  "_spec": "readable-stream@^3.4.0",
+  "_where": "F:\\vent-display\\node_modules\\bl",
+  "browser": {
+    "util": false,
+    "worker_threads": false,
+    "./errors": "./errors-browser.js",
+    "./readable.js": "./readable-browser.js",
+    "./lib/internal/streams/from.js": "./lib/internal/streams/from-browser.js",
+    "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js"
+  },
+  "bugs": {
+    "url": "https://github.com/nodejs/readable-stream/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "inherits": "^2.0.3",
+    "string_decoder": "^1.1.1",
+    "util-deprecate": "^1.0.1"
+  },
+  "deprecated": false,
+  "description": "Streams3, a user-land copy of the stream library from Node.js",
+  "devDependencies": {
+    "@babel/cli": "^7.2.0",
+    "@babel/core": "^7.2.0",
+    "@babel/polyfill": "^7.0.0",
+    "@babel/preset-env": "^7.2.0",
+    "airtap": "0.0.9",
+    "assert": "^1.4.0",
+    "bl": "^2.0.0",
+    "deep-strict-equal": "^0.2.0",
+    "events.once": "^2.0.2",
+    "glob": "^7.1.2",
+    "gunzip-maybe": "^1.4.1",
+    "hyperquest": "^2.1.3",
+    "lolex": "^2.6.0",
+    "nyc": "^11.0.0",
+    "pump": "^3.0.0",
+    "rimraf": "^2.6.2",
+    "tap": "^12.0.0",
+    "tape": "^4.9.0",
+    "tar-fs": "^1.16.2",
+    "util-promisify": "^2.1.0"
+  },
+  "engines": {
+    "node": ">= 6"
+  },
+  "homepage": "https://github.com/nodejs/readable-stream#readme",
+  "keywords": [
+    "readable",
+    "stream",
+    "pipe"
+  ],
+  "license": "MIT",
+  "main": "readable.js",
+  "name": "readable-stream",
+  "nyc": {
+    "include": [
+      "lib/**.js"
+    ]
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/nodejs/readable-stream.git"
+  },
+  "scripts": {
+    "ci": "TAP=1 tap --no-esm test/parallel/*.js test/ours/*.js | tee test.tap",
+    "cover": "nyc npm test",
+    "report": "nyc report --reporter=lcov",
+    "test": "tap -J --no-esm test/parallel/*.js test/ours/*.js",
+    "test-browser-local": "airtap --open --local -- test/browser.js",
+    "test-browsers": "airtap --sauce-connect --loopback airtap.local -- test/browser.js",
+    "update-browser-errors": "babel -o errors-browser.js errors.js"
+  },
+  "version": "3.6.0"
+}
diff --git a/node_modules/bl/node_modules/readable-stream/readable-browser.js b/node_modules/bl/node_modules/readable-stream/readable-browser.js
new file mode 100644
index 0000000..adbf60d
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/readable-browser.js
@@ -0,0 +1,9 @@
+exports = module.exports = require('./lib/_stream_readable.js');
+exports.Stream = exports;
+exports.Readable = exports;
+exports.Writable = require('./lib/_stream_writable.js');
+exports.Duplex = require('./lib/_stream_duplex.js');
+exports.Transform = require('./lib/_stream_transform.js');
+exports.PassThrough = require('./lib/_stream_passthrough.js');
+exports.finished = require('./lib/internal/streams/end-of-stream.js');
+exports.pipeline = require('./lib/internal/streams/pipeline.js');
diff --git a/node_modules/bl/node_modules/readable-stream/readable.js b/node_modules/bl/node_modules/readable-stream/readable.js
new file mode 100644
index 0000000..9e0ca12
--- /dev/null
+++ b/node_modules/bl/node_modules/readable-stream/readable.js
@@ -0,0 +1,16 @@
+var Stream = require('stream');
+if (process.env.READABLE_STREAM === 'disable' && Stream) {
+  module.exports = Stream.Readable;
+  Object.assign(module.exports, Stream);
+  module.exports.Stream = Stream;
+} else {
+  exports = module.exports = require('./lib/_stream_readable.js');
+  exports.Stream = Stream || exports;
+  exports.Readable = exports;
+  exports.Writable = require('./lib/_stream_writable.js');
+  exports.Duplex = require('./lib/_stream_duplex.js');
+  exports.Transform = require('./lib/_stream_transform.js');
+  exports.PassThrough = require('./lib/_stream_passthrough.js');
+  exports.finished = require('./lib/internal/streams/end-of-stream.js');
+  exports.pipeline = require('./lib/internal/streams/pipeline.js');
+}
diff --git a/node_modules/bl/package.json b/node_modules/bl/package.json
new file mode 100644
index 0000000..9b05b56
--- /dev/null
+++ b/node_modules/bl/package.json
@@ -0,0 +1,69 @@
+{
+  "_from": "bl@^4.0.3",
+  "_id": "bl@4.0.3",
+  "_inBundle": false,
+  "_integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==",
+  "_location": "/bl",
+  "_phantomChildren": {
+    "inherits": "2.0.4",
+    "string_decoder": "1.1.1",
+    "util-deprecate": "1.0.2"
+  },
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "bl@^4.0.3",
+    "name": "bl",
+    "escapedName": "bl",
+    "rawSpec": "^4.0.3",
+    "saveSpec": null,
+    "fetchSpec": "^4.0.3"
+  },
+  "_requiredBy": [
+    "/tar-stream"
+  ],
+  "_resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz",
+  "_shasum": "12d6287adc29080e22a705e5764b2a9522cdc489",
+  "_spec": "bl@^4.0.3",
+  "_where": "F:\\vent-display\\node_modules\\tar-stream",
+  "authors": [
+    "Rod Vagg <rod@vagg.org> (https://github.com/rvagg)",
+    "Matteo Collina <matteo.collina@gmail.com> (https://github.com/mcollina)",
+    "Jarett Cruger <jcrugzz@gmail.com> (https://github.com/jcrugzz)"
+  ],
+  "bugs": {
+    "url": "https://github.com/rvagg/bl/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "buffer": "^5.5.0",
+    "inherits": "^2.0.4",
+    "readable-stream": "^3.4.0"
+  },
+  "deprecated": false,
+  "description": "Buffer List: collect buffers and access with a standard readable Buffer interface, streamable too!",
+  "devDependencies": {
+    "faucet": "~0.0.1",
+    "standard": "^14.3.0",
+    "tape": "^4.11.0"
+  },
+  "homepage": "https://github.com/rvagg/bl",
+  "keywords": [
+    "buffer",
+    "buffers",
+    "stream",
+    "awesomesauce"
+  ],
+  "license": "MIT",
+  "main": "bl.js",
+  "name": "bl",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/rvagg/bl.git"
+  },
+  "scripts": {
+    "lint": "standard *.js test/*.js",
+    "test": "npm run lint && node test/test.js | faucet"
+  },
+  "version": "4.0.3"
+}
diff --git a/node_modules/bl/test/convert.js b/node_modules/bl/test/convert.js
new file mode 100644
index 0000000..9f3e235
--- /dev/null
+++ b/node_modules/bl/test/convert.js
@@ -0,0 +1,21 @@
+'use strict'
+
+const tape = require('tape')
+const { BufferList, BufferListStream } = require('../')
+const { Buffer } = require('buffer')
+
+tape('convert from BufferList to BufferListStream', (t) => {
+  const data = Buffer.from(`TEST-${Date.now()}`)
+  const bl = new BufferList(data)
+  const bls = new BufferListStream(bl)
+  t.ok(bl.slice().equals(bls.slice()))
+  t.end()
+})
+
+tape('convert from BufferListStream to BufferList', (t) => {
+  const data = Buffer.from(`TEST-${Date.now()}`)
+  const bls = new BufferListStream(data)
+  const bl = new BufferList(bls)
+  t.ok(bl.slice().equals(bls.slice()))
+  t.end()
+})
diff --git a/node_modules/bl/test/indexOf.js b/node_modules/bl/test/indexOf.js
new file mode 100644
index 0000000..62dcb01
--- /dev/null
+++ b/node_modules/bl/test/indexOf.js
@@ -0,0 +1,492 @@
+'use strict'
+
+const tape = require('tape')
+const BufferList = require('../')
+const { Buffer } = require('buffer')
+
+tape('indexOf single byte needle', (t) => {
+  const bl = new BufferList(['abcdefg', 'abcdefg', '12345'])
+
+  t.equal(bl.indexOf('e'), 4)
+  t.equal(bl.indexOf('e', 5), 11)
+  t.equal(bl.indexOf('e', 12), -1)
+  t.equal(bl.indexOf('5'), 18)
+
+  t.end()
+})
+
+tape('indexOf multiple byte needle', (t) => {
+  const bl = new BufferList(['abcdefg', 'abcdefg'])
+
+  t.equal(bl.indexOf('ef'), 4)
+  t.equal(bl.indexOf('ef', 5), 11)
+
+  t.end()
+})
+
+tape('indexOf multiple byte needles across buffer boundaries', (t) => {
+  const bl = new BufferList(['abcdefg', 'abcdefg'])
+
+  t.equal(bl.indexOf('fgabc'), 5)
+
+  t.end()
+})
+
+tape('indexOf takes a Uint8Array search', (t) => {
+  const bl = new BufferList(['abcdefg', 'abcdefg'])
+  const search = new Uint8Array([102, 103, 97, 98, 99]) // fgabc
+
+  t.equal(bl.indexOf(search), 5)
+
+  t.end()
+})
+
+tape('indexOf takes a buffer list search', (t) => {
+  const bl = new BufferList(['abcdefg', 'abcdefg'])
+  const search = new BufferList('fgabc')
+
+  t.equal(bl.indexOf(search), 5)
+
+  t.end()
+})
+
+tape('indexOf a zero byte needle', (t) => {
+  const b = new BufferList('abcdef')
+  const bufEmpty = Buffer.from('')
+
+  t.equal(b.indexOf(''), 0)
+  t.equal(b.indexOf('', 1), 1)
+  t.equal(b.indexOf('', b.length + 1), b.length)
+  t.equal(b.indexOf('', Infinity), b.length)
+  t.equal(b.indexOf(bufEmpty), 0)
+  t.equal(b.indexOf(bufEmpty, 1), 1)
+  t.equal(b.indexOf(bufEmpty, b.length + 1), b.length)
+  t.equal(b.indexOf(bufEmpty, Infinity), b.length)
+
+  t.end()
+})
+
+tape('indexOf buffers smaller and larger than the needle', (t) => {
+  const bl = new BufferList(['abcdefg', 'a', 'bcdefg', 'a', 'bcfgab'])
+
+  t.equal(bl.indexOf('fgabc'), 5)
+  t.equal(bl.indexOf('fgabc', 6), 12)
+  t.equal(bl.indexOf('fgabc', 13), -1)
+
+  t.end()
+})
+
+// only present in node 6+
+;(process.version.substr(1).split('.')[0] >= 6) && tape('indexOf latin1 and binary encoding', (t) => {
+  const b = new BufferList('abcdef')
+
+  // test latin1 encoding
+  t.equal(
+    new BufferList(Buffer.from(b.toString('latin1'), 'latin1'))
+      .indexOf('d', 0, 'latin1'),
+    3
+  )
+  t.equal(
+    new BufferList(Buffer.from(b.toString('latin1'), 'latin1'))
+      .indexOf(Buffer.from('d', 'latin1'), 0, 'latin1'),
+    3
+  )
+  t.equal(
+    new BufferList(Buffer.from('aa\u00e8aa', 'latin1'))
+      .indexOf('\u00e8', 'latin1'),
+    2
+  )
+  t.equal(
+    new BufferList(Buffer.from('\u00e8', 'latin1'))
+      .indexOf('\u00e8', 'latin1'),
+    0
+  )
+  t.equal(
+    new BufferList(Buffer.from('\u00e8', 'latin1'))
+      .indexOf(Buffer.from('\u00e8', 'latin1'), 'latin1'),
+    0
+  )
+
+  // test binary encoding
+  t.equal(
+    new BufferList(Buffer.from(b.toString('binary'), 'binary'))
+      .indexOf('d', 0, 'binary'),
+    3
+  )
+  t.equal(
+    new BufferList(Buffer.from(b.toString('binary'), 'binary'))
+      .indexOf(Buffer.from('d', 'binary'), 0, 'binary'),
+    3
+  )
+  t.equal(
+    new BufferList(Buffer.from('aa\u00e8aa', 'binary'))
+      .indexOf('\u00e8', 'binary'),
+    2
+  )
+  t.equal(
+    new BufferList(Buffer.from('\u00e8', 'binary'))
+      .indexOf('\u00e8', 'binary'),
+    0
+  )
+  t.equal(
+    new BufferList(Buffer.from('\u00e8', 'binary'))
+      .indexOf(Buffer.from('\u00e8', 'binary'), 'binary'),
+    0
+  )
+
+  t.end()
+})
+
+tape('indexOf the entire nodejs10 buffer test suite', (t) => {
+  const b = new BufferList('abcdef')
+  const bufA = Buffer.from('a')
+  const bufBc = Buffer.from('bc')
+  const bufF = Buffer.from('f')
+  const bufZ = Buffer.from('z')
+
+  const stringComparison = 'abcdef'
+
+  t.equal(b.indexOf('a'), 0)
+  t.equal(b.indexOf('a', 1), -1)
+  t.equal(b.indexOf('a', -1), -1)
+  t.equal(b.indexOf('a', -4), -1)
+  t.equal(b.indexOf('a', -b.length), 0)
+  t.equal(b.indexOf('a', NaN), 0)
+  t.equal(b.indexOf('a', -Infinity), 0)
+  t.equal(b.indexOf('a', Infinity), -1)
+  t.equal(b.indexOf('bc'), 1)
+  t.equal(b.indexOf('bc', 2), -1)
+  t.equal(b.indexOf('bc', -1), -1)
+  t.equal(b.indexOf('bc', -3), -1)
+  t.equal(b.indexOf('bc', -5), 1)
+  t.equal(b.indexOf('bc', NaN), 1)
+  t.equal(b.indexOf('bc', -Infinity), 1)
+  t.equal(b.indexOf('bc', Infinity), -1)
+  t.equal(b.indexOf('f'), b.length - 1)
+  t.equal(b.indexOf('z'), -1)
+
+  // empty search tests
+  t.equal(b.indexOf(bufA), 0)
+  t.equal(b.indexOf(bufA, 1), -1)
+  t.equal(b.indexOf(bufA, -1), -1)
+  t.equal(b.indexOf(bufA, -4), -1)
+  t.equal(b.indexOf(bufA, -b.length), 0)
+  t.equal(b.indexOf(bufA, NaN), 0)
+  t.equal(b.indexOf(bufA, -Infinity), 0)
+  t.equal(b.indexOf(bufA, Infinity), -1)
+  t.equal(b.indexOf(bufBc), 1)
+  t.equal(b.indexOf(bufBc, 2), -1)
+  t.equal(b.indexOf(bufBc, -1), -1)
+  t.equal(b.indexOf(bufBc, -3), -1)
+  t.equal(b.indexOf(bufBc, -5), 1)
+  t.equal(b.indexOf(bufBc, NaN), 1)
+  t.equal(b.indexOf(bufBc, -Infinity), 1)
+  t.equal(b.indexOf(bufBc, Infinity), -1)
+  t.equal(b.indexOf(bufF), b.length - 1)
+  t.equal(b.indexOf(bufZ), -1)
+  t.equal(b.indexOf(0x61), 0)
+  t.equal(b.indexOf(0x61, 1), -1)
+  t.equal(b.indexOf(0x61, -1), -1)
+  t.equal(b.indexOf(0x61, -4), -1)
+  t.equal(b.indexOf(0x61, -b.length), 0)
+  t.equal(b.indexOf(0x61, NaN), 0)
+  t.equal(b.indexOf(0x61, -Infinity), 0)
+  t.equal(b.indexOf(0x61, Infinity), -1)
+  t.equal(b.indexOf(0x0), -1)
+
+  // test offsets
+  t.equal(b.indexOf('d', 2), 3)
+  t.equal(b.indexOf('f', 5), 5)
+  t.equal(b.indexOf('f', -1), 5)
+  t.equal(b.indexOf('f', 6), -1)
+
+  t.equal(b.indexOf(Buffer.from('d'), 2), 3)
+  t.equal(b.indexOf(Buffer.from('f'), 5), 5)
+  t.equal(b.indexOf(Buffer.from('f'), -1), 5)
+  t.equal(b.indexOf(Buffer.from('f'), 6), -1)
+
+  t.equal(Buffer.from('ff').indexOf(Buffer.from('f'), 1, 'ucs2'), -1)
+
+  // test invalid and uppercase encoding
+  t.equal(b.indexOf('b', 'utf8'), 1)
+  t.equal(b.indexOf('b', 'UTF8'), 1)
+  t.equal(b.indexOf('62', 'HEX'), 1)
+  t.throws(() => b.indexOf('bad', 'enc'), TypeError)
+
+  // test hex encoding
+  t.equal(
+    Buffer.from(b.toString('hex'), 'hex')
+      .indexOf('64', 0, 'hex'),
+    3
+  )
+  t.equal(
+    Buffer.from(b.toString('hex'), 'hex')
+      .indexOf(Buffer.from('64', 'hex'), 0, 'hex'),
+    3
+  )
+
+  // test base64 encoding
+  t.equal(
+    Buffer.from(b.toString('base64'), 'base64')
+      .indexOf('ZA==', 0, 'base64'),
+    3
+  )
+  t.equal(
+    Buffer.from(b.toString('base64'), 'base64')
+      .indexOf(Buffer.from('ZA==', 'base64'), 0, 'base64'),
+    3
+  )
+
+  // test ascii encoding
+  t.equal(
+    Buffer.from(b.toString('ascii'), 'ascii')
+      .indexOf('d', 0, 'ascii'),
+    3
+  )
+  t.equal(
+    Buffer.from(b.toString('ascii'), 'ascii')
+      .indexOf(Buffer.from('d', 'ascii'), 0, 'ascii'),
+    3
+  )
+
+  // test optional offset with passed encoding
+  t.equal(Buffer.from('aaaa0').indexOf('30', 'hex'), 4)
+  t.equal(Buffer.from('aaaa00a').indexOf('3030', 'hex'), 4)
+
+  {
+    // test usc2 encoding
+    const twoByteString = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2')
+
+    t.equal(8, twoByteString.indexOf('\u0395', 4, 'ucs2'))
+    t.equal(6, twoByteString.indexOf('\u03a3', -4, 'ucs2'))
+    t.equal(4, twoByteString.indexOf('\u03a3', -6, 'ucs2'))
+    t.equal(4, twoByteString.indexOf(
+      Buffer.from('\u03a3', 'ucs2'), -6, 'ucs2'))
+    t.equal(-1, twoByteString.indexOf('\u03a3', -2, 'ucs2'))
+  }
+
+  const mixedByteStringUcs2 =
+      Buffer.from('\u039a\u0391abc\u03a3\u03a3\u0395', 'ucs2')
+
+  t.equal(6, mixedByteStringUcs2.indexOf('bc', 0, 'ucs2'))
+  t.equal(10, mixedByteStringUcs2.indexOf('\u03a3', 0, 'ucs2'))
+  t.equal(-1, mixedByteStringUcs2.indexOf('\u0396', 0, 'ucs2'))
+
+  t.equal(
+    6, mixedByteStringUcs2.indexOf(Buffer.from('bc', 'ucs2'), 0, 'ucs2'))
+  t.equal(
+    10, mixedByteStringUcs2.indexOf(Buffer.from('\u03a3', 'ucs2'), 0, 'ucs2'))
+  t.equal(
+    -1, mixedByteStringUcs2.indexOf(Buffer.from('\u0396', 'ucs2'), 0, 'ucs2'))
+
+  {
+    const twoByteString = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2')
+
+    // Test single char pattern
+    t.equal(0, twoByteString.indexOf('\u039a', 0, 'ucs2'))
+    let index = twoByteString.indexOf('\u0391', 0, 'ucs2')
+    t.equal(2, index, `Alpha - at index ${index}`)
+    index = twoByteString.indexOf('\u03a3', 0, 'ucs2')
+    t.equal(4, index, `First Sigma - at index ${index}`)
+    index = twoByteString.indexOf('\u03a3', 6, 'ucs2')
+    t.equal(6, index, `Second Sigma - at index ${index}`)
+    index = twoByteString.indexOf('\u0395', 0, 'ucs2')
+    t.equal(8, index, `Epsilon - at index ${index}`)
+    index = twoByteString.indexOf('\u0392', 0, 'ucs2')
+    t.equal(-1, index, `Not beta - at index ${index}`)
+
+    // Test multi-char pattern
+    index = twoByteString.indexOf('\u039a\u0391', 0, 'ucs2')
+    t.equal(0, index, `Lambda Alpha - at index ${index}`)
+    index = twoByteString.indexOf('\u0391\u03a3', 0, 'ucs2')
+    t.equal(2, index, `Alpha Sigma - at index ${index}`)
+    index = twoByteString.indexOf('\u03a3\u03a3', 0, 'ucs2')
+    t.equal(4, index, `Sigma Sigma - at index ${index}`)
+    index = twoByteString.indexOf('\u03a3\u0395', 0, 'ucs2')
+    t.equal(6, index, `Sigma Epsilon - at index ${index}`)
+  }
+
+  const mixedByteStringUtf8 = Buffer.from('\u039a\u0391abc\u03a3\u03a3\u0395')
+
+  t.equal(5, mixedByteStringUtf8.indexOf('bc'))
+  t.equal(5, mixedByteStringUtf8.indexOf('bc', 5))
+  t.equal(5, mixedByteStringUtf8.indexOf('bc', -8))
+  t.equal(7, mixedByteStringUtf8.indexOf('\u03a3'))
+  t.equal(-1, mixedByteStringUtf8.indexOf('\u0396'))
+
+  // Test complex string indexOf algorithms. Only trigger for long strings.
+  // Long string that isn't a simple repeat of a shorter string.
+  let longString = 'A'
+  for (let i = 66; i < 76; i++) { // from 'B' to 'K'
+    longString = longString + String.fromCharCode(i) + longString
+  }
+
+  const longBufferString = Buffer.from(longString)
+
+  // pattern of 15 chars, repeated every 16 chars in long
+  let pattern = 'ABACABADABACABA'
+  for (let i = 0; i < longBufferString.length - pattern.length; i += 7) {
+    const index = longBufferString.indexOf(pattern, i)
+    t.equal((i + 15) & ~0xf, index,
+      `Long ABACABA...-string at index ${i}`)
+  }
+
+  let index = longBufferString.indexOf('AJABACA')
+  t.equal(510, index, `Long AJABACA, First J - at index ${index}`)
+  index = longBufferString.indexOf('AJABACA', 511)
+  t.equal(1534, index, `Long AJABACA, Second J - at index ${index}`)
+
+  pattern = 'JABACABADABACABA'
+  index = longBufferString.indexOf(pattern)
+  t.equal(511, index, `Long JABACABA..., First J - at index ${index}`)
+  index = longBufferString.indexOf(pattern, 512)
+  t.equal(
+    1535, index, `Long JABACABA..., Second J - at index ${index}`)
+
+  // Search for a non-ASCII string in a pure ASCII string.
+  const asciiString = Buffer.from(
+    'somethingnotatallsinisterwhichalsoworks')
+  t.equal(-1, asciiString.indexOf('\x2061'))
+  t.equal(3, asciiString.indexOf('eth', 0))
+
+  // Search in string containing many non-ASCII chars.
+  const allCodePoints = []
+  for (let i = 0; i < 65536; i++) {
+    allCodePoints[i] = i
+  }
+
+  const allCharsString = String.fromCharCode.apply(String, allCodePoints)
+  const allCharsBufferUtf8 = Buffer.from(allCharsString)
+  const allCharsBufferUcs2 = Buffer.from(allCharsString, 'ucs2')
+
+  // Search for string long enough to trigger complex search with ASCII pattern
+  // and UC16 subject.
+  t.equal(-1, allCharsBufferUtf8.indexOf('notfound'))
+  t.equal(-1, allCharsBufferUcs2.indexOf('notfound'))
+
+  // Needle is longer than haystack, but only because it's encoded as UTF-16
+  t.equal(Buffer.from('aaaa').indexOf('a'.repeat(4), 'ucs2'), -1)
+
+  t.equal(Buffer.from('aaaa').indexOf('a'.repeat(4), 'utf8'), 0)
+  t.equal(Buffer.from('aaaa').indexOf('你好', 'ucs2'), -1)
+
+  // Haystack has odd length, but the needle is UCS2.
+  t.equal(Buffer.from('aaaaa').indexOf('b', 'ucs2'), -1)
+
+  {
+    // Find substrings in Utf8.
+    const lengths = [1, 3, 15] // Single char, simple and complex.
+    const indices = [0x5, 0x60, 0x400, 0x680, 0x7ee, 0xFF02, 0x16610, 0x2f77b]
+    for (let lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) {
+      for (let i = 0; i < indices.length; i++) {
+        const index = indices[i]
+        let length = lengths[lengthIndex]
+
+        if (index + length > 0x7F) {
+          length = 2 * length
+        }
+
+        if (index + length > 0x7FF) {
+          length = 3 * length
+        }
+
+        if (index + length > 0xFFFF) {
+          length = 4 * length
+        }
+
+        const patternBufferUtf8 = allCharsBufferUtf8.slice(index, index + length)
+        t.equal(index, allCharsBufferUtf8.indexOf(patternBufferUtf8))
+
+        const patternStringUtf8 = patternBufferUtf8.toString()
+        t.equal(index, allCharsBufferUtf8.indexOf(patternStringUtf8))
+      }
+    }
+  }
+
+  {
+    // Find substrings in Usc2.
+    const lengths = [2, 4, 16] // Single char, simple and complex.
+    const indices = [0x5, 0x65, 0x105, 0x205, 0x285, 0x2005, 0x2085, 0xfff0]
+
+    for (let lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) {
+      for (let i = 0; i < indices.length; i++) {
+        const index = indices[i] * 2
+        const length = lengths[lengthIndex]
+
+        const patternBufferUcs2 =
+            allCharsBufferUcs2.slice(index, index + length)
+        t.equal(
+          index, allCharsBufferUcs2.indexOf(patternBufferUcs2, 0, 'ucs2'))
+
+        const patternStringUcs2 = patternBufferUcs2.toString('ucs2')
+        t.equal(
+          index, allCharsBufferUcs2.indexOf(patternStringUcs2, 0, 'ucs2'))
+      }
+    }
+  }
+
+  [
+    () => {},
+    {},
+    []
+  ].forEach((val) => {
+    t.throws(() => b.indexOf(val), TypeError, `"${JSON.stringify(val)}" should throw`)
+  })
+
+  // Test weird offset arguments.
+  // The following offsets coerce to NaN or 0, searching the whole Buffer
+  t.equal(b.indexOf('b', undefined), 1)
+  t.equal(b.indexOf('b', {}), 1)
+  t.equal(b.indexOf('b', 0), 1)
+  t.equal(b.indexOf('b', null), 1)
+  t.equal(b.indexOf('b', []), 1)
+
+  // The following offset coerces to 2, in other words +[2] === 2
+  t.equal(b.indexOf('b', [2]), -1)
+
+  // Behavior should match String.indexOf()
+  t.equal(
+    b.indexOf('b', undefined),
+    stringComparison.indexOf('b', undefined))
+  t.equal(
+    b.indexOf('b', {}),
+    stringComparison.indexOf('b', {}))
+  t.equal(
+    b.indexOf('b', 0),
+    stringComparison.indexOf('b', 0))
+  t.equal(
+    b.indexOf('b', null),
+    stringComparison.indexOf('b', null))
+  t.equal(
+    b.indexOf('b', []),
+    stringComparison.indexOf('b', []))
+  t.equal(
+    b.indexOf('b', [2]),
+    stringComparison.indexOf('b', [2]))
+
+  // test truncation of Number arguments to uint8
+  {
+    const buf = Buffer.from('this is a test')
+
+    t.equal(buf.indexOf(0x6973), 3)
+    t.equal(buf.indexOf(0x697320), 4)
+    t.equal(buf.indexOf(0x69732069), 2)
+    t.equal(buf.indexOf(0x697374657374), 0)
+    t.equal(buf.indexOf(0x69737374), 0)
+    t.equal(buf.indexOf(0x69737465), 11)
+    t.equal(buf.indexOf(0x69737465), 11)
+    t.equal(buf.indexOf(-140), 0)
+    t.equal(buf.indexOf(-152), 1)
+    t.equal(buf.indexOf(0xff), -1)
+    t.equal(buf.indexOf(0xffff), -1)
+  }
+
+  // Test that Uint8Array arguments are okay.
+  {
+    const needle = new Uint8Array([0x66, 0x6f, 0x6f])
+    const haystack = new BufferList(Buffer.from('a foo b foo'))
+    t.equal(haystack.indexOf(needle), 2)
+  }
+
+  t.end()
+})
diff --git a/node_modules/bl/test/isBufferList.js b/node_modules/bl/test/isBufferList.js
new file mode 100644
index 0000000..9d895d5
--- /dev/null
+++ b/node_modules/bl/test/isBufferList.js
@@ -0,0 +1,32 @@
+'use strict'
+
+const tape = require('tape')
+const { BufferList, BufferListStream } = require('../')
+const { Buffer } = require('buffer')
+
+tape('isBufferList positives', (t) => {
+  t.ok(BufferList.isBufferList(new BufferList()))
+  t.ok(BufferList.isBufferList(new BufferListStream()))
+
+  t.end()
+})
+
+tape('isBufferList negatives', (t) => {
+  const types = [
+    null,
+    undefined,
+    NaN,
+    true,
+    false,
+    {},
+    [],
+    Buffer.alloc(0),
+    [Buffer.alloc(0)]
+  ]
+
+  for (const obj of types) {
+    t.notOk(BufferList.isBufferList(obj))
+  }
+
+  t.end()
+})
diff --git a/node_modules/bl/test/test.js b/node_modules/bl/test/test.js
new file mode 100644
index 0000000..e03bb85
--- /dev/null
+++ b/node_modules/bl/test/test.js
@@ -0,0 +1,851 @@
+'use strict'
+
+const tape = require('tape')
+const crypto = require('crypto')
+const fs = require('fs')
+const path = require('path')
+const BufferList = require('../')
+const { Buffer } = require('buffer')
+
+const encodings =
+      ('hex utf8 utf-8 ascii binary base64' +
+          (process.browser ? '' : ' ucs2 ucs-2 utf16le utf-16le')).split(' ')
+
+require('./indexOf')
+require('./isBufferList')
+require('./convert')
+
+tape('single bytes from single buffer', function (t) {
+  const bl = new BufferList()
+
+  bl.append(Buffer.from('abcd'))
+
+  t.equal(bl.length, 4)
+  t.equal(bl.get(-1), undefined)
+  t.equal(bl.get(0), 97)
+  t.equal(bl.get(1), 98)
+  t.equal(bl.get(2), 99)
+  t.equal(bl.get(3), 100)
+  t.equal(bl.get(4), undefined)
+
+  t.end()
+})
+
+tape('single bytes from multiple buffers', function (t) {
+  const bl = new BufferList()
+
+  bl.append(Buffer.from('abcd'))
+  bl.append(Buffer.from('efg'))
+  bl.append(Buffer.from('hi'))
+  bl.append(Buffer.from('j'))
+
+  t.equal(bl.length, 10)
+
+  t.equal(bl.get(0), 97)
+  t.equal(bl.get(1), 98)
+  t.equal(bl.get(2), 99)
+  t.equal(bl.get(3), 100)
+  t.equal(bl.get(4), 101)
+  t.equal(bl.get(5), 102)
+  t.equal(bl.get(6), 103)
+  t.equal(bl.get(7), 104)
+  t.equal(bl.get(8), 105)
+  t.equal(bl.get(9), 106)
+
+  t.end()
+})
+
+tape('multi bytes from single buffer', function (t) {
+  const bl = new BufferList()
+
+  bl.append(Buffer.from('abcd'))
+
+  t.equal(bl.length, 4)
+
+  t.equal(bl.slice(0, 4).toString('ascii'), 'abcd')
+  t.equal(bl.slice(0, 3).toString('ascii'), 'abc')
+  t.equal(bl.slice(1, 4).toString('ascii'), 'bcd')
+  t.equal(bl.slice(-4, -1).toString('ascii'), 'abc')
+
+  t.end()
+})
+
+tape('multi bytes from single buffer (negative indexes)', function (t) {
+  const bl = new BufferList()
+
+  bl.append(Buffer.from('buffer'))
+
+  t.equal(bl.length, 6)
+
+  t.equal(bl.slice(-6, -1).toString('ascii'), 'buffe')
+  t.equal(bl.slice(-6, -2).toString('ascii'), 'buff')
+  t.equal(bl.slice(-5, -2).toString('ascii'), 'uff')
+
+  t.end()
+})
+
+tape('multiple bytes from multiple buffers', function (t) {
+  const bl = new BufferList()
+
+  bl.append(Buffer.from('abcd'))
+  bl.append(Buffer.from('efg'))
+  bl.append(Buffer.from('hi'))
+  bl.append(Buffer.from('j'))
+
+  t.equal(bl.length, 10)
+
+  t.equal(bl.slice(0, 10).toString('ascii'), 'abcdefghij')
+  t.equal(bl.slice(3, 10).toString('ascii'), 'defghij')
+  t.equal(bl.slice(3, 6).toString('ascii'), 'def')
+  t.equal(bl.slice(3, 8).toString('ascii'), 'defgh')
+  t.equal(bl.slice(5, 10).toString('ascii'), 'fghij')
+  t.equal(bl.slice(-7, -4).toString('ascii'), 'def')
+
+  t.end()
+})
+
+tape('multiple bytes from multiple buffer lists', function (t) {
+  const bl = new BufferList()
+
+  bl.append(new BufferList([Buffer.from('abcd'), Buffer.from('efg')]))
+  bl.append(new BufferList([Buffer.from('hi'), Buffer.from('j')]))
+
+  t.equal(bl.length, 10)
+
+  t.equal(bl.slice(0, 10).toString('ascii'), 'abcdefghij')
+
+  t.equal(bl.slice(3, 10).toString('ascii'), 'defghij')
+  t.equal(bl.slice(3, 6).toString('ascii'), 'def')
+  t.equal(bl.slice(3, 8).toString('ascii'), 'defgh')
+  t.equal(bl.slice(5, 10).toString('ascii'), 'fghij')
+
+  t.end()
+})
+
+// same data as previous test, just using nested constructors
+tape('multiple bytes from crazy nested buffer lists', function (t) {
+  const bl = new BufferList()
+
+  bl.append(new BufferList([
+    new BufferList([
+      new BufferList(Buffer.from('abc')),
+      Buffer.from('d'),
+      new BufferList(Buffer.from('efg'))
+    ]),
+    new BufferList([Buffer.from('hi')]),
+    new BufferList(Buffer.from('j'))
+  ]))
+
+  t.equal(bl.length, 10)
+
+  t.equal(bl.slice(0, 10).toString('ascii'), 'abcdefghij')
+
+  t.equal(bl.slice(3, 10).toString('ascii'), 'defghij')
+  t.equal(bl.slice(3, 6).toString('ascii'), 'def')
+  t.equal(bl.slice(3, 8).toString('ascii'), 'defgh')
+  t.equal(bl.slice(5, 10).toString('ascii'), 'fghij')
+
+  t.end()
+})
+
+tape('append accepts arrays of Buffers', function (t) {
+  const bl = new BufferList()
+
+  bl.append(Buffer.from('abc'))
+  bl.append([Buffer.from('def')])
+  bl.append([Buffer.from('ghi'), Buffer.from('jkl')])
+  bl.append([Buffer.from('mnop'), Buffer.from('qrstu'), Buffer.from('vwxyz')])
+  t.equal(bl.length, 26)
+  t.equal(bl.slice().toString('ascii'), 'abcdefghijklmnopqrstuvwxyz')
+
+  t.end()
+})
+
+tape('append accepts arrays of Uint8Arrays', function (t) {
+  const bl = new BufferList()
+
+  bl.append(new Uint8Array([97, 98, 99]))
+  bl.append([Uint8Array.from([100, 101, 102])])
+  bl.append([new Uint8Array([103, 104, 105]), new Uint8Array([106, 107, 108])])
+  bl.append([new Uint8Array([109, 110, 111, 112]), new Uint8Array([113, 114, 115, 116, 117]), new Uint8Array([118, 119, 120, 121, 122])])
+  t.equal(bl.length, 26)
+  t.equal(bl.slice().toString('ascii'), 'abcdefghijklmnopqrstuvwxyz')
+
+  t.end()
+})
+
+tape('append accepts arrays of BufferLists', function (t) {
+  const bl = new BufferList()
+
+  bl.append(Buffer.from('abc'))
+  bl.append([new BufferList('def')])
+  bl.append(new BufferList([Buffer.from('ghi'), new BufferList('jkl')]))
+  bl.append([Buffer.from('mnop'), new BufferList([Buffer.from('qrstu'), Buffer.from('vwxyz')])])
+  t.equal(bl.length, 26)
+  t.equal(bl.slice().toString('ascii'), 'abcdefghijklmnopqrstuvwxyz')
+
+  t.end()
+})
+
+tape('append chainable', function (t) {
+  const bl = new BufferList()
+
+  t.ok(bl.append(Buffer.from('abcd')) === bl)
+  t.ok(bl.append([Buffer.from('abcd')]) === bl)
+  t.ok(bl.append(new BufferList(Buffer.from('abcd'))) === bl)
+  t.ok(bl.append([new BufferList(Buffer.from('abcd'))]) === bl)
+
+  t.end()
+})
+
+tape('append chainable (test results)', function (t) {
+  const bl = new BufferList('abc')
+    .append([new BufferList('def')])
+    .append(new BufferList([Buffer.from('ghi'), new BufferList('jkl')]))
+    .append([Buffer.from('mnop'), new BufferList([Buffer.from('qrstu'), Buffer.from('vwxyz')])])
+
+  t.equal(bl.length, 26)
+  t.equal(bl.slice().toString('ascii'), 'abcdefghijklmnopqrstuvwxyz')
+
+  t.end()
+})
+
+tape('consuming from multiple buffers', function (t) {
+  const bl = new BufferList()
+
+  bl.append(Buffer.from('abcd'))
+  bl.append(Buffer.from('efg'))
+  bl.append(Buffer.from('hi'))
+  bl.append(Buffer.from('j'))
+
+  t.equal(bl.length, 10)
+
+  t.equal(bl.slice(0, 10).toString('ascii'), 'abcdefghij')
+
+  bl.consume(3)
+  t.equal(bl.length, 7)
+  t.equal(bl.slice(0, 7).toString('ascii'), 'defghij')
+
+  bl.consume(2)
+  t.equal(bl.length, 5)
+  t.equal(bl.slice(0, 5).toString('ascii'), 'fghij')
+
+  bl.consume(1)
+  t.equal(bl.length, 4)
+  t.equal(bl.slice(0, 4).toString('ascii'), 'ghij')
+
+  bl.consume(1)
+  t.equal(bl.length, 3)
+  t.equal(bl.slice(0, 3).toString('ascii'), 'hij')
+
+  bl.consume(2)
+  t.equal(bl.length, 1)
+  t.equal(bl.slice(0, 1).toString('ascii'), 'j')
+
+  t.end()
+})
+
+tape('complete consumption', function (t) {
+  const bl = new BufferList()
+
+  bl.append(Buffer.from('a'))
+  bl.append(Buffer.from('b'))
+
+  bl.consume(2)
+
+  t.equal(bl.length, 0)
+  t.equal(bl._bufs.length, 0)
+
+  t.end()
+})
+
+tape('test readUInt8 / readInt8', function (t) {
+  const buf1 = Buffer.alloc(1)
+  const buf2 = Buffer.alloc(3)
+  const buf3 = Buffer.alloc(3)
+  const bl = new BufferList()
+
+  buf2[1] = 0x3
+  buf2[2] = 0x4
+  buf3[0] = 0x23
+  buf3[1] = 0x42
+
+  bl.append(buf1)
+  bl.append(buf2)
+  bl.append(buf3)
+
+  t.equal(bl.readUInt8(2), 0x3)
+  t.equal(bl.readInt8(2), 0x3)
+  t.equal(bl.readUInt8(3), 0x4)
+  t.equal(bl.readInt8(3), 0x4)
+  t.equal(bl.readUInt8(4), 0x23)
+  t.equal(bl.readInt8(4), 0x23)
+  t.equal(bl.readUInt8(5), 0x42)
+  t.equal(bl.readInt8(5), 0x42)
+
+  t.end()
+})
+
+tape('test readUInt16LE / readUInt16BE / readInt16LE / readInt16BE', function (t) {
+  const buf1 = Buffer.alloc(1)
+  const buf2 = Buffer.alloc(3)
+  const buf3 = Buffer.alloc(3)
+  const bl = new BufferList()
+
+  buf2[1] = 0x3
+  buf2[2] = 0x4
+  buf3[0] = 0x23
+  buf3[1] = 0x42
+
+  bl.append(buf1)
+  bl.append(buf2)
+  bl.append(buf3)
+
+  t.equal(bl.readUInt16BE(2), 0x0304)
+  t.equal(bl.readUInt16LE(2), 0x0403)
+  t.equal(bl.readInt16BE(2), 0x0304)
+  t.equal(bl.readInt16LE(2), 0x0403)
+  t.equal(bl.readUInt16BE(3), 0x0423)
+  t.equal(bl.readUInt16LE(3), 0x2304)
+  t.equal(bl.readInt16BE(3), 0x0423)
+  t.equal(bl.readInt16LE(3), 0x2304)
+  t.equal(bl.readUInt16BE(4), 0x2342)
+  t.equal(bl.readUInt16LE(4), 0x4223)
+  t.equal(bl.readInt16BE(4), 0x2342)
+  t.equal(bl.readInt16LE(4), 0x4223)
+
+  t.end()
+})
+
+tape('test readUInt32LE / readUInt32BE / readInt32LE / readInt32BE', function (t) {
+  const buf1 = Buffer.alloc(1)
+  const buf2 = Buffer.alloc(3)
+  const buf3 = Buffer.alloc(3)
+  const bl = new BufferList()
+
+  buf2[1] = 0x3
+  buf2[2] = 0x4
+  buf3[0] = 0x23
+  buf3[1] = 0x42
+
+  bl.append(buf1)
+  bl.append(buf2)
+  bl.append(buf3)
+
+  t.equal(bl.readUInt32BE(2), 0x03042342)
+  t.equal(bl.readUInt32LE(2), 0x42230403)
+  t.equal(bl.readInt32BE(2), 0x03042342)
+  t.equal(bl.readInt32LE(2), 0x42230403)
+
+  t.end()
+})
+
+tape('test readUIntLE / readUIntBE / readIntLE / readIntBE', function (t) {
+  const buf1 = Buffer.alloc(1)
+  const buf2 = Buffer.alloc(3)
+  const buf3 = Buffer.alloc(3)
+  const bl = new BufferList()
+
+  buf2[0] = 0x2
+  buf2[1] = 0x3
+  buf2[2] = 0x4
+  buf3[0] = 0x23
+  buf3[1] = 0x42
+  buf3[2] = 0x61
+
+  bl.append(buf1)
+  bl.append(buf2)
+  bl.append(buf3)
+
+  t.equal(bl.readUIntBE(1, 1), 0x02)
+  t.equal(bl.readUIntBE(1, 2), 0x0203)
+  t.equal(bl.readUIntBE(1, 3), 0x020304)
+  t.equal(bl.readUIntBE(1, 4), 0x02030423)
+  t.equal(bl.readUIntBE(1, 5), 0x0203042342)
+  t.equal(bl.readUIntBE(1, 6), 0x020304234261)
+  t.equal(bl.readUIntLE(1, 1), 0x02)
+  t.equal(bl.readUIntLE(1, 2), 0x0302)
+  t.equal(bl.readUIntLE(1, 3), 0x040302)
+  t.equal(bl.readUIntLE(1, 4), 0x23040302)
+  t.equal(bl.readUIntLE(1, 5), 0x4223040302)
+  t.equal(bl.readUIntLE(1, 6), 0x614223040302)
+  t.equal(bl.readIntBE(1, 1), 0x02)
+  t.equal(bl.readIntBE(1, 2), 0x0203)
+  t.equal(bl.readIntBE(1, 3), 0x020304)
+  t.equal(bl.readIntBE(1, 4), 0x02030423)
+  t.equal(bl.readIntBE(1, 5), 0x0203042342)
+  t.equal(bl.readIntBE(1, 6), 0x020304234261)
+  t.equal(bl.readIntLE(1, 1), 0x02)
+  t.equal(bl.readIntLE(1, 2), 0x0302)
+  t.equal(bl.readIntLE(1, 3), 0x040302)
+  t.equal(bl.readIntLE(1, 4), 0x23040302)
+  t.equal(bl.readIntLE(1, 5), 0x4223040302)
+  t.equal(bl.readIntLE(1, 6), 0x614223040302)
+
+  t.end()
+})
+
+tape('test readFloatLE / readFloatBE', function (t) {
+  const buf1 = Buffer.alloc(1)
+  const buf2 = Buffer.alloc(3)
+  const buf3 = Buffer.alloc(3)
+  const bl = new BufferList()
+
+  buf2[1] = 0x00
+  buf2[2] = 0x00
+  buf3[0] = 0x80
+  buf3[1] = 0x3f
+
+  bl.append(buf1)
+  bl.append(buf2)
+  bl.append(buf3)
+
+  t.equal(bl.readFloatLE(2), 0x01)
+
+  t.end()
+})
+
+tape('test readDoubleLE / readDoubleBE', function (t) {
+  const buf1 = Buffer.alloc(1)
+  const buf2 = Buffer.alloc(3)
+  const buf3 = Buffer.alloc(10)
+  const bl = new BufferList()
+
+  buf2[1] = 0x55
+  buf2[2] = 0x55
+  buf3[0] = 0x55
+  buf3[1] = 0x55
+  buf3[2] = 0x55
+  buf3[3] = 0x55
+  buf3[4] = 0xd5
+  buf3[5] = 0x3f
+
+  bl.append(buf1)
+  bl.append(buf2)
+  bl.append(buf3)
+
+  t.equal(bl.readDoubleLE(2), 0.3333333333333333)
+
+  t.end()
+})
+
+tape('test toString', function (t) {
+  const bl = new BufferList()
+
+  bl.append(Buffer.from('abcd'))
+  bl.append(Buffer.from('efg'))
+  bl.append(Buffer.from('hi'))
+  bl.append(Buffer.from('j'))
+
+  t.equal(bl.toString('ascii', 0, 10), 'abcdefghij')
+  t.equal(bl.toString('ascii', 3, 10), 'defghij')
+  t.equal(bl.toString('ascii', 3, 6), 'def')
+  t.equal(bl.toString('ascii', 3, 8), 'defgh')
+  t.equal(bl.toString('ascii', 5, 10), 'fghij')
+
+  t.end()
+})
+
+tape('test toString encoding', function (t) {
+  const bl = new BufferList()
+  const b = Buffer.from('abcdefghij\xff\x00')
+
+  bl.append(Buffer.from('abcd'))
+  bl.append(Buffer.from('efg'))
+  bl.append(Buffer.from('hi'))
+  bl.append(Buffer.from('j'))
+  bl.append(Buffer.from('\xff\x00'))
+
+  encodings.forEach(function (enc) {
+    t.equal(bl.toString(enc), b.toString(enc), enc)
+  })
+
+  t.end()
+})
+
+tape('uninitialized memory', function (t) {
+  const secret = crypto.randomBytes(256)
+  for (let i = 0; i < 1e6; i++) {
+    const clone = Buffer.from(secret)
+    const bl = new BufferList()
+    bl.append(Buffer.from('a'))
+    bl.consume(-1024)
+    const buf = bl.slice(1)
+    if (buf.indexOf(clone) !== -1) {
+      t.fail(`Match (at ${i})`)
+      break
+    }
+  }
+  t.end()
+})
+
+!process.browser && tape('test stream', function (t) {
+  const random = crypto.randomBytes(65534)
+
+  const bl = new BufferList((err, buf) => {
+    t.ok(Buffer.isBuffer(buf))
+    t.ok(err === null)
+    t.ok(random.equals(bl.slice()))
+    t.ok(random.equals(buf.slice()))
+
+    bl.pipe(fs.createWriteStream('/tmp/bl_test_rnd_out.dat'))
+      .on('close', function () {
+        const rndhash = crypto.createHash('md5').update(random).digest('hex')
+        const md5sum = crypto.createHash('md5')
+        const s = fs.createReadStream('/tmp/bl_test_rnd_out.dat')
+
+        s.on('data', md5sum.update.bind(md5sum))
+        s.on('end', function () {
+          t.equal(rndhash, md5sum.digest('hex'), 'woohoo! correct hash!')
+          t.end()
+        })
+      })
+  })
+
+  fs.writeFileSync('/tmp/bl_test_rnd.dat', random)
+  fs.createReadStream('/tmp/bl_test_rnd.dat').pipe(bl)
+})
+
+tape('instantiation with Buffer', function (t) {
+  const buf = crypto.randomBytes(1024)
+  const buf2 = crypto.randomBytes(1024)
+  let b = BufferList(buf)
+
+  t.equal(buf.toString('hex'), b.slice().toString('hex'), 'same buffer')
+  b = BufferList([buf, buf2])
+  t.equal(b.slice().toString('hex'), Buffer.concat([buf, buf2]).toString('hex'), 'same buffer')
+
+  t.end()
+})
+
+tape('test String appendage', function (t) {
+  const bl = new BufferList()
+  const b = Buffer.from('abcdefghij\xff\x00')
+
+  bl.append('abcd')
+  bl.append('efg')
+  bl.append('hi')
+  bl.append('j')
+  bl.append('\xff\x00')
+
+  encodings.forEach(function (enc) {
+    t.equal(bl.toString(enc), b.toString(enc))
+  })
+
+  t.end()
+})
+
+tape('test Number appendage', function (t) {
+  const bl = new BufferList()
+  const b = Buffer.from('1234567890')
+
+  bl.append(1234)
+  bl.append(567)
+  bl.append(89)
+  bl.append(0)
+
+  encodings.forEach(function (enc) {
+    t.equal(bl.toString(enc), b.toString(enc))
+  })
+
+  t.end()
+})
+
+tape('write nothing, should get empty buffer', function (t) {
+  t.plan(3)
+  BufferList(function (err, data) {
+    t.notOk(err, 'no error')
+    t.ok(Buffer.isBuffer(data), 'got a buffer')
+    t.equal(0, data.length, 'got a zero-length buffer')
+    t.end()
+  }).end()
+})
+
+tape('unicode string', function (t) {
+  t.plan(2)
+
+  const inp1 = '\u2600'
+  const inp2 = '\u2603'
+  const exp = inp1 + ' and ' + inp2
+  const bl = BufferList()
+
+  bl.write(inp1)
+  bl.write(' and ')
+  bl.write(inp2)
+  t.equal(exp, bl.toString())
+  t.equal(Buffer.from(exp).toString('hex'), bl.toString('hex'))
+})
+
+tape('should emit finish', function (t) {
+  const source = BufferList()
+  const dest = BufferList()
+
+  source.write('hello')
+  source.pipe(dest)
+
+  dest.on('finish', function () {
+    t.equal(dest.toString('utf8'), 'hello')
+    t.end()
+  })
+})
+
+tape('basic copy', function (t) {
+  const buf = crypto.randomBytes(1024)
+  const buf2 = Buffer.alloc(1024)
+  const b = BufferList(buf)
+
+  b.copy(buf2)
+  t.equal(b.slice().toString('hex'), buf2.toString('hex'), 'same buffer')
+
+  t.end()
+})
+
+tape('copy after many appends', function (t) {
+  const buf = crypto.randomBytes(512)
+  const buf2 = Buffer.alloc(1024)
+  const b = BufferList(buf)
+
+  b.append(buf)
+  b.copy(buf2)
+  t.equal(b.slice().toString('hex'), buf2.toString('hex'), 'same buffer')
+
+  t.end()
+})
+
+tape('copy at a precise position', function (t) {
+  const buf = crypto.randomBytes(1004)
+  const buf2 = Buffer.alloc(1024)
+  const b = BufferList(buf)
+
+  b.copy(buf2, 20)
+  t.equal(b.slice().toString('hex'), buf2.slice(20).toString('hex'), 'same buffer')
+
+  t.end()
+})
+
+tape('copy starting from a precise location', function (t) {
+  const buf = crypto.randomBytes(10)
+  const buf2 = Buffer.alloc(5)
+  const b = BufferList(buf)
+
+  b.copy(buf2, 0, 5)
+  t.equal(b.slice(5).toString('hex'), buf2.toString('hex'), 'same buffer')
+
+  t.end()
+})
+
+tape('copy in an interval', function (t) {
+  const rnd = crypto.randomBytes(10)
+  const b = BufferList(rnd) // put the random bytes there
+  const actual = Buffer.alloc(3)
+  const expected = Buffer.alloc(3)
+
+  rnd.copy(expected, 0, 5, 8)
+  b.copy(actual, 0, 5, 8)
+
+  t.equal(actual.toString('hex'), expected.toString('hex'), 'same buffer')
+
+  t.end()
+})
+
+tape('copy an interval between two buffers', function (t) {
+  const buf = crypto.randomBytes(10)
+  const buf2 = Buffer.alloc(10)
+  const b = BufferList(buf)
+
+  b.append(buf)
+  b.copy(buf2, 0, 5, 15)
+
+  t.equal(b.slice(5, 15).toString('hex'), buf2.toString('hex'), 'same buffer')
+
+  t.end()
+})
+
+tape('shallow slice across buffer boundaries', function (t) {
+  const bl = new BufferList(['First', 'Second', 'Third'])
+
+  t.equal(bl.shallowSlice(3, 13).toString(), 'stSecondTh')
+
+  t.end()
+})
+
+tape('shallow slice within single buffer', function (t) {
+  t.plan(2)
+
+  const bl = new BufferList(['First', 'Second', 'Third'])
+
+  t.equal(bl.shallowSlice(5, 10).toString(), 'Secon')
+  t.equal(bl.shallowSlice(7, 10).toString(), 'con')
+
+  t.end()
+})
+
+tape('shallow slice single buffer', function (t) {
+  t.plan(3)
+
+  const bl = new BufferList(['First', 'Second', 'Third'])
+
+  t.equal(bl.shallowSlice(0, 5).toString(), 'First')
+  t.equal(bl.shallowSlice(5, 11).toString(), 'Second')
+  t.equal(bl.shallowSlice(11, 16).toString(), 'Third')
+})
+
+tape('shallow slice with negative or omitted indices', function (t) {
+  t.plan(4)
+
+  const bl = new BufferList(['First', 'Second', 'Third'])
+
+  t.equal(bl.shallowSlice().toString(), 'FirstSecondThird')
+  t.equal(bl.shallowSlice(5).toString(), 'SecondThird')
+  t.equal(bl.shallowSlice(5, -3).toString(), 'SecondTh')
+  t.equal(bl.shallowSlice(-8).toString(), 'ondThird')
+})
+
+tape('shallow slice does not make a copy', function (t) {
+  t.plan(1)
+
+  const buffers = [Buffer.from('First'), Buffer.from('Second'), Buffer.from('Third')]
+  const bl = (new BufferList(buffers)).shallowSlice(5, -3)
+
+  buffers[1].fill('h')
+  buffers[2].fill('h')
+
+  t.equal(bl.toString(), 'hhhhhhhh')
+})
+
+tape('shallow slice with 0 length', function (t) {
+  t.plan(1)
+
+  const buffers = [Buffer.from('First'), Buffer.from('Second'), Buffer.from('Third')]
+  const bl = (new BufferList(buffers)).shallowSlice(0, 0)
+
+  t.equal(bl.length, 0)
+})
+
+tape('shallow slice with 0 length from middle', function (t) {
+  t.plan(1)
+
+  const buffers = [Buffer.from('First'), Buffer.from('Second'), Buffer.from('Third')]
+  const bl = (new BufferList(buffers)).shallowSlice(10, 10)
+
+  t.equal(bl.length, 0)
+})
+
+tape('duplicate', function (t) {
+  t.plan(2)
+
+  const bl = new BufferList('abcdefghij\xff\x00')
+  const dup = bl.duplicate()
+
+  t.equal(bl.prototype, dup.prototype)
+  t.equal(bl.toString('hex'), dup.toString('hex'))
+})
+
+tape('destroy no pipe', function (t) {
+  t.plan(2)
+
+  const bl = new BufferList('alsdkfja;lsdkfja;lsdk')
+
+  bl.destroy()
+
+  t.equal(bl._bufs.length, 0)
+  t.equal(bl.length, 0)
+})
+
+tape('destroy with error', function (t) {
+  t.plan(3)
+
+  const bl = new BufferList('alsdkfja;lsdkfja;lsdk')
+  const err = new Error('kaboom')
+
+  bl.destroy(err)
+  bl.on('error', function (_err) {
+    t.equal(_err, err)
+  })
+
+  t.equal(bl._bufs.length, 0)
+  t.equal(bl.length, 0)
+})
+
+!process.browser && tape('destroy with pipe before read end', function (t) {
+  t.plan(2)
+
+  const bl = new BufferList()
+  fs.createReadStream(path.join(__dirname, '/test.js'))
+    .pipe(bl)
+
+  bl.destroy()
+
+  t.equal(bl._bufs.length, 0)
+  t.equal(bl.length, 0)
+})
+
+!process.browser && tape('destroy with pipe before read end with race', function (t) {
+  t.plan(2)
+
+  const bl = new BufferList()
+
+  fs.createReadStream(path.join(__dirname, '/test.js'))
+    .pipe(bl)
+
+  setTimeout(function () {
+    bl.destroy()
+    setTimeout(function () {
+      t.equal(bl._bufs.length, 0)
+      t.equal(bl.length, 0)
+    }, 500)
+  }, 500)
+})
+
+!process.browser && tape('destroy with pipe after read end', function (t) {
+  t.plan(2)
+
+  const bl = new BufferList()
+
+  fs.createReadStream(path.join(__dirname, '/test.js'))
+    .on('end', onEnd)
+    .pipe(bl)
+
+  function onEnd () {
+    bl.destroy()
+
+    t.equal(bl._bufs.length, 0)
+    t.equal(bl.length, 0)
+  }
+})
+
+!process.browser && tape('destroy with pipe while writing to a destination', function (t) {
+  t.plan(4)
+
+  const bl = new BufferList()
+  const ds = new BufferList()
+
+  fs.createReadStream(path.join(__dirname, '/test.js'))
+    .on('end', onEnd)
+    .pipe(bl)
+
+  function onEnd () {
+    bl.pipe(ds)
+
+    setTimeout(function () {
+      bl.destroy()
+
+      t.equals(bl._bufs.length, 0)
+      t.equals(bl.length, 0)
+
+      ds.destroy()
+
+      t.equals(bl._bufs.length, 0)
+      t.equals(bl.length, 0)
+    }, 100)
+  }
+})
+
+!process.browser && tape('handle error', function (t) {
+  t.plan(2)
+
+  fs.createReadStream('/does/not/exist').pipe(BufferList(function (err, data) {
+    t.ok(err instanceof Error, 'has error')
+    t.notOk(data, 'no data')
+  }))
+})
diff --git a/node_modules/buffer/AUTHORS.md b/node_modules/buffer/AUTHORS.md
new file mode 100644
index 0000000..22eb171
--- /dev/null
+++ b/node_modules/buffer/AUTHORS.md
@@ -0,0 +1,70 @@
+# Authors
+
+#### Ordered by first contribution.
+
+- Romain Beauxis (toots@rastageeks.org)
+- Tobias Koppers (tobias.koppers@googlemail.com)
+- Janus (ysangkok@gmail.com)
+- Rainer Dreyer (rdrey1@gmail.com)
+- Tõnis Tiigi (tonistiigi@gmail.com)
+- James Halliday (mail@substack.net)
+- Michael Williamson (mike@zwobble.org)
+- elliottcable (github@elliottcable.name)
+- rafael (rvalle@livelens.net)
+- Andrew Kelley (superjoe30@gmail.com)
+- Andreas Madsen (amwebdk@gmail.com)
+- Mike Brevoort (mike.brevoort@pearson.com)
+- Brian White (mscdex@mscdex.net)
+- Feross Aboukhadijeh (feross@feross.org)
+- Ruben Verborgh (ruben@verborgh.org)
+- eliang (eliang.cs@gmail.com)
+- Jesse Tane (jesse.tane@gmail.com)
+- Alfonso Boza (alfonso@cloud.com)
+- Mathias Buus (mathiasbuus@gmail.com)
+- Devon Govett (devongovett@gmail.com)
+- Daniel Cousens (github@dcousens.com)
+- Joseph Dykstra (josephdykstra@gmail.com)
+- Parsha Pourkhomami (parshap+git@gmail.com)
+- Damjan Košir (damjan.kosir@gmail.com)
+- daverayment (dave.rayment@gmail.com)
+- kawanet (u-suke@kawa.net)
+- Linus Unnebäck (linus@folkdatorn.se)
+- Nolan Lawson (nolan.lawson@gmail.com)
+- Calvin Metcalf (calvin.metcalf@gmail.com)
+- Koki Takahashi (hakatasiloving@gmail.com)
+- Guy Bedford (guybedford@gmail.com)
+- Jan Schär (jscissr@gmail.com)
+- RaulTsc (tomescu.raul@gmail.com)
+- Matthieu Monsch (monsch@alum.mit.edu)
+- Dan Ehrenberg (littledan@chromium.org)
+- Kirill Fomichev (fanatid@ya.ru)
+- Yusuke Kawasaki (u-suke@kawa.net)
+- DC (dcposch@dcpos.ch)
+- John-David Dalton (john.david.dalton@gmail.com)
+- adventure-yunfei (adventure030@gmail.com)
+- Emil Bay (github@tixz.dk)
+- Sam Sudar (sudar.sam@gmail.com)
+- Volker Mische (volker.mische@gmail.com)
+- David Walton (support@geekstocks.com)
+- Сковорода Никита Андреевич (chalkerx@gmail.com)
+- greenkeeper[bot] (greenkeeper[bot]@users.noreply.github.com)
+- ukstv (sergey.ukustov@machinomy.com)
+- Renée Kooi (renee@kooi.me)
+- ranbochen (ranbochen@qq.com)
+- Vladimir Borovik (bobahbdb@gmail.com)
+- greenkeeper[bot] (23040076+greenkeeper[bot]@users.noreply.github.com)
+- kumavis (aaron@kumavis.me)
+- Sergey Ukustov (sergey.ukustov@machinomy.com)
+- Fei Liu (liu.feiwood@gmail.com)
+- Blaine Bublitz (blaine.bublitz@gmail.com)
+- clement (clement@seald.io)
+- Koushik Dutta (koushd@gmail.com)
+- Jordan Harband (ljharb@gmail.com)
+- Niklas Mischkulnig (mischnic@users.noreply.github.com)
+- Nikolai Vavilov (vvnicholas@gmail.com)
+- Fedor Nezhivoi (gyzerok@users.noreply.github.com)
+- Peter Newman (peternewman@users.noreply.github.com)
+- mathmakgakpak (44949126+mathmakgakpak@users.noreply.github.com)
+- jkkang (jkkang@smartauth.kr)
+
+#### Generated by bin/update-authors.sh.
diff --git a/node_modules/buffer/LICENSE b/node_modules/buffer/LICENSE
new file mode 100644
index 0000000..d6bf75d
--- /dev/null
+++ b/node_modules/buffer/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Feross Aboukhadijeh, and other contributors.
+
+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/buffer/README.md b/node_modules/buffer/README.md
new file mode 100644
index 0000000..9a23d7c
--- /dev/null
+++ b/node_modules/buffer/README.md
@@ -0,0 +1,410 @@
+# buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url]
+
+[travis-image]: https://img.shields.io/travis/feross/buffer/master.svg
+[travis-url]: https://travis-ci.org/feross/buffer
+[npm-image]: https://img.shields.io/npm/v/buffer.svg
+[npm-url]: https://npmjs.org/package/buffer
+[downloads-image]: https://img.shields.io/npm/dm/buffer.svg
+[downloads-url]: https://npmjs.org/package/buffer
+[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg
+[standard-url]: https://standardjs.com
+
+#### The buffer module from [node.js](https://nodejs.org/), for the browser.
+
+[![saucelabs][saucelabs-image]][saucelabs-url]
+
+[saucelabs-image]: https://saucelabs.com/browser-matrix/buffer.svg
+[saucelabs-url]: https://saucelabs.com/u/buffer
+
+With [browserify](http://browserify.org), simply `require('buffer')` or use the `Buffer` global and you will get this module.
+
+The goal is to provide an API that is 100% identical to
+[node's Buffer API](https://nodejs.org/api/buffer.html). Read the
+[official docs](https://nodejs.org/api/buffer.html) for the full list of properties,
+instance methods, and class methods that are supported.
+
+## features
+
+- Manipulate binary data like a boss, in all browsers!
+- Super fast. Backed by Typed Arrays (`Uint8Array`/`ArrayBuffer`, not `Object`)
+- Extremely small bundle size (**6.75KB minified + gzipped**, 51.9KB with comments)
+- Excellent browser support (Chrome, Firefox, Edge, Safari 9+, IE 11, iOS 9+, Android, etc.)
+- Preserves Node API exactly, with one minor difference (see below)
+- Square-bracket `buf[4]` notation works!
+- Does not modify any browser prototypes or put anything on `window`
+- Comprehensive test suite (including all buffer tests from node.js core)
+
+## install
+
+To use this module directly (without browserify), install it:
+
+```bash
+npm install buffer
+```
+
+This module was previously called **native-buffer-browserify**, but please use **buffer**
+from now on.
+
+If you do not use a bundler, you can use the [standalone script](https://bundle.run/buffer).
+
+## usage
+
+The module's API is identical to node's `Buffer` API. Read the
+[official docs](https://nodejs.org/api/buffer.html) for the full list of properties,
+instance methods, and class methods that are supported.
+
+As mentioned above, `require('buffer')` or use the `Buffer` global with
+[browserify](http://browserify.org) and this module will automatically be included
+in your bundle. Almost any npm module will work in the browser, even if it assumes that
+the node `Buffer` API will be available.
+
+To depend on this module explicitly (without browserify), require it like this:
+
+```js
+var Buffer = require('buffer/').Buffer  // note: the trailing slash is important!
+```
+
+To require this module explicitly, use `require('buffer/')` which tells the node.js module
+lookup algorithm (also used by browserify) to use the **npm module** named `buffer`
+instead of the **node.js core** module named `buffer`!
+
+
+## how does it work?
+
+The Buffer constructor returns instances of `Uint8Array` that have their prototype
+changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of `Uint8Array`,
+so the returned instances will have all the node `Buffer` methods and the
+`Uint8Array` methods. Square bracket notation works as expected -- it returns a
+single octet.
+
+The `Uint8Array` prototype remains unmodified.
+
+
+## tracking the latest node api
+
+This module tracks the Buffer API in the latest (unstable) version of node.js. The Buffer
+API is considered **stable** in the
+[node stability index](https://nodejs.org/docs/latest/api/documentation.html#documentation_stability_index),
+so it is unlikely that there will ever be breaking changes.
+Nonetheless, when/if the Buffer API changes in node, this module's API will change
+accordingly.
+
+## related packages
+
+- [`buffer-reverse`](https://www.npmjs.com/package/buffer-reverse) - Reverse a buffer
+- [`buffer-xor`](https://www.npmjs.com/package/buffer-xor) - Bitwise xor a buffer
+- [`is-buffer`](https://www.npmjs.com/package/is-buffer) - Determine if an object is a Buffer without including the whole `Buffer` package
+
+## conversion packages
+
+### convert typed array to buffer
+
+Use [`typedarray-to-buffer`](https://www.npmjs.com/package/typedarray-to-buffer) to convert any kind of typed array to a `Buffer`. Does not perform a copy, so it's super fast.
+
+### convert buffer to typed array
+
+`Buffer` is a subclass of `Uint8Array` (which is a typed array). So there is no need to explicitly convert to typed array. Just use the buffer as a `Uint8Array`.
+
+### convert blob to buffer
+
+Use [`blob-to-buffer`](https://www.npmjs.com/package/blob-to-buffer) to convert a `Blob` to a `Buffer`.
+
+### convert buffer to blob
+
+To convert a `Buffer` to a `Blob`, use the `Blob` constructor:
+
+```js
+var blob = new Blob([ buffer ])
+```
+
+Optionally, specify a mimetype:
+
+```js
+var blob = new Blob([ buffer ], { type: 'text/html' })
+```
+
+### convert arraybuffer to buffer
+
+To convert an `ArrayBuffer` to a `Buffer`, use the `Buffer.from` function. Does not perform a copy, so it's super fast.
+
+```js
+var buffer = Buffer.from(arrayBuffer)
+```
+
+### convert buffer to arraybuffer
+
+To convert a `Buffer` to an `ArrayBuffer`, use the `.buffer` property (which is present on all `Uint8Array` objects):
+
+```js
+var arrayBuffer = buffer.buffer.slice(
+  buffer.byteOffset, buffer.byteOffset + buffer.byteLength
+)
+```
+
+Alternatively, use the [`to-arraybuffer`](https://www.npmjs.com/package/to-arraybuffer) module.
+
+## performance
+
+See perf tests in `/perf`.
+
+`BrowserBuffer` is the browser `buffer` module (this repo). `Uint8Array` is included as a
+sanity check (since `BrowserBuffer` uses `Uint8Array` under the hood, `Uint8Array` will
+always be at least a bit faster). Finally, `NodeBuffer` is the node.js buffer module,
+which is included to compare against.
+
+NOTE: Performance has improved since these benchmarks were taken. PR welcome to update the README.
+
+### Chrome 38
+
+| Method | Operations | Accuracy | Sampled | Fastest |
+|:-------|:-----------|:---------|:--------|:-------:|
+| BrowserBuffer#bracket-notation | 11,457,464 ops/sec | ±0.86% | 66 | ✓ |
+| Uint8Array#bracket-notation | 10,824,332 ops/sec | ±0.74% | 65 | |
+| | | | |
+| BrowserBuffer#concat | 450,532 ops/sec | ±0.76% | 68 | |
+| Uint8Array#concat | 1,368,911 ops/sec | ±1.50% | 62 | ✓ |
+| | | | |
+| BrowserBuffer#copy(16000) | 903,001 ops/sec | ±0.96% | 67 | |
+| Uint8Array#copy(16000) | 1,422,441 ops/sec | ±1.04% | 66 | ✓ |
+| | | | |
+| BrowserBuffer#copy(16) | 11,431,358 ops/sec | ±0.46% | 69 | |
+| Uint8Array#copy(16) | 13,944,163 ops/sec | ±1.12% | 68 | ✓ |
+| | | | |
+| BrowserBuffer#new(16000) | 106,329 ops/sec | ±6.70% | 44 | |
+| Uint8Array#new(16000) | 131,001 ops/sec | ±2.85% | 31 | ✓ |
+| | | | |
+| BrowserBuffer#new(16) | 1,554,491 ops/sec | ±1.60% | 65 | |
+| Uint8Array#new(16) | 6,623,930 ops/sec | ±1.66% | 65 | ✓ |
+| | | | |
+| BrowserBuffer#readDoubleBE | 112,830 ops/sec | ±0.51% | 69 | ✓ |
+| DataView#getFloat64 | 93,500 ops/sec | ±0.57% | 68 | |
+| | | | |
+| BrowserBuffer#readFloatBE | 146,678 ops/sec | ±0.95% | 68 | ✓ |
+| DataView#getFloat32 | 99,311 ops/sec | ±0.41% | 67 | |
+| | | | |
+| BrowserBuffer#readUInt32LE | 843,214 ops/sec | ±0.70% | 69 | ✓ |
+| DataView#getUint32 | 103,024 ops/sec | ±0.64% | 67 | |
+| | | | |
+| BrowserBuffer#slice | 1,013,941 ops/sec | ±0.75% | 67 | |
+| Uint8Array#subarray | 1,903,928 ops/sec | ±0.53% | 67 | ✓ |
+| | | | |
+| BrowserBuffer#writeFloatBE | 61,387 ops/sec | ±0.90% | 67 | |
+| DataView#setFloat32 | 141,249 ops/sec | ±0.40% | 66 | ✓ |
+
+
+### Firefox 33
+
+| Method | Operations | Accuracy | Sampled | Fastest |
+|:-------|:-----------|:---------|:--------|:-------:|
+| BrowserBuffer#bracket-notation | 20,800,421 ops/sec | ±1.84% | 60 | |
+| Uint8Array#bracket-notation | 20,826,235 ops/sec | ±2.02% | 61 | ✓ |
+| | | | |
+| BrowserBuffer#concat | 153,076 ops/sec | ±2.32% | 61 | |
+| Uint8Array#concat | 1,255,674 ops/sec | ±8.65% | 52 | ✓ |
+| | | | |
+| BrowserBuffer#copy(16000) | 1,105,312 ops/sec | ±1.16% | 63 | |
+| Uint8Array#copy(16000) | 1,615,911 ops/sec | ±0.55% | 66 | ✓ |
+| | | | |
+| BrowserBuffer#copy(16) | 16,357,599 ops/sec | ±0.73% | 68 | |
+| Uint8Array#copy(16) | 31,436,281 ops/sec | ±1.05% | 68 | ✓ |
+| | | | |
+| BrowserBuffer#new(16000) | 52,995 ops/sec | ±6.01% | 35 | |
+| Uint8Array#new(16000) | 87,686 ops/sec | ±5.68% | 45 | ✓ |
+| | | | |
+| BrowserBuffer#new(16) | 252,031 ops/sec | ±1.61% | 66 | |
+| Uint8Array#new(16) | 8,477,026 ops/sec | ±0.49% | 68 | ✓ |
+| | | | |
+| BrowserBuffer#readDoubleBE | 99,871 ops/sec | ±0.41% | 69 | |
+| DataView#getFloat64 | 285,663 ops/sec | ±0.70% | 68 | ✓ |
+| | | | |
+| BrowserBuffer#readFloatBE | 115,540 ops/sec | ±0.42% | 69 | |
+| DataView#getFloat32 | 288,722 ops/sec | ±0.82% | 68 | ✓ |
+| | | | |
+| BrowserBuffer#readUInt32LE | 633,926 ops/sec | ±1.08% | 67 | ✓ |
+| DataView#getUint32 | 294,808 ops/sec | ±0.79% | 64 | |
+| | | | |
+| BrowserBuffer#slice | 349,425 ops/sec | ±0.46% | 69 | |
+| Uint8Array#subarray | 5,965,819 ops/sec | ±0.60% | 65 | ✓ |
+| | | | |
+| BrowserBuffer#writeFloatBE | 59,980 ops/sec | ±0.41% | 67 | |
+| DataView#setFloat32 | 317,634 ops/sec | ±0.63% | 68 | ✓ |
+
+### Safari 8
+
+| Method | Operations | Accuracy | Sampled | Fastest |
+|:-------|:-----------|:---------|:--------|:-------:|
+| BrowserBuffer#bracket-notation | 10,279,729 ops/sec | ±2.25% | 56 | ✓ |
+| Uint8Array#bracket-notation | 10,030,767 ops/sec | ±2.23% | 59 | |
+| | | | |
+| BrowserBuffer#concat | 144,138 ops/sec | ±1.38% | 65 | |
+| Uint8Array#concat | 4,950,764 ops/sec | ±1.70% | 63 | ✓ |
+| | | | |
+| BrowserBuffer#copy(16000) | 1,058,548 ops/sec | ±1.51% | 64 | |
+| Uint8Array#copy(16000) | 1,409,666 ops/sec | ±1.17% | 65 | ✓ |
+| | | | |
+| BrowserBuffer#copy(16) | 6,282,529 ops/sec | ±1.88% | 58 | |
+| Uint8Array#copy(16) | 11,907,128 ops/sec | ±2.87% | 58 | ✓ |
+| | | | |
+| BrowserBuffer#new(16000) | 101,663 ops/sec | ±3.89% | 57 | |
+| Uint8Array#new(16000) | 22,050,818 ops/sec | ±6.51% | 46 | ✓ |
+| | | | |
+| BrowserBuffer#new(16) | 176,072 ops/sec | ±2.13% | 64 | |
+| Uint8Array#new(16) | 24,385,731 ops/sec | ±5.01% | 51 | ✓ |
+| | | | |
+| BrowserBuffer#readDoubleBE | 41,341 ops/sec | ±1.06% | 67 | |
+| DataView#getFloat64 | 322,280 ops/sec | ±0.84% | 68 | ✓ |
+| | | | |
+| BrowserBuffer#readFloatBE | 46,141 ops/sec | ±1.06% | 65 | |
+| DataView#getFloat32 | 337,025 ops/sec | ±0.43% | 69 | ✓ |
+| | | | |
+| BrowserBuffer#readUInt32LE | 151,551 ops/sec | ±1.02% | 66 | |
+| DataView#getUint32 | 308,278 ops/sec | ±0.94% | 67 | ✓ |
+| | | | |
+| BrowserBuffer#slice | 197,365 ops/sec | ±0.95% | 66 | |
+| Uint8Array#subarray | 9,558,024 ops/sec | ±3.08% | 58 | ✓ |
+| | | | |
+| BrowserBuffer#writeFloatBE | 17,518 ops/sec | ±1.03% | 63 | |
+| DataView#setFloat32 | 319,751 ops/sec | ±0.48% | 68 | ✓ |
+
+
+### Node 0.11.14
+
+| Method | Operations | Accuracy | Sampled | Fastest |
+|:-------|:-----------|:---------|:--------|:-------:|
+| BrowserBuffer#bracket-notation | 10,489,828 ops/sec | ±3.25% | 90 | |
+| Uint8Array#bracket-notation | 10,534,884 ops/sec | ±0.81% | 92 | ✓ |
+| NodeBuffer#bracket-notation | 10,389,910 ops/sec | ±0.97% | 87 | |
+| | | | |
+| BrowserBuffer#concat | 487,830 ops/sec | ±2.58% | 88 | |
+| Uint8Array#concat | 1,814,327 ops/sec | ±1.28% | 88 | ✓ |
+| NodeBuffer#concat | 1,636,523 ops/sec | ±1.88% | 73 | |
+| | | | |
+| BrowserBuffer#copy(16000) | 1,073,665 ops/sec | ±0.77% | 90 | |
+| Uint8Array#copy(16000) | 1,348,517 ops/sec | ±0.84% | 89 | ✓ |
+| NodeBuffer#copy(16000) | 1,289,533 ops/sec | ±0.82% | 93 | |
+| | | | |
+| BrowserBuffer#copy(16) | 12,782,706 ops/sec | ±0.74% | 85 | |
+| Uint8Array#copy(16) | 14,180,427 ops/sec | ±0.93% | 92 | ✓ |
+| NodeBuffer#copy(16) | 11,083,134 ops/sec | ±1.06% | 89 | |
+| | | | |
+| BrowserBuffer#new(16000) | 141,678 ops/sec | ±3.30% | 67 | |
+| Uint8Array#new(16000) | 161,491 ops/sec | ±2.96% | 60 | |
+| NodeBuffer#new(16000) | 292,699 ops/sec | ±3.20% | 55 | ✓ |
+| | | | |
+| BrowserBuffer#new(16) | 1,655,466 ops/sec | ±2.41% | 82 | |
+| Uint8Array#new(16) | 14,399,926 ops/sec | ±0.91% | 94 | ✓ |
+| NodeBuffer#new(16) | 3,894,696 ops/sec | ±0.88% | 92 | |
+| | | | |
+| BrowserBuffer#readDoubleBE | 109,582 ops/sec | ±0.75% | 93 | ✓ |
+| DataView#getFloat64 | 91,235 ops/sec | ±0.81% | 90 | |
+| NodeBuffer#readDoubleBE | 88,593 ops/sec | ±0.96% | 81 | |
+| | | | |
+| BrowserBuffer#readFloatBE | 139,854 ops/sec | ±1.03% | 85 | ✓ |
+| DataView#getFloat32 | 98,744 ops/sec | ±0.80% | 89 | |
+| NodeBuffer#readFloatBE | 92,769 ops/sec | ±0.94% | 93 | |
+| | | | |
+| BrowserBuffer#readUInt32LE | 710,861 ops/sec | ±0.82% | 92 | |
+| DataView#getUint32 | 117,893 ops/sec | ±0.84% | 91 | |
+| NodeBuffer#readUInt32LE | 851,412 ops/sec | ±0.72% | 93 | ✓ |
+| | | | |
+| BrowserBuffer#slice | 1,673,877 ops/sec | ±0.73% | 94 | |
+| Uint8Array#subarray | 6,919,243 ops/sec | ±0.67% | 90 | ✓ |
+| NodeBuffer#slice | 4,617,604 ops/sec | ±0.79% | 93 | |
+| | | | |
+| BrowserBuffer#writeFloatBE | 66,011 ops/sec | ±0.75% | 93 | |
+| DataView#setFloat32 | 127,760 ops/sec | ±0.72% | 93 | ✓ |
+| NodeBuffer#writeFloatBE | 103,352 ops/sec | ±0.83% | 93 | |
+
+### iojs 1.8.1
+
+| Method | Operations | Accuracy | Sampled | Fastest |
+|:-------|:-----------|:---------|:--------|:-------:|
+| BrowserBuffer#bracket-notation | 10,990,488 ops/sec | ±1.11% | 91 | |
+| Uint8Array#bracket-notation | 11,268,757 ops/sec | ±0.65% | 97 | |
+| NodeBuffer#bracket-notation | 11,353,260 ops/sec | ±0.83% | 94 | ✓ |
+| | | | |
+| BrowserBuffer#concat | 378,954 ops/sec | ±0.74% | 94 | |
+| Uint8Array#concat | 1,358,288 ops/sec | ±0.97% | 87 | |
+| NodeBuffer#concat | 1,934,050 ops/sec | ±1.11% | 78 | ✓ |
+| | | | |
+| BrowserBuffer#copy(16000) | 894,538 ops/sec | ±0.56% | 84 | |
+| Uint8Array#copy(16000) | 1,442,656 ops/sec | ±0.71% | 96 | |
+| NodeBuffer#copy(16000) | 1,457,898 ops/sec | ±0.53% | 92 | ✓ |
+| | | | |
+| BrowserBuffer#copy(16) | 12,870,457 ops/sec | ±0.67% | 95 | |
+| Uint8Array#copy(16) | 16,643,989 ops/sec | ±0.61% | 93 | ✓ |
+| NodeBuffer#copy(16) | 14,885,848 ops/sec | ±0.74% | 94 | |
+| | | | |
+| BrowserBuffer#new(16000) | 109,264 ops/sec | ±4.21% | 63 | |
+| Uint8Array#new(16000) | 138,916 ops/sec | ±1.87% | 61 | |
+| NodeBuffer#new(16000) | 281,449 ops/sec | ±3.58% | 51 | ✓ |
+| | | | |
+| BrowserBuffer#new(16) | 1,362,935 ops/sec | ±0.56% | 99 | |
+| Uint8Array#new(16) | 6,193,090 ops/sec | ±0.64% | 95 | ✓ |
+| NodeBuffer#new(16) | 4,745,425 ops/sec | ±1.56% | 90 | |
+| | | | |
+| BrowserBuffer#readDoubleBE | 118,127 ops/sec | ±0.59% | 93 | ✓ |
+| DataView#getFloat64 | 107,332 ops/sec | ±0.65% | 91 | |
+| NodeBuffer#readDoubleBE | 116,274 ops/sec | ±0.94% | 95 | |
+| | | | |
+| BrowserBuffer#readFloatBE | 150,326 ops/sec | ±0.58% | 95 | ✓ |
+| DataView#getFloat32 | 110,541 ops/sec | ±0.57% | 98 | |
+| NodeBuffer#readFloatBE | 121,599 ops/sec | ±0.60% | 87 | |
+| | | | |
+| BrowserBuffer#readUInt32LE | 814,147 ops/sec | ±0.62% | 93 | |
+| DataView#getUint32 | 137,592 ops/sec | ±0.64% | 90 | |
+| NodeBuffer#readUInt32LE | 931,650 ops/sec | ±0.71% | 96 | ✓ |
+| | | | |
+| BrowserBuffer#slice | 878,590 ops/sec | ±0.68% | 93 | |
+| Uint8Array#subarray | 2,843,308 ops/sec | ±1.02% | 90 | |
+| NodeBuffer#slice | 4,998,316 ops/sec | ±0.68% | 90 | ✓ |
+| | | | |
+| BrowserBuffer#writeFloatBE | 65,927 ops/sec | ±0.74% | 93 | |
+| DataView#setFloat32 | 139,823 ops/sec | ±0.97% | 89 | ✓ |
+| NodeBuffer#writeFloatBE | 135,763 ops/sec | ±0.65% | 96 | |
+| | | | |
+
+## Testing the project
+
+First, install the project:
+
+    npm install
+
+Then, to run tests in Node.js, run:
+
+    npm run test-node
+
+To test locally in a browser, you can run:
+
+    npm run test-browser-es5-local # For ES5 browsers that don't support ES6
+    npm run test-browser-es6-local # For ES6 compliant browsers
+
+This will print out a URL that you can then open in a browser to run the tests, using [airtap](https://www.npmjs.com/package/airtap).
+
+To run automated browser tests using Saucelabs, ensure that your `SAUCE_USERNAME` and `SAUCE_ACCESS_KEY` environment variables are set, then run:
+
+    npm test
+
+This is what's run in Travis, to check against various browsers. The list of browsers is kept in the `bin/airtap-es5.yml` and `bin/airtap-es6.yml` files.
+
+## JavaScript Standard Style
+
+This module uses [JavaScript Standard Style](https://github.com/feross/standard).
+
+[![JavaScript Style Guide](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/feross/standard)
+
+To test that the code conforms to the style, `npm install` and run:
+
+    ./node_modules/.bin/standard
+
+## credit
+
+This was originally forked from [buffer-browserify](https://github.com/toots/buffer-browserify).
+
+## Security Policies and Procedures
+
+The `buffer` team and community take all security bugs in `buffer` seriously. Please see our [security policies and procedures](https://github.com/feross/security) document to learn how to report issues.
+
+## license
+
+MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org), and other contributors. Originally forked from an MIT-licensed module by Romain Beauxis.
diff --git a/node_modules/buffer/index.d.ts b/node_modules/buffer/index.d.ts
new file mode 100644
index 0000000..5d1a804
--- /dev/null
+++ b/node_modules/buffer/index.d.ts
@@ -0,0 +1,186 @@
+export class Buffer extends Uint8Array {
+    length: number
+    write(string: string, offset?: number, length?: number, encoding?: string): number;
+    toString(encoding?: string, start?: number, end?: number): string;
+    toJSON(): { type: 'Buffer', data: any[] };
+    equals(otherBuffer: Buffer): boolean;
+    compare(otherBuffer: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number;
+    copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number;
+    slice(start?: number, end?: number): Buffer;
+    writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
+    writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
+    writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
+    writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
+    readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number;
+    readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number;
+    readIntLE(offset: number, byteLength: number, noAssert?: boolean): number;
+    readIntBE(offset: number, byteLength: number, noAssert?: boolean): number;
+    readUInt8(offset: number, noAssert?: boolean): number;
+    readUInt16LE(offset: number, noAssert?: boolean): number;
+    readUInt16BE(offset: number, noAssert?: boolean): number;
+    readUInt32LE(offset: number, noAssert?: boolean): number;
+    readUInt32BE(offset: number, noAssert?: boolean): number;
+    readInt8(offset: number, noAssert?: boolean): number;
+    readInt16LE(offset: number, noAssert?: boolean): number;
+    readInt16BE(offset: number, noAssert?: boolean): number;
+    readInt32LE(offset: number, noAssert?: boolean): number;
+    readInt32BE(offset: number, noAssert?: boolean): number;
+    readFloatLE(offset: number, noAssert?: boolean): number;
+    readFloatBE(offset: number, noAssert?: boolean): number;
+    readDoubleLE(offset: number, noAssert?: boolean): number;
+    readDoubleBE(offset: number, noAssert?: boolean): number;
+    reverse(): this;
+    swap16(): Buffer;
+    swap32(): Buffer;
+    swap64(): Buffer;
+    writeUInt8(value: number, offset: number, noAssert?: boolean): number;
+    writeUInt16LE(value: number, offset: number, noAssert?: boolean): number;
+    writeUInt16BE(value: number, offset: number, noAssert?: boolean): number;
+    writeUInt32LE(value: number, offset: number, noAssert?: boolean): number;
+    writeUInt32BE(value: number, offset: number, noAssert?: boolean): number;
+    writeInt8(value: number, offset: number, noAssert?: boolean): number;
+    writeInt16LE(value: number, offset: number, noAssert?: boolean): number;
+    writeInt16BE(value: number, offset: number, noAssert?: boolean): number;
+    writeInt32LE(value: number, offset: number, noAssert?: boolean): number;
+    writeInt32BE(value: number, offset: number, noAssert?: boolean): number;
+    writeFloatLE(value: number, offset: number, noAssert?: boolean): number;
+    writeFloatBE(value: number, offset: number, noAssert?: boolean): number;
+    writeDoubleLE(value: number, offset: number, noAssert?: boolean): number;
+    writeDoubleBE(value: number, offset: number, noAssert?: boolean): number;
+    fill(value: any, offset?: number, end?: number): this;
+    indexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number;
+    lastIndexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number;
+    includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean;
+
+    /**
+     * Allocates a new buffer containing the given {str}.
+     *
+     * @param str String to store in buffer.
+     * @param encoding encoding to use, optional.  Default is 'utf8'
+     */
+    constructor (str: string, encoding?: string);
+    /**
+     * Allocates a new buffer of {size} octets.
+     *
+     * @param size count of octets to allocate.
+     */
+    constructor (size: number);
+    /**
+     * Allocates a new buffer containing the given {array} of octets.
+     *
+     * @param array The octets to store.
+     */
+    constructor (array: Uint8Array);
+    /**
+     * Produces a Buffer backed by the same allocated memory as
+     * the given {ArrayBuffer}.
+     *
+     *
+     * @param arrayBuffer The ArrayBuffer with which to share memory.
+     */
+    constructor (arrayBuffer: ArrayBuffer);
+    /**
+     * Allocates a new buffer containing the given {array} of octets.
+     *
+     * @param array The octets to store.
+     */
+    constructor (array: any[]);
+    /**
+     * Copies the passed {buffer} data onto a new {Buffer} instance.
+     *
+     * @param buffer The buffer to copy.
+     */
+    constructor (buffer: Buffer);
+    prototype: Buffer;
+    /**
+     * Allocates a new Buffer using an {array} of octets.
+     *
+     * @param array
+     */
+    static from(array: any[]): Buffer;
+    /**
+     * When passed a reference to the .buffer property of a TypedArray instance,
+     * the newly created Buffer will share the same allocated memory as the TypedArray.
+     * The optional {byteOffset} and {length} arguments specify a memory range
+     * within the {arrayBuffer} that will be shared by the Buffer.
+     *
+     * @param arrayBuffer The .buffer property of a TypedArray or a new ArrayBuffer()
+     * @param byteOffset
+     * @param length
+     */
+    static from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer;
+    /**
+     * Copies the passed {buffer} data onto a new Buffer instance.
+     *
+     * @param buffer
+     */
+    static from(buffer: Buffer | Uint8Array): Buffer;
+    /**
+     * Creates a new Buffer containing the given JavaScript string {str}.
+     * If provided, the {encoding} parameter identifies the character encoding.
+     * If not provided, {encoding} defaults to 'utf8'.
+     *
+     * @param str
+     */
+    static from(str: string, encoding?: string): Buffer;
+    /**
+     * Returns true if {obj} is a Buffer
+     *
+     * @param obj object to test.
+     */
+    static isBuffer(obj: any): obj is Buffer;
+    /**
+     * Returns true if {encoding} is a valid encoding argument.
+     * Valid string encodings in Node 0.12: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'binary'(deprecated)|'hex'
+     *
+     * @param encoding string to test.
+     */
+    static isEncoding(encoding: string): boolean;
+    /**
+     * Gives the actual byte length of a string. encoding defaults to 'utf8'.
+     * This is not the same as String.prototype.length since that returns the number of characters in a string.
+     *
+     * @param string string to test.
+     * @param encoding encoding used to evaluate (defaults to 'utf8')
+     */
+    static byteLength(string: string, encoding?: string): number;
+    /**
+     * Returns a buffer which is the result of concatenating all the buffers in the list together.
+     *
+     * If the list has no items, or if the totalLength is 0, then it returns a zero-length buffer.
+     * If the list has exactly one item, then the first item of the list is returned.
+     * If the list has more than one item, then a new Buffer is created.
+     *
+     * @param list An array of Buffer objects to concatenate
+     * @param totalLength Total length of the buffers when concatenated.
+     *   If totalLength is not provided, it is read from the buffers in the list. However, this adds an additional loop to the function, so it is faster to provide the length explicitly.
+     */
+    static concat(list: Buffer[], totalLength?: number): Buffer;
+    /**
+     * The same as buf1.compare(buf2).
+     */
+    static compare(buf1: Buffer, buf2: Buffer): number;
+    /**
+     * Allocates a new buffer of {size} octets.
+     *
+     * @param size count of octets to allocate.
+     * @param fill if specified, buffer will be initialized by calling buf.fill(fill).
+     *    If parameter is omitted, buffer will be filled with zeros.
+     * @param encoding encoding used for call to buf.fill while initializing
+     */
+    static alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer;
+    /**
+     * Allocates a new buffer of {size} octets, leaving memory not initialized, so the contents
+     * of the newly created Buffer are unknown and may contain sensitive data.
+     *
+     * @param size count of octets to allocate
+     */
+    static allocUnsafe(size: number): Buffer;
+    /**
+     * Allocates a new non-pooled buffer of {size} octets, leaving memory not initialized, so the contents
+     * of the newly created Buffer are unknown and may contain sensitive data.
+     *
+     * @param size count of octets to allocate
+     */
+    static allocUnsafeSlow(size: number): Buffer;
+}
diff --git a/node_modules/buffer/index.js b/node_modules/buffer/index.js
new file mode 100644
index 0000000..609cf31
--- /dev/null
+++ b/node_modules/buffer/index.js
@@ -0,0 +1,1817 @@
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author   Feross Aboukhadijeh <https://feross.org>
+ * @license  MIT
+ */
+/* eslint-disable no-proto */
+
+'use strict'
+
+var base64 = require('base64-js')
+var ieee754 = require('ieee754')
+var customInspectSymbol =
+  (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation
+    ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation
+    : null
+
+exports.Buffer = Buffer
+exports.SlowBuffer = SlowBuffer
+exports.INSPECT_MAX_BYTES = 50
+
+var K_MAX_LENGTH = 0x7fffffff
+exports.kMaxLength = K_MAX_LENGTH
+
+/**
+ * If `Buffer.TYPED_ARRAY_SUPPORT`:
+ *   === true    Use Uint8Array implementation (fastest)
+ *   === false   Print warning and recommend using `buffer` v4.x which has an Object
+ *               implementation (most compatible, even IE6)
+ *
+ * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
+ * Opera 11.6+, iOS 4.2+.
+ *
+ * We report that the browser does not support typed arrays if the are not subclassable
+ * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
+ * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
+ * for __proto__ and has a buggy typed array implementation.
+ */
+Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()
+
+if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
+    typeof console.error === 'function') {
+  console.error(
+    'This browser lacks typed array (Uint8Array) support which is required by ' +
+    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
+  )
+}
+
+function typedArraySupport () {
+  // Can typed array instances can be augmented?
+  try {
+    var arr = new Uint8Array(1)
+    var proto = { foo: function () { return 42 } }
+    Object.setPrototypeOf(proto, Uint8Array.prototype)
+    Object.setPrototypeOf(arr, proto)
+    return arr.foo() === 42
+  } catch (e) {
+    return false
+  }
+}
+
+Object.defineProperty(Buffer.prototype, 'parent', {
+  enumerable: true,
+  get: function () {
+    if (!Buffer.isBuffer(this)) return undefined
+    return this.buffer
+  }
+})
+
+Object.defineProperty(Buffer.prototype, 'offset', {
+  enumerable: true,
+  get: function () {
+    if (!Buffer.isBuffer(this)) return undefined
+    return this.byteOffset
+  }
+})
+
+function createBuffer (length) {
+  if (length > K_MAX_LENGTH) {
+    throw new RangeError('The value "' + length + '" is invalid for option "size"')
+  }
+  // Return an augmented `Uint8Array` instance
+  var buf = new Uint8Array(length)
+  Object.setPrototypeOf(buf, Buffer.prototype)
+  return buf
+}
+
+/**
+ * The Buffer constructor returns instances of `Uint8Array` that have their
+ * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
+ * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
+ * and the `Uint8Array` methods. Square bracket notation works as expected -- it
+ * returns a single octet.
+ *
+ * The `Uint8Array` prototype remains unmodified.
+ */
+
+function Buffer (arg, encodingOrOffset, length) {
+  // Common case.
+  if (typeof arg === 'number') {
+    if (typeof encodingOrOffset === 'string') {
+      throw new TypeError(
+        'The "string" argument must be of type string. Received type number'
+      )
+    }
+    return allocUnsafe(arg)
+  }
+  return from(arg, encodingOrOffset, length)
+}
+
+Buffer.poolSize = 8192 // not used by this implementation
+
+function from (value, encodingOrOffset, length) {
+  if (typeof value === 'string') {
+    return fromString(value, encodingOrOffset)
+  }
+
+  if (ArrayBuffer.isView(value)) {
+    return fromArrayView(value)
+  }
+
+  if (value == null) {
+    throw new TypeError(
+      'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
+      'or Array-like Object. Received type ' + (typeof value)
+    )
+  }
+
+  if (isInstance(value, ArrayBuffer) ||
+      (value && isInstance(value.buffer, ArrayBuffer))) {
+    return fromArrayBuffer(value, encodingOrOffset, length)
+  }
+
+  if (typeof SharedArrayBuffer !== 'undefined' &&
+      (isInstance(value, SharedArrayBuffer) ||
+      (value && isInstance(value.buffer, SharedArrayBuffer)))) {
+    return fromArrayBuffer(value, encodingOrOffset, length)
+  }
+
+  if (typeof value === 'number') {
+    throw new TypeError(
+      'The "value" argument must not be of type number. Received type number'
+    )
+  }
+
+  var valueOf = value.valueOf && value.valueOf()
+  if (valueOf != null && valueOf !== value) {
+    return Buffer.from(valueOf, encodingOrOffset, length)
+  }
+
+  var b = fromObject(value)
+  if (b) return b
+
+  if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
+      typeof value[Symbol.toPrimitive] === 'function') {
+    return Buffer.from(
+      value[Symbol.toPrimitive]('string'), encodingOrOffset, length
+    )
+  }
+
+  throw new TypeError(
+    'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
+    'or Array-like Object. Received type ' + (typeof value)
+  )
+}
+
+/**
+ * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
+ * if value is a number.
+ * Buffer.from(str[, encoding])
+ * Buffer.from(array)
+ * Buffer.from(buffer)
+ * Buffer.from(arrayBuffer[, byteOffset[, length]])
+ **/
+Buffer.from = function (value, encodingOrOffset, length) {
+  return from(value, encodingOrOffset, length)
+}
+
+// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
+// https://github.com/feross/buffer/pull/148
+Object.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)
+Object.setPrototypeOf(Buffer, Uint8Array)
+
+function assertSize (size) {
+  if (typeof size !== 'number') {
+    throw new TypeError('"size" argument must be of type number')
+  } else if (size < 0) {
+    throw new RangeError('The value "' + size + '" is invalid for option "size"')
+  }
+}
+
+function alloc (size, fill, encoding) {
+  assertSize(size)
+  if (size <= 0) {
+    return createBuffer(size)
+  }
+  if (fill !== undefined) {
+    // Only pay attention to encoding if it's a string. This
+    // prevents accidentally sending in a number that would
+    // be interpreted as a start offset.
+    return typeof encoding === 'string'
+      ? createBuffer(size).fill(fill, encoding)
+      : createBuffer(size).fill(fill)
+  }
+  return createBuffer(size)
+}
+
+/**
+ * Creates a new filled Buffer instance.
+ * alloc(size[, fill[, encoding]])
+ **/
+Buffer.alloc = function (size, fill, encoding) {
+  return alloc(size, fill, encoding)
+}
+
+function allocUnsafe (size) {
+  assertSize(size)
+  return createBuffer(size < 0 ? 0 : checked(size) | 0)
+}
+
+/**
+ * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
+ * */
+Buffer.allocUnsafe = function (size) {
+  return allocUnsafe(size)
+}
+/**
+ * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
+ */
+Buffer.allocUnsafeSlow = function (size) {
+  return allocUnsafe(size)
+}
+
+function fromString (string, encoding) {
+  if (typeof encoding !== 'string' || encoding === '') {
+    encoding = 'utf8'
+  }
+
+  if (!Buffer.isEncoding(encoding)) {
+    throw new TypeError('Unknown encoding: ' + encoding)
+  }
+
+  var length = byteLength(string, encoding) | 0
+  var buf = createBuffer(length)
+
+  var actual = buf.write(string, encoding)
+
+  if (actual !== length) {
+    // Writing a hex string, for example, that contains invalid characters will
+    // cause everything after the first invalid character to be ignored. (e.g.
+    // 'abxxcd' will be treated as 'ab')
+    buf = buf.slice(0, actual)
+  }
+
+  return buf
+}
+
+function fromArrayLike (array) {
+  var length = array.length < 0 ? 0 : checked(array.length) | 0
+  var buf = createBuffer(length)
+  for (var i = 0; i < length; i += 1) {
+    buf[i] = array[i] & 255
+  }
+  return buf
+}
+
+function fromArrayView (arrayView) {
+  if (isInstance(arrayView, Uint8Array)) {
+    var copy = new Uint8Array(arrayView)
+    return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)
+  }
+  return fromArrayLike(arrayView)
+}
+
+function fromArrayBuffer (array, byteOffset, length) {
+  if (byteOffset < 0 || array.byteLength < byteOffset) {
+    throw new RangeError('"offset" is outside of buffer bounds')
+  }
+
+  if (array.byteLength < byteOffset + (length || 0)) {
+    throw new RangeError('"length" is outside of buffer bounds')
+  }
+
+  var buf
+  if (byteOffset === undefined && length === undefined) {
+    buf = new Uint8Array(array)
+  } else if (length === undefined) {
+    buf = new Uint8Array(array, byteOffset)
+  } else {
+    buf = new Uint8Array(array, byteOffset, length)
+  }
+
+  // Return an augmented `Uint8Array` instance
+  Object.setPrototypeOf(buf, Buffer.prototype)
+
+  return buf
+}
+
+function fromObject (obj) {
+  if (Buffer.isBuffer(obj)) {
+    var len = checked(obj.length) | 0
+    var buf = createBuffer(len)
+
+    if (buf.length === 0) {
+      return buf
+    }
+
+    obj.copy(buf, 0, 0, len)
+    return buf
+  }
+
+  if (obj.length !== undefined) {
+    if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
+      return createBuffer(0)
+    }
+    return fromArrayLike(obj)
+  }
+
+  if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
+    return fromArrayLike(obj.data)
+  }
+}
+
+function checked (length) {
+  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
+  // length is NaN (which is otherwise coerced to zero.)
+  if (length >= K_MAX_LENGTH) {
+    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
+                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
+  }
+  return length | 0
+}
+
+function SlowBuffer (length) {
+  if (+length != length) { // eslint-disable-line eqeqeq
+    length = 0
+  }
+  return Buffer.alloc(+length)
+}
+
+Buffer.isBuffer = function isBuffer (b) {
+  return b != null && b._isBuffer === true &&
+    b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
+}
+
+Buffer.compare = function compare (a, b) {
+  if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
+  if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
+  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
+    throw new TypeError(
+      'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
+    )
+  }
+
+  if (a === b) return 0
+
+  var x = a.length
+  var y = b.length
+
+  for (var i = 0, len = Math.min(x, y); i < len; ++i) {
+    if (a[i] !== b[i]) {
+      x = a[i]
+      y = b[i]
+      break
+    }
+  }
+
+  if (x < y) return -1
+  if (y < x) return 1
+  return 0
+}
+
+Buffer.isEncoding = function isEncoding (encoding) {
+  switch (String(encoding).toLowerCase()) {
+    case 'hex':
+    case 'utf8':
+    case 'utf-8':
+    case 'ascii':
+    case 'latin1':
+    case 'binary':
+    case 'base64':
+    case 'ucs2':
+    case 'ucs-2':
+    case 'utf16le':
+    case 'utf-16le':
+      return true
+    default:
+      return false
+  }
+}
+
+Buffer.concat = function concat (list, length) {
+  if (!Array.isArray(list)) {
+    throw new TypeError('"list" argument must be an Array of Buffers')
+  }
+
+  if (list.length === 0) {
+    return Buffer.alloc(0)
+  }
+
+  var i
+  if (length === undefined) {
+    length = 0
+    for (i = 0; i < list.length; ++i) {
+      length += list[i].length
+    }
+  }
+
+  var buffer = Buffer.allocUnsafe(length)
+  var pos = 0
+  for (i = 0; i < list.length; ++i) {
+    var buf = list[i]
+    if (isInstance(buf, Uint8Array)) {
+      if (pos + buf.length > buffer.length) {
+        Buffer.from(buf).copy(buffer, pos)
+      } else {
+        Uint8Array.prototype.set.call(
+          buffer,
+          buf,
+          pos
+        )
+      }
+    } else if (!Buffer.isBuffer(buf)) {
+      throw new TypeError('"list" argument must be an Array of Buffers')
+    } else {
+      buf.copy(buffer, pos)
+    }
+    pos += buf.length
+  }
+  return buffer
+}
+
+function byteLength (string, encoding) {
+  if (Buffer.isBuffer(string)) {
+    return string.length
+  }
+  if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
+    return string.byteLength
+  }
+  if (typeof string !== 'string') {
+    throw new TypeError(
+      'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
+      'Received type ' + typeof string
+    )
+  }
+
+  var len = string.length
+  var mustMatch = (arguments.length > 2 && arguments[2] === true)
+  if (!mustMatch && len === 0) return 0
+
+  // Use a for loop to avoid recursion
+  var loweredCase = false
+  for (;;) {
+    switch (encoding) {
+      case 'ascii':
+      case 'latin1':
+      case 'binary':
+        return len
+      case 'utf8':
+      case 'utf-8':
+        return utf8ToBytes(string).length
+      case 'ucs2':
+      case 'ucs-2':
+      case 'utf16le':
+      case 'utf-16le':
+        return len * 2
+      case 'hex':
+        return len >>> 1
+      case 'base64':
+        return base64ToBytes(string).length
+      default:
+        if (loweredCase) {
+          return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
+        }
+        encoding = ('' + encoding).toLowerCase()
+        loweredCase = true
+    }
+  }
+}
+Buffer.byteLength = byteLength
+
+function slowToString (encoding, start, end) {
+  var loweredCase = false
+
+  // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
+  // property of a typed array.
+
+  // This behaves neither like String nor Uint8Array in that we set start/end
+  // to their upper/lower bounds if the value passed is out of range.
+  // undefined is handled specially as per ECMA-262 6th Edition,
+  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
+  if (start === undefined || start < 0) {
+    start = 0
+  }
+  // Return early if start > this.length. Done here to prevent potential uint32
+  // coercion fail below.
+  if (start > this.length) {
+    return ''
+  }
+
+  if (end === undefined || end > this.length) {
+    end = this.length
+  }
+
+  if (end <= 0) {
+    return ''
+  }
+
+  // Force coercion to uint32. This will also coerce falsey/NaN values to 0.
+  end >>>= 0
+  start >>>= 0
+
+  if (end <= start) {
+    return ''
+  }
+
+  if (!encoding) encoding = 'utf8'
+
+  while (true) {
+    switch (encoding) {
+      case 'hex':
+        return hexSlice(this, start, end)
+
+      case 'utf8':
+      case 'utf-8':
+        return utf8Slice(this, start, end)
+
+      case 'ascii':
+        return asciiSlice(this, start, end)
+
+      case 'latin1':
+      case 'binary':
+        return latin1Slice(this, start, end)
+
+      case 'base64':
+        return base64Slice(this, start, end)
+
+      case 'ucs2':
+      case 'ucs-2':
+      case 'utf16le':
+      case 'utf-16le':
+        return utf16leSlice(this, start, end)
+
+      default:
+        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+        encoding = (encoding + '').toLowerCase()
+        loweredCase = true
+    }
+  }
+}
+
+// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
+// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
+// reliably in a browserify context because there could be multiple different
+// copies of the 'buffer' package in use. This method works even for Buffer
+// instances that were created from another copy of the `buffer` package.
+// See: https://github.com/feross/buffer/issues/154
+Buffer.prototype._isBuffer = true
+
+function swap (b, n, m) {
+  var i = b[n]
+  b[n] = b[m]
+  b[m] = i
+}
+
+Buffer.prototype.swap16 = function swap16 () {
+  var len = this.length
+  if (len % 2 !== 0) {
+    throw new RangeError('Buffer size must be a multiple of 16-bits')
+  }
+  for (var i = 0; i < len; i += 2) {
+    swap(this, i, i + 1)
+  }
+  return this
+}
+
+Buffer.prototype.swap32 = function swap32 () {
+  var len = this.length
+  if (len % 4 !== 0) {
+    throw new RangeError('Buffer size must be a multiple of 32-bits')
+  }
+  for (var i = 0; i < len; i += 4) {
+    swap(this, i, i + 3)
+    swap(this, i + 1, i + 2)
+  }
+  return this
+}
+
+Buffer.prototype.swap64 = function swap64 () {
+  var len = this.length
+  if (len % 8 !== 0) {
+    throw new RangeError('Buffer size must be a multiple of 64-bits')
+  }
+  for (var i = 0; i < len; i += 8) {
+    swap(this, i, i + 7)
+    swap(this, i + 1, i + 6)
+    swap(this, i + 2, i + 5)
+    swap(this, i + 3, i + 4)
+  }
+  return this
+}
+
+Buffer.prototype.toString = function toString () {
+  var length = this.length
+  if (length === 0) return ''
+  if (arguments.length === 0) return utf8Slice(this, 0, length)
+  return slowToString.apply(this, arguments)
+}
+
+Buffer.prototype.toLocaleString = Buffer.prototype.toString
+
+Buffer.prototype.equals = function equals (b) {
+  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
+  if (this === b) return true
+  return Buffer.compare(this, b) === 0
+}
+
+Buffer.prototype.inspect = function inspect () {
+  var str = ''
+  var max = exports.INSPECT_MAX_BYTES
+  str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
+  if (this.length > max) str += ' ... '
+  return '<Buffer ' + str + '>'
+}
+if (customInspectSymbol) {
+  Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect
+}
+
+Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
+  if (isInstance(target, Uint8Array)) {
+    target = Buffer.from(target, target.offset, target.byteLength)
+  }
+  if (!Buffer.isBuffer(target)) {
+    throw new TypeError(
+      'The "target" argument must be one of type Buffer or Uint8Array. ' +
+      'Received type ' + (typeof target)
+    )
+  }
+
+  if (start === undefined) {
+    start = 0
+  }
+  if (end === undefined) {
+    end = target ? target.length : 0
+  }
+  if (thisStart === undefined) {
+    thisStart = 0
+  }
+  if (thisEnd === undefined) {
+    thisEnd = this.length
+  }
+
+  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
+    throw new RangeError('out of range index')
+  }
+
+  if (thisStart >= thisEnd && start >= end) {
+    return 0
+  }
+  if (thisStart >= thisEnd) {
+    return -1
+  }
+  if (start >= end) {
+    return 1
+  }
+
+  start >>>= 0
+  end >>>= 0
+  thisStart >>>= 0
+  thisEnd >>>= 0
+
+  if (this === target) return 0
+
+  var x = thisEnd - thisStart
+  var y = end - start
+  var len = Math.min(x, y)
+
+  var thisCopy = this.slice(thisStart, thisEnd)
+  var targetCopy = target.slice(start, end)
+
+  for (var i = 0; i < len; ++i) {
+    if (thisCopy[i] !== targetCopy[i]) {
+      x = thisCopy[i]
+      y = targetCopy[i]
+      break
+    }
+  }
+
+  if (x < y) return -1
+  if (y < x) return 1
+  return 0
+}
+
+// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
+// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
+//
+// Arguments:
+// - buffer - a Buffer to search
+// - val - a string, Buffer, or number
+// - byteOffset - an index into `buffer`; will be clamped to an int32
+// - encoding - an optional encoding, relevant is val is a string
+// - dir - true for indexOf, false for lastIndexOf
+function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
+  // Empty buffer means no match
+  if (buffer.length === 0) return -1
+
+  // Normalize byteOffset
+  if (typeof byteOffset === 'string') {
+    encoding = byteOffset
+    byteOffset = 0
+  } else if (byteOffset > 0x7fffffff) {
+    byteOffset = 0x7fffffff
+  } else if (byteOffset < -0x80000000) {
+    byteOffset = -0x80000000
+  }
+  byteOffset = +byteOffset // Coerce to Number.
+  if (numberIsNaN(byteOffset)) {
+    // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
+    byteOffset = dir ? 0 : (buffer.length - 1)
+  }
+
+  // Normalize byteOffset: negative offsets start from the end of the buffer
+  if (byteOffset < 0) byteOffset = buffer.length + byteOffset
+  if (byteOffset >= buffer.length) {
+    if (dir) return -1
+    else byteOffset = buffer.length - 1
+  } else if (byteOffset < 0) {
+    if (dir) byteOffset = 0
+    else return -1
+  }
+
+  // Normalize val
+  if (typeof val === 'string') {
+    val = Buffer.from(val, encoding)
+  }
+
+  // Finally, search either indexOf (if dir is true) or lastIndexOf
+  if (Buffer.isBuffer(val)) {
+    // Special case: looking for empty string/buffer always fails
+    if (val.length === 0) {
+      return -1
+    }
+    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
+  } else if (typeof val === 'number') {
+    val = val & 0xFF // Search for a byte value [0-255]
+    if (typeof Uint8Array.prototype.indexOf === 'function') {
+      if (dir) {
+        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
+      } else {
+        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
+      }
+    }
+    return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)
+  }
+
+  throw new TypeError('val must be string, number or Buffer')
+}
+
+function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
+  var indexSize = 1
+  var arrLength = arr.length
+  var valLength = val.length
+
+  if (encoding !== undefined) {
+    encoding = String(encoding).toLowerCase()
+    if (encoding === 'ucs2' || encoding === 'ucs-2' ||
+        encoding === 'utf16le' || encoding === 'utf-16le') {
+      if (arr.length < 2 || val.length < 2) {
+        return -1
+      }
+      indexSize = 2
+      arrLength /= 2
+      valLength /= 2
+      byteOffset /= 2
+    }
+  }
+
+  function read (buf, i) {
+    if (indexSize === 1) {
+      return buf[i]
+    } else {
+      return buf.readUInt16BE(i * indexSize)
+    }
+  }
+
+  var i
+  if (dir) {
+    var foundIndex = -1
+    for (i = byteOffset; i < arrLength; i++) {
+      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
+        if (foundIndex === -1) foundIndex = i
+        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
+      } else {
+        if (foundIndex !== -1) i -= i - foundIndex
+        foundIndex = -1
+      }
+    }
+  } else {
+    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
+    for (i = byteOffset; i >= 0; i--) {
+      var found = true
+      for (var j = 0; j < valLength; j++) {
+        if (read(arr, i + j) !== read(val, j)) {
+          found = false
+          break
+        }
+      }
+      if (found) return i
+    }
+  }
+
+  return -1
+}
+
+Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
+  return this.indexOf(val, byteOffset, encoding) !== -1
+}
+
+Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
+  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
+}
+
+Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
+  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
+}
+
+function hexWrite (buf, string, offset, length) {
+  offset = Number(offset) || 0
+  var remaining = buf.length - offset
+  if (!length) {
+    length = remaining
+  } else {
+    length = Number(length)
+    if (length > remaining) {
+      length = remaining
+    }
+  }
+
+  var strLen = string.length
+
+  if (length > strLen / 2) {
+    length = strLen / 2
+  }
+  for (var i = 0; i < length; ++i) {
+    var parsed = parseInt(string.substr(i * 2, 2), 16)
+    if (numberIsNaN(parsed)) return i
+    buf[offset + i] = parsed
+  }
+  return i
+}
+
+function utf8Write (buf, string, offset, length) {
+  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
+}
+
+function asciiWrite (buf, string, offset, length) {
+  return blitBuffer(asciiToBytes(string), buf, offset, length)
+}
+
+function base64Write (buf, string, offset, length) {
+  return blitBuffer(base64ToBytes(string), buf, offset, length)
+}
+
+function ucs2Write (buf, string, offset, length) {
+  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
+}
+
+Buffer.prototype.write = function write (string, offset, length, encoding) {
+  // Buffer#write(string)
+  if (offset === undefined) {
+    encoding = 'utf8'
+    length = this.length
+    offset = 0
+  // Buffer#write(string, encoding)
+  } else if (length === undefined && typeof offset === 'string') {
+    encoding = offset
+    length = this.length
+    offset = 0
+  // Buffer#write(string, offset[, length][, encoding])
+  } else if (isFinite(offset)) {
+    offset = offset >>> 0
+    if (isFinite(length)) {
+      length = length >>> 0
+      if (encoding === undefined) encoding = 'utf8'
+    } else {
+      encoding = length
+      length = undefined
+    }
+  } else {
+    throw new Error(
+      'Buffer.write(string, encoding, offset[, length]) is no longer supported'
+    )
+  }
+
+  var remaining = this.length - offset
+  if (length === undefined || length > remaining) length = remaining
+
+  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
+    throw new RangeError('Attempt to write outside buffer bounds')
+  }
+
+  if (!encoding) encoding = 'utf8'
+
+  var loweredCase = false
+  for (;;) {
+    switch (encoding) {
+      case 'hex':
+        return hexWrite(this, string, offset, length)
+
+      case 'utf8':
+      case 'utf-8':
+        return utf8Write(this, string, offset, length)
+
+      case 'ascii':
+      case 'latin1':
+      case 'binary':
+        return asciiWrite(this, string, offset, length)
+
+      case 'base64':
+        // Warning: maxLength not taken into account in base64Write
+        return base64Write(this, string, offset, length)
+
+      case 'ucs2':
+      case 'ucs-2':
+      case 'utf16le':
+      case 'utf-16le':
+        return ucs2Write(this, string, offset, length)
+
+      default:
+        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+        encoding = ('' + encoding).toLowerCase()
+        loweredCase = true
+    }
+  }
+}
+
+Buffer.prototype.toJSON = function toJSON () {
+  return {
+    type: 'Buffer',
+    data: Array.prototype.slice.call(this._arr || this, 0)
+  }
+}
+
+function base64Slice (buf, start, end) {
+  if (start === 0 && end === buf.length) {
+    return base64.fromByteArray(buf)
+  } else {
+    return base64.fromByteArray(buf.slice(start, end))
+  }
+}
+
+function utf8Slice (buf, start, end) {
+  end = Math.min(buf.length, end)
+  var res = []
+
+  var i = start
+  while (i < end) {
+    var firstByte = buf[i]
+    var codePoint = null
+    var bytesPerSequence = (firstByte > 0xEF)
+      ? 4
+      : (firstByte > 0xDF)
+          ? 3
+          : (firstByte > 0xBF)
+              ? 2
+              : 1
+
+    if (i + bytesPerSequence <= end) {
+      var secondByte, thirdByte, fourthByte, tempCodePoint
+
+      switch (bytesPerSequence) {
+        case 1:
+          if (firstByte < 0x80) {
+            codePoint = firstByte
+          }
+          break
+        case 2:
+          secondByte = buf[i + 1]
+          if ((secondByte & 0xC0) === 0x80) {
+            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
+            if (tempCodePoint > 0x7F) {
+              codePoint = tempCodePoint
+            }
+          }
+          break
+        case 3:
+          secondByte = buf[i + 1]
+          thirdByte = buf[i + 2]
+          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
+            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
+            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
+              codePoint = tempCodePoint
+            }
+          }
+          break
+        case 4:
+          secondByte = buf[i + 1]
+          thirdByte = buf[i + 2]
+          fourthByte = buf[i + 3]
+          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
+            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
+            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
+              codePoint = tempCodePoint
+            }
+          }
+      }
+    }
+
+    if (codePoint === null) {
+      // we did not generate a valid codePoint so insert a
+      // replacement char (U+FFFD) and advance only 1 byte
+      codePoint = 0xFFFD
+      bytesPerSequence = 1
+    } else if (codePoint > 0xFFFF) {
+      // encode to utf16 (surrogate pair dance)
+      codePoint -= 0x10000
+      res.push(codePoint >>> 10 & 0x3FF | 0xD800)
+      codePoint = 0xDC00 | codePoint & 0x3FF
+    }
+
+    res.push(codePoint)
+    i += bytesPerSequence
+  }
+
+  return decodeCodePointsArray(res)
+}
+
+// Based on http://stackoverflow.com/a/22747272/680742, the browser with
+// the lowest limit is Chrome, with 0x10000 args.
+// We go 1 magnitude less, for safety
+var MAX_ARGUMENTS_LENGTH = 0x1000
+
+function decodeCodePointsArray (codePoints) {
+  var len = codePoints.length
+  if (len <= MAX_ARGUMENTS_LENGTH) {
+    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
+  }
+
+  // Decode in chunks to avoid "call stack size exceeded".
+  var res = ''
+  var i = 0
+  while (i < len) {
+    res += String.fromCharCode.apply(
+      String,
+      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
+    )
+  }
+  return res
+}
+
+function asciiSlice (buf, start, end) {
+  var ret = ''
+  end = Math.min(buf.length, end)
+
+  for (var i = start; i < end; ++i) {
+    ret += String.fromCharCode(buf[i] & 0x7F)
+  }
+  return ret
+}
+
+function latin1Slice (buf, start, end) {
+  var ret = ''
+  end = Math.min(buf.length, end)
+
+  for (var i = start; i < end; ++i) {
+    ret += String.fromCharCode(buf[i])
+  }
+  return ret
+}
+
+function hexSlice (buf, start, end) {
+  var len = buf.length
+
+  if (!start || start < 0) start = 0
+  if (!end || end < 0 || end > len) end = len
+
+  var out = ''
+  for (var i = start; i < end; ++i) {
+    out += hexSliceLookupTable[buf[i]]
+  }
+  return out
+}
+
+function utf16leSlice (buf, start, end) {
+  var bytes = buf.slice(start, end)
+  var res = ''
+  // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)
+  for (var i = 0; i < bytes.length - 1; i += 2) {
+    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
+  }
+  return res
+}
+
+Buffer.prototype.slice = function slice (start, end) {
+  var len = this.length
+  start = ~~start
+  end = end === undefined ? len : ~~end
+
+  if (start < 0) {
+    start += len
+    if (start < 0) start = 0
+  } else if (start > len) {
+    start = len
+  }
+
+  if (end < 0) {
+    end += len
+    if (end < 0) end = 0
+  } else if (end > len) {
+    end = len
+  }
+
+  if (end < start) end = start
+
+  var newBuf = this.subarray(start, end)
+  // Return an augmented `Uint8Array` instance
+  Object.setPrototypeOf(newBuf, Buffer.prototype)
+
+  return newBuf
+}
+
+/*
+ * Need to make sure that buffer isn't trying to write out of bounds.
+ */
+function checkOffset (offset, ext, length) {
+  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
+  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
+}
+
+Buffer.prototype.readUintLE =
+Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
+  offset = offset >>> 0
+  byteLength = byteLength >>> 0
+  if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+  var val = this[offset]
+  var mul = 1
+  var i = 0
+  while (++i < byteLength && (mul *= 0x100)) {
+    val += this[offset + i] * mul
+  }
+
+  return val
+}
+
+Buffer.prototype.readUintBE =
+Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
+  offset = offset >>> 0
+  byteLength = byteLength >>> 0
+  if (!noAssert) {
+    checkOffset(offset, byteLength, this.length)
+  }
+
+  var val = this[offset + --byteLength]
+  var mul = 1
+  while (byteLength > 0 && (mul *= 0x100)) {
+    val += this[offset + --byteLength] * mul
+  }
+
+  return val
+}
+
+Buffer.prototype.readUint8 =
+Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
+  offset = offset >>> 0
+  if (!noAssert) checkOffset(offset, 1, this.length)
+  return this[offset]
+}
+
+Buffer.prototype.readUint16LE =
+Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
+  offset = offset >>> 0
+  if (!noAssert) checkOffset(offset, 2, this.length)
+  return this[offset] | (this[offset + 1] << 8)
+}
+
+Buffer.prototype.readUint16BE =
+Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
+  offset = offset >>> 0
+  if (!noAssert) checkOffset(offset, 2, this.length)
+  return (this[offset] << 8) | this[offset + 1]
+}
+
+Buffer.prototype.readUint32LE =
+Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
+  offset = offset >>> 0
+  if (!noAssert) checkOffset(offset, 4, this.length)
+
+  return ((this[offset]) |
+      (this[offset + 1] << 8) |
+      (this[offset + 2] << 16)) +
+      (this[offset + 3] * 0x1000000)
+}
+
+Buffer.prototype.readUint32BE =
+Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
+  offset = offset >>> 0
+  if (!noAssert) checkOffset(offset, 4, this.length)
+
+  return (this[offset] * 0x1000000) +
+    ((this[offset + 1] << 16) |
+    (this[offset + 2] << 8) |
+    this[offset + 3])
+}
+
+Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
+  offset = offset >>> 0
+  byteLength = byteLength >>> 0
+  if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+  var val = this[offset]
+  var mul = 1
+  var i = 0
+  while (++i < byteLength && (mul *= 0x100)) {
+    val += this[offset + i] * mul
+  }
+  mul *= 0x80
+
+  if (val >= mul) val -= Math.pow(2, 8 * byteLength)
+
+  return val
+}
+
+Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
+  offset = offset >>> 0
+  byteLength = byteLength >>> 0
+  if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+  var i = byteLength
+  var mul = 1
+  var val = this[offset + --i]
+  while (i > 0 && (mul *= 0x100)) {
+    val += this[offset + --i] * mul
+  }
+  mul *= 0x80
+
+  if (val >= mul) val -= Math.pow(2, 8 * byteLength)
+
+  return val
+}
+
+Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
+  offset = offset >>> 0
+  if (!noAssert) checkOffset(offset, 1, this.length)
+  if (!(this[offset] & 0x80)) return (this[offset])
+  return ((0xff - this[offset] + 1) * -1)
+}
+
+Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
+  offset = offset >>> 0
+  if (!noAssert) checkOffset(offset, 2, this.length)
+  var val = this[offset] | (this[offset + 1] << 8)
+  return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+
+Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
+  offset = offset >>> 0
+  if (!noAssert) checkOffset(offset, 2, this.length)
+  var val = this[offset + 1] | (this[offset] << 8)
+  return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+
+Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
+  offset = offset >>> 0
+  if (!noAssert) checkOffset(offset, 4, this.length)
+
+  return (this[offset]) |
+    (this[offset + 1] << 8) |
+    (this[offset + 2] << 16) |
+    (this[offset + 3] << 24)
+}
+
+Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
+  offset = offset >>> 0
+  if (!noAssert) checkOffset(offset, 4, this.length)
+
+  return (this[offset] << 24) |
+    (this[offset + 1] << 16) |
+    (this[offset + 2] << 8) |
+    (this[offset + 3])
+}
+
+Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
+  offset = offset >>> 0
+  if (!noAssert) checkOffset(offset, 4, this.length)
+  return ieee754.read(this, offset, true, 23, 4)
+}
+
+Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
+  offset = offset >>> 0
+  if (!noAssert) checkOffset(offset, 4, this.length)
+  return ieee754.read(this, offset, false, 23, 4)
+}
+
+Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
+  offset = offset >>> 0
+  if (!noAssert) checkOffset(offset, 8, this.length)
+  return ieee754.read(this, offset, true, 52, 8)
+}
+
+Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
+  offset = offset >>> 0
+  if (!noAssert) checkOffset(offset, 8, this.length)
+  return ieee754.read(this, offset, false, 52, 8)
+}
+
+function checkInt (buf, value, offset, ext, max, min) {
+  if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
+  if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
+  if (offset + ext > buf.length) throw new RangeError('Index out of range')
+}
+
+Buffer.prototype.writeUintLE =
+Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  byteLength = byteLength >>> 0
+  if (!noAssert) {
+    var maxBytes = Math.pow(2, 8 * byteLength) - 1
+    checkInt(this, value, offset, byteLength, maxBytes, 0)
+  }
+
+  var mul = 1
+  var i = 0
+  this[offset] = value & 0xFF
+  while (++i < byteLength && (mul *= 0x100)) {
+    this[offset + i] = (value / mul) & 0xFF
+  }
+
+  return offset + byteLength
+}
+
+Buffer.prototype.writeUintBE =
+Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  byteLength = byteLength >>> 0
+  if (!noAssert) {
+    var maxBytes = Math.pow(2, 8 * byteLength) - 1
+    checkInt(this, value, offset, byteLength, maxBytes, 0)
+  }
+
+  var i = byteLength - 1
+  var mul = 1
+  this[offset + i] = value & 0xFF
+  while (--i >= 0 && (mul *= 0x100)) {
+    this[offset + i] = (value / mul) & 0xFF
+  }
+
+  return offset + byteLength
+}
+
+Buffer.prototype.writeUint8 =
+Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
+  this[offset] = (value & 0xff)
+  return offset + 1
+}
+
+Buffer.prototype.writeUint16LE =
+Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
+  this[offset] = (value & 0xff)
+  this[offset + 1] = (value >>> 8)
+  return offset + 2
+}
+
+Buffer.prototype.writeUint16BE =
+Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
+  this[offset] = (value >>> 8)
+  this[offset + 1] = (value & 0xff)
+  return offset + 2
+}
+
+Buffer.prototype.writeUint32LE =
+Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
+  this[offset + 3] = (value >>> 24)
+  this[offset + 2] = (value >>> 16)
+  this[offset + 1] = (value >>> 8)
+  this[offset] = (value & 0xff)
+  return offset + 4
+}
+
+Buffer.prototype.writeUint32BE =
+Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
+  this[offset] = (value >>> 24)
+  this[offset + 1] = (value >>> 16)
+  this[offset + 2] = (value >>> 8)
+  this[offset + 3] = (value & 0xff)
+  return offset + 4
+}
+
+Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert) {
+    var limit = Math.pow(2, (8 * byteLength) - 1)
+
+    checkInt(this, value, offset, byteLength, limit - 1, -limit)
+  }
+
+  var i = 0
+  var mul = 1
+  var sub = 0
+  this[offset] = value & 0xFF
+  while (++i < byteLength && (mul *= 0x100)) {
+    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
+      sub = 1
+    }
+    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
+  }
+
+  return offset + byteLength
+}
+
+Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert) {
+    var limit = Math.pow(2, (8 * byteLength) - 1)
+
+    checkInt(this, value, offset, byteLength, limit - 1, -limit)
+  }
+
+  var i = byteLength - 1
+  var mul = 1
+  var sub = 0
+  this[offset + i] = value & 0xFF
+  while (--i >= 0 && (mul *= 0x100)) {
+    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
+      sub = 1
+    }
+    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
+  }
+
+  return offset + byteLength
+}
+
+Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
+  if (value < 0) value = 0xff + value + 1
+  this[offset] = (value & 0xff)
+  return offset + 1
+}
+
+Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+  this[offset] = (value & 0xff)
+  this[offset + 1] = (value >>> 8)
+  return offset + 2
+}
+
+Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+  this[offset] = (value >>> 8)
+  this[offset + 1] = (value & 0xff)
+  return offset + 2
+}
+
+Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+  this[offset] = (value & 0xff)
+  this[offset + 1] = (value >>> 8)
+  this[offset + 2] = (value >>> 16)
+  this[offset + 3] = (value >>> 24)
+  return offset + 4
+}
+
+Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+  if (value < 0) value = 0xffffffff + value + 1
+  this[offset] = (value >>> 24)
+  this[offset + 1] = (value >>> 16)
+  this[offset + 2] = (value >>> 8)
+  this[offset + 3] = (value & 0xff)
+  return offset + 4
+}
+
+function checkIEEE754 (buf, value, offset, ext, max, min) {
+  if (offset + ext > buf.length) throw new RangeError('Index out of range')
+  if (offset < 0) throw new RangeError('Index out of range')
+}
+
+function writeFloat (buf, value, offset, littleEndian, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert) {
+    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
+  }
+  ieee754.write(buf, value, offset, littleEndian, 23, 4)
+  return offset + 4
+}
+
+Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
+  return writeFloat(this, value, offset, true, noAssert)
+}
+
+Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
+  return writeFloat(this, value, offset, false, noAssert)
+}
+
+function writeDouble (buf, value, offset, littleEndian, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert) {
+    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
+  }
+  ieee754.write(buf, value, offset, littleEndian, 52, 8)
+  return offset + 8
+}
+
+Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
+  return writeDouble(this, value, offset, true, noAssert)
+}
+
+Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
+  return writeDouble(this, value, offset, false, noAssert)
+}
+
+// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
+Buffer.prototype.copy = function copy (target, targetStart, start, end) {
+  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
+  if (!start) start = 0
+  if (!end && end !== 0) end = this.length
+  if (targetStart >= target.length) targetStart = target.length
+  if (!targetStart) targetStart = 0
+  if (end > 0 && end < start) end = start
+
+  // Copy 0 bytes; we're done
+  if (end === start) return 0
+  if (target.length === 0 || this.length === 0) return 0
+
+  // Fatal error conditions
+  if (targetStart < 0) {
+    throw new RangeError('targetStart out of bounds')
+  }
+  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
+  if (end < 0) throw new RangeError('sourceEnd out of bounds')
+
+  // Are we oob?
+  if (end > this.length) end = this.length
+  if (target.length - targetStart < end - start) {
+    end = target.length - targetStart + start
+  }
+
+  var len = end - start
+
+  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
+    // Use built-in when available, missing from IE11
+    this.copyWithin(targetStart, start, end)
+  } else {
+    Uint8Array.prototype.set.call(
+      target,
+      this.subarray(start, end),
+      targetStart
+    )
+  }
+
+  return len
+}
+
+// Usage:
+//    buffer.fill(number[, offset[, end]])
+//    buffer.fill(buffer[, offset[, end]])
+//    buffer.fill(string[, offset[, end]][, encoding])
+Buffer.prototype.fill = function fill (val, start, end, encoding) {
+  // Handle string cases:
+  if (typeof val === 'string') {
+    if (typeof start === 'string') {
+      encoding = start
+      start = 0
+      end = this.length
+    } else if (typeof end === 'string') {
+      encoding = end
+      end = this.length
+    }
+    if (encoding !== undefined && typeof encoding !== 'string') {
+      throw new TypeError('encoding must be a string')
+    }
+    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
+      throw new TypeError('Unknown encoding: ' + encoding)
+    }
+    if (val.length === 1) {
+      var code = val.charCodeAt(0)
+      if ((encoding === 'utf8' && code < 128) ||
+          encoding === 'latin1') {
+        // Fast path: If `val` fits into a single byte, use that numeric value.
+        val = code
+      }
+    }
+  } else if (typeof val === 'number') {
+    val = val & 255
+  } else if (typeof val === 'boolean') {
+    val = Number(val)
+  }
+
+  // Invalid ranges are not set to a default, so can range check early.
+  if (start < 0 || this.length < start || this.length < end) {
+    throw new RangeError('Out of range index')
+  }
+
+  if (end <= start) {
+    return this
+  }
+
+  start = start >>> 0
+  end = end === undefined ? this.length : end >>> 0
+
+  if (!val) val = 0
+
+  var i
+  if (typeof val === 'number') {
+    for (i = start; i < end; ++i) {
+      this[i] = val
+    }
+  } else {
+    var bytes = Buffer.isBuffer(val)
+      ? val
+      : Buffer.from(val, encoding)
+    var len = bytes.length
+    if (len === 0) {
+      throw new TypeError('The value "' + val +
+        '" is invalid for argument "value"')
+    }
+    for (i = 0; i < end - start; ++i) {
+      this[i + start] = bytes[i % len]
+    }
+  }
+
+  return this
+}
+
+// HELPER FUNCTIONS
+// ================
+
+var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g
+
+function base64clean (str) {
+  // Node takes equal signs as end of the Base64 encoding
+  str = str.split('=')[0]
+  // Node strips out invalid characters like \n and \t from the string, base64-js does not
+  str = str.trim().replace(INVALID_BASE64_RE, '')
+  // Node converts strings with length < 2 to ''
+  if (str.length < 2) return ''
+  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
+  while (str.length % 4 !== 0) {
+    str = str + '='
+  }
+  return str
+}
+
+function utf8ToBytes (string, units) {
+  units = units || Infinity
+  var codePoint
+  var length = string.length
+  var leadSurrogate = null
+  var bytes = []
+
+  for (var i = 0; i < length; ++i) {
+    codePoint = string.charCodeAt(i)
+
+    // is surrogate component
+    if (codePoint > 0xD7FF && codePoint < 0xE000) {
+      // last char was a lead
+      if (!leadSurrogate) {
+        // no lead yet
+        if (codePoint > 0xDBFF) {
+          // unexpected trail
+          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+          continue
+        } else if (i + 1 === length) {
+          // unpaired lead
+          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+          continue
+        }
+
+        // valid lead
+        leadSurrogate = codePoint
+
+        continue
+      }
+
+      // 2 leads in a row
+      if (codePoint < 0xDC00) {
+        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+        leadSurrogate = codePoint
+        continue
+      }
+
+      // valid surrogate pair
+      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
+    } else if (leadSurrogate) {
+      // valid bmp char, but last char was a lead
+      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+    }
+
+    leadSurrogate = null
+
+    // encode utf8
+    if (codePoint < 0x80) {
+      if ((units -= 1) < 0) break
+      bytes.push(codePoint)
+    } else if (codePoint < 0x800) {
+      if ((units -= 2) < 0) break
+      bytes.push(
+        codePoint >> 0x6 | 0xC0,
+        codePoint & 0x3F | 0x80
+      )
+    } else if (codePoint < 0x10000) {
+      if ((units -= 3) < 0) break
+      bytes.push(
+        codePoint >> 0xC | 0xE0,
+        codePoint >> 0x6 & 0x3F | 0x80,
+        codePoint & 0x3F | 0x80
+      )
+    } else if (codePoint < 0x110000) {
+      if ((units -= 4) < 0) break
+      bytes.push(
+        codePoint >> 0x12 | 0xF0,
+        codePoint >> 0xC & 0x3F | 0x80,
+        codePoint >> 0x6 & 0x3F | 0x80,
+        codePoint & 0x3F | 0x80
+      )
+    } else {
+      throw new Error('Invalid code point')
+    }
+  }
+
+  return bytes
+}
+
+function asciiToBytes (str) {
+  var byteArray = []
+  for (var i = 0; i < str.length; ++i) {
+    // Node's code seems to be doing this and not & 0x7F..
+    byteArray.push(str.charCodeAt(i) & 0xFF)
+  }
+  return byteArray
+}
+
+function utf16leToBytes (str, units) {
+  var c, hi, lo
+  var byteArray = []
+  for (var i = 0; i < str.length; ++i) {
+    if ((units -= 2) < 0) break
+
+    c = str.charCodeAt(i)
+    hi = c >> 8
+    lo = c % 256
+    byteArray.push(lo)
+    byteArray.push(hi)
+  }
+
+  return byteArray
+}
+
+function base64ToBytes (str) {
+  return base64.toByteArray(base64clean(str))
+}
+
+function blitBuffer (src, dst, offset, length) {
+  for (var i = 0; i < length; ++i) {
+    if ((i + offset >= dst.length) || (i >= src.length)) break
+    dst[i + offset] = src[i]
+  }
+  return i
+}
+
+// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
+// the `instanceof` check but they should be treated as of that type.
+// See: https://github.com/feross/buffer/issues/166
+function isInstance (obj, type) {
+  return obj instanceof type ||
+    (obj != null && obj.constructor != null && obj.constructor.name != null &&
+      obj.constructor.name === type.name)
+}
+function numberIsNaN (obj) {
+  // For IE11 support
+  return obj !== obj // eslint-disable-line no-self-compare
+}
+
+// Create lookup table for `toString('hex')`
+// See: https://github.com/feross/buffer/issues/219
+var hexSliceLookupTable = (function () {
+  var alphabet = '0123456789abcdef'
+  var table = new Array(256)
+  for (var i = 0; i < 16; ++i) {
+    var i16 = i * 16
+    for (var j = 0; j < 16; ++j) {
+      table[i16 + j] = alphabet[i] + alphabet[j]
+    }
+  }
+  return table
+})()
diff --git a/node_modules/buffer/package.json b/node_modules/buffer/package.json
new file mode 100644
index 0000000..dd93414
--- /dev/null
+++ b/node_modules/buffer/package.json
@@ -0,0 +1,127 @@
+{
+  "_from": "buffer@^5.5.0",
+  "_id": "buffer@5.7.1",
+  "_inBundle": false,
+  "_integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+  "_location": "/buffer",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "buffer@^5.5.0",
+    "name": "buffer",
+    "escapedName": "buffer",
+    "rawSpec": "^5.5.0",
+    "saveSpec": null,
+    "fetchSpec": "^5.5.0"
+  },
+  "_requiredBy": [
+    "/bl"
+  ],
+  "_resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+  "_shasum": "ba62e7c13133053582197160851a8f648e99eed0",
+  "_spec": "buffer@^5.5.0",
+  "_where": "F:\\vent-display\\node_modules\\bl",
+  "author": {
+    "name": "Feross Aboukhadijeh",
+    "email": "feross@feross.org",
+    "url": "https://feross.org"
+  },
+  "bugs": {
+    "url": "https://github.com/feross/buffer/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Romain Beauxis",
+      "email": "toots@rastageeks.org"
+    },
+    {
+      "name": "James Halliday",
+      "email": "mail@substack.net"
+    }
+  ],
+  "dependencies": {
+    "base64-js": "^1.3.1",
+    "ieee754": "^1.1.13"
+  },
+  "deprecated": false,
+  "description": "Node.js Buffer API, for the browser",
+  "devDependencies": {
+    "airtap": "^3.0.0",
+    "benchmark": "^2.1.4",
+    "browserify": "^17.0.0",
+    "concat-stream": "^2.0.0",
+    "hyperquest": "^2.1.3",
+    "is-buffer": "^2.0.4",
+    "is-nan": "^1.3.0",
+    "split": "^1.0.1",
+    "standard": "*",
+    "tape": "^5.0.1",
+    "through2": "^4.0.2",
+    "uglify-js": "^3.11.3"
+  },
+  "funding": [
+    {
+      "type": "github",
+      "url": "https://github.com/sponsors/feross"
+    },
+    {
+      "type": "patreon",
+      "url": "https://www.patreon.com/feross"
+    },
+    {
+      "type": "consulting",
+      "url": "https://feross.org/support"
+    }
+  ],
+  "homepage": "https://github.com/feross/buffer",
+  "jspm": {
+    "map": {
+      "./index.js": {
+        "node": "@node/buffer"
+      }
+    }
+  },
+  "keywords": [
+    "arraybuffer",
+    "browser",
+    "browserify",
+    "buffer",
+    "compatible",
+    "dataview",
+    "uint8array"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "buffer",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/feross/buffer.git"
+  },
+  "scripts": {
+    "perf": "browserify --debug perf/bracket-notation.js > perf/bundle.js && open perf/index.html",
+    "perf-node": "node perf/bracket-notation.js && node perf/concat.js && node perf/copy-big.js && node perf/copy.js && node perf/new-big.js && node perf/new.js && node perf/readDoubleBE.js && node perf/readFloatBE.js && node perf/readUInt32LE.js && node perf/slice.js && node perf/writeFloatBE.js",
+    "size": "browserify -r ./ | uglifyjs -c -m | gzip | wc -c",
+    "test": "standard && node ./bin/test.js",
+    "test-browser-es5": "airtap -- test/*.js",
+    "test-browser-es5-local": "airtap --local -- test/*.js",
+    "test-browser-es6": "airtap -- test/*.js test/node/*.js",
+    "test-browser-es6-local": "airtap --local -- test/*.js test/node/*.js",
+    "test-node": "tape test/*.js test/node/*.js",
+    "update-authors": "./bin/update-authors.sh"
+  },
+  "standard": {
+    "ignore": [
+      "test/node/**/*.js",
+      "test/common.js",
+      "test/_polyfill.js",
+      "perf/**/*.js"
+    ],
+    "globals": [
+      "SharedArrayBuffer"
+    ]
+  },
+  "types": "index.d.ts",
+  "version": "5.7.1"
+}
diff --git a/node_modules/chownr/LICENSE b/node_modules/chownr/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/chownr/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/chownr/README.md b/node_modules/chownr/README.md
new file mode 100644
index 0000000..70e9a54
--- /dev/null
+++ b/node_modules/chownr/README.md
@@ -0,0 +1,3 @@
+Like `chown -R`.
+
+Takes the same arguments as `fs.chown()`
diff --git a/node_modules/chownr/chownr.js b/node_modules/chownr/chownr.js
new file mode 100644
index 0000000..0d40932
--- /dev/null
+++ b/node_modules/chownr/chownr.js
@@ -0,0 +1,167 @@
+'use strict'
+const fs = require('fs')
+const path = require('path')
+
+/* istanbul ignore next */
+const LCHOWN = fs.lchown ? 'lchown' : 'chown'
+/* istanbul ignore next */
+const LCHOWNSYNC = fs.lchownSync ? 'lchownSync' : 'chownSync'
+
+/* istanbul ignore next */
+const needEISDIRHandled = fs.lchown &&
+  !process.version.match(/v1[1-9]+\./) &&
+  !process.version.match(/v10\.[6-9]/)
+
+const lchownSync = (path, uid, gid) => {
+  try {
+    return fs[LCHOWNSYNC](path, uid, gid)
+  } catch (er) {
+    if (er.code !== 'ENOENT')
+      throw er
+  }
+}
+
+/* istanbul ignore next */
+const chownSync = (path, uid, gid) => {
+  try {
+    return fs.chownSync(path, uid, gid)
+  } catch (er) {
+    if (er.code !== 'ENOENT')
+      throw er
+  }
+}
+
+/* istanbul ignore next */
+const handleEISDIR =
+  needEISDIRHandled ? (path, uid, gid, cb) => er => {
+    // Node prior to v10 had a very questionable implementation of
+    // fs.lchown, which would always try to call fs.open on a directory
+    // Fall back to fs.chown in those cases.
+    if (!er || er.code !== 'EISDIR')
+      cb(er)
+    else
+      fs.chown(path, uid, gid, cb)
+  }
+  : (_, __, ___, cb) => cb
+
+/* istanbul ignore next */
+const handleEISDirSync =
+  needEISDIRHandled ? (path, uid, gid) => {
+    try {
+      return lchownSync(path, uid, gid)
+    } catch (er) {
+      if (er.code !== 'EISDIR')
+        throw er
+      chownSync(path, uid, gid)
+    }
+  }
+  : (path, uid, gid) => lchownSync(path, uid, gid)
+
+// fs.readdir could only accept an options object as of node v6
+const nodeVersion = process.version
+let readdir = (path, options, cb) => fs.readdir(path, options, cb)
+let readdirSync = (path, options) => fs.readdirSync(path, options)
+/* istanbul ignore next */
+if (/^v4\./.test(nodeVersion))
+  readdir = (path, options, cb) => fs.readdir(path, cb)
+
+const chown = (cpath, uid, gid, cb) => {
+  fs[LCHOWN](cpath, uid, gid, handleEISDIR(cpath, uid, gid, er => {
+    // Skip ENOENT error
+    cb(er && er.code !== 'ENOENT' ? er : null)
+  }))
+}
+
+const chownrKid = (p, child, uid, gid, cb) => {
+  if (typeof child === 'string')
+    return fs.lstat(path.resolve(p, child), (er, stats) => {
+      // Skip ENOENT error
+      if (er)
+        return cb(er.code !== 'ENOENT' ? er : null)
+      stats.name = child
+      chownrKid(p, stats, uid, gid, cb)
+    })
+
+  if (child.isDirectory()) {
+    chownr(path.resolve(p, child.name), uid, gid, er => {
+      if (er)
+        return cb(er)
+      const cpath = path.resolve(p, child.name)
+      chown(cpath, uid, gid, cb)
+    })
+  } else {
+    const cpath = path.resolve(p, child.name)
+    chown(cpath, uid, gid, cb)
+  }
+}
+
+
+const chownr = (p, uid, gid, cb) => {
+  readdir(p, { withFileTypes: true }, (er, children) => {
+    // any error other than ENOTDIR or ENOTSUP means it's not readable,
+    // or doesn't exist.  give up.
+    if (er) {
+      if (er.code === 'ENOENT')
+        return cb()
+      else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP')
+        return cb(er)
+    }
+    if (er || !children.length)
+      return chown(p, uid, gid, cb)
+
+    let len = children.length
+    let errState = null
+    const then = er => {
+      if (errState)
+        return
+      if (er)
+        return cb(errState = er)
+      if (-- len === 0)
+        return chown(p, uid, gid, cb)
+    }
+
+    children.forEach(child => chownrKid(p, child, uid, gid, then))
+  })
+}
+
+const chownrKidSync = (p, child, uid, gid) => {
+  if (typeof child === 'string') {
+    try {
+      const stats = fs.lstatSync(path.resolve(p, child))
+      stats.name = child
+      child = stats
+    } catch (er) {
+      if (er.code === 'ENOENT')
+        return
+      else
+        throw er
+    }
+  }
+
+  if (child.isDirectory())
+    chownrSync(path.resolve(p, child.name), uid, gid)
+
+  handleEISDirSync(path.resolve(p, child.name), uid, gid)
+}
+
+const chownrSync = (p, uid, gid) => {
+  let children
+  try {
+    children = readdirSync(p, { withFileTypes: true })
+  } catch (er) {
+    if (er.code === 'ENOENT')
+      return
+    else if (er.code === 'ENOTDIR' || er.code === 'ENOTSUP')
+      return handleEISDirSync(p, uid, gid)
+    else
+      throw er
+  }
+
+  if (children && children.length)
+    children.forEach(child => chownrKidSync(p, child, uid, gid))
+
+  return handleEISDirSync(p, uid, gid)
+}
+
+module.exports = chownr
+chownr.sync = chownrSync
diff --git a/node_modules/chownr/package.json b/node_modules/chownr/package.json
new file mode 100644
index 0000000..f54b93b
--- /dev/null
+++ b/node_modules/chownr/package.json
@@ -0,0 +1,62 @@
+{
+  "_from": "chownr@^1.1.1",
+  "_id": "chownr@1.1.4",
+  "_inBundle": false,
+  "_integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+  "_location": "/chownr",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "chownr@^1.1.1",
+    "name": "chownr",
+    "escapedName": "chownr",
+    "rawSpec": "^1.1.1",
+    "saveSpec": null,
+    "fetchSpec": "^1.1.1"
+  },
+  "_requiredBy": [
+    "/tar-fs"
+  ],
+  "_resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+  "_shasum": "6fc9d7b42d32a583596337666e7d08084da2cc6b",
+  "_spec": "chownr@^1.1.1",
+  "_where": "F:\\vent-display\\node_modules\\tar-fs",
+  "author": {
+    "name": "Isaac Z. Schlueter",
+    "email": "i@izs.me",
+    "url": "http://blog.izs.me/"
+  },
+  "bugs": {
+    "url": "https://github.com/isaacs/chownr/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "like `chown -R`",
+  "devDependencies": {
+    "mkdirp": "0.3",
+    "rimraf": "^2.7.1",
+    "tap": "^14.10.6"
+  },
+  "files": [
+    "chownr.js"
+  ],
+  "homepage": "https://github.com/isaacs/chownr#readme",
+  "license": "ISC",
+  "main": "chownr.js",
+  "name": "chownr",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/isaacs/chownr.git"
+  },
+  "scripts": {
+    "postversion": "npm publish",
+    "prepublishOnly": "git push origin --follow-tags",
+    "preversion": "npm test",
+    "test": "tap"
+  },
+  "tap": {
+    "check-coverage": true
+  },
+  "version": "1.1.4"
+}
diff --git a/node_modules/code-point-at/index.js b/node_modules/code-point-at/index.js
new file mode 100644
index 0000000..0432fe6
--- /dev/null
+++ b/node_modules/code-point-at/index.js
@@ -0,0 +1,32 @@
+/* eslint-disable babel/new-cap, xo/throw-new-error */
+'use strict';
+module.exports = function (str, pos) {
+	if (str === null || str === undefined) {
+		throw TypeError();
+	}
+
+	str = String(str);
+
+	var size = str.length;
+	var i = pos ? Number(pos) : 0;
+
+	if (Number.isNaN(i)) {
+		i = 0;
+	}
+
+	if (i < 0 || i >= size) {
+		return undefined;
+	}
+
+	var first = str.charCodeAt(i);
+
+	if (first >= 0xD800 && first <= 0xDBFF && size > i + 1) {
+		var second = str.charCodeAt(i + 1);
+
+		if (second >= 0xDC00 && second <= 0xDFFF) {
+			return ((first - 0xD800) * 0x400) + second - 0xDC00 + 0x10000;
+		}
+	}
+
+	return first;
+};
diff --git a/node_modules/code-point-at/license b/node_modules/code-point-at/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/code-point-at/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/code-point-at/package.json b/node_modules/code-point-at/package.json
new file mode 100644
index 0000000..4312d32
--- /dev/null
+++ b/node_modules/code-point-at/package.json
@@ -0,0 +1,70 @@
+{
+  "_from": "code-point-at@^1.0.0",
+  "_id": "code-point-at@1.1.0",
+  "_inBundle": false,
+  "_integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+  "_location": "/code-point-at",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "code-point-at@^1.0.0",
+    "name": "code-point-at",
+    "escapedName": "code-point-at",
+    "rawSpec": "^1.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.0"
+  },
+  "_requiredBy": [
+    "/string-width"
+  ],
+  "_resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+  "_shasum": "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77",
+  "_spec": "code-point-at@^1.0.0",
+  "_where": "F:\\vent-display\\node_modules\\string-width",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "bugs": {
+    "url": "https://github.com/sindresorhus/code-point-at/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "ES2015 `String#codePointAt()` ponyfill",
+  "devDependencies": {
+    "ava": "*",
+    "xo": "^0.16.0"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/sindresorhus/code-point-at#readme",
+  "keywords": [
+    "es2015",
+    "ponyfill",
+    "polyfill",
+    "shim",
+    "string",
+    "str",
+    "code",
+    "point",
+    "at",
+    "codepoint",
+    "unicode"
+  ],
+  "license": "MIT",
+  "name": "code-point-at",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/sindresorhus/code-point-at.git"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "version": "1.1.0"
+}
diff --git a/node_modules/code-point-at/readme.md b/node_modules/code-point-at/readme.md
new file mode 100644
index 0000000..4c97730
--- /dev/null
+++ b/node_modules/code-point-at/readme.md
@@ -0,0 +1,32 @@
+# code-point-at [![Build Status](https://travis-ci.org/sindresorhus/code-point-at.svg?branch=master)](https://travis-ci.org/sindresorhus/code-point-at)
+
+> ES2015 [`String#codePointAt()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt) [ponyfill](https://ponyfill.com)
+
+
+## Install
+
+```
+$ npm install --save code-point-at
+```
+
+
+## Usage
+
+```js
+var codePointAt = require('code-point-at');
+
+codePointAt('🐴');
+//=> 128052
+
+codePointAt('abc', 2);
+//=> 99
+```
+
+## API
+
+### codePointAt(input, [position])
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/console-control-strings/LICENSE b/node_modules/console-control-strings/LICENSE
new file mode 100644
index 0000000..e756052
--- /dev/null
+++ b/node_modules/console-control-strings/LICENSE
@@ -0,0 +1,13 @@
+Copyright (c) 2014, Rebecca Turner <me@re-becca.org>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/console-control-strings/README.md b/node_modules/console-control-strings/README.md
new file mode 100644
index 0000000..f58cc8d
--- /dev/null
+++ b/node_modules/console-control-strings/README.md
@@ -0,0 +1,145 @@
+# Console Control Strings
+
+A library of cross-platform tested terminal/console command strings for
+doing things like color and cursor positioning.  This is a subset of both
+ansi and vt100.  All control codes included work on both Windows & Unix-like
+OSes, except where noted.
+
+## Usage
+
+```js
+var consoleControl = require('console-control-strings')
+
+console.log(consoleControl.color('blue','bgRed', 'bold') + 'hi there' + consoleControl.color('reset'))
+process.stdout.write(consoleControl.goto(75, 10))
+```
+
+## Why Another?
+
+There are tons of libraries similar to this one.  I wanted one that was:
+
+1. Very clear about compatibility goals.
+2. Could emit, for instance, a start color code without an end one.
+3. Returned strings w/o writing to streams.
+4. Was not weighed down with other unrelated baggage.
+
+## Functions
+
+### var code = consoleControl.up(_num = 1_)
+
+Returns the escape sequence to move _num_ lines up.
+
+### var code = consoleControl.down(_num = 1_)
+
+Returns the escape sequence to move _num_ lines down.
+
+### var code = consoleControl.forward(_num = 1_)
+
+Returns the escape sequence to move _num_ lines righ.
+
+### var code = consoleControl.back(_num = 1_)
+
+Returns the escape sequence to move _num_ lines left.
+
+### var code = consoleControl.nextLine(_num = 1_)
+
+Returns the escape sequence to move _num_ lines down and to the beginning of
+the line.
+
+### var code = consoleControl.previousLine(_num = 1_)
+
+Returns the escape sequence to move _num_ lines up and to the beginning of
+the line.
+
+### var code = consoleControl.eraseData()
+
+Returns the escape sequence to erase everything from the current cursor
+position to the bottom right of the screen.  This is line based, so it
+erases the remainder of the current line and all following lines.
+
+### var code = consoleControl.eraseLine()
+
+Returns the escape sequence to erase to the end of the current line.
+
+### var code = consoleControl.goto(_x_, _y_)
+
+Returns the escape sequence to move the cursor to the designated position. 
+Note that the origin is _1, 1_ not _0, 0_.
+
+### var code = consoleControl.gotoSOL()
+
+Returns the escape sequence to move the cursor to the beginning of the
+current line. (That is, it returns a carriage return, `\r`.)
+
+### var code = consoleControl.beep()
+
+Returns the escape sequence to cause the termianl to beep.  (That is, it
+returns unicode character `\x0007`, a Control-G.)
+
+### var code = consoleControl.hideCursor()
+
+Returns the escape sequence to hide the cursor.
+
+### var code = consoleControl.showCursor()
+
+Returns the escape sequence to show the cursor.
+
+### var code = consoleControl.color(_colors = []_)
+
+### var code = consoleControl.color(_color1_, _color2_, _…_, _colorn_)
+
+Returns the escape sequence to set the current terminal display attributes
+(mostly colors).  Arguments can either be a list of attributes or an array
+of attributes.  The difference between passing in an array or list of colors
+and calling `.color` separately for each one, is that in the former case a
+single escape sequence will be produced where as in the latter each change
+will have its own distinct escape sequence.  Each attribute can be one of:
+
+* Reset:
+  * **reset** – Reset all attributes to the terminal default.
+* Styles:
+  * **bold** – Display text as bold.  In some terminals this means using a
+    bold font, in others this means changing the color.  In some it means
+    both.
+  * **italic** – Display text as italic. This is not available in most Windows terminals.
+  * **underline** – Underline text. This is not available in most Windows Terminals.
+  * **inverse** – Invert the foreground and background colors.
+  * **stopBold** – Do not display text as bold.
+  * **stopItalic** – Do not display text as italic.
+  * **stopUnderline** – Do not underline text.
+  * **stopInverse** – Do not invert foreground and background.
+* Colors:
+  * **white**
+  * **black**
+  * **blue**
+  * **cyan**
+  * **green**
+  * **magenta**
+  * **red**
+  * **yellow**
+  * **grey** / **brightBlack**
+  * **brightRed**
+  * **brightGreen**
+  * **brightYellow**
+  * **brightBlue**
+  * **brightMagenta**
+  * **brightCyan**
+  * **brightWhite**
+* Background Colors:
+  * **bgWhite**
+  * **bgBlack**
+  * **bgBlue**
+  * **bgCyan**
+  * **bgGreen**
+  * **bgMagenta**
+  * **bgRed**
+  * **bgYellow**
+  * **bgGrey** / **bgBrightBlack**
+  * **bgBrightRed**
+  * **bgBrightGreen**
+  * **bgBrightYellow**
+  * **bgBrightBlue**
+  * **bgBrightMagenta**
+  * **bgBrightCyan**
+  * **bgBrightWhite**
+
diff --git a/node_modules/console-control-strings/README.md~ b/node_modules/console-control-strings/README.md~
new file mode 100644
index 0000000..6eb34e8
--- /dev/null
+++ b/node_modules/console-control-strings/README.md~
@@ -0,0 +1,140 @@
+# Console Control Strings
+
+A library of cross-platform tested terminal/console command strings for
+doing things like color and cursor positioning.  This is a subset of both
+ansi and vt100.  All control codes included work on both Windows & Unix-like
+OSes, except where noted.
+
+## Usage
+
+```js
+var consoleControl = require('console-control-strings')
+
+console.log(consoleControl.color('blue','bgRed', 'bold') + 'hi there' + consoleControl.color('reset'))
+process.stdout.write(consoleControl.goto(75, 10))
+```
+
+## Why Another?
+
+There are tons of libraries similar to this one.  I wanted one that was:
+
+1. Very clear about compatibility goals.
+2. Could emit, for instance, a start color code without an end one.
+3. Returned strings w/o writing to streams.
+4. Was not weighed down with other unrelated baggage.
+
+## Functions
+
+### var code = consoleControl.up(_num = 1_)
+
+Returns the escape sequence to move _num_ lines up.
+
+### var code = consoleControl.down(_num = 1_)
+
+Returns the escape sequence to move _num_ lines down.
+
+### var code = consoleControl.forward(_num = 1_)
+
+Returns the escape sequence to move _num_ lines righ.
+
+### var code = consoleControl.back(_num = 1_)
+
+Returns the escape sequence to move _num_ lines left.
+
+### var code = consoleControl.nextLine(_num = 1_)
+
+Returns the escape sequence to move _num_ lines down and to the beginning of
+the line.
+
+### var code = consoleControl.previousLine(_num = 1_)
+
+Returns the escape sequence to move _num_ lines up and to the beginning of
+the line.
+
+### var code = consoleControl.eraseData()
+
+Returns the escape sequence to erase everything from the current cursor
+position to the bottom right of the screen.  This is line based, so it
+erases the remainder of the current line and all following lines.
+
+### var code = consoleControl.eraseLine()
+
+Returns the escape sequence to erase to the end of the current line.
+
+### var code = consoleControl.goto(_x_, _y_)
+
+Returns the escape sequence to move the cursor to the designated position. 
+Note that the origin is _1, 1_ not _0, 0_.
+
+### var code = consoleControl.gotoSOL()
+
+Returns the escape sequence to move the cursor to the beginning of the
+current line. (That is, it returns a carriage return, `\r`.)
+
+### var code = consoleControl.hideCursor()
+
+Returns the escape sequence to hide the cursor.
+
+### var code = consoleControl.showCursor()
+
+Returns the escape sequence to show the cursor.
+
+### var code = consoleControl.color(_colors = []_)
+
+### var code = consoleControl.color(_color1_, _color2_, _…_, _colorn_)
+
+Returns the escape sequence to set the current terminal display attributes
+(mostly colors).  Arguments can either be a list of attributes or an array
+of attributes.  The difference between passing in an array or list of colors
+and calling `.color` separately for each one, is that in the former case a
+single escape sequence will be produced where as in the latter each change
+will have its own distinct escape sequence.  Each attribute can be one of:
+
+* Reset:
+  * **reset** – Reset all attributes to the terminal default.
+* Styles:
+  * **bold** – Display text as bold.  In some terminals this means using a
+    bold font, in others this means changing the color.  In some it means
+    both.
+  * **italic** – Display text as italic. This is not available in most Windows terminals.
+  * **underline** – Underline text. This is not available in most Windows Terminals.
+  * **inverse** – Invert the foreground and background colors.
+  * **stopBold** – Do not display text as bold.
+  * **stopItalic** – Do not display text as italic.
+  * **stopUnderline** – Do not underline text.
+  * **stopInverse** – Do not invert foreground and background.
+* Colors:
+  * **white**
+  * **black**
+  * **blue**
+  * **cyan**
+  * **green**
+  * **magenta**
+  * **red**
+  * **yellow**
+  * **grey** / **brightBlack**
+  * **brightRed**
+  * **brightGreen**
+  * **brightYellow**
+  * **brightBlue**
+  * **brightMagenta**
+  * **brightCyan**
+  * **brightWhite**
+* Background Colors:
+  * **bgWhite**
+  * **bgBlack**
+  * **bgBlue**
+  * **bgCyan**
+  * **bgGreen**
+  * **bgMagenta**
+  * **bgRed**
+  * **bgYellow**
+  * **bgGrey** / **bgBrightBlack**
+  * **bgBrightRed**
+  * **bgBrightGreen**
+  * **bgBrightYellow**
+  * **bgBrightBlue**
+  * **bgBrightMagenta**
+  * **bgBrightCyan**
+  * **bgBrightWhite**
+
diff --git a/node_modules/console-control-strings/index.js b/node_modules/console-control-strings/index.js
new file mode 100644
index 0000000..bf89034
--- /dev/null
+++ b/node_modules/console-control-strings/index.js
@@ -0,0 +1,125 @@
+'use strict'
+
+// These tables borrowed from `ansi`
+
+var prefix = '\x1b['
+
+exports.up = function up (num) {
+  return prefix + (num || '') + 'A'
+}
+
+exports.down = function down (num) {
+  return prefix + (num || '') + 'B'
+}
+
+exports.forward = function forward (num) {
+  return prefix + (num || '') + 'C'
+}
+
+exports.back = function back (num) {
+  return prefix + (num || '') + 'D'
+}
+
+exports.nextLine = function nextLine (num) {
+  return prefix + (num || '') + 'E'
+}
+
+exports.previousLine = function previousLine (num) {
+  return prefix + (num || '') + 'F'
+}
+
+exports.horizontalAbsolute = function horizontalAbsolute (num) {
+  if (num == null) throw new Error('horizontalAboslute requires a column to position to')
+  return prefix + num + 'G'
+}
+
+exports.eraseData = function eraseData () {
+  return prefix + 'J'
+}
+
+exports.eraseLine = function eraseLine () {
+  return prefix + 'K'
+}
+
+exports.goto = function (x, y) {
+  return prefix + y + ';' + x + 'H'
+}
+
+exports.gotoSOL = function () {
+  return '\r'
+}
+
+exports.beep = function () {
+  return '\x07'
+}
+
+exports.hideCursor = function hideCursor () {
+  return prefix + '?25l'
+}
+
+exports.showCursor = function showCursor () {
+  return prefix + '?25h'
+}
+
+var colors = {
+  reset: 0,
+// styles
+  bold: 1,
+  italic: 3,
+  underline: 4,
+  inverse: 7,
+// resets
+  stopBold: 22,
+  stopItalic: 23,
+  stopUnderline: 24,
+  stopInverse: 27,
+// colors
+  white: 37,
+  black: 30,
+  blue: 34,
+  cyan: 36,
+  green: 32,
+  magenta: 35,
+  red: 31,
+  yellow: 33,
+  bgWhite: 47,
+  bgBlack: 40,
+  bgBlue: 44,
+  bgCyan: 46,
+  bgGreen: 42,
+  bgMagenta: 45,
+  bgRed: 41,
+  bgYellow: 43,
+
+  grey: 90,
+  brightBlack: 90,
+  brightRed: 91,
+  brightGreen: 92,
+  brightYellow: 93,
+  brightBlue: 94,
+  brightMagenta: 95,
+  brightCyan: 96,
+  brightWhite: 97,
+
+  bgGrey: 100,
+  bgBrightBlack: 100,
+  bgBrightRed: 101,
+  bgBrightGreen: 102,
+  bgBrightYellow: 103,
+  bgBrightBlue: 104,
+  bgBrightMagenta: 105,
+  bgBrightCyan: 106,
+  bgBrightWhite: 107
+}
+
+exports.color = function color (colorWith) {
+  if (arguments.length !== 1 || !Array.isArray(colorWith)) {
+    colorWith = Array.prototype.slice.call(arguments)
+  }
+  return prefix + colorWith.map(colorNameToCode).join(';') + 'm'
+}
+
+function colorNameToCode (color) {
+  if (colors[color] != null) return colors[color]
+  throw new Error('Unknown color or style name: ' + color)
+}
diff --git a/node_modules/console-control-strings/package.json b/node_modules/console-control-strings/package.json
new file mode 100644
index 0000000..fdffc5e
--- /dev/null
+++ b/node_modules/console-control-strings/package.json
@@ -0,0 +1,61 @@
+{
+  "_from": "console-control-strings@~1.1.0",
+  "_id": "console-control-strings@1.1.0",
+  "_inBundle": false,
+  "_integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+  "_location": "/console-control-strings",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "console-control-strings@~1.1.0",
+    "name": "console-control-strings",
+    "escapedName": "console-control-strings",
+    "rawSpec": "~1.1.0",
+    "saveSpec": null,
+    "fetchSpec": "~1.1.0"
+  },
+  "_requiredBy": [
+    "/gauge",
+    "/npmlog"
+  ],
+  "_resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+  "_shasum": "3d7cf4464db6446ea644bf4b39507f9851008e8e",
+  "_spec": "console-control-strings@~1.1.0",
+  "_where": "F:\\vent-display\\node_modules\\npmlog",
+  "author": {
+    "name": "Rebecca Turner",
+    "email": "me@re-becca.org",
+    "url": "http://re-becca.org/"
+  },
+  "bugs": {
+    "url": "https://github.com/iarna/console-control-strings/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "A library of cross-platform tested terminal/console command strings for doing things like color and cursor positioning.  This is a subset of both ansi and vt100.  All control codes included work on both Windows & Unix-like OSes, except where noted.",
+  "devDependencies": {
+    "standard": "^7.1.2",
+    "tap": "^5.7.2"
+  },
+  "directories": {
+    "test": "test"
+  },
+  "files": [
+    "LICENSE",
+    "index.js"
+  ],
+  "homepage": "https://github.com/iarna/console-control-strings#readme",
+  "keywords": [],
+  "license": "ISC",
+  "main": "index.js",
+  "name": "console-control-strings",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/iarna/console-control-strings.git"
+  },
+  "scripts": {
+    "test": "standard && tap test/*.js"
+  },
+  "version": "1.1.0"
+}
diff --git a/node_modules/core-util-is/LICENSE b/node_modules/core-util-is/LICENSE
new file mode 100644
index 0000000..d8d7f94
--- /dev/null
+++ b/node_modules/core-util-is/LICENSE
@@ -0,0 +1,19 @@
+Copyright Node.js contributors. All rights reserved.
+
+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/core-util-is/README.md b/node_modules/core-util-is/README.md
new file mode 100644
index 0000000..5a76b41
--- /dev/null
+++ b/node_modules/core-util-is/README.md
@@ -0,0 +1,3 @@
+# core-util-is
+
+The `util.is*` functions introduced in Node v0.12.
diff --git a/node_modules/core-util-is/float.patch b/node_modules/core-util-is/float.patch
new file mode 100644
index 0000000..a06d5c0
--- /dev/null
+++ b/node_modules/core-util-is/float.patch
@@ -0,0 +1,604 @@
+diff --git a/lib/util.js b/lib/util.js
+index a03e874..9074e8e 100644
+--- a/lib/util.js
++++ b/lib/util.js
+@@ -19,430 +19,6 @@
+ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ // USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+-var formatRegExp = /%[sdj%]/g;
+-exports.format = function(f) {
+-  if (!isString(f)) {
+-    var objects = [];
+-    for (var i = 0; i < arguments.length; i++) {
+-      objects.push(inspect(arguments[i]));
+-    }
+-    return objects.join(' ');
+-  }
+-
+-  var i = 1;
+-  var args = arguments;
+-  var len = args.length;
+-  var str = String(f).replace(formatRegExp, function(x) {
+-    if (x === '%%') return '%';
+-    if (i >= len) return x;
+-    switch (x) {
+-      case '%s': return String(args[i++]);
+-      case '%d': return Number(args[i++]);
+-      case '%j':
+-        try {
+-          return JSON.stringify(args[i++]);
+-        } catch (_) {
+-          return '[Circular]';
+-        }
+-      default:
+-        return x;
+-    }
+-  });
+-  for (var x = args[i]; i < len; x = args[++i]) {
+-    if (isNull(x) || !isObject(x)) {
+-      str += ' ' + x;
+-    } else {
+-      str += ' ' + inspect(x);
+-    }
+-  }
+-  return str;
+-};
+-
+-
+-// Mark that a method should not be used.
+-// Returns a modified function which warns once by default.
+-// If --no-deprecation is set, then it is a no-op.
+-exports.deprecate = function(fn, msg) {
+-  // Allow for deprecating things in the process of starting up.
+-  if (isUndefined(global.process)) {
+-    return function() {
+-      return exports.deprecate(fn, msg).apply(this, arguments);
+-    };
+-  }
+-
+-  if (process.noDeprecation === true) {
+-    return fn;
+-  }
+-
+-  var warned = false;
+-  function deprecated() {
+-    if (!warned) {
+-      if (process.throwDeprecation) {
+-        throw new Error(msg);
+-      } else if (process.traceDeprecation) {
+-        console.trace(msg);
+-      } else {
+-        console.error(msg);
+-      }
+-      warned = true;
+-    }
+-    return fn.apply(this, arguments);
+-  }
+-
+-  return deprecated;
+-};
+-
+-
+-var debugs = {};
+-var debugEnviron;
+-exports.debuglog = function(set) {
+-  if (isUndefined(debugEnviron))
+-    debugEnviron = process.env.NODE_DEBUG || '';
+-  set = set.toUpperCase();
+-  if (!debugs[set]) {
+-    if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
+-      var pid = process.pid;
+-      debugs[set] = function() {
+-        var msg = exports.format.apply(exports, arguments);
+-        console.error('%s %d: %s', set, pid, msg);
+-      };
+-    } else {
+-      debugs[set] = function() {};
+-    }
+-  }
+-  return debugs[set];
+-};
+-
+-
+-/**
+- * Echos the value of a value. Trys to print the value out
+- * in the best way possible given the different types.
+- *
+- * @param {Object} obj The object to print out.
+- * @param {Object} opts Optional options object that alters the output.
+- */
+-/* legacy: obj, showHidden, depth, colors*/
+-function inspect(obj, opts) {
+-  // default options
+-  var ctx = {
+-    seen: [],
+-    stylize: stylizeNoColor
+-  };
+-  // legacy...
+-  if (arguments.length >= 3) ctx.depth = arguments[2];
+-  if (arguments.length >= 4) ctx.colors = arguments[3];
+-  if (isBoolean(opts)) {
+-    // legacy...
+-    ctx.showHidden = opts;
+-  } else if (opts) {
+-    // got an "options" object
+-    exports._extend(ctx, opts);
+-  }
+-  // set default options
+-  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
+-  if (isUndefined(ctx.depth)) ctx.depth = 2;
+-  if (isUndefined(ctx.colors)) ctx.colors = false;
+-  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
+-  if (ctx.colors) ctx.stylize = stylizeWithColor;
+-  return formatValue(ctx, obj, ctx.depth);
+-}
+-exports.inspect = inspect;
+-
+-
+-// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
+-inspect.colors = {
+-  'bold' : [1, 22],
+-  'italic' : [3, 23],
+-  'underline' : [4, 24],
+-  'inverse' : [7, 27],
+-  'white' : [37, 39],
+-  'grey' : [90, 39],
+-  'black' : [30, 39],
+-  'blue' : [34, 39],
+-  'cyan' : [36, 39],
+-  'green' : [32, 39],
+-  'magenta' : [35, 39],
+-  'red' : [31, 39],
+-  'yellow' : [33, 39]
+-};
+-
+-// Don't use 'blue' not visible on cmd.exe
+-inspect.styles = {
+-  'special': 'cyan',
+-  'number': 'yellow',
+-  'boolean': 'yellow',
+-  'undefined': 'grey',
+-  'null': 'bold',
+-  'string': 'green',
+-  'date': 'magenta',
+-  // "name": intentionally not styling
+-  'regexp': 'red'
+-};
+-
+-
+-function stylizeWithColor(str, styleType) {
+-  var style = inspect.styles[styleType];
+-
+-  if (style) {
+-    return '\u001b[' + inspect.colors[style][0] + 'm' + str +
+-           '\u001b[' + inspect.colors[style][1] + 'm';
+-  } else {
+-    return str;
+-  }
+-}
+-
+-
+-function stylizeNoColor(str, styleType) {
+-  return str;
+-}
+-
+-
+-function arrayToHash(array) {
+-  var hash = {};
+-
+-  array.forEach(function(val, idx) {
+-    hash[val] = true;
+-  });
+-
+-  return hash;
+-}
+-
+-
+-function formatValue(ctx, value, recurseTimes) {
+-  // Provide a hook for user-specified inspect functions.
+-  // Check that value is an object with an inspect function on it
+-  if (ctx.customInspect &&
+-      value &&
+-      isFunction(value.inspect) &&
+-      // Filter out the util module, it's inspect function is special
+-      value.inspect !== exports.inspect &&
+-      // Also filter out any prototype objects using the circular check.
+-      !(value.constructor && value.constructor.prototype === value)) {
+-    var ret = value.inspect(recurseTimes, ctx);
+-    if (!isString(ret)) {
+-      ret = formatValue(ctx, ret, recurseTimes);
+-    }
+-    return ret;
+-  }
+-
+-  // Primitive types cannot have properties
+-  var primitive = formatPrimitive(ctx, value);
+-  if (primitive) {
+-    return primitive;
+-  }
+-
+-  // Look up the keys of the object.
+-  var keys = Object.keys(value);
+-  var visibleKeys = arrayToHash(keys);
+-
+-  if (ctx.showHidden) {
+-    keys = Object.getOwnPropertyNames(value);
+-  }
+-
+-  // Some type of object without properties can be shortcutted.
+-  if (keys.length === 0) {
+-    if (isFunction(value)) {
+-      var name = value.name ? ': ' + value.name : '';
+-      return ctx.stylize('[Function' + name + ']', 'special');
+-    }
+-    if (isRegExp(value)) {
+-      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+-    }
+-    if (isDate(value)) {
+-      return ctx.stylize(Date.prototype.toString.call(value), 'date');
+-    }
+-    if (isError(value)) {
+-      return formatError(value);
+-    }
+-  }
+-
+-  var base = '', array = false, braces = ['{', '}'];
+-
+-  // Make Array say that they are Array
+-  if (isArray(value)) {
+-    array = true;
+-    braces = ['[', ']'];
+-  }
+-
+-  // Make functions say that they are functions
+-  if (isFunction(value)) {
+-    var n = value.name ? ': ' + value.name : '';
+-    base = ' [Function' + n + ']';
+-  }
+-
+-  // Make RegExps say that they are RegExps
+-  if (isRegExp(value)) {
+-    base = ' ' + RegExp.prototype.toString.call(value);
+-  }
+-
+-  // Make dates with properties first say the date
+-  if (isDate(value)) {
+-    base = ' ' + Date.prototype.toUTCString.call(value);
+-  }
+-
+-  // Make error with message first say the error
+-  if (isError(value)) {
+-    base = ' ' + formatError(value);
+-  }
+-
+-  if (keys.length === 0 && (!array || value.length == 0)) {
+-    return braces[0] + base + braces[1];
+-  }
+-
+-  if (recurseTimes < 0) {
+-    if (isRegExp(value)) {
+-      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+-    } else {
+-      return ctx.stylize('[Object]', 'special');
+-    }
+-  }
+-
+-  ctx.seen.push(value);
+-
+-  var output;
+-  if (array) {
+-    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+-  } else {
+-    output = keys.map(function(key) {
+-      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
+-    });
+-  }
+-
+-  ctx.seen.pop();
+-
+-  return reduceToSingleString(output, base, braces);
+-}
+-
+-
+-function formatPrimitive(ctx, value) {
+-  if (isUndefined(value))
+-    return ctx.stylize('undefined', 'undefined');
+-  if (isString(value)) {
+-    var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
+-                                             .replace(/'/g, "\\'")
+-                                             .replace(/\\"/g, '"') + '\'';
+-    return ctx.stylize(simple, 'string');
+-  }
+-  if (isNumber(value)) {
+-    // Format -0 as '-0'. Strict equality won't distinguish 0 from -0,
+-    // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 .
+-    if (value === 0 && 1 / value < 0)
+-      return ctx.stylize('-0', 'number');
+-    return ctx.stylize('' + value, 'number');
+-  }
+-  if (isBoolean(value))
+-    return ctx.stylize('' + value, 'boolean');
+-  // For some reason typeof null is "object", so special case here.
+-  if (isNull(value))
+-    return ctx.stylize('null', 'null');
+-}
+-
+-
+-function formatError(value) {
+-  return '[' + Error.prototype.toString.call(value) + ']';
+-}
+-
+-
+-function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
+-  var output = [];
+-  for (var i = 0, l = value.length; i < l; ++i) {
+-    if (hasOwnProperty(value, String(i))) {
+-      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+-          String(i), true));
+-    } else {
+-      output.push('');
+-    }
+-  }
+-  keys.forEach(function(key) {
+-    if (!key.match(/^\d+$/)) {
+-      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+-          key, true));
+-    }
+-  });
+-  return output;
+-}
+-
+-
+-function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
+-  var name, str, desc;
+-  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
+-  if (desc.get) {
+-    if (desc.set) {
+-      str = ctx.stylize('[Getter/Setter]', 'special');
+-    } else {
+-      str = ctx.stylize('[Getter]', 'special');
+-    }
+-  } else {
+-    if (desc.set) {
+-      str = ctx.stylize('[Setter]', 'special');
+-    }
+-  }
+-  if (!hasOwnProperty(visibleKeys, key)) {
+-    name = '[' + key + ']';
+-  }
+-  if (!str) {
+-    if (ctx.seen.indexOf(desc.value) < 0) {
+-      if (isNull(recurseTimes)) {
+-        str = formatValue(ctx, desc.value, null);
+-      } else {
+-        str = formatValue(ctx, desc.value, recurseTimes - 1);
+-      }
+-      if (str.indexOf('\n') > -1) {
+-        if (array) {
+-          str = str.split('\n').map(function(line) {
+-            return '  ' + line;
+-          }).join('\n').substr(2);
+-        } else {
+-          str = '\n' + str.split('\n').map(function(line) {
+-            return '   ' + line;
+-          }).join('\n');
+-        }
+-      }
+-    } else {
+-      str = ctx.stylize('[Circular]', 'special');
+-    }
+-  }
+-  if (isUndefined(name)) {
+-    if (array && key.match(/^\d+$/)) {
+-      return str;
+-    }
+-    name = JSON.stringify('' + key);
+-    if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
+-      name = name.substr(1, name.length - 2);
+-      name = ctx.stylize(name, 'name');
+-    } else {
+-      name = name.replace(/'/g, "\\'")
+-                 .replace(/\\"/g, '"')
+-                 .replace(/(^"|"$)/g, "'");
+-      name = ctx.stylize(name, 'string');
+-    }
+-  }
+-
+-  return name + ': ' + str;
+-}
+-
+-
+-function reduceToSingleString(output, base, braces) {
+-  var numLinesEst = 0;
+-  var length = output.reduce(function(prev, cur) {
+-    numLinesEst++;
+-    if (cur.indexOf('\n') >= 0) numLinesEst++;
+-    return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
+-  }, 0);
+-
+-  if (length > 60) {
+-    return braces[0] +
+-           (base === '' ? '' : base + '\n ') +
+-           ' ' +
+-           output.join(',\n  ') +
+-           ' ' +
+-           braces[1];
+-  }
+-
+-  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
+-}
+-
+-
+ // NOTE: These type checking functions intentionally don't use `instanceof`
+ // because it is fragile and can be easily faked with `Object.create()`.
+ function isArray(ar) {
+@@ -522,166 +98,10 @@ function isPrimitive(arg) {
+ exports.isPrimitive = isPrimitive;
+
+ function isBuffer(arg) {
+-  return arg instanceof Buffer;
++  return Buffer.isBuffer(arg);
+ }
+ exports.isBuffer = isBuffer;
+
+ function objectToString(o) {
+   return Object.prototype.toString.call(o);
+-}
+-
+-
+-function pad(n) {
+-  return n < 10 ? '0' + n.toString(10) : n.toString(10);
+-}
+-
+-
+-var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
+-              'Oct', 'Nov', 'Dec'];
+-
+-// 26 Feb 16:19:34
+-function timestamp() {
+-  var d = new Date();
+-  var time = [pad(d.getHours()),
+-              pad(d.getMinutes()),
+-              pad(d.getSeconds())].join(':');
+-  return [d.getDate(), months[d.getMonth()], time].join(' ');
+-}
+-
+-
+-// log is just a thin wrapper to console.log that prepends a timestamp
+-exports.log = function() {
+-  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
+-};
+-
+-
+-/**
+- * Inherit the prototype methods from one constructor into another.
+- *
+- * The Function.prototype.inherits from lang.js rewritten as a standalone
+- * function (not on Function.prototype). NOTE: If this file is to be loaded
+- * during bootstrapping this function needs to be rewritten using some native
+- * functions as prototype setup using normal JavaScript does not work as
+- * expected during bootstrapping (see mirror.js in r114903).
+- *
+- * @param {function} ctor Constructor function which needs to inherit the
+- *     prototype.
+- * @param {function} superCtor Constructor function to inherit prototype from.
+- */
+-exports.inherits = function(ctor, superCtor) {
+-  ctor.super_ = superCtor;
+-  ctor.prototype = Object.create(superCtor.prototype, {
+-    constructor: {
+-      value: ctor,
+-      enumerable: false,
+-      writable: true,
+-      configurable: true
+-    }
+-  });
+-};
+-
+-exports._extend = function(origin, add) {
+-  // Don't do anything if add isn't an object
+-  if (!add || !isObject(add)) return origin;
+-
+-  var keys = Object.keys(add);
+-  var i = keys.length;
+-  while (i--) {
+-    origin[keys[i]] = add[keys[i]];
+-  }
+-  return origin;
+-};
+-
+-function hasOwnProperty(obj, prop) {
+-  return Object.prototype.hasOwnProperty.call(obj, prop);
+-}
+-
+-
+-// Deprecated old stuff.
+-
+-exports.p = exports.deprecate(function() {
+-  for (var i = 0, len = arguments.length; i < len; ++i) {
+-    console.error(exports.inspect(arguments[i]));
+-  }
+-}, 'util.p: Use console.error() instead');
+-
+-
+-exports.exec = exports.deprecate(function() {
+-  return require('child_process').exec.apply(this, arguments);
+-}, 'util.exec is now called `child_process.exec`.');
+-
+-
+-exports.print = exports.deprecate(function() {
+-  for (var i = 0, len = arguments.length; i < len; ++i) {
+-    process.stdout.write(String(arguments[i]));
+-  }
+-}, 'util.print: Use console.log instead');
+-
+-
+-exports.puts = exports.deprecate(function() {
+-  for (var i = 0, len = arguments.length; i < len; ++i) {
+-    process.stdout.write(arguments[i] + '\n');
+-  }
+-}, 'util.puts: Use console.log instead');
+-
+-
+-exports.debug = exports.deprecate(function(x) {
+-  process.stderr.write('DEBUG: ' + x + '\n');
+-}, 'util.debug: Use console.error instead');
+-
+-
+-exports.error = exports.deprecate(function(x) {
+-  for (var i = 0, len = arguments.length; i < len; ++i) {
+-    process.stderr.write(arguments[i] + '\n');
+-  }
+-}, 'util.error: Use console.error instead');
+-
+-
+-exports.pump = exports.deprecate(function(readStream, writeStream, callback) {
+-  var callbackCalled = false;
+-
+-  function call(a, b, c) {
+-    if (callback && !callbackCalled) {
+-      callback(a, b, c);
+-      callbackCalled = true;
+-    }
+-  }
+-
+-  readStream.addListener('data', function(chunk) {
+-    if (writeStream.write(chunk) === false) readStream.pause();
+-  });
+-
+-  writeStream.addListener('drain', function() {
+-    readStream.resume();
+-  });
+-
+-  readStream.addListener('end', function() {
+-    writeStream.end();
+-  });
+-
+-  readStream.addListener('close', function() {
+-    call();
+-  });
+-
+-  readStream.addListener('error', function(err) {
+-    writeStream.end();
+-    call(err);
+-  });
+-
+-  writeStream.addListener('error', function(err) {
+-    readStream.destroy();
+-    call(err);
+-  });
+-}, 'util.pump(): Use readableStream.pipe() instead');
+-
+-
+-var uv;
+-exports._errnoException = function(err, syscall) {
+-  if (isUndefined(uv)) uv = process.binding('uv');
+-  var errname = uv.errname(err);
+-  var e = new Error(syscall + ' ' + errname);
+-  e.code = errname;
+-  e.errno = errname;
+-  e.syscall = syscall;
+-  return e;
+-};
++}
\ No newline at end of file
diff --git a/node_modules/core-util-is/lib/util.js b/node_modules/core-util-is/lib/util.js
new file mode 100644
index 0000000..ff4c851
--- /dev/null
+++ b/node_modules/core-util-is/lib/util.js
@@ -0,0 +1,107 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+
+function isArray(arg) {
+  if (Array.isArray) {
+    return Array.isArray(arg);
+  }
+  return objectToString(arg) === '[object Array]';
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+  return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+  return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+  return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+  return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+  return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+  return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+  return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+  return objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+  return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+  return objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+  return (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+  return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+  return arg === null ||
+         typeof arg === 'boolean' ||
+         typeof arg === 'number' ||
+         typeof arg === 'string' ||
+         typeof arg === 'symbol' ||  // ES6 symbol
+         typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+exports.isBuffer = Buffer.isBuffer;
+
+function objectToString(o) {
+  return Object.prototype.toString.call(o);
+}
diff --git a/node_modules/core-util-is/package.json b/node_modules/core-util-is/package.json
new file mode 100644
index 0000000..6d64db9
--- /dev/null
+++ b/node_modules/core-util-is/package.json
@@ -0,0 +1,62 @@
+{
+  "_from": "core-util-is@~1.0.0",
+  "_id": "core-util-is@1.0.2",
+  "_inBundle": false,
+  "_integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+  "_location": "/core-util-is",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "core-util-is@~1.0.0",
+    "name": "core-util-is",
+    "escapedName": "core-util-is",
+    "rawSpec": "~1.0.0",
+    "saveSpec": null,
+    "fetchSpec": "~1.0.0"
+  },
+  "_requiredBy": [
+    "/readable-stream"
+  ],
+  "_resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+  "_shasum": "b5fd54220aa2bc5ab57aab7140c940754503c1a7",
+  "_spec": "core-util-is@~1.0.0",
+  "_where": "F:\\vent-display\\node_modules\\readable-stream",
+  "author": {
+    "name": "Isaac Z. Schlueter",
+    "email": "i@izs.me",
+    "url": "http://blog.izs.me/"
+  },
+  "bugs": {
+    "url": "https://github.com/isaacs/core-util-is/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "The `util.is*` functions introduced in Node v0.12.",
+  "devDependencies": {
+    "tap": "^2.3.0"
+  },
+  "homepage": "https://github.com/isaacs/core-util-is#readme",
+  "keywords": [
+    "util",
+    "isBuffer",
+    "isArray",
+    "isNumber",
+    "isString",
+    "isRegExp",
+    "isThis",
+    "isThat",
+    "polyfill"
+  ],
+  "license": "MIT",
+  "main": "lib/util.js",
+  "name": "core-util-is",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/isaacs/core-util-is.git"
+  },
+  "scripts": {
+    "test": "tap test.js"
+  },
+  "version": "1.0.2"
+}
diff --git a/node_modules/core-util-is/test.js b/node_modules/core-util-is/test.js
new file mode 100644
index 0000000..1a490c6
--- /dev/null
+++ b/node_modules/core-util-is/test.js
@@ -0,0 +1,68 @@
+var assert = require('tap');
+
+var t = require('./lib/util');
+
+assert.equal(t.isArray([]), true);
+assert.equal(t.isArray({}), false);
+
+assert.equal(t.isBoolean(null), false);
+assert.equal(t.isBoolean(true), true);
+assert.equal(t.isBoolean(false), true);
+
+assert.equal(t.isNull(null), true);
+assert.equal(t.isNull(undefined), false);
+assert.equal(t.isNull(false), false);
+assert.equal(t.isNull(), false);
+
+assert.equal(t.isNullOrUndefined(null), true);
+assert.equal(t.isNullOrUndefined(undefined), true);
+assert.equal(t.isNullOrUndefined(false), false);
+assert.equal(t.isNullOrUndefined(), true);
+
+assert.equal(t.isNumber(null), false);
+assert.equal(t.isNumber('1'), false);
+assert.equal(t.isNumber(1), true);
+
+assert.equal(t.isString(null), false);
+assert.equal(t.isString('1'), true);
+assert.equal(t.isString(1), false);
+
+assert.equal(t.isSymbol(null), false);
+assert.equal(t.isSymbol('1'), false);
+assert.equal(t.isSymbol(1), false);
+assert.equal(t.isSymbol(Symbol()), true);
+
+assert.equal(t.isUndefined(null), false);
+assert.equal(t.isUndefined(undefined), true);
+assert.equal(t.isUndefined(false), false);
+assert.equal(t.isUndefined(), true);
+
+assert.equal(t.isRegExp(null), false);
+assert.equal(t.isRegExp('1'), false);
+assert.equal(t.isRegExp(new RegExp()), true);
+
+assert.equal(t.isObject({}), true);
+assert.equal(t.isObject([]), true);
+assert.equal(t.isObject(new RegExp()), true);
+assert.equal(t.isObject(new Date()), true);
+
+assert.equal(t.isDate(null), false);
+assert.equal(t.isDate('1'), false);
+assert.equal(t.isDate(new Date()), true);
+
+assert.equal(t.isError(null), false);
+assert.equal(t.isError({ err: true }), false);
+assert.equal(t.isError(new Error()), true);
+
+assert.equal(t.isFunction(null), false);
+assert.equal(t.isFunction({ }), false);
+assert.equal(t.isFunction(function() {}), true);
+
+assert.equal(t.isPrimitive(null), true);
+assert.equal(t.isPrimitive(''), true);
+assert.equal(t.isPrimitive(0), true);
+assert.equal(t.isPrimitive(new Date()), false);
+
+assert.equal(t.isBuffer(null), false);
+assert.equal(t.isBuffer({}), false);
+assert.equal(t.isBuffer(new Buffer(0)), true);
diff --git a/node_modules/debug/LICENSE b/node_modules/debug/LICENSE
new file mode 100644
index 0000000..658c933
--- /dev/null
+++ b/node_modules/debug/LICENSE
@@ -0,0 +1,19 @@
+(The MIT License)
+
+Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
+and associated documentation files (the 'Software'), to deal in the Software without restriction, 
+including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
+and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial 
+portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 
+LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/node_modules/debug/README.md b/node_modules/debug/README.md
new file mode 100644
index 0000000..88dae35
--- /dev/null
+++ b/node_modules/debug/README.md
@@ -0,0 +1,455 @@
+# debug
+[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug)  [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master)  [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers)
+[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors)
+
+<img width="647" src="https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png">
+
+A tiny JavaScript debugging utility modelled after Node.js core's debugging
+technique. Works in Node.js and web browsers.
+
+## Installation
+
+```bash
+$ npm install debug
+```
+
+## Usage
+
+`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole.
+
+Example [_app.js_](./examples/node/app.js):
+
+```js
+var debug = require('debug')('http')
+  , http = require('http')
+  , name = 'My App';
+
+// fake app
+
+debug('booting %o', 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_](./examples/node/worker.js):
+
+```js
+var a = require('debug')('worker:a')
+  , b = require('debug')('worker:b');
+
+function work() {
+  a('doing lots of uninteresting work');
+  setTimeout(work, Math.random() * 1000);
+}
+
+work();
+
+function workb() {
+  b('doing some work');
+  setTimeout(workb, Math.random() * 2000);
+}
+
+workb();
+```
+
+The `DEBUG` environment variable is then used to enable these based on space or
+comma-delimited names.
+
+Here are some examples:
+
+<img width="647" alt="screen shot 2017-08-08 at 12 53 04 pm" src="https://user-images.githubusercontent.com/71256/29091703-a6302cdc-7c38-11e7-8304-7c0b3bc600cd.png">
+<img width="647" alt="screen shot 2017-08-08 at 12 53 38 pm" src="https://user-images.githubusercontent.com/71256/29091700-a62a6888-7c38-11e7-800b-db911291ca2b.png">
+<img width="647" alt="screen shot 2017-08-08 at 12 53 25 pm" src="https://user-images.githubusercontent.com/71256/29091701-a62ea114-7c38-11e7-826a-2692bedca740.png">
+
+#### Windows command prompt notes
+
+##### CMD
+
+On Windows the environment variable is set using the `set` command.
+
+```cmd
+set DEBUG=*,-not_this
+```
+
+Example:
+
+```cmd
+set DEBUG=* & node app.js
+```
+
+##### PowerShell (VS Code default)
+
+PowerShell uses different syntax to set environment variables.
+
+```cmd
+$env:DEBUG = "*,-not_this"
+```
+
+Example:
+
+```cmd
+$env:DEBUG='app';node app.js
+```
+
+Then, run the program to be debugged as usual.
+
+npm script example:
+```js
+  "windowsDebug": "@powershell -Command $env:DEBUG='*';node app.js",
+```
+
+## Namespace Colors
+
+Every debug instance has a color generated for it based on its namespace name.
+This helps when visually parsing the debug output to identify which debug instance
+a debug line belongs to.
+
+#### Node.js
+
+In Node.js, colors are enabled when stderr is a TTY. You also _should_ install
+the [`supports-color`](https://npmjs.org/supports-color) module alongside debug,
+otherwise debug will only use a small handful of basic colors.
+
+<img width="521" src="https://user-images.githubusercontent.com/71256/29092181-47f6a9e6-7c3a-11e7-9a14-1928d8a711cd.png">
+
+#### Web Browser
+
+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).
+
+<img width="524" src="https://user-images.githubusercontent.com/71256/29092033-b65f9f2e-7c39-11e7-8e32-f6f0d8e865c1.png">
+
+
+## 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.
+
+<img width="647" src="https://user-images.githubusercontent.com/71256/29091486-fa38524c-7c37-11e7-895f-e7ec8e1039b6.png">
+
+When stdout is not a TTY, `Date#toISOString()` is used, making it more useful for logging the debug information as shown below:
+
+<img width="647" src="https://user-images.githubusercontent.com/71256/29091956-6bd78372-7c39-11e7-8c55-c948396d6edd.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".  If you append a "*" to the end of your name, it will always be enabled regardless of the setting of the DEBUG environment variable.  You can then use it for normal output as well as debug output.
+
+## 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:".
+
+## Environment Variables
+
+When running through Node.js, you can set a few environment variables that will
+change the behavior of the debug logging:
+
+| Name      | Purpose                                         |
+|-----------|-------------------------------------------------|
+| `DEBUG`   | Enables/disables specific debugging namespaces. |
+| `DEBUG_HIDE_DATE` | Hide date from debug output (non-TTY).  |
+| `DEBUG_COLORS`| Whether or not to use colors in the debug output. |
+| `DEBUG_DEPTH` | Object inspection depth.                    |
+| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. |
+
+
+__Note:__ The environment variables beginning with `DEBUG_` end up being
+converted into an Options object that gets used with `%o`/`%O` formatters.
+See the Node.js documentation for
+[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options)
+for the complete list.
+
+## Formatters
+
+Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting.
+Below are the officially supported formatters:
+
+| Formatter | Representation |
+|-----------|----------------|
+| `%O`      | Pretty-print an Object on multiple lines. |
+| `%o`      | Pretty-print an Object all on a single line. |
+| `%s`      | String. |
+| `%d`      | Number (both integer and float). |
+| `%j`      | JSON. Replaced with the string '[Circular]' if the argument contains circular references. |
+| `%%`      | Single percent sign ('%'). This does not consume an argument. |
+
+
+### Custom formatters
+
+You can add custom formatters by extending the `debug.formatters` object.
+For example, if you wanted to add support for rendering a Buffer as hex with
+`%h`, you could do something like:
+
+```js
+const createDebug = require('debug')
+createDebug.formatters.h = (v) => {
+  return v.toString('hex')
+}
+
+// …elsewhere
+const debug = createDebug('foo')
+debug('this is hex: %h', new Buffer('hello world'))
+//   foo this is hex: 68656c6c6f20776f726c6421 +0ms
+```
+
+
+## Browser Support
+
+You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify),
+or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest),
+if you don't want to build it yourself.
+
+Debug's enable state is currently persisted by `localStorage`.
+Consider the situation shown below where you have `worker:a` and `worker:b`,
+and wish to debug both. You can enable this using `localStorage.debug`:
+
+```js
+localStorage.debug = 'worker:*'
+```
+
+And then refresh the page.
+
+```js
+a = debug('worker:a');
+b = debug('worker:b');
+
+setInterval(function(){
+  a('doing some work');
+}, 1000);
+
+setInterval(function(){
+  b('doing some work');
+}, 1200);
+```
+
+
+## Output streams
+
+  By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method:
+
+Example [_stdout.js_](./examples/node/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');
+```
+
+## Extend
+You can simply extend debugger 
+```js
+const log = require('debug')('auth');
+
+//creates new debug instance with extended namespace
+const logSign = log.extend('sign');
+const logLogin = log.extend('login');
+
+log('hello'); // auth hello
+logSign('hello'); //auth:sign hello
+logLogin('hello'); //auth:login hello
+```
+
+## Set dynamically
+
+You can also enable debug dynamically by calling the `enable()` method :
+
+```js
+let debug = require('debug');
+
+console.log(1, debug.enabled('test'));
+
+debug.enable('test');
+console.log(2, debug.enabled('test'));
+
+debug.disable();
+console.log(3, debug.enabled('test'));
+
+```
+
+print :   
+```
+1 false
+2 true
+3 false
+```
+
+Usage :  
+`enable(namespaces)`  
+`namespaces` can include modes separated by a colon and wildcards.
+   
+Note that calling `enable()` completely overrides previously set DEBUG variable : 
+
+```
+$ DEBUG=foo node -e 'var dbg = require("debug"); dbg.enable("bar"); console.log(dbg.enabled("foo"))'
+=> false
+```
+
+`disable()`
+
+Will disable all namespaces. The functions returns the namespaces currently
+enabled (and skipped). This can be useful if you want to disable debugging
+temporarily without knowing what was enabled to begin with.
+
+For example:
+
+```js
+let debug = require('debug');
+debug.enable('foo:*,-foo:bar');
+let namespaces = debug.disable();
+debug.enable(namespaces);
+```
+
+Note: There is no guarantee that the string will be identical to the initial
+enable string, but semantically they will be identical.
+
+## Checking whether a debug target is enabled
+
+After you've created a debug instance, you can determine whether or not it is
+enabled by checking the `enabled` property:
+
+```javascript
+const debug = require('debug')('http');
+
+if (debug.enabled) {
+  // do stuff...
+}
+```
+
+You can also manually toggle this property to force the debug instance to be
+enabled or disabled.
+
+
+## Authors
+
+ - TJ Holowaychuk
+ - Nathan Rajlich
+ - Andrew Rhyne
+
+## Backers
+
+Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)]
+
+<a href="https://opencollective.com/debug/backer/0/website" target="_blank"><img src="https://opencollective.com/debug/backer/0/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/1/website" target="_blank"><img src="https://opencollective.com/debug/backer/1/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/2/website" target="_blank"><img src="https://opencollective.com/debug/backer/2/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/3/website" target="_blank"><img src="https://opencollective.com/debug/backer/3/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/4/website" target="_blank"><img src="https://opencollective.com/debug/backer/4/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/5/website" target="_blank"><img src="https://opencollective.com/debug/backer/5/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/6/website" target="_blank"><img src="https://opencollective.com/debug/backer/6/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/7/website" target="_blank"><img src="https://opencollective.com/debug/backer/7/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/8/website" target="_blank"><img src="https://opencollective.com/debug/backer/8/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/9/website" target="_blank"><img src="https://opencollective.com/debug/backer/9/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/10/website" target="_blank"><img src="https://opencollective.com/debug/backer/10/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/11/website" target="_blank"><img src="https://opencollective.com/debug/backer/11/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/12/website" target="_blank"><img src="https://opencollective.com/debug/backer/12/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/13/website" target="_blank"><img src="https://opencollective.com/debug/backer/13/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/14/website" target="_blank"><img src="https://opencollective.com/debug/backer/14/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/15/website" target="_blank"><img src="https://opencollective.com/debug/backer/15/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/16/website" target="_blank"><img src="https://opencollective.com/debug/backer/16/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/17/website" target="_blank"><img src="https://opencollective.com/debug/backer/17/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/18/website" target="_blank"><img src="https://opencollective.com/debug/backer/18/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/19/website" target="_blank"><img src="https://opencollective.com/debug/backer/19/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/20/website" target="_blank"><img src="https://opencollective.com/debug/backer/20/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/21/website" target="_blank"><img src="https://opencollective.com/debug/backer/21/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/22/website" target="_blank"><img src="https://opencollective.com/debug/backer/22/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/23/website" target="_blank"><img src="https://opencollective.com/debug/backer/23/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/24/website" target="_blank"><img src="https://opencollective.com/debug/backer/24/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/25/website" target="_blank"><img src="https://opencollective.com/debug/backer/25/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/26/website" target="_blank"><img src="https://opencollective.com/debug/backer/26/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/27/website" target="_blank"><img src="https://opencollective.com/debug/backer/27/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/28/website" target="_blank"><img src="https://opencollective.com/debug/backer/28/avatar.svg"></a>
+<a href="https://opencollective.com/debug/backer/29/website" target="_blank"><img src="https://opencollective.com/debug/backer/29/avatar.svg"></a>
+
+
+## Sponsors
+
+Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)]
+
+<a href="https://opencollective.com/debug/sponsor/0/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/0/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/1/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/1/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/2/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/2/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/3/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/3/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/4/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/4/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/5/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/5/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/6/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/6/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/7/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/7/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/8/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/8/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/9/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/9/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/10/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/10/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/11/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/11/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/12/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/12/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/13/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/13/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/14/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/14/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/15/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/15/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/16/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/16/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/17/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/17/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/18/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/18/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/19/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/19/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/20/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/20/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/21/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/21/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/22/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/22/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/23/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/23/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/24/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/24/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/25/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/25/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/26/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/26/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/27/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/27/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/28/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/28/avatar.svg"></a>
+<a href="https://opencollective.com/debug/sponsor/29/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/29/avatar.svg"></a>
+
+## License
+
+(The MIT License)
+
+Copyright (c) 2014-2017 TJ Holowaychuk &lt;tj@vision-media.ca&gt;
+
+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/debug/package.json b/node_modules/debug/package.json
new file mode 100644
index 0000000..94cf800
--- /dev/null
+++ b/node_modules/debug/package.json
@@ -0,0 +1,105 @@
+{
+  "_from": "debug@^4.1.1",
+  "_id": "debug@4.3.1",
+  "_inBundle": false,
+  "_integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+  "_location": "/debug",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "debug@^4.1.1",
+    "name": "debug",
+    "escapedName": "debug",
+    "rawSpec": "^4.1.1",
+    "saveSpec": null,
+    "fetchSpec": "^4.1.1"
+  },
+  "_requiredBy": [
+    "/@serialport/binding-abstract",
+    "/@serialport/binding-mock",
+    "/@serialport/bindings",
+    "/@serialport/stream",
+    "/serialport"
+  ],
+  "_resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+  "_shasum": "f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee",
+  "_spec": "debug@^4.1.1",
+  "_where": "F:\\vent-display\\node_modules\\serialport",
+  "author": {
+    "name": "TJ Holowaychuk",
+    "email": "tj@vision-media.ca"
+  },
+  "browser": "./src/browser.js",
+  "bugs": {
+    "url": "https://github.com/visionmedia/debug/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Nathan Rajlich",
+      "email": "nathan@tootallnate.net",
+      "url": "http://n8.io"
+    },
+    {
+      "name": "Andrew Rhyne",
+      "email": "rhyneandrew@gmail.com"
+    },
+    {
+      "name": "Josh Junon",
+      "email": "josh@junon.me"
+    }
+  ],
+  "dependencies": {
+    "ms": "2.1.2"
+  },
+  "deprecated": false,
+  "description": "small debugging utility",
+  "devDependencies": {
+    "brfs": "^2.0.1",
+    "browserify": "^16.2.3",
+    "coveralls": "^3.0.2",
+    "istanbul": "^0.4.5",
+    "karma": "^3.1.4",
+    "karma-browserify": "^6.0.0",
+    "karma-chrome-launcher": "^2.2.0",
+    "karma-mocha": "^1.3.0",
+    "mocha": "^5.2.0",
+    "mocha-lcov-reporter": "^1.2.0",
+    "xo": "^0.23.0"
+  },
+  "engines": {
+    "node": ">=6.0"
+  },
+  "files": [
+    "src",
+    "LICENSE",
+    "README.md"
+  ],
+  "homepage": "https://github.com/visionmedia/debug#readme",
+  "keywords": [
+    "debug",
+    "log",
+    "debugger"
+  ],
+  "license": "MIT",
+  "main": "./src/index.js",
+  "name": "debug",
+  "peerDependenciesMeta": {
+    "supports-color": {
+      "optional": true
+    }
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/visionmedia/debug.git"
+  },
+  "scripts": {
+    "lint": "xo",
+    "test": "npm run test:node && npm run test:browser && npm run lint",
+    "test:browser": "karma start --single-run",
+    "test:coverage": "cat ./coverage/lcov.info | coveralls",
+    "test:node": "istanbul cover _mocha -- test.js"
+  },
+  "version": "4.3.1"
+}
diff --git a/node_modules/debug/src/browser.js b/node_modules/debug/src/browser.js
new file mode 100644
index 0000000..cd0fc35
--- /dev/null
+++ b/node_modules/debug/src/browser.js
@@ -0,0 +1,269 @@
+/* eslint-env browser */
+
+/**
+ * This is the web browser implementation of `debug()`.
+ */
+
+exports.formatArgs = formatArgs;
+exports.save = save;
+exports.load = load;
+exports.useColors = useColors;
+exports.storage = localstorage();
+exports.destroy = (() => {
+	let warned = false;
+
+	return () => {
+		if (!warned) {
+			warned = true;
+			console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
+		}
+	};
+})();
+
+/**
+ * Colors.
+ */
+
+exports.colors = [
+	'#0000CC',
+	'#0000FF',
+	'#0033CC',
+	'#0033FF',
+	'#0066CC',
+	'#0066FF',
+	'#0099CC',
+	'#0099FF',
+	'#00CC00',
+	'#00CC33',
+	'#00CC66',
+	'#00CC99',
+	'#00CCCC',
+	'#00CCFF',
+	'#3300CC',
+	'#3300FF',
+	'#3333CC',
+	'#3333FF',
+	'#3366CC',
+	'#3366FF',
+	'#3399CC',
+	'#3399FF',
+	'#33CC00',
+	'#33CC33',
+	'#33CC66',
+	'#33CC99',
+	'#33CCCC',
+	'#33CCFF',
+	'#6600CC',
+	'#6600FF',
+	'#6633CC',
+	'#6633FF',
+	'#66CC00',
+	'#66CC33',
+	'#9900CC',
+	'#9900FF',
+	'#9933CC',
+	'#9933FF',
+	'#99CC00',
+	'#99CC33',
+	'#CC0000',
+	'#CC0033',
+	'#CC0066',
+	'#CC0099',
+	'#CC00CC',
+	'#CC00FF',
+	'#CC3300',
+	'#CC3333',
+	'#CC3366',
+	'#CC3399',
+	'#CC33CC',
+	'#CC33FF',
+	'#CC6600',
+	'#CC6633',
+	'#CC9900',
+	'#CC9933',
+	'#CCCC00',
+	'#CCCC33',
+	'#FF0000',
+	'#FF0033',
+	'#FF0066',
+	'#FF0099',
+	'#FF00CC',
+	'#FF00FF',
+	'#FF3300',
+	'#FF3333',
+	'#FF3366',
+	'#FF3399',
+	'#FF33CC',
+	'#FF33FF',
+	'#FF6600',
+	'#FF6633',
+	'#FF9900',
+	'#FF9933',
+	'#FFCC00',
+	'#FFCC33'
+];
+
+/**
+ * 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
+ */
+
+// eslint-disable-next-line complexity
+function useColors() {
+	// NB: In an Electron preload script, document will be defined but not fully
+	// initialized. Since we know we're in Chrome, we'll just detect this case
+	// explicitly
+	if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
+		return true;
+	}
+
+	// Internet Explorer and Edge do not support colors.
+	if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
+		return false;
+	}
+
+	// Is webkit? http://stackoverflow.com/a/16459606/376773
+	// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
+	return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
+		// Is firebug? http://stackoverflow.com/a/398120/376773
+		(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
+		// Is firefox >= v31?
+		// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
+		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
+		// Double check webkit in userAgent just in case we are in a worker
+		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
+}
+
+/**
+ * Colorize log arguments if enabled.
+ *
+ * @api public
+ */
+
+function formatArgs(args) {
+	args[0] = (this.useColors ? '%c' : '') +
+		this.namespace +
+		(this.useColors ? ' %c' : ' ') +
+		args[0] +
+		(this.useColors ? '%c ' : ' ') +
+		'+' + module.exports.humanize(this.diff);
+
+	if (!this.useColors) {
+		return;
+	}
+
+	const c = 'color: ' + this.color;
+	args.splice(1, 0, c, 'color: inherit');
+
+	// 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
+	let index = 0;
+	let lastC = 0;
+	args[0].replace(/%[a-zA-Z%]/g, match => {
+		if (match === '%%') {
+			return;
+		}
+		index++;
+		if (match === '%c') {
+			// We only are interested in the *last* %c
+			// (the user may have provided their own)
+			lastC = index;
+		}
+	});
+
+	args.splice(lastC, 0, c);
+}
+
+/**
+ * Invokes `console.debug()` when available.
+ * No-op when `console.debug` is not a "function".
+ * If `console.debug` is not available, falls back
+ * to `console.log`.
+ *
+ * @api public
+ */
+exports.log = console.debug || console.log || (() => {});
+
+/**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+function save(namespaces) {
+	try {
+		if (namespaces) {
+			exports.storage.setItem('debug', namespaces);
+		} else {
+			exports.storage.removeItem('debug');
+		}
+	} catch (error) {
+		// Swallow
+		// XXX (@Qix-) should we be logging these?
+	}
+}
+
+/**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+function load() {
+	let r;
+	try {
+		r = exports.storage.getItem('debug');
+	} catch (error) {
+		// Swallow
+		// XXX (@Qix-) should we be logging these?
+	}
+
+	// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
+	if (!r && typeof process !== 'undefined' && 'env' in process) {
+		r = process.env.DEBUG;
+	}
+
+	return r;
+}
+
+/**
+ * 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 {
+		// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
+		// The Browser also has localStorage in the global context.
+		return localStorage;
+	} catch (error) {
+		// Swallow
+		// XXX (@Qix-) should we be logging these?
+	}
+}
+
+module.exports = require('./common')(exports);
+
+const {formatters} = module.exports;
+
+/**
+ * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
+ */
+
+formatters.j = function (v) {
+	try {
+		return JSON.stringify(v);
+	} catch (error) {
+		return '[UnexpectedJSONParseError]: ' + error.message;
+	}
+};
diff --git a/node_modules/debug/src/common.js b/node_modules/debug/src/common.js
new file mode 100644
index 0000000..392a8e0
--- /dev/null
+++ b/node_modules/debug/src/common.js
@@ -0,0 +1,261 @@
+
+/**
+ * This is the common logic for both the Node.js and web browser
+ * implementations of `debug()`.
+ */
+
+function setup(env) {
+	createDebug.debug = createDebug;
+	createDebug.default = createDebug;
+	createDebug.coerce = coerce;
+	createDebug.disable = disable;
+	createDebug.enable = enable;
+	createDebug.enabled = enabled;
+	createDebug.humanize = require('ms');
+	createDebug.destroy = destroy;
+
+	Object.keys(env).forEach(key => {
+		createDebug[key] = env[key];
+	});
+
+	/**
+	* The currently active debug mode names, and names to skip.
+	*/
+
+	createDebug.names = [];
+	createDebug.skips = [];
+
+	/**
+	* Map of special "%n" handling functions, for the debug "format" argument.
+	*
+	* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
+	*/
+	createDebug.formatters = {};
+
+	/**
+	* Selects a color for a debug namespace
+	* @param {String} namespace The namespace string for the for the debug instance to be colored
+	* @return {Number|String} An ANSI color code for the given namespace
+	* @api private
+	*/
+	function selectColor(namespace) {
+		let hash = 0;
+
+		for (let i = 0; i < namespace.length; i++) {
+			hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
+			hash |= 0; // Convert to 32bit integer
+		}
+
+		return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
+	}
+	createDebug.selectColor = selectColor;
+
+	/**
+	* Create a debugger with the given `namespace`.
+	*
+	* @param {String} namespace
+	* @return {Function}
+	* @api public
+	*/
+	function createDebug(namespace) {
+		let prevTime;
+		let enableOverride = null;
+
+		function debug(...args) {
+			// Disabled?
+			if (!debug.enabled) {
+				return;
+			}
+
+			const self = debug;
+
+			// Set `diff` timestamp
+			const curr = Number(new Date());
+			const ms = curr - (prevTime || curr);
+			self.diff = ms;
+			self.prev = prevTime;
+			self.curr = curr;
+			prevTime = curr;
+
+			args[0] = createDebug.coerce(args[0]);
+
+			if (typeof args[0] !== 'string') {
+				// Anything else let's inspect with %O
+				args.unshift('%O');
+			}
+
+			// Apply any `formatters` transformations
+			let index = 0;
+			args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
+				// If we encounter an escaped % then don't increase the array index
+				if (match === '%%') {
+					return '%';
+				}
+				index++;
+				const formatter = createDebug.formatters[format];
+				if (typeof formatter === 'function') {
+					const 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;
+			});
+
+			// Apply env-specific formatting (colors, etc.)
+			createDebug.formatArgs.call(self, args);
+
+			const logFn = self.log || createDebug.log;
+			logFn.apply(self, args);
+		}
+
+		debug.namespace = namespace;
+		debug.useColors = createDebug.useColors();
+		debug.color = createDebug.selectColor(namespace);
+		debug.extend = extend;
+		debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.
+
+		Object.defineProperty(debug, 'enabled', {
+			enumerable: true,
+			configurable: false,
+			get: () => enableOverride === null ? createDebug.enabled(namespace) : enableOverride,
+			set: v => {
+				enableOverride = v;
+			}
+		});
+
+		// Env-specific initialization logic for debug instances
+		if (typeof createDebug.init === 'function') {
+			createDebug.init(debug);
+		}
+
+		return debug;
+	}
+
+	function extend(namespace, delimiter) {
+		const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
+		newDebug.log = this.log;
+		return newDebug;
+	}
+
+	/**
+	* Enables a debug mode by namespaces. This can include modes
+	* separated by a colon and wildcards.
+	*
+	* @param {String} namespaces
+	* @api public
+	*/
+	function enable(namespaces) {
+		createDebug.save(namespaces);
+
+		createDebug.names = [];
+		createDebug.skips = [];
+
+		let i;
+		const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
+		const len = split.length;
+
+		for (i = 0; i < len; i++) {
+			if (!split[i]) {
+				// ignore empty strings
+				continue;
+			}
+
+			namespaces = split[i].replace(/\*/g, '.*?');
+
+			if (namespaces[0] === '-') {
+				createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
+			} else {
+				createDebug.names.push(new RegExp('^' + namespaces + '$'));
+			}
+		}
+	}
+
+	/**
+	* Disable debug output.
+	*
+	* @return {String} namespaces
+	* @api public
+	*/
+	function disable() {
+		const namespaces = [
+			...createDebug.names.map(toNamespace),
+			...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)
+		].join(',');
+		createDebug.enable('');
+		return namespaces;
+	}
+
+	/**
+	* Returns true if the given mode name is enabled, false otherwise.
+	*
+	* @param {String} name
+	* @return {Boolean}
+	* @api public
+	*/
+	function enabled(name) {
+		if (name[name.length - 1] === '*') {
+			return true;
+		}
+
+		let i;
+		let len;
+
+		for (i = 0, len = createDebug.skips.length; i < len; i++) {
+			if (createDebug.skips[i].test(name)) {
+				return false;
+			}
+		}
+
+		for (i = 0, len = createDebug.names.length; i < len; i++) {
+			if (createDebug.names[i].test(name)) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	* Convert regexp to namespace
+	*
+	* @param {RegExp} regxep
+	* @return {String} namespace
+	* @api private
+	*/
+	function toNamespace(regexp) {
+		return regexp.toString()
+			.substring(2, regexp.toString().length - 2)
+			.replace(/\.\*\?$/, '*');
+	}
+
+	/**
+	* Coerce `val`.
+	*
+	* @param {Mixed} val
+	* @return {Mixed}
+	* @api private
+	*/
+	function coerce(val) {
+		if (val instanceof Error) {
+			return val.stack || val.message;
+		}
+		return val;
+	}
+
+	/**
+	* XXX DO NOT USE. This is a temporary stub function.
+	* XXX It WILL be removed in the next major release.
+	*/
+	function destroy() {
+		console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
+	}
+
+	createDebug.enable(createDebug.load());
+
+	return createDebug;
+}
+
+module.exports = setup;
diff --git a/node_modules/debug/src/index.js b/node_modules/debug/src/index.js
new file mode 100644
index 0000000..bf4c57f
--- /dev/null
+++ b/node_modules/debug/src/index.js
@@ -0,0 +1,10 @@
+/**
+ * Detect Electron renderer / nwjs process, which is node, but we should
+ * treat as a browser.
+ */
+
+if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
+	module.exports = require('./browser.js');
+} else {
+	module.exports = require('./node.js');
+}
diff --git a/node_modules/debug/src/node.js b/node_modules/debug/src/node.js
new file mode 100644
index 0000000..79bc085
--- /dev/null
+++ b/node_modules/debug/src/node.js
@@ -0,0 +1,263 @@
+/**
+ * Module dependencies.
+ */
+
+const tty = require('tty');
+const util = require('util');
+
+/**
+ * This is the Node.js implementation of `debug()`.
+ */
+
+exports.init = init;
+exports.log = log;
+exports.formatArgs = formatArgs;
+exports.save = save;
+exports.load = load;
+exports.useColors = useColors;
+exports.destroy = util.deprecate(
+	() => {},
+	'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'
+);
+
+/**
+ * Colors.
+ */
+
+exports.colors = [6, 2, 3, 4, 5, 1];
+
+try {
+	// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
+	// eslint-disable-next-line import/no-extraneous-dependencies
+	const supportsColor = require('supports-color');
+
+	if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
+		exports.colors = [
+			20,
+			21,
+			26,
+			27,
+			32,
+			33,
+			38,
+			39,
+			40,
+			41,
+			42,
+			43,
+			44,
+			45,
+			56,
+			57,
+			62,
+			63,
+			68,
+			69,
+			74,
+			75,
+			76,
+			77,
+			78,
+			79,
+			80,
+			81,
+			92,
+			93,
+			98,
+			99,
+			112,
+			113,
+			128,
+			129,
+			134,
+			135,
+			148,
+			149,
+			160,
+			161,
+			162,
+			163,
+			164,
+			165,
+			166,
+			167,
+			168,
+			169,
+			170,
+			171,
+			172,
+			173,
+			178,
+			179,
+			184,
+			185,
+			196,
+			197,
+			198,
+			199,
+			200,
+			201,
+			202,
+			203,
+			204,
+			205,
+			206,
+			207,
+			208,
+			209,
+			214,
+			215,
+			220,
+			221
+		];
+	}
+} catch (error) {
+	// Swallow - we only care if `supports-color` is available; it doesn't have to be.
+}
+
+/**
+ * Build up the default `inspectOpts` object from the environment variables.
+ *
+ *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
+ */
+
+exports.inspectOpts = Object.keys(process.env).filter(key => {
+	return /^debug_/i.test(key);
+}).reduce((obj, key) => {
+	// Camel-case
+	const prop = key
+		.substring(6)
+		.toLowerCase()
+		.replace(/_([a-z])/g, (_, k) => {
+			return k.toUpperCase();
+		});
+
+	// Coerce string value into JS value
+	let val = process.env[key];
+	if (/^(yes|on|true|enabled)$/i.test(val)) {
+		val = true;
+	} else if (/^(no|off|false|disabled)$/i.test(val)) {
+		val = false;
+	} else if (val === 'null') {
+		val = null;
+	} else {
+		val = Number(val);
+	}
+
+	obj[prop] = val;
+	return obj;
+}, {});
+
+/**
+ * Is stdout a TTY? Colored output is enabled when `true`.
+ */
+
+function useColors() {
+	return 'colors' in exports.inspectOpts ?
+		Boolean(exports.inspectOpts.colors) :
+		tty.isatty(process.stderr.fd);
+}
+
+/**
+ * Adds ANSI color escape codes if enabled.
+ *
+ * @api public
+ */
+
+function formatArgs(args) {
+	const {namespace: name, useColors} = this;
+
+	if (useColors) {
+		const c = this.color;
+		const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
+		const prefix = `  ${colorCode};1m${name} \u001B[0m`;
+
+		args[0] = prefix + args[0].split('\n').join('\n' + prefix);
+		args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
+	} else {
+		args[0] = getDate() + name + ' ' + args[0];
+	}
+}
+
+function getDate() {
+	if (exports.inspectOpts.hideDate) {
+		return '';
+	}
+	return new Date().toISOString() + ' ';
+}
+
+/**
+ * Invokes `util.format()` with the specified arguments and writes to stderr.
+ */
+
+function log(...args) {
+	return process.stderr.write(util.format(...args) + '\n');
+}
+
+/**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+function save(namespaces) {
+	if (namespaces) {
+		process.env.DEBUG = namespaces;
+	} else {
+		// 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;
+	}
+}
+
+/**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+
+function load() {
+	return process.env.DEBUG;
+}
+
+/**
+ * Init logic for `debug` instances.
+ *
+ * Create a new `inspectOpts` object in case `useColors` is set
+ * differently for a particular `debug` instance.
+ */
+
+function init(debug) {
+	debug.inspectOpts = {};
+
+	const keys = Object.keys(exports.inspectOpts);
+	for (let i = 0; i < keys.length; i++) {
+		debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
+	}
+}
+
+module.exports = require('./common')(exports);
+
+const {formatters} = module.exports;
+
+/**
+ * Map %o to `util.inspect()`, all on a single line.
+ */
+
+formatters.o = function (v) {
+	this.inspectOpts.colors = this.useColors;
+	return util.inspect(v, this.inspectOpts)
+		.split('\n')
+		.map(str => str.trim())
+		.join(' ');
+};
+
+/**
+ * Map %O to `util.inspect()`, allowing multiple lines if needed.
+ */
+
+formatters.O = function (v) {
+	this.inspectOpts.colors = this.useColors;
+	return util.inspect(v, this.inspectOpts);
+};
diff --git a/node_modules/decompress-response/index.d.ts b/node_modules/decompress-response/index.d.ts
new file mode 100644
index 0000000..18918fa
--- /dev/null
+++ b/node_modules/decompress-response/index.d.ts
@@ -0,0 +1,29 @@
+/// <reference types="node"/>
+import {IncomingMessage} from 'http';
+
+declare const decompressResponse: {
+	/**
+	Decompress a HTTP response if needed.
+
+	@param response - The HTTP incoming stream with compressed data.
+	@returns The decompressed HTTP response stream.
+
+	@example
+	```
+	import {http} from 'http';
+	import decompressResponse = require('decompress-response');
+
+	http.get('https://sindresorhus.com', response => {
+		response = decompressResponse(response);
+	});
+	```
+	*/
+	(response: IncomingMessage): IncomingMessage;
+
+	// TODO: remove this in the next major version, refactor the whole definition to:
+	// declare function decompressResponse(response: IncomingMessage): IncomingMessage;
+	// export = decompressResponse;
+	default: typeof decompressResponse;
+};
+
+export = decompressResponse;
diff --git a/node_modules/decompress-response/index.js b/node_modules/decompress-response/index.js
new file mode 100644
index 0000000..0379dc5
--- /dev/null
+++ b/node_modules/decompress-response/index.js
@@ -0,0 +1,40 @@
+'use strict';
+const {PassThrough: PassThroughStream} = require('stream');
+const zlib = require('zlib');
+const mimicResponse = require('mimic-response');
+
+const decompressResponse = response => {
+	const contentEncoding = (response.headers['content-encoding'] || '').toLowerCase();
+
+	if (!['gzip', 'deflate', 'br'].includes(contentEncoding)) {
+		return response;
+	}
+
+	const isBrotli = contentEncoding === 'br';
+	if (isBrotli && typeof zlib.createBrotliDecompress !== 'function') {
+		return response;
+	}
+
+	const decompress = isBrotli ? zlib.createBrotliDecompress() : zlib.createUnzip();
+	const stream = new PassThroughStream();
+
+	mimicResponse(response, stream);
+
+	decompress.on('error', error => {
+		// Ignore empty response
+		if (error.code === 'Z_BUF_ERROR') {
+			stream.end();
+			return;
+		}
+
+		stream.emit('error', error);
+	});
+
+	response.pipe(decompress).pipe(stream);
+
+	return stream;
+};
+
+module.exports = decompressResponse;
+// TODO: remove this in the next major version
+module.exports.default = decompressResponse;
diff --git a/node_modules/decompress-response/license b/node_modules/decompress-response/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/decompress-response/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/decompress-response/package.json b/node_modules/decompress-response/package.json
new file mode 100644
index 0000000..07a613e
--- /dev/null
+++ b/node_modules/decompress-response/package.json
@@ -0,0 +1,82 @@
+{
+  "_from": "decompress-response@^4.2.0",
+  "_id": "decompress-response@4.2.1",
+  "_inBundle": false,
+  "_integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
+  "_location": "/decompress-response",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "decompress-response@^4.2.0",
+    "name": "decompress-response",
+    "escapedName": "decompress-response",
+    "rawSpec": "^4.2.0",
+    "saveSpec": null,
+    "fetchSpec": "^4.2.0"
+  },
+  "_requiredBy": [
+    "/simple-get"
+  ],
+  "_resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
+  "_shasum": "414023cc7a302da25ce2ec82d0d5238ccafd8986",
+  "_spec": "decompress-response@^4.2.0",
+  "_where": "F:\\vent-display\\node_modules\\simple-get",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "bugs": {
+    "url": "https://github.com/sindresorhus/decompress-response/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "mimic-response": "^2.0.0"
+  },
+  "deprecated": false,
+  "description": "Decompress a HTTP response if needed",
+  "devDependencies": {
+    "@types/node": "^12.7.1",
+    "ava": "^2.2.0",
+    "get-stream": "^5.0.0",
+    "pify": "^4.0.1",
+    "tsd": "^0.7.1",
+    "xo": "^0.24.0"
+  },
+  "engines": {
+    "node": ">=8"
+  },
+  "files": [
+    "index.js",
+    "index.d.ts"
+  ],
+  "homepage": "https://github.com/sindresorhus/decompress-response#readme",
+  "keywords": [
+    "decompress",
+    "response",
+    "http",
+    "https",
+    "zlib",
+    "gzip",
+    "zip",
+    "deflate",
+    "unzip",
+    "ungzip",
+    "incoming",
+    "message",
+    "stream",
+    "compressed",
+    "brotli"
+  ],
+  "license": "MIT",
+  "name": "decompress-response",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/sindresorhus/decompress-response.git"
+  },
+  "scripts": {
+    "test": "xo && ava && tsd"
+  },
+  "version": "4.2.1"
+}
diff --git a/node_modules/decompress-response/readme.md b/node_modules/decompress-response/readme.md
new file mode 100644
index 0000000..c87431a
--- /dev/null
+++ b/node_modules/decompress-response/readme.md
@@ -0,0 +1,52 @@
+# decompress-response [![Build Status](https://travis-ci.org/sindresorhus/decompress-response.svg?branch=master)](https://travis-ci.org/sindresorhus/decompress-response)
+
+> Decompress a HTTP response if needed
+
+Decompresses the [response](https://nodejs.org/api/http.html#http_class_http_incomingmessage) from [`http.request`](https://nodejs.org/api/http.html#http_http_request_options_callback) if it's gzipped, deflated or compressed with Brotli, otherwise just passes it through.
+
+Used by [`got`](https://github.com/sindresorhus/got).
+
+
+## Install
+
+```
+$ npm install decompress-response
+```
+
+
+## Usage
+
+```js
+const http = require('http');
+const decompressResponse = require('decompress-response');
+
+http.get('https://sindresorhus.com', response => {
+	response = decompressResponse(response);
+});
+```
+
+
+## API
+
+### decompressResponse(response)
+
+Returns the decompressed HTTP response stream.
+
+#### response
+
+Type: [`http.IncomingMessage`](https://nodejs.org/api/http.html#http_class_http_incomingmessage)
+
+The HTTP incoming stream with compressed data.
+
+
+---
+
+<div align="center">
+	<b>
+		<a href="https://tidelift.com/subscription/pkg/npm-unzip-response?utm_source=npm-unzip-response&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
+	</b>
+	<br>
+	<sub>
+		Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
+	</sub>
+</div>
diff --git a/node_modules/deep-extend/CHANGELOG.md b/node_modules/deep-extend/CHANGELOG.md
new file mode 100644
index 0000000..dd13ec1
--- /dev/null
+++ b/node_modules/deep-extend/CHANGELOG.md
@@ -0,0 +1,46 @@
+Changelog
+=========
+
+v0.6.0
+------
+
+- Updated "devDependencies" versions to fix vulnerability alerts
+- Dropped support of io.js and node.js v0.12.x and lower since new versions of
+  "devDependencies" couldn't work with those old node.js versions
+  (minimal supported version of node.js now is v4.0.0)
+
+v0.5.1
+------
+
+- Fix prototype pollution vulnerability (thanks to @mwakerman for the PR)
+- Avoid using deprecated Buffer API (thanks to @ChALkeR for the PR)
+
+v0.5.0
+------
+
+- Auto-testing provided by Travis CI;
+- Support older Node.JS versions (`v0.11.x` and `v0.10.x`);
+- Removed tests files from npm package.
+
+v0.4.2
+------
+
+- Fix for `null` as an argument.
+
+v0.4.1
+------
+
+- Removed test code from <b>npm</b> package
+  ([see pull request #21](https://github.com/unclechu/node-deep-extend/pull/21));
+- Increased minimal version of Node from `0.4.0` to `0.12.0`
+  (because can't run tests on lesser version anyway).
+
+v0.4.0
+------
+
+- **WARNING!** Broken backward compatibility with `v0.3.x`;
+- Fixed bug with extending arrays instead of cloning;
+- Deep cloning for arrays;
+- Check for own property;
+- Fixed some documentation issues;
+- Strict JS mode.
diff --git a/node_modules/deep-extend/LICENSE b/node_modules/deep-extend/LICENSE
new file mode 100644
index 0000000..5c58916
--- /dev/null
+++ b/node_modules/deep-extend/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2013-2018, Viacheslav Lotsmanov
+
+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/deep-extend/README.md b/node_modules/deep-extend/README.md
new file mode 100644
index 0000000..67c7fc0
--- /dev/null
+++ b/node_modules/deep-extend/README.md
@@ -0,0 +1,91 @@
+Deep Extend
+===========
+
+Recursive object extending.
+
+[![Build Status](https://api.travis-ci.org/unclechu/node-deep-extend.svg?branch=master)](https://travis-ci.org/unclechu/node-deep-extend)
+
+[![NPM](https://nodei.co/npm/deep-extend.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/deep-extend/)
+
+Install
+-------
+
+```bash
+$ npm install deep-extend
+```
+
+Usage
+-----
+
+```javascript
+var deepExtend = require('deep-extend');
+var obj1 = {
+  a: 1,
+  b: 2,
+  d: {
+    a: 1,
+    b: [],
+    c: { test1: 123, test2: 321 }
+  },
+  f: 5,
+  g: 123,
+  i: 321,
+  j: [1, 2]
+};
+var obj2 = {
+  b: 3,
+  c: 5,
+  d: {
+    b: { first: 'one', second: 'two' },
+    c: { test2: 222 }
+  },
+  e: { one: 1, two: 2 },
+  f: [],
+  g: (void 0),
+  h: /abc/g,
+  i: null,
+  j: [3, 4]
+};
+
+deepExtend(obj1, obj2);
+
+console.log(obj1);
+/*
+{ a: 1,
+  b: 3,
+  d:
+   { a: 1,
+     b: { first: 'one', second: 'two' },
+     c: { test1: 123, test2: 222 } },
+  f: [],
+  g: undefined,
+  c: 5,
+  e: { one: 1, two: 2 },
+  h: /abc/g,
+  i: null,
+  j: [3, 4] }
+*/
+```
+
+Unit testing
+------------
+
+```bash
+$ npm test
+```
+
+Changelog
+---------
+
+[CHANGELOG.md](./CHANGELOG.md)
+
+Any issues?
+-----------
+
+Please, report about issues
+[here](https://github.com/unclechu/node-deep-extend/issues).
+
+License
+-------
+
+[MIT](./LICENSE)
diff --git a/node_modules/deep-extend/index.js b/node_modules/deep-extend/index.js
new file mode 100644
index 0000000..762d81e
--- /dev/null
+++ b/node_modules/deep-extend/index.js
@@ -0,0 +1 @@
+module.exports = require('./lib/deep-extend');
diff --git a/node_modules/deep-extend/lib/deep-extend.js b/node_modules/deep-extend/lib/deep-extend.js
new file mode 100644
index 0000000..651fd8d
--- /dev/null
+++ b/node_modules/deep-extend/lib/deep-extend.js
@@ -0,0 +1,150 @@
+/*!
+ * @description Recursive object extending
+ * @author Viacheslav Lotsmanov <lotsmanov89@gmail.com>
+ * @license MIT
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2013-2018 Viacheslav Lotsmanov
+ *
+ * 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.
+ */
+
+'use strict';
+
+function isSpecificValue(val) {
+	return (
+		val instanceof Buffer
+		|| val instanceof Date
+		|| val instanceof RegExp
+	) ? true : false;
+}
+
+function cloneSpecificValue(val) {
+	if (val instanceof Buffer) {
+		var x = Buffer.alloc
+			? Buffer.alloc(val.length)
+			: new Buffer(val.length);
+		val.copy(x);
+		return x;
+	} else if (val instanceof Date) {
+		return new Date(val.getTime());
+	} else if (val instanceof RegExp) {
+		return new RegExp(val);
+	} else {
+		throw new Error('Unexpected situation');
+	}
+}
+
+/**
+ * Recursive cloning array.
+ */
+function deepCloneArray(arr) {
+	var clone = [];
+	arr.forEach(function (item, index) {
+		if (typeof item === 'object' && item !== null) {
+			if (Array.isArray(item)) {
+				clone[index] = deepCloneArray(item);
+			} else if (isSpecificValue(item)) {
+				clone[index] = cloneSpecificValue(item);
+			} else {
+				clone[index] = deepExtend({}, item);
+			}
+		} else {
+			clone[index] = item;
+		}
+	});
+	return clone;
+}
+
+function safeGetProperty(object, property) {
+	return property === '__proto__' ? undefined : object[property];
+}
+
+/**
+ * Extening object that entered in first argument.
+ *
+ * Returns extended object or false if have no target object or incorrect type.
+ *
+ * If you wish to clone source object (without modify it), just use empty new
+ * object as first argument, like this:
+ *   deepExtend({}, yourObj_1, [yourObj_N]);
+ */
+var deepExtend = module.exports = function (/*obj_1, [obj_2], [obj_N]*/) {
+	if (arguments.length < 1 || typeof arguments[0] !== 'object') {
+		return false;
+	}
+
+	if (arguments.length < 2) {
+		return arguments[0];
+	}
+
+	var target = arguments[0];
+
+	// convert arguments to array and cut off target object
+	var args = Array.prototype.slice.call(arguments, 1);
+
+	var val, src, clone;
+
+	args.forEach(function (obj) {
+		// skip argument if isn't an object, is null, or is an array
+		if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {
+			return;
+		}
+
+		Object.keys(obj).forEach(function (key) {
+			src = safeGetProperty(target, key); // source value
+			val = safeGetProperty(obj, key); // new value
+
+			// recursion prevention
+			if (val === target) {
+				return;
+
+			/**
+			 * if new value isn't object then just overwrite by new value
+			 * instead of extending.
+			 */
+			} else if (typeof val !== 'object' || val === null) {
+				target[key] = val;
+				return;
+
+			// just clone arrays (and recursive clone objects inside)
+			} else if (Array.isArray(val)) {
+				target[key] = deepCloneArray(val);
+				return;
+
+			// custom cloning and overwrite for specific objects
+			} else if (isSpecificValue(val)) {
+				target[key] = cloneSpecificValue(val);
+				return;
+
+			// overwrite by new value if source isn't object or array
+			} else if (typeof src !== 'object' || src === null || Array.isArray(src)) {
+				target[key] = deepExtend({}, val);
+				return;
+
+			// source value and new value is objects both, extending...
+			} else {
+				target[key] = deepExtend(src, val);
+				return;
+			}
+		});
+	});
+
+	return target;
+};
diff --git a/node_modules/deep-extend/package.json b/node_modules/deep-extend/package.json
new file mode 100644
index 0000000..f7dbbcc
--- /dev/null
+++ b/node_modules/deep-extend/package.json
@@ -0,0 +1,92 @@
+{
+  "_from": "deep-extend@^0.6.0",
+  "_id": "deep-extend@0.6.0",
+  "_inBundle": false,
+  "_integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+  "_location": "/deep-extend",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "deep-extend@^0.6.0",
+    "name": "deep-extend",
+    "escapedName": "deep-extend",
+    "rawSpec": "^0.6.0",
+    "saveSpec": null,
+    "fetchSpec": "^0.6.0"
+  },
+  "_requiredBy": [
+    "/rc"
+  ],
+  "_resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+  "_shasum": "c4fa7c95404a17a9c3e8ca7e1537312b736330ac",
+  "_spec": "deep-extend@^0.6.0",
+  "_where": "F:\\vent-display\\node_modules\\rc",
+  "author": {
+    "name": "Viacheslav Lotsmanov",
+    "email": "lotsmanov89@gmail.com"
+  },
+  "bugs": {
+    "url": "https://github.com/unclechu/node-deep-extend/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Romain Prieto",
+      "url": "https://github.com/rprieto"
+    },
+    {
+      "name": "Max Maximov",
+      "url": "https://github.com/maxmaximov"
+    },
+    {
+      "name": "Marshall Bowers",
+      "url": "https://github.com/maxdeviant"
+    },
+    {
+      "name": "Misha Wakerman",
+      "url": "https://github.com/mwakerman"
+    }
+  ],
+  "deprecated": false,
+  "description": "Recursive object extending",
+  "devDependencies": {
+    "mocha": "5.2.0",
+    "should": "13.2.1"
+  },
+  "engines": {
+    "node": ">=4.0.0"
+  },
+  "files": [
+    "index.js",
+    "lib/"
+  ],
+  "homepage": "https://github.com/unclechu/node-deep-extend",
+  "keywords": [
+    "deep-extend",
+    "extend",
+    "deep",
+    "recursive",
+    "xtend",
+    "clone",
+    "merge",
+    "json"
+  ],
+  "license": "MIT",
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "https://raw.githubusercontent.com/unclechu/node-deep-extend/master/LICENSE"
+    }
+  ],
+  "main": "lib/deep-extend.js",
+  "name": "deep-extend",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/unclechu/node-deep-extend.git"
+  },
+  "scripts": {
+    "test": "mocha"
+  },
+  "version": "0.6.0"
+}
diff --git a/node_modules/delegates/.npmignore b/node_modules/delegates/.npmignore
new file mode 100644
index 0000000..c2658d7
--- /dev/null
+++ b/node_modules/delegates/.npmignore
@@ -0,0 +1 @@
+node_modules/
diff --git a/node_modules/delegates/History.md b/node_modules/delegates/History.md
new file mode 100644
index 0000000..25959ea
--- /dev/null
+++ b/node_modules/delegates/History.md
@@ -0,0 +1,22 @@
+
+1.0.0 / 2015-12-14
+==================
+
+  * Merge pull request #12 from kasicka/master
+  * Add license text
+
+0.1.0 / 2014-10-17
+==================
+
+ * adds `.fluent()` to api
+
+0.0.3 / 2014-01-13
+==================
+
+ * fix receiver for .method()
+
+0.0.2 / 2014-01-13
+==================
+
+ * Object.defineProperty() sucks
+ * Initial commit
diff --git a/node_modules/delegates/License b/node_modules/delegates/License
new file mode 100644
index 0000000..60de60a
--- /dev/null
+++ b/node_modules/delegates/License
@@ -0,0 +1,20 @@
+Copyright (c) 2015 TJ Holowaychuk <tj@vision-media.ca>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/delegates/Makefile b/node_modules/delegates/Makefile
new file mode 100644
index 0000000..a9dcfd5
--- /dev/null
+++ b/node_modules/delegates/Makefile
@@ -0,0 +1,8 @@
+
+test:
+	@./node_modules/.bin/mocha \
+		--require should \
+		--reporter spec \
+		--bail
+
+.PHONY: test
\ No newline at end of file
diff --git a/node_modules/delegates/Readme.md b/node_modules/delegates/Readme.md
new file mode 100644
index 0000000..ab8cf4a
--- /dev/null
+++ b/node_modules/delegates/Readme.md
@@ -0,0 +1,94 @@
+
+# delegates
+
+  Node method and accessor delegation utilty.
+
+## Installation
+
+```
+$ npm install delegates
+```
+
+## Example
+
+```js
+var delegate = require('delegates');
+
+...
+
+delegate(proto, 'request')
+  .method('acceptsLanguages')
+  .method('acceptsEncodings')
+  .method('acceptsCharsets')
+  .method('accepts')
+  .method('is')
+  .access('querystring')
+  .access('idempotent')
+  .access('socket')
+  .access('length')
+  .access('query')
+  .access('search')
+  .access('status')
+  .access('method')
+  .access('path')
+  .access('body')
+  .access('host')
+  .access('url')
+  .getter('subdomains')
+  .getter('protocol')
+  .getter('header')
+  .getter('stale')
+  .getter('fresh')
+  .getter('secure')
+  .getter('ips')
+  .getter('ip')
+```
+
+# API
+
+## Delegate(proto, prop)
+
+Creates a delegator instance used to configure using the `prop` on the given
+`proto` object. (which is usually a prototype)
+
+## Delegate#method(name)
+
+Allows the given method `name` to be accessed on the host.
+
+## Delegate#getter(name)
+
+Creates a "getter" for the property with the given `name` on the delegated
+object.
+
+## Delegate#setter(name)
+
+Creates a "setter" for the property with the given `name` on the delegated
+object.
+
+## Delegate#access(name)
+
+Creates an "accessor" (ie: both getter *and* setter) for the property with the
+given `name` on the delegated object.
+
+## Delegate#fluent(name)
+
+A unique type of "accessor" that works for a "fluent" API. When called as a
+getter, the method returns the expected value. However, if the method is called
+with a value, it will return itself so it can be chained. For example:
+
+```js
+delegate(proto, 'request')
+  .fluent('query')
+
+// getter
+var q = request.query();
+
+// setter (chainable)
+request
+  .query({ a: 1 })
+  .query({ b: 2 });
+```
+
+# License
+
+  MIT
diff --git a/node_modules/delegates/index.js b/node_modules/delegates/index.js
new file mode 100644
index 0000000..17c222d
--- /dev/null
+++ b/node_modules/delegates/index.js
@@ -0,0 +1,121 @@
+
+/**
+ * Expose `Delegator`.
+ */
+
+module.exports = Delegator;
+
+/**
+ * Initialize a delegator.
+ *
+ * @param {Object} proto
+ * @param {String} target
+ * @api public
+ */
+
+function Delegator(proto, target) {
+  if (!(this instanceof Delegator)) return new Delegator(proto, target);
+  this.proto = proto;
+  this.target = target;
+  this.methods = [];
+  this.getters = [];
+  this.setters = [];
+  this.fluents = [];
+}
+
+/**
+ * Delegate method `name`.
+ *
+ * @param {String} name
+ * @return {Delegator} self
+ * @api public
+ */
+
+Delegator.prototype.method = function(name){
+  var proto = this.proto;
+  var target = this.target;
+  this.methods.push(name);
+
+  proto[name] = function(){
+    return this[target][name].apply(this[target], arguments);
+  };
+
+  return this;
+};
+
+/**
+ * Delegator accessor `name`.
+ *
+ * @param {String} name
+ * @return {Delegator} self
+ * @api public
+ */
+
+Delegator.prototype.access = function(name){
+  return this.getter(name).setter(name);
+};
+
+/**
+ * Delegator getter `name`.
+ *
+ * @param {String} name
+ * @return {Delegator} self
+ * @api public
+ */
+
+Delegator.prototype.getter = function(name){
+  var proto = this.proto;
+  var target = this.target;
+  this.getters.push(name);
+
+  proto.__defineGetter__(name, function(){
+    return this[target][name];
+  });
+
+  return this;
+};
+
+/**
+ * Delegator setter `name`.
+ *
+ * @param {String} name
+ * @return {Delegator} self
+ * @api public
+ */
+
+Delegator.prototype.setter = function(name){
+  var proto = this.proto;
+  var target = this.target;
+  this.setters.push(name);
+
+  proto.__defineSetter__(name, function(val){
+    return this[target][name] = val;
+  });
+
+  return this;
+};
+
+/**
+ * Delegator fluent accessor
+ *
+ * @param {String} name
+ * @return {Delegator} self
+ * @api public
+ */
+
+Delegator.prototype.fluent = function (name) {
+  var proto = this.proto;
+  var target = this.target;
+  this.fluents.push(name);
+
+  proto[name] = function(val){
+    if ('undefined' != typeof val) {
+      this[target][name] = val;
+      return this;
+    } else {
+      return this[target][name];
+    }
+  };
+
+  return this;
+};
diff --git a/node_modules/delegates/package.json b/node_modules/delegates/package.json
new file mode 100644
index 0000000..fbe8fb7
--- /dev/null
+++ b/node_modules/delegates/package.json
@@ -0,0 +1,48 @@
+{
+  "_from": "delegates@^1.0.0",
+  "_id": "delegates@1.0.0",
+  "_inBundle": false,
+  "_integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+  "_location": "/delegates",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "delegates@^1.0.0",
+    "name": "delegates",
+    "escapedName": "delegates",
+    "rawSpec": "^1.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.0"
+  },
+  "_requiredBy": [
+    "/are-we-there-yet"
+  ],
+  "_resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+  "_shasum": "84c6e159b81904fdca59a0ef44cd870d31250f9a",
+  "_spec": "delegates@^1.0.0",
+  "_where": "F:\\vent-display\\node_modules\\are-we-there-yet",
+  "bugs": {
+    "url": "https://github.com/visionmedia/node-delegates/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {},
+  "deprecated": false,
+  "description": "delegate methods and accessors to another property",
+  "devDependencies": {
+    "mocha": "*",
+    "should": "*"
+  },
+  "homepage": "https://github.com/visionmedia/node-delegates#readme",
+  "keywords": [
+    "delegate",
+    "delegation"
+  ],
+  "license": "MIT",
+  "name": "delegates",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/visionmedia/node-delegates.git"
+  },
+  "version": "1.0.0"
+}
diff --git a/node_modules/delegates/test/index.js b/node_modules/delegates/test/index.js
new file mode 100644
index 0000000..7b6e3d4
--- /dev/null
+++ b/node_modules/delegates/test/index.js
@@ -0,0 +1,94 @@
+
+var assert = require('assert');
+var delegate = require('..');
+
+describe('.method(name)', function(){
+  it('should delegate methods', function(){
+    var obj = {};
+
+    obj.request = {
+      foo: function(bar){
+        assert(this == obj.request);
+        return bar;
+      }
+    };
+
+    delegate(obj, 'request').method('foo');
+
+    obj.foo('something').should.equal('something');
+  })
+})
+
+describe('.getter(name)', function(){
+  it('should delegate getters', function(){
+    var obj = {};
+
+    obj.request = {
+      get type() {
+        return 'text/html';
+      }
+    }
+
+    delegate(obj, 'request').getter('type');
+
+    obj.type.should.equal('text/html');
+  })
+})
+
+describe('.setter(name)', function(){
+  it('should delegate setters', function(){
+    var obj = {};
+
+    obj.request = {
+      get type() {
+        return this._type.toUpperCase();
+      },
+
+      set type(val) {
+        this._type = val;
+      }
+    }
+
+    delegate(obj, 'request').setter('type');
+
+    obj.type = 'hey';
+    obj.request.type.should.equal('HEY');
+  })
+})
+
+describe('.access(name)', function(){
+  it('should delegate getters and setters', function(){
+    var obj = {};
+
+    obj.request = {
+      get type() {
+        return this._type.toUpperCase();
+      },
+
+      set type(val) {
+        this._type = val;
+      }
+    }
+
+    delegate(obj, 'request').access('type');
+
+    obj.type = 'hey';
+    obj.type.should.equal('HEY');
+  })
+})
+
+describe('.fluent(name)', function () {
+  it('should delegate in a fluent fashion', function () {
+    var obj = {
+      settings: {
+        env: 'development'
+      }
+    };
+
+    delegate(obj, 'settings').fluent('env');
+
+    obj.env().should.equal('development');
+    obj.env('production').should.equal(obj);
+    obj.settings.env.should.equal('production');
+  })
+})
diff --git a/node_modules/detect-libc/.npmignore b/node_modules/detect-libc/.npmignore
new file mode 100644
index 0000000..8fc0e8d
--- /dev/null
+++ b/node_modules/detect-libc/.npmignore
@@ -0,0 +1,7 @@
+.nyc_output
+.travis.yml
+coverage
+test.js
+node_modules
+/.circleci
+/tests/integration
diff --git a/node_modules/detect-libc/LICENSE b/node_modules/detect-libc/LICENSE
new file mode 100644
index 0000000..8dada3e
--- /dev/null
+++ b/node_modules/detect-libc/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/node_modules/detect-libc/README.md b/node_modules/detect-libc/README.md
new file mode 100644
index 0000000..3176357
--- /dev/null
+++ b/node_modules/detect-libc/README.md
@@ -0,0 +1,78 @@
+# detect-libc
+
+Node.js module to detect the C standard library (libc) implementation
+family and version in use on a given Linux system.
+
+Provides a value suitable for use with the `LIBC` option of
+[prebuild](https://www.npmjs.com/package/prebuild),
+[prebuild-ci](https://www.npmjs.com/package/prebuild-ci) and
+[prebuild-install](https://www.npmjs.com/package/prebuild-install),
+therefore allowing build and provision of pre-compiled binaries
+for musl-based Linux e.g. Alpine as well as glibc-based.
+
+Currently supports libc detection of `glibc` and `musl`.
+
+## Install
+
+```sh
+npm install detect-libc
+```
+
+## Usage
+
+### API
+
+```js
+const { GLIBC, MUSL, family, version, isNonGlibcLinux } = require('detect-libc');
+```
+
+* `GLIBC` is a String containing the value "glibc" for comparison with `family`.
+* `MUSL` is a String containing the value "musl" for comparison with `family`.
+* `family` is a String representing the system libc family.
+* `version` is a String representing the system libc version number.
+* `isNonGlibcLinux` is a Boolean representing whether the system is a non-glibc Linux, e.g. Alpine.
+
+### detect-libc command line tool
+
+When run on a Linux system with a non-glibc libc,
+the child command will be run with the `LIBC` environment variable
+set to the relevant value.
+
+On all other platforms will run the child command as-is.
+
+The command line feature requires `spawnSync` provided by Node v0.12+.
+
+```sh
+detect-libc child-command
+```
+
+## Integrating with prebuild
+
+```json
+  "scripts": {
+    "install": "detect-libc prebuild-install || node-gyp rebuild",
+    "test": "mocha && detect-libc prebuild-ci"
+  },
+  "dependencies": {
+    "detect-libc": "^1.0.2",
+    "prebuild-install": "^2.2.0"
+  },
+  "devDependencies": {
+    "prebuild": "^6.2.1",
+    "prebuild-ci": "^2.2.3"
+  }
+```
+
+## Licence
+
+Copyright 2017 Lovell Fuller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0.html)
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/node_modules/detect-libc/bin/detect-libc.js b/node_modules/detect-libc/bin/detect-libc.js
new file mode 100644
index 0000000..5486127
--- /dev/null
+++ b/node_modules/detect-libc/bin/detect-libc.js
@@ -0,0 +1,18 @@
+#!/usr/bin/env node
+
+'use strict';
+
+var spawnSync = require('child_process').spawnSync;
+var libc = require('../');
+
+var spawnOptions = {
+  env: process.env,
+  shell: true,
+  stdio: 'inherit'
+};
+
+if (libc.isNonGlibcLinux) {
+  spawnOptions.env.LIBC = process.env.LIBC || libc.family;
+}
+
+process.exit(spawnSync(process.argv[2], process.argv.slice(3), spawnOptions).status);
diff --git a/node_modules/detect-libc/lib/detect-libc.js b/node_modules/detect-libc/lib/detect-libc.js
new file mode 100644
index 0000000..1855fe1
--- /dev/null
+++ b/node_modules/detect-libc/lib/detect-libc.js
@@ -0,0 +1,92 @@
+'use strict';
+
+var platform = require('os').platform();
+var spawnSync = require('child_process').spawnSync;
+var readdirSync = require('fs').readdirSync;
+
+var GLIBC = 'glibc';
+var MUSL = 'musl';
+
+var spawnOptions = {
+  encoding: 'utf8',
+  env: process.env
+};
+
+if (!spawnSync) {
+  spawnSync = function () {
+    return { status: 126, stdout: '', stderr: '' };
+  };
+}
+
+function contains (needle) {
+  return function (haystack) {
+    return haystack.indexOf(needle) !== -1;
+  };
+}
+
+function versionFromMuslLdd (out) {
+  return out.split(/[\r\n]+/)[1].trim().split(/\s/)[1];
+}
+
+function safeReaddirSync (path) {
+  try {
+    return readdirSync(path);
+  } catch (e) {}
+  return [];
+}
+
+var family = '';
+var version = '';
+var method = '';
+
+if (platform === 'linux') {
+  // Try getconf
+  var glibc = spawnSync('getconf', ['GNU_LIBC_VERSION'], spawnOptions);
+  if (glibc.status === 0) {
+    family = GLIBC;
+    version = glibc.stdout.trim().split(' ')[1];
+    method = 'getconf';
+  } else {
+    // Try ldd
+    var ldd = spawnSync('ldd', ['--version'], spawnOptions);
+    if (ldd.status === 0 && ldd.stdout.indexOf(MUSL) !== -1) {
+      family = MUSL;
+      version = versionFromMuslLdd(ldd.stdout);
+      method = 'ldd';
+    } else if (ldd.status === 1 && ldd.stderr.indexOf(MUSL) !== -1) {
+      family = MUSL;
+      version = versionFromMuslLdd(ldd.stderr);
+      method = 'ldd';
+    } else {
+      // Try filesystem (family only)
+      var lib = safeReaddirSync('/lib');
+      if (lib.some(contains('-linux-gnu'))) {
+        family = GLIBC;
+        method = 'filesystem';
+      } else if (lib.some(contains('libc.musl-'))) {
+        family = MUSL;
+        method = 'filesystem';
+      } else if (lib.some(contains('ld-musl-'))) {
+        family = MUSL;
+        method = 'filesystem';
+      } else {
+        var usrSbin = safeReaddirSync('/usr/sbin');
+        if (usrSbin.some(contains('glibc'))) {
+          family = GLIBC;
+          method = 'filesystem';
+        }
+      }
+    }
+  }
+}
+
+var isNonGlibcLinux = (family !== '' && family !== GLIBC);
+
+module.exports = {
+  GLIBC: GLIBC,
+  MUSL: MUSL,
+  family: family,
+  version: version,
+  method: method,
+  isNonGlibcLinux: isNonGlibcLinux
+};
diff --git a/node_modules/detect-libc/package.json b/node_modules/detect-libc/package.json
new file mode 100644
index 0000000..6a7f22b
--- /dev/null
+++ b/node_modules/detect-libc/package.json
@@ -0,0 +1,70 @@
+{
+  "_from": "detect-libc@^1.0.3",
+  "_id": "detect-libc@1.0.3",
+  "_inBundle": false,
+  "_integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
+  "_location": "/detect-libc",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "detect-libc@^1.0.3",
+    "name": "detect-libc",
+    "escapedName": "detect-libc",
+    "rawSpec": "^1.0.3",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.3"
+  },
+  "_requiredBy": [
+    "/prebuild-install"
+  ],
+  "_resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+  "_shasum": "fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b",
+  "_spec": "detect-libc@^1.0.3",
+  "_where": "F:\\vent-display\\node_modules\\prebuild-install",
+  "author": {
+    "name": "Lovell Fuller",
+    "email": "npm@lovell.info"
+  },
+  "bin": {
+    "detect-libc": "bin/detect-libc.js"
+  },
+  "bugs": {
+    "url": "https://github.com/lovell/detect-libc/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Niklas Salmoukas",
+      "email": "niklas@salmoukas.com"
+    }
+  ],
+  "deprecated": false,
+  "description": "Node.js module to detect the C standard library (libc) implementation family and version",
+  "devDependencies": {
+    "ava": "^0.23.0",
+    "nyc": "^11.3.0",
+    "proxyquire": "^1.8.0",
+    "semistandard": "^11.0.0"
+  },
+  "engines": {
+    "node": ">=0.10"
+  },
+  "homepage": "https://github.com/lovell/detect-libc#readme",
+  "keywords": [
+    "libc",
+    "glibc",
+    "musl"
+  ],
+  "license": "Apache-2.0",
+  "main": "lib/detect-libc.js",
+  "name": "detect-libc",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/lovell/detect-libc.git"
+  },
+  "scripts": {
+    "test": "semistandard && nyc --reporter=lcov ava"
+  },
+  "version": "1.0.3"
+}
diff --git a/node_modules/end-of-stream/LICENSE b/node_modules/end-of-stream/LICENSE
new file mode 100644
index 0000000..757562e
--- /dev/null
+++ b/node_modules/end-of-stream/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Mathias Buus
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/end-of-stream/README.md b/node_modules/end-of-stream/README.md
new file mode 100644
index 0000000..857b14b
--- /dev/null
+++ b/node_modules/end-of-stream/README.md
@@ -0,0 +1,54 @@
+# end-of-stream
+
+A node module that calls a callback when a readable/writable/duplex stream has completed or failed.
+
+	npm install end-of-stream
+
+[![Build status](https://travis-ci.org/mafintosh/end-of-stream.svg?branch=master)](https://travis-ci.org/mafintosh/end-of-stream)
+
+## Usage
+
+Simply pass a stream and a callback to the `eos`.
+Both legacy streams, streams2 and stream3 are supported.
+
+``` js
+var eos = require('end-of-stream');
+
+eos(readableStream, function(err) {
+  // this will be set to the stream instance
+	if (err) return console.log('stream had an error or closed early');
+	console.log('stream has ended', this === readableStream);
+});
+
+eos(writableStream, function(err) {
+	if (err) return console.log('stream had an error or closed early');
+	console.log('stream has finished', this === writableStream);
+});
+
+eos(duplexStream, function(err) {
+	if (err) return console.log('stream had an error or closed early');
+	console.log('stream has ended and finished', this === duplexStream);
+});
+
+eos(duplexStream, {readable:false}, function(err) {
+	if (err) return console.log('stream had an error or closed early');
+	console.log('stream has finished but might still be readable');
+});
+
+eos(duplexStream, {writable:false}, function(err) {
+	if (err) return console.log('stream had an error or closed early');
+	console.log('stream has ended but might still be writable');
+});
+
+eos(readableStream, {error:false}, function(err) {
+	// do not treat emit('error', err) as a end-of-stream
+});
+```
+
+## License
+
+MIT
+
+## Related
+
+`end-of-stream` is part of the [mississippi stream utility collection](https://github.com/maxogden/mississippi) which includes more useful stream modules similar to this one.
diff --git a/node_modules/end-of-stream/index.js b/node_modules/end-of-stream/index.js
new file mode 100644
index 0000000..c77f0d5
--- /dev/null
+++ b/node_modules/end-of-stream/index.js
@@ -0,0 +1,94 @@
+var once = require('once');
+
+var noop = function() {};
+
+var isRequest = function(stream) {
+	return stream.setHeader && typeof stream.abort === 'function';
+};
+
+var isChildProcess = function(stream) {
+	return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3
+};
+
+var eos = function(stream, opts, callback) {
+	if (typeof opts === 'function') return eos(stream, null, opts);
+	if (!opts) opts = {};
+
+	callback = once(callback || noop);
+
+	var ws = stream._writableState;
+	var rs = stream._readableState;
+	var readable = opts.readable || (opts.readable !== false && stream.readable);
+	var writable = opts.writable || (opts.writable !== false && stream.writable);
+	var cancelled = false;
+
+	var onlegacyfinish = function() {
+		if (!stream.writable) onfinish();
+	};
+
+	var onfinish = function() {
+		writable = false;
+		if (!readable) callback.call(stream);
+	};
+
+	var onend = function() {
+		readable = false;
+		if (!writable) callback.call(stream);
+	};
+
+	var onexit = function(exitCode) {
+		callback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null);
+	};
+
+	var onerror = function(err) {
+		callback.call(stream, err);
+	};
+
+	var onclose = function() {
+		process.nextTick(onclosenexttick);
+	};
+
+	var onclosenexttick = function() {
+		if (cancelled) return;
+		if (readable && !(rs && (rs.ended && !rs.destroyed))) return callback.call(stream, new Error('premature close'));
+		if (writable && !(ws && (ws.ended && !ws.destroyed))) return callback.call(stream, new Error('premature close'));
+	};
+
+	var onrequest = function() {
+		stream.req.on('finish', onfinish);
+	};
+
+	if (isRequest(stream)) {
+		stream.on('complete', onfinish);
+		stream.on('abort', onclose);
+		if (stream.req) onrequest();
+		else stream.on('request', onrequest);
+	} else if (writable && !ws) { // legacy streams
+		stream.on('end', onlegacyfinish);
+		stream.on('close', onlegacyfinish);
+	}
+
+	if (isChildProcess(stream)) stream.on('exit', onexit);
+
+	stream.on('end', onend);
+	stream.on('finish', onfinish);
+	if (opts.error !== false) stream.on('error', onerror);
+	stream.on('close', onclose);
+
+	return function() {
+		cancelled = true;
+		stream.removeListener('complete', onfinish);
+		stream.removeListener('abort', onclose);
+		stream.removeListener('request', onrequest);
+		if (stream.req) stream.req.removeListener('finish', onfinish);
+		stream.removeListener('end', onlegacyfinish);
+		stream.removeListener('close', onlegacyfinish);
+		stream.removeListener('finish', onfinish);
+		stream.removeListener('exit', onexit);
+		stream.removeListener('end', onend);
+		stream.removeListener('error', onerror);
+		stream.removeListener('close', onclose);
+	};
+};
+
+module.exports = eos;
diff --git a/node_modules/end-of-stream/package.json b/node_modules/end-of-stream/package.json
new file mode 100644
index 0000000..db598dd
--- /dev/null
+++ b/node_modules/end-of-stream/package.json
@@ -0,0 +1,66 @@
+{
+  "_from": "end-of-stream@^1.1.0",
+  "_id": "end-of-stream@1.4.4",
+  "_inBundle": false,
+  "_integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+  "_location": "/end-of-stream",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "end-of-stream@^1.1.0",
+    "name": "end-of-stream",
+    "escapedName": "end-of-stream",
+    "rawSpec": "^1.1.0",
+    "saveSpec": null,
+    "fetchSpec": "^1.1.0"
+  },
+  "_requiredBy": [
+    "/pump",
+    "/tar-stream"
+  ],
+  "_resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+  "_shasum": "5ae64a5f45057baf3626ec14da0ca5e4b2431eb0",
+  "_spec": "end-of-stream@^1.1.0",
+  "_where": "F:\\vent-display\\node_modules\\pump",
+  "author": {
+    "name": "Mathias Buus",
+    "email": "mathiasbuus@gmail.com"
+  },
+  "bugs": {
+    "url": "https://github.com/mafintosh/end-of-stream/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "once": "^1.4.0"
+  },
+  "deprecated": false,
+  "description": "Call a callback when a readable/writable/duplex stream has completed or failed.",
+  "devDependencies": {
+    "tape": "^4.11.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/mafintosh/end-of-stream",
+  "keywords": [
+    "stream",
+    "streams",
+    "callback",
+    "finish",
+    "close",
+    "end",
+    "wait"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "end-of-stream",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/mafintosh/end-of-stream.git"
+  },
+  "scripts": {
+    "test": "node test.js"
+  },
+  "version": "1.4.4"
+}
diff --git a/node_modules/expand-template/.travis.yml b/node_modules/expand-template/.travis.yml
new file mode 100644
index 0000000..1335a77
--- /dev/null
+++ b/node_modules/expand-template/.travis.yml
@@ -0,0 +1,6 @@
+language: node_js
+
+node_js:
+  - 6
+  - 8
+  - 10
diff --git a/node_modules/expand-template/LICENSE b/node_modules/expand-template/LICENSE
new file mode 100644
index 0000000..814aef4
--- /dev/null
+++ b/node_modules/expand-template/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2018 Lars-Magnus Skog
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/expand-template/README.md b/node_modules/expand-template/README.md
new file mode 100644
index 0000000..b98aa48
--- /dev/null
+++ b/node_modules/expand-template/README.md
@@ -0,0 +1,43 @@
+# expand-template
+
+> Expand placeholders in a template string.
+
+[![npm](https://img.shields.io/npm/v/expand-template.svg)](https://www.npmjs.com/package/expand-template)
+![Node version](https://img.shields.io/node/v/expand-template.svg)
+[![Build Status](https://travis-ci.org/ralphtheninja/expand-template.svg?branch=master)](https://travis-ci.org/ralphtheninja/expand-template)
+[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
+
+## Install
+
+```
+$ npm i expand-template -S
+```
+
+## Usage
+
+Default functionality expands templates using `{}` as separators for string placeholders.
+
+```js
+var expand = require('expand-template')()
+var template = '{foo}/{foo}/{bar}/{bar}'
+console.log(expand(template, {
+  foo: 'BAR',
+  bar: 'FOO'
+}))
+// -> BAR/BAR/FOO/FOO
+```
+
+Custom separators:
+
+```js
+var expand = require('expand-template')({ sep: '[]' })
+var template = '[foo]/[foo]/[bar]/[bar]'
+console.log(expand(template, {
+  foo: 'BAR',
+  bar: 'FOO'
+}))
+// -> BAR/BAR/FOO/FOO
+```
+
+## License
+All code, unless stated otherwise, is dual-licensed under [`WTFPL`](http://www.wtfpl.net/txt/copying/) and [`MIT`](https://opensource.org/licenses/MIT).
diff --git a/node_modules/expand-template/index.js b/node_modules/expand-template/index.js
new file mode 100644
index 0000000..e182837
--- /dev/null
+++ b/node_modules/expand-template/index.js
@@ -0,0 +1,26 @@
+module.exports = function (opts) {
+  var sep = opts ? opts.sep : '{}'
+  var len = sep.length
+
+  var whitespace = '\\s*'
+  var left = escape(sep.substring(0, len / 2)) + whitespace
+  var right = whitespace + escape(sep.substring(len / 2, len))
+
+  return function (template, values) {
+    Object.keys(values).forEach(function (key) {
+      var value = String(values[key]).replace(/\$/g, '$$$$')
+      template = template.replace(regExp(key), value)
+    })
+    return template
+  }
+
+  function escape (s) {
+    return [].map.call(s, function (char) {
+      return '\\' + char
+    }).join('')
+  }
+
+  function regExp (key) {
+    return new RegExp(left + key + right, 'g')
+  }
+}
diff --git a/node_modules/expand-template/package.json b/node_modules/expand-template/package.json
new file mode 100644
index 0000000..cc3ebb4
--- /dev/null
+++ b/node_modules/expand-template/package.json
@@ -0,0 +1,60 @@
+{
+  "_from": "expand-template@^2.0.3",
+  "_id": "expand-template@2.0.3",
+  "_inBundle": false,
+  "_integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+  "_location": "/expand-template",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "expand-template@^2.0.3",
+    "name": "expand-template",
+    "escapedName": "expand-template",
+    "rawSpec": "^2.0.3",
+    "saveSpec": null,
+    "fetchSpec": "^2.0.3"
+  },
+  "_requiredBy": [
+    "/prebuild-install"
+  ],
+  "_resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+  "_shasum": "6e14b3fcee0f3a6340ecb57d2e8918692052a47c",
+  "_spec": "expand-template@^2.0.3",
+  "_where": "F:\\vent-display\\node_modules\\prebuild-install",
+  "author": {
+    "name": "LM",
+    "email": "ralphtheninja@riseup.net"
+  },
+  "bugs": {
+    "url": "https://github.com/ralphtheninja/expand-template/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {},
+  "deprecated": false,
+  "description": "Expand placeholders in a template string",
+  "devDependencies": {
+    "standard": "^12.0.0",
+    "tape": "^4.2.2"
+  },
+  "engines": {
+    "node": ">=6"
+  },
+  "homepage": "https://github.com/ralphtheninja/expand-template",
+  "keywords": [
+    "template",
+    "expand",
+    "replace"
+  ],
+  "license": "(MIT OR WTFPL)",
+  "main": "index.js",
+  "name": "expand-template",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/ralphtheninja/expand-template.git"
+  },
+  "scripts": {
+    "test": "tape test.js && standard"
+  },
+  "version": "2.0.3"
+}
diff --git a/node_modules/expand-template/test.js b/node_modules/expand-template/test.js
new file mode 100644
index 0000000..ba6ed87
--- /dev/null
+++ b/node_modules/expand-template/test.js
@@ -0,0 +1,67 @@
+var test = require('tape')
+var Expand = require('./')
+
+test('default expands {} placeholders', function (t) {
+  var expand = Expand()
+  t.equal(typeof expand, 'function', 'is a function')
+  t.equal(expand('{foo}/{bar}', {
+    foo: 'BAR', bar: 'FOO'
+  }), 'BAR/FOO')
+  t.equal(expand('{foo}{foo}{foo}', {
+    foo: 'FOO'
+  }), 'FOOFOOFOO', 'expands one placeholder many times')
+  t.end()
+})
+
+test('support for custom separators', function (t) {
+  var expand = Expand({ sep: '[]' })
+  t.equal(expand('[foo]/[bar]', {
+    foo: 'BAR', bar: 'FOO'
+  }), 'BAR/FOO')
+  t.equal(expand('[foo][foo][foo]', {
+    foo: 'FOO'
+  }), 'FOOFOOFOO', 'expands one placeholder many times')
+  t.end()
+})
+
+test('support for longer custom separators', function (t) {
+  var expand = Expand({ sep: '[[]]' })
+  t.equal(expand('[[foo]]/[[bar]]', {
+    foo: 'BAR', bar: 'FOO'
+  }), 'BAR/FOO')
+  t.equal(expand('[[foo]][[foo]][[foo]]', {
+    foo: 'FOO'
+  }), 'FOOFOOFOO', 'expands one placeholder many times')
+  t.end()
+})
+
+test('whitespace-insensitive', function (t) {
+  var expand = Expand({ sep: '[]' })
+  t.equal(expand('[ foo ]/[ bar ]', {
+    foo: 'BAR', bar: 'FOO'
+  }), 'BAR/FOO')
+  t.equal(expand('[ foo ][ foo  ][ foo]', {
+    foo: 'FOO'
+  }), 'FOOFOOFOO', 'expands one placeholder many times')
+  t.end()
+})
+
+test('dollar escape', function (t) {
+  var expand = Expand()
+  t.equal(expand('before {foo} after', {
+    foo: '$'
+  }), 'before $ after')
+  t.equal(expand('before {foo} after', {
+    foo: '$&'
+  }), 'before $& after')
+  t.equal(expand('before {foo} after', {
+    foo: '$`'
+  }), 'before $` after')
+  t.equal(expand('before {foo} after', {
+    foo: '$\''
+  }), 'before $\' after')
+  t.equal(expand('before {foo} after', {
+    foo: '$0'
+  }), 'before $0 after')
+  t.end()
+})
diff --git a/node_modules/file-uri-to-path/.npmignore b/node_modules/file-uri-to-path/.npmignore
new file mode 100644
index 0000000..07e6e47
--- /dev/null
+++ b/node_modules/file-uri-to-path/.npmignore
@@ -0,0 +1 @@
+/node_modules
diff --git a/node_modules/file-uri-to-path/.travis.yml b/node_modules/file-uri-to-path/.travis.yml
new file mode 100644
index 0000000..016bb6e
--- /dev/null
+++ b/node_modules/file-uri-to-path/.travis.yml
@@ -0,0 +1,30 @@
+sudo: false
+
+language: node_js
+
+node_js:
+  - "0.8"
+  - "0.10"
+  - "0.12"
+  - "1"
+  - "2"
+  - "3"
+  - "4"
+  - "5"
+  - "6"
+  - "7"
+  - "8"
+
+install:
+  - PATH="`npm bin`:`npm bin -g`:$PATH"
+  # Node 0.8 comes with a too obsolete npm
+  - if [[ "`node --version`" =~ ^v0\.8\. ]]; then npm install -g npm@1.4.28 ; fi
+  # Install dependencies and build
+  - npm install
+
+script:
+  # Output useful info for debugging
+  - node --version
+  - npm --version
+  # Run tests
+  - npm test
diff --git a/node_modules/file-uri-to-path/History.md b/node_modules/file-uri-to-path/History.md
new file mode 100644
index 0000000..c8682be
--- /dev/null
+++ b/node_modules/file-uri-to-path/History.md
@@ -0,0 +1,21 @@
+
+1.0.0 / 2017-07-06
+==================
+
+  * update "mocha" to v3
+  * fixed unicode URI decoding (#6)
+  * add typings for Typescript
+  * README: use SVG Travis-CI badge
+  * add LICENSE file (MIT)
+  * add .travis.yml file (testing Node.js 0.8 through 8 currently)
+  * add README.md file
+
+0.0.2 / 2014-01-27
+==================
+
+  * index: invert the path separators on Windows
+
+0.0.1 / 2014-01-27
+==================
+
+  * initial commit
diff --git a/node_modules/file-uri-to-path/LICENSE b/node_modules/file-uri-to-path/LICENSE
new file mode 100644
index 0000000..e1af783
--- /dev/null
+++ b/node_modules/file-uri-to-path/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2014 Nathan Rajlich <nathan@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/file-uri-to-path/README.md b/node_modules/file-uri-to-path/README.md
new file mode 100644
index 0000000..ab30be8
--- /dev/null
+++ b/node_modules/file-uri-to-path/README.md
@@ -0,0 +1,74 @@
+file-uri-to-path
+================
+### Convert a `file:` URI to a file path
+[![Build Status](https://travis-ci.org/TooTallNate/file-uri-to-path.svg?branch=master)](https://travis-ci.org/TooTallNate/file-uri-to-path)
+
+Accepts a `file:` URI and returns a regular file path suitable for use with the
+`fs` module functions.
+
+
+Installation
+------------
+
+Install with `npm`:
+
+``` bash
+$ npm install file-uri-to-path
+```
+
+
+Example
+-------
+
+``` js
+var uri2path = require('file-uri-to-path');
+
+uri2path('file://localhost/c|/WINDOWS/clock.avi');
+// "c:\\WINDOWS\\clock.avi"
+
+uri2path('file:///c|/WINDOWS/clock.avi');
+// "c:\\WINDOWS\\clock.avi"
+
+uri2path('file://localhost/c:/WINDOWS/clock.avi');
+// "c:\\WINDOWS\\clock.avi"
+
+uri2path('file://hostname/path/to/the%20file.txt');
+// "\\\\hostname\\path\\to\\the file.txt"
+
+uri2path('file:///c:/path/to/the%20file.txt');
+// "c:\\path\\to\\the file.txt"
+```
+
+
+API
+---
+
+### fileUriToPath(String uri) → String
+
+
+
+License
+-------
+
+(The MIT License)
+
+Copyright (c) 2014 Nathan Rajlich &lt;nathan@tootallnate.net&gt;
+
+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/file-uri-to-path/index.d.ts b/node_modules/file-uri-to-path/index.d.ts
new file mode 100644
index 0000000..99dc3f9
--- /dev/null
+++ b/node_modules/file-uri-to-path/index.d.ts
@@ -0,0 +1,2 @@
+declare function fileUriToPath(uri: string): string;
+export = fileUriToPath;
diff --git a/node_modules/file-uri-to-path/index.js b/node_modules/file-uri-to-path/index.js
new file mode 100644
index 0000000..48cb280
--- /dev/null
+++ b/node_modules/file-uri-to-path/index.js
@@ -0,0 +1,66 @@
+
+/**
+ * Module dependencies.
+ */
+
+var sep = require('path').sep || '/';
+
+/**
+ * Module exports.
+ */
+
+module.exports = fileUriToPath;
+
+/**
+ * File URI to Path function.
+ *
+ * @param {String} uri
+ * @return {String} path
+ * @api public
+ */
+
+function fileUriToPath (uri) {
+  if ('string' != typeof uri ||
+      uri.length <= 7 ||
+      'file://' != uri.substring(0, 7)) {
+    throw new TypeError('must pass in a file:// URI to convert to a file path');
+  }
+
+  var rest = decodeURI(uri.substring(7));
+  var firstSlash = rest.indexOf('/');
+  var host = rest.substring(0, firstSlash);
+  var path = rest.substring(firstSlash + 1);
+
+  // 2.  Scheme Definition
+  // As a special case, <host> can be the string "localhost" or the empty
+  // string; this is interpreted as "the machine from which the URL is
+  // being interpreted".
+  if ('localhost' == host) host = '';
+
+  if (host) {
+    host = sep + sep + host;
+  }
+
+  // 3.2  Drives, drive letters, mount points, file system root
+  // Drive letters are mapped into the top of a file URI in various ways,
+  // depending on the implementation; some applications substitute
+  // vertical bar ("|") for the colon after the drive letter, yielding
+  // "file:///c|/tmp/test.txt".  In some cases, the colon is left
+  // unchanged, as in "file:///c:/tmp/test.txt".  In other cases, the
+  // colon is simply omitted, as in "file:///c/tmp/test.txt".
+  path = path.replace(/^(.+)\|/, '$1:');
+
+  // for Windows, we need to invert the path separators from what a URI uses
+  if (sep == '\\') {
+    path = path.replace(/\//g, '\\');
+  }
+
+  if (/^.+\:/.test(path)) {
+    // has Windows drive at beginning of path
+  } else {
+    // unix path…
+    path = sep + path;
+  }
+
+  return host + path;
+}
diff --git a/node_modules/file-uri-to-path/package.json b/node_modules/file-uri-to-path/package.json
new file mode 100644
index 0000000..42f38b7
--- /dev/null
+++ b/node_modules/file-uri-to-path/package.json
@@ -0,0 +1,61 @@
+{
+  "_from": "file-uri-to-path@1.0.0",
+  "_id": "file-uri-to-path@1.0.0",
+  "_inBundle": false,
+  "_integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+  "_location": "/file-uri-to-path",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "version",
+    "registry": true,
+    "raw": "file-uri-to-path@1.0.0",
+    "name": "file-uri-to-path",
+    "escapedName": "file-uri-to-path",
+    "rawSpec": "1.0.0",
+    "saveSpec": null,
+    "fetchSpec": "1.0.0"
+  },
+  "_requiredBy": [
+    "/bindings"
+  ],
+  "_resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+  "_shasum": "553a7b8446ff6f684359c445f1e37a05dacc33dd",
+  "_spec": "file-uri-to-path@1.0.0",
+  "_where": "F:\\vent-display\\node_modules\\bindings",
+  "author": {
+    "name": "Nathan Rajlich",
+    "email": "nathan@tootallnate.net",
+    "url": "http://n8.io/"
+  },
+  "bugs": {
+    "url": "https://github.com/TooTallNate/file-uri-to-path/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Convert a file: URI to a file path",
+  "devDependencies": {
+    "mocha": "3"
+  },
+  "directories": {
+    "test": "test"
+  },
+  "homepage": "https://github.com/TooTallNate/file-uri-to-path",
+  "keywords": [
+    "file",
+    "uri",
+    "convert",
+    "path"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "file-uri-to-path",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/TooTallNate/file-uri-to-path.git"
+  },
+  "scripts": {
+    "test": "mocha --reporter spec"
+  },
+  "types": "index.d.ts",
+  "version": "1.0.0"
+}
diff --git a/node_modules/file-uri-to-path/test/test.js b/node_modules/file-uri-to-path/test/test.js
new file mode 100644
index 0000000..79305dc
--- /dev/null
+++ b/node_modules/file-uri-to-path/test/test.js
@@ -0,0 +1,24 @@
+
+var sep = require('path').sep || '/';
+var assert = require('assert');
+var uri2path = require('../');
+var tests = require('./tests.json');
+
+describe('file-uri-to-path', function () {
+
+  Object.keys(tests).forEach(function (uri) {
+
+    // the test cases were generated from Windows' PathCreateFromUrlA() function.
+    // On Unix, we have to replace the path separator with the Unix one instead of
+    // the Windows one.
+    var expected = tests[uri].replace(/\\/g, sep);
+
+    it('should convert ' + JSON.stringify(uri) + ' to ' + JSON.stringify(expected),
+    function () {
+      var actual = uri2path(uri);
+      assert.equal(actual, expected);
+    });
+
+  });
+
+});
diff --git a/node_modules/file-uri-to-path/test/tests.json b/node_modules/file-uri-to-path/test/tests.json
new file mode 100644
index 0000000..b935a63
--- /dev/null
+++ b/node_modules/file-uri-to-path/test/tests.json
@@ -0,0 +1,13 @@
+{
+  "file://host/path": "\\\\host\\path",
+  "file://localhost/etc/fstab": "\\etc\\fstab",
+  "file:///etc/fstab": "\\etc\\fstab",
+  "file:///c:/WINDOWS/clock.avi": "c:\\WINDOWS\\clock.avi",
+  "file://localhost/c|/WINDOWS/clock.avi": "c:\\WINDOWS\\clock.avi",
+  "file:///c|/WINDOWS/clock.avi": "c:\\WINDOWS\\clock.avi",
+  "file://localhost/c:/WINDOWS/clock.avi": "c:\\WINDOWS\\clock.avi",
+  "file://hostname/path/to/the%20file.txt": "\\\\hostname\\path\\to\\the file.txt",
+  "file:///c:/path/to/the%20file.txt": "c:\\path\\to\\the file.txt",
+  "file:///C:/Documents%20and%20Settings/davris/FileSchemeURIs.doc": "C:\\Documents and Settings\\davris\\FileSchemeURIs.doc",
+  "file:///C:/caf%C3%A9/%C3%A5r/d%C3%BCnn/%E7%89%9B%E9%93%83/Ph%E1%BB%9F/%F0%9F%98%B5.exe": "C:\\café\\år\\dünn\\牛铃\\Phở\\😵.exe"
+}
diff --git a/node_modules/fs-constants/LICENSE b/node_modules/fs-constants/LICENSE
new file mode 100644
index 0000000..cb757e5
--- /dev/null
+++ b/node_modules/fs-constants/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2018 Mathias Buus
+
+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/fs-constants/README.md b/node_modules/fs-constants/README.md
new file mode 100644
index 0000000..62b3374
--- /dev/null
+++ b/node_modules/fs-constants/README.md
@@ -0,0 +1,26 @@
+# fs-constants
+
+Small module that allows you to get the fs constants across
+Node and the browser. 
+
+```
+npm install fs-constants
+```
+
+Previously you would use `require('constants')` for this in node but that has been
+deprecated and changed to `require('fs').constants` which does not browserify.
+
+This module uses `require('constants')` in the browser and `require('fs').constants` in node to work around this
+
+
+## Usage
+
+``` js
+var constants = require('fs-constants')
+
+console.log('constants:', constants)
+```
+
+## License
+
+MIT
diff --git a/node_modules/fs-constants/browser.js b/node_modules/fs-constants/browser.js
new file mode 100644
index 0000000..3c87638
--- /dev/null
+++ b/node_modules/fs-constants/browser.js
@@ -0,0 +1 @@
+module.exports = require('constants')
diff --git a/node_modules/fs-constants/index.js b/node_modules/fs-constants/index.js
new file mode 100644
index 0000000..2a3aadf
--- /dev/null
+++ b/node_modules/fs-constants/index.js
@@ -0,0 +1 @@
+module.exports = require('fs').constants || require('constants')
diff --git a/node_modules/fs-constants/package.json b/node_modules/fs-constants/package.json
new file mode 100644
index 0000000..ca63d3d
--- /dev/null
+++ b/node_modules/fs-constants/package.json
@@ -0,0 +1,47 @@
+{
+  "_from": "fs-constants@^1.0.0",
+  "_id": "fs-constants@1.0.0",
+  "_inBundle": false,
+  "_integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+  "_location": "/fs-constants",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "fs-constants@^1.0.0",
+    "name": "fs-constants",
+    "escapedName": "fs-constants",
+    "rawSpec": "^1.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.0"
+  },
+  "_requiredBy": [
+    "/tar-stream"
+  ],
+  "_resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+  "_shasum": "6be0de9be998ce16af8afc24497b9ee9b7ccd9ad",
+  "_spec": "fs-constants@^1.0.0",
+  "_where": "F:\\vent-display\\node_modules\\tar-stream",
+  "author": {
+    "name": "Mathias Buus",
+    "url": "@mafintosh"
+  },
+  "browser": "browser.js",
+  "bugs": {
+    "url": "https://github.com/mafintosh/fs-constants/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {},
+  "deprecated": false,
+  "description": "Require constants across node and the browser",
+  "devDependencies": {},
+  "homepage": "https://github.com/mafintosh/fs-constants",
+  "license": "MIT",
+  "main": "index.js",
+  "name": "fs-constants",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/mafintosh/fs-constants.git"
+  },
+  "version": "1.0.0"
+}
diff --git a/node_modules/gauge/CHANGELOG.md b/node_modules/gauge/CHANGELOG.md
new file mode 100644
index 0000000..407bc19
--- /dev/null
+++ b/node_modules/gauge/CHANGELOG.md
@@ -0,0 +1,160 @@
+### v2.7.4
+
+* Reset colors prior to ending a line, to eliminate flicker when a line
+  is trucated between start and end color sequences.
+
+### v2.7.3
+
+* Only create our onExit handler when we're enabled and remove it when we're
+  disabled.  This stops us from creating multiple onExit handlers when
+  multiple gauge objects are being used.
+* Fix bug where if a theme name were given instead of a theme object, it
+  would crash.
+* Remove supports-color because it's not actually used.  Uhm.  Yes, I just
+  updated it.  >.>
+
+### v2.7.2
+
+* Use supports-color instead of has-color (as the module has been renamed)
+
+### v2.7.1
+
+* Bug fix: Calls to show/pulse while the progress bar is disabled should still
+  update our internal representation of what would be shown should it be enabled.
+
+### v2.7.0
+
+* New feature: Add new `isEnabled` method to allow introspection of the gauge's
+  "enabledness" as controlled by `.enable()` and `.disable()`.
+
+### v2.6.0
+
+* Bug fix: Don't run the code associated with `enable`/`disable` if the gauge
+  is already enabled or disabled respectively.  This prevents leaking event
+  listeners, amongst other weirdness.
+* New feature: Template items can have default values that will be used if no
+  value was otherwise passed in.
+
+### v2.5.3
+
+* Default to `enabled` only if we have a tty.  Users can always override
+  this by passing in the `enabled` option explicitly or by calling calling
+  `gauge.enable()`.
+
+### v2.5.2
+
+* Externalized `./console-strings.js` into `console-control-strings`.
+
+### v2.5.1
+
+* Update to `signal-exit@3.0.0`, which fixes a compatibility bug with the
+  node profiler.
+* [#39](https://github.com/iarna/gauge/pull/39) Fix tests on 0.10 and add
+  a missing devDependency. ([@helloyou2012](https://github.com/helloyou2012))
+
+### v2.5.0
+
+* Add way to programmatically fetch a list of theme names in a themeset
+  (`Themeset.getThemeNames`).
+
+### v2.4.0
+
+* Add support for setting themesets on existing gauge objects.
+* Add post-IO callback to `gauge.hide()` as it is somtetimes necessary when
+  your terminal is interleaving output from multiple filehandles (ie, stdout
+  & stderr).
+
+### v2.3.1
+
+* Fix a refactor bug in setTheme where it wasn't accepting the various types
+  of args it should.
+
+### v2.3.0
+
+#### FEATURES
+
+* Add setTemplate & setTheme back in.
+* Add support for named themes, you can now ask for things like 'colorASCII'
+  and 'brailleSpinner'.  Of course, you can still pass in theme objects.
+  Additionally you can now pass in an object with `hasUnicode`, `hasColor` and
+  `platform` keys in order to override our guesses as to those values when
+  selecting a default theme from the themeset.
+* Make the output stream optional (it defaults to `process.stderr` now).
+* Add `setWriteTo(stream[, tty])` to change the output stream and,
+  optionally, tty.
+
+#### BUG FIXES & REFACTORING
+
+* Abort the display phase early if we're supposed to be hidden and we are.
+* Stop printing a bunch of spaces at the end of lines, since we're already
+  using an erase-to-end-of-line code anyway.
+* The unicode themes were missing the subsection separator.
+
+### v2.2.1
+
+* Fix image in readme
+
+### v2.2.0
+
+* All new themes API– reference themes by name and pass in custom themes and
+  themesets (themesets get platform support autodetection done on them to
+  select the best theme).  Theme mixins let you add features to all existing
+  themes.
+* Much, much improved test coverage.
+
+### v2.1.0
+
+* Got rid of â–‘ in the default platform, noUnicode, hasColor theme.  Thanks
+  to @yongtw123 for pointing out this had snuck in.
+* Fiddled with the demo output to make it easier to see the spinner spin. Also
+  added prints before each platforms test output.
+* I forgot to include `signal-exit` in our deps.  <.< Thank you @KenanY for
+  finding this. Then I was lazy and made a new commit instead of using his
+  PR. Again, thank you for your patience @KenenY.
+* Drastically speed up travis testing.
+* Add a small javascript demo (demo.js) for showing off the various themes
+  (and testing them on diff platforms).
+* Change: The subsection separator from ⁄ and / (different chars) to >.
+* Fix crasher: A show or pulse without a label would cause the template renderer
+  to complain about a missing value.
+* New feature: Add the ability to disable the clean-up-on-exit behavior.
+  Not something I expect to be widely desirable, but important if you have
+  multiple distinct gauge instances in your app.
+* Use our own color support detection.
+  The `has-color` module proved too magic for my needs, making assumptions
+  as to which stream we write to and reading command line arguments.
+
+### v2.0.0
+
+This is a major rewrite of the internals.  Externally there are fewer
+changes:
+
+* On node>0.8 gauge object now prints updates at a fixed rate.  This means
+  that when you call `show` it may wate up to `updateInterval` ms before it
+  actually prints an update.  You override this behavior with the
+  `fixedFramerate` option.
+* The gauge object now keeps the cursor hidden as long as it's enabled and
+  shown.
+* The constructor's arguments have changed, now it takes a mandatory output
+  stream and an optional options object.  The stream no longer needs to be
+  an `ansi`ified stream, although it can be if you want (but we won't make
+  use of its special features).
+* Previously the gauge was disabled by default if `process.stdout` wasn't a
+  tty.  Now it always defaults to enabled.  If you want the previous
+  behavior set the `enabled` option to `process.stdout.isTTY`.
+* The constructor's options have changed– see the docs for details.
+* Themes are entirely different.  If you were using a custom theme, or
+  referring to one directly (eg via `Gauge.unicode` or `Gauge.ascii`) then
+  you'll need to change your code.  You can get the equivalent of the latter
+  with:
+  ```
+  var themes = require('gauge/themes')
+  var unicodeTheme = themes(true, true) // returns the color unicode theme for your platform
+  ```
+  The default themes no longer use any ambiguous width characters, so even
+  if you choose to display those as wide your progress bar should still
+  display correctly.
+* Templates are entirely different and if you were using a custom one, you
+  should consult the documentation to learn how to recreate it.  If you were
+  using the default, be aware that it has changed and the result looks quite
+  a bit different.
diff --git a/node_modules/gauge/LICENSE b/node_modules/gauge/LICENSE
new file mode 100644
index 0000000..e756052
--- /dev/null
+++ b/node_modules/gauge/LICENSE
@@ -0,0 +1,13 @@
+Copyright (c) 2014, Rebecca Turner <me@re-becca.org>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/gauge/README.md b/node_modules/gauge/README.md
new file mode 100644
index 0000000..bdd60e3
--- /dev/null
+++ b/node_modules/gauge/README.md
@@ -0,0 +1,399 @@
+gauge
+=====
+
+A nearly stateless terminal based horizontal gauge / progress bar.
+
+```javascript
+var Gauge = require("gauge")
+
+var gauge = new Gauge()
+
+gauge.show("test", 0.20)
+
+gauge.pulse("this")
+
+gauge.hide()
+```
+
+![](gauge-demo.gif)
+
+
+### CHANGES FROM 1.x
+
+Gauge 2.x is breaking release, please see the [changelog] for details on
+what's changed if you were previously a user of this module.
+
+[changelog]: CHANGELOG.md
+
+### THE GAUGE CLASS
+
+This is the typical interface to the module– it provides a pretty
+fire-and-forget interface to displaying your status information.
+
+```
+var Gauge = require("gauge")
+
+var gauge = new Gauge([stream], [options])
+```
+
+* **stream** – *(optional, default STDERR)* A stream that progress bar
+  updates are to be written to.  Gauge honors backpressure and will pause
+  most writing if it is indicated.
+* **options** – *(optional)* An option object.
+
+Constructs a new gauge. Gauges are drawn on a single line, and are not drawn
+if **stream** isn't a tty and a tty isn't explicitly provided.
+
+If **stream** is a terminal or if you pass in **tty** to **options** then we
+will detect terminal resizes and redraw to fit.  We do this by watching for
+`resize` events on the tty.  (To work around a bug in verisons of Node prior
+to 2.5.0, we watch for them on stdout if the tty is stderr.) Resizes to
+larger window sizes will be clean, but shrinking the window will always
+result in some cruft.
+
+**IMPORTANT:** If you prevously were passing in a non-tty stream but you still
+want output (for example, a stream wrapped by the `ansi` module) then you
+need to pass in the **tty** option below, as `gauge` needs access to
+the underlying tty in order to do things like terminal resizes and terminal
+width detection.
+
+The **options** object can have the following properties, all of which are
+optional:
+
+* **updateInterval**: How often gauge updates should be drawn, in miliseconds.
+* **fixedFramerate**: Defaults to false on node 0.8, true on everything
+  else.  When this is true a timer is created to trigger once every
+  `updateInterval` ms, when false, updates are printed as soon as they come
+  in but updates more often than `updateInterval` are ignored.  The reason
+  0.8 doesn't have this set to true is that it can't `unref` its timer and
+  so it would stop your program from exiting– if you want to use this
+  feature with 0.8 just make sure you call `gauge.disable()` before you
+  expect your program to exit.
+* **themes**: A themeset to use when selecting the theme to use. Defaults
+  to `gauge/themes`, see the [themes] documentation for details.
+* **theme**: Select a theme for use, it can be a:
+  * Theme object, in which case the **themes** is not used.
+  * The name of a theme, which will be looked up in the current *themes*
+    object.
+  * A configuration object with any of `hasUnicode`, `hasColor` or
+    `platform` keys, which if wlll be used to override our guesses when making
+    a default theme selection.
+
+  If no theme is selected then a default is picked using a combination of our
+  best guesses at your OS, color support and unicode support.
+* **template**: Describes what you want your gauge to look like.  The
+  default is what npm uses.  Detailed [documentation] is later in this
+  document.
+* **hideCursor**: Defaults to true.  If true, then the cursor will be hidden
+  while the gauge is displayed.
+* **tty**: The tty that you're ultimately writing to.  Defaults to the same
+  as **stream**.  This is used for detecting the width of the terminal and
+  resizes. The width used is `tty.columns - 1`. If no tty is available then
+  a width of `79` is assumed.
+* **enabled**: Defaults to true if `tty` is a TTY, false otherwise.  If true
+  the gauge starts enabled.  If disabled then all update commands are
+  ignored and no gauge will be printed until you call `.enable()`.
+* **Plumbing**: The class to use to actually generate the gauge for
+  printing.  This defaults to `require('gauge/plumbing')` and ordinarly you
+  shouldn't need to override this.
+* **cleanupOnExit**: Defaults to true. Ordinarily we register an exit
+  handler to make sure your cursor is turned back on and the progress bar
+  erased when your process exits, even if you Ctrl-C out or otherwise exit
+  unexpectedly. You can disable this and it won't register the exit handler.
+
+[has-unicode]: https://www.npmjs.com/package/has-unicode
+[themes]: #themes
+[documentation]: #templates
+
+#### `gauge.show(section | status, [completed])`
+
+The first argument is either the section, the name of the current thing
+contributing to progress, or an object with keys like **section**,
+**subsection** & **completed** (or any others you have types for in a custom
+template).  If you don't want to update or set any of these you can pass
+`null` and it will be ignored.
+
+The second argument is the percent completed as a value between 0 and 1.
+Without it, completion is just not updated. You'll also note that completion
+can be passed in as part of a status object as the first argument. If both
+it and the completed argument are passed in, the completed argument wins.
+
+#### `gauge.hide([cb])`
+
+Removes the gauge from the terminal.  Optionally, callback `cb` after IO has
+had an opportunity to happen (currently this just means after `setImmediate`
+has called back.)
+
+It turns out this is important when you're pausing the progress bar on one
+filehandle and printing to another– otherwise (with a big enough print) node
+can end up printing the "end progress bar" bits to the progress bar filehandle
+while other stuff is printing to another filehandle. These getting interleaved
+can cause corruption in some terminals.
+
+#### `gauge.pulse([subsection])`
+
+* **subsection** – *(optional)* The specific thing that triggered this pulse
+
+Spins the spinner in the gauge to show output.  If **subsection** is
+included then it will be combined with the last name passed to `gauge.show`.
+
+#### `gauge.disable()`
+
+Hides the gauge and ignores further calls to `show` or `pulse`.
+
+#### `gauge.enable()`
+
+Shows the gauge and resumes updating when `show` or `pulse` is called.
+
+#### `gauge.isEnabled()`
+
+Returns true if the gauge is enabled.
+
+#### `gauge.setThemeset(themes)`
+
+Change the themeset to select a theme from. The same as the `themes` option
+used in the constructor. The theme will be reselected from this themeset.
+
+#### `gauge.setTheme(theme)`
+
+Change the active theme, will be displayed with the next show or pulse. This can be:
+
+* Theme object, in which case the **themes** is not used.
+* The name of a theme, which will be looked up in the current *themes*
+  object.
+* A configuration object with any of `hasUnicode`, `hasColor` or
+  `platform` keys, which if wlll be used to override our guesses when making
+  a default theme selection.
+
+If no theme is selected then a default is picked using a combination of our
+best guesses at your OS, color support and unicode support.
+
+#### `gauge.setTemplate(template)`
+
+Change the active template, will be displayed with the next show or pulse
+
+### Tracking Completion
+
+If you have more than one thing going on that you want to track completion
+of, you may find the related [are-we-there-yet] helpful.  It's `change`
+event can be wired up to the `show` method to get a more traditional
+progress bar interface.
+
+[are-we-there-yet]: https://www.npmjs.com/package/are-we-there-yet
+
+### THEMES
+
+```
+var themes = require('gauge/themes')
+
+// fetch the default color unicode theme for this platform
+var ourTheme = themes({hasUnicode: true, hasColor: true})
+
+// fetch the default non-color unicode theme for osx
+var ourTheme = themes({hasUnicode: true, hasColor: false, platform: 'darwin'})
+
+// create a new theme based on the color ascii theme for this platform
+// that brackets the progress bar with arrows
+var ourTheme = themes.newTheme(theme(hasUnicode: false, hasColor: true}), {
+  preProgressbar: '→',
+  postProgressbar: '←'
+})
+```
+
+The object returned by `gauge/themes` is an instance of the `ThemeSet` class.
+
+```
+var ThemeSet = require('gauge/theme-set')
+var themes = new ThemeSet()
+// or
+var themes = require('gauge/themes')
+var mythemes = themes.newThemeset() // creates a new themeset based on the default themes
+```
+
+#### themes(opts)
+#### themes.getDefault(opts)
+
+Theme objects are a function that fetches the default theme based on
+platform, unicode and color support.
+
+Options is an object with the following properties:
+
+* **hasUnicode** - If true, fetch a unicode theme, if no unicode theme is
+  available then a non-unicode theme will be used.
+* **hasColor** - If true, fetch a color theme, if no color theme is
+  available a non-color theme will be used.
+* **platform** (optional) - Defaults to `process.platform`.  If no
+  platform match is available then `fallback` is used instead.
+
+If no compatible theme can be found then an error will be thrown with a
+`code` of `EMISSINGTHEME`.
+
+#### themes.addTheme(themeName, themeObj)
+#### themes.addTheme(themeName, [parentTheme], newTheme)
+
+Adds a named theme to the themeset.  You can pass in either a theme object,
+as returned by `themes.newTheme` or the arguments you'd pass to
+`themes.newTheme`.
+
+#### themes.getThemeNames()
+
+Return a list of all of the names of the themes in this themeset. Suitable
+for use in `themes.getTheme(…)`.
+
+#### themes.getTheme(name)
+
+Returns the theme object from this theme set named `name`.
+
+If `name` does not exist in this themeset an error will be thrown with
+a `code` of `EMISSINGTHEME`.
+
+#### themes.setDefault([opts], themeName)
+
+`opts` is an object with the following properties.
+
+* **platform** - Defaults to `'fallback'`.  If your theme is platform
+  specific, specify that here with the platform from `process.platform`, eg,
+  `win32`, `darwin`, etc.
+* **hasUnicode** - Defaults to `false`. If your theme uses unicode you
+  should set this to true.
+* **hasColor** - Defaults to `false`.  If your theme uses color you should
+  set this to true.
+
+`themeName` is the name of the theme (as given to `addTheme`) to use for
+this set of `opts`.
+
+#### themes.newTheme([parentTheme,] newTheme)
+
+Create a new theme object based on `parentTheme`.  If no `parentTheme` is
+provided then a minimal parentTheme that defines functions for rendering the
+activity indicator (spinner) and progress bar will be defined. (This
+fallback parent is defined in `gauge/base-theme`.)
+
+newTheme should be a bare object– we'll start by discussing the properties
+defined by the default themes:
+
+* **preProgressbar** - displayed prior to the progress bar, if the progress
+  bar is displayed.
+* **postProgressbar** - displayed after the progress bar, if the progress bar
+  is displayed.
+* **progressBarTheme** - The subtheme passed through to the progress bar
+  renderer, it's an object with `complete` and `remaining` properties
+  that are the strings you want repeated for those sections of the progress
+  bar.
+* **activityIndicatorTheme** - The theme for the activity indicator (spinner),
+  this can either be a string, in which each character is a different step, or
+  an array of strings.
+* **preSubsection** - Displayed as a separator between the `section` and
+  `subsection` when the latter is printed.
+
+More generally, themes can have any value that would be a valid value when rendering
+templates. The properties in the theme are used when their name matches a type in
+the template. Their values can be:
+
+* **strings & numbers** - They'll be included as is
+* **function (values, theme, width)** - Should return what you want in your output.
+  *values* is an object with values provided via `gauge.show`,
+  *theme* is the theme specific to this item (see below) or this theme object,
+  and *width* is the number of characters wide your result should be.
+
+There are a couple of special prefixes:
+
+* **pre** - Is shown prior to the property, if its displayed.
+* **post** - Is shown after the property, if its displayed.
+
+And one special suffix:
+
+* **Theme** - Its value is passed to a function-type item as the theme.
+
+#### themes.addToAllThemes(theme)
+
+This *mixes-in* `theme` into all themes currently defined. It also adds it
+to the default parent theme for this themeset, so future themes added to
+this themeset will get the values from `theme` by default.
+
+#### themes.newThemeset()
+
+Copy the current themeset into a new one.  This allows you to easily inherit
+one themeset from another.
+
+### TEMPLATES
+
+A template is an array of objects and strings that, after being evaluated,
+will be turned into the gauge line.  The default template is:
+
+```javascript
+[
+    {type: 'progressbar', length: 20},
+    {type: 'activityIndicator', kerning: 1, length: 1},
+    {type: 'section', kerning: 1, default: ''},
+    {type: 'subsection', kerning: 1, default: ''}
+]
+```
+
+The various template elements can either be **plain strings**, in which case they will
+be be included verbatum in the output, or objects with the following properties:
+
+* *type* can be any of the following plus any keys you pass into `gauge.show` plus
+  any keys you have on a custom theme.
+  * `section` – What big thing you're working on now.
+  * `subsection` – What component of that thing is currently working.
+  * `activityIndicator` – Shows a spinner using the `activityIndicatorTheme`
+    from your active theme.
+  * `progressbar` – A progress bar representing your current `completed`
+    using the `progressbarTheme` from your active theme.
+* *kerning* – Number of spaces that must be between this item and other
+  items, if this item is displayed at all.
+* *maxLength* – The maximum length for this element. If its value is longer it
+  will be truncated.
+* *minLength* – The minimum length for this element. If its value is shorter it
+  will be padded according to the *align* value.
+* *align* – (Default: left) Possible values "left", "right" and "center". Works
+  as you'd expect from word processors.
+* *length* – Provides a single value for both *minLength* and *maxLength*. If both
+  *length* and *minLength or *maxLength* are specifed then the latter take precedence.
+* *value* – A literal value to use for this template item.
+* *default* – A default value to use for this template item if a value
+  wasn't otherwise passed in.
+
+### PLUMBING
+
+This is the super simple, assume nothing, do no magic internals used by gauge to
+implement its ordinary interface.
+
+```
+var Plumbing = require('gauge/plumbing')
+var gauge = new Plumbing(theme, template, width)
+```
+
+* **theme**: The theme to use.
+* **template**: The template to use.
+* **width**: How wide your gauge should be
+
+#### `gauge.setTheme(theme)`
+
+Change the active theme.
+
+#### `gauge.setTemplate(template)`
+
+Change the active template.
+
+#### `gauge.setWidth(width)`
+
+Change the width to render at.
+
+#### `gauge.hide()`
+
+Return the string necessary to hide the progress bar
+
+#### `gauge.hideCursor()`
+
+Return a string to hide the cursor.
+
+#### `gauge.showCursor()`
+
+Return a string to show the cursor.
+
+#### `gauge.show(status)`
+
+Using `status` for values, render the provided template with the theme and return
+a string that is suitable for printing to update the gauge.
diff --git a/node_modules/gauge/base-theme.js b/node_modules/gauge/base-theme.js
new file mode 100644
index 0000000..0b67638
--- /dev/null
+++ b/node_modules/gauge/base-theme.js
@@ -0,0 +1,14 @@
+'use strict'
+var spin = require('./spin.js')
+var progressBar = require('./progress-bar.js')
+
+module.exports = {
+  activityIndicator: function (values, theme, width) {
+    if (values.spun == null) return
+    return spin(theme, values.spun)
+  },
+  progressbar: function (values, theme, width) {
+    if (values.completed == null) return
+    return progressBar(theme, width, values.completed)
+  }
+}
diff --git a/node_modules/gauge/error.js b/node_modules/gauge/error.js
new file mode 100644
index 0000000..d9914ba
--- /dev/null
+++ b/node_modules/gauge/error.js
@@ -0,0 +1,24 @@
+'use strict'
+var util = require('util')
+
+var User = exports.User = function User (msg) {
+  var err = new Error(msg)
+  Error.captureStackTrace(err, User)
+  err.code = 'EGAUGE'
+  return err
+}
+
+exports.MissingTemplateValue = function MissingTemplateValue (item, values) {
+  var err = new User(util.format('Missing template value "%s"', item.type))
+  Error.captureStackTrace(err, MissingTemplateValue)
+  err.template = item
+  err.values = values
+  return err
+}
+
+exports.Internal = function Internal (msg) {
+  var err = new Error(msg)
+  Error.captureStackTrace(err, Internal)
+  err.code = 'EGAUGEINTERNAL'
+  return err
+}
diff --git a/node_modules/gauge/has-color.js b/node_modules/gauge/has-color.js
new file mode 100644
index 0000000..e283a25
--- /dev/null
+++ b/node_modules/gauge/has-color.js
@@ -0,0 +1,12 @@
+'use strict'
+
+module.exports = isWin32() || isColorTerm()
+
+function isWin32 () {
+  return process.platform === 'win32'
+}
+
+function isColorTerm () {
+  var termHasColor = /^screen|^xterm|^vt100|color|ansi|cygwin|linux/i
+  return !!process.env.COLORTERM || termHasColor.test(process.env.TERM)
+}
diff --git a/node_modules/gauge/index.js b/node_modules/gauge/index.js
new file mode 100644
index 0000000..c553240
--- /dev/null
+++ b/node_modules/gauge/index.js
@@ -0,0 +1,233 @@
+'use strict'
+var Plumbing = require('./plumbing.js')
+var hasUnicode = require('has-unicode')
+var hasColor = require('./has-color.js')
+var onExit = require('signal-exit')
+var defaultThemes = require('./themes')
+var setInterval = require('./set-interval.js')
+var process = require('./process.js')
+var setImmediate = require('./set-immediate')
+
+module.exports = Gauge
+
+function callWith (obj, method) {
+  return function () {
+    return method.call(obj)
+  }
+}
+
+function Gauge (arg1, arg2) {
+  var options, writeTo
+  if (arg1 && arg1.write) {
+    writeTo = arg1
+    options = arg2 || {}
+  } else if (arg2 && arg2.write) {
+    writeTo = arg2
+    options = arg1 || {}
+  } else {
+    writeTo = process.stderr
+    options = arg1 || arg2 || {}
+  }
+
+  this._status = {
+    spun: 0,
+    section: '',
+    subsection: ''
+  }
+  this._paused = false // are we paused for back pressure?
+  this._disabled = true // are all progress bar updates disabled?
+  this._showing = false // do we WANT the progress bar on screen
+  this._onScreen = false // IS the progress bar on screen
+  this._needsRedraw = false // should we print something at next tick?
+  this._hideCursor = options.hideCursor == null ? true : options.hideCursor
+  this._fixedFramerate = options.fixedFramerate == null
+    ? !(/^v0\.8\./.test(process.version))
+    : options.fixedFramerate
+  this._lastUpdateAt = null
+  this._updateInterval = options.updateInterval == null ? 50 : options.updateInterval
+
+  this._themes = options.themes || defaultThemes
+  this._theme = options.theme
+  var theme = this._computeTheme(options.theme)
+  var template = options.template || [
+    {type: 'progressbar', length: 20},
+    {type: 'activityIndicator', kerning: 1, length: 1},
+    {type: 'section', kerning: 1, default: ''},
+    {type: 'subsection', kerning: 1, default: ''}
+  ]
+  this.setWriteTo(writeTo, options.tty)
+  var PlumbingClass = options.Plumbing || Plumbing
+  this._gauge = new PlumbingClass(theme, template, this.getWidth())
+
+  this._$$doRedraw = callWith(this, this._doRedraw)
+  this._$$handleSizeChange = callWith(this, this._handleSizeChange)
+
+  this._cleanupOnExit = options.cleanupOnExit == null || options.cleanupOnExit
+  this._removeOnExit = null
+
+  if (options.enabled || (options.enabled == null && this._tty && this._tty.isTTY)) {
+    this.enable()
+  } else {
+    this.disable()
+  }
+}
+Gauge.prototype = {}
+
+Gauge.prototype.isEnabled = function () {
+  return !this._disabled
+}
+
+Gauge.prototype.setTemplate = function (template) {
+  this._gauge.setTemplate(template)
+  if (this._showing) this._requestRedraw()
+}
+
+Gauge.prototype._computeTheme = function (theme) {
+  if (!theme) theme = {}
+  if (typeof theme === 'string') {
+    theme = this._themes.getTheme(theme)
+  } else if (theme && (Object.keys(theme).length === 0 || theme.hasUnicode != null || theme.hasColor != null)) {
+    var useUnicode = theme.hasUnicode == null ? hasUnicode() : theme.hasUnicode
+    var useColor = theme.hasColor == null ? hasColor : theme.hasColor
+    theme = this._themes.getDefault({hasUnicode: useUnicode, hasColor: useColor, platform: theme.platform})
+  }
+  return theme
+}
+
+Gauge.prototype.setThemeset = function (themes) {
+  this._themes = themes
+  this.setTheme(this._theme)
+}
+
+Gauge.prototype.setTheme = function (theme) {
+  this._gauge.setTheme(this._computeTheme(theme))
+  if (this._showing) this._requestRedraw()
+  this._theme = theme
+}
+
+Gauge.prototype._requestRedraw = function () {
+  this._needsRedraw = true
+  if (!this._fixedFramerate) this._doRedraw()
+}
+
+Gauge.prototype.getWidth = function () {
+  return ((this._tty && this._tty.columns) || 80) - 1
+}
+
+Gauge.prototype.setWriteTo = function (writeTo, tty) {
+  var enabled = !this._disabled
+  if (enabled) this.disable()
+  this._writeTo = writeTo
+  this._tty = tty ||
+    (writeTo === process.stderr && process.stdout.isTTY && process.stdout) ||
+    (writeTo.isTTY && writeTo) ||
+    this._tty
+  if (this._gauge) this._gauge.setWidth(this.getWidth())
+  if (enabled) this.enable()
+}
+
+Gauge.prototype.enable = function () {
+  if (!this._disabled) return
+  this._disabled = false
+  if (this._tty) this._enableEvents()
+  if (this._showing) this.show()
+}
+
+Gauge.prototype.disable = function () {
+  if (this._disabled) return
+  if (this._showing) {
+    this._lastUpdateAt = null
+    this._showing = false
+    this._doRedraw()
+    this._showing = true
+  }
+  this._disabled = true
+  if (this._tty) this._disableEvents()
+}
+
+Gauge.prototype._enableEvents = function () {
+  if (this._cleanupOnExit) {
+    this._removeOnExit = onExit(callWith(this, this.disable))
+  }
+  this._tty.on('resize', this._$$handleSizeChange)
+  if (this._fixedFramerate) {
+    this.redrawTracker = setInterval(this._$$doRedraw, this._updateInterval)
+    if (this.redrawTracker.unref) this.redrawTracker.unref()
+  }
+}
+
+Gauge.prototype._disableEvents = function () {
+  this._tty.removeListener('resize', this._$$handleSizeChange)
+  if (this._fixedFramerate) clearInterval(this.redrawTracker)
+  if (this._removeOnExit) this._removeOnExit()
+}
+
+Gauge.prototype.hide = function (cb) {
+  if (this._disabled) return cb && process.nextTick(cb)
+  if (!this._showing) return cb && process.nextTick(cb)
+  this._showing = false
+  this._doRedraw()
+  cb && setImmediate(cb)
+}
+
+Gauge.prototype.show = function (section, completed) {
+  this._showing = true
+  if (typeof section === 'string') {
+    this._status.section = section
+  } else if (typeof section === 'object') {
+    var sectionKeys = Object.keys(section)
+    for (var ii = 0; ii < sectionKeys.length; ++ii) {
+      var key = sectionKeys[ii]
+      this._status[key] = section[key]
+    }
+  }
+  if (completed != null) this._status.completed = completed
+  if (this._disabled) return
+  this._requestRedraw()
+}
+
+Gauge.prototype.pulse = function (subsection) {
+  this._status.subsection = subsection || ''
+  this._status.spun ++
+  if (this._disabled) return
+  if (!this._showing) return
+  this._requestRedraw()
+}
+
+Gauge.prototype._handleSizeChange = function () {
+  this._gauge.setWidth(this._tty.columns - 1)
+  this._requestRedraw()
+}
+
+Gauge.prototype._doRedraw = function () {
+  if (this._disabled || this._paused) return
+  if (!this._fixedFramerate) {
+    var now = Date.now()
+    if (this._lastUpdateAt && now - this._lastUpdateAt < this._updateInterval) return
+    this._lastUpdateAt = now
+  }
+  if (!this._showing && this._onScreen) {
+    this._onScreen = false
+    var result = this._gauge.hide()
+    if (this._hideCursor) {
+      result += this._gauge.showCursor()
+    }
+    return this._writeTo.write(result)
+  }
+  if (!this._showing && !this._onScreen) return
+  if (this._showing && !this._onScreen) {
+    this._onScreen = true
+    this._needsRedraw = true
+    if (this._hideCursor) {
+      this._writeTo.write(this._gauge.hideCursor())
+    }
+  }
+  if (!this._needsRedraw) return
+  if (!this._writeTo.write(this._gauge.show(this._status))) {
+    this._paused = true
+    this._writeTo.on('drain', callWith(this, function () {
+      this._paused = false
+      this._doRedraw()
+    }))
+  }
+}
diff --git a/node_modules/gauge/package.json b/node_modules/gauge/package.json
new file mode 100644
index 0000000..3fa5693
--- /dev/null
+++ b/node_modules/gauge/package.json
@@ -0,0 +1,91 @@
+{
+  "_from": "gauge@~2.7.3",
+  "_id": "gauge@2.7.4",
+  "_inBundle": false,
+  "_integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+  "_location": "/gauge",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "gauge@~2.7.3",
+    "name": "gauge",
+    "escapedName": "gauge",
+    "rawSpec": "~2.7.3",
+    "saveSpec": null,
+    "fetchSpec": "~2.7.3"
+  },
+  "_requiredBy": [
+    "/npmlog"
+  ],
+  "_resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+  "_shasum": "2c03405c7538c39d7eb37b317022e325fb018bf7",
+  "_spec": "gauge@~2.7.3",
+  "_where": "F:\\vent-display\\node_modules\\npmlog",
+  "author": {
+    "name": "Rebecca Turner",
+    "email": "me@re-becca.org"
+  },
+  "bugs": {
+    "url": "https://github.com/iarna/gauge/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "aproba": "^1.0.3",
+    "console-control-strings": "^1.0.0",
+    "has-unicode": "^2.0.0",
+    "object-assign": "^4.1.0",
+    "signal-exit": "^3.0.0",
+    "string-width": "^1.0.1",
+    "strip-ansi": "^3.0.1",
+    "wide-align": "^1.1.0"
+  },
+  "deprecated": false,
+  "description": "A terminal based horizontal guage",
+  "devDependencies": {
+    "readable-stream": "^2.0.6",
+    "require-inject": "^1.4.0",
+    "standard": "^7.1.2",
+    "tap": "^5.7.2",
+    "through2": "^2.0.0"
+  },
+  "files": [
+    "base-theme.js",
+    "CHANGELOG.md",
+    "error.js",
+    "has-color.js",
+    "index.js",
+    "LICENSE",
+    "package.json",
+    "plumbing.js",
+    "process.js",
+    "progress-bar.js",
+    "README.md",
+    "render-template.js",
+    "set-immediate.js",
+    "set-interval.js",
+    "spin.js",
+    "template-item.js",
+    "theme-set.js",
+    "themes.js",
+    "wide-truncate.js"
+  ],
+  "homepage": "https://github.com/iarna/gauge",
+  "keywords": [
+    "progressbar",
+    "progress",
+    "gauge"
+  ],
+  "license": "ISC",
+  "main": "index.js",
+  "name": "gauge",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/iarna/gauge.git"
+  },
+  "scripts": {
+    "prepublish": "rm -f *~",
+    "test": "standard && tap test/*.js --coverage"
+  },
+  "version": "2.7.4"
+}
diff --git a/node_modules/gauge/plumbing.js b/node_modules/gauge/plumbing.js
new file mode 100644
index 0000000..1afb4af
--- /dev/null
+++ b/node_modules/gauge/plumbing.js
@@ -0,0 +1,48 @@
+'use strict'
+var consoleControl = require('console-control-strings')
+var renderTemplate = require('./render-template.js')
+var validate = require('aproba')
+
+var Plumbing = module.exports = function (theme, template, width) {
+  if (!width) width = 80
+  validate('OAN', [theme, template, width])
+  this.showing = false
+  this.theme = theme
+  this.width = width
+  this.template = template
+}
+Plumbing.prototype = {}
+
+Plumbing.prototype.setTheme = function (theme) {
+  validate('O', [theme])
+  this.theme = theme
+}
+
+Plumbing.prototype.setTemplate = function (template) {
+  validate('A', [template])
+  this.template = template
+}
+
+Plumbing.prototype.setWidth = function (width) {
+  validate('N', [width])
+  this.width = width
+}
+
+Plumbing.prototype.hide = function () {
+  return consoleControl.gotoSOL() + consoleControl.eraseLine()
+}
+
+Plumbing.prototype.hideCursor = consoleControl.hideCursor
+
+Plumbing.prototype.showCursor = consoleControl.showCursor
+
+Plumbing.prototype.show = function (status) {
+  var values = Object.create(this.theme)
+  for (var key in status) {
+    values[key] = status[key]
+  }
+
+  return renderTemplate(this.width, this.template, values).trim() +
+         consoleControl.color('reset') +
+         consoleControl.eraseLine() + consoleControl.gotoSOL()
+}
diff --git a/node_modules/gauge/process.js b/node_modules/gauge/process.js
new file mode 100644
index 0000000..05e8569
--- /dev/null
+++ b/node_modules/gauge/process.js
@@ -0,0 +1,3 @@
+'use strict'
+// this exists so we can replace it during testing
+module.exports = process
diff --git a/node_modules/gauge/progress-bar.js b/node_modules/gauge/progress-bar.js
new file mode 100644
index 0000000..7f8dd68
--- /dev/null
+++ b/node_modules/gauge/progress-bar.js
@@ -0,0 +1,35 @@
+'use strict'
+var validate = require('aproba')
+var renderTemplate = require('./render-template.js')
+var wideTruncate = require('./wide-truncate')
+var stringWidth = require('string-width')
+
+module.exports = function (theme, width, completed) {
+  validate('ONN', [theme, width, completed])
+  if (completed < 0) completed = 0
+  if (completed > 1) completed = 1
+  if (width <= 0) return ''
+  var sofar = Math.round(width * completed)
+  var rest = width - sofar
+  var template = [
+    {type: 'complete', value: repeat(theme.complete, sofar), length: sofar},
+    {type: 'remaining', value: repeat(theme.remaining, rest), length: rest}
+  ]
+  return renderTemplate(width, template, theme)
+}
+
+// lodash's way of repeating
+function repeat (string, width) {
+  var result = ''
+  var n = width
+  do {
+    if (n % 2) {
+      result += string
+    }
+    n = Math.floor(n / 2)
+    /*eslint no-self-assign: 0*/
+    string += string
+  } while (n && stringWidth(result) < width)
+
+  return wideTruncate(result, width)
+}
diff --git a/node_modules/gauge/render-template.js b/node_modules/gauge/render-template.js
new file mode 100644
index 0000000..3261bfb
--- /dev/null
+++ b/node_modules/gauge/render-template.js
@@ -0,0 +1,181 @@
+'use strict'
+var align = require('wide-align')
+var validate = require('aproba')
+var objectAssign = require('object-assign')
+var wideTruncate = require('./wide-truncate')
+var error = require('./error')
+var TemplateItem = require('./template-item')
+
+function renderValueWithValues (values) {
+  return function (item) {
+    return renderValue(item, values)
+  }
+}
+
+var renderTemplate = module.exports = function (width, template, values) {
+  var items = prepareItems(width, template, values)
+  var rendered = items.map(renderValueWithValues(values)).join('')
+  return align.left(wideTruncate(rendered, width), width)
+}
+
+function preType (item) {
+  var cappedTypeName = item.type[0].toUpperCase() + item.type.slice(1)
+  return 'pre' + cappedTypeName
+}
+
+function postType (item) {
+  var cappedTypeName = item.type[0].toUpperCase() + item.type.slice(1)
+  return 'post' + cappedTypeName
+}
+
+function hasPreOrPost (item, values) {
+  if (!item.type) return
+  return values[preType(item)] || values[postType(item)]
+}
+
+function generatePreAndPost (baseItem, parentValues) {
+  var item = objectAssign({}, baseItem)
+  var values = Object.create(parentValues)
+  var template = []
+  var pre = preType(item)
+  var post = postType(item)
+  if (values[pre]) {
+    template.push({value: values[pre]})
+    values[pre] = null
+  }
+  item.minLength = null
+  item.length = null
+  item.maxLength = null
+  template.push(item)
+  values[item.type] = values[item.type]
+  if (values[post]) {
+    template.push({value: values[post]})
+    values[post] = null
+  }
+  return function ($1, $2, length) {
+    return renderTemplate(length, template, values)
+  }
+}
+
+function prepareItems (width, template, values) {
+  function cloneAndObjectify (item, index, arr) {
+    var cloned = new TemplateItem(item, width)
+    var type = cloned.type
+    if (cloned.value == null) {
+      if (!(type in values)) {
+        if (cloned.default == null) {
+          throw new error.MissingTemplateValue(cloned, values)
+        } else {
+          cloned.value = cloned.default
+        }
+      } else {
+        cloned.value = values[type]
+      }
+    }
+    if (cloned.value == null || cloned.value === '') return null
+    cloned.index = index
+    cloned.first = index === 0
+    cloned.last = index === arr.length - 1
+    if (hasPreOrPost(cloned, values)) cloned.value = generatePreAndPost(cloned, values)
+    return cloned
+  }
+
+  var output = template.map(cloneAndObjectify).filter(function (item) { return item != null })
+
+  var outputLength = 0
+  var remainingSpace = width
+  var variableCount = output.length
+
+  function consumeSpace (length) {
+    if (length > remainingSpace) length = remainingSpace
+    outputLength += length
+    remainingSpace -= length
+  }
+
+  function finishSizing (item, length) {
+    if (item.finished) throw new error.Internal('Tried to finish template item that was already finished')
+    if (length === Infinity) throw new error.Internal('Length of template item cannot be infinity')
+    if (length != null) item.length = length
+    item.minLength = null
+    item.maxLength = null
+    --variableCount
+    item.finished = true
+    if (item.length == null) item.length = item.getBaseLength()
+    if (item.length == null) throw new error.Internal('Finished template items must have a length')
+    consumeSpace(item.getLength())
+  }
+
+  output.forEach(function (item) {
+    if (!item.kerning) return
+    var prevPadRight = item.first ? 0 : output[item.index - 1].padRight
+    if (!item.first && prevPadRight < item.kerning) item.padLeft = item.kerning - prevPadRight
+    if (!item.last) item.padRight = item.kerning
+  })
+
+  // Finish any that have a fixed (literal or intuited) length
+  output.forEach(function (item) {
+    if (item.getBaseLength() == null) return
+    finishSizing(item)
+  })
+
+  var resized = 0
+  var resizing
+  var hunkSize
+  do {
+    resizing = false
+    hunkSize = Math.round(remainingSpace / variableCount)
+    output.forEach(function (item) {
+      if (item.finished) return
+      if (!item.maxLength) return
+      if (item.getMaxLength() < hunkSize) {
+        finishSizing(item, item.maxLength)
+        resizing = true
+      }
+    })
+  } while (resizing && resized++ < output.length)
+  if (resizing) throw new error.Internal('Resize loop iterated too many times while determining maxLength')
+
+  resized = 0
+  do {
+    resizing = false
+    hunkSize = Math.round(remainingSpace / variableCount)
+    output.forEach(function (item) {
+      if (item.finished) return
+      if (!item.minLength) return
+      if (item.getMinLength() >= hunkSize) {
+        finishSizing(item, item.minLength)
+        resizing = true
+      }
+    })
+  } while (resizing && resized++ < output.length)
+  if (resizing) throw new error.Internal('Resize loop iterated too many times while determining minLength')
+
+  hunkSize = Math.round(remainingSpace / variableCount)
+  output.forEach(function (item) {
+    if (item.finished) return
+    finishSizing(item, hunkSize)
+  })
+
+  return output
+}
+
+function renderFunction (item, values, length) {
+  validate('OON', arguments)
+  if (item.type) {
+    return item.value(values, values[item.type + 'Theme'] || {}, length)
+  } else {
+    return item.value(values, {}, length)
+  }
+}
+
+function renderValue (item, values) {
+  var length = item.getBaseLength()
+  var value = typeof item.value === 'function' ? renderFunction(item, values, length) : item.value
+  if (value == null || value === '') return ''
+  var alignWith = align[item.align] || align.left
+  var leftPadding = item.padLeft ? align.left('', item.padLeft) : ''
+  var rightPadding = item.padRight ? align.right('', item.padRight) : ''
+  var truncated = wideTruncate(String(value), length)
+  var aligned = alignWith(truncated, length)
+  return leftPadding + aligned + rightPadding
+}
diff --git a/node_modules/gauge/set-immediate.js b/node_modules/gauge/set-immediate.js
new file mode 100644
index 0000000..6650a48
--- /dev/null
+++ b/node_modules/gauge/set-immediate.js
@@ -0,0 +1,7 @@
+'use strict'
+var process = require('./process')
+try {
+  module.exports = setImmediate
+} catch (ex) {
+  module.exports = process.nextTick
+}
diff --git a/node_modules/gauge/set-interval.js b/node_modules/gauge/set-interval.js
new file mode 100644
index 0000000..5761987
--- /dev/null
+++ b/node_modules/gauge/set-interval.js
@@ -0,0 +1,3 @@
+'use strict'
+// this exists so we can replace it during testing
+module.exports = setInterval
diff --git a/node_modules/gauge/spin.js b/node_modules/gauge/spin.js
new file mode 100644
index 0000000..34142ee
--- /dev/null
+++ b/node_modules/gauge/spin.js
@@ -0,0 +1,5 @@
+'use strict'
+
+module.exports = function spin (spinstr, spun) {
+  return spinstr[spun % spinstr.length]
+}
diff --git a/node_modules/gauge/template-item.js b/node_modules/gauge/template-item.js
new file mode 100644
index 0000000..e46f447
--- /dev/null
+++ b/node_modules/gauge/template-item.js
@@ -0,0 +1,73 @@
+'use strict'
+var stringWidth = require('string-width')
+
+module.exports = TemplateItem
+
+function isPercent (num) {
+  if (typeof num !== 'string') return false
+  return num.slice(-1) === '%'
+}
+
+function percent (num) {
+  return Number(num.slice(0, -1)) / 100
+}
+
+function TemplateItem (values, outputLength) {
+  this.overallOutputLength = outputLength
+  this.finished = false
+  this.type = null
+  this.value = null
+  this.length = null
+  this.maxLength = null
+  this.minLength = null
+  this.kerning = null
+  this.align = 'left'
+  this.padLeft = 0
+  this.padRight = 0
+  this.index = null
+  this.first = null
+  this.last = null
+  if (typeof values === 'string') {
+    this.value = values
+  } else {
+    for (var prop in values) this[prop] = values[prop]
+  }
+  // Realize percents
+  if (isPercent(this.length)) {
+    this.length = Math.round(this.overallOutputLength * percent(this.length))
+  }
+  if (isPercent(this.minLength)) {
+    this.minLength = Math.round(this.overallOutputLength * percent(this.minLength))
+  }
+  if (isPercent(this.maxLength)) {
+    this.maxLength = Math.round(this.overallOutputLength * percent(this.maxLength))
+  }
+  return this
+}
+
+TemplateItem.prototype = {}
+
+TemplateItem.prototype.getBaseLength = function () {
+  var length = this.length
+  if (length == null && typeof this.value === 'string' && this.maxLength == null && this.minLength == null) {
+    length = stringWidth(this.value)
+  }
+  return length
+}
+
+TemplateItem.prototype.getLength = function () {
+  var length = this.getBaseLength()
+  if (length == null) return null
+  return length + this.padLeft + this.padRight
+}
+
+TemplateItem.prototype.getMaxLength = function () {
+  if (this.maxLength == null) return null
+  return this.maxLength + this.padLeft + this.padRight
+}
+
+TemplateItem.prototype.getMinLength = function () {
+  if (this.minLength == null) return null
+  return this.minLength + this.padLeft + this.padRight
+}
+
diff --git a/node_modules/gauge/theme-set.js b/node_modules/gauge/theme-set.js
new file mode 100644
index 0000000..68971d5
--- /dev/null
+++ b/node_modules/gauge/theme-set.js
@@ -0,0 +1,115 @@
+'use strict'
+var objectAssign = require('object-assign')
+
+module.exports = function () {
+  return ThemeSetProto.newThemeSet()
+}
+
+var ThemeSetProto = {}
+
+ThemeSetProto.baseTheme = require('./base-theme.js')
+
+ThemeSetProto.newTheme = function (parent, theme) {
+  if (!theme) {
+    theme = parent
+    parent = this.baseTheme
+  }
+  return objectAssign({}, parent, theme)
+}
+
+ThemeSetProto.getThemeNames = function () {
+  return Object.keys(this.themes)
+}
+
+ThemeSetProto.addTheme = function (name, parent, theme) {
+  this.themes[name] = this.newTheme(parent, theme)
+}
+
+ThemeSetProto.addToAllThemes = function (theme) {
+  var themes = this.themes
+  Object.keys(themes).forEach(function (name) {
+    objectAssign(themes[name], theme)
+  })
+  objectAssign(this.baseTheme, theme)
+}
+
+ThemeSetProto.getTheme = function (name) {
+  if (!this.themes[name]) throw this.newMissingThemeError(name)
+  return this.themes[name]
+}
+
+ThemeSetProto.setDefault = function (opts, name) {
+  if (name == null) {
+    name = opts
+    opts = {}
+  }
+  var platform = opts.platform == null ? 'fallback' : opts.platform
+  var hasUnicode = !!opts.hasUnicode
+  var hasColor = !!opts.hasColor
+  if (!this.defaults[platform]) this.defaults[platform] = {true: {}, false: {}}
+  this.defaults[platform][hasUnicode][hasColor] = name
+}
+
+ThemeSetProto.getDefault = function (opts) {
+  if (!opts) opts = {}
+  var platformName = opts.platform || process.platform
+  var platform = this.defaults[platformName] || this.defaults.fallback
+  var hasUnicode = !!opts.hasUnicode
+  var hasColor = !!opts.hasColor
+  if (!platform) throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor)
+  if (!platform[hasUnicode][hasColor]) {
+    if (hasUnicode && hasColor && platform[!hasUnicode][hasColor]) {
+      hasUnicode = false
+    } else if (hasUnicode && hasColor && platform[hasUnicode][!hasColor]) {
+      hasColor = false
+    } else if (hasUnicode && hasColor && platform[!hasUnicode][!hasColor]) {
+      hasUnicode = false
+      hasColor = false
+    } else if (hasUnicode && !hasColor && platform[!hasUnicode][hasColor]) {
+      hasUnicode = false
+    } else if (!hasUnicode && hasColor && platform[hasUnicode][!hasColor]) {
+      hasColor = false
+    } else if (platform === this.defaults.fallback) {
+      throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor)
+    }
+  }
+  if (platform[hasUnicode][hasColor]) {
+    return this.getTheme(platform[hasUnicode][hasColor])
+  } else {
+    return this.getDefault(objectAssign({}, opts, {platform: 'fallback'}))
+  }
+}
+
+ThemeSetProto.newMissingThemeError = function newMissingThemeError (name) {
+  var err = new Error('Could not find a gauge theme named "' + name + '"')
+  Error.captureStackTrace.call(err, newMissingThemeError)
+  err.theme = name
+  err.code = 'EMISSINGTHEME'
+  return err
+}
+
+ThemeSetProto.newMissingDefaultThemeError = function newMissingDefaultThemeError (platformName, hasUnicode, hasColor) {
+  var err = new Error(
+    'Could not find a gauge theme for your platform/unicode/color use combo:\n' +
+    '    platform = ' + platformName + '\n' +
+    '    hasUnicode = ' + hasUnicode + '\n' +
+    '    hasColor = ' + hasColor)
+  Error.captureStackTrace.call(err, newMissingDefaultThemeError)
+  err.platform = platformName
+  err.hasUnicode = hasUnicode
+  err.hasColor = hasColor
+  err.code = 'EMISSINGTHEME'
+  return err
+}
+
+ThemeSetProto.newThemeSet = function () {
+  var themeset = function (opts) {
+    return themeset.getDefault(opts)
+  }
+  return objectAssign(themeset, ThemeSetProto, {
+    themes: objectAssign({}, this.themes),
+    baseTheme: objectAssign({}, this.baseTheme),
+    defaults: JSON.parse(JSON.stringify(this.defaults || {}))
+  })
+}
+
diff --git a/node_modules/gauge/themes.js b/node_modules/gauge/themes.js
new file mode 100644
index 0000000..eb5a4f5
--- /dev/null
+++ b/node_modules/gauge/themes.js
@@ -0,0 +1,54 @@
+'use strict'
+var consoleControl = require('console-control-strings')
+var ThemeSet = require('./theme-set.js')
+
+var themes = module.exports = new ThemeSet()
+
+themes.addTheme('ASCII', {
+  preProgressbar: '[',
+  postProgressbar: ']',
+  progressbarTheme: {
+    complete: '#',
+    remaining: '.'
+  },
+  activityIndicatorTheme: '-\\|/',
+  preSubsection: '>'
+})
+
+themes.addTheme('colorASCII', themes.getTheme('ASCII'), {
+  progressbarTheme: {
+    preComplete: consoleControl.color('inverse'),
+    complete: ' ',
+    postComplete: consoleControl.color('stopInverse'),
+    preRemaining: consoleControl.color('brightBlack'),
+    remaining: '.',
+    postRemaining: consoleControl.color('reset')
+  }
+})
+
+themes.addTheme('brailleSpinner', {
+  preProgressbar: '⸨',
+  postProgressbar: '⸩',
+  progressbarTheme: {
+    complete: 'â–‘',
+    remaining: 'â ‚'
+  },
+  activityIndicatorTheme: '⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏',
+  preSubsection: '>'
+})
+
+themes.addTheme('colorBrailleSpinner', themes.getTheme('brailleSpinner'), {
+  progressbarTheme: {
+    preComplete: consoleControl.color('inverse'),
+    complete: ' ',
+    postComplete: consoleControl.color('stopInverse'),
+    preRemaining: consoleControl.color('brightBlack'),
+    remaining: 'â–‘',
+    postRemaining: consoleControl.color('reset')
+  }
+})
+
+themes.setDefault({}, 'ASCII')
+themes.setDefault({hasColor: true}, 'colorASCII')
+themes.setDefault({platform: 'darwin', hasUnicode: true}, 'brailleSpinner')
+themes.setDefault({platform: 'darwin', hasUnicode: true, hasColor: true}, 'colorBrailleSpinner')
diff --git a/node_modules/gauge/wide-truncate.js b/node_modules/gauge/wide-truncate.js
new file mode 100644
index 0000000..c531bc4
--- /dev/null
+++ b/node_modules/gauge/wide-truncate.js
@@ -0,0 +1,25 @@
+'use strict'
+var stringWidth = require('string-width')
+var stripAnsi = require('strip-ansi')
+
+module.exports = wideTruncate
+
+function wideTruncate (str, target) {
+  if (stringWidth(str) === 0) return str
+  if (target <= 0) return ''
+  if (stringWidth(str) <= target) return str
+
+  // We compute the number of bytes of ansi sequences here and add
+  // that to our initial truncation to ensure that we don't slice one
+  // that we want to keep in half.
+  var noAnsi = stripAnsi(str)
+  var ansiSize = str.length + noAnsi.length
+  var truncated = str.slice(0, target + ansiSize)
+
+  // we have to shrink the result to account for our ansi sequence buffer
+  // (if an ansi sequence was truncated) and double width characters.
+  while (stringWidth(truncated) > target) {
+    truncated = truncated.slice(0, -1)
+  }
+  return truncated
+}
diff --git a/node_modules/github-from-package/.travis.yml b/node_modules/github-from-package/.travis.yml
new file mode 100644
index 0000000..895dbd3
--- /dev/null
+++ b/node_modules/github-from-package/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+  - 0.6
+  - 0.8
diff --git a/node_modules/github-from-package/LICENSE b/node_modules/github-from-package/LICENSE
new file mode 100644
index 0000000..ee27ba4
--- /dev/null
+++ b/node_modules/github-from-package/LICENSE
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/github-from-package/example/package.json b/node_modules/github-from-package/example/package.json
new file mode 100644
index 0000000..03494f4
--- /dev/null
+++ b/node_modules/github-from-package/example/package.json
@@ -0,0 +1,8 @@
+{
+  "name": "beep-boop",
+  "version": "1.2.3",
+  "repository" : {
+    "type" : "git",
+    "url": "git@github.com:substack/beep-boop.git"
+  }
+}
diff --git a/node_modules/github-from-package/example/url.js b/node_modules/github-from-package/example/url.js
new file mode 100644
index 0000000..138fb8a
--- /dev/null
+++ b/node_modules/github-from-package/example/url.js
@@ -0,0 +1,3 @@
+var github = require('../');
+var url = github(require('./package.json'));
+console.log(url);
diff --git a/node_modules/github-from-package/index.js b/node_modules/github-from-package/index.js
new file mode 100644
index 0000000..3d1d657
--- /dev/null
+++ b/node_modules/github-from-package/index.js
@@ -0,0 +1,17 @@
+module.exports = function (pkg) {
+    var m;
+    if (m = match(JSON.stringify(pkg.repository))) {
+        return m;
+    }
+    else if (m = match(JSON.stringify(pkg))) {
+        return m;
+    }
+    return undefined;
+};
+
+function match (str) {
+    var m = /\bgithub.com[:\/]([^\/"]+)\/([^\/"]+)/.exec(str);
+    if (m) {
+        return 'https://github.com/' + m[1] + '/' + m[2].replace(/\.git$/, '');
+    }
+}
diff --git a/node_modules/github-from-package/package.json b/node_modules/github-from-package/package.json
new file mode 100644
index 0000000..2e7dd8c
--- /dev/null
+++ b/node_modules/github-from-package/package.json
@@ -0,0 +1,58 @@
+{
+  "_from": "github-from-package@0.0.0",
+  "_id": "github-from-package@0.0.0",
+  "_inBundle": false,
+  "_integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=",
+  "_location": "/github-from-package",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "version",
+    "registry": true,
+    "raw": "github-from-package@0.0.0",
+    "name": "github-from-package",
+    "escapedName": "github-from-package",
+    "rawSpec": "0.0.0",
+    "saveSpec": null,
+    "fetchSpec": "0.0.0"
+  },
+  "_requiredBy": [
+    "/prebuild-install"
+  ],
+  "_resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+  "_shasum": "97fb5d96bfde8973313f20e8288ef9a167fa64ce",
+  "_spec": "github-from-package@0.0.0",
+  "_where": "F:\\vent-display\\node_modules\\prebuild-install",
+  "author": {
+    "name": "James Halliday",
+    "email": "mail@substack.net",
+    "url": "http://substack.net"
+  },
+  "bugs": {
+    "url": "https://github.com/substack/github-from-package/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "return the github url from a package.json file",
+  "devDependencies": {
+    "tap": "~0.3.0",
+    "tape": "~0.1.5"
+  },
+  "homepage": "https://github.com/substack/github-from-package",
+  "keywords": [
+    "github",
+    "package.json",
+    "npm",
+    "repository"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "github-from-package",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/substack/github-from-package.git"
+  },
+  "scripts": {
+    "test": "tap test/*.js"
+  },
+  "version": "0.0.0"
+}
diff --git a/node_modules/github-from-package/readme.markdown b/node_modules/github-from-package/readme.markdown
new file mode 100644
index 0000000..5ba397d
--- /dev/null
+++ b/node_modules/github-from-package/readme.markdown
@@ -0,0 +1,53 @@
+# github-from-package
+
+return the github url from a package.json file
+
+[![build status](https://secure.travis-ci.org/substack/github-from-package.png)](http://travis-ci.org/substack/github-from-package)
+
+# example
+
+For the `./package.json` file:
+
+``` json
+{
+  "name": "beep-boop",
+  "version": "1.2.3",
+  "repository" : {
+    "type" : "git",
+    "url": "git@github.com:substack/beep-boop.git"
+  }
+}
+```
+
+``` js
+var github = require('github-from-package');
+var url = github(require('./package.json'));
+console.log(url);
+```
+
+```
+https://github.com/substack/beep-boop
+```
+
+# methods
+
+``` js
+var github = require('github-from-package')
+```
+
+## var url = github(pkg)
+
+Return the most likely github url from the package.json contents `pkg`. If no
+github url can be determined, return `undefined`.
+
+# install
+
+With [npm](https://npmjs.org) do:
+
+```
+npm install github-from-package
+```
+
+# license
+
+MIT
diff --git a/node_modules/github-from-package/test/a.json b/node_modules/github-from-package/test/a.json
new file mode 100644
index 0000000..03494f4
--- /dev/null
+++ b/node_modules/github-from-package/test/a.json
@@ -0,0 +1,8 @@
+{
+  "name": "beep-boop",
+  "version": "1.2.3",
+  "repository" : {
+    "type" : "git",
+    "url": "git@github.com:substack/beep-boop.git"
+  }
+}
diff --git a/node_modules/github-from-package/test/b.json b/node_modules/github-from-package/test/b.json
new file mode 100644
index 0000000..0209325
--- /dev/null
+++ b/node_modules/github-from-package/test/b.json
@@ -0,0 +1,5 @@
+{
+  "name": "beep-boop",
+  "version": "1.2.3",
+  "repository" : "git@github.com:substack/beep-boop.git"
+}
diff --git a/node_modules/github-from-package/test/c.json b/node_modules/github-from-package/test/c.json
new file mode 100644
index 0000000..65f6dda
--- /dev/null
+++ b/node_modules/github-from-package/test/c.json
@@ -0,0 +1,5 @@
+{
+  "name": "beep-boop",
+  "version": "1.2.3",
+  "repository" : "https://github.com/substack/beep-boop.git"
+}
diff --git a/node_modules/github-from-package/test/d.json b/node_modules/github-from-package/test/d.json
new file mode 100644
index 0000000..c61f3cd
--- /dev/null
+++ b/node_modules/github-from-package/test/d.json
@@ -0,0 +1,7 @@
+{
+  "name": "beep-boop",
+  "version": "1.2.3",
+  "repository" : {
+    "url": "https://github.com/substack/beep-boop"
+  }
+}
diff --git a/node_modules/github-from-package/test/e.json b/node_modules/github-from-package/test/e.json
new file mode 100644
index 0000000..770b438
--- /dev/null
+++ b/node_modules/github-from-package/test/e.json
@@ -0,0 +1,5 @@
+{
+  "name": "beep-boop",
+  "version": "1.2.3",
+  "homepage": "https://github.com/substack/beep-boop/issues"
+}
diff --git a/node_modules/github-from-package/test/url.js b/node_modules/github-from-package/test/url.js
new file mode 100644
index 0000000..d5a0a66
--- /dev/null
+++ b/node_modules/github-from-package/test/url.js
@@ -0,0 +1,19 @@
+var test = require('tape');
+var github = require('../');
+var packages = {
+    a : require('./a.json'),
+    b : require('./b.json'),
+    c : require('./c.json'),
+    d : require('./d.json'),
+    e : require('./e.json')
+};
+
+test(function (t) {
+    t.plan(5);
+    var url = 'https://github.com/substack/beep-boop';
+    t.equal(url, github(packages.a), 'a.json comparison');
+    t.equal(url, github(packages.b), 'b.json comparison');
+    t.equal(url, github(packages.c), 'c.json comparison');
+    t.equal(url, github(packages.d), 'd.json comparison');
+    t.equal(url, github(packages.e), 'e.json comparison');
+});
diff --git a/node_modules/has-unicode/LICENSE b/node_modules/has-unicode/LICENSE
new file mode 100644
index 0000000..d42e25e
--- /dev/null
+++ b/node_modules/has-unicode/LICENSE
@@ -0,0 +1,14 @@
+Copyright (c) 2014, Rebecca Turner <me@re-becca.org>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
diff --git a/node_modules/has-unicode/README.md b/node_modules/has-unicode/README.md
new file mode 100644
index 0000000..5a03e59
--- /dev/null
+++ b/node_modules/has-unicode/README.md
@@ -0,0 +1,43 @@
+has-unicode
+===========
+
+Try to guess if your terminal supports unicode
+
+```javascript
+var hasUnicode = require("has-unicode")
+
+if (hasUnicode()) {
+  // the terminal probably has unicode support
+}
+```
+```javascript
+var hasUnicode = require("has-unicode").tryHarder
+hasUnicode(function(unicodeSupported) {
+  if (unicodeSupported) {
+    // the terminal probably has unicode support
+  }
+})
+```
+
+## Detecting Unicode
+
+What we actually detect is UTF-8 support, as that's what Node itself supports.
+If you have a UTF-16 locale then you won't be detected as unicode capable.
+
+### Windows
+
+Since at least Windows 7, `cmd` and `powershell` have been unicode capable,
+but unfortunately even then it's not guaranteed. In many localizations it
+still uses legacy code pages and there's no facility short of running
+programs or linking C++ that will let us detect this. As such, we
+report any Windows installation as NOT unicode capable, and recommend
+that you encourage your users to override this via config.
+
+### Unix Like Operating Systems
+
+We look at the environment variables `LC_ALL`, `LC_CTYPE`, and `LANG` in
+that order.  For `LC_ALL` and `LANG`, it looks for `.UTF-8` in the value. 
+For `LC_CTYPE` it looks to see if the value is `UTF-8`.  This is sufficient
+for most POSIX systems.  While locale data can be put in `/etc/locale.conf`
+as well, AFAIK it's always copied into the environment.
+
diff --git a/node_modules/has-unicode/index.js b/node_modules/has-unicode/index.js
new file mode 100644
index 0000000..9b0fe44
--- /dev/null
+++ b/node_modules/has-unicode/index.js
@@ -0,0 +1,16 @@
+"use strict"
+var os = require("os")
+
+var hasUnicode = module.exports = function () {
+  // Recent Win32 platforms (>XP) CAN support unicode in the console but
+  // don't have to, and in non-english locales often use traditional local
+  // code pages. There's no way, short of windows system calls or execing
+  // the chcp command line program to figure this out. As such, we default
+  // this to false and encourage your users to override it via config if
+  // appropriate.
+  if (os.type() == "Windows_NT") { return false }
+
+  var isUTF8 = /UTF-?8$/i
+  var ctype = process.env.LC_ALL || process.env.LC_CTYPE || process.env.LANG
+  return isUTF8.test(ctype)
+}
diff --git a/node_modules/has-unicode/package.json b/node_modules/has-unicode/package.json
new file mode 100644
index 0000000..9109130
--- /dev/null
+++ b/node_modules/has-unicode/package.json
@@ -0,0 +1,58 @@
+{
+  "_from": "has-unicode@^2.0.0",
+  "_id": "has-unicode@2.0.1",
+  "_inBundle": false,
+  "_integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+  "_location": "/has-unicode",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "has-unicode@^2.0.0",
+    "name": "has-unicode",
+    "escapedName": "has-unicode",
+    "rawSpec": "^2.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^2.0.0"
+  },
+  "_requiredBy": [
+    "/gauge"
+  ],
+  "_resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+  "_shasum": "e0e6fe6a28cf51138855e086d1691e771de2a8b9",
+  "_spec": "has-unicode@^2.0.0",
+  "_where": "F:\\vent-display\\node_modules\\gauge",
+  "author": {
+    "name": "Rebecca Turner",
+    "email": "me@re-becca.org"
+  },
+  "bugs": {
+    "url": "https://github.com/iarna/has-unicode/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Try to guess if your terminal supports unicode",
+  "devDependencies": {
+    "require-inject": "^1.3.0",
+    "tap": "^2.3.1"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/iarna/has-unicode",
+  "keywords": [
+    "unicode",
+    "terminal"
+  ],
+  "license": "ISC",
+  "main": "index.js",
+  "name": "has-unicode",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/iarna/has-unicode.git"
+  },
+  "scripts": {
+    "test": "tap test/*.js"
+  },
+  "version": "2.0.1"
+}
diff --git a/node_modules/ieee754/LICENSE b/node_modules/ieee754/LICENSE
new file mode 100644
index 0000000..5aac82c
--- /dev/null
+++ b/node_modules/ieee754/LICENSE
@@ -0,0 +1,11 @@
+Copyright 2008 Fair Oaks Labs, Inc.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/ieee754/README.md b/node_modules/ieee754/README.md
new file mode 100644
index 0000000..cb7527b
--- /dev/null
+++ b/node_modules/ieee754/README.md
@@ -0,0 +1,51 @@
+# ieee754 [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url]
+
+[travis-image]: https://img.shields.io/travis/feross/ieee754/master.svg
+[travis-url]: https://travis-ci.org/feross/ieee754
+[npm-image]: https://img.shields.io/npm/v/ieee754.svg
+[npm-url]: https://npmjs.org/package/ieee754
+[downloads-image]: https://img.shields.io/npm/dm/ieee754.svg
+[downloads-url]: https://npmjs.org/package/ieee754
+[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg
+[standard-url]: https://standardjs.com
+
+[![saucelabs][saucelabs-image]][saucelabs-url]
+
+[saucelabs-image]: https://saucelabs.com/browser-matrix/ieee754.svg
+[saucelabs-url]: https://saucelabs.com/u/ieee754
+
+### Read/write IEEE754 floating point numbers from/to a Buffer or array-like object.
+
+## install
+
+```
+npm install ieee754
+```
+
+## methods
+
+`var ieee754 = require('ieee754')`
+
+The `ieee754` object has the following functions:
+
+```
+ieee754.read = function (buffer, offset, isLE, mLen, nBytes)
+ieee754.write = function (buffer, value, offset, isLE, mLen, nBytes)
+```
+
+The arguments mean the following:
+
+- buffer = the buffer
+- offset = offset into the buffer
+- value = value to set (only for `write`)
+- isLe = is little endian?
+- mLen = mantissa length
+- nBytes = number of bytes
+
+## what is ieee754?
+
+The IEEE Standard for Floating-Point Arithmetic (IEEE 754) is a technical standard for floating-point computation. [Read more](http://en.wikipedia.org/wiki/IEEE_floating_point).
+
+## license
+
+BSD 3 Clause. Copyright (c) 2008, Fair Oaks Labs, Inc.
diff --git a/node_modules/ieee754/index.d.ts b/node_modules/ieee754/index.d.ts
new file mode 100644
index 0000000..f1e4354
--- /dev/null
+++ b/node_modules/ieee754/index.d.ts
@@ -0,0 +1,10 @@
+declare namespace ieee754 {
+    export function read(
+        buffer: Uint8Array, offset: number, isLE: boolean, mLen: number,
+        nBytes: number): number;
+    export function write(
+        buffer: Uint8Array, value: number, offset: number, isLE: boolean,
+        mLen: number, nBytes: number): void;
+  }
+  
+  export = ieee754;
\ No newline at end of file
diff --git a/node_modules/ieee754/index.js b/node_modules/ieee754/index.js
new file mode 100644
index 0000000..81d26c3
--- /dev/null
+++ b/node_modules/ieee754/index.js
@@ -0,0 +1,85 @@
+/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
+exports.read = function (buffer, offset, isLE, mLen, nBytes) {
+  var e, m
+  var eLen = (nBytes * 8) - mLen - 1
+  var eMax = (1 << eLen) - 1
+  var eBias = eMax >> 1
+  var nBits = -7
+  var i = isLE ? (nBytes - 1) : 0
+  var d = isLE ? -1 : 1
+  var s = buffer[offset + i]
+
+  i += d
+
+  e = s & ((1 << (-nBits)) - 1)
+  s >>= (-nBits)
+  nBits += eLen
+  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
+
+  m = e & ((1 << (-nBits)) - 1)
+  e >>= (-nBits)
+  nBits += mLen
+  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
+
+  if (e === 0) {
+    e = 1 - eBias
+  } else if (e === eMax) {
+    return m ? NaN : ((s ? -1 : 1) * Infinity)
+  } else {
+    m = m + Math.pow(2, mLen)
+    e = e - eBias
+  }
+  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
+}
+
+exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
+  var e, m, c
+  var eLen = (nBytes * 8) - mLen - 1
+  var eMax = (1 << eLen) - 1
+  var eBias = eMax >> 1
+  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
+  var i = isLE ? 0 : (nBytes - 1)
+  var d = isLE ? 1 : -1
+  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
+
+  value = Math.abs(value)
+
+  if (isNaN(value) || value === Infinity) {
+    m = isNaN(value) ? 1 : 0
+    e = eMax
+  } else {
+    e = Math.floor(Math.log(value) / Math.LN2)
+    if (value * (c = Math.pow(2, -e)) < 1) {
+      e--
+      c *= 2
+    }
+    if (e + eBias >= 1) {
+      value += rt / c
+    } else {
+      value += rt * Math.pow(2, 1 - eBias)
+    }
+    if (value * c >= 2) {
+      e++
+      c /= 2
+    }
+
+    if (e + eBias >= eMax) {
+      m = 0
+      e = eMax
+    } else if (e + eBias >= 1) {
+      m = ((value * c) - 1) * Math.pow(2, mLen)
+      e = e + eBias
+    } else {
+      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
+      e = 0
+    }
+  }
+
+  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
+
+  e = (e << mLen) | m
+  eLen += mLen
+  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
+
+  buffer[offset + i - d] |= s * 128
+}
diff --git a/node_modules/ieee754/package.json b/node_modules/ieee754/package.json
new file mode 100644
index 0000000..1c50e02
--- /dev/null
+++ b/node_modules/ieee754/package.json
@@ -0,0 +1,84 @@
+{
+  "_from": "ieee754@^1.1.13",
+  "_id": "ieee754@1.2.1",
+  "_inBundle": false,
+  "_integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+  "_location": "/ieee754",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "ieee754@^1.1.13",
+    "name": "ieee754",
+    "escapedName": "ieee754",
+    "rawSpec": "^1.1.13",
+    "saveSpec": null,
+    "fetchSpec": "^1.1.13"
+  },
+  "_requiredBy": [
+    "/buffer"
+  ],
+  "_resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+  "_shasum": "8eb7a10a63fff25d15a57b001586d177d1b0d352",
+  "_spec": "ieee754@^1.1.13",
+  "_where": "F:\\vent-display\\node_modules\\buffer",
+  "author": {
+    "name": "Feross Aboukhadijeh",
+    "email": "feross@feross.org",
+    "url": "https://feross.org"
+  },
+  "bugs": {
+    "url": "https://github.com/feross/ieee754/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Romain Beauxis",
+      "email": "toots@rastageeks.org"
+    }
+  ],
+  "deprecated": false,
+  "description": "Read/write IEEE754 floating point numbers from/to a Buffer or array-like object",
+  "devDependencies": {
+    "airtap": "^3.0.0",
+    "standard": "*",
+    "tape": "^5.0.1"
+  },
+  "funding": [
+    {
+      "type": "github",
+      "url": "https://github.com/sponsors/feross"
+    },
+    {
+      "type": "patreon",
+      "url": "https://www.patreon.com/feross"
+    },
+    {
+      "type": "consulting",
+      "url": "https://feross.org/support"
+    }
+  ],
+  "homepage": "https://github.com/feross/ieee754#readme",
+  "keywords": [
+    "IEEE 754",
+    "buffer",
+    "convert",
+    "floating point",
+    "ieee754"
+  ],
+  "license": "BSD-3-Clause",
+  "main": "index.js",
+  "name": "ieee754",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/feross/ieee754.git"
+  },
+  "scripts": {
+    "test": "standard && npm run test-node && npm run test-browser",
+    "test-browser": "airtap -- test/*.js",
+    "test-browser-local": "airtap --local -- test/*.js",
+    "test-node": "tape test/*.js"
+  },
+  "types": "index.d.ts",
+  "version": "1.2.1"
+}
diff --git a/node_modules/inherits/LICENSE b/node_modules/inherits/LICENSE
new file mode 100644
index 0000000..dea3013
--- /dev/null
+++ b/node_modules/inherits/LICENSE
@@ -0,0 +1,16 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
diff --git a/node_modules/inherits/README.md b/node_modules/inherits/README.md
new file mode 100644
index 0000000..b1c5665
--- /dev/null
+++ b/node_modules/inherits/README.md
@@ -0,0 +1,42 @@
+Browser-friendly inheritance fully compatible with standard node.js
+[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).
+
+This package exports standard `inherits` from node.js `util` module in
+node environment, but also provides alternative browser-friendly
+implementation through [browser
+field](https://gist.github.com/shtylman/4339901). Alternative
+implementation is a literal copy of standard one located in standalone
+module to avoid requiring of `util`. It also has a shim for old
+browsers with no `Object.create` support.
+
+While keeping you sure you are using standard `inherits`
+implementation in node.js environment, it allows bundlers such as
+[browserify](https://github.com/substack/node-browserify) to not
+include full `util` package to your client code if all you need is
+just `inherits` function. It worth, because browser shim for `util`
+package is large and `inherits` is often the single function you need
+from it.
+
+It's recommended to use this package instead of
+`require('util').inherits` for any code that has chances to be used
+not only in node.js but in browser too.
+
+## usage
+
+```js
+var inherits = require('inherits');
+// then use exactly as the standard one
+```
+
+## note on version ~1.0
+
+Version ~1.0 had completely different motivation and is not compatible
+neither with 2.0 nor with standard node.js `inherits`.
+
+If you are using version ~1.0 and planning to switch to ~2.0, be
+careful:
+
+* new version uses `super_` instead of `super` for referencing
+  superclass
+* new version overwrites current prototype while old one preserves any
+  existing fields on it
diff --git a/node_modules/inherits/inherits.js b/node_modules/inherits/inherits.js
new file mode 100644
index 0000000..f71f2d9
--- /dev/null
+++ b/node_modules/inherits/inherits.js
@@ -0,0 +1,9 @@
+try {
+  var util = require('util');
+  /* istanbul ignore next */
+  if (typeof util.inherits !== 'function') throw '';
+  module.exports = util.inherits;
+} catch (e) {
+  /* istanbul ignore next */
+  module.exports = require('./inherits_browser.js');
+}
diff --git a/node_modules/inherits/inherits_browser.js b/node_modules/inherits/inherits_browser.js
new file mode 100644
index 0000000..86bbb3d
--- /dev/null
+++ b/node_modules/inherits/inherits_browser.js
@@ -0,0 +1,27 @@
+if (typeof Object.create === 'function') {
+  // implementation from standard node.js 'util' module
+  module.exports = function inherits(ctor, superCtor) {
+    if (superCtor) {
+      ctor.super_ = superCtor
+      ctor.prototype = Object.create(superCtor.prototype, {
+        constructor: {
+          value: ctor,
+          enumerable: false,
+          writable: true,
+          configurable: true
+        }
+      })
+    }
+  };
+} else {
+  // old school shim for old browsers
+  module.exports = function inherits(ctor, superCtor) {
+    if (superCtor) {
+      ctor.super_ = superCtor
+      var TempCtor = function () {}
+      TempCtor.prototype = superCtor.prototype
+      ctor.prototype = new TempCtor()
+      ctor.prototype.constructor = ctor
+    }
+  }
+}
diff --git a/node_modules/inherits/package.json b/node_modules/inherits/package.json
new file mode 100644
index 0000000..51f55f5
--- /dev/null
+++ b/node_modules/inherits/package.json
@@ -0,0 +1,65 @@
+{
+  "_from": "inherits@~2.0.3",
+  "_id": "inherits@2.0.4",
+  "_inBundle": false,
+  "_integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+  "_location": "/inherits",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "inherits@~2.0.3",
+    "name": "inherits",
+    "escapedName": "inherits",
+    "rawSpec": "~2.0.3",
+    "saveSpec": null,
+    "fetchSpec": "~2.0.3"
+  },
+  "_requiredBy": [
+    "/bl",
+    "/bl/readable-stream",
+    "/readable-stream",
+    "/tar-stream",
+    "/tar-stream/readable-stream"
+  ],
+  "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+  "_shasum": "0fa2c64f932917c3433a0ded55363aae37416b7c",
+  "_spec": "inherits@~2.0.3",
+  "_where": "F:\\vent-display\\node_modules\\readable-stream",
+  "browser": "./inherits_browser.js",
+  "bugs": {
+    "url": "https://github.com/isaacs/inherits/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
+  "devDependencies": {
+    "tap": "^14.2.4"
+  },
+  "files": [
+    "inherits.js",
+    "inherits_browser.js"
+  ],
+  "homepage": "https://github.com/isaacs/inherits#readme",
+  "keywords": [
+    "inheritance",
+    "class",
+    "klass",
+    "oop",
+    "object-oriented",
+    "inherits",
+    "browser",
+    "browserify"
+  ],
+  "license": "ISC",
+  "main": "./inherits.js",
+  "name": "inherits",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/isaacs/inherits.git"
+  },
+  "scripts": {
+    "test": "tap"
+  },
+  "version": "2.0.4"
+}
diff --git a/node_modules/ini/LICENSE b/node_modules/ini/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/ini/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/ini/README.md b/node_modules/ini/README.md
new file mode 100644
index 0000000..33df258
--- /dev/null
+++ b/node_modules/ini/README.md
@@ -0,0 +1,102 @@
+An ini format parser and serializer for node.
+
+Sections are treated as nested objects.  Items before the first
+heading are saved on the object directly.
+
+## Usage
+
+Consider an ini-file `config.ini` that looks like this:
+
+    ; this comment is being ignored
+    scope = global
+
+    [database]
+    user = dbuser
+    password = dbpassword
+    database = use_this_database
+
+    [paths.default]
+    datadir = /var/lib/data
+    array[] = first value
+    array[] = second value
+    array[] = third value
+
+You can read, manipulate and write the ini-file like so:
+
+    var fs = require('fs')
+      , ini = require('ini')
+
+    var config = ini.parse(fs.readFileSync('./config.ini', 'utf-8'))
+
+    config.scope = 'local'
+    config.database.database = 'use_another_database'
+    config.paths.default.tmpdir = '/tmp'
+    delete config.paths.default.datadir
+    config.paths.default.array.push('fourth value')
+
+    fs.writeFileSync('./config_modified.ini', ini.stringify(config, { section: 'section' }))
+
+This will result in a file called `config_modified.ini` being written
+to the filesystem with the following content:
+
+    [section]
+    scope=local
+    [section.database]
+    user=dbuser
+    password=dbpassword
+    database=use_another_database
+    [section.paths.default]
+    tmpdir=/tmp
+    array[]=first value
+    array[]=second value
+    array[]=third value
+    array[]=fourth value
+
+
+## API
+
+### decode(inistring)
+
+Decode the ini-style formatted `inistring` into a nested object.
+
+### parse(inistring)
+
+Alias for `decode(inistring)`
+
+### encode(object, [options])
+
+Encode the object `object` into an ini-style formatted string. If the
+optional parameter `section` is given, then all top-level properties
+of the object are put into this section and the `section`-string is
+prepended to all sub-sections, see the usage example above.
+
+The `options` object may contain the following:
+
+* `section` A string which will be the first `section` in the encoded
+  ini data.  Defaults to none.
+* `whitespace` Boolean to specify whether to put whitespace around the
+  `=` character.  By default, whitespace is omitted, to be friendly to
+  some persnickety old parsers that don't tolerate it well.  But some
+  find that it's more human-readable and pretty with the whitespace.
+
+For backwards compatibility reasons, if a `string` options is passed
+in, then it is assumed to be the `section` value.
+
+### stringify(object, [options])
+
+Alias for `encode(object, [options])`
+
+### safe(val)
+
+Escapes the string `val` such that it is safe to be used as a key or
+value in an ini-file. Basically escapes quotes. For example
+
+    ini.safe('"unsafe string"')
+
+would result in
+
+    "\"unsafe string\""
+
+### unsafe(val)
+
+Unescapes the string `val`
diff --git a/node_modules/ini/ini.js b/node_modules/ini/ini.js
new file mode 100644
index 0000000..b576f08
--- /dev/null
+++ b/node_modules/ini/ini.js
@@ -0,0 +1,206 @@
+exports.parse = exports.decode = decode
+
+exports.stringify = exports.encode = encode
+
+exports.safe = safe
+exports.unsafe = unsafe
+
+var eol = typeof process !== 'undefined' &&
+  process.platform === 'win32' ? '\r\n' : '\n'
+
+function encode (obj, opt) {
+  var children = []
+  var out = ''
+
+  if (typeof opt === 'string') {
+    opt = {
+      section: opt,
+      whitespace: false,
+    }
+  } else {
+    opt = opt || {}
+    opt.whitespace = opt.whitespace === true
+  }
+
+  var separator = opt.whitespace ? ' = ' : '='
+
+  Object.keys(obj).forEach(function (k, _, __) {
+    var val = obj[k]
+    if (val && Array.isArray(val)) {
+      val.forEach(function (item) {
+        out += safe(k + '[]') + separator + safe(item) + '\n'
+      })
+    } else if (val && typeof val === 'object')
+      children.push(k)
+    else
+      out += safe(k) + separator + safe(val) + eol
+  })
+
+  if (opt.section && out.length)
+    out = '[' + safe(opt.section) + ']' + eol + out
+
+  children.forEach(function (k, _, __) {
+    var nk = dotSplit(k).join('\\.')
+    var section = (opt.section ? opt.section + '.' : '') + nk
+    var child = encode(obj[k], {
+      section: section,
+      whitespace: opt.whitespace,
+    })
+    if (out.length && child.length)
+      out += eol
+
+    out += child
+  })
+
+  return out
+}
+
+function dotSplit (str) {
+  return str.replace(/\1/g, '\u0002LITERAL\\1LITERAL\u0002')
+    .replace(/\\\./g, '\u0001')
+    .split(/\./).map(function (part) {
+      return part.replace(/\1/g, '\\.')
+        .replace(/\2LITERAL\\1LITERAL\2/g, '\u0001')
+    })
+}
+
+function decode (str) {
+  var out = {}
+  var p = out
+  var section = null
+  //          section     |key      = value
+  var re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i
+  var lines = str.split(/[\r\n]+/g)
+
+  lines.forEach(function (line, _, __) {
+    if (!line || line.match(/^\s*[;#]/))
+      return
+    var match = line.match(re)
+    if (!match)
+      return
+    if (match[1] !== undefined) {
+      section = unsafe(match[1])
+      if (section === '__proto__') {
+        // not allowed
+        // keep parsing the section, but don't attach it.
+        p = {}
+        return
+      }
+      p = out[section] = out[section] || {}
+      return
+    }
+    var key = unsafe(match[2])
+    if (key === '__proto__')
+      return
+    var value = match[3] ? unsafe(match[4]) : true
+    switch (value) {
+      case 'true':
+      case 'false':
+      case 'null': value = JSON.parse(value)
+    }
+
+    // Convert keys with '[]' suffix to an array
+    if (key.length > 2 && key.slice(-2) === '[]') {
+      key = key.substring(0, key.length - 2)
+      if (key === '__proto__')
+        return
+      if (!p[key])
+        p[key] = []
+      else if (!Array.isArray(p[key]))
+        p[key] = [p[key]]
+    }
+
+    // safeguard against resetting a previously defined
+    // array by accidentally forgetting the brackets
+    if (Array.isArray(p[key]))
+      p[key].push(value)
+    else
+      p[key] = value
+  })
+
+  // {a:{y:1},"a.b":{x:2}} --> {a:{y:1,b:{x:2}}}
+  // use a filter to return the keys that have to be deleted.
+  Object.keys(out).filter(function (k, _, __) {
+    if (!out[k] ||
+      typeof out[k] !== 'object' ||
+      Array.isArray(out[k]))
+      return false
+
+    // see if the parent section is also an object.
+    // if so, add it to that, and mark this one for deletion
+    var parts = dotSplit(k)
+    var p = out
+    var l = parts.pop()
+    var nl = l.replace(/\\\./g, '.')
+    parts.forEach(function (part, _, __) {
+      if (part === '__proto__')
+        return
+      if (!p[part] || typeof p[part] !== 'object')
+        p[part] = {}
+      p = p[part]
+    })
+    if (p === out && nl === l)
+      return false
+
+    p[nl] = out[k]
+    return true
+  }).forEach(function (del, _, __) {
+    delete out[del]
+  })
+
+  return out
+}
+
+function isQuoted (val) {
+  return (val.charAt(0) === '"' && val.slice(-1) === '"') ||
+    (val.charAt(0) === "'" && val.slice(-1) === "'")
+}
+
+function safe (val) {
+  return (typeof val !== 'string' ||
+    val.match(/[=\r\n]/) ||
+    val.match(/^\[/) ||
+    (val.length > 1 &&
+     isQuoted(val)) ||
+    val !== val.trim())
+    ? JSON.stringify(val)
+    : val.replace(/;/g, '\\;').replace(/#/g, '\\#')
+}
+
+function unsafe (val, doUnesc) {
+  val = (val || '').trim()
+  if (isQuoted(val)) {
+    // remove the single quotes before calling JSON.parse
+    if (val.charAt(0) === "'")
+      val = val.substr(1, val.length - 2)
+
+    try {
+      val = JSON.parse(val)
+    } catch (_) {}
+  } else {
+    // walk the val to find the first not-escaped ; character
+    var esc = false
+    var unesc = ''
+    for (var i = 0, l = val.length; i < l; i++) {
+      var c = val.charAt(i)
+      if (esc) {
+        if ('\\;#'.indexOf(c) !== -1)
+          unesc += c
+        else
+          unesc += '\\' + c
+
+        esc = false
+      } else if (';#'.indexOf(c) !== -1)
+        break
+      else if (c === '\\')
+        esc = true
+      else
+        unesc += c
+    }
+    if (esc)
+      unesc += '\\'
+
+    return unesc.trim()
+  }
+  return val
+}
diff --git a/node_modules/ini/package.json b/node_modules/ini/package.json
new file mode 100644
index 0000000..a8349fe
--- /dev/null
+++ b/node_modules/ini/package.json
@@ -0,0 +1,66 @@
+{
+  "_from": "ini@~1.3.0",
+  "_id": "ini@1.3.8",
+  "_inBundle": false,
+  "_integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+  "_location": "/ini",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "ini@~1.3.0",
+    "name": "ini",
+    "escapedName": "ini",
+    "rawSpec": "~1.3.0",
+    "saveSpec": null,
+    "fetchSpec": "~1.3.0"
+  },
+  "_requiredBy": [
+    "/rc"
+  ],
+  "_resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+  "_shasum": "a29da425b48806f34767a4efce397269af28432c",
+  "_spec": "ini@~1.3.0",
+  "_where": "F:\\vent-display\\node_modules\\rc",
+  "author": {
+    "name": "Isaac Z. Schlueter",
+    "email": "i@izs.me",
+    "url": "http://blog.izs.me/"
+  },
+  "bugs": {
+    "url": "https://github.com/isaacs/ini/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "An ini encoder/decoder for node",
+  "devDependencies": {
+    "eslint": "^7.9.0",
+    "eslint-plugin-import": "^2.22.0",
+    "eslint-plugin-node": "^11.1.0",
+    "eslint-plugin-promise": "^4.2.1",
+    "eslint-plugin-standard": "^4.0.1",
+    "tap": "14"
+  },
+  "files": [
+    "ini.js"
+  ],
+  "homepage": "https://github.com/isaacs/ini#readme",
+  "license": "ISC",
+  "main": "ini.js",
+  "name": "ini",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/isaacs/ini.git"
+  },
+  "scripts": {
+    "eslint": "eslint",
+    "lint": "npm run eslint -- ini.js test/*.js",
+    "lintfix": "npm run lint -- --fix",
+    "posttest": "npm run lint",
+    "postversion": "npm publish",
+    "prepublishOnly": "git push origin --follow-tags",
+    "preversion": "npm test",
+    "test": "tap"
+  },
+  "version": "1.3.8"
+}
diff --git a/node_modules/is-fullwidth-code-point/index.js b/node_modules/is-fullwidth-code-point/index.js
new file mode 100644
index 0000000..a7d3e38
--- /dev/null
+++ b/node_modules/is-fullwidth-code-point/index.js
@@ -0,0 +1,46 @@
+'use strict';
+var numberIsNan = require('number-is-nan');
+
+module.exports = function (x) {
+	if (numberIsNan(x)) {
+		return false;
+	}
+
+	// https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1369
+
+	// code points are derived from:
+	// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt
+	if (x >= 0x1100 && (
+		x <= 0x115f ||  // Hangul Jamo
+		0x2329 === x || // LEFT-POINTING ANGLE BRACKET
+		0x232a === x || // RIGHT-POINTING ANGLE BRACKET
+		// CJK Radicals Supplement .. Enclosed CJK Letters and Months
+		(0x2e80 <= x && x <= 0x3247 && x !== 0x303f) ||
+		// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
+		0x3250 <= x && x <= 0x4dbf ||
+		// CJK Unified Ideographs .. Yi Radicals
+		0x4e00 <= x && x <= 0xa4c6 ||
+		// Hangul Jamo Extended-A
+		0xa960 <= x && x <= 0xa97c ||
+		// Hangul Syllables
+		0xac00 <= x && x <= 0xd7a3 ||
+		// CJK Compatibility Ideographs
+		0xf900 <= x && x <= 0xfaff ||
+		// Vertical Forms
+		0xfe10 <= x && x <= 0xfe19 ||
+		// CJK Compatibility Forms .. Small Form Variants
+		0xfe30 <= x && x <= 0xfe6b ||
+		// Halfwidth and Fullwidth Forms
+		0xff01 <= x && x <= 0xff60 ||
+		0xffe0 <= x && x <= 0xffe6 ||
+		// Kana Supplement
+		0x1b000 <= x && x <= 0x1b001 ||
+		// Enclosed Ideographic Supplement
+		0x1f200 <= x && x <= 0x1f251 ||
+		// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
+		0x20000 <= x && x <= 0x3fffd)) {
+		return true;
+	}
+
+	return false;
+}
diff --git a/node_modules/is-fullwidth-code-point/license b/node_modules/is-fullwidth-code-point/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/is-fullwidth-code-point/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/is-fullwidth-code-point/package.json b/node_modules/is-fullwidth-code-point/package.json
new file mode 100644
index 0000000..8365fb6
--- /dev/null
+++ b/node_modules/is-fullwidth-code-point/package.json
@@ -0,0 +1,77 @@
+{
+  "_from": "is-fullwidth-code-point@^1.0.0",
+  "_id": "is-fullwidth-code-point@1.0.0",
+  "_inBundle": false,
+  "_integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+  "_location": "/is-fullwidth-code-point",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "is-fullwidth-code-point@^1.0.0",
+    "name": "is-fullwidth-code-point",
+    "escapedName": "is-fullwidth-code-point",
+    "rawSpec": "^1.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.0"
+  },
+  "_requiredBy": [
+    "/string-width"
+  ],
+  "_resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+  "_shasum": "ef9e31386f031a7f0d643af82fde50c457ef00cb",
+  "_spec": "is-fullwidth-code-point@^1.0.0",
+  "_where": "F:\\vent-display\\node_modules\\string-width",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "bugs": {
+    "url": "https://github.com/sindresorhus/is-fullwidth-code-point/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "number-is-nan": "^1.0.0"
+  },
+  "deprecated": false,
+  "description": "Check if the character represented by a given Unicode code point is fullwidth",
+  "devDependencies": {
+    "ava": "0.0.4",
+    "code-point-at": "^1.0.0"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/sindresorhus/is-fullwidth-code-point#readme",
+  "keywords": [
+    "fullwidth",
+    "full-width",
+    "full",
+    "width",
+    "unicode",
+    "character",
+    "char",
+    "string",
+    "str",
+    "codepoint",
+    "code",
+    "point",
+    "is",
+    "detect",
+    "check"
+  ],
+  "license": "MIT",
+  "name": "is-fullwidth-code-point",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/sindresorhus/is-fullwidth-code-point.git"
+  },
+  "scripts": {
+    "test": "node test.js"
+  },
+  "version": "1.0.0"
+}
diff --git a/node_modules/is-fullwidth-code-point/readme.md b/node_modules/is-fullwidth-code-point/readme.md
new file mode 100644
index 0000000..4936464
--- /dev/null
+++ b/node_modules/is-fullwidth-code-point/readme.md
@@ -0,0 +1,39 @@
+# is-fullwidth-code-point [![Build Status](https://travis-ci.org/sindresorhus/is-fullwidth-code-point.svg?branch=master)](https://travis-ci.org/sindresorhus/is-fullwidth-code-point)
+
+> Check if the character represented by a given [Unicode code point](https://en.wikipedia.org/wiki/Code_point) is [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms)
+
+
+## Install
+
+```
+$ npm install --save is-fullwidth-code-point
+```
+
+
+## Usage
+
+```js
+var isFullwidthCodePoint = require('is-fullwidth-code-point');
+
+isFullwidthCodePoint('è°¢'.codePointAt());
+//=> true
+
+isFullwidthCodePoint('a'.codePointAt());
+//=> false
+```
+
+
+## API
+
+### isFullwidthCodePoint(input)
+
+#### input
+
+Type: `number`
+
+[Code point](https://en.wikipedia.org/wiki/Code_point) of a character.
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/isarray/.npmignore b/node_modules/isarray/.npmignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/node_modules/isarray/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/node_modules/isarray/.travis.yml b/node_modules/isarray/.travis.yml
new file mode 100644
index 0000000..cc4dba2
--- /dev/null
+++ b/node_modules/isarray/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+  - "0.8"
+  - "0.10"
diff --git a/node_modules/isarray/Makefile b/node_modules/isarray/Makefile
new file mode 100644
index 0000000..787d56e
--- /dev/null
+++ b/node_modules/isarray/Makefile
@@ -0,0 +1,6 @@
+
+test:
+	@node_modules/.bin/tape test.js
+
+.PHONY: test
+
diff --git a/node_modules/isarray/README.md b/node_modules/isarray/README.md
new file mode 100644
index 0000000..16d2c59
--- /dev/null
+++ b/node_modules/isarray/README.md
@@ -0,0 +1,60 @@
+
+# isarray
+
+`Array#isArray` for older browsers.
+
+[![build status](https://secure.travis-ci.org/juliangruber/isarray.svg)](http://travis-ci.org/juliangruber/isarray)
+[![downloads](https://img.shields.io/npm/dm/isarray.svg)](https://www.npmjs.org/package/isarray)
+
+[![browser support](https://ci.testling.com/juliangruber/isarray.png)
+](https://ci.testling.com/juliangruber/isarray)
+
+## Usage
+
+```js
+var isArray = require('isarray');
+
+console.log(isArray([])); // => true
+console.log(isArray({})); // => false
+```
+
+## Installation
+
+With [npm](http://npmjs.org) do
+
+```bash
+$ npm install isarray
+```
+
+Then bundle for the browser with
+[browserify](https://github.com/substack/browserify).
+
+With [component](http://component.io) do
+
+```bash
+$ component install juliangruber/isarray
+```
+
+## License
+
+(MIT)
+
+Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
+
+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/isarray/component.json b/node_modules/isarray/component.json
new file mode 100644
index 0000000..9e31b68
--- /dev/null
+++ b/node_modules/isarray/component.json
@@ -0,0 +1,19 @@
+{
+  "name" : "isarray",
+  "description" : "Array#isArray for older browsers",
+  "version" : "0.0.1",
+  "repository" : "juliangruber/isarray",
+  "homepage": "https://github.com/juliangruber/isarray",
+  "main" : "index.js",
+  "scripts" : [
+    "index.js"
+  ],
+  "dependencies" : {},
+  "keywords": ["browser","isarray","array"],
+  "author": {
+    "name": "Julian Gruber",
+    "email": "mail@juliangruber.com",
+    "url": "http://juliangruber.com"
+  },
+  "license": "MIT"
+}
diff --git a/node_modules/isarray/index.js b/node_modules/isarray/index.js
new file mode 100644
index 0000000..a57f634
--- /dev/null
+++ b/node_modules/isarray/index.js
@@ -0,0 +1,5 @@
+var toString = {}.toString;
+
+module.exports = Array.isArray || function (arr) {
+  return toString.call(arr) == '[object Array]';
+};
diff --git a/node_modules/isarray/package.json b/node_modules/isarray/package.json
new file mode 100644
index 0000000..20af42b
--- /dev/null
+++ b/node_modules/isarray/package.json
@@ -0,0 +1,73 @@
+{
+  "_from": "isarray@~1.0.0",
+  "_id": "isarray@1.0.0",
+  "_inBundle": false,
+  "_integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+  "_location": "/isarray",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "isarray@~1.0.0",
+    "name": "isarray",
+    "escapedName": "isarray",
+    "rawSpec": "~1.0.0",
+    "saveSpec": null,
+    "fetchSpec": "~1.0.0"
+  },
+  "_requiredBy": [
+    "/readable-stream"
+  ],
+  "_resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+  "_shasum": "bb935d48582cba168c06834957a54a3e07124f11",
+  "_spec": "isarray@~1.0.0",
+  "_where": "F:\\vent-display\\node_modules\\readable-stream",
+  "author": {
+    "name": "Julian Gruber",
+    "email": "mail@juliangruber.com",
+    "url": "http://juliangruber.com"
+  },
+  "bugs": {
+    "url": "https://github.com/juliangruber/isarray/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {},
+  "deprecated": false,
+  "description": "Array#isArray for older browsers",
+  "devDependencies": {
+    "tape": "~2.13.4"
+  },
+  "homepage": "https://github.com/juliangruber/isarray",
+  "keywords": [
+    "browser",
+    "isarray",
+    "array"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "isarray",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/juliangruber/isarray.git"
+  },
+  "scripts": {
+    "test": "tape test.js"
+  },
+  "testling": {
+    "files": "test.js",
+    "browsers": [
+      "ie/8..latest",
+      "firefox/17..latest",
+      "firefox/nightly",
+      "chrome/22..latest",
+      "chrome/canary",
+      "opera/12..latest",
+      "opera/next",
+      "safari/5.1..latest",
+      "ipad/6.0..latest",
+      "iphone/6.0..latest",
+      "android-browser/4.2..latest"
+    ]
+  },
+  "version": "1.0.0"
+}
diff --git a/node_modules/isarray/test.js b/node_modules/isarray/test.js
new file mode 100644
index 0000000..e0c3444
--- /dev/null
+++ b/node_modules/isarray/test.js
@@ -0,0 +1,20 @@
+var isArray = require('./');
+var test = require('tape');
+
+test('is array', function(t){
+  t.ok(isArray([]));
+  t.notOk(isArray({}));
+  t.notOk(isArray(null));
+  t.notOk(isArray(false));
+
+  var obj = {};
+  obj[0] = true;
+  t.notOk(isArray(obj));
+
+  var arr = [];
+  arr.foo = 'bar';
+  t.ok(isArray(arr));
+
+  t.end();
+});
+
diff --git a/node_modules/mimic-response/index.d.ts b/node_modules/mimic-response/index.d.ts
new file mode 100644
index 0000000..8ff98e2
--- /dev/null
+++ b/node_modules/mimic-response/index.d.ts
@@ -0,0 +1,17 @@
+import {IncomingMessage} from 'http';
+
+/**
+Mimic a [Node.js HTTP response stream](https://nodejs.org/api/http.html#http_class_http_incomingmessage)
+
+Makes `toStream` include the properties from `fromStream`.
+
+@param fromStream - The stream to copy the properties from.
+@param toStream - The stream to copy the properties to.
+@return The same object as `toStream`.
+*/
+declare function mimicResponse<T extends NodeJS.ReadableStream>(
+	fromStream: IncomingMessage,
+	toStream: T,
+): IncomingMessage & T;
+
+export = mimicResponse;
diff --git a/node_modules/mimic-response/index.js b/node_modules/mimic-response/index.js
new file mode 100644
index 0000000..edd0faf
--- /dev/null
+++ b/node_modules/mimic-response/index.js
@@ -0,0 +1,38 @@
+'use strict';
+
+// We define these manually to ensure they're always copied
+// even if they would move up the prototype chain
+// https://nodejs.org/api/http.html#http_class_http_incomingmessage
+const knownProperties = [
+	'aborted',
+	'complete',
+	'destroy',
+	'headers',
+	'httpVersion',
+	'httpVersionMinor',
+	'httpVersionMajor',
+	'method',
+	'rawHeaders',
+	'rawTrailers',
+	'setTimeout',
+	'socket',
+	'statusCode',
+	'statusMessage',
+	'trailers',
+	'url'
+];
+
+module.exports = (fromStream, toStream) => {
+	const fromProperties = new Set(Object.keys(fromStream).concat(knownProperties));
+
+	for (const property of fromProperties) {
+		// Don't overwrite existing properties.
+		if (property in toStream) {
+			continue;
+		}
+
+		toStream[property] = typeof fromStream[property] === 'function' ? fromStream[property].bind(fromStream) : fromStream[property];
+	}
+
+	return toStream;
+};
diff --git a/node_modules/mimic-response/license b/node_modules/mimic-response/license
new file mode 100644
index 0000000..fa7ceba
--- /dev/null
+++ b/node_modules/mimic-response/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/mimic-response/package.json b/node_modules/mimic-response/package.json
new file mode 100644
index 0000000..bfe34d1
--- /dev/null
+++ b/node_modules/mimic-response/package.json
@@ -0,0 +1,74 @@
+{
+  "_from": "mimic-response@^2.0.0",
+  "_id": "mimic-response@2.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
+  "_location": "/mimic-response",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "mimic-response@^2.0.0",
+    "name": "mimic-response",
+    "escapedName": "mimic-response",
+    "rawSpec": "^2.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^2.0.0"
+  },
+  "_requiredBy": [
+    "/decompress-response"
+  ],
+  "_resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
+  "_shasum": "d13763d35f613d09ec37ebb30bac0469c0ee8f43",
+  "_spec": "mimic-response@^2.0.0",
+  "_where": "F:\\vent-display\\node_modules\\decompress-response",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "https://sindresorhus.com"
+  },
+  "bugs": {
+    "url": "https://github.com/sindresorhus/mimic-response/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Mimic a Node.js HTTP response stream",
+  "devDependencies": {
+    "@sindresorhus/tsconfig": "^0.3.0",
+    "@types/node": "^12.0.0",
+    "ava": "^1.1.0",
+    "create-test-server": "^2.4.0",
+    "pify": "^4.0.1",
+    "tsd": "^0.7.3",
+    "xo": "^0.24.0"
+  },
+  "engines": {
+    "node": ">=8"
+  },
+  "files": [
+    "index.d.ts",
+    "index.js"
+  ],
+  "funding": "https://github.com/sponsors/sindresorhus",
+  "homepage": "https://github.com/sindresorhus/mimic-response#readme",
+  "keywords": [
+    "mimic",
+    "response",
+    "stream",
+    "http",
+    "https",
+    "request",
+    "get",
+    "core"
+  ],
+  "license": "MIT",
+  "name": "mimic-response",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/sindresorhus/mimic-response.git"
+  },
+  "scripts": {
+    "test": "xo && ava && tsd"
+  },
+  "version": "2.1.0"
+}
diff --git a/node_modules/mimic-response/readme.md b/node_modules/mimic-response/readme.md
new file mode 100644
index 0000000..b7d1ec9
--- /dev/null
+++ b/node_modules/mimic-response/readme.md
@@ -0,0 +1,57 @@
+# mimic-response [![Build Status](https://travis-ci.org/sindresorhus/mimic-response.svg?branch=master)](https://travis-ci.org/sindresorhus/mimic-response)
+
+> Mimic a [Node.js HTTP response stream](https://nodejs.org/api/http.html#http_class_http_incomingmessage)
+
+## Install
+
+```
+$ npm install mimic-response
+```
+
+## Usage
+
+```js
+const stream = require('stream');
+const mimicResponse = require('mimic-response');
+
+const responseStream = getHttpResponseStream();
+const myStream = new stream.PassThrough();
+
+mimicResponse(responseStream, myStream);
+
+console.log(myStream.statusCode);
+//=> 200
+```
+
+## API
+
+### mimicResponse(from, to)
+
+#### from
+
+Type: `Stream`
+
+[Node.js HTTP response stream.](https://nodejs.org/api/http.html#http_class_http_incomingmessage)
+
+#### to
+
+Type: `Stream`
+
+Any stream.
+
+## Related
+
+- [mimic-fn](https://github.com/sindresorhus/mimic-fn) - Make a function mimic another one
+- [clone-response](https://github.com/lukechilds/clone-response) - Clone a Node.js response stream
+
+---
+
+<div align="center">
+	<b>
+		<a href="https://tidelift.com/subscription/pkg/npm-mimic-response?utm_source=npm-mimic-response&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
+	</b>
+	<br>
+	<sub>
+		Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
+	</sub>
+</div>
diff --git a/node_modules/minimist/.travis.yml b/node_modules/minimist/.travis.yml
new file mode 100644
index 0000000..74c57bf
--- /dev/null
+++ b/node_modules/minimist/.travis.yml
@@ -0,0 +1,8 @@
+language: node_js
+node_js:
+  - "0.8"
+  - "0.10"
+  - "0.12"
+  - "iojs"
+before_install:
+  - npm install -g npm@~1.4.6
diff --git a/node_modules/minimist/LICENSE b/node_modules/minimist/LICENSE
new file mode 100644
index 0000000..ee27ba4
--- /dev/null
+++ b/node_modules/minimist/LICENSE
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/minimist/example/parse.js b/node_modules/minimist/example/parse.js
new file mode 100644
index 0000000..f7c8d49
--- /dev/null
+++ b/node_modules/minimist/example/parse.js
@@ -0,0 +1,2 @@
+var argv = require('../')(process.argv.slice(2));
+console.log(argv);
diff --git a/node_modules/minimist/index.js b/node_modules/minimist/index.js
new file mode 100644
index 0000000..d2afe5e
--- /dev/null
+++ b/node_modules/minimist/index.js
@@ -0,0 +1,245 @@
+module.exports = function (args, opts) {
+    if (!opts) opts = {};
+    
+    var flags = { bools : {}, strings : {}, unknownFn: null };
+
+    if (typeof opts['unknown'] === 'function') {
+        flags.unknownFn = opts['unknown'];
+    }
+
+    if (typeof opts['boolean'] === 'boolean' && opts['boolean']) {
+      flags.allBools = true;
+    } else {
+      [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
+          flags.bools[key] = true;
+      });
+    }
+    
+    var aliases = {};
+    Object.keys(opts.alias || {}).forEach(function (key) {
+        aliases[key] = [].concat(opts.alias[key]);
+        aliases[key].forEach(function (x) {
+            aliases[x] = [key].concat(aliases[key].filter(function (y) {
+                return x !== y;
+            }));
+        });
+    });
+
+    [].concat(opts.string).filter(Boolean).forEach(function (key) {
+        flags.strings[key] = true;
+        if (aliases[key]) {
+            flags.strings[aliases[key]] = true;
+        }
+     });
+
+    var defaults = opts['default'] || {};
+    
+    var argv = { _ : [] };
+    Object.keys(flags.bools).forEach(function (key) {
+        setArg(key, defaults[key] === undefined ? false : defaults[key]);
+    });
+    
+    var notFlags = [];
+
+    if (args.indexOf('--') !== -1) {
+        notFlags = args.slice(args.indexOf('--')+1);
+        args = args.slice(0, args.indexOf('--'));
+    }
+
+    function argDefined(key, arg) {
+        return (flags.allBools && /^--[^=]+$/.test(arg)) ||
+            flags.strings[key] || flags.bools[key] || aliases[key];
+    }
+
+    function setArg (key, val, arg) {
+        if (arg && flags.unknownFn && !argDefined(key, arg)) {
+            if (flags.unknownFn(arg) === false) return;
+        }
+
+        var value = !flags.strings[key] && isNumber(val)
+            ? Number(val) : val
+        ;
+        setKey(argv, key.split('.'), value);
+        
+        (aliases[key] || []).forEach(function (x) {
+            setKey(argv, x.split('.'), value);
+        });
+    }
+
+    function setKey (obj, keys, value) {
+        var o = obj;
+        for (var i = 0; i < keys.length-1; i++) {
+            var key = keys[i];
+            if (key === '__proto__') return;
+            if (o[key] === undefined) o[key] = {};
+            if (o[key] === Object.prototype || o[key] === Number.prototype
+                || o[key] === String.prototype) o[key] = {};
+            if (o[key] === Array.prototype) o[key] = [];
+            o = o[key];
+        }
+
+        var key = keys[keys.length - 1];
+        if (key === '__proto__') return;
+        if (o === Object.prototype || o === Number.prototype
+            || o === String.prototype) o = {};
+        if (o === Array.prototype) o = [];
+        if (o[key] === undefined || flags.bools[key] || typeof o[key] === 'boolean') {
+            o[key] = value;
+        }
+        else if (Array.isArray(o[key])) {
+            o[key].push(value);
+        }
+        else {
+            o[key] = [ o[key], value ];
+        }
+    }
+    
+    function aliasIsBoolean(key) {
+      return aliases[key].some(function (x) {
+          return flags.bools[x];
+      });
+    }
+
+    for (var i = 0; i < args.length; i++) {
+        var arg = args[i];
+        
+        if (/^--.+=/.test(arg)) {
+            // Using [\s\S] instead of . because js doesn't support the
+            // 'dotall' regex modifier. See:
+            // http://stackoverflow.com/a/1068308/13216
+            var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
+            var key = m[1];
+            var value = m[2];
+            if (flags.bools[key]) {
+                value = value !== 'false';
+            }
+            setArg(key, value, arg);
+        }
+        else if (/^--no-.+/.test(arg)) {
+            var key = arg.match(/^--no-(.+)/)[1];
+            setArg(key, false, arg);
+        }
+        else if (/^--.+/.test(arg)) {
+            var key = arg.match(/^--(.+)/)[1];
+            var next = args[i + 1];
+            if (next !== undefined && !/^-/.test(next)
+            && !flags.bools[key]
+            && !flags.allBools
+            && (aliases[key] ? !aliasIsBoolean(key) : true)) {
+                setArg(key, next, arg);
+                i++;
+            }
+            else if (/^(true|false)$/.test(next)) {
+                setArg(key, next === 'true', arg);
+                i++;
+            }
+            else {
+                setArg(key, flags.strings[key] ? '' : true, arg);
+            }
+        }
+        else if (/^-[^-]+/.test(arg)) {
+            var letters = arg.slice(1,-1).split('');
+            
+            var broken = false;
+            for (var j = 0; j < letters.length; j++) {
+                var next = arg.slice(j+2);
+                
+                if (next === '-') {
+                    setArg(letters[j], next, arg)
+                    continue;
+                }
+                
+                if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) {
+                    setArg(letters[j], next.split('=')[1], arg);
+                    broken = true;
+                    break;
+                }
+                
+                if (/[A-Za-z]/.test(letters[j])
+                && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
+                    setArg(letters[j], next, arg);
+                    broken = true;
+                    break;
+                }
+                
+                if (letters[j+1] && letters[j+1].match(/\W/)) {
+                    setArg(letters[j], arg.slice(j+2), arg);
+                    broken = true;
+                    break;
+                }
+                else {
+                    setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
+                }
+            }
+            
+            var key = arg.slice(-1)[0];
+            if (!broken && key !== '-') {
+                if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
+                && !flags.bools[key]
+                && (aliases[key] ? !aliasIsBoolean(key) : true)) {
+                    setArg(key, args[i+1], arg);
+                    i++;
+                }
+                else if (args[i+1] && /^(true|false)$/.test(args[i+1])) {
+                    setArg(key, args[i+1] === 'true', arg);
+                    i++;
+                }
+                else {
+                    setArg(key, flags.strings[key] ? '' : true, arg);
+                }
+            }
+        }
+        else {
+            if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
+                argv._.push(
+                    flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
+                );
+            }
+            if (opts.stopEarly) {
+                argv._.push.apply(argv._, args.slice(i + 1));
+                break;
+            }
+        }
+    }
+    
+    Object.keys(defaults).forEach(function (key) {
+        if (!hasKey(argv, key.split('.'))) {
+            setKey(argv, key.split('.'), defaults[key]);
+            
+            (aliases[key] || []).forEach(function (x) {
+                setKey(argv, x.split('.'), defaults[key]);
+            });
+        }
+    });
+    
+    if (opts['--']) {
+        argv['--'] = new Array();
+        notFlags.forEach(function(key) {
+            argv['--'].push(key);
+        });
+    }
+    else {
+        notFlags.forEach(function(key) {
+            argv._.push(key);
+        });
+    }
+
+    return argv;
+};
+
+function hasKey (obj, keys) {
+    var o = obj;
+    keys.slice(0,-1).forEach(function (key) {
+        o = (o[key] || {});
+    });
+
+    var key = keys[keys.length - 1];
+    return key in o;
+}
+
+function isNumber (x) {
+    if (typeof x === 'number') return true;
+    if (/^0x[0-9a-f]+$/i.test(x)) return true;
+    return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
+}
+
diff --git a/node_modules/minimist/package.json b/node_modules/minimist/package.json
new file mode 100644
index 0000000..889ea0b
--- /dev/null
+++ b/node_modules/minimist/package.json
@@ -0,0 +1,74 @@
+{
+  "_from": "minimist@^1.2.3",
+  "_id": "minimist@1.2.5",
+  "_inBundle": false,
+  "_integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+  "_location": "/minimist",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "minimist@^1.2.3",
+    "name": "minimist",
+    "escapedName": "minimist",
+    "rawSpec": "^1.2.3",
+    "saveSpec": null,
+    "fetchSpec": "^1.2.3"
+  },
+  "_requiredBy": [
+    "/prebuild-install",
+    "/rc"
+  ],
+  "_resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+  "_shasum": "67d66014b66a6a8aaa0c083c5fd58df4e4e97602",
+  "_spec": "minimist@^1.2.3",
+  "_where": "F:\\vent-display\\node_modules\\prebuild-install",
+  "author": {
+    "name": "James Halliday",
+    "email": "mail@substack.net",
+    "url": "http://substack.net"
+  },
+  "bugs": {
+    "url": "https://github.com/substack/minimist/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "parse argument options",
+  "devDependencies": {
+    "covert": "^1.0.0",
+    "tap": "~0.4.0",
+    "tape": "^3.5.0"
+  },
+  "homepage": "https://github.com/substack/minimist",
+  "keywords": [
+    "argv",
+    "getopt",
+    "parser",
+    "optimist"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "minimist",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/substack/minimist.git"
+  },
+  "scripts": {
+    "coverage": "covert test/*.js",
+    "test": "tap test/*.js"
+  },
+  "testling": {
+    "files": "test/*.js",
+    "browsers": [
+      "ie/6..latest",
+      "ff/5",
+      "firefox/latest",
+      "chrome/10",
+      "chrome/latest",
+      "safari/5.1",
+      "safari/latest",
+      "opera/12"
+    ]
+  },
+  "version": "1.2.5"
+}
diff --git a/node_modules/minimist/readme.markdown b/node_modules/minimist/readme.markdown
new file mode 100644
index 0000000..5fd97ab
--- /dev/null
+++ b/node_modules/minimist/readme.markdown
@@ -0,0 +1,95 @@
+# minimist
+
+parse argument options
+
+This module is the guts of optimist's argument parser without all the
+fanciful decoration.
+
+# example
+
+``` js
+var argv = require('minimist')(process.argv.slice(2));
+console.log(argv);
+```
+
+```
+$ node example/parse.js -a beep -b boop
+{ _: [], a: 'beep', b: 'boop' }
+```
+
+```
+$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz
+{ _: [ 'foo', 'bar', 'baz' ],
+  x: 3,
+  y: 4,
+  n: 5,
+  a: true,
+  b: true,
+  c: true,
+  beep: 'boop' }
+```
+
+# security
+
+Previous versions had a prototype pollution bug that could cause privilege
+escalation in some circumstances when handling untrusted user input.
+
+Please use version 1.2.3 or later: https://snyk.io/vuln/SNYK-JS-MINIMIST-559764
+
+# methods
+
+``` js
+var parseArgs = require('minimist')
+```
+
+## var argv = parseArgs(args, opts={})
+
+Return an argument object `argv` populated with the array arguments from `args`.
+
+`argv._` contains all the arguments that didn't have an option associated with
+them.
+
+Numeric-looking arguments will be returned as numbers unless `opts.string` or
+`opts.boolean` is set for that argument name.
+
+Any arguments after `'--'` will not be parsed and will end up in `argv._`.
+
+options can be:
+
+* `opts.string` - a string or array of strings argument names to always treat as
+strings
+* `opts.boolean` - a boolean, string or array of strings to always treat as
+booleans. if `true` will treat all double hyphenated arguments without equal signs
+as boolean (e.g. affects `--foo`, not `-f` or `--foo=bar`)
+* `opts.alias` - an object mapping string names to strings or arrays of string
+argument names to use as aliases
+* `opts.default` - an object mapping string argument names to default values
+* `opts.stopEarly` - when true, populate `argv._` with everything after the
+first non-option
+* `opts['--']` - when true, populate `argv._` with everything before the `--`
+and `argv['--']` with everything after the `--`. Here's an example:
+
+  ```
+  > require('./')('one two three -- four five --six'.split(' '), { '--': true })
+  { _: [ 'one', 'two', 'three' ],
+    '--': [ 'four', 'five', '--six' ] }
+  ```
+
+  Note that with `opts['--']` set, parsing for arguments still stops after the
+  `--`.
+
+* `opts.unknown` - a function which is invoked with a command line parameter not
+defined in the `opts` configuration object. If the function returns `false`, the
+unknown option is not added to `argv`.
+
+# install
+
+With [npm](https://npmjs.org) do:
+
+```
+npm install minimist
+```
+
+# license
+
+MIT
diff --git a/node_modules/minimist/test/all_bool.js b/node_modules/minimist/test/all_bool.js
new file mode 100644
index 0000000..ac83548
--- /dev/null
+++ b/node_modules/minimist/test/all_bool.js
@@ -0,0 +1,32 @@
+var parse = require('../');
+var test = require('tape');
+
+test('flag boolean true (default all --args to boolean)', function (t) {
+    var argv = parse(['moo', '--honk', 'cow'], {
+        boolean: true
+    });
+    
+    t.deepEqual(argv, {
+        honk: true,
+        _: ['moo', 'cow']
+    });
+    
+    t.deepEqual(typeof argv.honk, 'boolean');
+    t.end();
+});
+
+test('flag boolean true only affects double hyphen arguments without equals signs', function (t) {
+    var argv = parse(['moo', '--honk', 'cow', '-p', '55', '--tacos=good'], {
+        boolean: true
+    });
+    
+    t.deepEqual(argv, {
+        honk: true,
+        tacos: 'good',
+        p: 55,
+        _: ['moo', 'cow']
+    });
+    
+    t.deepEqual(typeof argv.honk, 'boolean');
+    t.end();
+});
diff --git a/node_modules/minimist/test/bool.js b/node_modules/minimist/test/bool.js
new file mode 100644
index 0000000..5f7dbde
--- /dev/null
+++ b/node_modules/minimist/test/bool.js
@@ -0,0 +1,178 @@
+var parse = require('../');
+var test = require('tape');
+
+test('flag boolean default false', function (t) {
+    var argv = parse(['moo'], {
+        boolean: ['t', 'verbose'],
+        default: { verbose: false, t: false }
+    });
+    
+    t.deepEqual(argv, {
+        verbose: false,
+        t: false,
+        _: ['moo']
+    });
+    
+    t.deepEqual(typeof argv.verbose, 'boolean');
+    t.deepEqual(typeof argv.t, 'boolean');
+    t.end();
+
+});
+
+test('boolean groups', function (t) {
+    var argv = parse([ '-x', '-z', 'one', 'two', 'three' ], {
+        boolean: ['x','y','z']
+    });
+    
+    t.deepEqual(argv, {
+        x : true,
+        y : false,
+        z : true,
+        _ : [ 'one', 'two', 'three' ]
+    });
+    
+    t.deepEqual(typeof argv.x, 'boolean');
+    t.deepEqual(typeof argv.y, 'boolean');
+    t.deepEqual(typeof argv.z, 'boolean');
+    t.end();
+});
+test('boolean and alias with chainable api', function (t) {
+    var aliased = [ '-h', 'derp' ];
+    var regular = [ '--herp',  'derp' ];
+    var opts = {
+        herp: { alias: 'h', boolean: true }
+    };
+    var aliasedArgv = parse(aliased, {
+        boolean: 'herp',
+        alias: { h: 'herp' }
+    });
+    var propertyArgv = parse(regular, {
+        boolean: 'herp',
+        alias: { h: 'herp' }
+    });
+    var expected = {
+        herp: true,
+        h: true,
+        '_': [ 'derp' ]
+    };
+    
+    t.same(aliasedArgv, expected);
+    t.same(propertyArgv, expected); 
+    t.end();
+});
+
+test('boolean and alias with options hash', function (t) {
+    var aliased = [ '-h', 'derp' ];
+    var regular = [ '--herp', 'derp' ];
+    var opts = {
+        alias: { 'h': 'herp' },
+        boolean: 'herp'
+    };
+    var aliasedArgv = parse(aliased, opts);
+    var propertyArgv = parse(regular, opts);
+    var expected = {
+        herp: true,
+        h: true,
+        '_': [ 'derp' ]
+    };
+    t.same(aliasedArgv, expected);
+    t.same(propertyArgv, expected);
+    t.end();
+});
+
+test('boolean and alias array with options hash', function (t) {
+    var aliased = [ '-h', 'derp' ];
+    var regular = [ '--herp', 'derp' ];
+    var alt = [ '--harp', 'derp' ];
+    var opts = {
+        alias: { 'h': ['herp', 'harp'] },
+        boolean: 'h'
+    };
+    var aliasedArgv = parse(aliased, opts);
+    var propertyArgv = parse(regular, opts);
+    var altPropertyArgv = parse(alt, opts);
+    var expected = {
+        harp: true,
+        herp: true,
+        h: true,
+        '_': [ 'derp' ]
+    };
+    t.same(aliasedArgv, expected);
+    t.same(propertyArgv, expected);
+    t.same(altPropertyArgv, expected);
+    t.end();
+});
+
+test('boolean and alias using explicit true', function (t) {
+    var aliased = [ '-h', 'true' ];
+    var regular = [ '--herp',  'true' ];
+    var opts = {
+        alias: { h: 'herp' },
+        boolean: 'h'
+    };
+    var aliasedArgv = parse(aliased, opts);
+    var propertyArgv = parse(regular, opts);
+    var expected = {
+        herp: true,
+        h: true,
+        '_': [ ]
+    };
+
+    t.same(aliasedArgv, expected);
+    t.same(propertyArgv, expected); 
+    t.end();
+});
+
+// regression, see https://github.com/substack/node-optimist/issues/71
+test('boolean and --x=true', function(t) {
+    var parsed = parse(['--boool', '--other=true'], {
+        boolean: 'boool'
+    });
+
+    t.same(parsed.boool, true);
+    t.same(parsed.other, 'true');
+
+    parsed = parse(['--boool', '--other=false'], {
+        boolean: 'boool'
+    });
+    
+    t.same(parsed.boool, true);
+    t.same(parsed.other, 'false');
+    t.end();
+});
+
+test('boolean --boool=true', function (t) {
+    var parsed = parse(['--boool=true'], {
+        default: {
+            boool: false
+        },
+        boolean: ['boool']
+    });
+
+    t.same(parsed.boool, true);
+    t.end();
+});
+
+test('boolean --boool=false', function (t) {
+    var parsed = parse(['--boool=false'], {
+        default: {
+          boool: true
+        },
+        boolean: ['boool']
+    });
+
+    t.same(parsed.boool, false);
+    t.end();
+});
+
+test('boolean using something similar to true', function (t) {
+    var opts = { boolean: 'h' };
+    var result = parse(['-h', 'true.txt'], opts);
+    var expected = {
+        h: true,
+        '_': ['true.txt']
+    };
+
+    t.same(result, expected);
+    t.end();
+});
\ No newline at end of file
diff --git a/node_modules/minimist/test/dash.js b/node_modules/minimist/test/dash.js
new file mode 100644
index 0000000..5a4fa5b
--- /dev/null
+++ b/node_modules/minimist/test/dash.js
@@ -0,0 +1,31 @@
+var parse = require('../');
+var test = require('tape');
+
+test('-', function (t) {
+    t.plan(5);
+    t.deepEqual(parse([ '-n', '-' ]), { n: '-', _: [] });
+    t.deepEqual(parse([ '-' ]), { _: [ '-' ] });
+    t.deepEqual(parse([ '-f-' ]), { f: '-', _: [] });
+    t.deepEqual(
+        parse([ '-b', '-' ], { boolean: 'b' }),
+        { b: true, _: [ '-' ] }
+    );
+    t.deepEqual(
+        parse([ '-s', '-' ], { string: 's' }),
+        { s: '-', _: [] }
+    );
+});
+
+test('-a -- b', function (t) {
+    t.plan(3);
+    t.deepEqual(parse([ '-a', '--', 'b' ]), { a: true, _: [ 'b' ] });
+    t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] });
+    t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] });
+});
+
+test('move arguments after the -- into their own `--` array', function(t) {
+    t.plan(1);
+    t.deepEqual(
+        parse([ '--name', 'John', 'before', '--', 'after' ], { '--': true }),
+        { name: 'John', _: [ 'before' ], '--': [ 'after' ] });
+});
diff --git a/node_modules/minimist/test/default_bool.js b/node_modules/minimist/test/default_bool.js
new file mode 100644
index 0000000..780a311
--- /dev/null
+++ b/node_modules/minimist/test/default_bool.js
@@ -0,0 +1,35 @@
+var test = require('tape');
+var parse = require('../');
+
+test('boolean default true', function (t) {
+    var argv = parse([], {
+        boolean: 'sometrue',
+        default: { sometrue: true }
+    });
+    t.equal(argv.sometrue, true);
+    t.end();
+});
+
+test('boolean default false', function (t) {
+    var argv = parse([], {
+        boolean: 'somefalse',
+        default: { somefalse: false }
+    });
+    t.equal(argv.somefalse, false);
+    t.end();
+});
+
+test('boolean default to null', function (t) {
+    var argv = parse([], {
+        boolean: 'maybe',
+        default: { maybe: null }
+    });
+    t.equal(argv.maybe, null);
+    var argv = parse(['--maybe'], {
+        boolean: 'maybe',
+        default: { maybe: null }
+    });
+    t.equal(argv.maybe, true);
+    t.end();
+
+})
diff --git a/node_modules/minimist/test/dotted.js b/node_modules/minimist/test/dotted.js
new file mode 100644
index 0000000..d8b3e85
--- /dev/null
+++ b/node_modules/minimist/test/dotted.js
@@ -0,0 +1,22 @@
+var parse = require('../');
+var test = require('tape');
+
+test('dotted alias', function (t) {
+    var argv = parse(['--a.b', '22'], {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}});
+    t.equal(argv.a.b, 22);
+    t.equal(argv.aa.bb, 22);
+    t.end();
+});
+
+test('dotted default', function (t) {
+    var argv = parse('', {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}});
+    t.equal(argv.a.b, 11);
+    t.equal(argv.aa.bb, 11);
+    t.end();
+});
+
+test('dotted default with no alias', function (t) {
+    var argv = parse('', {default: {'a.b': 11}});
+    t.equal(argv.a.b, 11);
+    t.end();
+});
diff --git a/node_modules/minimist/test/kv_short.js b/node_modules/minimist/test/kv_short.js
new file mode 100644
index 0000000..f813b30
--- /dev/null
+++ b/node_modules/minimist/test/kv_short.js
@@ -0,0 +1,16 @@
+var parse = require('../');
+var test = require('tape');
+
+test('short -k=v' , function (t) {
+    t.plan(1);
+    
+    var argv = parse([ '-b=123' ]);
+    t.deepEqual(argv, { b: 123, _: [] });
+});
+
+test('multi short -k=v' , function (t) {
+    t.plan(1);
+    
+    var argv = parse([ '-a=whatever', '-b=robots' ]);
+    t.deepEqual(argv, { a: 'whatever', b: 'robots', _: [] });
+});
diff --git a/node_modules/minimist/test/long.js b/node_modules/minimist/test/long.js
new file mode 100644
index 0000000..5d3a1e0
--- /dev/null
+++ b/node_modules/minimist/test/long.js
@@ -0,0 +1,31 @@
+var test = require('tape');
+var parse = require('../');
+
+test('long opts', function (t) {
+    t.deepEqual(
+        parse([ '--bool' ]),
+        { bool : true, _ : [] },
+        'long boolean'
+    );
+    t.deepEqual(
+        parse([ '--pow', 'xixxle' ]),
+        { pow : 'xixxle', _ : [] },
+        'long capture sp'
+    );
+    t.deepEqual(
+        parse([ '--pow=xixxle' ]),
+        { pow : 'xixxle', _ : [] },
+        'long capture eq'
+    );
+    t.deepEqual(
+        parse([ '--host', 'localhost', '--port', '555' ]),
+        { host : 'localhost', port : 555, _ : [] },
+        'long captures sp'
+    );
+    t.deepEqual(
+        parse([ '--host=localhost', '--port=555' ]),
+        { host : 'localhost', port : 555, _ : [] },
+        'long captures eq'
+    );
+    t.end();
+});
diff --git a/node_modules/minimist/test/num.js b/node_modules/minimist/test/num.js
new file mode 100644
index 0000000..2cc77f4
--- /dev/null
+++ b/node_modules/minimist/test/num.js
@@ -0,0 +1,36 @@
+var parse = require('../');
+var test = require('tape');
+
+test('nums', function (t) {
+    var argv = parse([
+        '-x', '1234',
+        '-y', '5.67',
+        '-z', '1e7',
+        '-w', '10f',
+        '--hex', '0xdeadbeef',
+        '789'
+    ]);
+    t.deepEqual(argv, {
+        x : 1234,
+        y : 5.67,
+        z : 1e7,
+        w : '10f',
+        hex : 0xdeadbeef,
+        _ : [ 789 ]
+    });
+    t.deepEqual(typeof argv.x, 'number');
+    t.deepEqual(typeof argv.y, 'number');
+    t.deepEqual(typeof argv.z, 'number');
+    t.deepEqual(typeof argv.w, 'string');
+    t.deepEqual(typeof argv.hex, 'number');
+    t.deepEqual(typeof argv._[0], 'number');
+    t.end();
+});
+
+test('already a number', function (t) {
+    var argv = parse([ '-x', 1234, 789 ]);
+    t.deepEqual(argv, { x : 1234, _ : [ 789 ] });
+    t.deepEqual(typeof argv.x, 'number');
+    t.deepEqual(typeof argv._[0], 'number');
+    t.end();
+});
diff --git a/node_modules/minimist/test/parse.js b/node_modules/minimist/test/parse.js
new file mode 100644
index 0000000..7b4a2a1
--- /dev/null
+++ b/node_modules/minimist/test/parse.js
@@ -0,0 +1,197 @@
+var parse = require('../');
+var test = require('tape');
+
+test('parse args', function (t) {
+    t.deepEqual(
+        parse([ '--no-moo' ]),
+        { moo : false, _ : [] },
+        'no'
+    );
+    t.deepEqual(
+        parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]),
+        { v : ['a','b','c'], _ : [] },
+        'multi'
+    );
+    t.end();
+});
+ 
+test('comprehensive', function (t) {
+    t.deepEqual(
+        parse([
+            '--name=meowmers', 'bare', '-cats', 'woo',
+            '-h', 'awesome', '--multi=quux',
+            '--key', 'value',
+            '-b', '--bool', '--no-meep', '--multi=baz',
+            '--', '--not-a-flag', 'eek'
+        ]),
+        {
+            c : true,
+            a : true,
+            t : true,
+            s : 'woo',
+            h : 'awesome',
+            b : true,
+            bool : true,
+            key : 'value',
+            multi : [ 'quux', 'baz' ],
+            meep : false,
+            name : 'meowmers',
+            _ : [ 'bare', '--not-a-flag', 'eek' ]
+        }
+    );
+    t.end();
+});
+
+test('flag boolean', function (t) {
+    var argv = parse([ '-t', 'moo' ], { boolean: 't' });
+    t.deepEqual(argv, { t : true, _ : [ 'moo' ] });
+    t.deepEqual(typeof argv.t, 'boolean');
+    t.end();
+});
+
+test('flag boolean value', function (t) {
+    var argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], {
+        boolean: [ 't', 'verbose' ],
+        default: { verbose: true }
+    });
+    
+    t.deepEqual(argv, {
+        verbose: false,
+        t: true,
+        _: ['moo']
+    });
+    
+    t.deepEqual(typeof argv.verbose, 'boolean');
+    t.deepEqual(typeof argv.t, 'boolean');
+    t.end();
+});
+
+test('newlines in params' , function (t) {
+    var args = parse([ '-s', "X\nX" ])
+    t.deepEqual(args, { _ : [], s : "X\nX" });
+    
+    // reproduce in bash:
+    // VALUE="new
+    // line"
+    // node program.js --s="$VALUE"
+    args = parse([ "--s=X\nX" ])
+    t.deepEqual(args, { _ : [], s : "X\nX" });
+    t.end();
+});
+
+test('strings' , function (t) {
+    var s = parse([ '-s', '0001234' ], { string: 's' }).s;
+    t.equal(s, '0001234');
+    t.equal(typeof s, 'string');
+    
+    var x = parse([ '-x', '56' ], { string: 'x' }).x;
+    t.equal(x, '56');
+    t.equal(typeof x, 'string');
+    t.end();
+});
+
+test('stringArgs', function (t) {
+    var s = parse([ '  ', '  ' ], { string: '_' })._;
+    t.same(s.length, 2);
+    t.same(typeof s[0], 'string');
+    t.same(s[0], '  ');
+    t.same(typeof s[1], 'string');
+    t.same(s[1], '  ');
+    t.end();
+});
+
+test('empty strings', function(t) {
+    var s = parse([ '-s' ], { string: 's' }).s;
+    t.equal(s, '');
+    t.equal(typeof s, 'string');
+
+    var str = parse([ '--str' ], { string: 'str' }).str;
+    t.equal(str, '');
+    t.equal(typeof str, 'string');
+
+    var letters = parse([ '-art' ], {
+        string: [ 'a', 't' ]
+    });
+
+    t.equal(letters.a, '');
+    t.equal(letters.r, true);
+    t.equal(letters.t, '');
+
+    t.end();
+});
+
+
+test('string and alias', function(t) {
+    var x = parse([ '--str',  '000123' ], {
+        string: 's',
+        alias: { s: 'str' }
+    });
+
+    t.equal(x.str, '000123');
+    t.equal(typeof x.str, 'string');
+    t.equal(x.s, '000123');
+    t.equal(typeof x.s, 'string');
+
+    var y = parse([ '-s',  '000123' ], {
+        string: 'str',
+        alias: { str: 's' }
+    });
+
+    t.equal(y.str, '000123');
+    t.equal(typeof y.str, 'string');
+    t.equal(y.s, '000123');
+    t.equal(typeof y.s, 'string');
+    t.end();
+});
+
+test('slashBreak', function (t) {
+    t.same(
+        parse([ '-I/foo/bar/baz' ]),
+        { I : '/foo/bar/baz', _ : [] }
+    );
+    t.same(
+        parse([ '-xyz/foo/bar/baz' ]),
+        { x : true, y : true, z : '/foo/bar/baz', _ : [] }
+    );
+    t.end();
+});
+
+test('alias', function (t) {
+    var argv = parse([ '-f', '11', '--zoom', '55' ], {
+        alias: { z: 'zoom' }
+    });
+    t.equal(argv.zoom, 55);
+    t.equal(argv.z, argv.zoom);
+    t.equal(argv.f, 11);
+    t.end();
+});
+
+test('multiAlias', function (t) {
+    var argv = parse([ '-f', '11', '--zoom', '55' ], {
+        alias: { z: [ 'zm', 'zoom' ] }
+    });
+    t.equal(argv.zoom, 55);
+    t.equal(argv.z, argv.zoom);
+    t.equal(argv.z, argv.zm);
+    t.equal(argv.f, 11);
+    t.end();
+});
+
+test('nested dotted objects', function (t) {
+    var argv = parse([
+        '--foo.bar', '3', '--foo.baz', '4',
+        '--foo.quux.quibble', '5', '--foo.quux.o_O',
+        '--beep.boop'
+    ]);
+    
+    t.same(argv.foo, {
+        bar : 3,
+        baz : 4,
+        quux : {
+            quibble : 5,
+            o_O : true
+        }
+    });
+    t.same(argv.beep, { boop : true });
+    t.end();
+});
diff --git a/node_modules/minimist/test/parse_modified.js b/node_modules/minimist/test/parse_modified.js
new file mode 100644
index 0000000..ab620dc
--- /dev/null
+++ b/node_modules/minimist/test/parse_modified.js
@@ -0,0 +1,9 @@
+var parse = require('../');
+var test = require('tape');
+
+test('parse with modifier functions' , function (t) {
+    t.plan(1);
+    
+    var argv = parse([ '-b', '123' ], { boolean: 'b' });
+    t.deepEqual(argv, { b: true, _: [123] });
+});
diff --git a/node_modules/minimist/test/proto.js b/node_modules/minimist/test/proto.js
new file mode 100644
index 0000000..8649107
--- /dev/null
+++ b/node_modules/minimist/test/proto.js
@@ -0,0 +1,44 @@
+var parse = require('../');
+var test = require('tape');
+
+test('proto pollution', function (t) {
+    var argv = parse(['--__proto__.x','123']);
+    t.equal({}.x, undefined);
+    t.equal(argv.__proto__.x, undefined);
+    t.equal(argv.x, undefined);
+    t.end();
+});
+
+test('proto pollution (array)', function (t) {
+    var argv = parse(['--x','4','--x','5','--x.__proto__.z','789']);
+    t.equal({}.z, undefined);
+    t.deepEqual(argv.x, [4,5]);
+    t.equal(argv.x.z, undefined);
+    t.equal(argv.x.__proto__.z, undefined);
+    t.end();
+});
+
+test('proto pollution (number)', function (t) {
+    var argv = parse(['--x','5','--x.__proto__.z','100']);
+    t.equal({}.z, undefined);
+    t.equal((4).z, undefined);
+    t.equal(argv.x, 5);
+    t.equal(argv.x.z, undefined);
+    t.end();
+});
+
+test('proto pollution (string)', function (t) {
+    var argv = parse(['--x','abc','--x.__proto__.z','def']);
+    t.equal({}.z, undefined);
+    t.equal('...'.z, undefined);
+    t.equal(argv.x, 'abc');
+    t.equal(argv.x.z, undefined);
+    t.end();
+});
+
+test('proto pollution (constructor)', function (t) {
+    var argv = parse(['--constructor.prototype.y','123']);
+    t.equal({}.y, undefined);
+    t.equal(argv.y, undefined);
+    t.end();
+});
diff --git a/node_modules/minimist/test/short.js b/node_modules/minimist/test/short.js
new file mode 100644
index 0000000..d513a1c
--- /dev/null
+++ b/node_modules/minimist/test/short.js
@@ -0,0 +1,67 @@
+var parse = require('../');
+var test = require('tape');
+
+test('numeric short args', function (t) {
+    t.plan(2);
+    t.deepEqual(parse([ '-n123' ]), { n: 123, _: [] });
+    t.deepEqual(
+        parse([ '-123', '456' ]),
+        { 1: true, 2: true, 3: 456, _: [] }
+    );
+});
+
+test('short', function (t) {
+    t.deepEqual(
+        parse([ '-b' ]),
+        { b : true, _ : [] },
+        'short boolean'
+    );
+    t.deepEqual(
+        parse([ 'foo', 'bar', 'baz' ]),
+        { _ : [ 'foo', 'bar', 'baz' ] },
+        'bare'
+    );
+    t.deepEqual(
+        parse([ '-cats' ]),
+        { c : true, a : true, t : true, s : true, _ : [] },
+        'group'
+    );
+    t.deepEqual(
+        parse([ '-cats', 'meow' ]),
+        { c : true, a : true, t : true, s : 'meow', _ : [] },
+        'short group next'
+    );
+    t.deepEqual(
+        parse([ '-h', 'localhost' ]),
+        { h : 'localhost', _ : [] },
+        'short capture'
+    );
+    t.deepEqual(
+        parse([ '-h', 'localhost', '-p', '555' ]),
+        { h : 'localhost', p : 555, _ : [] },
+        'short captures'
+    );
+    t.end();
+});
+ 
+test('mixed short bool and capture', function (t) {
+    t.same(
+        parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
+        {
+            f : true, p : 555, h : 'localhost',
+            _ : [ 'script.js' ]
+        }
+    );
+    t.end();
+});
+ 
+test('short and long', function (t) {
+    t.deepEqual(
+        parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
+        {
+            f : true, p : 555, h : 'localhost',
+            _ : [ 'script.js' ]
+        }
+    );
+    t.end();
+});
diff --git a/node_modules/minimist/test/stop_early.js b/node_modules/minimist/test/stop_early.js
new file mode 100644
index 0000000..bdf9fbc
--- /dev/null
+++ b/node_modules/minimist/test/stop_early.js
@@ -0,0 +1,15 @@
+var parse = require('../');
+var test = require('tape');
+
+test('stops parsing on the first non-option when stopEarly is set', function (t) {
+    var argv = parse(['--aaa', 'bbb', 'ccc', '--ddd'], {
+        stopEarly: true
+    });
+
+    t.deepEqual(argv, {
+        aaa: 'bbb',
+        _: ['ccc', '--ddd']
+    });
+
+    t.end();
+});
diff --git a/node_modules/minimist/test/unknown.js b/node_modules/minimist/test/unknown.js
new file mode 100644
index 0000000..462a36b
--- /dev/null
+++ b/node_modules/minimist/test/unknown.js
@@ -0,0 +1,102 @@
+var parse = require('../');
+var test = require('tape');
+
+test('boolean and alias is not unknown', function (t) {
+    var unknown = [];
+    function unknownFn(arg) {
+        unknown.push(arg);
+        return false;
+    }
+    var aliased = [ '-h', 'true', '--derp', 'true' ];
+    var regular = [ '--herp',  'true', '-d', 'true' ];
+    var opts = {
+        alias: { h: 'herp' },
+        boolean: 'h',
+        unknown: unknownFn
+    };
+    var aliasedArgv = parse(aliased, opts);
+    var propertyArgv = parse(regular, opts);
+
+    t.same(unknown, ['--derp', '-d']);
+    t.end();
+});
+
+test('flag boolean true any double hyphen argument is not unknown', function (t) {
+    var unknown = [];
+    function unknownFn(arg) {
+        unknown.push(arg);
+        return false;
+    }
+    var argv = parse(['--honk', '--tacos=good', 'cow', '-p', '55'], {
+        boolean: true,
+        unknown: unknownFn
+    });
+    t.same(unknown, ['--tacos=good', 'cow', '-p']);
+    t.same(argv, {
+        honk: true,
+        _: []
+    });
+    t.end();
+});
+
+test('string and alias is not unknown', function (t) {
+    var unknown = [];
+    function unknownFn(arg) {
+        unknown.push(arg);
+        return false;
+    }
+    var aliased = [ '-h', 'hello', '--derp', 'goodbye' ];
+    var regular = [ '--herp',  'hello', '-d', 'moon' ];
+    var opts = {
+        alias: { h: 'herp' },
+        string: 'h',
+        unknown: unknownFn
+    };
+    var aliasedArgv = parse(aliased, opts);
+    var propertyArgv = parse(regular, opts);
+
+    t.same(unknown, ['--derp', '-d']);
+    t.end();
+});
+
+test('default and alias is not unknown', function (t) {
+    var unknown = [];
+    function unknownFn(arg) {
+        unknown.push(arg);
+        return false;
+    }
+    var aliased = [ '-h', 'hello' ];
+    var regular = [ '--herp',  'hello' ];
+    var opts = {
+        default: { 'h': 'bar' },
+        alias: { 'h': 'herp' },
+        unknown: unknownFn
+    };
+    var aliasedArgv = parse(aliased, opts);
+    var propertyArgv = parse(regular, opts);
+
+    t.same(unknown, []);
+    t.end();
+    unknownFn(); // exercise fn for 100% coverage
+});
+
+test('value following -- is not unknown', function (t) {
+    var unknown = [];
+    function unknownFn(arg) {
+        unknown.push(arg);
+        return false;
+    }
+    var aliased = [ '--bad', '--', 'good', 'arg' ];
+    var opts = {
+        '--': true,
+        unknown: unknownFn
+    };
+    var argv = parse(aliased, opts);
+
+    t.same(unknown, ['--bad']);
+    t.same(argv, {
+        '--': ['good', 'arg'],
+        '_': []
+    })
+    t.end();
+});
diff --git a/node_modules/minimist/test/whitespace.js b/node_modules/minimist/test/whitespace.js
new file mode 100644
index 0000000..8a52a58
--- /dev/null
+++ b/node_modules/minimist/test/whitespace.js
@@ -0,0 +1,8 @@
+var parse = require('../');
+var test = require('tape');
+
+test('whitespace should be whitespace' , function (t) {
+    t.plan(1);
+    var x = parse([ '-x', '\t' ]).x;
+    t.equal(x, '\t');
+});
diff --git a/node_modules/mkdirp-classic/LICENSE b/node_modules/mkdirp-classic/LICENSE
new file mode 100644
index 0000000..f6b3a0d
--- /dev/null
+++ b/node_modules/mkdirp-classic/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2020 James Halliday (mail@substack.net) and Mathias Buus
+
+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/mkdirp-classic/README.md b/node_modules/mkdirp-classic/README.md
new file mode 100644
index 0000000..be5ac93
--- /dev/null
+++ b/node_modules/mkdirp-classic/README.md
@@ -0,0 +1,18 @@
+# mkdirp-classic
+
+Just a non-deprecated mirror of [mkdirp 0.5.2](https://github.com/substack/node-mkdirp/tree/0.5.1)
+for use in modules where we depend on the non promise interface.
+
+```
+npm install mkdirp-classic
+```
+
+## Usage
+
+``` js
+// See the above link
+```
+
+## License
+
+MIT
diff --git a/node_modules/mkdirp-classic/index.js b/node_modules/mkdirp-classic/index.js
new file mode 100644
index 0000000..6ce241b
--- /dev/null
+++ b/node_modules/mkdirp-classic/index.js
@@ -0,0 +1,98 @@
+var path = require('path');
+var fs = require('fs');
+var _0777 = parseInt('0777', 8);
+
+module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP;
+
+function mkdirP (p, opts, f, made) {
+    if (typeof opts === 'function') {
+        f = opts;
+        opts = {};
+    }
+    else if (!opts || typeof opts !== 'object') {
+        opts = { mode: opts };
+    }
+    
+    var mode = opts.mode;
+    var xfs = opts.fs || fs;
+    
+    if (mode === undefined) {
+        mode = _0777 & (~process.umask());
+    }
+    if (!made) made = null;
+    
+    var cb = f || function () {};
+    p = path.resolve(p);
+    
+    xfs.mkdir(p, mode, function (er) {
+        if (!er) {
+            made = made || p;
+            return cb(null, made);
+        }
+        switch (er.code) {
+            case 'ENOENT':
+                mkdirP(path.dirname(p), opts, function (er, made) {
+                    if (er) cb(er, made);
+                    else mkdirP(p, opts, cb, made);
+                });
+                break;
+
+            // In the case of any other error, just see if there's a dir
+            // there already.  If so, then hooray!  If not, then something
+            // is borked.
+            default:
+                xfs.stat(p, function (er2, stat) {
+                    // if the stat fails, then that's super weird.
+                    // let the original error be the failure reason.
+                    if (er2 || !stat.isDirectory()) cb(er, made)
+                    else cb(null, made);
+                });
+                break;
+        }
+    });
+}
+
+mkdirP.sync = function sync (p, opts, made) {
+    if (!opts || typeof opts !== 'object') {
+        opts = { mode: opts };
+    }
+    
+    var mode = opts.mode;
+    var xfs = opts.fs || fs;
+    
+    if (mode === undefined) {
+        mode = _0777 & (~process.umask());
+    }
+    if (!made) made = null;
+
+    p = path.resolve(p);
+
+    try {
+        xfs.mkdirSync(p, mode);
+        made = made || p;
+    }
+    catch (err0) {
+        switch (err0.code) {
+            case 'ENOENT' :
+                made = sync(path.dirname(p), opts, made);
+                sync(p, opts, made);
+                break;
+
+            // In the case of any other error, just see if there's a dir
+            // there already.  If so, then hooray!  If not, then something
+            // is borked.
+            default:
+                var stat;
+                try {
+                    stat = xfs.statSync(p);
+                }
+                catch (err1) {
+                    throw err0;
+                }
+                if (!stat.isDirectory()) throw err0;
+                break;
+        }
+    }
+
+    return made;
+};
diff --git a/node_modules/mkdirp-classic/package.json b/node_modules/mkdirp-classic/package.json
new file mode 100644
index 0000000..1a91ae6
--- /dev/null
+++ b/node_modules/mkdirp-classic/package.json
@@ -0,0 +1,47 @@
+{
+  "_from": "mkdirp-classic@^0.5.3",
+  "_id": "mkdirp-classic@0.5.3",
+  "_inBundle": false,
+  "_integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+  "_location": "/mkdirp-classic",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "mkdirp-classic@^0.5.3",
+    "name": "mkdirp-classic",
+    "escapedName": "mkdirp-classic",
+    "rawSpec": "^0.5.3",
+    "saveSpec": null,
+    "fetchSpec": "^0.5.3"
+  },
+  "_requiredBy": [
+    "/prebuild-install",
+    "/tar-fs"
+  ],
+  "_resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+  "_shasum": "fa10c9115cc6d8865be221ba47ee9bed78601113",
+  "_spec": "mkdirp-classic@^0.5.3",
+  "_where": "F:\\vent-display\\node_modules\\prebuild-install",
+  "author": {
+    "name": "Mathias Buus",
+    "url": "@mafintosh"
+  },
+  "bugs": {
+    "url": "https://github.com/mafintosh/mkdirp-classic/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {},
+  "deprecated": false,
+  "description": "Mirror of mkdirp 0.5.2",
+  "devDependencies": {},
+  "homepage": "https://github.com/mafintosh/mkdirp-classic",
+  "license": "MIT",
+  "main": "index.js",
+  "name": "mkdirp-classic",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/mafintosh/mkdirp-classic.git"
+  },
+  "version": "0.5.3"
+}
diff --git a/node_modules/ms/index.js b/node_modules/ms/index.js
new file mode 100644
index 0000000..c4498bc
--- /dev/null
+++ b/node_modules/ms/index.js
@@ -0,0 +1,162 @@
+/**
+ * Helpers.
+ */
+
+var s = 1000;
+var m = s * 60;
+var h = m * 60;
+var d = h * 24;
+var w = d * 7;
+var y = d * 365.25;
+
+/**
+ * Parse or format the given `val`.
+ *
+ * Options:
+ *
+ *  - `long` verbose formatting [false]
+ *
+ * @param {String|Number} val
+ * @param {Object} [options]
+ * @throws {Error} throw an error if val is not a non-empty string or a number
+ * @return {String|Number}
+ * @api public
+ */
+
+module.exports = function(val, options) {
+  options = options || {};
+  var type = typeof val;
+  if (type === 'string' && val.length > 0) {
+    return parse(val);
+  } else if (type === 'number' && isFinite(val)) {
+    return options.long ? fmtLong(val) : fmtShort(val);
+  }
+  throw new Error(
+    'val is not a non-empty string or a valid number. val=' +
+      JSON.stringify(val)
+  );
+};
+
+/**
+ * Parse the given `str` and return milliseconds.
+ *
+ * @param {String} str
+ * @return {Number}
+ * @api private
+ */
+
+function parse(str) {
+  str = String(str);
+  if (str.length > 100) {
+    return;
+  }
+  var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|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 'weeks':
+    case 'week':
+    case 'w':
+      return n * w;
+    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;
+    default:
+      return undefined;
+  }
+}
+
+/**
+ * Short format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+function fmtShort(ms) {
+  var msAbs = Math.abs(ms);
+  if (msAbs >= d) {
+    return Math.round(ms / d) + 'd';
+  }
+  if (msAbs >= h) {
+    return Math.round(ms / h) + 'h';
+  }
+  if (msAbs >= m) {
+    return Math.round(ms / m) + 'm';
+  }
+  if (msAbs >= s) {
+    return Math.round(ms / s) + 's';
+  }
+  return ms + 'ms';
+}
+
+/**
+ * Long format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+function fmtLong(ms) {
+  var msAbs = Math.abs(ms);
+  if (msAbs >= d) {
+    return plural(ms, msAbs, d, 'day');
+  }
+  if (msAbs >= h) {
+    return plural(ms, msAbs, h, 'hour');
+  }
+  if (msAbs >= m) {
+    return plural(ms, msAbs, m, 'minute');
+  }
+  if (msAbs >= s) {
+    return plural(ms, msAbs, s, 'second');
+  }
+  return ms + ' ms';
+}
+
+/**
+ * Pluralization helper.
+ */
+
+function plural(ms, msAbs, n, name) {
+  var isPlural = msAbs >= n * 1.5;
+  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
+}
diff --git a/node_modules/ms/license.md b/node_modules/ms/license.md
new file mode 100644
index 0000000..69b6125
--- /dev/null
+++ b/node_modules/ms/license.md
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Zeit, Inc.
+
+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/ms/package.json b/node_modules/ms/package.json
new file mode 100644
index 0000000..95bf177
--- /dev/null
+++ b/node_modules/ms/package.json
@@ -0,0 +1,69 @@
+{
+  "_from": "ms@2.1.2",
+  "_id": "ms@2.1.2",
+  "_inBundle": false,
+  "_integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+  "_location": "/ms",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "version",
+    "registry": true,
+    "raw": "ms@2.1.2",
+    "name": "ms",
+    "escapedName": "ms",
+    "rawSpec": "2.1.2",
+    "saveSpec": null,
+    "fetchSpec": "2.1.2"
+  },
+  "_requiredBy": [
+    "/debug"
+  ],
+  "_resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+  "_shasum": "d09d1f357b443f493382a8eb3ccd183872ae6009",
+  "_spec": "ms@2.1.2",
+  "_where": "F:\\vent-display\\node_modules\\debug",
+  "bugs": {
+    "url": "https://github.com/zeit/ms/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Tiny millisecond conversion utility",
+  "devDependencies": {
+    "eslint": "4.12.1",
+    "expect.js": "0.3.1",
+    "husky": "0.14.3",
+    "lint-staged": "5.0.0",
+    "mocha": "4.0.1"
+  },
+  "eslintConfig": {
+    "extends": "eslint:recommended",
+    "env": {
+      "node": true,
+      "es6": true
+    }
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/zeit/ms#readme",
+  "license": "MIT",
+  "lint-staged": {
+    "*.js": [
+      "npm run lint",
+      "prettier --single-quote --write",
+      "git add"
+    ]
+  },
+  "main": "./index",
+  "name": "ms",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/zeit/ms.git"
+  },
+  "scripts": {
+    "lint": "eslint lib/* bin/*",
+    "precommit": "lint-staged",
+    "test": "mocha tests.js"
+  },
+  "version": "2.1.2"
+}
diff --git a/node_modules/ms/readme.md b/node_modules/ms/readme.md
new file mode 100644
index 0000000..9a1996b
--- /dev/null
+++ b/node_modules/ms/readme.md
@@ -0,0 +1,60 @@
+# ms
+
+[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms)
+[![Join the community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/zeit)
+
+Use this package to easily convert various time formats to milliseconds.
+
+## Examples
+
+```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('1y')      // 31557600000
+ms('100')     // 100
+ms('-3 days') // -259200000
+ms('-1h')     // -3600000
+ms('-200')    // -200
+```
+
+### Convert from Milliseconds
+
+```js
+ms(60000)             // "1m"
+ms(2 * 60000)         // "2m"
+ms(-3 * 60000)        // "-3m"
+ms(ms('10 hours'))    // "10h"
+```
+
+### Time Format Written-Out
+
+```js
+ms(60000, { long: true })             // "1 minute"
+ms(2 * 60000, { long: true })         // "2 minutes"
+ms(-3 * 60000, { long: true })        // "-3 minutes"
+ms(ms('10 hours'), { long: true })    // "10 hours"
+```
+
+## Features
+
+- Works both in [Node.js](https://nodejs.org) and in the browser
+- 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 milliseconds is returned
+
+## Related Packages
+
+- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time.
+
+## Caught a Bug?
+
+1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device
+2. Link the package to the global module directory: `npm link`
+3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms!
+
+As always, you can run the tests using: `npm test`
diff --git a/node_modules/nan/CHANGELOG.md b/node_modules/nan/CHANGELOG.md
new file mode 100644
index 0000000..93d9496
--- /dev/null
+++ b/node_modules/nan/CHANGELOG.md
@@ -0,0 +1,537 @@
+# NAN ChangeLog
+
+**Version 2.14.2: current Node 14.13.1, Node 0.12: 0.12.18, Node 0.10: 0.10.48, iojs: 3.3.1**
+
+### 2.14.2 Oct 13 2020
+
+  - Bugfix: fix gcc 8 function cast warning (#899) 35f0fab205574b2cbda04e6347c8b2db755e124f
+
+### 2.14.1 Apr 21 2020
+
+  - Bugfix: use GetBackingStore() instead of GetContents() (#888) 2c023bd447661a61071da318b0ff4003c3858d39
+
+### 2.14.0 May 16 2019
+
+  - Feature: Add missing methods to Nan::Maybe<T> (#852) 4e962489fb84a184035b9fa74f245f650249aca6
+
+### 2.13.2 Mar 24 2019
+
+  - Bugfix: remove usage of deprecated `IsNearDeath` (#842) fbaf42252af279c3d867c6b193571f9711c39847
+
+### 2.13.1 Mar 14 2019
+
+  - Bugfix: check V8 version directly instead of inferring from NMV (#840) 12f9df9f393285de8fb4a8cd01478dc4fe3b089d
+
+### 2.13.0 Mar 13 2019
+
+  - Feature: add support for node master (#831) 113c0282072e7ff4f9dfc98b432fd894b798c2c
+
+### 2.12.1 Dec 18 2018
+
+  - Bugfix: Fix build breakage with Node.js 10.0.0-10.9.0. (#833) 625e90e8fef8d39ffa7247250a76a100b2487474
+
+### 2.12.0 Dec 16 2018
+
+  - Bugfix: Add scope.Escape() to Call() (#817) 2e5ed4fc3a8ac80a6ef1f2a55099ab3ac8800dc6
+  - Bugfix: Fix Node.js v10.12.0 deprecation warnings. 509859cc23b1770376b56550a027840a2ce0f73d
+  - Feature: Allow SetWeak() for non-object persistent handles. (#824) e6ef6a48e7e671fe3e4b7dddaa8912a3f8262ecd
+
+### 2.11.1 Sep 29 2018
+
+  - Fix: adapt to V8 7.0 24a22c3b25eeeec2016c6ec239bdd6169e985447
+
+### 2.11.0 Aug 25 2018
+
+  - Removal: remove `FunctionCallbackInfo::Callee` for nodejs `>= 10` 1a56c0a6efd4fac944cb46c30912a8e023bda7d4
+  - Bugfix: Fix `AsyncProgressWorkerBase::WorkProgress` sends invalid data b0c764d1dab11e9f8b37ffb81e2560a4498aad5e
+  - Feature: Introduce `GetCurrentEventLoop` b4911b0bb1f6d47d860e10ec014d941c51efac5e
+  - Feature: Add `NAN_MODULE_WORKER_ENABLED` macro as a replacement for `NAN_MODULE` b058fb047d18a58250e66ae831444441c1f2ac7a
+
+### 2.10.0 Mar 16 2018
+
+  - Deprecation: Deprecate `MakeCallback` 5e92b19a59e194241d6a658bd6ff7bfbda372950
+  - Feature: add `Nan::Call` overload 4482e1242fe124d166fc1a5b2be3c1cc849fe452
+  - Feature: add more `Nan::Call` overloads 8584e63e6d04c7d2eb8c4a664e4ef57d70bf672b
+  - Feature: Fix deprecation warnings for Node 10 1caf258243b0602ed56922bde74f1c91b0cbcb6a
+
+### 2.9.2 Feb 22 2018
+
+  - Bugfix: Bandaid for async hooks 212bd2f849be14ef1b02fc85010b053daa24252b
+
+### 2.9.1 Feb 22 2018
+
+  - Bugfix: Avoid deprecation warnings in deprecated `Nan::Callback::operator()` 372b14d91289df4604b0f81780709708c45a9aa4
+  - Bugfix: Avoid deprecation warnings in `Nan::JSON` 3bc294bce0b7d0a3ee4559926303e5ed4866fda2
+
+### 2.9.0 Feb 22 2018
+
+  - Deprecation: Deprecate legacy `Callback::Call` 6dd5fa690af61ca3523004b433304c581b3ea309
+  - Feature: introduce `AsyncResource` class 90c0a179c0d8cb5fd26f1a7d2b1d6231eb402d48o
+  - Feature: Add context aware `Nan::Callback::Call` functions 7169e09fb088418b6e388222e88b4c13f07ebaee
+  - Feature: Make `AsyncWorker` context aware 066ba21a6fb9e2b5230c9ed3a6fc51f1211736a4
+  - Feature: add `Callback` overload to `Nan::Call` 5328daf66e202658c1dc0d916c3aaba99b3cc606
+  - Bugfix: fix warning: suggest parentheses around `&&` within `||` b2bb63d68b8ae623a526b542764e1ac82319cb2c
+  - Bugfix: Fix compilation on io.js 3 d06114dba0a522fb436f0c5f47b994210968cd7b
+
+### 2.8.0 Nov 15 2017
+
+  - Deprecation: Deprecate `Nan::ForceSet` in favor of `Nan::DefineOwnProperty()` 95cbb976d6fbbba88ba0f86dd188223a8591b4e7
+  - Feature: Add `Nan::AsyncProgressQueueWorker` a976636ecc2ef617d1b061ce4a6edf39923691cb
+  - Feature: Add `Nan::DefineOwnProperty()` 95cbb976d6fbbba88ba0f86dd188223a8591b4e7
+  - Bugfix: Fix compiling on io.js 1 & 2 82705a64503ce60c62e98df5bd02972bba090900
+  - Bugfix: Use DefineOwnProperty instead of ForceSet 95cbb976d6fbbba88ba0f86dd188223a8591b4e7
+
+### 2.7.0 Aug 30 2017
+
+  - Feature: Add `Nan::To<v8::Function>()` overload. b93280670c9f6da42ed4cf6cbf085ffdd87bd65b
+  - Bugfix: Fix ternary in `Nan::MaybeLocal<T>::FromMaybe<S>()`. 79a26f7d362e756a9524e672a82c3d603b542867
+
+### 2.6.2 Apr 12 2017
+
+  - Bugfix: Fix v8::JSON::Parse() deprecation warning. 87f6a3c65815fa062296a994cc863e2fa124867d
+
+### 2.6.1 Apr 6 2017
+
+  - Bugfix: nan_json.h: fix build breakage in Node 6 ac8d47dc3c10bfbf3f15a6b951633120c0ee6d51
+
+### 2.6.0 Apr 6 2017
+
+  - Feature: nan: add support for JSON::Parse & Stringify b533226c629cce70e1932a873bb6f849044a56c5
+
+### 2.5.1 Jan 23 2017
+
+  - Bugfix: Fix disappearing handle for private value 6a80995694f162ef63dbc9948fbefd45d4485aa0
+  - Bugfix: Add missing scopes a93b8bae6bc7d32a170db6e89228b7f60ee57112
+  - Bugfix: Use string::data instead of string::front in NewOneByteString d5f920371e67e1f3b268295daee6e83af86b6e50
+
+### 2.5.0 Dec 21 2016
+
+  - Feature: Support Private accessors a86255cb357e8ad8ccbf1f6a4a901c921e39a178
+  - Bugfix: Abort in delete operators that shouldn't be called 0fe38215ff8581703967dfd26c12793feb960018
+
+### 2.4.0 Jul 10 2016
+
+  - Feature: Rewrite Callback to add Callback::Reset c4cf44d61f8275cd5f7b0c911d7a806d4004f649
+  - Feature: AsyncProgressWorker: add template types for .send 1242c9a11a7ed481c8f08ec06316385cacc513d0
+  - Bugfix: Add constness to old Persistent comparison operators bd43cb9982c7639605d60fd073efe8cae165d9b2
+
+### 2.3.5 May 31 2016
+
+  - Bugfix: Replace NAN_INLINE with 'inline' keyword. 71819d8725f822990f439479c9aba3b240804909
+
+### 2.3.4 May 31 2016
+
+  - Bugfix: Remove V8 deprecation warnings 0592fb0a47f3a1c7763087ebea8e1138829f24f9
+  - Bugfix: Fix new versions not to use WeakCallbackInfo::IsFirstPass 615c19d9e03d4be2049c10db0151edbc3b229246
+  - Bugfix: Make ObjectWrap::handle() const d19af99595587fe7a26bd850af6595c2a7145afc
+  - Bugfix: Fix compilation errors related to 0592fb0a47f3a1c7763087ebea8e1138829f24f9 e9191c525b94f652718325e28610a1adcf90fed8
+
+### 2.3.3 May 4 2016
+
+  - Bugfix: Refactor SetMethod() to deal with v8::Templates (#566) b9083cf6d5de6ebe6bcb49c7502fbb7c0d9ddda8
+
+### 2.3.2 Apr 27 2016
+
+  - Bugfix: Fix compilation on outdated versions due to Handle removal f8b7c875d04d425a41dfd4f3f8345bc3a11e6c52
+
+### 2.3.1 Apr 27 2016
+
+  - Bugfix: Don't use deprecated v8::Template::Set() in SetMethod a90951e9ea70fa1b3836af4b925322919159100e
+
+### 2.3.0 Apr 27 2016
+
+  - Feature: added Signal() for invoking async callbacks without sending data from AsyncProgressWorker d8adba45f20e077d00561b20199133620c990b38
+  - Bugfix: Don't use deprecated v8::Template::Set() 00dacf0a4b86027415867fa7f1059acc499dcece
+
+### 2.2.1 Mar 29 2016
+
+  - Bugfix: Use NewFromUnsigned in ReturnValue<T>::Set(uint32_t i) for pre_12 3a18f9bdce29826e0e4c217854bc476918241a58
+  - Performance: Remove unneeeded nullptr checks b715ef44887931c94f0d1605b3b1a4156eebece9
+
+### 2.2.0 Jan 9 2016
+
+  - Feature: Add Function::Call wrapper 4c157474dacf284d125c324177b45aa5dabc08c6
+  - Feature: Rename GC*logueCallback to GCCallback for > 4.0 3603435109f981606d300eb88004ca101283acec
+  - Bugfix: Fix Global::Pass for old versions 367e82a60fbaa52716232cc89db1cc3f685d77d9
+  - Bugfix: Remove weird MaybeLocal wrapping of what already is a MaybeLocal 23b4590db10c2ba66aee2338aebe9751c4cb190b
+
+### 2.1.0 Oct 8 2015
+
+  - Deprecation: Deprecate NanErrnoException in favor of ErrnoException 0af1ca4cf8b3f0f65ed31bc63a663ab3319da55c
+  - Feature: added helper class for accessing contents of typedarrays 17b51294c801e534479d5463697a73462d0ca555
+  - Feature: [Maybe types] Add MakeMaybe(...) 48d7b53d9702b0c7a060e69ea10fea8fb48d814d
+  - Feature: new: allow utf16 string with length 66ac6e65c8ab9394ef588adfc59131b3b9d8347b
+  - Feature: Introduce SetCallHandler and SetCallAsFunctionHandler 7764a9a115d60ba10dc24d86feb0fbc9b4f75537
+  - Bugfix: Enable creating Locals from Globals under Node 0.10. 9bf9b8b190821af889790fdc18ace57257e4f9ff
+  - Bugfix: Fix issue #462 where PropertyCallbackInfo data is not stored safely. 55f50adedd543098526c7b9f4fffd607d3f9861f
+
+### 2.0.9 Sep 8 2015
+
+  - Bugfix: EscapableHandleScope in Nan::NewBuffer for Node 0.8 and 0.10 b1654d7
+
+### 2.0.8 Aug 28 2015
+
+  - Work around duplicate linking bug in clang 11902da
+
+### 2.0.7 Aug 26 2015
+
+  - Build: Repackage
+
+### 2.0.6 Aug 26 2015
+
+  - Bugfix: Properly handle null callback in FunctionTemplate factory 6e99cb1
+  - Bugfix: Remove unused static std::map instances 525bddc
+  - Bugfix: Make better use of maybe versions of APIs bfba85b
+  - Bugfix: Fix shadowing issues with handle in ObjectWrap 0a9072d
+
+### 2.0.5 Aug 10 2015
+
+  - Bugfix: Reimplement weak callback in ObjectWrap 98d38c1
+  - Bugfix: Make sure callback classes are not assignable, copyable or movable 81f9b1d
+
+### 2.0.4 Aug 6 2015
+
+  - Build: Repackage
+
+### 2.0.3 Aug 6 2015
+
+  - Bugfix: Don't use clang++ / g++ syntax extension. 231450e
+
+### 2.0.2 Aug 6 2015
+
+  - Build: Repackage
+
+### 2.0.1 Aug 6 2015
+
+  - Bugfix: Add workaround for missing REPLACE_INVALID_UTF8 60d6687
+  - Bugfix: Reimplement ObjectWrap from scratch to prevent memory leaks 6484601
+  - Bugfix: Fix Persistent leak in FunctionCallbackInfo and PropertyCallbackInfo 641ef5f
+  - Bugfix: Add missing overload for Nan::NewInstance that takes argc/argv 29450ed
+
+### 2.0.0 Jul 31 2015
+
+  - Change: Renamed identifiers with leading underscores	b5932b4
+  - Change: Replaced NanObjectWrapHandle with class NanObjectWrap	464f1e1
+  - Change: Replace NanScope and NanEscpableScope macros with classes	47751c4
+  - Change: Rename NanNewBufferHandle to NanNewBuffer	6745f99
+  - Change: Rename NanBufferUse to NanNewBuffer	3e8b0a5
+  - Change: Rename NanNewBuffer to NanCopyBuffer	d6af78d
+  - Change: Remove Nan prefix from all names	72d1f67
+  - Change: Update Buffer API for new upstream changes	d5d3291
+  - Change: Rename Scope and EscapableScope to HandleScope and EscapableHandleScope	21a7a6a
+  - Change: Get rid of Handles	 e6c0daf
+  - Feature: Support io.js 3 with V8 4.4
+  - Feature: Introduce NanPersistent	7fed696
+  - Feature: Introduce NanGlobal	4408da1
+  - Feature: Added NanTryCatch	10f1ca4
+  - Feature: Update for V8 v4.3	4b6404a
+  - Feature: Introduce NanNewOneByteString	c543d32
+  - Feature: Introduce namespace Nan	67ed1b1
+  - Removal: Remove NanLocker and NanUnlocker	dd6e401
+  - Removal: Remove string converters, except NanUtf8String, which now follows the node implementation b5d00a9
+  - Removal: Remove NanReturn* macros	d90a25c
+  - Removal: Remove HasInstance	e8f84fe
+
+
+### 1.9.0 Jul 31 2015
+
+  - Feature: Added `NanFatalException` 81d4a2c
+  - Feature: Added more error types 4265f06
+  - Feature: Added dereference and function call operators to NanCallback c4b2ed0
+  - Feature: Added indexed GetFromPersistent and SaveToPersistent edd510c
+  - Feature: Added more overloads of SaveToPersistent and GetFromPersistent 8b1cef6
+  - Feature: Added NanErrnoException dd87d9e
+  - Correctness: Prevent assign, copy, and move for classes that do not support it 1f55c59, 4b808cb, c96d9b2, fba4a29, 3357130
+  - Deprecation: Deprecate `NanGetPointerSafe` and `NanSetPointerSafe` 81d4a2c
+  - Deprecation: Deprecate `NanBooleanOptionValue` and `NanUInt32OptionValue` 0ad254b
+
+### 1.8.4 Apr 26 2015
+
+  - Build: Repackage
+
+### 1.8.3 Apr 26 2015
+
+  - Bugfix: Include missing header 1af8648
+
+### 1.8.2 Apr 23 2015
+
+  - Build: Repackage
+
+### 1.8.1 Apr 23 2015
+
+  - Bugfix: NanObjectWrapHandle should take a pointer 155f1d3
+
+### 1.8.0 Apr 23 2015
+
+  - Feature: Allow primitives with NanReturnValue 2e4475e
+  - Feature: Added comparison operators to NanCallback 55b075e
+  - Feature: Backport thread local storage 15bb7fa
+  - Removal: Remove support for signatures with arguments 8a2069d
+  - Correcteness: Replaced NanObjectWrapHandle macro with function 0bc6d59
+
+### 1.7.0 Feb 28 2015
+
+  - Feature: Made NanCallback::Call accept optional target 8d54da7
+  - Feature: Support atom-shell 0.21 0b7f1bb
+
+### 1.6.2 Feb 6 2015
+
+  - Bugfix: NanEncode: fix argument type for node::Encode on io.js 2be8639
+
+### 1.6.1 Jan 23 2015
+
+  - Build: version bump
+
+### 1.5.3 Jan 23 2015
+
+  - Build: repackage
+
+### 1.6.0 Jan 23 2015
+
+ - Deprecated `NanNewContextHandle` in favor of `NanNew<Context>` 49259af
+ - Support utility functions moved in newer v8 versions (Node 0.11.15, io.js 1.0) a0aa179
+ - Added `NanEncode`, `NanDecodeBytes` and `NanDecodeWrite` 75e6fb9
+
+### 1.5.2 Jan 23 2015
+
+  - Bugfix: Fix non-inline definition build error with clang++ 21d96a1, 60fadd4
+  - Bugfix: Readded missing String constructors 18d828f
+  - Bugfix: Add overload handling NanNew<FunctionTemplate>(..) 5ef813b
+  - Bugfix: Fix uv_work_cb versioning 997e4ae
+  - Bugfix: Add function factory and test 4eca89c
+  - Bugfix: Add object template factory and test cdcb951
+  - Correctness: Lifted an io.js related typedef c9490be
+  - Correctness: Make explicit downcasts of String lengths 00074e6
+  - Windows: Limit the scope of disabled warning C4530 83d7deb
+
+### 1.5.1 Jan 15 2015
+
+  - Build: version bump
+
+### 1.4.3 Jan 15 2015
+
+  - Build: version bump
+
+### 1.4.2 Jan 15 2015
+
+  - Feature: Support io.js 0dbc5e8
+
+### 1.5.0 Jan 14 2015
+
+ - Feature: Support io.js b003843
+ - Correctness: Improved NanNew internals 9cd4f6a
+ - Feature: Implement progress to NanAsyncWorker 8d6a160
+
+### 1.4.1 Nov 8 2014
+
+ - Bugfix: Handle DEBUG definition correctly
+ - Bugfix: Accept int as Boolean
+
+### 1.4.0 Nov 1 2014
+
+ - Feature: Added NAN_GC_CALLBACK 6a5c245
+ - Performance: Removed unnecessary local handle creation 18a7243, 41fe2f8
+ - Correctness: Added constness to references in NanHasInstance 02c61cd
+ - Warnings: Fixed spurious warnings from -Wundef and -Wshadow, 541b122, 99d8cb6
+ - Windoze: Shut Visual Studio up when compiling 8d558c1
+ - License: Switch to plain MIT from custom hacked MIT license 11de983
+ - Build: Added test target to Makefile e232e46
+ - Performance: Removed superfluous scope in NanAsyncWorker f4b7821
+ - Sugar/Feature: Added NanReturnThis() and NanReturnHolder() shorthands 237a5ff, d697208
+ - Feature: Added suitable overload of NanNew for v8::Integer::NewFromUnsigned b27b450
+
+### 1.3.0 Aug 2 2014
+
+ - Added NanNew<v8::String, std::string>(std::string)
+ - Added NanNew<v8::String, std::string&>(std::string&)
+ - Added NanAsciiString helper class
+ - Added NanUtf8String helper class
+ - Added NanUcs2String helper class
+ - Deprecated NanRawString()
+ - Deprecated NanCString()
+ - Added NanGetIsolateData(v8::Isolate *isolate)
+ - Added NanMakeCallback(v8::Handle<v8::Object> target, v8::Handle<v8::Function> func, int argc, v8::Handle<v8::Value>* argv)
+ - Added NanMakeCallback(v8::Handle<v8::Object> target, v8::Handle<v8::String> symbol, int argc, v8::Handle<v8::Value>* argv)
+ - Added NanMakeCallback(v8::Handle<v8::Object> target, const char* method, int argc, v8::Handle<v8::Value>* argv)
+ - Added NanSetTemplate(v8::Handle<v8::Template> templ, v8::Handle<v8::String> name , v8::Handle<v8::Data> value, v8::PropertyAttribute attributes)
+ - Added NanSetPrototypeTemplate(v8::Local<v8::FunctionTemplate> templ, v8::Handle<v8::String> name, v8::Handle<v8::Data> value, v8::PropertyAttribute attributes)
+ - Added NanSetInstanceTemplate(v8::Local<v8::FunctionTemplate> templ, const char *name, v8::Handle<v8::Data> value)
+ - Added NanSetInstanceTemplate(v8::Local<v8::FunctionTemplate> templ, v8::Handle<v8::String> name, v8::Handle<v8::Data> value, v8::PropertyAttribute attributes)
+
+### 1.2.0 Jun 5 2014
+
+ - Add NanSetPrototypeTemplate
+ - Changed NAN_WEAK_CALLBACK internals, switched _NanWeakCallbackData to class,
+     introduced _NanWeakCallbackDispatcher
+ - Removed -Wno-unused-local-typedefs from test builds
+ - Made test builds Windows compatible ('Sleep()')
+
+### 1.1.2 May 28 2014
+
+ - Release to fix more stuff-ups in 1.1.1
+
+### 1.1.1 May 28 2014
+
+ - Release to fix version mismatch in nan.h and lack of changelog entry for 1.1.0
+
+### 1.1.0 May 25 2014
+
+ - Remove nan_isolate, use v8::Isolate::GetCurrent() internally instead
+ - Additional explicit overloads for NanNew(): (char*,int), (uint8_t*[,int]),
+     (uint16_t*[,int), double, int, unsigned int, bool, v8::String::ExternalStringResource*,
+     v8::String::ExternalAsciiStringResource*
+ - Deprecate NanSymbol()
+ - Added SetErrorMessage() and ErrorMessage() to NanAsyncWorker
+
+### 1.0.0 May 4 2014
+
+ - Heavy API changes for V8 3.25 / Node 0.11.13
+ - Use cpplint.py
+ - Removed NanInitPersistent
+ - Removed NanPersistentToLocal
+ - Removed NanFromV8String
+ - Removed NanMakeWeak
+ - Removed NanNewLocal
+ - Removed NAN_WEAK_CALLBACK_OBJECT
+ - Removed NAN_WEAK_CALLBACK_DATA
+ - Introduce NanNew, replaces NanNewLocal, NanPersistentToLocal, adds many overloaded typed versions
+ - Introduce NanUndefined, NanNull, NanTrue and NanFalse
+ - Introduce NanEscapableScope and NanEscapeScope
+ - Introduce NanMakeWeakPersistent (requires a special callback to work on both old and new node)
+ - Introduce NanMakeCallback for node::MakeCallback
+ - Introduce NanSetTemplate
+ - Introduce NanGetCurrentContext
+ - Introduce NanCompileScript and NanRunScript
+ - Introduce NanAdjustExternalMemory
+ - Introduce NanAddGCEpilogueCallback, NanAddGCPrologueCallback, NanRemoveGCEpilogueCallback, NanRemoveGCPrologueCallback
+ - Introduce NanGetHeapStatistics
+ - Rename NanAsyncWorker#SavePersistent() to SaveToPersistent()
+
+### 0.8.0 Jan 9 2014
+
+ - NanDispose -> NanDisposePersistent, deprecate NanDispose
+ - Extract _NAN_*_RETURN_TYPE, pull up NAN_*()
+
+### 0.7.1 Jan 9 2014
+
+ - Fixes to work against debug builds of Node
+ - Safer NanPersistentToLocal (avoid reinterpret_cast)
+ - Speed up common NanRawString case by only extracting flattened string when necessary
+
+### 0.7.0 Dec 17 2013
+
+ - New no-arg form of NanCallback() constructor.
+ - NanCallback#Call takes Handle rather than Local
+ - Removed deprecated NanCallback#Run method, use NanCallback#Call instead
+ - Split off _NAN_*_ARGS_TYPE from _NAN_*_ARGS
+ - Restore (unofficial) Node 0.6 compatibility at NanCallback#Call()
+ - Introduce NanRawString() for char* (or appropriate void*) from v8::String
+     (replacement for NanFromV8String)
+ - Introduce NanCString() for null-terminated char* from v8::String
+
+### 0.6.0 Nov 21 2013
+
+ - Introduce NanNewLocal<T>(v8::Handle<T> value) for use in place of
+     v8::Local<T>::New(...) since v8 started requiring isolate in Node 0.11.9
+
+### 0.5.2 Nov 16 2013
+
+ - Convert SavePersistent and GetFromPersistent in NanAsyncWorker from protected and public
+
+### 0.5.1 Nov 12 2013
+
+ - Use node::MakeCallback() instead of direct v8::Function::Call()
+
+### 0.5.0 Nov 11 2013
+
+ - Added @TooTallNate as collaborator
+ - New, much simpler, "include_dirs" for binding.gyp
+ - Added full range of NAN_INDEX_* macros to match NAN_PROPERTY_* macros
+
+### 0.4.4 Nov 2 2013
+
+ - Isolate argument from v8::Persistent::MakeWeak removed for 0.11.8+
+
+### 0.4.3 Nov 2 2013
+
+ - Include node_object_wrap.h, removed from node.h for Node 0.11.8.
+
+### 0.4.2 Nov 2 2013
+
+ - Handle deprecation of v8::Persistent::Dispose(v8::Isolate* isolate)) for
+     Node 0.11.8 release.
+
+### 0.4.1 Sep 16 2013
+
+ - Added explicit `#include <uv.h>` as it was removed from node.h for v0.11.8
+
+### 0.4.0 Sep 2 2013
+
+ - Added NAN_INLINE and NAN_DEPRECATED and made use of them
+ - Added NanError, NanTypeError and NanRangeError
+ - Cleaned up code
+
+### 0.3.2 Aug 30 2013
+
+ - Fix missing scope declaration in GetFromPersistent() and SaveToPersistent
+     in NanAsyncWorker
+
+### 0.3.1 Aug 20 2013
+
+ - fix "not all control paths return a value" compile warning on some platforms
+
+### 0.3.0 Aug 19 2013
+
+ - Made NAN work with NPM
+ - Lots of fixes to NanFromV8String, pulling in features from new Node core
+ - Changed node::encoding to Nan::Encoding in NanFromV8String to unify the API
+ - Added optional error number argument for NanThrowError()
+ - Added NanInitPersistent()
+ - Added NanReturnNull() and NanReturnEmptyString()
+ - Added NanLocker and NanUnlocker
+ - Added missing scopes
+ - Made sure to clear disposed Persistent handles
+ - Changed NanAsyncWorker to allocate error messages on the heap
+ - Changed NanThrowError(Local<Value>) to NanThrowError(Handle<Value>)
+ - Fixed leak in NanAsyncWorker when errmsg is used
+
+### 0.2.2 Aug 5 2013
+
+ - Fixed usage of undefined variable with node::BASE64 in NanFromV8String()
+
+### 0.2.1 Aug 5 2013
+
+ - Fixed 0.8 breakage, node::BUFFER encoding type not available in 0.8 for
+     NanFromV8String()
+
+### 0.2.0 Aug 5 2013
+
+ - Added NAN_PROPERTY_GETTER, NAN_PROPERTY_SETTER, NAN_PROPERTY_ENUMERATOR,
+     NAN_PROPERTY_DELETER, NAN_PROPERTY_QUERY
+ - Extracted _NAN_METHOD_ARGS, _NAN_GETTER_ARGS, _NAN_SETTER_ARGS,
+     _NAN_PROPERTY_GETTER_ARGS, _NAN_PROPERTY_SETTER_ARGS,
+     _NAN_PROPERTY_ENUMERATOR_ARGS, _NAN_PROPERTY_DELETER_ARGS,
+     _NAN_PROPERTY_QUERY_ARGS
+ - Added NanGetInternalFieldPointer, NanSetInternalFieldPointer
+ - Added NAN_WEAK_CALLBACK, NAN_WEAK_CALLBACK_OBJECT,
+     NAN_WEAK_CALLBACK_DATA, NanMakeWeak
+ - Renamed THROW_ERROR to _NAN_THROW_ERROR
+ - Added NanNewBufferHandle(char*, size_t, node::smalloc::FreeCallback, void*)
+ - Added NanBufferUse(char*, uint32_t)
+ - Added NanNewContextHandle(v8::ExtensionConfiguration*,
+       v8::Handle<v8::ObjectTemplate>, v8::Handle<v8::Value>)
+ - Fixed broken NanCallback#GetFunction()
+ - Added optional encoding and size arguments to NanFromV8String()
+ - Added NanGetPointerSafe() and NanSetPointerSafe()
+ - Added initial test suite (to be expanded)
+ - Allow NanUInt32OptionValue to convert any Number object
+
+### 0.1.0 Jul 21 2013
+
+ - Added `NAN_GETTER`, `NAN_SETTER`
+ - Added `NanThrowError` with single Local<Value> argument
+ - Added `NanNewBufferHandle` with single uint32_t argument
+ - Added `NanHasInstance(Persistent<FunctionTemplate>&, Handle<Value>)`
+ - Added `Local<Function> NanCallback#GetFunction()`
+ - Added `NanCallback#Call(int, Local<Value>[])`
+ - Deprecated `NanCallback#Run(int, Local<Value>[])` in favour of Call
diff --git a/node_modules/nan/LICENSE.md b/node_modules/nan/LICENSE.md
new file mode 100644
index 0000000..dddd13d
--- /dev/null
+++ b/node_modules/nan/LICENSE.md
@@ -0,0 +1,13 @@
+The MIT License (MIT)
+=====================
+
+Copyright (c) 2018 NAN contributors
+-----------------------------------
+
+*NAN contributors listed at <https://github.com/nodejs/nan#contributors>*
+
+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/nan/README.md b/node_modules/nan/README.md
new file mode 100644
index 0000000..f671ef1
--- /dev/null
+++ b/node_modules/nan/README.md
@@ -0,0 +1,455 @@
+Native Abstractions for Node.js
+===============================
+
+**A header file filled with macro and utility goodness for making add-on development for Node.js easier across versions 0.8, 0.10, 0.12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 and 14.**
+
+***Current version: 2.14.2***
+
+*(See [CHANGELOG.md](https://github.com/nodejs/nan/blob/master/CHANGELOG.md) for complete ChangeLog)*
+
+[![NPM](https://nodei.co/npm/nan.png?downloads=true&downloadRank=true)](https://nodei.co/npm/nan/) [![NPM](https://nodei.co/npm-dl/nan.png?months=6&height=3)](https://nodei.co/npm/nan/)
+
+[![Build Status](https://api.travis-ci.org/nodejs/nan.svg?branch=master)](https://travis-ci.org/nodejs/nan)
+[![Build status](https://ci.appveyor.com/api/projects/status/kh73pbm9dsju7fgh)](https://ci.appveyor.com/project/RodVagg/nan)
+
+Thanks to the crazy changes in V8 (and some in Node core), keeping native addons compiling happily across versions, particularly 0.10 to 0.12 to 4.0, is a minor nightmare. The goal of this project is to store all logic necessary to develop native Node.js addons without having to inspect `NODE_MODULE_VERSION` and get yourself into a macro-tangle.
+
+This project also contains some helper utilities that make addon development a bit more pleasant.
+
+ * **[News & Updates](#news)**
+ * **[Usage](#usage)**
+ * **[Example](#example)**
+ * **[API](#api)**
+ * **[Tests](#tests)**
+ * **[Known issues](#issues)**
+ * **[Governance & Contributing](#governance)**
+
+<a name="news"></a>
+
+## News & Updates
+
+<a name="usage"></a>
+
+## Usage
+
+Simply add **NAN** as a dependency in the *package.json* of your Node addon:
+
+``` bash
+$ npm install --save nan
+```
+
+Pull in the path to **NAN** in your *binding.gyp* so that you can use `#include <nan.h>` in your *.cpp* files:
+
+``` python
+"include_dirs" : [
+    "<!(node -e \"require('nan')\")"
+]
+```
+
+This works like a `-I<path-to-NAN>` when compiling your addon.
+
+<a name="example"></a>
+
+## Example
+
+Just getting started with Nan? Take a look at the **[Node Add-on Examples](https://github.com/nodejs/node-addon-examples)**.
+
+Refer to a [quick-start **Nan** Boilerplate](https://github.com/fcanas/node-native-boilerplate) for a ready-to-go project that utilizes basic Nan functionality.
+
+For a simpler example, see the **[async pi estimation example](https://github.com/nodejs/nan/tree/master/examples/async_pi_estimate)** in the examples directory for full code and an explanation of what this Monte Carlo Pi estimation example does. Below are just some parts of the full example that illustrate the use of **NAN**.
+
+Yet another example is **[nan-example-eol](https://github.com/CodeCharmLtd/nan-example-eol)**. It shows newline detection implemented as a native addon.
+
+Also take a look at our comprehensive **[C++ test suite](https://github.com/nodejs/nan/tree/master/test/cpp)** which has a plethora of code snippets for your pasting pleasure.
+
+<a name="api"></a>
+
+## API
+
+Additional to the NAN documentation below, please consult:
+
+* [The V8 Getting Started * Guide](https://v8.dev/docs/embed)
+* [V8 API Documentation](https://v8docs.nodesource.com/)
+* [Node Add-on Documentation](https://nodejs.org/api/addons.html)
+
+<!-- START API -->
+
+### JavaScript-accessible methods
+
+A _template_ is a blueprint for JavaScript functions and objects in a context. You can use a template to wrap C++ functions and data structures within JavaScript objects so that they can be manipulated from JavaScript. See the V8 Embedders Guide section on [Templates](https://github.com/v8/v8/wiki/Embedder%27s-Guide#templates) for further information.
+
+In order to expose functionality to JavaScript via a template, you must provide it to V8 in a form that it understands. Across the versions of V8 supported by NAN, JavaScript-accessible method signatures vary widely, NAN fully abstracts method declaration and provides you with an interface that is similar to the most recent V8 API but is backward-compatible with older versions that still use the now-deceased `v8::Argument` type.
+
+* **Method argument types**
+ - <a href="doc/methods.md#api_nan_function_callback_info"><b><code>Nan::FunctionCallbackInfo</code></b></a>
+ - <a href="doc/methods.md#api_nan_property_callback_info"><b><code>Nan::PropertyCallbackInfo</code></b></a>
+ - <a href="doc/methods.md#api_nan_return_value"><b><code>Nan::ReturnValue</code></b></a>
+* **Method declarations**
+ - <a href="doc/methods.md#api_nan_method"><b>Method declaration</b></a>
+ - <a href="doc/methods.md#api_nan_getter"><b>Getter declaration</b></a>
+ - <a href="doc/methods.md#api_nan_setter"><b>Setter declaration</b></a>
+ - <a href="doc/methods.md#api_nan_property_getter"><b>Property getter declaration</b></a>
+ - <a href="doc/methods.md#api_nan_property_setter"><b>Property setter declaration</b></a>
+ - <a href="doc/methods.md#api_nan_property_enumerator"><b>Property enumerator declaration</b></a>
+ - <a href="doc/methods.md#api_nan_property_deleter"><b>Property deleter declaration</b></a>
+ - <a href="doc/methods.md#api_nan_property_query"><b>Property query declaration</b></a>
+ - <a href="doc/methods.md#api_nan_index_getter"><b>Index getter declaration</b></a>
+ - <a href="doc/methods.md#api_nan_index_setter"><b>Index setter declaration</b></a>
+ - <a href="doc/methods.md#api_nan_index_enumerator"><b>Index enumerator declaration</b></a>
+ - <a href="doc/methods.md#api_nan_index_deleter"><b>Index deleter declaration</b></a>
+ - <a href="doc/methods.md#api_nan_index_query"><b>Index query declaration</b></a>
+* Method and template helpers
+ - <a href="doc/methods.md#api_nan_set_method"><b><code>Nan::SetMethod()</code></b></a>
+ - <a href="doc/methods.md#api_nan_set_prototype_method"><b><code>Nan::SetPrototypeMethod()</code></b></a>
+ - <a href="doc/methods.md#api_nan_set_accessor"><b><code>Nan::SetAccessor()</code></b></a>
+ - <a href="doc/methods.md#api_nan_set_named_property_handler"><b><code>Nan::SetNamedPropertyHandler()</code></b></a>
+ - <a href="doc/methods.md#api_nan_set_indexed_property_handler"><b><code>Nan::SetIndexedPropertyHandler()</code></b></a>
+ - <a href="doc/methods.md#api_nan_set_template"><b><code>Nan::SetTemplate()</code></b></a>
+ - <a href="doc/methods.md#api_nan_set_prototype_template"><b><code>Nan::SetPrototypeTemplate()</code></b></a>
+ - <a href="doc/methods.md#api_nan_set_instance_template"><b><code>Nan::SetInstanceTemplate()</code></b></a>
+ - <a href="doc/methods.md#api_nan_set_call_handler"><b><code>Nan::SetCallHandler()</code></b></a>
+ - <a href="doc/methods.md#api_nan_set_call_as_function_handler"><b><code>Nan::SetCallAsFunctionHandler()</code></b></a>
+
+### Scopes
+
+A _local handle_ is a pointer to an object. All V8 objects are accessed using handles, they are necessary because of the way the V8 garbage collector works.
+
+A handle scope can be thought of as a container for any number of handles. When you've finished with your handles, instead of deleting each one individually you can simply delete their scope.
+
+The creation of `HandleScope` objects is different across the supported versions of V8. Therefore, NAN provides its own implementations that can be used safely across these.
+
+ - <a href="doc/scopes.md#api_nan_handle_scope"><b><code>Nan::HandleScope</code></b></a>
+ - <a href="doc/scopes.md#api_nan_escapable_handle_scope"><b><code>Nan::EscapableHandleScope</code></b></a>
+
+Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://github.com/v8/v8/wiki/Embedder%27s%20Guide#handles-and-garbage-collection).
+
+### Persistent references
+
+An object reference that is independent of any `HandleScope` is a _persistent_ reference. Where a `Local` handle only lives as long as the `HandleScope` in which it was allocated, a `Persistent` handle remains valid until it is explicitly disposed.
+
+Due to the evolution of the V8 API, it is necessary for NAN to provide a wrapper implementation of the `Persistent` classes to supply compatibility across the V8 versions supported.
+
+ - <a href="doc/persistent.md#api_nan_persistent_base"><b><code>Nan::PersistentBase & v8::PersistentBase</code></b></a>
+ - <a href="doc/persistent.md#api_nan_non_copyable_persistent_traits"><b><code>Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits</code></b></a>
+ - <a href="doc/persistent.md#api_nan_copyable_persistent_traits"><b><code>Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits</code></b></a>
+ - <a href="doc/persistent.md#api_nan_persistent"><b><code>Nan::Persistent</code></b></a>
+ - <a href="doc/persistent.md#api_nan_global"><b><code>Nan::Global</code></b></a>
+ - <a href="doc/persistent.md#api_nan_weak_callback_info"><b><code>Nan::WeakCallbackInfo</code></b></a>
+ - <a href="doc/persistent.md#api_nan_weak_callback_type"><b><code>Nan::WeakCallbackType</code></b></a>
+
+Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://developers.google.com/v8/embed#handles).
+
+### New
+
+NAN provides a `Nan::New()` helper for the creation of new JavaScript objects in a way that's compatible across the supported versions of V8.
+
+ - <a href="doc/new.md#api_nan_new"><b><code>Nan::New()</code></b></a>
+ - <a href="doc/new.md#api_nan_undefined"><b><code>Nan::Undefined()</code></b></a>
+ - <a href="doc/new.md#api_nan_null"><b><code>Nan::Null()</code></b></a>
+ - <a href="doc/new.md#api_nan_true"><b><code>Nan::True()</code></b></a>
+ - <a href="doc/new.md#api_nan_false"><b><code>Nan::False()</code></b></a>
+ - <a href="doc/new.md#api_nan_empty_string"><b><code>Nan::EmptyString()</code></b></a>
+
+
+### Converters
+
+NAN contains functions that convert `v8::Value`s to other `v8::Value` types and native types. Since type conversion is not guaranteed to succeed, they return `Nan::Maybe` types. These converters can be used in place of `value->ToX()` and `value->XValue()` (where `X` is one of the types, e.g. `Boolean`) in a way that provides a consistent interface across V8 versions. Newer versions of V8 use the new `v8::Maybe` and `v8::MaybeLocal` types for these conversions, older versions don't have this functionality so it is provided by NAN.
+
+ - <a href="doc/converters.md#api_nan_to"><b><code>Nan::To()</code></b></a>
+
+### Maybe Types
+
+The `Nan::MaybeLocal` and `Nan::Maybe` types are monads that encapsulate `v8::Local` handles that _may be empty_.
+
+* **Maybe Types**
+  - <a href="doc/maybe_types.md#api_nan_maybe_local"><b><code>Nan::MaybeLocal</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_maybe"><b><code>Nan::Maybe</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_nothing"><b><code>Nan::Nothing</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_just"><b><code>Nan::Just</code></b></a>
+* **Maybe Helpers**
+  - <a href="doc/maybe_types.md#api_nan_call"><b><code>Nan::Call()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_to_detail_string"><b><code>Nan::ToDetailString()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_to_array_index"><b><code>Nan::ToArrayIndex()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_equals"><b><code>Nan::Equals()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_new_instance"><b><code>Nan::NewInstance()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_get_function"><b><code>Nan::GetFunction()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_set"><b><code>Nan::Set()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_define_own_property"><b><code>Nan::DefineOwnProperty()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_force_set"><del><b><code>Nan::ForceSet()</code></b></del></a>
+  - <a href="doc/maybe_types.md#api_nan_get"><b><code>Nan::Get()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_get_property_attribute"><b><code>Nan::GetPropertyAttributes()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_has"><b><code>Nan::Has()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_delete"><b><code>Nan::Delete()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_get_property_names"><b><code>Nan::GetPropertyNames()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_get_own_property_names"><b><code>Nan::GetOwnPropertyNames()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_set_prototype"><b><code>Nan::SetPrototype()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_object_proto_to_string"><b><code>Nan::ObjectProtoToString()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_has_own_property"><b><code>Nan::HasOwnProperty()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_has_real_named_property"><b><code>Nan::HasRealNamedProperty()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_has_real_indexed_property"><b><code>Nan::HasRealIndexedProperty()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_has_real_named_callback_property"><b><code>Nan::HasRealNamedCallbackProperty()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_get_real_named_property_in_prototype_chain"><b><code>Nan::GetRealNamedPropertyInPrototypeChain()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_get_real_named_property"><b><code>Nan::GetRealNamedProperty()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_call_as_function"><b><code>Nan::CallAsFunction()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_call_as_constructor"><b><code>Nan::CallAsConstructor()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_get_source_line"><b><code>Nan::GetSourceLine()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_get_line_number"><b><code>Nan::GetLineNumber()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_get_start_column"><b><code>Nan::GetStartColumn()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_get_end_column"><b><code>Nan::GetEndColumn()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_clone_element_at"><b><code>Nan::CloneElementAt()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_has_private"><b><code>Nan::HasPrivate()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_get_private"><b><code>Nan::GetPrivate()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_set_private"><b><code>Nan::SetPrivate()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_delete_private"><b><code>Nan::DeletePrivate()</code></b></a>
+  - <a href="doc/maybe_types.md#api_nan_make_maybe"><b><code>Nan::MakeMaybe()</code></b></a>
+
+### Script
+
+NAN provides a `v8::Script` helpers as the API has changed over the supported versions of V8.
+
+ - <a href="doc/script.md#api_nan_compile_script"><b><code>Nan::CompileScript()</code></b></a>
+ - <a href="doc/script.md#api_nan_run_script"><b><code>Nan::RunScript()</code></b></a>
+
+
+### JSON
+
+The _JSON_ object provides the C++ versions of the methods offered by the `JSON` object in javascript. V8 exposes these methods via the `v8::JSON` object.
+
+ - <a href="doc/json.md#api_nan_json_parse"><b><code>Nan::JSON.Parse</code></b></a>
+ - <a href="doc/json.md#api_nan_json_stringify"><b><code>Nan::JSON.Stringify</code></b></a>
+
+Refer to the V8 JSON object in the [V8 documentation](https://v8docs.nodesource.com/node-8.16/da/d6f/classv8_1_1_j_s_o_n.html) for more information about these methods and their arguments.
+
+### Errors
+
+NAN includes helpers for creating, throwing and catching Errors as much of this functionality varies across the supported versions of V8 and must be abstracted.
+
+Note that an Error object is simply a specialized form of `v8::Value`.
+
+Also consult the V8 Embedders Guide section on [Exceptions](https://developers.google.com/v8/embed#exceptions) for more information.
+
+ - <a href="doc/errors.md#api_nan_error"><b><code>Nan::Error()</code></b></a>
+ - <a href="doc/errors.md#api_nan_range_error"><b><code>Nan::RangeError()</code></b></a>
+ - <a href="doc/errors.md#api_nan_reference_error"><b><code>Nan::ReferenceError()</code></b></a>
+ - <a href="doc/errors.md#api_nan_syntax_error"><b><code>Nan::SyntaxError()</code></b></a>
+ - <a href="doc/errors.md#api_nan_type_error"><b><code>Nan::TypeError()</code></b></a>
+ - <a href="doc/errors.md#api_nan_throw_error"><b><code>Nan::ThrowError()</code></b></a>
+ - <a href="doc/errors.md#api_nan_throw_range_error"><b><code>Nan::ThrowRangeError()</code></b></a>
+ - <a href="doc/errors.md#api_nan_throw_reference_error"><b><code>Nan::ThrowReferenceError()</code></b></a>
+ - <a href="doc/errors.md#api_nan_throw_syntax_error"><b><code>Nan::ThrowSyntaxError()</code></b></a>
+ - <a href="doc/errors.md#api_nan_throw_type_error"><b><code>Nan::ThrowTypeError()</code></b></a>
+ - <a href="doc/errors.md#api_nan_fatal_exception"><b><code>Nan::FatalException()</code></b></a>
+ - <a href="doc/errors.md#api_nan_errno_exception"><b><code>Nan::ErrnoException()</code></b></a>
+ - <a href="doc/errors.md#api_nan_try_catch"><b><code>Nan::TryCatch</code></b></a>
+
+
+### Buffers
+
+NAN's `node::Buffer` helpers exist as the API has changed across supported Node versions. Use these methods to ensure compatibility.
+
+ - <a href="doc/buffers.md#api_nan_new_buffer"><b><code>Nan::NewBuffer()</code></b></a>
+ - <a href="doc/buffers.md#api_nan_copy_buffer"><b><code>Nan::CopyBuffer()</code></b></a>
+ - <a href="doc/buffers.md#api_nan_free_callback"><b><code>Nan::FreeCallback()</code></b></a>
+
+### Nan::Callback
+
+`Nan::Callback` makes it easier to use `v8::Function` handles as callbacks. A class that wraps a `v8::Function` handle, protecting it from garbage collection and making it particularly useful for storage and use across asynchronous execution.
+
+ - <a href="doc/callback.md#api_nan_callback"><b><code>Nan::Callback</code></b></a>
+
+### Asynchronous work helpers
+
+`Nan::AsyncWorker`, `Nan::AsyncProgressWorker` and `Nan::AsyncProgressQueueWorker` are helper classes that make working with asynchronous code easier.
+
+ - <a href="doc/asyncworker.md#api_nan_async_worker"><b><code>Nan::AsyncWorker</code></b></a>
+ - <a href="doc/asyncworker.md#api_nan_async_progress_worker"><b><code>Nan::AsyncProgressWorkerBase &amp; Nan::AsyncProgressWorker</code></b></a>
+ - <a href="doc/asyncworker.md#api_nan_async_progress_queue_worker"><b><code>Nan::AsyncProgressQueueWorker</code></b></a>
+ - <a href="doc/asyncworker.md#api_nan_async_queue_worker"><b><code>Nan::AsyncQueueWorker</code></b></a>
+
+### Strings & Bytes
+
+Miscellaneous string & byte encoding and decoding functionality provided for compatibility across supported versions of V8 and Node. Implemented by NAN to ensure that all encoding types are supported, even for older versions of Node where they are missing.
+
+ - <a href="doc/string_bytes.md#api_nan_encoding"><b><code>Nan::Encoding</code></b></a>
+ - <a href="doc/string_bytes.md#api_nan_encode"><b><code>Nan::Encode()</code></b></a>
+ - <a href="doc/string_bytes.md#api_nan_decode_bytes"><b><code>Nan::DecodeBytes()</code></b></a>
+ - <a href="doc/string_bytes.md#api_nan_decode_write"><b><code>Nan::DecodeWrite()</code></b></a>
+
+
+### Object Wrappers
+
+The `ObjectWrap` class can be used to make wrapped C++ objects and a factory of wrapped objects.
+
+ - <a href="doc/object_wrappers.md#api_nan_object_wrap"><b><code>Nan::ObjectWrap</code></b></a>
+
+
+### V8 internals
+
+The hooks to access V8 internals—including GC and statistics—are different across the supported versions of V8, therefore NAN provides its own hooks that call the appropriate V8 methods.
+
+ - <a href="doc/v8_internals.md#api_nan_gc_callback"><b><code>NAN_GC_CALLBACK()</code></b></a>
+ - <a href="doc/v8_internals.md#api_nan_add_gc_epilogue_callback"><b><code>Nan::AddGCEpilogueCallback()</code></b></a>
+ - <a href="doc/v8_internals.md#api_nan_remove_gc_epilogue_callback"><b><code>Nan::RemoveGCEpilogueCallback()</code></b></a>
+ - <a href="doc/v8_internals.md#api_nan_add_gc_prologue_callback"><b><code>Nan::AddGCPrologueCallback()</code></b></a>
+ - <a href="doc/v8_internals.md#api_nan_remove_gc_prologue_callback"><b><code>Nan::RemoveGCPrologueCallback()</code></b></a>
+ - <a href="doc/v8_internals.md#api_nan_get_heap_statistics"><b><code>Nan::GetHeapStatistics()</code></b></a>
+ - <a href="doc/v8_internals.md#api_nan_set_counter_function"><b><code>Nan::SetCounterFunction()</code></b></a>
+ - <a href="doc/v8_internals.md#api_nan_set_create_histogram_function"><b><code>Nan::SetCreateHistogramFunction()</code></b></a>
+ - <a href="doc/v8_internals.md#api_nan_set_add_histogram_sample_function"><b><code>Nan::SetAddHistogramSampleFunction()</code></b></a>
+ - <a href="doc/v8_internals.md#api_nan_idle_notification"><b><code>Nan::IdleNotification()</code></b></a>
+ - <a href="doc/v8_internals.md#api_nan_low_memory_notification"><b><code>Nan::LowMemoryNotification()</code></b></a>
+ - <a href="doc/v8_internals.md#api_nan_context_disposed_notification"><b><code>Nan::ContextDisposedNotification()</code></b></a>
+ - <a href="doc/v8_internals.md#api_nan_get_internal_field_pointer"><b><code>Nan::GetInternalFieldPointer()</code></b></a>
+ - <a href="doc/v8_internals.md#api_nan_set_internal_field_pointer"><b><code>Nan::SetInternalFieldPointer()</code></b></a>
+ - <a href="doc/v8_internals.md#api_nan_adjust_external_memory"><b><code>Nan::AdjustExternalMemory()</code></b></a>
+
+
+### Miscellaneous V8 Helpers
+
+ - <a href="doc/v8_misc.md#api_nan_utf8_string"><b><code>Nan::Utf8String</code></b></a>
+ - <a href="doc/v8_misc.md#api_nan_get_current_context"><b><code>Nan::GetCurrentContext()</code></b></a>
+ - <a href="doc/v8_misc.md#api_nan_set_isolate_data"><b><code>Nan::SetIsolateData()</code></b></a>
+ - <a href="doc/v8_misc.md#api_nan_get_isolate_data"><b><code>Nan::GetIsolateData()</code></b></a>
+ - <a href="doc/v8_misc.md#api_nan_typedarray_contents"><b><code>Nan::TypedArrayContents</code></b></a>
+
+
+### Miscellaneous Node Helpers
+
+ - <a href="doc/node_misc.md#api_nan_asyncresource"><b><code>Nan::AsyncResource</code></b></a>
+ - <a href="doc/node_misc.md#api_nan_make_callback"><b><code>Nan::MakeCallback()</code></b></a>
+ - <a href="doc/node_misc.md#api_nan_module_init"><b><code>NAN_MODULE_INIT()</code></b></a>
+ - <a href="doc/node_misc.md#api_nan_export"><b><code>Nan::Export()</code></b></a>
+
+<!-- END API -->
+
+
+<a name="tests"></a>
+
+### Tests
+
+To run the NAN tests do:
+
+``` sh
+npm install
+npm run-script rebuild-tests
+npm test
+```
+
+Or just:
+
+``` sh
+npm install
+make test
+```
+
+<a name="issues"></a>
+
+## Known issues
+
+### Compiling against Node.js 0.12 on OSX
+
+With new enough compilers available on OSX, the versions of V8 headers corresponding to Node.js 0.12
+do not compile anymore. The error looks something like:
+
+```
+❯   CXX(target) Release/obj.target/accessors/cpp/accessors.o
+In file included from ../cpp/accessors.cpp:9:
+In file included from ../../nan.h:51:
+In file included from /Users/ofrobots/.node-gyp/0.12.18/include/node/node.h:61:
+/Users/ofrobots/.node-gyp/0.12.18/include/node/v8.h:5800:54: error: 'CreateHandle' is a protected member of 'v8::HandleScope'
+  return Handle<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
+                                        ~~~~~~~~~~~~~^~~~~~~~~~~~
+```
+
+This can be worked around by patching your local versions of v8.h corresponding to Node 0.12 to make
+`v8::Handle` a friend of `v8::HandleScope`. Since neither Node.js not V8 support this release line anymore
+this patch cannot be released by either project in an official release.
+
+For this reason, we do not test against Node.js 0.12 on OSX in this project's CI. If you need to support
+that configuration, you will need to either get an older compiler, or apply a source patch to the version
+of V8 headers as a workaround.
+
+<a name="governance"></a>
+
+## Governance & Contributing
+
+NAN is governed by the [Node.js Addon API Working Group](https://github.com/nodejs/CTC/blob/master/WORKING_GROUPS.md#addon-api)
+
+### Addon API Working Group (WG)
+
+The NAN project is jointly governed by a Working Group which is responsible for high-level guidance of the project.
+
+Members of the WG are also known as Collaborators, there is no distinction between the two, unlike other Node.js projects.
+
+The WG has final authority over this project including:
+
+* Technical direction
+* Project governance and process (including this policy)
+* Contribution policy
+* GitHub repository hosting
+* Maintaining the list of additional Collaborators
+
+For the current list of WG members, see the project [README.md](./README.md#collaborators).
+
+Individuals making significant and valuable contributions are made members of the WG and given commit-access to the project. These individuals are identified by the WG and their addition to the WG is discussed via GitHub and requires unanimous consensus amongst those WG members participating in the discussion with a quorum of 50% of WG members required for acceptance of the vote.
+
+_Note:_ If you make a significant contribution and are not considered for commit-access log an issue or contact a WG member directly.
+
+For the current list of WG members / Collaborators, see the project [README.md](./README.md#collaborators).
+
+### Consensus Seeking Process
+
+The WG follows a [Consensus Seeking](https://en.wikipedia.org/wiki/Consensus-seeking_decision-making) decision making model.
+
+Modifications of the contents of the NAN repository are made on a collaborative basis. Anybody with a GitHub account may propose a modification via pull request and it will be considered by the WG. All pull requests must be reviewed and accepted by a WG member with sufficient expertise who is able to take full responsibility for the change. In the case of pull requests proposed by an existing WG member, an additional WG member is required for sign-off. Consensus should be sought if additional WG members participate and there is disagreement around a particular modification.
+
+If a change proposal cannot reach a consensus, a WG member can call for a vote amongst the members of the WG. Simple majority wins.
+
+<a id="developers-certificate-of-origin"></a>
+
+## Developer's Certificate of Origin 1.1
+
+By making a contribution to this project, I certify that:
+
+* (a) The contribution was created in whole or in part by me and I
+  have the right to submit it under the open source license
+  indicated in the file; or
+
+* (b) The contribution is based upon previous work that, to the best
+  of my knowledge, is covered under an appropriate open source
+  license and I have the right under that license to submit that
+  work with modifications, whether created in whole or in part
+  by me, under the same open source license (unless I am
+  permitted to submit under a different license), as indicated
+  in the file; or
+
+* (c) The contribution was provided directly to me by some other
+  person who certified (a), (b) or (c) and I have not modified
+  it.
+
+* (d) I understand and agree that this project and the contribution
+  are public and that a record of the contribution (including all
+  personal information I submit with it, including my sign-off) is
+  maintained indefinitely and may be redistributed consistent with
+  this project or the open source license(s) involved.
+
+<a name="collaborators"></a>
+
+### WG Members / Collaborators
+
+<table><tbody>
+<tr><th align="left">Rod Vagg</th><td><a href="https://github.com/rvagg">GitHub/rvagg</a></td><td><a href="http://twitter.com/rvagg">Twitter/@rvagg</a></td></tr>
+<tr><th align="left">Benjamin Byholm</th><td><a href="https://github.com/kkoopa/">GitHub/kkoopa</a></td><td>-</td></tr>
+<tr><th align="left">Trevor Norris</th><td><a href="https://github.com/trevnorris">GitHub/trevnorris</a></td><td><a href="http://twitter.com/trevnorris">Twitter/@trevnorris</a></td></tr>
+<tr><th align="left">Nathan Rajlich</th><td><a href="https://github.com/TooTallNate">GitHub/TooTallNate</a></td><td><a href="http://twitter.com/TooTallNate">Twitter/@TooTallNate</a></td></tr>
+<tr><th align="left">Brett Lawson</th><td><a href="https://github.com/brett19">GitHub/brett19</a></td><td><a href="http://twitter.com/brett19x">Twitter/@brett19x</a></td></tr>
+<tr><th align="left">Ben Noordhuis</th><td><a href="https://github.com/bnoordhuis">GitHub/bnoordhuis</a></td><td><a href="http://twitter.com/bnoordhuis">Twitter/@bnoordhuis</a></td></tr>
+<tr><th align="left">David Siegel</th><td><a href="https://github.com/agnat">GitHub/agnat</a></td><td><a href="http://twitter.com/agnat">Twitter/@agnat</a></td></tr>
+<tr><th align="left">Michael Ira Krufky</th><td><a href="https://github.com/mkrufky">GitHub/mkrufky</a></td><td><a href="http://twitter.com/mkrufky">Twitter/@mkrufky</a></td></tr>
+</tbody></table>
+
+## Licence &amp; copyright
+
+Copyright (c) 2018 NAN WG Members / Collaborators (listed above).
+
+Native Abstractions for Node.js is licensed under an MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details.
diff --git a/node_modules/nan/doc/asyncworker.md b/node_modules/nan/doc/asyncworker.md
new file mode 100644
index 0000000..04231f8
--- /dev/null
+++ b/node_modules/nan/doc/asyncworker.md
@@ -0,0 +1,146 @@
+## Asynchronous work helpers
+
+`Nan::AsyncWorker`, `Nan::AsyncProgressWorker` and `Nan::AsyncProgressQueueWorker` are helper classes that make working with asynchronous code easier.
+
+ - <a href="#api_nan_async_worker"><b><code>Nan::AsyncWorker</code></b></a>
+ - <a href="#api_nan_async_progress_worker"><b><code>Nan::AsyncProgressWorkerBase &amp; Nan::AsyncProgressWorker</code></b></a>
+ - <a href="#api_nan_async_progress_queue_worker"><b><code>Nan::AsyncProgressQueueWorker</code></b></a>
+ - <a href="#api_nan_async_queue_worker"><b><code>Nan::AsyncQueueWorker</code></b></a>
+
+<a name="api_nan_async_worker"></a>
+### Nan::AsyncWorker
+
+`Nan::AsyncWorker` is an _abstract_ class that you can subclass to have much of the annoying asynchronous queuing and handling taken care of for you. It can even store arbitrary V8 objects for you and have them persist while the asynchronous work is in progress.
+
+This class internally handles the details of creating an [`AsyncResource`][AsyncResource], and running the callback in the
+correct async context. To be able to identify the async resources created by this class in async-hooks, provide a
+`resource_name` to the constructor. It is recommended that the module name be used as a prefix to the `resource_name` to avoid
+collisions in the names. For more details see [`AsyncResource`][AsyncResource] documentation.  The `resource_name` needs to stay valid for the lifetime of the worker instance.
+
+Definition:
+
+```c++
+class AsyncWorker {
+ public:
+  explicit AsyncWorker(Callback *callback_, const char* resource_name = "nan:AsyncWorker");
+
+  virtual ~AsyncWorker();
+
+  virtual void WorkComplete();
+
+  void SaveToPersistent(const char *key, const v8::Local<v8::Value> &value);
+
+  void SaveToPersistent(const v8::Local<v8::String> &key,
+                        const v8::Local<v8::Value> &value);
+
+  void SaveToPersistent(uint32_t index,
+                        const v8::Local<v8::Value> &value);
+
+  v8::Local<v8::Value> GetFromPersistent(const char *key) const;
+
+  v8::Local<v8::Value> GetFromPersistent(const v8::Local<v8::String> &key) const;
+
+  v8::Local<v8::Value> GetFromPersistent(uint32_t index) const;
+
+  virtual void Execute() = 0;
+
+  uv_work_t request;
+
+  virtual void Destroy();
+
+ protected:
+  Persistent<v8::Object> persistentHandle;
+
+  Callback *callback;
+
+  virtual void HandleOKCallback();
+
+  virtual void HandleErrorCallback();
+
+  void SetErrorMessage(const char *msg);
+
+  const char* ErrorMessage();
+};
+```
+
+<a name="api_nan_async_progress_worker"></a>
+### Nan::AsyncProgressWorkerBase &amp; Nan::AsyncProgressWorker
+
+`Nan::AsyncProgressWorkerBase` is an _abstract_ class template that extends `Nan::AsyncWorker` and adds additional progress reporting callbacks that can be used during the asynchronous work execution to provide progress data back to JavaScript.
+
+Previously the definition of `Nan::AsyncProgressWorker` only allowed sending `const char` data. Now extending `Nan::AsyncProgressWorker` will yield an instance of the implicit `Nan::AsyncProgressWorkerBase` template with type `<char>` for compatibility.
+
+`Nan::AsyncProgressWorkerBase` &amp; `Nan::AsyncProgressWorker` is intended for best-effort delivery of nonessential progress messages, e.g. a progress bar.  The last event sent before the main thread is woken will be delivered.
+
+Definition:
+
+```c++
+template<class T>
+class AsyncProgressWorkerBase<T> : public AsyncWorker {
+ public:
+  explicit AsyncProgressWorkerBase(Callback *callback_, const char* resource_name = ...);
+
+  virtual ~AsyncProgressWorkerBase();
+
+  void WorkProgress();
+
+  class ExecutionProgress {
+   public:
+    void Signal() const;
+    void Send(const T* data, size_t count) const;
+  };
+
+  virtual void Execute(const ExecutionProgress& progress) = 0;
+
+  virtual void HandleProgressCallback(const T *data, size_t count) = 0;
+
+  virtual void Destroy();
+};
+
+typedef AsyncProgressWorkerBase<T> AsyncProgressWorker;
+```
+
+<a name="api_nan_async_progress_queue_worker"></a>
+### Nan::AsyncProgressQueueWorker
+
+`Nan::AsyncProgressQueueWorker` is an _abstract_ class template that extends `Nan::AsyncWorker` and adds additional progress reporting callbacks that can be used during the asynchronous work execution to provide progress data back to JavaScript.
+
+`Nan::AsyncProgressQueueWorker` behaves exactly the same as `Nan::AsyncProgressWorker`, except all events are queued and delivered to the main thread.
+
+Definition:
+
+```c++
+template<class T>
+class AsyncProgressQueueWorker<T> : public AsyncWorker {
+ public:
+  explicit AsyncProgressQueueWorker(Callback *callback_, const char* resource_name = "nan:AsyncProgressQueueWorker");
+
+  virtual ~AsyncProgressQueueWorker();
+
+  void WorkProgress();
+
+  class ExecutionProgress {
+   public:
+    void Send(const T* data, size_t count) const;
+  };
+
+  virtual void Execute(const ExecutionProgress& progress) = 0;
+
+  virtual void HandleProgressCallback(const T *data, size_t count) = 0;
+
+  virtual void Destroy();
+};
+```
+
+<a name="api_nan_async_queue_worker"></a>
+### Nan::AsyncQueueWorker
+
+`Nan::AsyncQueueWorker` will run a `Nan::AsyncWorker` asynchronously via libuv. Both the `execute` and `after_work` steps are taken care of for you. Most of the logic for this is embedded in `Nan::AsyncWorker`.
+
+Definition:
+
+```c++
+void AsyncQueueWorker(AsyncWorker *);
+```
+
+[AsyncResource]: node_misc.md#api_nan_asyncresource
diff --git a/node_modules/nan/doc/buffers.md b/node_modules/nan/doc/buffers.md
new file mode 100644
index 0000000..8d8d25c
--- /dev/null
+++ b/node_modules/nan/doc/buffers.md
@@ -0,0 +1,54 @@
+## Buffers
+
+NAN's `node::Buffer` helpers exist as the API has changed across supported Node versions. Use these methods to ensure compatibility.
+
+ - <a href="#api_nan_new_buffer"><b><code>Nan::NewBuffer()</code></b></a>
+ - <a href="#api_nan_copy_buffer"><b><code>Nan::CopyBuffer()</code></b></a>
+ - <a href="#api_nan_free_callback"><b><code>Nan::FreeCallback()</code></b></a>
+
+<a name="api_nan_new_buffer"></a>
+### Nan::NewBuffer()
+
+Allocate a new `node::Buffer` object with the specified size and optional data. Calls `node::Buffer::New()`.
+
+Note that when creating a `Buffer` using `Nan::NewBuffer()` and an existing `char*`, it is assumed that the ownership of the pointer is being transferred to the new `Buffer` for management.
+When a `node::Buffer` instance is garbage collected and a `FreeCallback` has not been specified, `data` will be disposed of via a call to `free()`.
+You _must not_ free the memory space manually once you have created a `Buffer` in this way.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Object> Nan::NewBuffer(uint32_t size)
+Nan::MaybeLocal<v8::Object> Nan::NewBuffer(char* data, uint32_t size)
+Nan::MaybeLocal<v8::Object> Nan::NewBuffer(char *data,
+                                           size_t length,
+                                           Nan::FreeCallback callback,
+                                           void *hint)
+```
+
+
+<a name="api_nan_copy_buffer"></a>
+### Nan::CopyBuffer()
+
+Similar to [`Nan::NewBuffer()`](#api_nan_new_buffer) except that an implicit memcpy will occur within Node. Calls `node::Buffer::Copy()`.
+
+Management of the `char*` is left to the user, you should manually free the memory space if necessary as the new `Buffer` will have its own copy.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Object> Nan::CopyBuffer(const char *data, uint32_t size)
+```
+
+
+<a name="api_nan_free_callback"></a>
+### Nan::FreeCallback()
+
+A free callback that can be provided to [`Nan::NewBuffer()`](#api_nan_new_buffer).
+The supplied callback will be invoked when the `Buffer` undergoes garbage collection.
+
+Signature:
+
+```c++
+typedef void (*FreeCallback)(char *data, void *hint);
+```
diff --git a/node_modules/nan/doc/callback.md b/node_modules/nan/doc/callback.md
new file mode 100644
index 0000000..f7af0bf
--- /dev/null
+++ b/node_modules/nan/doc/callback.md
@@ -0,0 +1,76 @@
+## Nan::Callback
+
+`Nan::Callback` makes it easier to use `v8::Function` handles as callbacks. A class that wraps a `v8::Function` handle, protecting it from garbage collection and making it particularly useful for storage and use across asynchronous execution.
+
+ - <a href="#api_nan_callback"><b><code>Nan::Callback</code></b></a>
+
+<a name="api_nan_callback"></a>
+### Nan::Callback
+
+```c++
+class Callback {
+ public:
+  Callback();
+
+  explicit Callback(const v8::Local<v8::Function> &fn);
+
+  ~Callback();
+
+  bool operator==(const Callback &other) const;
+
+  bool operator!=(const Callback &other) const;
+
+  v8::Local<v8::Function> operator*() const;
+
+  MaybeLocal<v8::Value> operator()(AsyncResource* async_resource,
+                                   v8::Local<v8::Object> target,
+                                   int argc = 0,
+                                   v8::Local<v8::Value> argv[] = 0) const;
+
+  MaybeLocal<v8::Value> operator()(AsyncResource* async_resource,
+                                   int argc = 0,
+                                   v8::Local<v8::Value> argv[] = 0) const;
+
+  void SetFunction(const v8::Local<v8::Function> &fn);
+
+  v8::Local<v8::Function> GetFunction() const;
+
+  bool IsEmpty() const;
+
+  void Reset(const v8::Local<v8::Function> &fn);
+
+  void Reset();
+
+  MaybeLocal<v8::Value> Call(v8::Local<v8::Object> target,
+                            int argc,
+                            v8::Local<v8::Value> argv[],
+                            AsyncResource* async_resource) const;
+  MaybeLocal<v8::Value> Call(int argc,
+                             v8::Local<v8::Value> argv[],
+                             AsyncResource* async_resource) const;
+
+  // Deprecated versions. Use the versions that accept an async_resource instead
+  // as they run the callback in the correct async context as specified by the
+  // resource. If you want to call a synchronous JS function (i.e. on a
+  // non-empty JS stack), you can use Nan::Call instead.
+  v8::Local<v8::Value> operator()(v8::Local<v8::Object> target,
+                                  int argc = 0,
+                                  v8::Local<v8::Value> argv[] = 0) const;
+
+  v8::Local<v8::Value> operator()(int argc = 0,
+                                  v8::Local<v8::Value> argv[] = 0) const;
+  v8::Local<v8::Value> Call(v8::Local<v8::Object> target,
+                            int argc,
+                            v8::Local<v8::Value> argv[]) const;
+
+  v8::Local<v8::Value> Call(int argc, v8::Local<v8::Value> argv[]) const;
+};
+```
+
+Example usage:
+
+```c++
+v8::Local<v8::Function> function;
+Nan::Callback callback(function);
+callback.Call(0, 0);
+```
diff --git a/node_modules/nan/doc/converters.md b/node_modules/nan/doc/converters.md
new file mode 100644
index 0000000..d20861b
--- /dev/null
+++ b/node_modules/nan/doc/converters.md
@@ -0,0 +1,41 @@
+## Converters
+
+NAN contains functions that convert `v8::Value`s to other `v8::Value` types and native types. Since type conversion is not guaranteed to succeed, they return `Nan::Maybe` types. These converters can be used in place of `value->ToX()` and `value->XValue()` (where `X` is one of the types, e.g. `Boolean`) in a way that provides a consistent interface across V8 versions. Newer versions of V8 use the new `v8::Maybe` and `v8::MaybeLocal` types for these conversions, older versions don't have this functionality so it is provided by NAN.
+
+ - <a href="#api_nan_to"><b><code>Nan::To()</code></b></a>
+
+<a name="api_nan_to"></a>
+### Nan::To()
+
+Converts a `v8::Local<v8::Value>` to a different subtype of `v8::Value` or to a native data type. Returns a `Nan::MaybeLocal<>` or a `Nan::Maybe<>` accordingly.
+
+See [maybe_types.md](./maybe_types.md) for more information on `Nan::Maybe` types.
+
+Signatures:
+
+```c++
+// V8 types
+Nan::MaybeLocal<v8::Boolean> Nan::To<v8::Boolean>(v8::Local<v8::Value> val);
+Nan::MaybeLocal<v8::Int32> Nan::To<v8::Int32>(v8::Local<v8::Value> val);
+Nan::MaybeLocal<v8::Integer> Nan::To<v8::Integer>(v8::Local<v8::Value> val);
+Nan::MaybeLocal<v8::Object> Nan::To<v8::Object>(v8::Local<v8::Value> val);
+Nan::MaybeLocal<v8::Number> Nan::To<v8::Number>(v8::Local<v8::Value> val);
+Nan::MaybeLocal<v8::String> Nan::To<v8::String>(v8::Local<v8::Value> val);
+Nan::MaybeLocal<v8::Uint32> Nan::To<v8::Uint32>(v8::Local<v8::Value> val);
+
+// Native types
+Nan::Maybe<bool> Nan::To<bool>(v8::Local<v8::Value> val);
+Nan::Maybe<double> Nan::To<double>(v8::Local<v8::Value> val);
+Nan::Maybe<int32_t> Nan::To<int32_t>(v8::Local<v8::Value> val);
+Nan::Maybe<int64_t> Nan::To<int64_t>(v8::Local<v8::Value> val);
+Nan::Maybe<uint32_t> Nan::To<uint32_t>(v8::Local<v8::Value> val);
+```
+
+### Example
+
+```c++
+v8::Local<v8::Value> val;
+Nan::MaybeLocal<v8::String> str = Nan::To<v8::String>(val);
+Nan::Maybe<double> d = Nan::To<double>(val);
+```
+
diff --git a/node_modules/nan/doc/errors.md b/node_modules/nan/doc/errors.md
new file mode 100644
index 0000000..843435b
--- /dev/null
+++ b/node_modules/nan/doc/errors.md
@@ -0,0 +1,226 @@
+## Errors
+
+NAN includes helpers for creating, throwing and catching Errors as much of this functionality varies across the supported versions of V8 and must be abstracted.
+
+Note that an Error object is simply a specialized form of `v8::Value`.
+
+Also consult the V8 Embedders Guide section on [Exceptions](https://developers.google.com/v8/embed#exceptions) for more information.
+
+ - <a href="#api_nan_error"><b><code>Nan::Error()</code></b></a>
+ - <a href="#api_nan_range_error"><b><code>Nan::RangeError()</code></b></a>
+ - <a href="#api_nan_reference_error"><b><code>Nan::ReferenceError()</code></b></a>
+ - <a href="#api_nan_syntax_error"><b><code>Nan::SyntaxError()</code></b></a>
+ - <a href="#api_nan_type_error"><b><code>Nan::TypeError()</code></b></a>
+ - <a href="#api_nan_throw_error"><b><code>Nan::ThrowError()</code></b></a>
+ - <a href="#api_nan_throw_range_error"><b><code>Nan::ThrowRangeError()</code></b></a>
+ - <a href="#api_nan_throw_reference_error"><b><code>Nan::ThrowReferenceError()</code></b></a>
+ - <a href="#api_nan_throw_syntax_error"><b><code>Nan::ThrowSyntaxError()</code></b></a>
+ - <a href="#api_nan_throw_type_error"><b><code>Nan::ThrowTypeError()</code></b></a>
+ - <a href="#api_nan_fatal_exception"><b><code>Nan::FatalException()</code></b></a>
+ - <a href="#api_nan_errno_exception"><b><code>Nan::ErrnoException()</code></b></a>
+ - <a href="#api_nan_try_catch"><b><code>Nan::TryCatch</code></b></a>
+
+
+<a name="api_nan_error"></a>
+### Nan::Error()
+
+Create a new Error object using the [v8::Exception](https://v8docs.nodesource.com/node-8.16/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8.
+
+Note that an Error object is simply a specialized form of `v8::Value`.
+
+Signature:
+
+```c++
+v8::Local<v8::Value> Nan::Error(const char *msg);
+v8::Local<v8::Value> Nan::Error(v8::Local<v8::String> msg);
+```
+
+
+<a name="api_nan_range_error"></a>
+### Nan::RangeError()
+
+Create a new RangeError object using the [v8::Exception](https://v8docs.nodesource.com/node-8.16/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8.
+
+Note that an RangeError object is simply a specialized form of `v8::Value`.
+
+Signature:
+
+```c++
+v8::Local<v8::Value> Nan::RangeError(const char *msg);
+v8::Local<v8::Value> Nan::RangeError(v8::Local<v8::String> msg);
+```
+
+
+<a name="api_nan_reference_error"></a>
+### Nan::ReferenceError()
+
+Create a new ReferenceError object using the [v8::Exception](https://v8docs.nodesource.com/node-8.16/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8.
+
+Note that an ReferenceError object is simply a specialized form of `v8::Value`.
+
+Signature:
+
+```c++
+v8::Local<v8::Value> Nan::ReferenceError(const char *msg);
+v8::Local<v8::Value> Nan::ReferenceError(v8::Local<v8::String> msg);
+```
+
+
+<a name="api_nan_syntax_error"></a>
+### Nan::SyntaxError()
+
+Create a new SyntaxError object using the [v8::Exception](https://v8docs.nodesource.com/node-8.16/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8.
+
+Note that an SyntaxError object is simply a specialized form of `v8::Value`.
+
+Signature:
+
+```c++
+v8::Local<v8::Value> Nan::SyntaxError(const char *msg);
+v8::Local<v8::Value> Nan::SyntaxError(v8::Local<v8::String> msg);
+```
+
+
+<a name="api_nan_type_error"></a>
+### Nan::TypeError()
+
+Create a new TypeError object using the [v8::Exception](https://v8docs.nodesource.com/node-8.16/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8.
+
+Note that an TypeError object is simply a specialized form of `v8::Value`.
+
+Signature:
+
+```c++
+v8::Local<v8::Value> Nan::TypeError(const char *msg);
+v8::Local<v8::Value> Nan::TypeError(v8::Local<v8::String> msg);
+```
+
+
+<a name="api_nan_throw_error"></a>
+### Nan::ThrowError()
+
+Throw an Error object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new Error object will be created.
+
+Signature:
+
+```c++
+void Nan::ThrowError(const char *msg);
+void Nan::ThrowError(v8::Local<v8::String> msg);
+void Nan::ThrowError(v8::Local<v8::Value> error);
+```
+
+
+<a name="api_nan_throw_range_error"></a>
+### Nan::ThrowRangeError()
+
+Throw an RangeError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new RangeError object will be created.
+
+Signature:
+
+```c++
+void Nan::ThrowRangeError(const char *msg);
+void Nan::ThrowRangeError(v8::Local<v8::String> msg);
+void Nan::ThrowRangeError(v8::Local<v8::Value> error);
+```
+
+
+<a name="api_nan_throw_reference_error"></a>
+### Nan::ThrowReferenceError()
+
+Throw an ReferenceError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new ReferenceError object will be created.
+
+Signature:
+
+```c++
+void Nan::ThrowReferenceError(const char *msg);
+void Nan::ThrowReferenceError(v8::Local<v8::String> msg);
+void Nan::ThrowReferenceError(v8::Local<v8::Value> error);
+```
+
+
+<a name="api_nan_throw_syntax_error"></a>
+### Nan::ThrowSyntaxError()
+
+Throw an SyntaxError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new SyntaxError object will be created.
+
+Signature:
+
+```c++
+void Nan::ThrowSyntaxError(const char *msg);
+void Nan::ThrowSyntaxError(v8::Local<v8::String> msg);
+void Nan::ThrowSyntaxError(v8::Local<v8::Value> error);
+```
+
+
+<a name="api_nan_throw_type_error"></a>
+### Nan::ThrowTypeError()
+
+Throw an TypeError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new TypeError object will be created.
+
+Signature:
+
+```c++
+void Nan::ThrowTypeError(const char *msg);
+void Nan::ThrowTypeError(v8::Local<v8::String> msg);
+void Nan::ThrowTypeError(v8::Local<v8::Value> error);
+```
+
+<a name="api_nan_fatal_exception"></a>
+### Nan::FatalException()
+
+Replaces `node::FatalException()` which has a different API across supported versions of Node. For use with [`Nan::TryCatch`](#api_nan_try_catch).
+
+Signature:
+
+```c++
+void Nan::FatalException(const Nan::TryCatch& try_catch);
+```
+
+<a name="api_nan_errno_exception"></a>
+### Nan::ErrnoException()
+
+Replaces `node::ErrnoException()` which has a different API across supported versions of Node. 
+
+Signature:
+
+```c++
+v8::Local<v8::Value> Nan::ErrnoException(int errorno,
+                                         const char* syscall = NULL,
+                                         const char* message = NULL,
+                                         const char* path = NULL);
+```
+
+
+<a name="api_nan_try_catch"></a>
+### Nan::TryCatch
+
+A simple wrapper around [`v8::TryCatch`](https://v8docs.nodesource.com/node-8.16/d4/dc6/classv8_1_1_try_catch.html) compatible with all supported versions of V8. Can be used as a direct replacement in most cases. See also [`Nan::FatalException()`](#api_nan_fatal_exception) for an internal use compatible with `node::FatalException`.
+
+Signature:
+
+```c++
+class Nan::TryCatch {
+ public:
+  Nan::TryCatch();
+
+  bool HasCaught() const;
+
+  bool CanContinue() const;
+
+  v8::Local<v8::Value> ReThrow();
+
+  v8::Local<v8::Value> Exception() const;
+
+  // Nan::MaybeLocal for older versions of V8
+  v8::MaybeLocal<v8::Value> StackTrace() const;
+
+  v8::Local<v8::Message> Message() const;
+
+  void Reset();
+
+  void SetVerbose(bool value);
+
+  void SetCaptureMessage(bool value);
+};
+```
+
diff --git a/node_modules/nan/doc/json.md b/node_modules/nan/doc/json.md
new file mode 100644
index 0000000..d142597
--- /dev/null
+++ b/node_modules/nan/doc/json.md
@@ -0,0 +1,62 @@
+## JSON
+
+The _JSON_ object provides the c++ versions of the methods offered by the `JSON` object in javascript. V8 exposes these methods via the `v8::JSON` object.
+
+ - <a href="#api_nan_json_parse"><b><code>Nan::JSON.Parse</code></b></a>
+ - <a href="#api_nan_json_stringify"><b><code>Nan::JSON.Stringify</code></b></a>
+
+Refer to the V8 JSON object in the [V8 documentation](https://v8docs.nodesource.com/node-8.16/da/d6f/classv8_1_1_j_s_o_n.html) for more information about these methods and their arguments.
+
+<a name="api_nan_json_parse"></a>
+
+### Nan::JSON.Parse
+
+A simple wrapper around [`v8::JSON::Parse`](https://v8docs.nodesource.com/node-8.16/da/d6f/classv8_1_1_j_s_o_n.html#a936310d2540fb630ed37d3ee3ffe4504).
+
+Definition:
+
+```c++
+Nan::MaybeLocal<v8::Value> Nan::JSON::Parse(v8::Local<v8::String> json_string);
+```
+
+Use `JSON.Parse(json_string)` to parse a string into a `v8::Value`.
+
+Example:
+
+```c++
+v8::Local<v8::String> json_string = Nan::New("{ \"JSON\": \"object\" }").ToLocalChecked();
+
+Nan::JSON NanJSON;
+Nan::MaybeLocal<v8::Value> result = NanJSON.Parse(json_string);
+if (!result.IsEmpty()) {
+  v8::Local<v8::Value> val = result.ToLocalChecked();
+}
+```
+
+<a name="api_nan_json_stringify"></a>
+
+### Nan::JSON.Stringify
+
+A simple wrapper around [`v8::JSON::Stringify`](https://v8docs.nodesource.com/node-8.16/da/d6f/classv8_1_1_j_s_o_n.html#a44b255c3531489ce43f6110209138860).
+
+Definition:
+
+```c++
+Nan::MaybeLocal<v8::String> Nan::JSON::Stringify(v8::Local<v8::Object> json_object, v8::Local<v8::String> gap = v8::Local<v8::String>());
+```
+
+Use `JSON.Stringify(value)` to stringify a `v8::Object`.
+
+Example:
+
+```c++
+// using `v8::Local<v8::Value> val` from the `JSON::Parse` example
+v8::Local<v8::Object> obj = Nan::To<v8::Object>(val).ToLocalChecked();
+
+Nan::JSON NanJSON;
+Nan::MaybeLocal<v8::String> result = NanJSON.Stringify(obj);
+if (!result.IsEmpty()) {
+  v8::Local<v8::String> stringified = result.ToLocalChecked();
+}
+```
+
diff --git a/node_modules/nan/doc/maybe_types.md b/node_modules/nan/doc/maybe_types.md
new file mode 100644
index 0000000..142851a
--- /dev/null
+++ b/node_modules/nan/doc/maybe_types.md
@@ -0,0 +1,583 @@
+## Maybe Types
+
+The `Nan::MaybeLocal` and `Nan::Maybe` types are monads that encapsulate `v8::Local` handles that _may be empty_.
+
+* **Maybe Types**
+  - <a href="#api_nan_maybe_local"><b><code>Nan::MaybeLocal</code></b></a>
+  - <a href="#api_nan_maybe"><b><code>Nan::Maybe</code></b></a>
+  - <a href="#api_nan_nothing"><b><code>Nan::Nothing</code></b></a>
+  - <a href="#api_nan_just"><b><code>Nan::Just</code></b></a>
+* **Maybe Helpers**
+  - <a href="#api_nan_call"><b><code>Nan::Call()</code></b></a>
+  - <a href="#api_nan_to_detail_string"><b><code>Nan::ToDetailString()</code></b></a>
+  - <a href="#api_nan_to_array_index"><b><code>Nan::ToArrayIndex()</code></b></a>
+  - <a href="#api_nan_equals"><b><code>Nan::Equals()</code></b></a>
+  - <a href="#api_nan_new_instance"><b><code>Nan::NewInstance()</code></b></a>
+  - <a href="#api_nan_get_function"><b><code>Nan::GetFunction()</code></b></a>
+  - <a href="#api_nan_set"><b><code>Nan::Set()</code></b></a>
+  - <a href="#api_nan_define_own_property"><b><code>Nan::DefineOwnProperty()</code></b></a>
+  - <a href="#api_nan_force_set"><del><b><code>Nan::ForceSet()</code></b></del></a>
+  - <a href="#api_nan_get"><b><code>Nan::Get()</code></b></a>
+  - <a href="#api_nan_get_property_attribute"><b><code>Nan::GetPropertyAttributes()</code></b></a>
+  - <a href="#api_nan_has"><b><code>Nan::Has()</code></b></a>
+  - <a href="#api_nan_delete"><b><code>Nan::Delete()</code></b></a>
+  - <a href="#api_nan_get_property_names"><b><code>Nan::GetPropertyNames()</code></b></a>
+  - <a href="#api_nan_get_own_property_names"><b><code>Nan::GetOwnPropertyNames()</code></b></a>
+  - <a href="#api_nan_set_prototype"><b><code>Nan::SetPrototype()</code></b></a>
+  - <a href="#api_nan_object_proto_to_string"><b><code>Nan::ObjectProtoToString()</code></b></a>
+  - <a href="#api_nan_has_own_property"><b><code>Nan::HasOwnProperty()</code></b></a>
+  - <a href="#api_nan_has_real_named_property"><b><code>Nan::HasRealNamedProperty()</code></b></a>
+  - <a href="#api_nan_has_real_indexed_property"><b><code>Nan::HasRealIndexedProperty()</code></b></a>
+  - <a href="#api_nan_has_real_named_callback_property"><b><code>Nan::HasRealNamedCallbackProperty()</code></b></a>
+  - <a href="#api_nan_get_real_named_property_in_prototype_chain"><b><code>Nan::GetRealNamedPropertyInPrototypeChain()</code></b></a>
+  - <a href="#api_nan_get_real_named_property"><b><code>Nan::GetRealNamedProperty()</code></b></a>
+  - <a href="#api_nan_call_as_function"><b><code>Nan::CallAsFunction()</code></b></a>
+  - <a href="#api_nan_call_as_constructor"><b><code>Nan::CallAsConstructor()</code></b></a>
+  - <a href="#api_nan_get_source_line"><b><code>Nan::GetSourceLine()</code></b></a>
+  - <a href="#api_nan_get_line_number"><b><code>Nan::GetLineNumber()</code></b></a>
+  - <a href="#api_nan_get_start_column"><b><code>Nan::GetStartColumn()</code></b></a>
+  - <a href="#api_nan_get_end_column"><b><code>Nan::GetEndColumn()</code></b></a>
+  - <a href="#api_nan_clone_element_at"><b><code>Nan::CloneElementAt()</code></b></a>
+  - <a href="#api_nan_has_private"><b><code>Nan::HasPrivate()</code></b></a>
+  - <a href="#api_nan_get_private"><b><code>Nan::GetPrivate()</code></b></a>
+  - <a href="#api_nan_set_private"><b><code>Nan::SetPrivate()</code></b></a>
+  - <a href="#api_nan_delete_private"><b><code>Nan::DeletePrivate()</code></b></a>
+  - <a href="#api_nan_make_maybe"><b><code>Nan::MakeMaybe()</code></b></a>
+
+<a name="api_nan_maybe_local"></a>
+### Nan::MaybeLocal
+
+A `Nan::MaybeLocal<T>` is a wrapper around [`v8::Local<T>`](https://v8docs.nodesource.com/node-8.16/de/deb/classv8_1_1_local.html) that enforces a check that determines whether the `v8::Local<T>` is empty before it can be used.
+
+If an API method returns a `Nan::MaybeLocal`, the API method can potentially fail either because an exception is thrown, or because an exception is pending, e.g. because a previous API call threw an exception that hasn't been caught yet, or because a `v8::TerminateExecution` exception was thrown. In that case, an empty `Nan::MaybeLocal` is returned.
+
+Definition:
+
+```c++
+template<typename T> class Nan::MaybeLocal {
+ public:
+  MaybeLocal();
+
+  template<typename S> MaybeLocal(v8::Local<S> that);
+
+  bool IsEmpty() const;
+
+  template<typename S> bool ToLocal(v8::Local<S> *out);
+
+  // Will crash if the MaybeLocal<> is empty.
+  v8::Local<T> ToLocalChecked();
+
+  template<typename S> v8::Local<S> FromMaybe(v8::Local<S> default_value) const;
+};
+```
+
+See the documentation for [`v8::MaybeLocal`](https://v8docs.nodesource.com/node-8.16/d8/d7d/classv8_1_1_maybe_local.html) for further details.
+
+<a name="api_nan_maybe"></a>
+### Nan::Maybe
+
+A simple `Nan::Maybe` type, representing an object which may or may not have a value, see https://hackage.haskell.org/package/base/docs/Data-Maybe.html.
+
+If an API method returns a `Nan::Maybe<>`, the API method can potentially fail either because an exception is thrown, or because an exception is pending, e.g. because a previous API call threw an exception that hasn't been caught yet, or because a `v8::TerminateExecution` exception was thrown. In that case, a "Nothing" value is returned.
+
+Definition:
+
+```c++
+template<typename T> class Nan::Maybe {
+ public:
+  bool IsNothing() const;
+  bool IsJust() const;
+
+  // Will crash if the Maybe<> is nothing.
+  T FromJust();
+
+  T FromMaybe(const T& default_value);
+
+  bool operator==(const Maybe &other);
+
+  bool operator!=(const Maybe &other);
+};
+```
+
+See the documentation for [`v8::Maybe`](https://v8docs.nodesource.com/node-8.16/d9/d4b/classv8_1_1_maybe.html) for further details.
+
+<a name="api_nan_nothing"></a>
+### Nan::Nothing
+
+Construct an empty `Nan::Maybe` type representing _nothing_.
+
+```c++
+template<typename T> Nan::Maybe<T> Nan::Nothing();
+```
+
+<a name="api_nan_just"></a>
+### Nan::Just
+
+Construct a `Nan::Maybe` type representing _just_ a value.
+
+```c++
+template<typename T> Nan::Maybe<T> Nan::Just(const T &t);
+```
+
+<a name="api_nan_call"></a>
+### Nan::Call()
+
+A helper method for calling a synchronous [`v8::Function#Call()`](https://v8docs.nodesource.com/node-8.16/d5/d54/classv8_1_1_function.html#a9c3d0e4e13ddd7721fce238aa5b94a11) in a way compatible across supported versions of V8.
+
+For asynchronous callbacks, use Nan::Callback::Call along with an AsyncResource.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Value> Nan::Call(v8::Local<v8::Function> fun, v8::Local<v8::Object> recv, int argc, v8::Local<v8::Value> argv[]);
+Nan::MaybeLocal<v8::Value> Nan::Call(const Nan::Callback& callback, v8::Local<v8::Object> recv,
+ int argc, v8::Local<v8::Value> argv[]);
+Nan::MaybeLocal<v8::Value> Nan::Call(const Nan::Callback& callback, int argc, v8::Local<v8::Value> argv[]);
+```
+
+
+<a name="api_nan_to_detail_string"></a>
+### Nan::ToDetailString()
+
+A helper method for calling [`v8::Value#ToDetailString()`](https://v8docs.nodesource.com/node-8.16/dc/d0a/classv8_1_1_value.html#a2f9770296dc2c8d274bc8cc0dca243e5) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::String> Nan::ToDetailString(v8::Local<v8::Value> val);
+```
+
+
+<a name="api_nan_to_array_index"></a>
+### Nan::ToArrayIndex()
+
+A helper method for calling [`v8::Value#ToArrayIndex()`](https://v8docs.nodesource.com/node-8.16/dc/d0a/classv8_1_1_value.html#acc5bbef3c805ec458470c0fcd6f13493) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Uint32> Nan::ToArrayIndex(v8::Local<v8::Value> val);
+```
+
+
+<a name="api_nan_equals"></a>
+### Nan::Equals()
+
+A helper method for calling [`v8::Value#Equals()`](https://v8docs.nodesource.com/node-8.16/dc/d0a/classv8_1_1_value.html#a08fba1d776a59bbf6864b25f9152c64b) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<bool> Nan::Equals(v8::Local<v8::Value> a, v8::Local<v8::Value>(b));
+```
+
+
+<a name="api_nan_new_instance"></a>
+### Nan::NewInstance()
+
+A helper method for calling [`v8::Function#NewInstance()`](https://v8docs.nodesource.com/node-8.16/d5/d54/classv8_1_1_function.html#ae477558b10c14b76ed00e8dbab44ce5b) and [`v8::ObjectTemplate#NewInstance()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#ad605a7543cfbc5dab54cdb0883d14ae4) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Object> Nan::NewInstance(v8::Local<v8::Function> h);
+Nan::MaybeLocal<v8::Object> Nan::NewInstance(v8::Local<v8::Function> h, int argc, v8::Local<v8::Value> argv[]);
+Nan::MaybeLocal<v8::Object> Nan::NewInstance(v8::Local<v8::ObjectTemplate> h);
+```
+
+
+<a name="api_nan_get_function"></a>
+### Nan::GetFunction()
+
+A helper method for calling [`v8::FunctionTemplate#GetFunction()`](https://v8docs.nodesource.com/node-8.16/d8/d83/classv8_1_1_function_template.html#a56d904662a86eca78da37d9bb0ed3705) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Function> Nan::GetFunction(v8::Local<v8::FunctionTemplate> t);
+```
+
+
+<a name="api_nan_set"></a>
+### Nan::Set()
+
+A helper method for calling [`v8::Object#Set()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a67604ea3734f170c66026064ea808f20) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<bool> Nan::Set(v8::Local<v8::Object> obj,
+                          v8::Local<v8::Value> key,
+                          v8::Local<v8::Value> value)
+Nan::Maybe<bool> Nan::Set(v8::Local<v8::Object> obj,
+                          uint32_t index,
+                          v8::Local<v8::Value> value);
+```
+
+
+<a name="api_nan_define_own_property"></a>
+### Nan::DefineOwnProperty()
+
+A helper method for calling [`v8::Object#DefineOwnProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a6f76b2ed605cb8f9185b92de0033a820) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<bool> Nan::DefineOwnProperty(v8::Local<v8::Object> obj,
+                                        v8::Local<v8::String> key,
+                                        v8::Local<v8::Value> value,
+                                        v8::PropertyAttribute attribs = v8::None);
+```
+
+
+<a name="api_nan_force_set"></a>
+### <del>Nan::ForceSet()</del>
+
+Deprecated, use <a href="#api_nan_define_own_property"><code>Nan::DefineOwnProperty()</code></a>.
+
+<del>A helper method for calling [`v8::Object#ForceSet()`](https://v8docs.nodesource.com/node-0.12/db/d85/classv8_1_1_object.html#acfbdfd7427b516ebdb5c47c4df5ed96c) in a way compatible across supported versions of V8.</del>
+
+Signature:
+
+```c++
+NAN_DEPRECATED Nan::Maybe<bool> Nan::ForceSet(v8::Local<v8::Object> obj,
+                                              v8::Local<v8::Value> key,
+                                              v8::Local<v8::Value> value,
+                                              v8::PropertyAttribute attribs = v8::None);
+```
+
+
+<a name="api_nan_get"></a>
+### Nan::Get()
+
+A helper method for calling [`v8::Object#Get()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a2565f03e736694f6b1e1cf22a0b4eac2) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Value> Nan::Get(v8::Local<v8::Object> obj,
+                                    v8::Local<v8::Value> key);
+Nan::MaybeLocal<v8::Value> Nan::Get(v8::Local<v8::Object> obj, uint32_t index);
+```
+
+
+<a name="api_nan_get_property_attribute"></a>
+### Nan::GetPropertyAttributes()
+
+A helper method for calling [`v8::Object#GetPropertyAttributes()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a9b898894da3d1db2714fd9325a54fe57) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<v8::PropertyAttribute> Nan::GetPropertyAttributes(
+    v8::Local<v8::Object> obj,
+    v8::Local<v8::Value> key);
+```
+
+
+<a name="api_nan_has"></a>
+### Nan::Has()
+
+A helper method for calling [`v8::Object#Has()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ab3c3d89ea7c2f9afd08965bd7299a41d) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<bool> Nan::Has(v8::Local<v8::Object> obj, v8::Local<v8::String> key);
+Nan::Maybe<bool> Nan::Has(v8::Local<v8::Object> obj, uint32_t index);
+```
+
+
+<a name="api_nan_delete"></a>
+### Nan::Delete()
+
+A helper method for calling [`v8::Object#Delete()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a48e4a19b2cedff867eecc73ddb7d377f) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<bool> Nan::Delete(v8::Local<v8::Object> obj,
+                             v8::Local<v8::String> key);
+Nan::Maybe<bool> Nan::Delete(v8::Local<v8::Object> obj, uint32_t index);
+```
+
+
+<a name="api_nan_get_property_names"></a>
+### Nan::GetPropertyNames()
+
+A helper method for calling [`v8::Object#GetPropertyNames()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#aced885270cfd2c956367b5eedc7fbfe8) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Array> Nan::GetPropertyNames(v8::Local<v8::Object> obj);
+```
+
+
+<a name="api_nan_get_own_property_names"></a>
+### Nan::GetOwnPropertyNames()
+
+A helper method for calling [`v8::Object#GetOwnPropertyNames()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a79a6e4d66049b9aa648ed4dfdb23e6eb) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Array> Nan::GetOwnPropertyNames(v8::Local<v8::Object> obj);
+```
+
+
+<a name="api_nan_set_prototype"></a>
+### Nan::SetPrototype()
+
+A helper method for calling [`v8::Object#SetPrototype()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a442706b22fceda6e6d1f632122a9a9f4) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<bool> Nan::SetPrototype(v8::Local<v8::Object> obj,
+                                   v8::Local<v8::Value> prototype);
+```
+
+
+<a name="api_nan_object_proto_to_string"></a>
+### Nan::ObjectProtoToString()
+
+A helper method for calling [`v8::Object#ObjectProtoToString()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ab7a92b4dcf822bef72f6c0ac6fea1f0b) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::String> Nan::ObjectProtoToString(v8::Local<v8::Object> obj);
+```
+
+
+<a name="api_nan_has_own_property"></a>
+### Nan::HasOwnProperty()
+
+A helper method for calling [`v8::Object#HasOwnProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ab7b7245442ca6de1e1c145ea3fd653ff) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<bool> Nan::HasOwnProperty(v8::Local<v8::Object> obj,
+                                     v8::Local<v8::String> key);
+```
+
+
+<a name="api_nan_has_real_named_property"></a>
+### Nan::HasRealNamedProperty()
+
+A helper method for calling [`v8::Object#HasRealNamedProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ad8b80a59c9eb3c1e6c3cd6c84571f767) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<bool> Nan::HasRealNamedProperty(v8::Local<v8::Object> obj,
+                                           v8::Local<v8::String> key);
+```
+
+
+<a name="api_nan_has_real_indexed_property"></a>
+### Nan::HasRealIndexedProperty()
+
+A helper method for calling [`v8::Object#HasRealIndexedProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#af94fc1135a5e74a2193fb72c3a1b9855) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<bool> Nan::HasRealIndexedProperty(v8::Local<v8::Object> obj,
+                                             uint32_t index);
+```
+
+
+<a name="api_nan_has_real_named_callback_property"></a>
+### Nan::HasRealNamedCallbackProperty()
+
+A helper method for calling [`v8::Object#HasRealNamedCallbackProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#af743b7ea132b89f84d34d164d0668811) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<bool> Nan::HasRealNamedCallbackProperty(
+    v8::Local<v8::Object> obj,
+    v8::Local<v8::String> key);
+```
+
+
+<a name="api_nan_get_real_named_property_in_prototype_chain"></a>
+### Nan::GetRealNamedPropertyInPrototypeChain()
+
+A helper method for calling [`v8::Object#GetRealNamedPropertyInPrototypeChain()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a8700b1862e6b4783716964ba4d5e6172) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Value> Nan::GetRealNamedPropertyInPrototypeChain(
+    v8::Local<v8::Object> obj,
+    v8::Local<v8::String> key);
+```
+
+
+<a name="api_nan_get_real_named_property"></a>
+### Nan::GetRealNamedProperty()
+
+A helper method for calling [`v8::Object#GetRealNamedProperty()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a84471a824576a5994fdd0ffcbf99ccc0) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Value> Nan::GetRealNamedProperty(v8::Local<v8::Object> obj,
+                                                     v8::Local<v8::String> key);
+```
+
+
+<a name="api_nan_call_as_function"></a>
+### Nan::CallAsFunction()
+
+A helper method for calling [`v8::Object#CallAsFunction()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ad3ffc36f3dfc3592ce2a96bc047ee2cd) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Value> Nan::CallAsFunction(v8::Local<v8::Object> obj,
+                                               v8::Local<v8::Object> recv,
+                                               int argc,
+                                               v8::Local<v8::Value> argv[]);
+```
+
+
+<a name="api_nan_call_as_constructor"></a>
+### Nan::CallAsConstructor()
+
+A helper method for calling [`v8::Object#CallAsConstructor()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a50d571de50d0b0dfb28795619d07a01b) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Value> Nan::CallAsConstructor(v8::Local<v8::Object> obj,
+                                                  int argc,
+                                                  v8::Local<v8::Value> argv[]);
+```
+
+
+<a name="api_nan_get_source_line"></a>
+### Nan::GetSourceLine()
+
+A helper method for calling [`v8::Message#GetSourceLine()`](https://v8docs.nodesource.com/node-8.16/d9/d28/classv8_1_1_message.html#a849f7a6c41549d83d8159825efccd23a) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::String> Nan::GetSourceLine(v8::Local<v8::Message> msg);
+```
+
+
+<a name="api_nan_get_line_number"></a>
+### Nan::GetLineNumber()
+
+A helper method for calling [`v8::Message#GetLineNumber()`](https://v8docs.nodesource.com/node-8.16/d9/d28/classv8_1_1_message.html#adbe46c10a88a6565f2732a2d2adf99b9) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<int> Nan::GetLineNumber(v8::Local<v8::Message> msg);
+```
+
+
+<a name="api_nan_get_start_column"></a>
+### Nan::GetStartColumn()
+
+A helper method for calling [`v8::Message#GetStartColumn()`](https://v8docs.nodesource.com/node-8.16/d9/d28/classv8_1_1_message.html#a60ede616ba3822d712e44c7a74487ba6) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<int> Nan::GetStartColumn(v8::Local<v8::Message> msg);
+```
+
+
+<a name="api_nan_get_end_column"></a>
+### Nan::GetEndColumn()
+
+A helper method for calling [`v8::Message#GetEndColumn()`](https://v8docs.nodesource.com/node-8.16/d9/d28/classv8_1_1_message.html#aaa004cf19e529da980bc19fcb76d93be) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<int> Nan::GetEndColumn(v8::Local<v8::Message> msg);
+```
+
+
+<a name="api_nan_clone_element_at"></a>
+### Nan::CloneElementAt()
+
+A helper method for calling [`v8::Array#CloneElementAt()`](https://v8docs.nodesource.com/node-4.8/d3/d32/classv8_1_1_array.html#a1d3a878d4c1c7cae974dd50a1639245e) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Object> Nan::CloneElementAt(v8::Local<v8::Array> array, uint32_t index);
+```
+
+<a name="api_nan_has_private"></a>
+### Nan::HasPrivate()
+
+A helper method for calling [`v8::Object#HasPrivate()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#af68a0b98066cfdeb8f943e98a40ba08d) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<bool> Nan::HasPrivate(v8::Local<v8::Object> object, v8::Local<v8::String> key);
+```
+
+<a name="api_nan_get_private"></a>
+### Nan::GetPrivate()
+
+A helper method for calling [`v8::Object#GetPrivate()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a169f2da506acbec34deadd9149a1925a) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Value> Nan::GetPrivate(v8::Local<v8::Object> object, v8::Local<v8::String> key);
+```
+
+<a name="api_nan_set_private"></a>
+### Nan::SetPrivate()
+
+A helper method for calling [`v8::Object#SetPrivate()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ace1769b0f3b86bfe9fda1010916360ee) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<bool> Nan::SetPrivate(v8::Local<v8::Object> object, v8::Local<v8::String> key, v8::Local<v8::Value> value);
+```
+
+<a name="api_nan_delete_private"></a>
+### Nan::DeletePrivate()
+
+A helper method for calling [`v8::Object#DeletePrivate()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a138bb32a304f3982be02ad499693b8fd) in a way compatible across supported versions of V8.
+
+Signature:
+
+```c++
+Nan::Maybe<bool> Nan::DeletePrivate(v8::Local<v8::Object> object, v8::Local<v8::String> key);
+```
+
+<a name="api_nan_make_maybe"></a>
+### Nan::MakeMaybe()
+
+Wraps a `v8::Local<>` in a `Nan::MaybeLocal<>`. When called with a `Nan::MaybeLocal<>` it just returns its argument. This is useful in generic template code that builds on NAN.
+
+Synopsis:
+
+```c++
+  MaybeLocal<v8::Number> someNumber = MakeMaybe(New<v8::Number>(3.141592654));
+  MaybeLocal<v8::String> someString = MakeMaybe(New<v8::String>("probably"));
+```
+
+Signature:
+
+```c++
+template <typename T, template <typename> class MaybeMaybe>
+Nan::MaybeLocal<T> Nan::MakeMaybe(MaybeMaybe<T> v);
+```
diff --git a/node_modules/nan/doc/methods.md b/node_modules/nan/doc/methods.md
new file mode 100644
index 0000000..9642d02
--- /dev/null
+++ b/node_modules/nan/doc/methods.md
@@ -0,0 +1,664 @@
+## JavaScript-accessible methods
+
+A _template_ is a blueprint for JavaScript functions and objects in a context. You can use a template to wrap C++ functions and data structures within JavaScript objects so that they can be manipulated from JavaScript. See the V8 Embedders Guide section on [Templates](https://github.com/v8/v8/wiki/Embedder%27s-Guide#templates) for further information.
+
+In order to expose functionality to JavaScript via a template, you must provide it to V8 in a form that it understands. Across the versions of V8 supported by NAN, JavaScript-accessible method signatures vary widely, NAN fully abstracts method declaration and provides you with an interface that is similar to the most recent V8 API but is backward-compatible with older versions that still use the now-deceased `v8::Argument` type.
+
+* **Method argument types**
+ - <a href="#api_nan_function_callback_info"><b><code>Nan::FunctionCallbackInfo</code></b></a>
+ - <a href="#api_nan_property_callback_info"><b><code>Nan::PropertyCallbackInfo</code></b></a>
+ - <a href="#api_nan_return_value"><b><code>Nan::ReturnValue</code></b></a>
+* **Method declarations**
+ - <a href="#api_nan_method"><b>Method declaration</b></a>
+ - <a href="#api_nan_getter"><b>Getter declaration</b></a>
+ - <a href="#api_nan_setter"><b>Setter declaration</b></a>
+ - <a href="#api_nan_property_getter"><b>Property getter declaration</b></a>
+ - <a href="#api_nan_property_setter"><b>Property setter declaration</b></a>
+ - <a href="#api_nan_property_enumerator"><b>Property enumerator declaration</b></a>
+ - <a href="#api_nan_property_deleter"><b>Property deleter declaration</b></a>
+ - <a href="#api_nan_property_query"><b>Property query declaration</b></a>
+ - <a href="#api_nan_index_getter"><b>Index getter declaration</b></a>
+ - <a href="#api_nan_index_setter"><b>Index setter declaration</b></a>
+ - <a href="#api_nan_index_enumerator"><b>Index enumerator declaration</b></a>
+ - <a href="#api_nan_index_deleter"><b>Index deleter declaration</b></a>
+ - <a href="#api_nan_index_query"><b>Index query declaration</b></a>
+* Method and template helpers
+ - <a href="#api_nan_set_method"><b><code>Nan::SetMethod()</code></b></a>
+ - <a href="#api_nan_set_prototype_method"><b><code>Nan::SetPrototypeMethod()</code></b></a>
+ - <a href="#api_nan_set_accessor"><b><code>Nan::SetAccessor()</code></b></a>
+ - <a href="#api_nan_set_named_property_handler"><b><code>Nan::SetNamedPropertyHandler()</code></b></a>
+ - <a href="#api_nan_set_indexed_property_handler"><b><code>Nan::SetIndexedPropertyHandler()</code></b></a>
+ - <a href="#api_nan_set_template"><b><code>Nan::SetTemplate()</code></b></a>
+ - <a href="#api_nan_set_prototype_template"><b><code>Nan::SetPrototypeTemplate()</code></b></a>
+ - <a href="#api_nan_set_instance_template"><b><code>Nan::SetInstanceTemplate()</code></b></a>
+ - <a href="#api_nan_set_call_handler"><b><code>Nan::SetCallHandler()</code></b></a>
+ - <a href="#api_nan_set_call_as_function_handler"><b><code>Nan::SetCallAsFunctionHandler()</code></b></a>
+
+<a name="api_nan_function_callback_info"></a>
+### Nan::FunctionCallbackInfo
+
+`Nan::FunctionCallbackInfo` should be used in place of [`v8::FunctionCallbackInfo`](https://v8docs.nodesource.com/node-8.16/dd/d0d/classv8_1_1_function_callback_info.html), even with older versions of Node where `v8::FunctionCallbackInfo` does not exist.
+
+Definition:
+
+```c++
+template<typename T> class FunctionCallbackInfo {
+ public:
+  ReturnValue<T> GetReturnValue() const;
+  v8::Local<v8::Function> Callee(); // NOTE: Not available in NodeJS >= 10.0.0
+  v8::Local<v8::Value> Data();
+  v8::Local<v8::Object> Holder();
+  bool IsConstructCall();
+  int Length() const;
+  v8::Local<v8::Value> operator[](int i) const;
+  v8::Local<v8::Object> This() const;
+  v8::Isolate *GetIsolate() const;
+};
+```
+
+See the [`v8::FunctionCallbackInfo`](https://v8docs.nodesource.com/node-8.16/dd/d0d/classv8_1_1_function_callback_info.html) documentation for usage details on these. See [`Nan::ReturnValue`](#api_nan_return_value) for further information on how to set a return value from methods.
+
+**Note:** `FunctionCallbackInfo::Callee` is removed in Node.js after `10.0.0` because it is was deprecated in V8. Consider using `info.Data()` to pass any information you need.
+
+<a name="api_nan_property_callback_info"></a>
+### Nan::PropertyCallbackInfo
+
+`Nan::PropertyCallbackInfo` should be used in place of [`v8::PropertyCallbackInfo`](https://v8docs.nodesource.com/node-8.16/d7/dc5/classv8_1_1_property_callback_info.html), even with older versions of Node where `v8::PropertyCallbackInfo` does not exist.
+
+Definition:
+
+```c++
+template<typename T> class PropertyCallbackInfo : public PropertyCallbackInfoBase<T> {
+ public:
+  ReturnValue<T> GetReturnValue() const;
+  v8::Isolate* GetIsolate() const;
+  v8::Local<v8::Value> Data() const;
+  v8::Local<v8::Object> This() const;
+  v8::Local<v8::Object> Holder() const;
+};
+```
+
+See the [`v8::PropertyCallbackInfo`](https://v8docs.nodesource.com/node-8.16/d7/dc5/classv8_1_1_property_callback_info.html) documentation for usage details on these. See [`Nan::ReturnValue`](#api_nan_return_value) for further information on how to set a return value from property accessor methods.
+
+<a name="api_nan_return_value"></a>
+### Nan::ReturnValue
+
+`Nan::ReturnValue` is used in place of [`v8::ReturnValue`](https://v8docs.nodesource.com/node-8.16/da/da7/classv8_1_1_return_value.html) on both [`Nan::FunctionCallbackInfo`](#api_nan_function_callback_info) and [`Nan::PropertyCallbackInfo`](#api_nan_property_callback_info) as the return type of `GetReturnValue()`.
+
+Example usage:
+
+```c++
+void EmptyArray(const Nan::FunctionCallbackInfo<v8::Value>& info) {
+  info.GetReturnValue().Set(Nan::New<v8::Array>());
+}
+```
+
+Definition:
+
+```c++
+template<typename T> class ReturnValue {
+ public:
+  // Handle setters
+  template <typename S> void Set(const v8::Local<S> &handle);
+  template <typename S> void Set(const Nan::Global<S> &handle);
+
+  // Fast primitive setters
+  void Set(bool value);
+  void Set(double i);
+  void Set(int32_t i);
+  void Set(uint32_t i);
+
+  // Fast JS primitive setters
+  void SetNull();
+  void SetUndefined();
+  void SetEmptyString();
+
+  // Convenience getter for isolate
+  v8::Isolate *GetIsolate() const;
+};
+```
+
+See the documentation on [`v8::ReturnValue`](https://v8docs.nodesource.com/node-8.16/da/da7/classv8_1_1_return_value.html) for further information on this.
+
+<a name="api_nan_method"></a>
+### Method declaration
+
+JavaScript-accessible methods should be declared with the following signature to form a `Nan::FunctionCallback`:
+
+```c++
+typedef void(*FunctionCallback)(const FunctionCallbackInfo<v8::Value>&);
+```
+
+Example:
+
+```c++
+void MethodName(const Nan::FunctionCallbackInfo<v8::Value>& info) {
+  ...
+}
+```
+
+You do not need to declare a new `HandleScope` within a method as one is implicitly created for you.
+
+**Example usage**
+
+```c++
+// .h:
+class Foo : public Nan::ObjectWrap {
+  ...
+
+  static void Bar(const Nan::FunctionCallbackInfo<v8::Value>& info);
+  static void Baz(const Nan::FunctionCallbackInfo<v8::Value>& info);
+}
+
+
+// .cc:
+void Foo::Bar(const Nan::FunctionCallbackInfo<v8::Value>& info) {
+  ...
+}
+
+void Foo::Baz(const Nan::FunctionCallbackInfo<v8::Value>& info) {
+  ...
+}
+```
+
+A helper macro `NAN_METHOD(methodname)` exists, compatible with NAN v1 method declarations.
+
+**Example usage with `NAN_METHOD(methodname)`**
+
+```c++
+// .h:
+class Foo : public Nan::ObjectWrap {
+  ...
+
+  static NAN_METHOD(Bar);
+  static NAN_METHOD(Baz);
+}
+
+
+// .cc:
+NAN_METHOD(Foo::Bar) {
+  ...
+}
+
+NAN_METHOD(Foo::Baz) {
+  ...
+}
+```
+
+Use [`Nan::SetPrototypeMethod`](#api_nan_set_prototype_method) to attach a method to a JavaScript function prototype or [`Nan::SetMethod`](#api_nan_set_method) to attach a method directly on a JavaScript object.
+
+<a name="api_nan_getter"></a>
+### Getter declaration
+
+JavaScript-accessible getters should be declared with the following signature to form a `Nan::GetterCallback`:
+
+```c++
+typedef void(*GetterCallback)(v8::Local<v8::String>,
+                              const PropertyCallbackInfo<v8::Value>&);
+```
+
+Example:
+
+```c++
+void GetterName(v8::Local<v8::String> property,
+                const Nan::PropertyCallbackInfo<v8::Value>& info) {
+  ...
+}
+```
+
+You do not need to declare a new `HandleScope` within a getter as one is implicitly created for you.
+
+A helper macro `NAN_GETTER(methodname)` exists, compatible with NAN v1 method declarations.
+
+Also see the V8 Embedders Guide documentation on [Accessors](https://developers.google.com/v8/embed#accesssors).
+
+<a name="api_nan_setter"></a>
+### Setter declaration
+
+JavaScript-accessible setters should be declared with the following signature to form a <b><code>Nan::SetterCallback</code></b>:
+
+```c++
+typedef void(*SetterCallback)(v8::Local<v8::String>,
+                              v8::Local<v8::Value>,
+                              const PropertyCallbackInfo<void>&);
+```
+
+Example:
+
+```c++
+void SetterName(v8::Local<v8::String> property,
+                v8::Local<v8::Value> value,
+                const Nan::PropertyCallbackInfo<void>& info) {
+  ...
+}
+```
+
+You do not need to declare a new `HandleScope` within a setter as one is implicitly created for you.
+
+A helper macro `NAN_SETTER(methodname)` exists, compatible with NAN v1 method declarations.
+
+Also see the V8 Embedders Guide documentation on [Accessors](https://developers.google.com/v8/embed#accesssors).
+
+<a name="api_nan_property_getter"></a>
+### Property getter declaration
+
+JavaScript-accessible property getters should be declared with the following signature to form a <b><code>Nan::PropertyGetterCallback</code></b>:
+
+```c++
+typedef void(*PropertyGetterCallback)(v8::Local<v8::String>,
+                                      const PropertyCallbackInfo<v8::Value>&);
+```
+
+Example:
+
+```c++
+void PropertyGetterName(v8::Local<v8::String> property,
+                        const Nan::PropertyCallbackInfo<v8::Value>& info) {
+  ...
+}
+```
+
+You do not need to declare a new `HandleScope` within a property getter as one is implicitly created for you.
+
+A helper macro `NAN_PROPERTY_GETTER(methodname)` exists, compatible with NAN v1 method declarations.
+
+Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors).
+
+<a name="api_nan_property_setter"></a>
+### Property setter declaration
+
+JavaScript-accessible property setters should be declared with the following signature to form a <b><code>Nan::PropertySetterCallback</code></b>:
+
+```c++
+typedef void(*PropertySetterCallback)(v8::Local<v8::String>,
+                                      v8::Local<v8::Value>,
+                                      const PropertyCallbackInfo<v8::Value>&);
+```
+
+Example:
+
+```c++
+void PropertySetterName(v8::Local<v8::String> property,
+                        v8::Local<v8::Value> value,
+                        const Nan::PropertyCallbackInfo<v8::Value>& info);
+```
+
+You do not need to declare a new `HandleScope` within a property setter as one is implicitly created for you.
+
+A helper macro `NAN_PROPERTY_SETTER(methodname)` exists, compatible with NAN v1 method declarations.
+
+Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors).
+
+<a name="api_nan_property_enumerator"></a>
+### Property enumerator declaration
+
+JavaScript-accessible property enumerators should be declared with the following signature to form a <b><code>Nan::PropertyEnumeratorCallback</code></b>:
+
+```c++
+typedef void(*PropertyEnumeratorCallback)(const PropertyCallbackInfo<v8::Array>&);
+```
+
+Example:
+
+```c++
+void PropertyEnumeratorName(const Nan::PropertyCallbackInfo<v8::Array>& info);
+```
+
+You do not need to declare a new `HandleScope` within a property enumerator as one is implicitly created for you.
+
+A helper macro `NAN_PROPERTY_ENUMERATOR(methodname)` exists, compatible with NAN v1 method declarations.
+
+Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors).
+
+<a name="api_nan_property_deleter"></a>
+### Property deleter declaration
+
+JavaScript-accessible property deleters should be declared with the following signature to form a <b><code>Nan::PropertyDeleterCallback</code></b>:
+
+```c++
+typedef void(*PropertyDeleterCallback)(v8::Local<v8::String>,
+                                       const PropertyCallbackInfo<v8::Boolean>&);
+```
+
+Example:
+
+```c++
+void PropertyDeleterName(v8::Local<v8::String> property,
+                         const Nan::PropertyCallbackInfo<v8::Boolean>& info);
+```
+
+You do not need to declare a new `HandleScope` within a property deleter as one is implicitly created for you.
+
+A helper macro `NAN_PROPERTY_DELETER(methodname)` exists, compatible with NAN v1 method declarations.
+
+Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors).
+
+<a name="api_nan_property_query"></a>
+### Property query declaration
+
+JavaScript-accessible property query methods should be declared with the following signature to form a <b><code>Nan::PropertyQueryCallback</code></b>:
+
+```c++
+typedef void(*PropertyQueryCallback)(v8::Local<v8::String>,
+                                     const PropertyCallbackInfo<v8::Integer>&);
+```
+
+Example:
+
+```c++
+void PropertyQueryName(v8::Local<v8::String> property,
+                       const Nan::PropertyCallbackInfo<v8::Integer>& info);
+```
+
+You do not need to declare a new `HandleScope` within a property query method as one is implicitly created for you.
+
+A helper macro `NAN_PROPERTY_QUERY(methodname)` exists, compatible with NAN v1 method declarations.
+
+Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors).
+
+<a name="api_nan_index_getter"></a>
+### Index getter declaration
+
+JavaScript-accessible index getter methods should be declared with the following signature to form a <b><code>Nan::IndexGetterCallback</code></b>:
+
+```c++
+typedef void(*IndexGetterCallback)(uint32_t,
+                                   const PropertyCallbackInfo<v8::Value>&);
+```
+
+Example:
+
+```c++
+void IndexGetterName(uint32_t index, const PropertyCallbackInfo<v8::Value>& info);
+```
+
+You do not need to declare a new `HandleScope` within a index getter as one is implicitly created for you.
+
+A helper macro `NAN_INDEX_GETTER(methodname)` exists, compatible with NAN v1 method declarations.
+
+Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors).
+
+<a name="api_nan_index_setter"></a>
+### Index setter declaration
+
+JavaScript-accessible index setter methods should be declared with the following signature to form a <b><code>Nan::IndexSetterCallback</code></b>:
+
+```c++
+typedef void(*IndexSetterCallback)(uint32_t,
+                                   v8::Local<v8::Value>,
+                                   const PropertyCallbackInfo<v8::Value>&);
+```
+
+Example:
+
+```c++
+void IndexSetterName(uint32_t index,
+                     v8::Local<v8::Value> value,
+                     const PropertyCallbackInfo<v8::Value>& info);
+```
+
+You do not need to declare a new `HandleScope` within a index setter as one is implicitly created for you.
+
+A helper macro `NAN_INDEX_SETTER(methodname)` exists, compatible with NAN v1 method declarations.
+
+Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors).
+
+<a name="api_nan_index_enumerator"></a>
+### Index enumerator declaration
+
+JavaScript-accessible index enumerator methods should be declared with the following signature to form a <b><code>Nan::IndexEnumeratorCallback</code></b>:
+
+```c++
+typedef void(*IndexEnumeratorCallback)(const PropertyCallbackInfo<v8::Array>&);
+```
+
+Example:
+
+```c++
+void IndexEnumeratorName(const PropertyCallbackInfo<v8::Array>& info);
+```
+
+You do not need to declare a new `HandleScope` within a index enumerator as one is implicitly created for you.
+
+A helper macro `NAN_INDEX_ENUMERATOR(methodname)` exists, compatible with NAN v1 method declarations.
+
+Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors).
+
+<a name="api_nan_index_deleter"></a>
+### Index deleter declaration
+
+JavaScript-accessible index deleter methods should be declared with the following signature to form a <b><code>Nan::IndexDeleterCallback</code></b>:
+
+```c++
+typedef void(*IndexDeleterCallback)(uint32_t,
+                                    const PropertyCallbackInfo<v8::Boolean>&);
+```
+
+Example:
+
+```c++
+void IndexDeleterName(uint32_t index, const PropertyCallbackInfo<v8::Boolean>& info);
+```
+
+You do not need to declare a new `HandleScope` within a index deleter as one is implicitly created for you.
+
+A helper macro `NAN_INDEX_DELETER(methodname)` exists, compatible with NAN v1 method declarations.
+
+Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors).
+
+<a name="api_nan_index_query"></a>
+### Index query declaration
+
+JavaScript-accessible index query methods should be declared with the following signature to form a <b><code>Nan::IndexQueryCallback</code></b>:
+
+```c++
+typedef void(*IndexQueryCallback)(uint32_t,
+                                  const PropertyCallbackInfo<v8::Integer>&);
+```
+
+Example:
+
+```c++
+void IndexQueryName(uint32_t index, const PropertyCallbackInfo<v8::Integer>& info);
+```
+
+You do not need to declare a new `HandleScope` within a index query method as one is implicitly created for you.
+
+A helper macro `NAN_INDEX_QUERY(methodname)` exists, compatible with NAN v1 method declarations.
+
+Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors).
+
+<a name="api_nan_set_method"></a>
+### Nan::SetMethod()
+
+Sets a method with a given name directly on a JavaScript object where the method has the `Nan::FunctionCallback` signature (see <a href="#api_nan_method">Method declaration</a>).
+
+Signature:
+
+```c++
+void Nan::SetMethod(v8::Local<v8::Object> recv,
+                    const char *name,
+                    Nan::FunctionCallback callback,
+                    v8::Local<v8::Value> data = v8::Local<v8::Value>())
+void Nan::SetMethod(v8::Local<v8::Template> templ,
+                    const char *name,
+                    Nan::FunctionCallback callback,
+                    v8::Local<v8::Value> data = v8::Local<v8::Value>())
+```
+
+<a name="api_nan_set_prototype_method"></a>
+### Nan::SetPrototypeMethod()
+
+Sets a method with a given name on a `FunctionTemplate`'s prototype where the method has the `Nan::FunctionCallback` signature (see <a href="#api_nan_method">Method declaration</a>).
+
+Signature:
+
+```c++
+void Nan::SetPrototypeMethod(v8::Local<v8::FunctionTemplate> recv,
+                             const char* name,
+                             Nan::FunctionCallback callback,
+                             v8::Local<v8::Value> data = v8::Local<v8::Value>())
+```
+
+<a name="api_nan_set_accessor"></a>
+### Nan::SetAccessor()
+
+Sets getters and setters for a property with a given name on an `ObjectTemplate` or a plain `Object`. Accepts getters with the `Nan::GetterCallback` signature (see <a href="#api_nan_getter">Getter declaration</a>) and setters with the `Nan::SetterCallback` signature (see <a href="#api_nan_setter">Setter declaration</a>).
+
+Signature:
+
+```c++
+void SetAccessor(v8::Local<v8::ObjectTemplate> tpl,
+                 v8::Local<v8::String> name,
+                 Nan::GetterCallback getter,
+                 Nan::SetterCallback setter = 0,
+                 v8::Local<v8::Value> data = v8::Local<v8::Value>(),
+                 v8::AccessControl settings = v8::DEFAULT,
+                 v8::PropertyAttribute attribute = v8::None,
+                 imp::Sig signature = imp::Sig());
+bool SetAccessor(v8::Local<v8::Object> obj,
+                 v8::Local<v8::String> name,
+                 Nan::GetterCallback getter,
+                 Nan::SetterCallback setter = 0,
+                 v8::Local<v8::Value> data = v8::Local<v8::Value>(),
+                 v8::AccessControl settings = v8::DEFAULT,
+                 v8::PropertyAttribute attribute = v8::None)
+```
+
+See the V8 [`ObjectTemplate#SetAccessor()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#aca0ed196f8a9adb1f68b1aadb6c9cd77) and [`Object#SetAccessor()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ae91b3b56b357f285288c89fbddc46d1b) for further information about how to use `Nan::SetAccessor()`.
+
+<a name="api_nan_set_named_property_handler"></a>
+### Nan::SetNamedPropertyHandler()
+
+Sets named property getters, setters, query, deleter and enumerator methods on an `ObjectTemplate`. Accepts:
+
+* Property getters with the `Nan::PropertyGetterCallback` signature (see <a href="#api_nan_property_getter">Property getter declaration</a>)
+* Property setters with the `Nan::PropertySetterCallback` signature (see <a href="#api_nan_property_setter">Property setter declaration</a>)
+* Property query methods with the `Nan::PropertyQueryCallback` signature (see <a href="#api_nan_property_query">Property query declaration</a>)
+* Property deleters with the `Nan::PropertyDeleterCallback` signature (see <a href="#api_nan_property_deleter">Property deleter declaration</a>)
+* Property enumerators with the `Nan::PropertyEnumeratorCallback` signature (see <a href="#api_nan_property_enumerator">Property enumerator declaration</a>)
+
+Signature:
+
+```c++
+void SetNamedPropertyHandler(v8::Local<v8::ObjectTemplate> tpl,
+                             Nan::PropertyGetterCallback getter,
+                             Nan::PropertySetterCallback setter = 0,
+                             Nan::PropertyQueryCallback query = 0,
+                             Nan::PropertyDeleterCallback deleter = 0,
+                             Nan::PropertyEnumeratorCallback enumerator = 0,
+                             v8::Local<v8::Value> data = v8::Local<v8::Value>())
+```
+
+See the V8 [`ObjectTemplate#SetNamedPropertyHandler()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#a33b3ebd7de641f6cc6414b7de01fc1c7) for further information about how to use `Nan::SetNamedPropertyHandler()`.
+
+<a name="api_nan_set_indexed_property_handler"></a>
+### Nan::SetIndexedPropertyHandler()
+
+Sets indexed property getters, setters, query, deleter and enumerator methods on an `ObjectTemplate`. Accepts:
+
+* Indexed property getters with the `Nan::IndexGetterCallback` signature (see <a href="#api_nan_index_getter">Index getter declaration</a>)
+* Indexed property setters with the `Nan::IndexSetterCallback` signature (see <a href="#api_nan_index_setter">Index setter declaration</a>)
+* Indexed property query methods with the `Nan::IndexQueryCallback` signature (see <a href="#api_nan_index_query">Index query declaration</a>)
+* Indexed property deleters with the `Nan::IndexDeleterCallback` signature (see <a href="#api_nan_index_deleter">Index deleter declaration</a>)
+* Indexed property enumerators with the `Nan::IndexEnumeratorCallback` signature (see <a href="#api_nan_index_enumerator">Index enumerator declaration</a>)
+
+Signature:
+
+```c++
+void SetIndexedPropertyHandler(v8::Local<v8::ObjectTemplate> tpl,
+                               Nan::IndexGetterCallback getter,
+                               Nan::IndexSetterCallback setter = 0,
+                               Nan::IndexQueryCallback query = 0,
+                               Nan::IndexDeleterCallback deleter = 0,
+                               Nan::IndexEnumeratorCallback enumerator = 0,
+                               v8::Local<v8::Value> data = v8::Local<v8::Value>())
+```
+
+See the V8 [`ObjectTemplate#SetIndexedPropertyHandler()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#ac89f06d634add0e890452033f7d17ff1) for further information about how to use `Nan::SetIndexedPropertyHandler()`.
+
+<a name="api_nan_set_template"></a>
+### Nan::SetTemplate()
+
+Adds properties on an `Object`'s or `Function`'s template.
+
+Signature:
+
+```c++
+void Nan::SetTemplate(v8::Local<v8::Template> templ,
+                      const char *name,
+                      v8::Local<v8::Data> value);
+void Nan::SetTemplate(v8::Local<v8::Template> templ,
+                      v8::Local<v8::String> name,
+                      v8::Local<v8::Data> value,
+                      v8::PropertyAttribute attributes)
+```
+
+Calls the `Template`'s [`Set()`](https://v8docs.nodesource.com/node-8.16/db/df7/classv8_1_1_template.html#ae3fbaff137557aa6a0233bc7e52214ac).
+
+<a name="api_nan_set_prototype_template"></a>
+### Nan::SetPrototypeTemplate()
+
+Adds properties on an `Object`'s or `Function`'s prototype template.
+
+Signature:
+
+```c++
+void Nan::SetPrototypeTemplate(v8::Local<v8::FunctionTemplate> templ,
+                               const char *name,
+                               v8::Local<v8::Data> value);
+void Nan::SetPrototypeTemplate(v8::Local<v8::FunctionTemplate> templ,
+                               v8::Local<v8::String> name,
+                               v8::Local<v8::Data> value,
+                               v8::PropertyAttribute attributes)
+```
+
+Calls the `FunctionTemplate`'s _PrototypeTemplate's_ [`Set()`](https://v8docs.nodesource.com/node-8.16/db/df7/classv8_1_1_template.html#a2db6a56597bf23c59659c0659e564ddf).
+
+<a name="api_nan_set_instance_template"></a>
+### Nan::SetInstanceTemplate()
+
+Use to add instance properties on `FunctionTemplate`'s.
+
+Signature:
+
+```c++
+void Nan::SetInstanceTemplate(v8::Local<v8::FunctionTemplate> templ,
+                              const char *name,
+                              v8::Local<v8::Data> value);
+void Nan::SetInstanceTemplate(v8::Local<v8::FunctionTemplate> templ,
+                              v8::Local<v8::String> name,
+                              v8::Local<v8::Data> value,
+                              v8::PropertyAttribute attributes)
+```
+
+Calls the `FunctionTemplate`'s _InstanceTemplate's_ [`Set()`](https://v8docs.nodesource.com/node-8.16/db/df7/classv8_1_1_template.html#a2db6a56597bf23c59659c0659e564ddf).
+
+<a name="api_nan_set_call_handler"></a>
+### Nan::SetCallHandler()
+
+Set the call-handler callback for a `v8::FunctionTemplate`.
+This callback is called whenever the function created from this FunctionTemplate is called.
+
+Signature:
+
+```c++
+void Nan::SetCallHandler(v8::Local<v8::FunctionTemplate> templ, Nan::FunctionCallback callback, v8::Local<v8::Value> data = v8::Local<v8::Value>())
+```
+
+Calls the `FunctionTemplate`'s [`SetCallHandler()`](https://v8docs.nodesource.com/node-8.16/d8/d83/classv8_1_1_function_template.html#ab7574b298db3c27fbc2ed465c08ea2f8).
+
+<a name="api_nan_set_call_as_function_handler"></a>
+### Nan::SetCallAsFunctionHandler()
+
+Sets the callback to be used when calling instances created from the `v8::ObjectTemplate` as a function.
+If no callback is set, instances behave like normal JavaScript objects that cannot be called as a function.
+
+Signature:
+
+```c++
+void Nan::SetCallAsFunctionHandler(v8::Local<v8::ObjectTemplate> templ, Nan::FunctionCallback callback, v8::Local<v8::Value> data = v8::Local<v8::Value>())
+```
+
+Calls the `ObjectTemplate`'s [`SetCallAsFunctionHandler()`](https://v8docs.nodesource.com/node-8.16/db/d5f/classv8_1_1_object_template.html#a5e9612fc80bf6db8f2da199b9b0bd04e).
+
diff --git a/node_modules/nan/doc/new.md b/node_modules/nan/doc/new.md
new file mode 100644
index 0000000..0f28a0e
--- /dev/null
+++ b/node_modules/nan/doc/new.md
@@ -0,0 +1,147 @@
+## New
+
+NAN provides a `Nan::New()` helper for the creation of new JavaScript objects in a way that's compatible across the supported versions of V8.
+
+ - <a href="#api_nan_new"><b><code>Nan::New()</code></b></a>
+ - <a href="#api_nan_undefined"><b><code>Nan::Undefined()</code></b></a>
+ - <a href="#api_nan_null"><b><code>Nan::Null()</code></b></a>
+ - <a href="#api_nan_true"><b><code>Nan::True()</code></b></a>
+ - <a href="#api_nan_false"><b><code>Nan::False()</code></b></a>
+ - <a href="#api_nan_empty_string"><b><code>Nan::EmptyString()</code></b></a>
+
+
+<a name="api_nan_new"></a>
+### Nan::New()
+
+`Nan::New()` should be used to instantiate new JavaScript objects.
+
+Refer to the specific V8 type in the [V8 documentation](https://v8docs.nodesource.com/node-8.16/d1/d83/classv8_1_1_data.html) for information on the types of arguments required for instantiation.
+
+Signatures:
+
+Return types are mostly omitted from the signatures for simplicity. In most cases the type will be contained within a `v8::Local<T>`. The following types will be contained within a `Nan::MaybeLocal<T>`: `v8::String`, `v8::Date`, `v8::RegExp`, `v8::Script`, `v8::UnboundScript`.
+
+Empty objects:
+
+```c++
+Nan::New<T>();
+```
+
+Generic single and multiple-argument:
+
+```c++
+Nan::New<T>(A0 arg0);
+Nan::New<T>(A0 arg0, A1 arg1);
+Nan::New<T>(A0 arg0, A1 arg1, A2 arg2);
+Nan::New<T>(A0 arg0, A1 arg1, A2 arg2, A3 arg3);
+```
+
+For creating `v8::FunctionTemplate` and `v8::Function` objects:
+
+_The definition of `Nan::FunctionCallback` can be found in the [Method declaration](./methods.md#api_nan_method) documentation._
+
+```c++
+Nan::New<T>(Nan::FunctionCallback callback,
+            v8::Local<v8::Value> data = v8::Local<v8::Value>());
+Nan::New<T>(Nan::FunctionCallback callback,
+            v8::Local<v8::Value> data = v8::Local<v8::Value>(),
+            A2 a2 = A2());
+```
+
+Native number types:
+
+```c++
+v8::Local<v8::Boolean> Nan::New<T>(bool value);
+v8::Local<v8::Int32> Nan::New<T>(int32_t value);
+v8::Local<v8::Uint32> Nan::New<T>(uint32_t value);
+v8::Local<v8::Number> Nan::New<T>(double value);
+```
+
+String types:
+
+```c++
+Nan::MaybeLocal<v8::String> Nan::New<T>(std::string const& value);
+Nan::MaybeLocal<v8::String> Nan::New<T>(const char * value, int length);
+Nan::MaybeLocal<v8::String> Nan::New<T>(const char * value);
+Nan::MaybeLocal<v8::String> Nan::New<T>(const uint16_t * value);
+Nan::MaybeLocal<v8::String> Nan::New<T>(const uint16_t * value, int length);
+```
+
+Specialized types:
+
+```c++
+v8::Local<v8::String> Nan::New<T>(v8::String::ExternalStringResource * value);
+v8::Local<v8::String> Nan::New<T>(Nan::ExternalOneByteStringResource * value);
+v8::Local<v8::RegExp> Nan::New<T>(v8::Local<v8::String> pattern, v8::RegExp::Flags flags);
+```
+
+Note that `Nan::ExternalOneByteStringResource` maps to [`v8::String::ExternalOneByteStringResource`](https://v8docs.nodesource.com/node-8.16/d9/db3/classv8_1_1_string_1_1_external_one_byte_string_resource.html), and `v8::String::ExternalAsciiStringResource` in older versions of V8.
+
+
+<a name="api_nan_undefined"></a>
+### Nan::Undefined()
+
+A helper method to reference the `v8::Undefined` object in a way that is compatible across all supported versions of V8.
+
+Signature:
+
+```c++
+v8::Local<v8::Primitive> Nan::Undefined()
+```
+
+<a name="api_nan_null"></a>
+### Nan::Null()
+
+A helper method to reference the `v8::Null` object in a way that is compatible across all supported versions of V8.
+
+Signature:
+
+```c++
+v8::Local<v8::Primitive> Nan::Null()
+```
+
+<a name="api_nan_true"></a>
+### Nan::True()
+
+A helper method to reference the `v8::Boolean` object representing the `true` value in a way that is compatible across all supported versions of V8.
+
+Signature:
+
+```c++
+v8::Local<v8::Boolean> Nan::True()
+```
+
+<a name="api_nan_false"></a>
+### Nan::False()
+
+A helper method to reference the `v8::Boolean` object representing the `false` value in a way that is compatible across all supported versions of V8.
+
+Signature:
+
+```c++
+v8::Local<v8::Boolean> Nan::False()
+```
+
+<a name="api_nan_empty_string"></a>
+### Nan::EmptyString()
+
+Call [`v8::String::Empty`](https://v8docs.nodesource.com/node-8.16/d2/db3/classv8_1_1_string.html#a7c1bc8886115d7ee46f1d571dd6ebc6d) to reference the empty string in a way that is compatible across all supported versions of V8.
+
+Signature:
+
+```c++
+v8::Local<v8::String> Nan::EmptyString()
+```
+
+
+<a name="api_nan_new_one_byte_string"></a>
+### Nan::NewOneByteString()
+
+An implementation of [`v8::String::NewFromOneByte()`](https://v8docs.nodesource.com/node-8.16/d2/db3/classv8_1_1_string.html#a5264d50b96d2c896ce525a734dc10f09) provided for consistent availability and API across supported versions of V8. Allocates a new string from Latin-1 data.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::String> Nan::NewOneByteString(const uint8_t * value,
+                                                  int length = -1)
+```
diff --git a/node_modules/nan/doc/node_misc.md b/node_modules/nan/doc/node_misc.md
new file mode 100644
index 0000000..17578e3
--- /dev/null
+++ b/node_modules/nan/doc/node_misc.md
@@ -0,0 +1,123 @@
+## Miscellaneous Node Helpers
+
+ - <a href="#api_nan_asyncresource"><b><code>Nan::AsyncResource</code></b></a>
+ - <a href="#api_nan_make_callback"><b><code>Nan::MakeCallback()</code></b></a>
+ - <a href="#api_nan_module_init"><b><code>NAN_MODULE_INIT()</code></b></a>
+ - <a href="#api_nan_export"><b><code>Nan::Export()</code></b></a>
+
+<a name="api_nan_asyncresource"></a>
+### Nan::AsyncResource
+
+This class is analogous to the `AsyncResource` JavaScript class exposed by Node's [async_hooks][] API.
+
+When calling back into JavaScript asynchronously, special care must be taken to ensure that the runtime can properly track
+async hops. `Nan::AsyncResource` is a class that provides an RAII wrapper around `node::EmitAsyncInit`, `node::EmitAsyncDestroy`,
+and `node::MakeCallback`. Using this mechanism to call back into JavaScript, as opposed to `Nan::MakeCallback` or
+`v8::Function::Call` ensures that the callback is executed in the correct async context. This ensures that async mechanisms
+such as domains and [async_hooks][] function correctly.
+
+Definition:
+
+```c++
+class AsyncResource {
+ public:
+  AsyncResource(v8::Local<v8::String> name,
+                v8::Local<v8::Object> resource = New<v8::Object>());
+  AsyncResource(const char* name,
+                v8::Local<v8::Object> resource = New<v8::Object>());
+  ~AsyncResource();
+
+  v8::MaybeLocal<v8::Value> runInAsyncScope(v8::Local<v8::Object> target,
+                                            v8::Local<v8::Function> func,
+                                            int argc,
+                                            v8::Local<v8::Value>* argv);
+  v8::MaybeLocal<v8::Value> runInAsyncScope(v8::Local<v8::Object> target,
+                                            v8::Local<v8::String> symbol,
+                                            int argc,
+                                            v8::Local<v8::Value>* argv);
+  v8::MaybeLocal<v8::Value> runInAsyncScope(v8::Local<v8::Object> target,
+                                            const char* method,
+                                            int argc,
+                                            v8::Local<v8::Value>* argv);
+};
+```
+
+* `name`: Identifier for the kind of resource that is being provided for diagnostics information exposed by the [async_hooks][]
+  API. This will be passed to the possible `init` hook as the `type`. To avoid name collisions with other modules we recommend
+  that the name include the name of the owning module as a prefix. For example `mysql` module could use something like
+  `mysql:batch-db-query-resource`.
+* `resource`: An optional object associated with the async work that will be passed to the possible [async_hooks][]
+  `init` hook. If this parameter is omitted, or an empty handle is provided, this object will be created automatically.
+* When calling JS on behalf of this resource, one can use `runInAsyncScope`. This will ensure that the callback runs in the
+  correct async execution context.
+* `AsyncDestroy` is automatically called when an AsyncResource object is destroyed.
+
+For more details, see the Node [async_hooks][] documentation. You might also want to take a look at the documentation for the
+[N-API counterpart][napi]. For example usage, see the `asyncresource.cpp` example in the `test/cpp` directory.
+
+<a name="api_nan_make_callback"></a>
+### Nan::MakeCallback()
+
+Deprecated wrappers around the legacy `node::MakeCallback()` APIs. Node.js 10+
+has deprecated these legacy APIs as they do not provide a mechanism to preserve
+async context.
+
+We recommend that you use the `AsyncResource` class and `AsyncResource::runInAsyncScope` instead of using `Nan::MakeCallback` or
+`v8::Function#Call()` directly. `AsyncResource` properly takes care of running the callback in the correct async execution
+context – something that is essential for functionality like domains, async_hooks and async debugging.
+
+Signatures:
+
+```c++
+NAN_DEPRECATED
+v8::Local<v8::Value> Nan::MakeCallback(v8::Local<v8::Object> target,
+                                       v8::Local<v8::Function> func,
+                                       int argc,
+                                       v8::Local<v8::Value>* argv);
+NAN_DEPRECATED
+v8::Local<v8::Value> Nan::MakeCallback(v8::Local<v8::Object> target,
+                                       v8::Local<v8::String> symbol,
+                                       int argc,
+                                       v8::Local<v8::Value>* argv);
+NAN_DEPRECATED
+v8::Local<v8::Value> Nan::MakeCallback(v8::Local<v8::Object> target,
+                                       const char* method,
+                                       int argc,
+                                       v8::Local<v8::Value>* argv);
+```
+
+
+<a name="api_nan_module_init"></a>
+### NAN_MODULE_INIT()
+
+Used to define the entry point function to a Node add-on. Creates a function with a given `name` that receives a `target` object representing the equivalent of the JavaScript `exports` object.
+
+See example below.
+
+<a name="api_nan_export"></a>
+### Nan::Export()
+
+A simple helper to register a `v8::FunctionTemplate` from a JavaScript-accessible method (see [Methods](./methods.md)) as a property on an object. Can be used in a way similar to assigning properties to `module.exports` in JavaScript.
+
+Signature:
+
+```c++
+void Export(v8::Local<v8::Object> target, const char *name, Nan::FunctionCallback f)
+```
+
+Also available as the shortcut `NAN_EXPORT` macro.
+
+Example:
+
+```c++
+NAN_METHOD(Foo) {
+  ...
+}
+
+NAN_MODULE_INIT(Init) {
+  NAN_EXPORT(target, Foo);
+}
+```
+
+[async_hooks]: https://nodejs.org/dist/latest-v9.x/docs/api/async_hooks.html
+[napi]: https://nodejs.org/dist/latest-v9.x/docs/api/n-api.html#n_api_custom_asynchronous_operations
diff --git a/node_modules/nan/doc/object_wrappers.md b/node_modules/nan/doc/object_wrappers.md
new file mode 100644
index 0000000..07d8c05
--- /dev/null
+++ b/node_modules/nan/doc/object_wrappers.md
@@ -0,0 +1,263 @@
+## Object Wrappers
+
+The `ObjectWrap` class can be used to make wrapped C++ objects and a factory of wrapped objects.
+
+ - <a href="#api_nan_object_wrap"><b><code>Nan::ObjectWrap</code></b></a>
+
+
+<a name="api_nan_object_wrap"></a>
+### Nan::ObjectWrap()
+
+A reimplementation of `node::ObjectWrap` that adds some API not present in older versions of Node. Should be preferred over `node::ObjectWrap` in all cases for consistency.
+
+Definition:
+
+```c++
+class ObjectWrap {
+ public:
+  ObjectWrap();
+
+  virtual ~ObjectWrap();
+
+  template <class T>
+  static inline T* Unwrap(v8::Local<v8::Object> handle);
+
+  inline v8::Local<v8::Object> handle();
+
+  inline Nan::Persistent<v8::Object>& persistent();
+
+ protected:
+  inline void Wrap(v8::Local<v8::Object> handle);
+
+  inline void MakeWeak();
+
+  /* Ref() marks the object as being attached to an event loop.
+   * Refed objects will not be garbage collected, even if
+   * all references are lost.
+   */
+  virtual void Ref();
+
+  /* Unref() marks an object as detached from the event loop.  This is its
+   * default state.  When an object with a "weak" reference changes from
+   * attached to detached state it will be freed. Be careful not to access
+   * the object after making this call as it might be gone!
+   * (A "weak reference" means an object that only has a
+   * persistent handle.)
+   *
+   * DO NOT CALL THIS FROM DESTRUCTOR
+   */
+  virtual void Unref();
+
+  int refs_;  // ro
+};
+```
+
+See the Node documentation on [Wrapping C++ Objects](https://nodejs.org/api/addons.html#addons_wrapping_c_objects) for more details.
+
+### This vs. Holder
+
+When calling `Unwrap`, it is important that the argument is indeed some JavaScript object which got wrapped by a `Wrap` call for this class or any derived class.
+The `Signature` installed by [`Nan::SetPrototypeMethod()`](methods.md#api_nan_set_prototype_method) does ensure that `info.Holder()` is just such an instance.
+In Node 0.12 and later, `info.This()` will also be of such a type, since otherwise the invocation will get rejected.
+However, in Node 0.10 and before it was possible to invoke a method on a JavaScript object which just had the extension type in its prototype chain.
+In such a situation, calling `Unwrap` on `info.This()` will likely lead to a failed assertion causing a crash, but could lead to even more serious corruption.
+
+On the other hand, calling `Unwrap` in an [accessor](methods.md#api_nan_set_accessor) should not use `Holder()` if the accessor is defined on the prototype.
+So either define your accessors on the instance template,
+or use `This()` after verifying that it is indeed a valid object.
+
+### Examples
+
+#### Basic
+
+```c++
+class MyObject : public Nan::ObjectWrap {
+ public:
+  static NAN_MODULE_INIT(Init) {
+    v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
+    tpl->SetClassName(Nan::New("MyObject").ToLocalChecked());
+    tpl->InstanceTemplate()->SetInternalFieldCount(1);
+
+    Nan::SetPrototypeMethod(tpl, "getHandle", GetHandle);
+    Nan::SetPrototypeMethod(tpl, "getValue", GetValue);
+
+    constructor().Reset(Nan::GetFunction(tpl).ToLocalChecked());
+    Nan::Set(target, Nan::New("MyObject").ToLocalChecked(),
+      Nan::GetFunction(tpl).ToLocalChecked());
+  }
+
+ private:
+  explicit MyObject(double value = 0) : value_(value) {}
+  ~MyObject() {}
+
+  static NAN_METHOD(New) {
+    if (info.IsConstructCall()) {
+      double value = info[0]->IsUndefined() ? 0 : Nan::To<double>(info[0]).FromJust();
+      MyObject *obj = new MyObject(value);
+      obj->Wrap(info.This());
+      info.GetReturnValue().Set(info.This());
+    } else {
+      const int argc = 1;
+      v8::Local<v8::Value> argv[argc] = {info[0]};
+      v8::Local<v8::Function> cons = Nan::New(constructor());
+      info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked());
+    }
+  }
+
+  static NAN_METHOD(GetHandle) {
+    MyObject* obj = Nan::ObjectWrap::Unwrap<MyObject>(info.Holder());
+    info.GetReturnValue().Set(obj->handle());
+  }
+
+  static NAN_METHOD(GetValue) {
+    MyObject* obj = Nan::ObjectWrap::Unwrap<MyObject>(info.Holder());
+    info.GetReturnValue().Set(obj->value_);
+  }
+
+  static inline Nan::Persistent<v8::Function> & constructor() {
+    static Nan::Persistent<v8::Function> my_constructor;
+    return my_constructor;
+  }
+
+  double value_;
+};
+
+NODE_MODULE(objectwrapper, MyObject::Init)
+```
+
+To use in Javascript:
+
+```Javascript
+var objectwrapper = require('bindings')('objectwrapper');
+
+var obj = new objectwrapper.MyObject(5);
+console.log('Should be 5: ' + obj.getValue());
+```
+
+#### Factory of wrapped objects
+
+```c++
+class MyFactoryObject : public Nan::ObjectWrap {
+ public:
+  static NAN_MODULE_INIT(Init) {
+    v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
+    tpl->InstanceTemplate()->SetInternalFieldCount(1);
+
+    Nan::SetPrototypeMethod(tpl, "getValue", GetValue);
+
+    constructor().Reset(Nan::GetFunction(tpl).ToLocalChecked());
+  }
+
+  static NAN_METHOD(NewInstance) {
+    v8::Local<v8::Function> cons = Nan::New(constructor());
+    double value = info[0]->IsNumber() ? Nan::To<double>(info[0]).FromJust() : 0;
+    const int argc = 1;
+    v8::Local<v8::Value> argv[1] = {Nan::New(value)};
+    info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked());
+  }
+
+  // Needed for the next example:
+  inline double value() const {
+    return value_;
+  }
+
+ private:
+  explicit MyFactoryObject(double value = 0) : value_(value) {}
+  ~MyFactoryObject() {}
+
+  static NAN_METHOD(New) {
+    if (info.IsConstructCall()) {
+      double value = info[0]->IsNumber() ? Nan::To<double>(info[0]).FromJust() : 0;
+      MyFactoryObject * obj = new MyFactoryObject(value);
+      obj->Wrap(info.This());
+      info.GetReturnValue().Set(info.This());
+    } else {
+      const int argc = 1;
+      v8::Local<v8::Value> argv[argc] = {info[0]};
+      v8::Local<v8::Function> cons = Nan::New(constructor());
+      info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked());
+    }
+  }
+
+  static NAN_METHOD(GetValue) {
+    MyFactoryObject* obj = ObjectWrap::Unwrap<MyFactoryObject>(info.Holder());
+    info.GetReturnValue().Set(obj->value_);
+  }
+
+  static inline Nan::Persistent<v8::Function> & constructor() {
+    static Nan::Persistent<v8::Function> my_constructor;
+    return my_constructor;
+  }
+
+  double value_;
+};
+
+NAN_MODULE_INIT(Init) {
+  MyFactoryObject::Init(target);
+  Nan::Set(target,
+    Nan::New<v8::String>("newFactoryObjectInstance").ToLocalChecked(),
+    Nan::GetFunction(
+      Nan::New<v8::FunctionTemplate>(MyFactoryObject::NewInstance)).ToLocalChecked()
+  );
+}
+
+NODE_MODULE(wrappedobjectfactory, Init)
+```
+
+To use in Javascript:
+
+```Javascript
+var wrappedobjectfactory = require('bindings')('wrappedobjectfactory');
+
+var obj = wrappedobjectfactory.newFactoryObjectInstance(10);
+console.log('Should be 10: ' + obj.getValue());
+```
+
+#### Passing wrapped objects around
+
+Use the `MyFactoryObject` class above along with the following:
+
+```c++
+static NAN_METHOD(Sum) {
+  Nan::MaybeLocal<v8::Object> maybe1 = Nan::To<v8::Object>(info[0]);
+  Nan::MaybeLocal<v8::Object> maybe2 = Nan::To<v8::Object>(info[1]);
+
+  // Quick check:
+  if (maybe1.IsEmpty() || maybe2.IsEmpty()) {
+    // return value is undefined by default
+    return;
+  }
+
+  MyFactoryObject* obj1 =
+    Nan::ObjectWrap::Unwrap<MyFactoryObject>(maybe1.ToLocalChecked());
+  MyFactoryObject* obj2 =
+    Nan::ObjectWrap::Unwrap<MyFactoryObject>(maybe2.ToLocalChecked());
+
+  info.GetReturnValue().Set(Nan::New<v8::Number>(obj1->value() + obj2->value()));
+}
+
+NAN_MODULE_INIT(Init) {
+  MyFactoryObject::Init(target);
+  Nan::Set(target,
+    Nan::New<v8::String>("newFactoryObjectInstance").ToLocalChecked(),
+    Nan::GetFunction(
+      Nan::New<v8::FunctionTemplate>(MyFactoryObject::NewInstance)).ToLocalChecked()
+  );
+  Nan::Set(target,
+    Nan::New<v8::String>("sum").ToLocalChecked(),
+    Nan::GetFunction(Nan::New<v8::FunctionTemplate>(Sum)).ToLocalChecked()
+  );
+}
+
+NODE_MODULE(myaddon, Init)
+```
+
+To use in Javascript:
+
+```Javascript
+var myaddon = require('bindings')('myaddon');
+
+var obj1 = myaddon.newFactoryObjectInstance(5);
+var obj2 = myaddon.newFactoryObjectInstance(10);
+console.log('sum of object values: ' + myaddon.sum(obj1, obj2));
+```
diff --git a/node_modules/nan/doc/persistent.md b/node_modules/nan/doc/persistent.md
new file mode 100644
index 0000000..2e13f6b
--- /dev/null
+++ b/node_modules/nan/doc/persistent.md
@@ -0,0 +1,296 @@
+## Persistent references
+
+An object reference that is independent of any `HandleScope` is a _persistent_ reference. Where a `Local` handle only lives as long as the `HandleScope` in which it was allocated, a `Persistent` handle remains valid until it is explicitly disposed.
+
+Due to the evolution of the V8 API, it is necessary for NAN to provide a wrapper implementation of the `Persistent` classes to supply compatibility across the V8 versions supported.
+
+ - <a href="#api_nan_persistent_base"><b><code>Nan::PersistentBase & v8::PersistentBase</code></b></a>
+ - <a href="#api_nan_non_copyable_persistent_traits"><b><code>Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits</code></b></a>
+ - <a href="#api_nan_copyable_persistent_traits"><b><code>Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits</code></b></a>
+ - <a href="#api_nan_persistent"><b><code>Nan::Persistent</code></b></a>
+ - <a href="#api_nan_global"><b><code>Nan::Global</code></b></a>
+ - <a href="#api_nan_weak_callback_info"><b><code>Nan::WeakCallbackInfo</code></b></a>
+ - <a href="#api_nan_weak_callback_type"><b><code>Nan::WeakCallbackType</code></b></a>
+
+Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://developers.google.com/v8/embed#handles).
+
+<a name="api_nan_persistent_base"></a>
+### Nan::PersistentBase & v8::PersistentBase
+
+A persistent handle contains a reference to a storage cell in V8 which holds an object value and which is updated by the garbage collector whenever the object is moved. A new storage cell can be created using the constructor or `Nan::PersistentBase::Reset()`. Existing handles can be disposed using an argument-less `Nan::PersistentBase::Reset()`.
+
+Definition:
+
+_(note: this is implemented as `Nan::PersistentBase` for older versions of V8 and the native `v8::PersistentBase` is used for newer versions of V8)_
+
+```c++
+template<typename T> class PersistentBase {
+ public:
+  /**
+   * If non-empty, destroy the underlying storage cell
+   */
+  void Reset();
+
+  /**
+   * If non-empty, destroy the underlying storage cell and create a new one with
+   * the contents of another if it is also non-empty
+   */
+  template<typename S> void Reset(const v8::Local<S> &other);
+
+  /**
+   * If non-empty, destroy the underlying storage cell and create a new one with
+   * the contents of another if it is also non-empty
+   */
+  template<typename S> void Reset(const PersistentBase<S> &other);
+
+  /** Returns true if the handle is empty. */
+  bool IsEmpty() const;
+
+  /**
+   * If non-empty, destroy the underlying storage cell
+   * IsEmpty() will return true after this call.
+   */
+  void Empty();
+
+  template<typename S> bool operator==(const PersistentBase<S> &that);
+
+  template<typename S> bool operator==(const v8::Local<S> &that);
+
+  template<typename S> bool operator!=(const PersistentBase<S> &that);
+
+  template<typename S> bool operator!=(const v8::Local<S> &that);
+
+   /**
+   *  Install a finalization callback on this object.
+   *  NOTE: There is no guarantee as to *when* or even *if* the callback is
+   *  invoked. The invocation is performed solely on a best effort basis.
+   *  As always, GC-based finalization should *not* be relied upon for any
+   *  critical form of resource management! At the moment you can either
+   *  specify a parameter for the callback or the location of two internal
+   *  fields in the dying object.
+   */
+  template<typename P>
+  void SetWeak(P *parameter,
+               typename WeakCallbackInfo<P>::Callback callback,
+               WeakCallbackType type);
+
+  void ClearWeak();
+
+  /**
+   * Marks the reference to this object independent. Garbage collector is free
+   * to ignore any object groups containing this object. Weak callback for an
+   * independent handle should not assume that it will be preceded by a global
+   * GC prologue callback or followed by a global GC epilogue callback.
+   */
+  void MarkIndependent() const;
+
+  bool IsIndependent() const;
+
+  /** Checks if the handle holds the only reference to an object. */
+  bool IsNearDeath() const;
+
+  /** Returns true if the handle's reference is weak.  */
+  bool IsWeak() const
+};
+```
+
+See the V8 documentation for [`PersistentBase`](https://v8docs.nodesource.com/node-8.16/d4/dca/classv8_1_1_persistent_base.html) for further information.
+
+**Tip:** To get a `v8::Local` reference to the original object back from a `PersistentBase` or `Persistent` object:
+
+```c++
+v8::Local<v8::Object> object = Nan::New(persistent);
+```
+
+<a name="api_nan_non_copyable_persistent_traits"></a>
+### Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits
+
+Default traits for `Nan::Persistent`. This class does not allow use of the a copy constructor or assignment operator. At present `kResetInDestructor` is not set, but that will change in a future version.
+
+Definition:
+
+_(note: this is implemented as `Nan::NonCopyablePersistentTraits` for older versions of V8 and the native `v8::NonCopyablePersistentTraits` is used for newer versions of V8)_
+
+```c++
+template<typename T> class NonCopyablePersistentTraits {
+ public:
+  typedef Persistent<T, NonCopyablePersistentTraits<T> > NonCopyablePersistent;
+
+  static const bool kResetInDestructor = false;
+
+  template<typename S, typename M>
+  static void Copy(const Persistent<S, M> &source,
+                   NonCopyablePersistent *dest);
+
+  template<typename O> static void Uncompilable();
+};
+```
+
+See the V8 documentation for [`NonCopyablePersistentTraits`](https://v8docs.nodesource.com/node-8.16/de/d73/classv8_1_1_non_copyable_persistent_traits.html) for further information.
+
+<a name="api_nan_copyable_persistent_traits"></a>
+### Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits
+
+A helper class of traits to allow copying and assignment of `Persistent`. This will clone the contents of storage cell, but not any of the flags, etc..
+
+Definition:
+
+_(note: this is implemented as `Nan::CopyablePersistentTraits` for older versions of V8 and the native `v8::NonCopyablePersistentTraits` is used for newer versions of V8)_
+
+```c++
+template<typename T>
+class CopyablePersistentTraits {
+ public:
+  typedef Persistent<T, CopyablePersistentTraits<T> > CopyablePersistent;
+
+  static const bool kResetInDestructor = true;
+
+  template<typename S, typename M>
+  static void Copy(const Persistent<S, M> &source,
+                   CopyablePersistent *dest);
+};
+```
+
+See the V8 documentation for [`CopyablePersistentTraits`](https://v8docs.nodesource.com/node-8.16/da/d5c/structv8_1_1_copyable_persistent_traits.html) for further information.
+
+<a name="api_nan_persistent"></a>
+### Nan::Persistent
+
+A type of `PersistentBase` which allows copy and assignment. Copy, assignment and destructor behavior is controlled by the traits class `M`.
+
+Definition:
+
+```c++
+template<typename T, typename M = NonCopyablePersistentTraits<T> >
+class Persistent;
+
+template<typename T, typename M> class Persistent : public PersistentBase<T> {
+ public:
+ /**
+  * A Persistent with no storage cell.
+  */
+  Persistent();
+
+  /**
+   * Construct a Persistent from a v8::Local. When the v8::Local is non-empty, a
+   * new storage cell is created pointing to the same object, and no flags are
+   * set.
+   */
+  template<typename S> Persistent(v8::Local<S> that);
+
+  /**
+   * Construct a Persistent from a Persistent. When the Persistent is non-empty,
+   * a new storage cell is created pointing to the same object, and no flags are
+   * set.
+   */
+  Persistent(const Persistent &that);
+
+  /**
+   * The copy constructors and assignment operator create a Persistent exactly
+   * as the Persistent constructor, but the Copy function from the traits class
+   * is called, allowing the setting of flags based on the copied Persistent.
+   */
+  Persistent &operator=(const Persistent &that);
+
+  template <typename S, typename M2>
+  Persistent &operator=(const Persistent<S, M2> &that);
+
+  /**
+   * The destructor will dispose the Persistent based on the kResetInDestructor
+   * flags in the traits class.  Since not calling dispose can result in a
+   * memory leak, it is recommended to always set this flag.
+   */
+  ~Persistent();
+};
+```
+
+See the V8 documentation for [`Persistent`](https://v8docs.nodesource.com/node-8.16/d2/d78/classv8_1_1_persistent.html) for further information.
+
+<a name="api_nan_global"></a>
+### Nan::Global
+
+A type of `PersistentBase` which has move semantics.
+
+```c++
+template<typename T> class Global : public PersistentBase<T> {
+ public:
+  /**
+   * A Global with no storage cell.
+   */
+  Global();
+
+  /**
+   * Construct a Global from a v8::Local. When the v8::Local is non-empty, a new
+   * storage cell is created pointing to the same object, and no flags are set.
+   */
+  template<typename S> Global(v8::Local<S> that);
+  /**
+   * Construct a Global from a PersistentBase. When the Persistent is non-empty,
+   * a new storage cell is created pointing to the same object, and no flags are
+   * set.
+   */
+  template<typename S> Global(const PersistentBase<S> &that);
+
+  /**
+   * Pass allows returning globals from functions, etc.
+   */
+  Global Pass();
+};
+```
+
+See the V8 documentation for [`Global`](https://v8docs.nodesource.com/node-8.16/d5/d40/classv8_1_1_global.html) for further information.
+
+<a name="api_nan_weak_callback_info"></a>
+### Nan::WeakCallbackInfo
+
+`Nan::WeakCallbackInfo` is used as an argument when setting a persistent reference as weak. You may need to free any external resources attached to the object. It is a mirror of `v8:WeakCallbackInfo` as found in newer versions of V8.
+
+Definition:
+
+```c++
+template<typename T> class WeakCallbackInfo {
+ public:
+  typedef void (*Callback)(const WeakCallbackInfo<T>& data);
+
+  v8::Isolate *GetIsolate() const;
+
+  /**
+   * Get the parameter that was associated with the weak handle.
+   */
+  T *GetParameter() const;
+
+  /**
+   * Get pointer from internal field, index can be 0 or 1.
+   */
+  void *GetInternalField(int index) const;
+};
+```
+
+Example usage:
+
+```c++
+void weakCallback(const WeakCallbackInfo<int> &data) {
+  int *parameter = data.GetParameter();
+  delete parameter;
+}
+
+Persistent<v8::Object> obj;
+int *data = new int(0);
+obj.SetWeak(data, callback, WeakCallbackType::kParameter);
+```
+
+See the V8 documentation for [`WeakCallbackInfo`](https://v8docs.nodesource.com/node-8.16/d8/d06/classv8_1_1_weak_callback_info.html) for further information.
+
+<a name="api_nan_weak_callback_type"></a>
+### Nan::WeakCallbackType
+
+Represents the type of a weak callback.
+A weak callback of type `kParameter` makes the supplied parameter to `Nan::PersistentBase::SetWeak` available through `WeakCallbackInfo::GetParameter`.
+A weak callback of type `kInternalFields` uses up to two internal fields at indices 0 and 1 on the `Nan::PersistentBase<v8::Object>` being made weak.
+Note that only `v8::Object`s and derivatives can have internal fields.
+
+Definition:
+
+```c++
+enum class WeakCallbackType { kParameter, kInternalFields };
+```
diff --git a/node_modules/nan/doc/scopes.md b/node_modules/nan/doc/scopes.md
new file mode 100644
index 0000000..84000ee
--- /dev/null
+++ b/node_modules/nan/doc/scopes.md
@@ -0,0 +1,73 @@
+## Scopes
+
+A _local handle_ is a pointer to an object. All V8 objects are accessed using handles, they are necessary because of the way the V8 garbage collector works.
+
+A handle scope can be thought of as a container for any number of handles. When you've finished with your handles, instead of deleting each one individually you can simply delete their scope.
+
+The creation of `HandleScope` objects is different across the supported versions of V8. Therefore, NAN provides its own implementations that can be used safely across these.
+
+ - <a href="#api_nan_handle_scope"><b><code>Nan::HandleScope</code></b></a>
+ - <a href="#api_nan_escapable_handle_scope"><b><code>Nan::EscapableHandleScope</code></b></a>
+
+Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://github.com/v8/v8/wiki/Embedder%27s%20Guide#handles-and-garbage-collection).
+
+<a name="api_nan_handle_scope"></a>
+### Nan::HandleScope
+
+A simple wrapper around [`v8::HandleScope`](https://v8docs.nodesource.com/node-8.16/d3/d95/classv8_1_1_handle_scope.html).
+
+Definition:
+
+```c++
+class Nan::HandleScope {
+ public:
+  Nan::HandleScope();
+  static int NumberOfHandles();
+};
+```
+
+Allocate a new `Nan::HandleScope` whenever you are creating new V8 JavaScript objects. Note that an implicit `HandleScope` is created for you on JavaScript-accessible methods so you do not need to insert one yourself.
+
+Example:
+
+```c++
+// new object is created, it needs a new scope:
+void Pointless() {
+  Nan::HandleScope scope;
+  v8::Local<v8::Object> obj = Nan::New<v8::Object>();
+}
+
+// JavaScript-accessible method already has a HandleScope
+NAN_METHOD(Pointless2) {
+  v8::Local<v8::Object> obj = Nan::New<v8::Object>();
+}
+```
+
+<a name="api_nan_escapable_handle_scope"></a>
+### Nan::EscapableHandleScope
+
+Similar to [`Nan::HandleScope`](#api_nan_handle_scope) but should be used in cases where a function needs to return a V8 JavaScript type that has been created within it.
+
+Definition:
+
+```c++
+class Nan::EscapableHandleScope {
+ public:
+  Nan::EscapableHandleScope();
+  static int NumberOfHandles();
+  template<typename T> v8::Local<T> Escape(v8::Local<T> value);
+}
+```
+
+Use `Escape(value)` to return the object.
+
+Example:
+
+```c++
+v8::Local<v8::Object> EmptyObj() {
+  Nan::EscapableHandleScope scope;
+  v8::Local<v8::Object> obj = Nan::New<v8::Object>();
+  return scope.Escape(obj);
+}
+```
+
diff --git a/node_modules/nan/doc/script.md b/node_modules/nan/doc/script.md
new file mode 100644
index 0000000..213320a
--- /dev/null
+++ b/node_modules/nan/doc/script.md
@@ -0,0 +1,38 @@
+## Script
+
+NAN provides a `v8::Script` helpers as the API has changed over the supported versions of V8.
+
+ - <a href="#api_nan_compile_script"><b><code>Nan::CompileScript()</code></b></a>
+ - <a href="#api_nan_run_script"><b><code>Nan::RunScript()</code></b></a>
+
+
+<a name="api_nan_compile_script"></a>
+### Nan::CompileScript()
+
+A wrapper around [`v8::ScriptCompiler::Compile()`](https://v8docs.nodesource.com/node-8.16/da/da5/classv8_1_1_script_compiler.html#a93f5072a0db55d881b969e9fc98e564b).
+
+Note that `Nan::BoundScript` is an alias for `v8::Script`.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<Nan::BoundScript> Nan::CompileScript(
+    v8::Local<v8::String> s,
+    const v8::ScriptOrigin& origin);
+Nan::MaybeLocal<Nan::BoundScript> Nan::CompileScript(v8::Local<v8::String> s);
+```
+
+
+<a name="api_nan_run_script"></a>
+### Nan::RunScript()
+
+Calls `script->Run()` or `script->BindToCurrentContext()->Run(Nan::GetCurrentContext())`.
+
+Note that `Nan::BoundScript` is an alias for `v8::Script` and `Nan::UnboundScript` is an alias for `v8::UnboundScript` where available and `v8::Script` on older versions of V8.
+
+Signature:
+
+```c++
+Nan::MaybeLocal<v8::Value> Nan::RunScript(v8::Local<Nan::UnboundScript> script)
+Nan::MaybeLocal<v8::Value> Nan::RunScript(v8::Local<Nan::BoundScript> script) 
+```
diff --git a/node_modules/nan/doc/string_bytes.md b/node_modules/nan/doc/string_bytes.md
new file mode 100644
index 0000000..7c1bd32
--- /dev/null
+++ b/node_modules/nan/doc/string_bytes.md
@@ -0,0 +1,62 @@
+## Strings & Bytes
+
+Miscellaneous string & byte encoding and decoding functionality provided for compatibility across supported versions of V8 and Node. Implemented by NAN to ensure that all encoding types are supported, even for older versions of Node where they are missing.
+
+ - <a href="#api_nan_encoding"><b><code>Nan::Encoding</code></b></a>
+ - <a href="#api_nan_encode"><b><code>Nan::Encode()</code></b></a>
+ - <a href="#api_nan_decode_bytes"><b><code>Nan::DecodeBytes()</code></b></a>
+ - <a href="#api_nan_decode_write"><b><code>Nan::DecodeWrite()</code></b></a>
+
+
+<a name="api_nan_encoding"></a>
+### Nan::Encoding
+
+An enum representing the supported encoding types. A copy of `node::encoding` that is consistent across versions of Node.
+
+Definition:
+
+```c++
+enum Nan::Encoding { ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER }
+```
+
+
+<a name="api_nan_encode"></a>
+### Nan::Encode()
+
+A wrapper around `node::Encode()` that provides a consistent implementation across supported versions of Node.
+
+Signature:
+
+```c++
+v8::Local<v8::Value> Nan::Encode(const void *buf,
+                                 size_t len,
+                                 enum Nan::Encoding encoding = BINARY);
+```
+
+
+<a name="api_nan_decode_bytes"></a>
+### Nan::DecodeBytes()
+
+A wrapper around `node::DecodeBytes()` that provides a consistent implementation across supported versions of Node.
+
+Signature:
+
+```c++
+ssize_t Nan::DecodeBytes(v8::Local<v8::Value> val,
+                         enum Nan::Encoding encoding = BINARY);
+```
+
+
+<a name="api_nan_decode_write"></a>
+### Nan::DecodeWrite()
+
+A wrapper around `node::DecodeWrite()` that provides a consistent implementation across supported versions of Node.
+
+Signature:
+
+```c++
+ssize_t Nan::DecodeWrite(char *buf,
+                         size_t len,
+                         v8::Local<v8::Value> val,
+                         enum Nan::Encoding encoding = BINARY);
+```
diff --git a/node_modules/nan/doc/v8_internals.md b/node_modules/nan/doc/v8_internals.md
new file mode 100644
index 0000000..08dd6d0
--- /dev/null
+++ b/node_modules/nan/doc/v8_internals.md
@@ -0,0 +1,199 @@
+## V8 internals
+
+The hooks to access V8 internals—including GC and statistics—are different across the supported versions of V8, therefore NAN provides its own hooks that call the appropriate V8 methods.
+
+ - <a href="#api_nan_gc_callback"><b><code>NAN_GC_CALLBACK()</code></b></a>
+ - <a href="#api_nan_add_gc_epilogue_callback"><b><code>Nan::AddGCEpilogueCallback()</code></b></a>
+ - <a href="#api_nan_remove_gc_epilogue_callback"><b><code>Nan::RemoveGCEpilogueCallback()</code></b></a>
+ - <a href="#api_nan_add_gc_prologue_callback"><b><code>Nan::AddGCPrologueCallback()</code></b></a>
+ - <a href="#api_nan_remove_gc_prologue_callback"><b><code>Nan::RemoveGCPrologueCallback()</code></b></a>
+ - <a href="#api_nan_get_heap_statistics"><b><code>Nan::GetHeapStatistics()</code></b></a>
+ - <a href="#api_nan_set_counter_function"><b><code>Nan::SetCounterFunction()</code></b></a>
+ - <a href="#api_nan_set_create_histogram_function"><b><code>Nan::SetCreateHistogramFunction()</code></b></a>
+ - <a href="#api_nan_set_add_histogram_sample_function"><b><code>Nan::SetAddHistogramSampleFunction()</code></b></a>
+ - <a href="#api_nan_idle_notification"><b><code>Nan::IdleNotification()</code></b></a>
+ - <a href="#api_nan_low_memory_notification"><b><code>Nan::LowMemoryNotification()</code></b></a>
+ - <a href="#api_nan_context_disposed_notification"><b><code>Nan::ContextDisposedNotification()</code></b></a>
+ - <a href="#api_nan_get_internal_field_pointer"><b><code>Nan::GetInternalFieldPointer()</code></b></a>
+ - <a href="#api_nan_set_internal_field_pointer"><b><code>Nan::SetInternalFieldPointer()</code></b></a>
+ - <a href="#api_nan_adjust_external_memory"><b><code>Nan::AdjustExternalMemory()</code></b></a>
+
+
+<a name="api_nan_gc_callback"></a>
+### NAN_GC_CALLBACK(callbackname)
+
+Use `NAN_GC_CALLBACK` to declare your callbacks for `Nan::AddGCPrologueCallback()` and `Nan::AddGCEpilogueCallback()`. Your new method receives the arguments `v8::GCType type` and `v8::GCCallbackFlags flags`.
+
+```c++
+static Nan::Persistent<Function> callback;
+
+NAN_GC_CALLBACK(gcPrologueCallback) {
+  v8::Local<Value> argv[] = { Nan::New("prologue").ToLocalChecked() };
+  Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(callback), 1, argv);
+}
+
+NAN_METHOD(Hook) {
+  callback.Reset(To<Function>(args[0]).ToLocalChecked());
+  Nan::AddGCPrologueCallback(gcPrologueCallback);
+  info.GetReturnValue().Set(info.Holder());
+}
+```
+
+<a name="api_nan_add_gc_epilogue_callback"></a>
+### Nan::AddGCEpilogueCallback()
+
+Signature:
+
+```c++
+void Nan::AddGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback, v8::GCType gc_type_filter = v8::kGCTypeAll)
+```
+
+Calls V8's [`AddGCEpilogueCallback()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a580f976e4290cead62c2fc4dd396be3e).
+
+<a name="api_nan_remove_gc_epilogue_callback"></a>
+### Nan::RemoveGCEpilogueCallback()
+
+Signature:
+
+```c++
+void Nan::RemoveGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback)
+```
+
+Calls V8's [`RemoveGCEpilogueCallback()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#adca9294555a3908e9f23c7bb0f0f284c).
+
+<a name="api_nan_add_gc_prologue_callback"></a>
+### Nan::AddGCPrologueCallback()
+
+Signature:
+
+```c++
+void Nan::AddGCPrologueCallback(v8::Isolate::GCPrologueCallback, v8::GCType gc_type_filter callback)
+```
+
+Calls V8's [`AddGCPrologueCallback()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a6dbef303603ebdb03da6998794ea05b8).
+
+<a name="api_nan_remove_gc_prologue_callback"></a>
+### Nan::RemoveGCPrologueCallback()
+
+Signature:
+
+```c++
+void Nan::RemoveGCPrologueCallback(v8::Isolate::GCPrologueCallback callback)
+```
+
+Calls V8's [`RemoveGCPrologueCallback()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a5f72c7cda21415ce062bbe5c58abe09e).
+
+<a name="api_nan_get_heap_statistics"></a>
+### Nan::GetHeapStatistics()
+
+Signature:
+
+```c++
+void Nan::GetHeapStatistics(v8::HeapStatistics *heap_statistics)
+```
+
+Calls V8's [`GetHeapStatistics()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a5593ac74687b713095c38987e5950b34).
+
+<a name="api_nan_set_counter_function"></a>
+### Nan::SetCounterFunction()
+
+Signature:
+
+```c++
+void Nan::SetCounterFunction(v8::CounterLookupCallback cb)
+```
+
+Calls V8's [`SetCounterFunction()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a045d7754e62fa0ec72ae6c259b29af94).
+
+<a name="api_nan_set_create_histogram_function"></a>
+### Nan::SetCreateHistogramFunction()
+
+Signature:
+
+```c++
+void Nan::SetCreateHistogramFunction(v8::CreateHistogramCallback cb) 
+```
+
+Calls V8's [`SetCreateHistogramFunction()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a542d67e85089cb3f92aadf032f99e732).
+
+<a name="api_nan_set_add_histogram_sample_function"></a>
+### Nan::SetAddHistogramSampleFunction()
+
+Signature:
+
+```c++
+void Nan::SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) 
+```
+
+Calls V8's [`SetAddHistogramSampleFunction()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#aeb420b690bc2c216882d6fdd00ddd3ea).
+
+<a name="api_nan_idle_notification"></a>
+### Nan::IdleNotification()
+
+Signature:
+
+```c++
+bool Nan::IdleNotification(int idle_time_in_ms)
+```
+
+Calls V8's [`IdleNotification()` or `IdleNotificationDeadline()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#ad6a2a02657f5425ad460060652a5a118) depending on V8 version.
+
+<a name="api_nan_low_memory_notification"></a>
+### Nan::LowMemoryNotification()
+
+Signature:
+
+```c++
+void Nan::LowMemoryNotification() 
+```
+
+Calls V8's [`LowMemoryNotification()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a24647f61d6b41f69668094bdcd6ea91f).
+
+<a name="api_nan_context_disposed_notification"></a>
+### Nan::ContextDisposedNotification()
+
+Signature:
+
+```c++
+void Nan::ContextDisposedNotification()
+```
+
+Calls V8's [`ContextDisposedNotification()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#ad7f5dc559866343fe6cd8db1f134d48b).
+
+<a name="api_nan_get_internal_field_pointer"></a>
+### Nan::GetInternalFieldPointer()
+
+Gets a pointer to the internal field with at `index` from a V8 `Object` handle.
+
+Signature:
+
+```c++
+void* Nan::GetInternalFieldPointer(v8::Local<v8::Object> object, int index) 
+```
+
+Calls the Object's [`GetAlignedPointerFromInternalField()` or `GetPointerFromInternalField()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#a580ea84afb26c005d6762eeb9e3c308f) depending on the version of V8.
+
+<a name="api_nan_set_internal_field_pointer"></a>
+### Nan::SetInternalFieldPointer()
+
+Sets the value of the internal field at `index` on a V8 `Object` handle.
+
+Signature:
+
+```c++
+void Nan::SetInternalFieldPointer(v8::Local<v8::Object> object, int index, void* value)
+```
+
+Calls the Object's [`SetAlignedPointerInInternalField()` or `SetPointerInInternalField()`](https://v8docs.nodesource.com/node-8.16/db/d85/classv8_1_1_object.html#ab3c57184263cf29963ef0017bec82281) depending on the version of V8.
+
+<a name="api_nan_adjust_external_memory"></a>
+### Nan::AdjustExternalMemory()
+
+Signature:
+
+```c++
+int Nan::AdjustExternalMemory(int bytesChange)
+```
+
+Calls V8's [`AdjustAmountOfExternalAllocatedMemory()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#ae1a59cac60409d3922582c4af675473e).
+
diff --git a/node_modules/nan/doc/v8_misc.md b/node_modules/nan/doc/v8_misc.md
new file mode 100644
index 0000000..1bd46d3
--- /dev/null
+++ b/node_modules/nan/doc/v8_misc.md
@@ -0,0 +1,85 @@
+## Miscellaneous V8 Helpers
+
+ - <a href="#api_nan_utf8_string"><b><code>Nan::Utf8String</code></b></a>
+ - <a href="#api_nan_get_current_context"><b><code>Nan::GetCurrentContext()</code></b></a>
+ - <a href="#api_nan_set_isolate_data"><b><code>Nan::SetIsolateData()</code></b></a>
+ - <a href="#api_nan_get_isolate_data"><b><code>Nan::GetIsolateData()</code></b></a>
+ - <a href="#api_nan_typedarray_contents"><b><code>Nan::TypedArrayContents</code></b></a>
+
+
+<a name="api_nan_utf8_string"></a>
+### Nan::Utf8String
+
+Converts an object to a UTF-8-encoded character array. If conversion to a string fails (e.g. due to an exception in the toString() method of the object) then the length() method returns 0 and the * operator returns NULL. The underlying memory used for this object is managed by the object.
+
+An implementation of [`v8::String::Utf8Value`](https://v8docs.nodesource.com/node-8.16/d4/d1b/classv8_1_1_string_1_1_utf8_value.html) that is consistent across all supported versions of V8.
+
+Definition:
+
+```c++
+class Nan::Utf8String {
+ public:
+  Nan::Utf8String(v8::Local<v8::Value> from);
+
+  int length() const;
+
+  char* operator*();
+  const char* operator*() const;
+};
+```
+
+<a name="api_nan_get_current_context"></a>
+### Nan::GetCurrentContext()
+
+A call to [`v8::Isolate::GetCurrent()->GetCurrentContext()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a81c7a1ed7001ae2a65e89107f75fd053) that works across all supported versions of V8.
+
+Signature:
+
+```c++
+v8::Local<v8::Context> Nan::GetCurrentContext()
+```
+
+<a name="api_nan_set_isolate_data"></a>
+### Nan::SetIsolateData()
+
+A helper to provide a consistent API to [`v8::Isolate#SetData()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#a7acadfe7965997e9c386a05f098fbe36).
+
+Signature:
+
+```c++
+void Nan::SetIsolateData(v8::Isolate *isolate, T *data)
+```
+
+
+<a name="api_nan_get_isolate_data"></a>
+### Nan::GetIsolateData()
+
+A helper to provide a consistent API to [`v8::Isolate#GetData()`](https://v8docs.nodesource.com/node-8.16/d5/dda/classv8_1_1_isolate.html#aabd223436bc1100a787dadaa024c6257).
+
+Signature:
+
+```c++
+T *Nan::GetIsolateData(v8::Isolate *isolate)
+```
+
+<a name="api_nan_typedarray_contents"></a>
+### Nan::TypedArrayContents<T>
+
+A helper class for accessing the contents of an ArrayBufferView (aka a typedarray) from C++.  If the input array is not a valid typedarray, then the data pointer of TypedArrayContents will default to `NULL` and the length will be 0.  If the data pointer is not compatible with the alignment requirements of type, an assertion error will fail.
+
+Note that you must store a reference to the `array` object while you are accessing its contents.
+
+Definition:
+
+```c++
+template<typename T>
+class Nan::TypedArrayContents {
+ public:
+  TypedArrayContents(v8::Local<Value> array);
+
+  size_t length() const;
+
+  T* const operator*();
+  const T* const operator*() const;
+};
+```
diff --git a/node_modules/nan/include_dirs.js b/node_modules/nan/include_dirs.js
new file mode 100644
index 0000000..4f1dfb4
--- /dev/null
+++ b/node_modules/nan/include_dirs.js
@@ -0,0 +1 @@
+console.log(require('path').relative('.', __dirname));
diff --git a/node_modules/nan/nan.h b/node_modules/nan/nan.h
new file mode 100644
index 0000000..59cd9b6
--- /dev/null
+++ b/node_modules/nan/nan.h
@@ -0,0 +1,2898 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors:
+ *   - Rod Vagg <https://github.com/rvagg>
+ *   - Benjamin Byholm <https://github.com/kkoopa>
+ *   - Trevor Norris <https://github.com/trevnorris>
+ *   - Nathan Rajlich <https://github.com/TooTallNate>
+ *   - Brett Lawson <https://github.com/brett19>
+ *   - Ben Noordhuis <https://github.com/bnoordhuis>
+ *   - David Siegel <https://github.com/agnat>
+ *   - Michael Ira Krufky <https://github.com/mkrufky>
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ *
+ * Version 2.14.2: current Node 14.13.1, Node 0.12: 0.12.18, Node 0.10: 0.10.48, iojs: 3.3.1
+ *
+ * See https://github.com/nodejs/nan for the latest update to this file
+ **********************************************************************************/
+
+#ifndef NAN_H_
+#define NAN_H_
+
+#include <node_version.h>
+
+#define NODE_0_10_MODULE_VERSION 11
+#define NODE_0_12_MODULE_VERSION 14
+#define ATOM_0_21_MODULE_VERSION 41
+#define IOJS_1_0_MODULE_VERSION  42
+#define IOJS_1_1_MODULE_VERSION  43
+#define IOJS_2_0_MODULE_VERSION  44
+#define IOJS_3_0_MODULE_VERSION  45
+#define NODE_4_0_MODULE_VERSION  46
+#define NODE_5_0_MODULE_VERSION  47
+#define NODE_6_0_MODULE_VERSION  48
+#define NODE_7_0_MODULE_VERSION  51
+#define NODE_8_0_MODULE_VERSION  57
+#define NODE_9_0_MODULE_VERSION  59
+#define NODE_10_0_MODULE_VERSION 64
+#define NODE_11_0_MODULE_VERSION 67
+#define NODE_12_0_MODULE_VERSION 72
+#define NODE_13_0_MODULE_VERSION 79
+#define NODE_14_0_MODULE_VERSION 83
+
+#ifdef _MSC_VER
+# define NAN_HAS_CPLUSPLUS_11 (_MSC_VER >= 1800)
+#else
+# define NAN_HAS_CPLUSPLUS_11 (__cplusplus >= 201103L)
+#endif
+
+#if NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION && !NAN_HAS_CPLUSPLUS_11
+# error This version of node/NAN/v8 requires a C++11 compiler
+#endif
+
+#include <uv.h>
+#include <node.h>
+#include <node_buffer.h>
+#include <node_object_wrap.h>
+#include <algorithm>
+#include <cstring>
+#include <climits>
+#include <cstdlib>
+#include <utility>
+#if defined(_MSC_VER)
+# pragma warning( push )
+# pragma warning( disable : 4530 )
+# include <queue>
+# include <string>
+# include <vector>
+# pragma warning( pop )
+#else
+# include <queue>
+# include <string>
+# include <vector>
+#endif
+
+// uv helpers
+#ifdef UV_VERSION_MAJOR
+# ifndef UV_VERSION_PATCH
+#  define UV_VERSION_PATCH 0
+# endif
+# define NAUV_UVVERSION ((UV_VERSION_MAJOR << 16) | \
+                         (UV_VERSION_MINOR <<  8) | \
+                         (UV_VERSION_PATCH))
+#else
+# define NAUV_UVVERSION 0x000b00
+#endif
+
+#if NAUV_UVVERSION < 0x000b0b
+# ifdef WIN32
+#  include <windows.h>
+# else
+#  include <pthread.h>
+# endif
+#endif
+
+namespace Nan {
+
+#define NAN_CONCAT(a, b) NAN_CONCAT_HELPER(a, b)
+#define NAN_CONCAT_HELPER(a, b) a##b
+
+#define NAN_INLINE inline  // TODO(bnoordhuis) Remove in v3.0.0.
+
+#if defined(__GNUC__) && \
+    !(defined(V8_DISABLE_DEPRECATIONS) && V8_DISABLE_DEPRECATIONS)
+# define NAN_DEPRECATED __attribute__((deprecated))
+#elif defined(_MSC_VER) && \
+    !(defined(V8_DISABLE_DEPRECATIONS) && V8_DISABLE_DEPRECATIONS)
+# define NAN_DEPRECATED __declspec(deprecated)
+#else
+# define NAN_DEPRECATED
+#endif
+
+#if NAN_HAS_CPLUSPLUS_11
+# define NAN_DISALLOW_ASSIGN(CLASS) void operator=(const CLASS&) = delete;
+# define NAN_DISALLOW_COPY(CLASS) CLASS(const CLASS&) = delete;
+# define NAN_DISALLOW_MOVE(CLASS)                                              \
+    CLASS(CLASS&&) = delete;  /* NOLINT(build/c++11) */                        \
+    void operator=(CLASS&&) = delete;
+#else
+# define NAN_DISALLOW_ASSIGN(CLASS) void operator=(const CLASS&);
+# define NAN_DISALLOW_COPY(CLASS) CLASS(const CLASS&);
+# define NAN_DISALLOW_MOVE(CLASS)
+#endif
+
+#define NAN_DISALLOW_ASSIGN_COPY(CLASS)                                        \
+    NAN_DISALLOW_ASSIGN(CLASS)                                                 \
+    NAN_DISALLOW_COPY(CLASS)
+
+#define NAN_DISALLOW_ASSIGN_MOVE(CLASS)                                        \
+    NAN_DISALLOW_ASSIGN(CLASS)                                                 \
+    NAN_DISALLOW_MOVE(CLASS)
+
+#define NAN_DISALLOW_COPY_MOVE(CLASS)                                          \
+    NAN_DISALLOW_COPY(CLASS)                                                   \
+    NAN_DISALLOW_MOVE(CLASS)
+
+#define NAN_DISALLOW_ASSIGN_COPY_MOVE(CLASS)                                   \
+    NAN_DISALLOW_ASSIGN(CLASS)                                                 \
+    NAN_DISALLOW_COPY(CLASS)                                                   \
+    NAN_DISALLOW_MOVE(CLASS)
+
+#define TYPE_CHECK(T, S)                                                       \
+    while (false) {                                                            \
+      *(static_cast<T *volatile *>(0)) = static_cast<S*>(0);                   \
+    }
+
+//=== RegistrationFunction =====================================================
+
+#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+  typedef v8::Handle<v8::Object> ADDON_REGISTER_FUNCTION_ARGS_TYPE;
+#else
+  typedef v8::Local<v8::Object> ADDON_REGISTER_FUNCTION_ARGS_TYPE;
+#endif
+
+#define NAN_MODULE_INIT(name)                                                  \
+    void name(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target)
+
+#if NODE_MAJOR_VERSION >= 10 || \
+    NODE_MAJOR_VERSION == 9 && NODE_MINOR_VERSION >= 3
+#define NAN_MODULE_WORKER_ENABLED(module_name, registration)                   \
+    extern "C" NODE_MODULE_EXPORT void                                         \
+      NAN_CONCAT(node_register_module_v, NODE_MODULE_VERSION)(                 \
+        v8::Local<v8::Object> exports, v8::Local<v8::Value> module,            \
+        v8::Local<v8::Context> context)                                        \
+    {                                                                          \
+        registration(exports);                                                 \
+    }
+#else
+#define NAN_MODULE_WORKER_ENABLED(module_name, registration)                   \
+    NODE_MODULE(module_name, registration)
+#endif
+
+//=== CallbackInfo =============================================================
+
+#include "nan_callbacks.h"  // NOLINT(build/include)
+
+//==============================================================================
+
+#if (NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION)
+typedef v8::Script             UnboundScript;
+typedef v8::Script             BoundScript;
+#else
+typedef v8::UnboundScript      UnboundScript;
+typedef v8::Script             BoundScript;
+#endif
+
+#if (NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION)
+typedef v8::String::ExternalAsciiStringResource
+    ExternalOneByteStringResource;
+#else
+typedef v8::String::ExternalOneByteStringResource
+    ExternalOneByteStringResource;
+#endif
+
+#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)
+template<typename T>
+class NonCopyablePersistentTraits :
+    public v8::NonCopyablePersistentTraits<T> {};
+template<typename T>
+class CopyablePersistentTraits :
+    public v8::CopyablePersistentTraits<T> {};
+
+template<typename T>
+class PersistentBase :
+    public v8::PersistentBase<T> {};
+
+template<typename T, typename M = v8::NonCopyablePersistentTraits<T> >
+class Persistent;
+#else
+template<typename T> class NonCopyablePersistentTraits;
+template<typename T> class PersistentBase;
+template<typename T, typename P> class WeakCallbackData;
+template<typename T, typename M = NonCopyablePersistentTraits<T> >
+class Persistent;
+#endif  // NODE_MODULE_VERSION
+
+template<typename T>
+class Maybe {
+ public:
+  inline bool IsNothing() const { return !has_value_; }
+  inline bool IsJust() const { return has_value_; }
+
+  inline T ToChecked() const { return FromJust(); }
+  inline void Check() const { FromJust(); }
+
+  inline bool To(T* out) const {
+    if (IsJust()) *out = value_;
+    return IsJust();
+  }
+
+  inline T FromJust() const {
+#if defined(V8_ENABLE_CHECKS)
+    assert(IsJust() && "FromJust is Nothing");
+#endif  // V8_ENABLE_CHECKS
+    return value_;
+  }
+
+  inline T FromMaybe(const T& default_value) const {
+    return has_value_ ? value_ : default_value;
+  }
+
+  inline bool operator==(const Maybe &other) const {
+    return (IsJust() == other.IsJust()) &&
+        (!IsJust() || FromJust() == other.FromJust());
+  }
+
+  inline bool operator!=(const Maybe &other) const {
+    return !operator==(other);
+  }
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+  // Allow implicit conversions from v8::Maybe<T> to Nan::Maybe<T>.
+  Maybe(const v8::Maybe<T>& that)  // NOLINT(runtime/explicit)
+    : has_value_(that.IsJust())
+    , value_(that.FromMaybe(T())) {}
+#endif
+
+ private:
+  Maybe() : has_value_(false) {}
+  explicit Maybe(const T& t) : has_value_(true), value_(t) {}
+  bool has_value_;
+  T value_;
+
+  template<typename U>
+  friend Maybe<U> Nothing();
+  template<typename U>
+  friend Maybe<U> Just(const U& u);
+};
+
+template<typename T>
+inline Maybe<T> Nothing() {
+  return Maybe<T>();
+}
+
+template<typename T>
+inline Maybe<T> Just(const T& t) {
+  return Maybe<T>(t);
+}
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+# include "nan_maybe_43_inl.h"  // NOLINT(build/include)
+#else
+# include "nan_maybe_pre_43_inl.h"  // NOLINT(build/include)
+#endif
+
+#include "nan_converters.h"  // NOLINT(build/include)
+#include "nan_new.h"  // NOLINT(build/include)
+
+#if NAUV_UVVERSION < 0x000b17
+#define NAUV_WORK_CB(func) \
+    void func(uv_async_t *async, int)
+#else
+#define NAUV_WORK_CB(func) \
+    void func(uv_async_t *async)
+#endif
+
+#if NAUV_UVVERSION >= 0x000b0b
+
+typedef uv_key_t nauv_key_t;
+
+inline int nauv_key_create(nauv_key_t *key) {
+  return uv_key_create(key);
+}
+
+inline void nauv_key_delete(nauv_key_t *key) {
+  uv_key_delete(key);
+}
+
+inline void* nauv_key_get(nauv_key_t *key) {
+  return uv_key_get(key);
+}
+
+inline void nauv_key_set(nauv_key_t *key, void *value) {
+  uv_key_set(key, value);
+}
+
+#else
+
+/* Implement thread local storage for older versions of libuv.
+ * This is essentially a backport of libuv commit 5d2434bf
+ * written by Ben Noordhuis, adjusted for names and inline.
+ */
+
+#ifndef WIN32
+
+typedef pthread_key_t nauv_key_t;
+
+inline int nauv_key_create(nauv_key_t* key) {
+  return -pthread_key_create(key, NULL);
+}
+
+inline void nauv_key_delete(nauv_key_t* key) {
+  if (pthread_key_delete(*key))
+    abort();
+}
+
+inline void* nauv_key_get(nauv_key_t* key) {
+  return pthread_getspecific(*key);
+}
+
+inline void nauv_key_set(nauv_key_t* key, void* value) {
+  if (pthread_setspecific(*key, value))
+    abort();
+}
+
+#else
+
+typedef struct {
+  DWORD tls_index;
+} nauv_key_t;
+
+inline int nauv_key_create(nauv_key_t* key) {
+  key->tls_index = TlsAlloc();
+  if (key->tls_index == TLS_OUT_OF_INDEXES)
+    return UV_ENOMEM;
+  return 0;
+}
+
+inline void nauv_key_delete(nauv_key_t* key) {
+  if (TlsFree(key->tls_index) == FALSE)
+    abort();
+  key->tls_index = TLS_OUT_OF_INDEXES;
+}
+
+inline void* nauv_key_get(nauv_key_t* key) {
+  void* value = TlsGetValue(key->tls_index);
+  if (value == NULL)
+    if (GetLastError() != ERROR_SUCCESS)
+      abort();
+  return value;
+}
+
+inline void nauv_key_set(nauv_key_t* key, void* value) {
+  if (TlsSetValue(key->tls_index, value) == FALSE)
+    abort();
+}
+
+#endif
+#endif
+
+#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+template<typename T>
+v8::Local<T> New(v8::Handle<T>);
+#endif
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+  typedef v8::WeakCallbackType WeakCallbackType;
+#else
+struct WeakCallbackType {
+  enum E {kParameter, kInternalFields};
+  E type;
+  WeakCallbackType(E other) : type(other) {}  // NOLINT(runtime/explicit)
+  inline bool operator==(E other) { return other == this->type; }
+  inline bool operator!=(E other) { return !operator==(other); }
+};
+#endif
+
+template<typename P> class WeakCallbackInfo;
+
+#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+# include "nan_persistent_12_inl.h"  // NOLINT(build/include)
+#else
+# include "nan_persistent_pre_12_inl.h"  // NOLINT(build/include)
+#endif
+
+namespace imp {
+  static const size_t kMaxLength = 0x3fffffff;
+  // v8::String::REPLACE_INVALID_UTF8 was introduced
+  // in node.js v0.10.29 and v0.8.27.
+#if NODE_MAJOR_VERSION > 0 || \
+    NODE_MINOR_VERSION > 10 || \
+    NODE_MINOR_VERSION == 10 && NODE_PATCH_VERSION >= 29 || \
+    NODE_MINOR_VERSION == 8 && NODE_PATCH_VERSION >= 27
+  static const unsigned kReplaceInvalidUtf8 = v8::String::REPLACE_INVALID_UTF8;
+#else
+  static const unsigned kReplaceInvalidUtf8 = 0;
+#endif
+}  // end of namespace imp
+
+//=== HandleScope ==============================================================
+
+class HandleScope {
+  v8::HandleScope scope;
+
+ public:
+#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+  inline HandleScope() : scope(v8::Isolate::GetCurrent()) {}
+  inline static int NumberOfHandles() {
+    return v8::HandleScope::NumberOfHandles(v8::Isolate::GetCurrent());
+  }
+#else
+  inline HandleScope() : scope() {}
+  inline static int NumberOfHandles() {
+    return v8::HandleScope::NumberOfHandles();
+  }
+#endif
+
+ private:
+  // Make it hard to create heap-allocated or illegal handle scopes by
+  // disallowing certain operations.
+  HandleScope(const HandleScope &);
+  void operator=(const HandleScope &);
+  void *operator new(size_t size);
+  void operator delete(void *, size_t) {
+    abort();
+  }
+};
+
+class EscapableHandleScope {
+ public:
+#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+  inline EscapableHandleScope() : scope(v8::Isolate::GetCurrent()) {}
+
+  inline static int NumberOfHandles() {
+    return v8::EscapableHandleScope::NumberOfHandles(v8::Isolate::GetCurrent());
+  }
+
+  template<typename T>
+  inline v8::Local<T> Escape(v8::Local<T> value) {
+    return scope.Escape(value);
+  }
+
+ private:
+  v8::EscapableHandleScope scope;
+#else
+  inline EscapableHandleScope() : scope() {}
+
+  inline static int NumberOfHandles() {
+    return v8::HandleScope::NumberOfHandles();
+  }
+
+  template<typename T>
+  inline v8::Local<T> Escape(v8::Local<T> value) {
+    return scope.Close(value);
+  }
+
+ private:
+  v8::HandleScope scope;
+#endif
+
+ private:
+  // Make it hard to create heap-allocated or illegal handle scopes by
+  // disallowing certain operations.
+  EscapableHandleScope(const EscapableHandleScope &);
+  void operator=(const EscapableHandleScope &);
+  void *operator new(size_t size);
+  void operator delete(void *, size_t) {
+    abort();
+  }
+};
+
+//=== TryCatch =================================================================
+
+class TryCatch {
+  v8::TryCatch try_catch_;
+  friend void FatalException(const TryCatch&);
+
+ public:
+#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
+  TryCatch() : try_catch_(v8::Isolate::GetCurrent()) {}
+#endif
+
+  inline bool HasCaught() const { return try_catch_.HasCaught(); }
+
+  inline bool CanContinue() const { return try_catch_.CanContinue(); }
+
+  inline v8::Local<v8::Value> ReThrow() {
+#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+    return New(try_catch_.ReThrow());
+#else
+    return try_catch_.ReThrow();
+#endif
+  }
+
+  inline v8::Local<v8::Value> Exception() const {
+    return try_catch_.Exception();
+  }
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+  inline v8::MaybeLocal<v8::Value> StackTrace() const {
+    v8::Isolate *isolate = v8::Isolate::GetCurrent();
+    v8::EscapableHandleScope scope(isolate);
+    return scope.Escape(try_catch_.StackTrace(isolate->GetCurrentContext())
+                            .FromMaybe(v8::Local<v8::Value>()));
+  }
+#else
+  inline MaybeLocal<v8::Value> StackTrace() const {
+    return try_catch_.StackTrace();
+  }
+#endif
+
+  inline v8::Local<v8::Message> Message() const {
+    return try_catch_.Message();
+  }
+
+  inline void Reset() { try_catch_.Reset(); }
+
+  inline void SetVerbose(bool value) { try_catch_.SetVerbose(value); }
+
+  inline void SetCaptureMessage(bool value) {
+    try_catch_.SetCaptureMessage(value);
+  }
+};
+
+v8::Local<v8::Value> MakeCallback(v8::Local<v8::Object> target,
+                                  v8::Local<v8::Function> func,
+                                  int argc,
+                                  v8::Local<v8::Value>* argv);
+v8::Local<v8::Value> MakeCallback(v8::Local<v8::Object> target,
+                                  v8::Local<v8::String> symbol,
+                                  int argc,
+                                  v8::Local<v8::Value>* argv);
+v8::Local<v8::Value> MakeCallback(v8::Local<v8::Object> target,
+                                  const char* method,
+                                  int argc,
+                                  v8::Local<v8::Value>* argv);
+
+// === AsyncResource ===========================================================
+
+class AsyncResource {
+ public:
+  AsyncResource(
+      v8::Local<v8::String> name
+    , v8::Local<v8::Object> resource = New<v8::Object>()) {
+#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+    v8::Isolate* isolate = v8::Isolate::GetCurrent();
+
+    if (resource.IsEmpty()) {
+      resource = New<v8::Object>();
+    }
+
+    context = node::EmitAsyncInit(isolate, resource, name);
+#endif
+  }
+
+  AsyncResource(
+      const char* name
+    , v8::Local<v8::Object> resource = New<v8::Object>()) {
+#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+    v8::Isolate* isolate = v8::Isolate::GetCurrent();
+
+    if (resource.IsEmpty()) {
+      resource = New<v8::Object>();
+    }
+
+    v8::Local<v8::String> name_string =
+        New<v8::String>(name).ToLocalChecked();
+    context = node::EmitAsyncInit(isolate, resource, name_string);
+#endif
+  }
+
+  ~AsyncResource() {
+#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+    v8::Isolate* isolate = v8::Isolate::GetCurrent();
+    node::EmitAsyncDestroy(isolate, context);
+#endif
+  }
+
+  inline MaybeLocal<v8::Value> runInAsyncScope(
+      v8::Local<v8::Object> target
+    , v8::Local<v8::Function> func
+    , int argc
+    , v8::Local<v8::Value>* argv) {
+#if NODE_MODULE_VERSION < NODE_9_0_MODULE_VERSION
+    return MakeCallback(target, func, argc, argv);
+#else
+    return node::MakeCallback(
+        v8::Isolate::GetCurrent(), target, func, argc, argv, context);
+#endif
+  }
+
+  inline MaybeLocal<v8::Value> runInAsyncScope(
+      v8::Local<v8::Object> target
+    , v8::Local<v8::String> symbol
+    , int argc
+    , v8::Local<v8::Value>* argv) {
+#if NODE_MODULE_VERSION < NODE_9_0_MODULE_VERSION
+    return MakeCallback(target, symbol, argc, argv);
+#else
+    return node::MakeCallback(
+        v8::Isolate::GetCurrent(), target, symbol, argc, argv, context);
+#endif
+  }
+
+  inline MaybeLocal<v8::Value> runInAsyncScope(
+      v8::Local<v8::Object> target
+    , const char* method
+    , int argc
+    , v8::Local<v8::Value>* argv) {
+#if NODE_MODULE_VERSION < NODE_9_0_MODULE_VERSION
+    return MakeCallback(target, method, argc, argv);
+#else
+    return node::MakeCallback(
+        v8::Isolate::GetCurrent(), target, method, argc, argv, context);
+#endif
+  }
+
+ private:
+  NAN_DISALLOW_ASSIGN_COPY_MOVE(AsyncResource)
+#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+  node::async_context context;
+#endif
+};
+
+inline uv_loop_t* GetCurrentEventLoop() {
+#if NODE_MAJOR_VERSION >= 10 || \
+  NODE_MAJOR_VERSION == 9 && NODE_MINOR_VERSION >= 3 || \
+  NODE_MAJOR_VERSION == 8 && NODE_MINOR_VERSION >= 10
+    return node::GetCurrentEventLoop(v8::Isolate::GetCurrent());
+#else
+    return uv_default_loop();
+#endif
+}
+
+//============ =================================================================
+
+/* node 0.12  */
+#if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION
+  inline
+  void SetCounterFunction(v8::CounterLookupCallback cb) {
+    v8::Isolate::GetCurrent()->SetCounterFunction(cb);
+  }
+
+  inline
+  void SetCreateHistogramFunction(v8::CreateHistogramCallback cb) {
+    v8::Isolate::GetCurrent()->SetCreateHistogramFunction(cb);
+  }
+
+  inline
+  void SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) {
+    v8::Isolate::GetCurrent()->SetAddHistogramSampleFunction(cb);
+  }
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+  inline bool IdleNotification(int idle_time_in_ms) {
+    return v8::Isolate::GetCurrent()->IdleNotificationDeadline(
+        idle_time_in_ms * 0.001);
+  }
+# else
+  inline bool IdleNotification(int idle_time_in_ms) {
+    return v8::Isolate::GetCurrent()->IdleNotification(idle_time_in_ms);
+  }
+#endif
+
+  inline void LowMemoryNotification() {
+    v8::Isolate::GetCurrent()->LowMemoryNotification();
+  }
+
+  inline void ContextDisposedNotification() {
+    v8::Isolate::GetCurrent()->ContextDisposedNotification();
+  }
+#else
+  inline
+  void SetCounterFunction(v8::CounterLookupCallback cb) {
+    v8::V8::SetCounterFunction(cb);
+  }
+
+  inline
+  void SetCreateHistogramFunction(v8::CreateHistogramCallback cb) {
+    v8::V8::SetCreateHistogramFunction(cb);
+  }
+
+  inline
+  void SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) {
+    v8::V8::SetAddHistogramSampleFunction(cb);
+  }
+
+  inline bool IdleNotification(int idle_time_in_ms) {
+    return v8::V8::IdleNotification(idle_time_in_ms);
+  }
+
+  inline void LowMemoryNotification() {
+    v8::V8::LowMemoryNotification();
+  }
+
+  inline void ContextDisposedNotification() {
+    v8::V8::ContextDisposedNotification();
+  }
+#endif
+
+#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)  // Node 0.12
+  inline v8::Local<v8::Primitive> Undefined() {
+# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+    EscapableHandleScope scope;
+    return scope.Escape(New(v8::Undefined(v8::Isolate::GetCurrent())));
+# else
+    return v8::Undefined(v8::Isolate::GetCurrent());
+# endif
+  }
+
+  inline v8::Local<v8::Primitive> Null() {
+# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+    EscapableHandleScope scope;
+    return scope.Escape(New(v8::Null(v8::Isolate::GetCurrent())));
+# else
+    return v8::Null(v8::Isolate::GetCurrent());
+# endif
+  }
+
+  inline v8::Local<v8::Boolean> True() {
+# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+    EscapableHandleScope scope;
+    return scope.Escape(New(v8::True(v8::Isolate::GetCurrent())));
+# else
+    return v8::True(v8::Isolate::GetCurrent());
+# endif
+  }
+
+  inline v8::Local<v8::Boolean> False() {
+# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+    EscapableHandleScope scope;
+    return scope.Escape(New(v8::False(v8::Isolate::GetCurrent())));
+# else
+    return v8::False(v8::Isolate::GetCurrent());
+# endif
+  }
+
+  inline v8::Local<v8::String> EmptyString() {
+    return v8::String::Empty(v8::Isolate::GetCurrent());
+  }
+
+  inline int AdjustExternalMemory(int bc) {
+    return static_cast<int>(
+        v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(bc));
+  }
+
+  inline void SetTemplate(
+      v8::Local<v8::Template> templ
+    , const char *name
+    , v8::Local<v8::Data> value) {
+    templ->Set(v8::Isolate::GetCurrent(), name, value);
+  }
+
+  inline void SetTemplate(
+      v8::Local<v8::Template> templ
+    , v8::Local<v8::String> name
+    , v8::Local<v8::Data> value
+    , v8::PropertyAttribute attributes) {
+    templ->Set(name, value, attributes);
+  }
+
+  inline v8::Local<v8::Context> GetCurrentContext() {
+    return v8::Isolate::GetCurrent()->GetCurrentContext();
+  }
+
+  inline void* GetInternalFieldPointer(
+      v8::Local<v8::Object> object
+    , int index) {
+    return object->GetAlignedPointerFromInternalField(index);
+  }
+
+  inline void SetInternalFieldPointer(
+      v8::Local<v8::Object> object
+    , int index
+    , void* value) {
+    object->SetAlignedPointerInInternalField(index, value);
+  }
+
+# define NAN_GC_CALLBACK(name)                                                 \
+    void name(v8::Isolate *isolate, v8::GCType type, v8::GCCallbackFlags flags)
+
+#if NODE_MODULE_VERSION <= NODE_4_0_MODULE_VERSION
+  typedef v8::Isolate::GCEpilogueCallback GCEpilogueCallback;
+  typedef v8::Isolate::GCPrologueCallback GCPrologueCallback;
+#else
+  typedef v8::Isolate::GCCallback GCEpilogueCallback;
+  typedef v8::Isolate::GCCallback GCPrologueCallback;
+#endif
+
+  inline void AddGCEpilogueCallback(
+      GCEpilogueCallback callback
+    , v8::GCType gc_type_filter = v8::kGCTypeAll) {
+    v8::Isolate::GetCurrent()->AddGCEpilogueCallback(callback, gc_type_filter);
+  }
+
+  inline void RemoveGCEpilogueCallback(
+      GCEpilogueCallback callback) {
+    v8::Isolate::GetCurrent()->RemoveGCEpilogueCallback(callback);
+  }
+
+  inline void AddGCPrologueCallback(
+      GCPrologueCallback callback
+    , v8::GCType gc_type_filter = v8::kGCTypeAll) {
+    v8::Isolate::GetCurrent()->AddGCPrologueCallback(callback, gc_type_filter);
+  }
+
+  inline void RemoveGCPrologueCallback(
+      GCPrologueCallback callback) {
+    v8::Isolate::GetCurrent()->RemoveGCPrologueCallback(callback);
+  }
+
+  inline void GetHeapStatistics(
+      v8::HeapStatistics *heap_statistics) {
+    v8::Isolate::GetCurrent()->GetHeapStatistics(heap_statistics);
+  }
+
+# define X(NAME)                                                               \
+    inline v8::Local<v8::Value> NAME(const char *msg) {                        \
+      EscapableHandleScope scope;                                              \
+      return scope.Escape(v8::Exception::NAME(New(msg).ToLocalChecked()));     \
+    }                                                                          \
+                                                                               \
+    inline                                                                     \
+    v8::Local<v8::Value> NAME(v8::Local<v8::String> msg) {                     \
+      return v8::Exception::NAME(msg);                                         \
+    }                                                                          \
+                                                                               \
+    inline void Throw ## NAME(const char *msg) {                               \
+      HandleScope scope;                                                       \
+      v8::Isolate::GetCurrent()->ThrowException(                               \
+          v8::Exception::NAME(New(msg).ToLocalChecked()));                     \
+    }                                                                          \
+                                                                               \
+    inline void Throw ## NAME(v8::Local<v8::String> msg) {                     \
+      HandleScope scope;                                                       \
+      v8::Isolate::GetCurrent()->ThrowException(                               \
+          v8::Exception::NAME(msg));                                           \
+    }
+
+  X(Error)
+  X(RangeError)
+  X(ReferenceError)
+  X(SyntaxError)
+  X(TypeError)
+
+# undef X
+
+  inline void ThrowError(v8::Local<v8::Value> error) {
+    v8::Isolate::GetCurrent()->ThrowException(error);
+  }
+
+  inline MaybeLocal<v8::Object> NewBuffer(
+      char *data
+    , size_t length
+#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION
+    , node::Buffer::FreeCallback callback
+#else
+    , node::smalloc::FreeCallback callback
+#endif
+    , void *hint
+  ) {
+    // arbitrary buffer lengths requires
+    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
+    assert(length <= imp::kMaxLength && "too large buffer");
+#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION
+    return node::Buffer::New(
+        v8::Isolate::GetCurrent(), data, length, callback, hint);
+#else
+    return node::Buffer::New(v8::Isolate::GetCurrent(), data, length, callback,
+                             hint);
+#endif
+  }
+
+  inline MaybeLocal<v8::Object> CopyBuffer(
+      const char *data
+    , uint32_t size
+  ) {
+    // arbitrary buffer lengths requires
+    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
+    assert(size <= imp::kMaxLength && "too large buffer");
+#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION
+    return node::Buffer::Copy(
+        v8::Isolate::GetCurrent(), data, size);
+#else
+    return node::Buffer::New(v8::Isolate::GetCurrent(), data, size);
+#endif
+  }
+
+  inline MaybeLocal<v8::Object> NewBuffer(uint32_t size) {
+    // arbitrary buffer lengths requires
+    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
+    assert(size <= imp::kMaxLength && "too large buffer");
+#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION
+    return node::Buffer::New(
+        v8::Isolate::GetCurrent(), size);
+#else
+    return node::Buffer::New(v8::Isolate::GetCurrent(), size);
+#endif
+  }
+
+  inline MaybeLocal<v8::Object> NewBuffer(
+      char* data
+    , uint32_t size
+  ) {
+    // arbitrary buffer lengths requires
+    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
+    assert(size <= imp::kMaxLength && "too large buffer");
+#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION
+    return node::Buffer::New(v8::Isolate::GetCurrent(), data, size);
+#else
+    return node::Buffer::Use(v8::Isolate::GetCurrent(), data, size);
+#endif
+  }
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+  inline MaybeLocal<v8::String>
+  NewOneByteString(const uint8_t * value, int length = -1) {
+    return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), value,
+          v8::NewStringType::kNormal, length);
+  }
+
+  inline MaybeLocal<BoundScript> CompileScript(
+      v8::Local<v8::String> s
+    , const v8::ScriptOrigin& origin
+  ) {
+    v8::Isolate *isolate = v8::Isolate::GetCurrent();
+    v8::EscapableHandleScope scope(isolate);
+    v8::ScriptCompiler::Source source(s, origin);
+    return scope.Escape(
+        v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &source)
+            .FromMaybe(v8::Local<BoundScript>()));
+  }
+
+  inline MaybeLocal<BoundScript> CompileScript(
+      v8::Local<v8::String> s
+  ) {
+    v8::Isolate *isolate = v8::Isolate::GetCurrent();
+    v8::EscapableHandleScope scope(isolate);
+    v8::ScriptCompiler::Source source(s);
+    return scope.Escape(
+        v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &source)
+            .FromMaybe(v8::Local<BoundScript>()));
+  }
+
+  inline MaybeLocal<v8::Value> RunScript(
+      v8::Local<UnboundScript> script
+  ) {
+    v8::Isolate *isolate = v8::Isolate::GetCurrent();
+    v8::EscapableHandleScope scope(isolate);
+    return scope.Escape(script->BindToCurrentContext()
+                            ->Run(isolate->GetCurrentContext())
+                            .FromMaybe(v8::Local<v8::Value>()));
+  }
+
+  inline MaybeLocal<v8::Value> RunScript(
+      v8::Local<BoundScript> script
+  ) {
+    v8::Isolate *isolate = v8::Isolate::GetCurrent();
+    v8::EscapableHandleScope scope(isolate);
+    return scope.Escape(script->Run(isolate->GetCurrentContext())
+                            .FromMaybe(v8::Local<v8::Value>()));
+  }
+#else
+  inline MaybeLocal<v8::String>
+  NewOneByteString(const uint8_t * value, int length = -1) {
+    return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), value,
+                                      v8::String::kNormalString, length);
+  }
+
+  inline MaybeLocal<BoundScript> CompileScript(
+      v8::Local<v8::String> s
+    , const v8::ScriptOrigin& origin
+  ) {
+    v8::ScriptCompiler::Source source(s, origin);
+    return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source);
+  }
+
+  inline MaybeLocal<BoundScript> CompileScript(
+      v8::Local<v8::String> s
+  ) {
+    v8::ScriptCompiler::Source source(s);
+    return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source);
+  }
+
+  inline MaybeLocal<v8::Value> RunScript(
+      v8::Local<UnboundScript> script
+  ) {
+    EscapableHandleScope scope;
+    return scope.Escape(script->BindToCurrentContext()->Run());
+  }
+
+  inline MaybeLocal<v8::Value> RunScript(
+      v8::Local<BoundScript> script
+  ) {
+    return script->Run();
+  }
+#endif
+
+  NAN_DEPRECATED inline v8::Local<v8::Value> MakeCallback(
+      v8::Local<v8::Object> target
+    , v8::Local<v8::Function> func
+    , int argc
+    , v8::Local<v8::Value>* argv) {
+#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+    EscapableHandleScope scope;
+    return scope.Escape(New(node::MakeCallback(
+        v8::Isolate::GetCurrent(), target, func, argc, argv)));
+#else
+# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+    AsyncResource res("nan:makeCallback");
+    return res.runInAsyncScope(target, func, argc, argv)
+        .FromMaybe(v8::Local<v8::Value>());
+# else
+    return node::MakeCallback(
+        v8::Isolate::GetCurrent(), target, func, argc, argv);
+# endif  // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+#endif  // NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+  }
+
+  NAN_DEPRECATED inline v8::Local<v8::Value> MakeCallback(
+      v8::Local<v8::Object> target
+    , v8::Local<v8::String> symbol
+    , int argc
+    , v8::Local<v8::Value>* argv) {
+#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+    EscapableHandleScope scope;
+    return scope.Escape(New(node::MakeCallback(
+        v8::Isolate::GetCurrent(), target, symbol, argc, argv)));
+#else
+# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+    AsyncResource res("nan:makeCallback");
+    return res.runInAsyncScope(target, symbol, argc, argv)
+        .FromMaybe(v8::Local<v8::Value>());
+# else
+    return node::MakeCallback(
+        v8::Isolate::GetCurrent(), target, symbol, argc, argv);
+# endif  // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+#endif  // NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+  }
+
+  NAN_DEPRECATED inline v8::Local<v8::Value> MakeCallback(
+      v8::Local<v8::Object> target
+    , const char* method
+    , int argc
+    , v8::Local<v8::Value>* argv) {
+#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+    EscapableHandleScope scope;
+    return scope.Escape(New(node::MakeCallback(
+        v8::Isolate::GetCurrent(), target, method, argc, argv)));
+#else
+# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+    AsyncResource res("nan:makeCallback");
+    return res.runInAsyncScope(target, method, argc, argv)
+        .FromMaybe(v8::Local<v8::Value>());
+# else
+    return node::MakeCallback(
+        v8::Isolate::GetCurrent(), target, method, argc, argv);
+# endif  // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+#endif  // NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+  }
+
+  inline void FatalException(const TryCatch& try_catch) {
+    node::FatalException(v8::Isolate::GetCurrent(), try_catch.try_catch_);
+  }
+
+  inline v8::Local<v8::Value> ErrnoException(
+          int errorno
+       ,  const char* syscall = NULL
+       ,  const char* message = NULL
+       ,  const char* path = NULL) {
+    return node::ErrnoException(v8::Isolate::GetCurrent(), errorno, syscall,
+            message, path);
+  }
+
+  NAN_DEPRECATED inline v8::Local<v8::Value> NanErrnoException(
+          int errorno
+       ,  const char* syscall = NULL
+       ,  const char* message = NULL
+       ,  const char* path = NULL) {
+    return ErrnoException(errorno, syscall, message, path);
+  }
+
+  template<typename T>
+  inline void SetIsolateData(
+      v8::Isolate *isolate
+    , T *data
+  ) {
+      isolate->SetData(0, data);
+  }
+
+  template<typename T>
+  inline T *GetIsolateData(
+      v8::Isolate *isolate
+  ) {
+      return static_cast<T*>(isolate->GetData(0));
+  }
+
+class Utf8String {
+ public:
+  inline explicit Utf8String(v8::Local<v8::Value> from) :
+      length_(0), str_(str_st_) {
+    HandleScope scope;
+    if (!from.IsEmpty()) {
+#if NODE_MAJOR_VERSION >= 10
+      v8::Local<v8::Context> context = GetCurrentContext();
+      v8::Local<v8::String> string =
+          from->ToString(context).FromMaybe(v8::Local<v8::String>());
+#else
+      v8::Local<v8::String> string = from->ToString();
+#endif
+      if (!string.IsEmpty()) {
+        size_t len = 3 * string->Length() + 1;
+        assert(len <= INT_MAX);
+        if (len > sizeof (str_st_)) {
+          str_ = static_cast<char*>(malloc(len));
+          assert(str_ != 0);
+        }
+        const int flags =
+            v8::String::NO_NULL_TERMINATION | imp::kReplaceInvalidUtf8;
+#if NODE_MAJOR_VERSION >= 11
+        length_ = string->WriteUtf8(v8::Isolate::GetCurrent(), str_,
+                                    static_cast<int>(len), 0, flags);
+#else
+        // See https://github.com/nodejs/nan/issues/832.
+        // Disable the warning as there is no way around it.
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable : 4996)
+#endif
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+        length_ = string->WriteUtf8(str_, static_cast<int>(len), 0, flags);
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#endif
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+#endif  // NODE_MAJOR_VERSION < 11
+        str_[length_] = '\0';
+      }
+    }
+  }
+
+  inline int length() const {
+    return length_;
+  }
+
+  inline char* operator*() { return str_; }
+  inline const char* operator*() const { return str_; }
+
+  inline ~Utf8String() {
+    if (str_ != str_st_) {
+      free(str_);
+    }
+  }
+
+ private:
+  NAN_DISALLOW_ASSIGN_COPY_MOVE(Utf8String)
+
+  int length_;
+  char *str_;
+  char str_st_[1024];
+};
+
+#else  // Node 0.8 and 0.10
+  inline v8::Local<v8::Primitive> Undefined() {
+    EscapableHandleScope scope;
+    return scope.Escape(New(v8::Undefined()));
+  }
+
+  inline v8::Local<v8::Primitive> Null() {
+    EscapableHandleScope scope;
+    return scope.Escape(New(v8::Null()));
+  }
+
+  inline v8::Local<v8::Boolean> True() {
+    EscapableHandleScope scope;
+    return scope.Escape(New(v8::True()));
+  }
+
+  inline v8::Local<v8::Boolean> False() {
+    EscapableHandleScope scope;
+    return scope.Escape(New(v8::False()));
+  }
+
+  inline v8::Local<v8::String> EmptyString() {
+    return v8::String::Empty();
+  }
+
+  inline int AdjustExternalMemory(int bc) {
+    return static_cast<int>(v8::V8::AdjustAmountOfExternalAllocatedMemory(bc));
+  }
+
+  inline void SetTemplate(
+      v8::Local<v8::Template> templ
+    , const char *name
+    , v8::Local<v8::Data> value) {
+    templ->Set(name, value);
+  }
+
+  inline void SetTemplate(
+      v8::Local<v8::Template> templ
+    , v8::Local<v8::String> name
+    , v8::Local<v8::Data> value
+    , v8::PropertyAttribute attributes) {
+    templ->Set(name, value, attributes);
+  }
+
+  inline v8::Local<v8::Context> GetCurrentContext() {
+    return v8::Context::GetCurrent();
+  }
+
+  inline void* GetInternalFieldPointer(
+      v8::Local<v8::Object> object
+    , int index) {
+    return object->GetPointerFromInternalField(index);
+  }
+
+  inline void SetInternalFieldPointer(
+      v8::Local<v8::Object> object
+    , int index
+    , void* value) {
+    object->SetPointerInInternalField(index, value);
+  }
+
+# define NAN_GC_CALLBACK(name)                                                 \
+    void name(v8::GCType type, v8::GCCallbackFlags flags)
+
+  inline void AddGCEpilogueCallback(
+    v8::GCEpilogueCallback callback
+  , v8::GCType gc_type_filter = v8::kGCTypeAll) {
+    v8::V8::AddGCEpilogueCallback(callback, gc_type_filter);
+  }
+  inline void RemoveGCEpilogueCallback(
+    v8::GCEpilogueCallback callback) {
+    v8::V8::RemoveGCEpilogueCallback(callback);
+  }
+  inline void AddGCPrologueCallback(
+    v8::GCPrologueCallback callback
+  , v8::GCType gc_type_filter = v8::kGCTypeAll) {
+    v8::V8::AddGCPrologueCallback(callback, gc_type_filter);
+  }
+  inline void RemoveGCPrologueCallback(
+    v8::GCPrologueCallback callback) {
+    v8::V8::RemoveGCPrologueCallback(callback);
+  }
+  inline void GetHeapStatistics(
+    v8::HeapStatistics *heap_statistics) {
+    v8::V8::GetHeapStatistics(heap_statistics);
+  }
+
+# define X(NAME)                                                               \
+    inline v8::Local<v8::Value> NAME(const char *msg) {                        \
+      EscapableHandleScope scope;                                              \
+      return scope.Escape(v8::Exception::NAME(New(msg).ToLocalChecked()));     \
+    }                                                                          \
+                                                                               \
+    inline                                                                     \
+    v8::Local<v8::Value> NAME(v8::Local<v8::String> msg) {                     \
+      return v8::Exception::NAME(msg);                                         \
+    }                                                                          \
+                                                                               \
+    inline void Throw ## NAME(const char *msg) {                               \
+      HandleScope scope;                                                       \
+      v8::ThrowException(v8::Exception::NAME(New(msg).ToLocalChecked()));      \
+    }                                                                          \
+                                                                               \
+    inline                                                                     \
+    void Throw ## NAME(v8::Local<v8::String> errmsg) {                         \
+      HandleScope scope;                                                       \
+      v8::ThrowException(v8::Exception::NAME(errmsg));                         \
+    }
+
+  X(Error)
+  X(RangeError)
+  X(ReferenceError)
+  X(SyntaxError)
+  X(TypeError)
+
+# undef X
+
+  inline void ThrowError(v8::Local<v8::Value> error) {
+    v8::ThrowException(error);
+  }
+
+  inline MaybeLocal<v8::Object> NewBuffer(
+      char *data
+    , size_t length
+    , node::Buffer::free_callback callback
+    , void *hint
+  ) {
+    EscapableHandleScope scope;
+    // arbitrary buffer lengths requires
+    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
+    assert(length <= imp::kMaxLength && "too large buffer");
+    return scope.Escape(
+        New(node::Buffer::New(data, length, callback, hint)->handle_));
+  }
+
+  inline MaybeLocal<v8::Object> CopyBuffer(
+      const char *data
+    , uint32_t size
+  ) {
+    EscapableHandleScope scope;
+    // arbitrary buffer lengths requires
+    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
+    assert(size <= imp::kMaxLength && "too large buffer");
+#if NODE_MODULE_VERSION >= NODE_0_10_MODULE_VERSION
+    return scope.Escape(New(node::Buffer::New(data, size)->handle_));
+#else
+    return scope.Escape(
+        New(node::Buffer::New(const_cast<char *>(data), size)->handle_));
+#endif
+  }
+
+  inline MaybeLocal<v8::Object> NewBuffer(uint32_t size) {
+    // arbitrary buffer lengths requires
+    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
+    EscapableHandleScope scope;
+    assert(size <= imp::kMaxLength && "too large buffer");
+    return scope.Escape(New(node::Buffer::New(size)->handle_));
+  }
+
+  inline void FreeData(char *data, void *hint) {
+    (void) hint;  // unused
+    delete[] data;
+  }
+
+  inline MaybeLocal<v8::Object> NewBuffer(
+      char* data
+    , uint32_t size
+  ) {
+    EscapableHandleScope scope;
+    // arbitrary buffer lengths requires
+    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
+    assert(size <= imp::kMaxLength && "too large buffer");
+    return scope.Escape(
+        New(node::Buffer::New(data, size, FreeData, NULL)->handle_));
+  }
+
+namespace imp {
+inline void
+widenString(std::vector<uint16_t> *ws, const uint8_t *s, int l) {
+  size_t len = static_cast<size_t>(l);
+  if (l < 0) {
+    len = strlen(reinterpret_cast<const char*>(s));
+  }
+  assert(len <= INT_MAX && "string too long");
+  ws->resize(len);
+  std::copy(s, s + len, ws->begin());  // NOLINT(build/include_what_you_use)
+}
+}  // end of namespace imp
+
+  inline MaybeLocal<v8::String>
+  NewOneByteString(const uint8_t * value, int length = -1) {
+    std::vector<uint16_t> wideString;  // NOLINT(build/include_what_you_use)
+    imp::widenString(&wideString, value, length);
+    return v8::String::New(wideString.data(),
+                           static_cast<int>(wideString.size()));
+  }
+
+  inline MaybeLocal<BoundScript> CompileScript(
+      v8::Local<v8::String> s
+    , const v8::ScriptOrigin& origin
+  ) {
+    return v8::Script::Compile(s, const_cast<v8::ScriptOrigin *>(&origin));
+  }
+
+  inline MaybeLocal<BoundScript> CompileScript(
+    v8::Local<v8::String> s
+  ) {
+    return v8::Script::Compile(s);
+  }
+
+  inline
+  MaybeLocal<v8::Value> RunScript(v8::Local<v8::Script> script) {
+    return script->Run();
+  }
+
+  inline v8::Local<v8::Value> MakeCallback(
+      v8::Local<v8::Object> target
+    , v8::Local<v8::Function> func
+    , int argc
+    , v8::Local<v8::Value>* argv) {
+    v8::HandleScope scope;
+    return scope.Close(New(node::MakeCallback(target, func, argc, argv)));
+  }
+
+  inline v8::Local<v8::Value> MakeCallback(
+      v8::Local<v8::Object> target
+    , v8::Local<v8::String> symbol
+    , int argc
+    , v8::Local<v8::Value>* argv) {
+    v8::HandleScope scope;
+    return scope.Close(New(node::MakeCallback(target, symbol, argc, argv)));
+  }
+
+  inline v8::Local<v8::Value> MakeCallback(
+      v8::Local<v8::Object> target
+    , const char* method
+    , int argc
+    , v8::Local<v8::Value>* argv) {
+    v8::HandleScope scope;
+    return scope.Close(New(node::MakeCallback(target, method, argc, argv)));
+  }
+
+  inline void FatalException(const TryCatch& try_catch) {
+    node::FatalException(const_cast<v8::TryCatch &>(try_catch.try_catch_));
+  }
+
+  inline v8::Local<v8::Value> ErrnoException(
+          int errorno
+       ,  const char* syscall = NULL
+       ,  const char* message = NULL
+       ,  const char* path = NULL) {
+    return node::ErrnoException(errorno, syscall, message, path);
+  }
+
+  NAN_DEPRECATED inline v8::Local<v8::Value> NanErrnoException(
+          int errorno
+       ,  const char* syscall = NULL
+       ,  const char* message = NULL
+       ,  const char* path = NULL) {
+    return ErrnoException(errorno, syscall, message, path);
+  }
+
+
+  template<typename T>
+  inline void SetIsolateData(
+      v8::Isolate *isolate
+    , T *data
+  ) {
+      isolate->SetData(data);
+  }
+
+  template<typename T>
+  inline T *GetIsolateData(
+      v8::Isolate *isolate
+  ) {
+      return static_cast<T*>(isolate->GetData());
+  }
+
+class Utf8String {
+ public:
+  inline explicit Utf8String(v8::Local<v8::Value> from) :
+      length_(0), str_(str_st_) {
+    v8::HandleScope scope;
+    if (!from.IsEmpty()) {
+      v8::Local<v8::String> string = from->ToString();
+      if (!string.IsEmpty()) {
+        size_t len = 3 * string->Length() + 1;
+        assert(len <= INT_MAX);
+        if (len > sizeof (str_st_)) {
+          str_ = static_cast<char*>(malloc(len));
+          assert(str_ != 0);
+        }
+        const int flags =
+            v8::String::NO_NULL_TERMINATION | imp::kReplaceInvalidUtf8;
+        length_ = string->WriteUtf8(str_, static_cast<int>(len), 0, flags);
+        str_[length_] = '\0';
+      }
+    }
+  }
+
+  inline int length() const {
+    return length_;
+  }
+
+  inline char* operator*() { return str_; }
+  inline const char* operator*() const { return str_; }
+
+  inline ~Utf8String() {
+    if (str_ != str_st_) {
+      free(str_);
+    }
+  }
+
+ private:
+  NAN_DISALLOW_ASSIGN_COPY_MOVE(Utf8String)
+
+  int length_;
+  char *str_;
+  char str_st_[1024];
+};
+
+#endif  // NODE_MODULE_VERSION
+
+typedef void (*FreeCallback)(char *data, void *hint);
+
+typedef const FunctionCallbackInfo<v8::Value>& NAN_METHOD_ARGS_TYPE;
+typedef void NAN_METHOD_RETURN_TYPE;
+
+typedef const PropertyCallbackInfo<v8::Value>& NAN_GETTER_ARGS_TYPE;
+typedef void NAN_GETTER_RETURN_TYPE;
+
+typedef const PropertyCallbackInfo<void>& NAN_SETTER_ARGS_TYPE;
+typedef void NAN_SETTER_RETURN_TYPE;
+
+typedef const PropertyCallbackInfo<v8::Value>&
+    NAN_PROPERTY_GETTER_ARGS_TYPE;
+typedef void NAN_PROPERTY_GETTER_RETURN_TYPE;
+
+typedef const PropertyCallbackInfo<v8::Value>&
+    NAN_PROPERTY_SETTER_ARGS_TYPE;
+typedef void NAN_PROPERTY_SETTER_RETURN_TYPE;
+
+typedef const PropertyCallbackInfo<v8::Array>&
+    NAN_PROPERTY_ENUMERATOR_ARGS_TYPE;
+typedef void NAN_PROPERTY_ENUMERATOR_RETURN_TYPE;
+
+typedef const PropertyCallbackInfo<v8::Boolean>&
+    NAN_PROPERTY_DELETER_ARGS_TYPE;
+typedef void NAN_PROPERTY_DELETER_RETURN_TYPE;
+
+typedef const PropertyCallbackInfo<v8::Integer>&
+    NAN_PROPERTY_QUERY_ARGS_TYPE;
+typedef void NAN_PROPERTY_QUERY_RETURN_TYPE;
+
+typedef const PropertyCallbackInfo<v8::Value>& NAN_INDEX_GETTER_ARGS_TYPE;
+typedef void NAN_INDEX_GETTER_RETURN_TYPE;
+
+typedef const PropertyCallbackInfo<v8::Value>& NAN_INDEX_SETTER_ARGS_TYPE;
+typedef void NAN_INDEX_SETTER_RETURN_TYPE;
+
+typedef const PropertyCallbackInfo<v8::Array>&
+    NAN_INDEX_ENUMERATOR_ARGS_TYPE;
+typedef void NAN_INDEX_ENUMERATOR_RETURN_TYPE;
+
+typedef const PropertyCallbackInfo<v8::Boolean>&
+    NAN_INDEX_DELETER_ARGS_TYPE;
+typedef void NAN_INDEX_DELETER_RETURN_TYPE;
+
+typedef const PropertyCallbackInfo<v8::Integer>&
+    NAN_INDEX_QUERY_ARGS_TYPE;
+typedef void NAN_INDEX_QUERY_RETURN_TYPE;
+
+#define NAN_METHOD(name)                                                       \
+    Nan::NAN_METHOD_RETURN_TYPE name(Nan::NAN_METHOD_ARGS_TYPE info)
+#define NAN_GETTER(name)                                                       \
+    Nan::NAN_GETTER_RETURN_TYPE name(                                          \
+        v8::Local<v8::String> property                                         \
+      , Nan::NAN_GETTER_ARGS_TYPE info)
+#define NAN_SETTER(name)                                                       \
+    Nan::NAN_SETTER_RETURN_TYPE name(                                          \
+        v8::Local<v8::String> property                                         \
+      , v8::Local<v8::Value> value                                             \
+      , Nan::NAN_SETTER_ARGS_TYPE info)
+#define NAN_PROPERTY_GETTER(name)                                              \
+    Nan::NAN_PROPERTY_GETTER_RETURN_TYPE name(                                 \
+        v8::Local<v8::String> property                                         \
+      , Nan::NAN_PROPERTY_GETTER_ARGS_TYPE info)
+#define NAN_PROPERTY_SETTER(name)                                              \
+    Nan::NAN_PROPERTY_SETTER_RETURN_TYPE name(                                 \
+        v8::Local<v8::String> property                                         \
+      , v8::Local<v8::Value> value                                             \
+      , Nan::NAN_PROPERTY_SETTER_ARGS_TYPE info)
+#define NAN_PROPERTY_ENUMERATOR(name)                                          \
+    Nan::NAN_PROPERTY_ENUMERATOR_RETURN_TYPE name(                             \
+        Nan::NAN_PROPERTY_ENUMERATOR_ARGS_TYPE info)
+#define NAN_PROPERTY_DELETER(name)                                             \
+    Nan::NAN_PROPERTY_DELETER_RETURN_TYPE name(                                \
+        v8::Local<v8::String> property                                         \
+      , Nan::NAN_PROPERTY_DELETER_ARGS_TYPE info)
+#define NAN_PROPERTY_QUERY(name)                                               \
+    Nan::NAN_PROPERTY_QUERY_RETURN_TYPE name(                                  \
+        v8::Local<v8::String> property                                         \
+      , Nan::NAN_PROPERTY_QUERY_ARGS_TYPE info)
+# define NAN_INDEX_GETTER(name)                                                \
+    Nan::NAN_INDEX_GETTER_RETURN_TYPE name(                                    \
+        uint32_t index                                                         \
+      , Nan::NAN_INDEX_GETTER_ARGS_TYPE info)
+#define NAN_INDEX_SETTER(name)                                                 \
+    Nan::NAN_INDEX_SETTER_RETURN_TYPE name(                                    \
+        uint32_t index                                                         \
+      , v8::Local<v8::Value> value                                             \
+      , Nan::NAN_INDEX_SETTER_ARGS_TYPE info)
+#define NAN_INDEX_ENUMERATOR(name)                                             \
+    Nan::NAN_INDEX_ENUMERATOR_RETURN_TYPE                                      \
+    name(Nan::NAN_INDEX_ENUMERATOR_ARGS_TYPE info)
+#define NAN_INDEX_DELETER(name)                                                \
+    Nan::NAN_INDEX_DELETER_RETURN_TYPE name(                                   \
+        uint32_t index                                                         \
+      , Nan::NAN_INDEX_DELETER_ARGS_TYPE info)
+#define NAN_INDEX_QUERY(name)                                                  \
+    Nan::NAN_INDEX_QUERY_RETURN_TYPE name(                                     \
+        uint32_t index                                                         \
+      , Nan::NAN_INDEX_QUERY_ARGS_TYPE info)
+
+class Callback {
+ public:
+  Callback() {}
+
+  explicit Callback(const v8::Local<v8::Function> &fn) : handle_(fn) {}
+
+  ~Callback() {
+    handle_.Reset();
+  }
+
+  bool operator==(const Callback &other) const {
+    return handle_ == other.handle_;
+  }
+
+  bool operator!=(const Callback &other) const {
+    return !operator==(other);
+  }
+
+  inline
+  v8::Local<v8::Function> operator*() const { return GetFunction(); }
+
+  NAN_DEPRECATED inline v8::Local<v8::Value> operator()(
+      v8::Local<v8::Object> target
+    , int argc = 0
+    , v8::Local<v8::Value> argv[] = 0) const {
+#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+    v8::Isolate *isolate = v8::Isolate::GetCurrent();
+# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+    AsyncResource async("nan:Callback:operator()");
+    return Call_(isolate, target, argc, argv, &async)
+        .FromMaybe(v8::Local<v8::Value>());
+# else
+    return Call_(isolate, target, argc, argv);
+# endif  // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+#else
+    return Call_(target, argc, argv);
+#endif  //  NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+  }
+
+  NAN_DEPRECATED inline v8::Local<v8::Value> operator()(
+      int argc = 0
+    , v8::Local<v8::Value> argv[] = 0) const {
+#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+    v8::Isolate *isolate = v8::Isolate::GetCurrent();
+    v8::EscapableHandleScope scope(isolate);
+# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+    AsyncResource async("nan:Callback:operator()");
+    return scope.Escape(Call_(isolate, isolate->GetCurrentContext()->Global(),
+                              argc, argv, &async)
+                            .FromMaybe(v8::Local<v8::Value>()));
+# else
+    return scope.Escape(
+        Call_(isolate, isolate->GetCurrentContext()->Global(), argc, argv));
+# endif  // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+#else
+    v8::HandleScope scope;
+    return scope.Close(Call_(v8::Context::GetCurrent()->Global(), argc, argv));
+#endif  //  NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+  }
+
+  inline MaybeLocal<v8::Value> operator()(
+      AsyncResource* resource
+    , int argc = 0
+    , v8::Local<v8::Value> argv[] = 0) const {
+    return this->Call(argc, argv, resource);
+  }
+
+  inline MaybeLocal<v8::Value> operator()(
+      AsyncResource* resource
+    , v8::Local<v8::Object> target
+    , int argc = 0
+    , v8::Local<v8::Value> argv[] = 0) const {
+    return this->Call(target, argc, argv, resource);
+  }
+
+  // TODO(kkoopa): remove
+  inline void SetFunction(const v8::Local<v8::Function> &fn) {
+    Reset(fn);
+  }
+
+  inline void Reset(const v8::Local<v8::Function> &fn) {
+    handle_.Reset(fn);
+  }
+
+  inline void Reset() {
+    handle_.Reset();
+  }
+
+  inline v8::Local<v8::Function> GetFunction() const {
+    return New(handle_);
+  }
+
+  inline bool IsEmpty() const {
+    return handle_.IsEmpty();
+  }
+
+  // Deprecated: For async callbacks Use the versions that accept an
+  // AsyncResource. If this callback does not correspond to an async resource,
+  // that is, it is a synchronous function call on a non-empty JS stack, you
+  // should Nan::Call instead.
+  NAN_DEPRECATED inline v8::Local<v8::Value>
+  Call(v8::Local<v8::Object> target
+     , int argc
+     , v8::Local<v8::Value> argv[]) const {
+#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+    v8::Isolate *isolate = v8::Isolate::GetCurrent();
+# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+    AsyncResource async("nan:Callback:Call");
+    return Call_(isolate, target, argc, argv, &async)
+        .FromMaybe(v8::Local<v8::Value>());
+# else
+    return Call_(isolate, target, argc, argv);
+# endif  // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+#else
+    return Call_(target, argc, argv);
+#endif
+  }
+
+  // Deprecated: For async callbacks Use the versions that accept an
+  // AsyncResource. If this callback does not correspond to an async resource,
+  // that is, it is a synchronous function call on a non-empty JS stack, you
+  // should Nan::Call instead.
+  NAN_DEPRECATED inline v8::Local<v8::Value>
+  Call(int argc, v8::Local<v8::Value> argv[]) const {
+#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+    v8::Isolate *isolate = v8::Isolate::GetCurrent();
+    v8::EscapableHandleScope scope(isolate);
+# if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+    AsyncResource async("nan:Callback:Call");
+    return scope.Escape(Call_(isolate, isolate->GetCurrentContext()->Global(),
+                              argc, argv, &async)
+                            .FromMaybe(v8::Local<v8::Value>()));
+# else
+    return scope.Escape(
+        Call_(isolate, isolate->GetCurrentContext()->Global(), argc, argv));
+# endif  // NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+#else
+    v8::HandleScope scope;
+    return scope.Close(Call_(v8::Context::GetCurrent()->Global(), argc, argv));
+#endif
+  }
+
+  inline MaybeLocal<v8::Value>
+  Call(v8::Local<v8::Object> target
+     , int argc
+     , v8::Local<v8::Value> argv[]
+     , AsyncResource* resource) const {
+#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+    v8::Isolate* isolate = v8::Isolate::GetCurrent();
+    return Call_(isolate, target, argc, argv, resource);
+#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+    v8::Isolate *isolate = v8::Isolate::GetCurrent();
+    return Call_(isolate, target, argc, argv);
+#else
+    return Call_(target, argc, argv);
+#endif
+  }
+
+  inline MaybeLocal<v8::Value>
+  Call(int argc, v8::Local<v8::Value> argv[], AsyncResource* resource) const {
+#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+    v8::Isolate* isolate = v8::Isolate::GetCurrent();
+    return Call(isolate->GetCurrentContext()->Global(), argc, argv, resource);
+#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+    v8::Isolate *isolate = v8::Isolate::GetCurrent();
+    v8::EscapableHandleScope scope(isolate);
+    return scope.Escape(
+        Call_(isolate, isolate->GetCurrentContext()->Global(), argc, argv));
+#else
+    v8::HandleScope scope;
+    return scope.Close(Call_(v8::Context::GetCurrent()->Global(), argc, argv));
+#endif
+  }
+
+ private:
+  NAN_DISALLOW_ASSIGN_COPY_MOVE(Callback)
+  Persistent<v8::Function> handle_;
+
+#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+  MaybeLocal<v8::Value> Call_(v8::Isolate *isolate
+                            , v8::Local<v8::Object> target
+                            , int argc
+                            , v8::Local<v8::Value> argv[]
+                            , AsyncResource* resource) const {
+    EscapableHandleScope scope;
+    v8::Local<v8::Function> func = New(handle_);
+    auto maybe = resource->runInAsyncScope(target, func, argc, argv);
+    v8::Local<v8::Value> local;
+    if (!maybe.ToLocal(&local)) return MaybeLocal<v8::Value>();
+    return scope.Escape(local);
+  }
+#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+  v8::Local<v8::Value> Call_(v8::Isolate *isolate
+                           , v8::Local<v8::Object> target
+                           , int argc
+                           , v8::Local<v8::Value> argv[]) const {
+    EscapableHandleScope scope;
+
+    v8::Local<v8::Function> callback = New(handle_);
+# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+    return scope.Escape(New(node::MakeCallback(
+        isolate
+      , target
+      , callback
+      , argc
+      , argv
+    )));
+# else
+    return scope.Escape(node::MakeCallback(
+        isolate
+      , target
+      , callback
+      , argc
+      , argv
+    ));
+# endif
+  }
+#else
+  v8::Local<v8::Value> Call_(v8::Local<v8::Object> target
+                           , int argc
+                           , v8::Local<v8::Value> argv[]) const {
+    EscapableHandleScope scope;
+
+    v8::Local<v8::Function> callback = New(handle_);
+    return scope.Escape(New(node::MakeCallback(
+        target
+      , callback
+      , argc
+      , argv
+    )));
+  }
+#endif
+};
+
+inline MaybeLocal<v8::Value> Call(
+    const Nan::Callback& callback
+  , v8::Local<v8::Object> recv
+  , int argc
+  , v8::Local<v8::Value> argv[]) {
+  return Call(*callback, recv, argc, argv);
+}
+
+inline MaybeLocal<v8::Value> Call(
+    const Nan::Callback& callback
+  , int argc
+  , v8::Local<v8::Value> argv[]) {
+#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+  v8::Isolate* isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(
+      Call(*callback, isolate->GetCurrentContext()->Global(), argc, argv)
+          .FromMaybe(v8::Local<v8::Value>()));
+#else
+  EscapableHandleScope scope;
+  return scope.Escape(
+      Call(*callback, v8::Context::GetCurrent()->Global(), argc, argv)
+          .FromMaybe(v8::Local<v8::Value>()));
+#endif
+}
+
+inline MaybeLocal<v8::Value> Call(
+    v8::Local<v8::String> symbol
+  , v8::Local<v8::Object> recv
+  , int argc
+  , v8::Local<v8::Value> argv[]) {
+  EscapableHandleScope scope;
+  v8::Local<v8::Value> fn_v =
+      Get(recv, symbol).FromMaybe(v8::Local<v8::Value>());
+  if (fn_v.IsEmpty() || !fn_v->IsFunction()) return v8::Local<v8::Value>();
+  v8::Local<v8::Function> fn = fn_v.As<v8::Function>();
+  return scope.Escape(
+      Call(fn, recv, argc, argv).FromMaybe(v8::Local<v8::Value>()));
+}
+
+inline MaybeLocal<v8::Value> Call(
+    const char* method
+  , v8::Local<v8::Object> recv
+  , int argc
+  , v8::Local<v8::Value> argv[]) {
+  EscapableHandleScope scope;
+  v8::Local<v8::String> method_string =
+      New<v8::String>(method).ToLocalChecked();
+  return scope.Escape(
+      Call(method_string, recv, argc, argv).FromMaybe(v8::Local<v8::Value>()));
+}
+
+/* abstract */ class AsyncWorker {
+ public:
+  explicit AsyncWorker(Callback *callback_,
+                       const char* resource_name = "nan:AsyncWorker")
+      : callback(callback_), errmsg_(NULL) {
+    request.data = this;
+
+    HandleScope scope;
+    v8::Local<v8::Object> obj = New<v8::Object>();
+    persistentHandle.Reset(obj);
+    async_resource = new AsyncResource(resource_name, obj);
+  }
+
+  virtual ~AsyncWorker() {
+    HandleScope scope;
+
+    if (!persistentHandle.IsEmpty())
+      persistentHandle.Reset();
+    delete callback;
+    delete[] errmsg_;
+    delete async_resource;
+  }
+
+  virtual void WorkComplete() {
+    HandleScope scope;
+
+    if (errmsg_ == NULL)
+      HandleOKCallback();
+    else
+      HandleErrorCallback();
+    delete callback;
+    callback = NULL;
+  }
+
+  inline void SaveToPersistent(
+      const char *key, const v8::Local<v8::Value> &value) {
+    HandleScope scope;
+    Set(New(persistentHandle), New(key).ToLocalChecked(), value).FromJust();
+  }
+
+  inline void SaveToPersistent(
+      const v8::Local<v8::String> &key, const v8::Local<v8::Value> &value) {
+    HandleScope scope;
+    Set(New(persistentHandle), key, value).FromJust();
+  }
+
+  inline void SaveToPersistent(
+      uint32_t index, const v8::Local<v8::Value> &value) {
+    HandleScope scope;
+    Set(New(persistentHandle), index, value).FromJust();
+  }
+
+  inline v8::Local<v8::Value> GetFromPersistent(const char *key) const {
+    EscapableHandleScope scope;
+    return scope.Escape(
+        Get(New(persistentHandle), New(key).ToLocalChecked())
+        .FromMaybe(v8::Local<v8::Value>()));
+  }
+
+  inline v8::Local<v8::Value>
+  GetFromPersistent(const v8::Local<v8::String> &key) const {
+    EscapableHandleScope scope;
+    return scope.Escape(
+        Get(New(persistentHandle), key)
+        .FromMaybe(v8::Local<v8::Value>()));
+  }
+
+  inline v8::Local<v8::Value> GetFromPersistent(uint32_t index) const {
+    EscapableHandleScope scope;
+    return scope.Escape(
+        Get(New(persistentHandle), index)
+        .FromMaybe(v8::Local<v8::Value>()));
+  }
+
+  virtual void Execute() = 0;
+
+  uv_work_t request;
+
+  virtual void Destroy() {
+      delete this;
+  }
+
+ protected:
+  Persistent<v8::Object> persistentHandle;
+  Callback *callback;
+  AsyncResource *async_resource;
+
+  virtual void HandleOKCallback() {
+    HandleScope scope;
+
+    callback->Call(0, NULL, async_resource);
+  }
+
+  virtual void HandleErrorCallback() {
+    HandleScope scope;
+
+    v8::Local<v8::Value> argv[] = {
+      v8::Exception::Error(New<v8::String>(ErrorMessage()).ToLocalChecked())
+    };
+    callback->Call(1, argv, async_resource);
+  }
+
+  void SetErrorMessage(const char *msg) {
+    delete[] errmsg_;
+
+    size_t size = strlen(msg) + 1;
+    errmsg_ = new char[size];
+    memcpy(errmsg_, msg, size);
+  }
+
+  const char* ErrorMessage() const {
+    return errmsg_;
+  }
+
+ private:
+  NAN_DISALLOW_ASSIGN_COPY_MOVE(AsyncWorker)
+  char *errmsg_;
+};
+
+/* abstract */ class AsyncBareProgressWorkerBase : public AsyncWorker {
+ public:
+  explicit AsyncBareProgressWorkerBase(
+      Callback *callback_,
+      const char* resource_name = "nan:AsyncBareProgressWorkerBase")
+      : AsyncWorker(callback_, resource_name) {
+    uv_async_init(
+        GetCurrentEventLoop()
+      , &async
+      , AsyncProgress_
+    );
+    async.data = this;
+  }
+
+  virtual ~AsyncBareProgressWorkerBase() {
+  }
+
+  virtual void WorkProgress() = 0;
+
+  virtual void Destroy() {
+      uv_close(reinterpret_cast<uv_handle_t*>(&async), AsyncClose_);
+  }
+
+ private:
+  inline static NAUV_WORK_CB(AsyncProgress_) {
+    AsyncBareProgressWorkerBase *worker =
+            static_cast<AsyncBareProgressWorkerBase*>(async->data);
+    worker->WorkProgress();
+  }
+
+  inline static void AsyncClose_(uv_handle_t* handle) {
+    AsyncBareProgressWorkerBase *worker =
+            static_cast<AsyncBareProgressWorkerBase*>(handle->data);
+    delete worker;
+  }
+
+ protected:
+  uv_async_t async;
+};
+
+template<class T>
+/* abstract */
+class AsyncBareProgressWorker : public AsyncBareProgressWorkerBase {
+ public:
+  explicit AsyncBareProgressWorker(
+      Callback *callback_,
+      const char* resource_name = "nan:AsyncBareProgressWorker")
+      : AsyncBareProgressWorkerBase(callback_, resource_name) {
+    uv_mutex_init(&async_lock);
+  }
+
+  virtual ~AsyncBareProgressWorker() {
+    uv_mutex_destroy(&async_lock);
+  }
+
+  class ExecutionProgress {
+    friend class AsyncBareProgressWorker;
+   public:
+    void Signal() const {
+      uv_mutex_lock(&that_->async_lock);
+      uv_async_send(&that_->async);
+      uv_mutex_unlock(&that_->async_lock);
+    }
+
+    void Send(const T* data, size_t count) const {
+      that_->SendProgress_(data, count);
+    }
+
+   private:
+    explicit ExecutionProgress(AsyncBareProgressWorker *that) : that_(that) {}
+    NAN_DISALLOW_ASSIGN_COPY_MOVE(ExecutionProgress)
+    AsyncBareProgressWorker* const that_;
+  };
+
+  virtual void Execute(const ExecutionProgress& progress) = 0;
+  virtual void HandleProgressCallback(const T *data, size_t size) = 0;
+
+ protected:
+  uv_mutex_t async_lock;
+
+ private:
+  void Execute() /*final override*/ {
+    ExecutionProgress progress(this);
+    Execute(progress);
+  }
+
+  virtual void SendProgress_(const T *data, size_t count) = 0;
+};
+
+template<class T>
+/* abstract */
+class AsyncProgressWorkerBase : public AsyncBareProgressWorker<T> {
+ public:
+  explicit AsyncProgressWorkerBase(
+      Callback *callback_,
+      const char* resource_name = "nan:AsyncProgressWorkerBase")
+      : AsyncBareProgressWorker<T>(callback_, resource_name), asyncdata_(NULL),
+        asyncsize_(0) {
+  }
+
+  virtual ~AsyncProgressWorkerBase() {
+    delete[] asyncdata_;
+  }
+
+  void WorkProgress() {
+    uv_mutex_lock(&this->async_lock);
+    T *data = asyncdata_;
+    size_t size = asyncsize_;
+    asyncdata_ = NULL;
+    asyncsize_ = 0;
+    uv_mutex_unlock(&this->async_lock);
+
+    // Don't send progress events after we've already completed.
+    if (this->callback) {
+        this->HandleProgressCallback(data, size);
+    }
+    delete[] data;
+  }
+
+ private:
+  void SendProgress_(const T *data, size_t count) {
+    T *new_data = new T[count];
+    std::copy(data, data + count, new_data);
+
+    uv_mutex_lock(&this->async_lock);
+    T *old_data = asyncdata_;
+    asyncdata_ = new_data;
+    asyncsize_ = count;
+    uv_async_send(&this->async);
+    uv_mutex_unlock(&this->async_lock);
+
+    delete[] old_data;
+  }
+
+  T *asyncdata_;
+  size_t asyncsize_;
+};
+
+// This ensures compatibility to the previous un-templated AsyncProgressWorker
+// class definition.
+typedef AsyncProgressWorkerBase<char> AsyncProgressWorker;
+
+template<class T>
+/* abstract */
+class AsyncBareProgressQueueWorker : public AsyncBareProgressWorkerBase {
+ public:
+  explicit AsyncBareProgressQueueWorker(
+      Callback *callback_,
+      const char* resource_name = "nan:AsyncBareProgressQueueWorker")
+      : AsyncBareProgressWorkerBase(callback_, resource_name) {
+  }
+
+  virtual ~AsyncBareProgressQueueWorker() {
+  }
+
+  class ExecutionProgress {
+    friend class AsyncBareProgressQueueWorker;
+   public:
+    void Send(const T* data, size_t count) const {
+      that_->SendProgress_(data, count);
+    }
+
+   private:
+    explicit ExecutionProgress(AsyncBareProgressQueueWorker *that)
+        : that_(that) {}
+    NAN_DISALLOW_ASSIGN_COPY_MOVE(ExecutionProgress)
+    AsyncBareProgressQueueWorker* const that_;
+  };
+
+  virtual void Execute(const ExecutionProgress& progress) = 0;
+  virtual void HandleProgressCallback(const T *data, size_t size) = 0;
+
+ private:
+  void Execute() /*final override*/ {
+    ExecutionProgress progress(this);
+    Execute(progress);
+  }
+
+  virtual void SendProgress_(const T *data, size_t count) = 0;
+};
+
+template<class T>
+/* abstract */
+class AsyncProgressQueueWorker : public AsyncBareProgressQueueWorker<T> {
+ public:
+  explicit AsyncProgressQueueWorker(
+      Callback *callback_,
+      const char* resource_name = "nan:AsyncProgressQueueWorker")
+      : AsyncBareProgressQueueWorker<T>(callback_) {
+    uv_mutex_init(&async_lock);
+  }
+
+  virtual ~AsyncProgressQueueWorker() {
+    uv_mutex_lock(&async_lock);
+
+    while (!asyncdata_.empty()) {
+      std::pair<T*, size_t> &datapair = asyncdata_.front();
+      T *data = datapair.first;
+
+      asyncdata_.pop();
+
+      delete[] data;
+    }
+
+    uv_mutex_unlock(&async_lock);
+    uv_mutex_destroy(&async_lock);
+  }
+
+  void WorkComplete() {
+    WorkProgress();
+    AsyncWorker::WorkComplete();
+  }
+
+  void WorkProgress() {
+    uv_mutex_lock(&async_lock);
+
+    while (!asyncdata_.empty()) {
+      std::pair<T*, size_t> &datapair = asyncdata_.front();
+
+      T *data = datapair.first;
+      size_t size = datapair.second;
+
+      asyncdata_.pop();
+      uv_mutex_unlock(&async_lock);
+
+      // Don't send progress events after we've already completed.
+      if (this->callback) {
+          this->HandleProgressCallback(data, size);
+      }
+
+      delete[] data;
+
+      uv_mutex_lock(&async_lock);
+    }
+
+    uv_mutex_unlock(&async_lock);
+  }
+
+ private:
+  void SendProgress_(const T *data, size_t count) {
+    T *new_data = new T[count];
+    std::copy(data, data + count, new_data);
+
+    uv_mutex_lock(&async_lock);
+    asyncdata_.push(std::pair<T*, size_t>(new_data, count));
+    uv_mutex_unlock(&async_lock);
+
+    uv_async_send(&this->async);
+  }
+
+  uv_mutex_t async_lock;
+  std::queue<std::pair<T*, size_t> > asyncdata_;
+};
+
+inline void AsyncExecute (uv_work_t* req) {
+  AsyncWorker *worker = static_cast<AsyncWorker*>(req->data);
+  worker->Execute();
+}
+
+/* uv_after_work_cb has 1 argument before node-v0.9.4 and
+ * 2 arguments since node-v0.9.4
+ * https://github.com/libuv/libuv/commit/92fb84b751e18f032c02609467f44bfe927b80c5
+ */
+inline void AsyncExecuteComplete(uv_work_t *req) {
+  AsyncWorker* worker = static_cast<AsyncWorker*>(req->data);
+  worker->WorkComplete();
+  worker->Destroy();
+}
+inline void AsyncExecuteComplete (uv_work_t* req, int status) {
+  AsyncExecuteComplete(req);
+}
+
+inline void AsyncQueueWorker (AsyncWorker* worker) {
+  uv_queue_work(
+      GetCurrentEventLoop()
+    , &worker->request
+    , AsyncExecute
+    , AsyncExecuteComplete
+  );
+}
+
+namespace imp {
+
+inline
+ExternalOneByteStringResource const*
+GetExternalResource(v8::Local<v8::String> str) {
+#if NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION
+    return str->GetExternalAsciiStringResource();
+#else
+    return str->GetExternalOneByteStringResource();
+#endif
+}
+
+inline
+bool
+IsExternal(v8::Local<v8::String> str) {
+#if NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION
+    return str->IsExternalAscii();
+#else
+    return str->IsExternalOneByte();
+#endif
+}
+
+}  // end of namespace imp
+
+enum Encoding {ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER};
+
+#if NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION
+# include "nan_string_bytes.h"  // NOLINT(build/include)
+#endif
+
+inline v8::Local<v8::Value> Encode(
+    const void *buf, size_t len, enum Encoding encoding = BINARY) {
+#if (NODE_MODULE_VERSION >= ATOM_0_21_MODULE_VERSION)
+  v8::Isolate* isolate = v8::Isolate::GetCurrent();
+  node::encoding node_enc = static_cast<node::encoding>(encoding);
+
+  if (encoding == UCS2) {
+    return node::Encode(
+        isolate
+      , reinterpret_cast<const uint16_t *>(buf)
+      , len / 2);
+  } else {
+    return node::Encode(
+        isolate
+      , reinterpret_cast<const char *>(buf)
+      , len
+      , node_enc);
+  }
+#elif (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)
+  return node::Encode(
+      v8::Isolate::GetCurrent()
+    , buf, len
+    , static_cast<node::encoding>(encoding));
+#else
+# if NODE_MODULE_VERSION >= NODE_0_10_MODULE_VERSION
+  return node::Encode(buf, len, static_cast<node::encoding>(encoding));
+# else
+  return imp::Encode(reinterpret_cast<const char*>(buf), len, encoding);
+# endif
+#endif
+}
+
+inline ssize_t DecodeBytes(
+    v8::Local<v8::Value> val, enum Encoding encoding = BINARY) {
+#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)
+  return node::DecodeBytes(
+      v8::Isolate::GetCurrent()
+    , val
+    , static_cast<node::encoding>(encoding));
+#else
+# if (NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION)
+  if (encoding == BUFFER) {
+    return node::DecodeBytes(val, node::BINARY);
+  }
+# endif
+  return node::DecodeBytes(val, static_cast<node::encoding>(encoding));
+#endif
+}
+
+inline ssize_t DecodeWrite(
+    char *buf
+  , size_t len
+  , v8::Local<v8::Value> val
+  , enum Encoding encoding = BINARY) {
+#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)
+  return node::DecodeWrite(
+      v8::Isolate::GetCurrent()
+    , buf
+    , len
+    , val
+    , static_cast<node::encoding>(encoding));
+#else
+# if (NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION)
+  if (encoding == BUFFER) {
+    return node::DecodeWrite(buf, len, val, node::BINARY);
+  }
+# endif
+  return node::DecodeWrite(
+      buf
+    , len
+    , val
+    , static_cast<node::encoding>(encoding));
+#endif
+}
+
+inline void SetPrototypeTemplate(
+    v8::Local<v8::FunctionTemplate> templ
+  , const char *name
+  , v8::Local<v8::Data> value
+) {
+  HandleScope scope;
+  SetTemplate(templ->PrototypeTemplate(), name, value);
+}
+
+inline void SetPrototypeTemplate(
+    v8::Local<v8::FunctionTemplate> templ
+  , v8::Local<v8::String> name
+  , v8::Local<v8::Data> value
+  , v8::PropertyAttribute attributes
+) {
+  HandleScope scope;
+  SetTemplate(templ->PrototypeTemplate(), name, value, attributes);
+}
+
+inline void SetInstanceTemplate(
+    v8::Local<v8::FunctionTemplate> templ
+  , const char *name
+  , v8::Local<v8::Data> value
+) {
+  HandleScope scope;
+  SetTemplate(templ->InstanceTemplate(), name, value);
+}
+
+inline void SetInstanceTemplate(
+    v8::Local<v8::FunctionTemplate> templ
+  , v8::Local<v8::String> name
+  , v8::Local<v8::Data> value
+  , v8::PropertyAttribute attributes
+) {
+  HandleScope scope;
+  SetTemplate(templ->InstanceTemplate(), name, value, attributes);
+}
+
+namespace imp {
+
+// Note(@agnat): Helper to distinguish different receiver types. The first
+// version deals with receivers derived from v8::Template. The second version
+// handles everything else. The final argument only serves as discriminator and
+// is unused.
+template <typename T>
+inline
+void
+SetMethodAux(T recv,
+             v8::Local<v8::String> name,
+             v8::Local<v8::FunctionTemplate> tpl,
+             v8::Template *) {
+  recv->Set(name, tpl);
+}
+
+template <typename T>
+inline
+void
+SetMethodAux(T recv,
+             v8::Local<v8::String> name,
+             v8::Local<v8::FunctionTemplate> tpl,
+             ...) {
+  Set(recv, name, GetFunction(tpl).ToLocalChecked());
+}
+
+}  // end of namespace imp
+
+template <typename T, template <typename> class HandleType>
+inline void SetMethod(
+    HandleType<T> recv
+  , const char *name
+  , FunctionCallback callback
+  , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
+  HandleScope scope;
+  v8::Local<v8::FunctionTemplate> t = New<v8::FunctionTemplate>(callback, data);
+  v8::Local<v8::String> fn_name = New(name).ToLocalChecked();
+  t->SetClassName(fn_name);
+  // Note(@agnat): Pass an empty T* as discriminator. See note on
+  // SetMethodAux(...) above
+  imp::SetMethodAux(recv, fn_name, t, static_cast<T*>(0));
+}
+
+inline void SetPrototypeMethod(
+    v8::Local<v8::FunctionTemplate> recv
+  , const char* name
+  , FunctionCallback callback
+  , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
+  HandleScope scope;
+  v8::Local<v8::FunctionTemplate> t = New<v8::FunctionTemplate>(
+      callback
+    , data
+    , New<v8::Signature>(recv));
+  v8::Local<v8::String> fn_name = New(name).ToLocalChecked();
+  recv->PrototypeTemplate()->Set(fn_name, t);
+  t->SetClassName(fn_name);
+}
+
+//=== Accessors and Such =======================================================
+
+inline void SetAccessor(
+    v8::Local<v8::ObjectTemplate> tpl
+  , v8::Local<v8::String> name
+  , GetterCallback getter
+  , SetterCallback setter = 0
+  , v8::Local<v8::Value> data = v8::Local<v8::Value>()
+  , v8::AccessControl settings = v8::DEFAULT
+  , v8::PropertyAttribute attribute = v8::None
+  , imp::Sig signature = imp::Sig()) {
+  HandleScope scope;
+
+  imp::NativeGetter getter_ =
+      imp::GetterCallbackWrapper;
+  imp::NativeSetter setter_ =
+      setter ? imp::SetterCallbackWrapper : 0;
+
+  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
+  otpl->SetInternalFieldCount(imp::kAccessorFieldCount);
+  v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();
+
+  obj->SetInternalField(
+      imp::kGetterIndex
+    , New<v8::External>(reinterpret_cast<void *>(getter)));
+
+  if (setter != 0) {
+    obj->SetInternalField(
+        imp::kSetterIndex
+      , New<v8::External>(reinterpret_cast<void *>(setter)));
+  }
+
+  if (!data.IsEmpty()) {
+    obj->SetInternalField(imp::kDataIndex, data);
+  }
+
+  tpl->SetAccessor(
+      name
+    , getter_
+    , setter_
+    , obj
+    , settings
+    , attribute
+    , signature);
+}
+
+inline bool SetAccessor(
+    v8::Local<v8::Object> obj
+  , v8::Local<v8::String> name
+  , GetterCallback getter
+  , SetterCallback setter = 0
+  , v8::Local<v8::Value> data = v8::Local<v8::Value>()
+  , v8::AccessControl settings = v8::DEFAULT
+  , v8::PropertyAttribute attribute = v8::None) {
+  HandleScope scope;
+
+  imp::NativeGetter getter_ =
+      imp::GetterCallbackWrapper;
+  imp::NativeSetter setter_ =
+      setter ? imp::SetterCallbackWrapper : 0;
+
+  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
+  otpl->SetInternalFieldCount(imp::kAccessorFieldCount);
+  v8::Local<v8::Object> dataobj = NewInstance(otpl).ToLocalChecked();
+
+  dataobj->SetInternalField(
+      imp::kGetterIndex
+    , New<v8::External>(reinterpret_cast<void *>(getter)));
+
+  if (!data.IsEmpty()) {
+    dataobj->SetInternalField(imp::kDataIndex, data);
+  }
+
+  if (setter) {
+    dataobj->SetInternalField(
+        imp::kSetterIndex
+      , New<v8::External>(reinterpret_cast<void *>(setter)));
+  }
+
+#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION)
+  return obj->SetAccessor(
+      GetCurrentContext()
+    , name
+    , getter_
+    , setter_
+    , dataobj
+    , settings
+    , attribute).FromMaybe(false);
+#else
+  return obj->SetAccessor(
+      name
+    , getter_
+    , setter_
+    , dataobj
+    , settings
+    , attribute);
+#endif
+}
+
+inline void SetNamedPropertyHandler(
+    v8::Local<v8::ObjectTemplate> tpl
+  , PropertyGetterCallback getter
+  , PropertySetterCallback setter = 0
+  , PropertyQueryCallback query = 0
+  , PropertyDeleterCallback deleter = 0
+  , PropertyEnumeratorCallback enumerator = 0
+  , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
+  HandleScope scope;
+
+  imp::NativePropertyGetter getter_ =
+      imp::PropertyGetterCallbackWrapper;
+  imp::NativePropertySetter setter_ =
+      setter ? imp::PropertySetterCallbackWrapper : 0;
+  imp::NativePropertyQuery query_ =
+      query ? imp::PropertyQueryCallbackWrapper : 0;
+  imp::NativePropertyDeleter *deleter_ =
+      deleter ? imp::PropertyDeleterCallbackWrapper : 0;
+  imp::NativePropertyEnumerator enumerator_ =
+      enumerator ? imp::PropertyEnumeratorCallbackWrapper : 0;
+
+  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
+  otpl->SetInternalFieldCount(imp::kPropertyFieldCount);
+  v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();
+  obj->SetInternalField(
+      imp::kPropertyGetterIndex
+    , New<v8::External>(reinterpret_cast<void *>(getter)));
+
+  if (setter) {
+    obj->SetInternalField(
+        imp::kPropertySetterIndex
+      , New<v8::External>(reinterpret_cast<void *>(setter)));
+  }
+
+  if (query) {
+    obj->SetInternalField(
+        imp::kPropertyQueryIndex
+      , New<v8::External>(reinterpret_cast<void *>(query)));
+  }
+
+  if (deleter) {
+    obj->SetInternalField(
+        imp::kPropertyDeleterIndex
+      , New<v8::External>(reinterpret_cast<void *>(deleter)));
+  }
+
+  if (enumerator) {
+    obj->SetInternalField(
+        imp::kPropertyEnumeratorIndex
+      , New<v8::External>(reinterpret_cast<void *>(enumerator)));
+  }
+
+  if (!data.IsEmpty()) {
+    obj->SetInternalField(imp::kDataIndex, data);
+  }
+
+#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
+  tpl->SetHandler(v8::NamedPropertyHandlerConfiguration(
+      getter_, setter_, query_, deleter_, enumerator_, obj));
+#else
+  tpl->SetNamedPropertyHandler(
+      getter_
+    , setter_
+    , query_
+    , deleter_
+    , enumerator_
+    , obj);
+#endif
+}
+
+inline void SetIndexedPropertyHandler(
+    v8::Local<v8::ObjectTemplate> tpl
+  , IndexGetterCallback getter
+  , IndexSetterCallback setter = 0
+  , IndexQueryCallback query = 0
+  , IndexDeleterCallback deleter = 0
+  , IndexEnumeratorCallback enumerator = 0
+  , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
+  HandleScope scope;
+
+  imp::NativeIndexGetter getter_ =
+      imp::IndexGetterCallbackWrapper;
+  imp::NativeIndexSetter setter_ =
+      setter ? imp::IndexSetterCallbackWrapper : 0;
+  imp::NativeIndexQuery query_ =
+      query ? imp::IndexQueryCallbackWrapper : 0;
+  imp::NativeIndexDeleter deleter_ =
+      deleter ? imp::IndexDeleterCallbackWrapper : 0;
+  imp::NativeIndexEnumerator enumerator_ =
+      enumerator ? imp::IndexEnumeratorCallbackWrapper : 0;
+
+  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
+  otpl->SetInternalFieldCount(imp::kIndexPropertyFieldCount);
+  v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();
+  obj->SetInternalField(
+      imp::kIndexPropertyGetterIndex
+    , New<v8::External>(reinterpret_cast<void *>(getter)));
+
+  if (setter) {
+    obj->SetInternalField(
+        imp::kIndexPropertySetterIndex
+      , New<v8::External>(reinterpret_cast<void *>(setter)));
+  }
+
+  if (query) {
+    obj->SetInternalField(
+        imp::kIndexPropertyQueryIndex
+      , New<v8::External>(reinterpret_cast<void *>(query)));
+  }
+
+  if (deleter) {
+    obj->SetInternalField(
+        imp::kIndexPropertyDeleterIndex
+      , New<v8::External>(reinterpret_cast<void *>(deleter)));
+  }
+
+  if (enumerator) {
+    obj->SetInternalField(
+        imp::kIndexPropertyEnumeratorIndex
+      , New<v8::External>(reinterpret_cast<void *>(enumerator)));
+  }
+
+  if (!data.IsEmpty()) {
+    obj->SetInternalField(imp::kDataIndex, data);
+  }
+
+#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
+  tpl->SetHandler(v8::IndexedPropertyHandlerConfiguration(
+      getter_, setter_, query_, deleter_, enumerator_, obj));
+#else
+  tpl->SetIndexedPropertyHandler(
+      getter_
+    , setter_
+    , query_
+    , deleter_
+    , enumerator_
+    , obj);
+#endif
+}
+
+inline void SetCallHandler(
+    v8::Local<v8::FunctionTemplate> tpl
+  , FunctionCallback callback
+  , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
+  HandleScope scope;
+
+  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
+  otpl->SetInternalFieldCount(imp::kFunctionFieldCount);
+  v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();
+
+  obj->SetInternalField(
+      imp::kFunctionIndex
+    , New<v8::External>(reinterpret_cast<void *>(callback)));
+
+  if (!data.IsEmpty()) {
+    obj->SetInternalField(imp::kDataIndex, data);
+  }
+
+  tpl->SetCallHandler(imp::FunctionCallbackWrapper, obj);
+}
+
+
+inline void SetCallAsFunctionHandler(
+    v8::Local<v8::ObjectTemplate> tpl,
+    FunctionCallback callback,
+    v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
+  HandleScope scope;
+
+  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
+  otpl->SetInternalFieldCount(imp::kFunctionFieldCount);
+  v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();
+
+  obj->SetInternalField(
+      imp::kFunctionIndex
+    , New<v8::External>(reinterpret_cast<void *>(callback)));
+
+  if (!data.IsEmpty()) {
+    obj->SetInternalField(imp::kDataIndex, data);
+  }
+
+  tpl->SetCallAsFunctionHandler(imp::FunctionCallbackWrapper, obj);
+}
+
+//=== Weak Persistent Handling =================================================
+
+#include "nan_weak.h"  // NOLINT(build/include)
+
+//=== ObjectWrap ===============================================================
+
+#include "nan_object_wrap.h"  // NOLINT(build/include)
+
+//=== HiddenValue/Private ======================================================
+
+#include "nan_private.h"  // NOLINT(build/include)
+
+//=== Export ==================================================================
+
+inline
+void
+Export(ADDON_REGISTER_FUNCTION_ARGS_TYPE target, const char *name,
+    FunctionCallback f) {
+  HandleScope scope;
+
+  Set(target, New<v8::String>(name).ToLocalChecked(),
+      GetFunction(New<v8::FunctionTemplate>(f)).ToLocalChecked());
+}
+
+//=== Tap Reverse Binding =====================================================
+
+struct Tap {
+  explicit Tap(v8::Local<v8::Value> t) : t_() {
+    HandleScope scope;
+
+    t_.Reset(To<v8::Object>(t).ToLocalChecked());
+  }
+
+  ~Tap() { t_.Reset(); }  // not sure if necessary
+
+  inline void plan(int i) {
+    HandleScope scope;
+    v8::Local<v8::Value> arg = New(i);
+    Call("plan", New(t_), 1, &arg);
+  }
+
+  inline void ok(bool isOk, const char *msg = NULL) {
+    HandleScope scope;
+    v8::Local<v8::Value> args[2];
+    args[0] = New(isOk);
+    if (msg) args[1] = New(msg).ToLocalChecked();
+    Call("ok", New(t_), msg ? 2 : 1, args);
+  }
+
+  inline void pass(const char * msg = NULL) {
+    HandleScope scope;
+    v8::Local<v8::Value> hmsg;
+    if (msg) hmsg = New(msg).ToLocalChecked();
+    Call("pass", New(t_), msg ? 1 : 0, &hmsg);
+  }
+
+  inline void end() {
+    HandleScope scope;
+    Call("end", New(t_), 0, NULL);
+  }
+
+ private:
+  Persistent<v8::Object> t_;
+};
+
+#define NAN_STRINGIZE2(x) #x
+#define NAN_STRINGIZE(x) NAN_STRINGIZE2(x)
+#define NAN_TEST_EXPRESSION(expression) \
+  ( expression ), __FILE__ ":" NAN_STRINGIZE(__LINE__) ": " #expression
+
+#define NAN_EXPORT(target, function) Export(target, #function, function)
+
+#undef TYPE_CHECK
+
+//=== Generic Maybefication ===================================================
+
+namespace imp {
+
+template <typename T> struct Maybefier;
+
+template <typename T> struct Maybefier<v8::Local<T> > {
+  inline static MaybeLocal<T> convert(v8::Local<T> v) {
+    return v;
+  }
+};
+
+template <typename T> struct Maybefier<MaybeLocal<T> > {
+  inline static MaybeLocal<T> convert(MaybeLocal<T> v) {
+    return v;
+  }
+};
+
+}  // end of namespace imp
+
+template <typename T, template <typename> class MaybeMaybe>
+inline MaybeLocal<T>
+MakeMaybe(MaybeMaybe<T> v) {
+  return imp::Maybefier<MaybeMaybe<T> >::convert(v);
+}
+
+//=== TypedArrayContents =======================================================
+
+#include "nan_typedarray_contents.h"  // NOLINT(build/include)
+
+//=== JSON =====================================================================
+
+#include "nan_json.h"  // NOLINT(build/include)
+
+}  // end of namespace Nan
+
+#endif  // NAN_H_
diff --git a/node_modules/nan/nan_callbacks.h b/node_modules/nan/nan_callbacks.h
new file mode 100644
index 0000000..53ede84
--- /dev/null
+++ b/node_modules/nan/nan_callbacks.h
@@ -0,0 +1,88 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_CALLBACKS_H_
+#define NAN_CALLBACKS_H_
+
+template<typename T> class FunctionCallbackInfo;
+template<typename T> class PropertyCallbackInfo;
+template<typename T> class Global;
+
+typedef void(*FunctionCallback)(const FunctionCallbackInfo<v8::Value>&);
+typedef void(*GetterCallback)
+    (v8::Local<v8::String>, const PropertyCallbackInfo<v8::Value>&);
+typedef void(*SetterCallback)(
+    v8::Local<v8::String>,
+    v8::Local<v8::Value>,
+    const PropertyCallbackInfo<void>&);
+typedef void(*PropertyGetterCallback)(
+    v8::Local<v8::String>,
+    const PropertyCallbackInfo<v8::Value>&);
+typedef void(*PropertySetterCallback)(
+    v8::Local<v8::String>,
+    v8::Local<v8::Value>,
+    const PropertyCallbackInfo<v8::Value>&);
+typedef void(*PropertyEnumeratorCallback)
+    (const PropertyCallbackInfo<v8::Array>&);
+typedef void(*PropertyDeleterCallback)(
+    v8::Local<v8::String>,
+    const PropertyCallbackInfo<v8::Boolean>&);
+typedef void(*PropertyQueryCallback)(
+    v8::Local<v8::String>,
+    const PropertyCallbackInfo<v8::Integer>&);
+typedef void(*IndexGetterCallback)(
+    uint32_t,
+    const PropertyCallbackInfo<v8::Value>&);
+typedef void(*IndexSetterCallback)(
+    uint32_t,
+    v8::Local<v8::Value>,
+    const PropertyCallbackInfo<v8::Value>&);
+typedef void(*IndexEnumeratorCallback)
+    (const PropertyCallbackInfo<v8::Array>&);
+typedef void(*IndexDeleterCallback)(
+    uint32_t,
+    const PropertyCallbackInfo<v8::Boolean>&);
+typedef void(*IndexQueryCallback)(
+    uint32_t,
+    const PropertyCallbackInfo<v8::Integer>&);
+
+namespace imp {
+typedef v8::Local<v8::AccessorSignature> Sig;
+
+static const int kDataIndex =                    0;
+
+static const int kFunctionIndex =                1;
+static const int kFunctionFieldCount =           2;
+
+static const int kGetterIndex =                  1;
+static const int kSetterIndex =                  2;
+static const int kAccessorFieldCount =           3;
+
+static const int kPropertyGetterIndex =          1;
+static const int kPropertySetterIndex =          2;
+static const int kPropertyEnumeratorIndex =      3;
+static const int kPropertyDeleterIndex =         4;
+static const int kPropertyQueryIndex =           5;
+static const int kPropertyFieldCount =           6;
+
+static const int kIndexPropertyGetterIndex =     1;
+static const int kIndexPropertySetterIndex =     2;
+static const int kIndexPropertyEnumeratorIndex = 3;
+static const int kIndexPropertyDeleterIndex =    4;
+static const int kIndexPropertyQueryIndex =      5;
+static const int kIndexPropertyFieldCount =      6;
+
+}  // end of namespace imp
+
+#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+# include "nan_callbacks_12_inl.h"  // NOLINT(build/include)
+#else
+# include "nan_callbacks_pre_12_inl.h"  // NOLINT(build/include)
+#endif
+
+#endif  // NAN_CALLBACKS_H_
diff --git a/node_modules/nan/nan_callbacks_12_inl.h b/node_modules/nan/nan_callbacks_12_inl.h
new file mode 100644
index 0000000..c27b18d
--- /dev/null
+++ b/node_modules/nan/nan_callbacks_12_inl.h
@@ -0,0 +1,514 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_CALLBACKS_12_INL_H_
+#define NAN_CALLBACKS_12_INL_H_
+
+template<typename T>
+class ReturnValue {
+  v8::ReturnValue<T> value_;
+
+ public:
+  template <class S>
+  explicit inline ReturnValue(const v8::ReturnValue<S> &value) :
+      value_(value) {}
+  template <class S>
+  explicit inline ReturnValue(const ReturnValue<S>& that)
+      : value_(that.value_) {
+    TYPE_CHECK(T, S);
+  }
+
+  // Handle setters
+  template <typename S> inline void Set(const v8::Local<S> &handle) {
+    TYPE_CHECK(T, S);
+    value_.Set(handle);
+  }
+
+  template <typename S> inline void Set(const Global<S> &handle) {
+    TYPE_CHECK(T, S);
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) &&                       \
+  (V8_MINOR_VERSION > 5 || (V8_MINOR_VERSION == 5 &&                           \
+  defined(V8_BUILD_NUMBER) && V8_BUILD_NUMBER >= 8))))
+    value_.Set(handle);
+#else
+    value_.Set(*reinterpret_cast<const v8::Persistent<S>*>(&handle));
+    const_cast<Global<S> &>(handle).Reset();
+#endif
+  }
+
+  // Fast primitive setters
+  inline void Set(bool value) {
+    TYPE_CHECK(T, v8::Boolean);
+    value_.Set(value);
+  }
+
+  inline void Set(double i) {
+    TYPE_CHECK(T, v8::Number);
+    value_.Set(i);
+  }
+
+  inline void Set(int32_t i) {
+    TYPE_CHECK(T, v8::Integer);
+    value_.Set(i);
+  }
+
+  inline void Set(uint32_t i) {
+    TYPE_CHECK(T, v8::Integer);
+    value_.Set(i);
+  }
+
+  // Fast JS primitive setters
+  inline void SetNull() {
+    TYPE_CHECK(T, v8::Primitive);
+    value_.SetNull();
+  }
+
+  inline void SetUndefined() {
+    TYPE_CHECK(T, v8::Primitive);
+    value_.SetUndefined();
+  }
+
+  inline void SetEmptyString() {
+    TYPE_CHECK(T, v8::String);
+    value_.SetEmptyString();
+  }
+
+  // Convenience getter for isolate
+  inline v8::Isolate *GetIsolate() const {
+    return value_.GetIsolate();
+  }
+
+  // Pointer setter: Uncompilable to prevent inadvertent misuse.
+  template<typename S>
+  inline void Set(S *whatever) { TYPE_CHECK(S*, v8::Primitive); }
+};
+
+template<typename T>
+class FunctionCallbackInfo {
+  const v8::FunctionCallbackInfo<T> &info_;
+  const v8::Local<v8::Value> data_;
+
+ public:
+  explicit inline FunctionCallbackInfo(
+      const v8::FunctionCallbackInfo<T> &info
+    , v8::Local<v8::Value> data) :
+          info_(info)
+        , data_(data) {}
+
+  inline ReturnValue<T> GetReturnValue() const {
+    return ReturnValue<T>(info_.GetReturnValue());
+  }
+
+#if NODE_MAJOR_VERSION < 10
+  inline v8::Local<v8::Function> Callee() const { return info_.Callee(); }
+#endif
+  inline v8::Local<v8::Value> Data() const { return data_; }
+  inline v8::Local<v8::Object> Holder() const { return info_.Holder(); }
+  inline bool IsConstructCall() const { return info_.IsConstructCall(); }
+  inline int Length() const { return info_.Length(); }
+  inline v8::Local<v8::Value> operator[](int i) const { return info_[i]; }
+  inline v8::Local<v8::Object> This() const { return info_.This(); }
+  inline v8::Isolate *GetIsolate() const { return info_.GetIsolate(); }
+
+
+ protected:
+  static const int kHolderIndex = 0;
+  static const int kIsolateIndex = 1;
+  static const int kReturnValueDefaultValueIndex = 2;
+  static const int kReturnValueIndex = 3;
+  static const int kDataIndex = 4;
+  static const int kCalleeIndex = 5;
+  static const int kContextSaveIndex = 6;
+  static const int kArgsLength = 7;
+
+ private:
+  NAN_DISALLOW_ASSIGN_COPY_MOVE(FunctionCallbackInfo)
+};
+
+template<typename T>
+class PropertyCallbackInfo {
+  const v8::PropertyCallbackInfo<T> &info_;
+  const v8::Local<v8::Value> data_;
+
+ public:
+  explicit inline PropertyCallbackInfo(
+      const v8::PropertyCallbackInfo<T> &info
+    , const v8::Local<v8::Value> data) :
+          info_(info)
+        , data_(data) {}
+
+  inline v8::Isolate* GetIsolate() const { return info_.GetIsolate(); }
+  inline v8::Local<v8::Value> Data() const { return data_; }
+  inline v8::Local<v8::Object> This() const { return info_.This(); }
+  inline v8::Local<v8::Object> Holder() const { return info_.Holder(); }
+  inline ReturnValue<T> GetReturnValue() const {
+    return ReturnValue<T>(info_.GetReturnValue());
+  }
+
+ protected:
+  static const int kHolderIndex = 0;
+  static const int kIsolateIndex = 1;
+  static const int kReturnValueDefaultValueIndex = 2;
+  static const int kReturnValueIndex = 3;
+  static const int kDataIndex = 4;
+  static const int kThisIndex = 5;
+  static const int kArgsLength = 6;
+
+ private:
+  NAN_DISALLOW_ASSIGN_COPY_MOVE(PropertyCallbackInfo)
+};
+
+namespace imp {
+static
+void FunctionCallbackWrapper(const v8::FunctionCallbackInfo<v8::Value> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  FunctionCallback callback = reinterpret_cast<FunctionCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kFunctionIndex).As<v8::External>()->Value()));
+  FunctionCallbackInfo<v8::Value>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  callback(cbinfo);
+}
+
+typedef void (*NativeFunction)(const v8::FunctionCallbackInfo<v8::Value> &);
+
+#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
+static
+void GetterCallbackWrapper(
+    v8::Local<v8::Name> property
+  , const v8::PropertyCallbackInfo<v8::Value> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Value>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  GetterCallback callback = reinterpret_cast<GetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kGetterIndex).As<v8::External>()->Value()));
+  callback(property.As<v8::String>(), cbinfo);
+}
+
+typedef void (*NativeGetter)
+    (v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value> &);
+
+static
+void SetterCallbackWrapper(
+    v8::Local<v8::Name> property
+  , v8::Local<v8::Value> value
+  , const v8::PropertyCallbackInfo<void> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<void>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  SetterCallback callback = reinterpret_cast<SetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kSetterIndex).As<v8::External>()->Value()));
+  callback(property.As<v8::String>(), value, cbinfo);
+}
+
+typedef void (*NativeSetter)(
+    v8::Local<v8::Name>
+  , v8::Local<v8::Value>
+  , const v8::PropertyCallbackInfo<void> &);
+#else
+static
+void GetterCallbackWrapper(
+    v8::Local<v8::String> property
+  , const v8::PropertyCallbackInfo<v8::Value> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Value>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  GetterCallback callback = reinterpret_cast<GetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kGetterIndex).As<v8::External>()->Value()));
+  callback(property, cbinfo);
+}
+
+typedef void (*NativeGetter)
+    (v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Value> &);
+
+static
+void SetterCallbackWrapper(
+    v8::Local<v8::String> property
+  , v8::Local<v8::Value> value
+  , const v8::PropertyCallbackInfo<void> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<void>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  SetterCallback callback = reinterpret_cast<SetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kSetterIndex).As<v8::External>()->Value()));
+  callback(property, value, cbinfo);
+}
+
+typedef void (*NativeSetter)(
+    v8::Local<v8::String>
+  , v8::Local<v8::Value>
+  , const v8::PropertyCallbackInfo<void> &);
+#endif
+
+#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
+static
+void PropertyGetterCallbackWrapper(
+    v8::Local<v8::Name> property
+  , const v8::PropertyCallbackInfo<v8::Value> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Value>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  PropertyGetterCallback callback = reinterpret_cast<PropertyGetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kPropertyGetterIndex)
+              .As<v8::External>()->Value()));
+  callback(property.As<v8::String>(), cbinfo);
+}
+
+typedef void (*NativePropertyGetter)
+    (v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value> &);
+
+static
+void PropertySetterCallbackWrapper(
+    v8::Local<v8::Name> property
+  , v8::Local<v8::Value> value
+  , const v8::PropertyCallbackInfo<v8::Value> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Value>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  PropertySetterCallback callback = reinterpret_cast<PropertySetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kPropertySetterIndex)
+              .As<v8::External>()->Value()));
+  callback(property.As<v8::String>(), value, cbinfo);
+}
+
+typedef void (*NativePropertySetter)(
+    v8::Local<v8::Name>
+  , v8::Local<v8::Value>
+  , const v8::PropertyCallbackInfo<v8::Value> &);
+
+static
+void PropertyEnumeratorCallbackWrapper(
+    const v8::PropertyCallbackInfo<v8::Array> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Array>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  PropertyEnumeratorCallback callback =
+      reinterpret_cast<PropertyEnumeratorCallback>(reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kPropertyEnumeratorIndex)
+              .As<v8::External>()->Value()));
+  callback(cbinfo);
+}
+
+typedef void (*NativePropertyEnumerator)
+    (const v8::PropertyCallbackInfo<v8::Array> &);
+
+static
+void PropertyDeleterCallbackWrapper(
+    v8::Local<v8::Name> property
+  , const v8::PropertyCallbackInfo<v8::Boolean> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Boolean>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  PropertyDeleterCallback callback = reinterpret_cast<PropertyDeleterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kPropertyDeleterIndex)
+              .As<v8::External>()->Value()));
+  callback(property.As<v8::String>(), cbinfo);
+}
+
+typedef void (NativePropertyDeleter)
+    (v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Boolean> &);
+
+static
+void PropertyQueryCallbackWrapper(
+    v8::Local<v8::Name> property
+  , const v8::PropertyCallbackInfo<v8::Integer> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Integer>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  PropertyQueryCallback callback = reinterpret_cast<PropertyQueryCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kPropertyQueryIndex)
+              .As<v8::External>()->Value()));
+  callback(property.As<v8::String>(), cbinfo);
+}
+
+typedef void (*NativePropertyQuery)
+    (v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Integer> &);
+#else
+static
+void PropertyGetterCallbackWrapper(
+    v8::Local<v8::String> property
+  , const v8::PropertyCallbackInfo<v8::Value> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Value>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  PropertyGetterCallback callback = reinterpret_cast<PropertyGetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kPropertyGetterIndex)
+              .As<v8::External>()->Value()));
+  callback(property, cbinfo);
+}
+
+typedef void (*NativePropertyGetter)
+    (v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Value> &);
+
+static
+void PropertySetterCallbackWrapper(
+    v8::Local<v8::String> property
+  , v8::Local<v8::Value> value
+  , const v8::PropertyCallbackInfo<v8::Value> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Value>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  PropertySetterCallback callback = reinterpret_cast<PropertySetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kPropertySetterIndex)
+              .As<v8::External>()->Value()));
+  callback(property, value, cbinfo);
+}
+
+typedef void (*NativePropertySetter)(
+    v8::Local<v8::String>
+  , v8::Local<v8::Value>
+  , const v8::PropertyCallbackInfo<v8::Value> &);
+
+static
+void PropertyEnumeratorCallbackWrapper(
+    const v8::PropertyCallbackInfo<v8::Array> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Array>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  PropertyEnumeratorCallback callback =
+      reinterpret_cast<PropertyEnumeratorCallback>(reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kPropertyEnumeratorIndex)
+              .As<v8::External>()->Value()));
+  callback(cbinfo);
+}
+
+typedef void (*NativePropertyEnumerator)
+    (const v8::PropertyCallbackInfo<v8::Array> &);
+
+static
+void PropertyDeleterCallbackWrapper(
+    v8::Local<v8::String> property
+  , const v8::PropertyCallbackInfo<v8::Boolean> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Boolean>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  PropertyDeleterCallback callback = reinterpret_cast<PropertyDeleterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kPropertyDeleterIndex)
+              .As<v8::External>()->Value()));
+  callback(property, cbinfo);
+}
+
+typedef void (NativePropertyDeleter)
+    (v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Boolean> &);
+
+static
+void PropertyQueryCallbackWrapper(
+    v8::Local<v8::String> property
+  , const v8::PropertyCallbackInfo<v8::Integer> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Integer>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  PropertyQueryCallback callback = reinterpret_cast<PropertyQueryCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kPropertyQueryIndex)
+              .As<v8::External>()->Value()));
+  callback(property, cbinfo);
+}
+
+typedef void (*NativePropertyQuery)
+    (v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Integer> &);
+#endif
+
+static
+void IndexGetterCallbackWrapper(
+    uint32_t index, const v8::PropertyCallbackInfo<v8::Value> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Value>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  IndexGetterCallback callback = reinterpret_cast<IndexGetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kIndexPropertyGetterIndex)
+              .As<v8::External>()->Value()));
+  callback(index, cbinfo);
+}
+
+typedef void (*NativeIndexGetter)
+    (uint32_t, const v8::PropertyCallbackInfo<v8::Value> &);
+
+static
+void IndexSetterCallbackWrapper(
+    uint32_t index
+  , v8::Local<v8::Value> value
+  , const v8::PropertyCallbackInfo<v8::Value> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Value>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  IndexSetterCallback callback = reinterpret_cast<IndexSetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kIndexPropertySetterIndex)
+              .As<v8::External>()->Value()));
+  callback(index, value, cbinfo);
+}
+
+typedef void (*NativeIndexSetter)(
+    uint32_t
+  , v8::Local<v8::Value>
+  , const v8::PropertyCallbackInfo<v8::Value> &);
+
+static
+void IndexEnumeratorCallbackWrapper(
+    const v8::PropertyCallbackInfo<v8::Array> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Array>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  IndexEnumeratorCallback callback = reinterpret_cast<IndexEnumeratorCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(
+              kIndexPropertyEnumeratorIndex).As<v8::External>()->Value()));
+  callback(cbinfo);
+}
+
+typedef void (*NativeIndexEnumerator)
+    (const v8::PropertyCallbackInfo<v8::Array> &);
+
+static
+void IndexDeleterCallbackWrapper(
+    uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Boolean>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  IndexDeleterCallback callback = reinterpret_cast<IndexDeleterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kIndexPropertyDeleterIndex)
+              .As<v8::External>()->Value()));
+  callback(index, cbinfo);
+}
+
+typedef void (*NativeIndexDeleter)
+    (uint32_t, const v8::PropertyCallbackInfo<v8::Boolean> &);
+
+static
+void IndexQueryCallbackWrapper(
+    uint32_t index, const v8::PropertyCallbackInfo<v8::Integer> &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Integer>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  IndexQueryCallback callback = reinterpret_cast<IndexQueryCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kIndexPropertyQueryIndex)
+              .As<v8::External>()->Value()));
+  callback(index, cbinfo);
+}
+
+typedef void (*NativeIndexQuery)
+    (uint32_t, const v8::PropertyCallbackInfo<v8::Integer> &);
+}  // end of namespace imp
+
+#endif  // NAN_CALLBACKS_12_INL_H_
diff --git a/node_modules/nan/nan_callbacks_pre_12_inl.h b/node_modules/nan/nan_callbacks_pre_12_inl.h
new file mode 100644
index 0000000..c9ba499
--- /dev/null
+++ b/node_modules/nan/nan_callbacks_pre_12_inl.h
@@ -0,0 +1,520 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_CALLBACKS_PRE_12_INL_H_
+#define NAN_CALLBACKS_PRE_12_INL_H_
+
+namespace imp {
+template<typename T> class ReturnValueImp;
+}  // end of namespace imp
+
+template<typename T>
+class ReturnValue {
+  v8::Isolate *isolate_;
+  v8::Persistent<T> *value_;
+  friend class imp::ReturnValueImp<T>;
+
+ public:
+  template <class S>
+  explicit inline ReturnValue(v8::Isolate *isolate, v8::Persistent<S> *p) :
+      isolate_(isolate), value_(p) {}
+  template <class S>
+  explicit inline ReturnValue(const ReturnValue<S>& that)
+      : isolate_(that.isolate_), value_(that.value_) {
+    TYPE_CHECK(T, S);
+  }
+
+  // Handle setters
+  template <typename S> inline void Set(const v8::Local<S> &handle) {
+    TYPE_CHECK(T, S);
+    value_->Dispose();
+    *value_ = v8::Persistent<T>::New(handle);
+  }
+
+  template <typename S> inline void Set(const Global<S> &handle) {
+    TYPE_CHECK(T, S);
+    value_->Dispose();
+    *value_ = v8::Persistent<T>::New(handle.persistent);
+    const_cast<Global<S> &>(handle).Reset();
+  }
+
+  // Fast primitive setters
+  inline void Set(bool value) {
+    v8::HandleScope scope;
+
+    TYPE_CHECK(T, v8::Boolean);
+    value_->Dispose();
+    *value_ = v8::Persistent<T>::New(v8::Boolean::New(value));
+  }
+
+  inline void Set(double i) {
+    v8::HandleScope scope;
+
+    TYPE_CHECK(T, v8::Number);
+    value_->Dispose();
+    *value_ = v8::Persistent<T>::New(v8::Number::New(i));
+  }
+
+  inline void Set(int32_t i) {
+    v8::HandleScope scope;
+
+    TYPE_CHECK(T, v8::Integer);
+    value_->Dispose();
+    *value_ = v8::Persistent<T>::New(v8::Int32::New(i));
+  }
+
+  inline void Set(uint32_t i) {
+    v8::HandleScope scope;
+
+    TYPE_CHECK(T, v8::Integer);
+    value_->Dispose();
+    *value_ = v8::Persistent<T>::New(v8::Uint32::NewFromUnsigned(i));
+  }
+
+  // Fast JS primitive setters
+  inline void SetNull() {
+    v8::HandleScope scope;
+
+    TYPE_CHECK(T, v8::Primitive);
+    value_->Dispose();
+    *value_ = v8::Persistent<T>::New(v8::Null());
+  }
+
+  inline void SetUndefined() {
+    v8::HandleScope scope;
+
+    TYPE_CHECK(T, v8::Primitive);
+    value_->Dispose();
+    *value_ = v8::Persistent<T>::New(v8::Undefined());
+  }
+
+  inline void SetEmptyString() {
+    v8::HandleScope scope;
+
+    TYPE_CHECK(T, v8::String);
+    value_->Dispose();
+    *value_ = v8::Persistent<T>::New(v8::String::Empty());
+  }
+
+  // Convenience getter for isolate
+  inline v8::Isolate *GetIsolate() const {
+    return isolate_;
+  }
+
+  // Pointer setter: Uncompilable to prevent inadvertent misuse.
+  template<typename S>
+  inline void Set(S *whatever) { TYPE_CHECK(S*, v8::Primitive); }
+};
+
+template<typename T>
+class FunctionCallbackInfo {
+  const v8::Arguments &args_;
+  v8::Local<v8::Value> data_;
+  ReturnValue<T> return_value_;
+  v8::Persistent<T> retval_;
+
+ public:
+  explicit inline FunctionCallbackInfo(
+      const v8::Arguments &args
+    , v8::Local<v8::Value> data) :
+          args_(args)
+        , data_(data)
+        , return_value_(args.GetIsolate(), &retval_)
+        , retval_(v8::Persistent<T>::New(v8::Undefined())) {}
+
+  inline ~FunctionCallbackInfo() {
+    retval_.Dispose();
+    retval_.Clear();
+  }
+
+  inline ReturnValue<T> GetReturnValue() const {
+    return ReturnValue<T>(return_value_);
+  }
+
+  inline v8::Local<v8::Function> Callee() const { return args_.Callee(); }
+  inline v8::Local<v8::Value> Data() const { return data_; }
+  inline v8::Local<v8::Object> Holder() const { return args_.Holder(); }
+  inline bool IsConstructCall() const { return args_.IsConstructCall(); }
+  inline int Length() const { return args_.Length(); }
+  inline v8::Local<v8::Value> operator[](int i) const { return args_[i]; }
+  inline v8::Local<v8::Object> This() const { return args_.This(); }
+  inline v8::Isolate *GetIsolate() const { return args_.GetIsolate(); }
+
+
+ protected:
+  static const int kHolderIndex = 0;
+  static const int kIsolateIndex = 1;
+  static const int kReturnValueDefaultValueIndex = 2;
+  static const int kReturnValueIndex = 3;
+  static const int kDataIndex = 4;
+  static const int kCalleeIndex = 5;
+  static const int kContextSaveIndex = 6;
+  static const int kArgsLength = 7;
+
+ private:
+  NAN_DISALLOW_ASSIGN_COPY_MOVE(FunctionCallbackInfo)
+};
+
+template<typename T>
+class PropertyCallbackInfoBase {
+  const v8::AccessorInfo &info_;
+  const v8::Local<v8::Value> data_;
+
+ public:
+  explicit inline PropertyCallbackInfoBase(
+      const v8::AccessorInfo &info
+    , const v8::Local<v8::Value> data) :
+          info_(info)
+        , data_(data) {}
+
+  inline v8::Isolate* GetIsolate() const { return info_.GetIsolate(); }
+  inline v8::Local<v8::Value> Data() const { return data_; }
+  inline v8::Local<v8::Object> This() const { return info_.This(); }
+  inline v8::Local<v8::Object> Holder() const { return info_.Holder(); }
+
+ protected:
+  static const int kHolderIndex = 0;
+  static const int kIsolateIndex = 1;
+  static const int kReturnValueDefaultValueIndex = 2;
+  static const int kReturnValueIndex = 3;
+  static const int kDataIndex = 4;
+  static const int kThisIndex = 5;
+  static const int kArgsLength = 6;
+
+ private:
+  NAN_DISALLOW_ASSIGN_COPY_MOVE(PropertyCallbackInfoBase)
+};
+
+template<typename T>
+class PropertyCallbackInfo : public PropertyCallbackInfoBase<T> {
+  ReturnValue<T> return_value_;
+  v8::Persistent<T> retval_;
+
+ public:
+  explicit inline PropertyCallbackInfo(
+      const v8::AccessorInfo &info
+    , const v8::Local<v8::Value> data) :
+          PropertyCallbackInfoBase<T>(info, data)
+        , return_value_(info.GetIsolate(), &retval_)
+        , retval_(v8::Persistent<T>::New(v8::Undefined())) {}
+
+  inline ~PropertyCallbackInfo() {
+    retval_.Dispose();
+    retval_.Clear();
+  }
+
+  inline ReturnValue<T> GetReturnValue() const { return return_value_; }
+};
+
+template<>
+class PropertyCallbackInfo<v8::Array> :
+    public PropertyCallbackInfoBase<v8::Array> {
+  ReturnValue<v8::Array> return_value_;
+  v8::Persistent<v8::Array> retval_;
+
+ public:
+  explicit inline PropertyCallbackInfo(
+      const v8::AccessorInfo &info
+    , const v8::Local<v8::Value> data) :
+          PropertyCallbackInfoBase<v8::Array>(info, data)
+        , return_value_(info.GetIsolate(), &retval_)
+        , retval_(v8::Persistent<v8::Array>::New(v8::Local<v8::Array>())) {}
+
+  inline ~PropertyCallbackInfo() {
+    retval_.Dispose();
+    retval_.Clear();
+  }
+
+  inline ReturnValue<v8::Array> GetReturnValue() const {
+    return return_value_;
+  }
+};
+
+template<>
+class PropertyCallbackInfo<v8::Boolean> :
+    public PropertyCallbackInfoBase<v8::Boolean> {
+  ReturnValue<v8::Boolean> return_value_;
+  v8::Persistent<v8::Boolean> retval_;
+
+ public:
+  explicit inline PropertyCallbackInfo(
+      const v8::AccessorInfo &info
+    , const v8::Local<v8::Value> data) :
+          PropertyCallbackInfoBase<v8::Boolean>(info, data)
+        , return_value_(info.GetIsolate(), &retval_)
+        , retval_(v8::Persistent<v8::Boolean>::New(v8::Local<v8::Boolean>())) {}
+
+  inline ~PropertyCallbackInfo() {
+    retval_.Dispose();
+    retval_.Clear();
+  }
+
+  inline ReturnValue<v8::Boolean> GetReturnValue() const {
+    return return_value_;
+  }
+};
+
+template<>
+class PropertyCallbackInfo<v8::Integer> :
+    public PropertyCallbackInfoBase<v8::Integer> {
+  ReturnValue<v8::Integer> return_value_;
+  v8::Persistent<v8::Integer> retval_;
+
+ public:
+  explicit inline PropertyCallbackInfo(
+      const v8::AccessorInfo &info
+    , const v8::Local<v8::Value> data) :
+          PropertyCallbackInfoBase<v8::Integer>(info, data)
+        , return_value_(info.GetIsolate(), &retval_)
+        , retval_(v8::Persistent<v8::Integer>::New(v8::Local<v8::Integer>())) {}
+
+  inline ~PropertyCallbackInfo() {
+    retval_.Dispose();
+    retval_.Clear();
+  }
+
+  inline ReturnValue<v8::Integer> GetReturnValue() const {
+    return return_value_;
+  }
+};
+
+namespace imp {
+template<typename T>
+class ReturnValueImp : public ReturnValue<T> {
+ public:
+  explicit ReturnValueImp(ReturnValue<T> that) :
+      ReturnValue<T>(that) {}
+  inline v8::Handle<T> Value() {
+      return *ReturnValue<T>::value_;
+  }
+};
+
+static
+v8::Handle<v8::Value> FunctionCallbackWrapper(const v8::Arguments &args) {
+  v8::Local<v8::Object> obj = args.Data().As<v8::Object>();
+  FunctionCallback callback = reinterpret_cast<FunctionCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kFunctionIndex).As<v8::External>()->Value()));
+  FunctionCallbackInfo<v8::Value>
+      cbinfo(args, obj->GetInternalField(kDataIndex));
+  callback(cbinfo);
+  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
+}
+
+typedef v8::Handle<v8::Value> (*NativeFunction)(const v8::Arguments &);
+
+static
+v8::Handle<v8::Value> GetterCallbackWrapper(
+    v8::Local<v8::String> property, const v8::AccessorInfo &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Value>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  GetterCallback callback = reinterpret_cast<GetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kGetterIndex).As<v8::External>()->Value()));
+  callback(property, cbinfo);
+  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
+}
+
+typedef v8::Handle<v8::Value> (*NativeGetter)
+    (v8::Local<v8::String>, const v8::AccessorInfo &);
+
+static
+void SetterCallbackWrapper(
+    v8::Local<v8::String> property
+  , v8::Local<v8::Value> value
+  , const v8::AccessorInfo &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<void>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  SetterCallback callback = reinterpret_cast<SetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kSetterIndex).As<v8::External>()->Value()));
+  callback(property, value, cbinfo);
+}
+
+typedef void (*NativeSetter)
+    (v8::Local<v8::String>, v8::Local<v8::Value>, const v8::AccessorInfo &);
+
+static
+v8::Handle<v8::Value> PropertyGetterCallbackWrapper(
+    v8::Local<v8::String> property, const v8::AccessorInfo &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Value>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  PropertyGetterCallback callback = reinterpret_cast<PropertyGetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kPropertyGetterIndex)
+              .As<v8::External>()->Value()));
+  callback(property, cbinfo);
+  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
+}
+
+typedef v8::Handle<v8::Value> (*NativePropertyGetter)
+    (v8::Local<v8::String>, const v8::AccessorInfo &);
+
+static
+v8::Handle<v8::Value> PropertySetterCallbackWrapper(
+    v8::Local<v8::String> property
+  , v8::Local<v8::Value> value
+  , const v8::AccessorInfo &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Value>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  PropertySetterCallback callback = reinterpret_cast<PropertySetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kPropertySetterIndex)
+              .As<v8::External>()->Value()));
+  callback(property, value, cbinfo);
+  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
+}
+
+typedef v8::Handle<v8::Value> (*NativePropertySetter)
+    (v8::Local<v8::String>, v8::Local<v8::Value>, const v8::AccessorInfo &);
+
+static
+v8::Handle<v8::Array> PropertyEnumeratorCallbackWrapper(
+    const v8::AccessorInfo &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Array>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  PropertyEnumeratorCallback callback =
+      reinterpret_cast<PropertyEnumeratorCallback>(reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kPropertyEnumeratorIndex)
+              .As<v8::External>()->Value()));
+  callback(cbinfo);
+  return ReturnValueImp<v8::Array>(cbinfo.GetReturnValue()).Value();
+}
+
+typedef v8::Handle<v8::Array> (*NativePropertyEnumerator)
+    (const v8::AccessorInfo &);
+
+static
+v8::Handle<v8::Boolean> PropertyDeleterCallbackWrapper(
+    v8::Local<v8::String> property
+  , const v8::AccessorInfo &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Boolean>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  PropertyDeleterCallback callback = reinterpret_cast<PropertyDeleterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kPropertyDeleterIndex)
+              .As<v8::External>()->Value()));
+  callback(property, cbinfo);
+  return ReturnValueImp<v8::Boolean>(cbinfo.GetReturnValue()).Value();
+}
+
+typedef v8::Handle<v8::Boolean> (NativePropertyDeleter)
+    (v8::Local<v8::String>, const v8::AccessorInfo &);
+
+static
+v8::Handle<v8::Integer> PropertyQueryCallbackWrapper(
+    v8::Local<v8::String> property, const v8::AccessorInfo &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Integer>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  PropertyQueryCallback callback = reinterpret_cast<PropertyQueryCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kPropertyQueryIndex)
+              .As<v8::External>()->Value()));
+  callback(property, cbinfo);
+  return ReturnValueImp<v8::Integer>(cbinfo.GetReturnValue()).Value();
+}
+
+typedef v8::Handle<v8::Integer> (*NativePropertyQuery)
+    (v8::Local<v8::String>, const v8::AccessorInfo &);
+
+static
+v8::Handle<v8::Value> IndexGetterCallbackWrapper(
+    uint32_t index, const v8::AccessorInfo &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Value>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  IndexGetterCallback callback = reinterpret_cast<IndexGetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kIndexPropertyGetterIndex)
+              .As<v8::External>()->Value()));
+  callback(index, cbinfo);
+  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
+}
+
+typedef v8::Handle<v8::Value> (*NativeIndexGetter)
+    (uint32_t, const v8::AccessorInfo &);
+
+static
+v8::Handle<v8::Value> IndexSetterCallbackWrapper(
+    uint32_t index
+  , v8::Local<v8::Value> value
+  , const v8::AccessorInfo &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Value>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  IndexSetterCallback callback = reinterpret_cast<IndexSetterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kIndexPropertySetterIndex)
+              .As<v8::External>()->Value()));
+  callback(index, value, cbinfo);
+  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
+}
+
+typedef v8::Handle<v8::Value> (*NativeIndexSetter)
+    (uint32_t, v8::Local<v8::Value>, const v8::AccessorInfo &);
+
+static
+v8::Handle<v8::Array> IndexEnumeratorCallbackWrapper(
+    const v8::AccessorInfo &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Array>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  IndexEnumeratorCallback callback = reinterpret_cast<IndexEnumeratorCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kIndexPropertyEnumeratorIndex)
+              .As<v8::External>()->Value()));
+  callback(cbinfo);
+  return ReturnValueImp<v8::Array>(cbinfo.GetReturnValue()).Value();
+}
+
+typedef v8::Handle<v8::Array> (*NativeIndexEnumerator)
+    (const v8::AccessorInfo &);
+
+static
+v8::Handle<v8::Boolean> IndexDeleterCallbackWrapper(
+    uint32_t index, const v8::AccessorInfo &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Boolean>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  IndexDeleterCallback callback = reinterpret_cast<IndexDeleterCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kIndexPropertyDeleterIndex)
+              .As<v8::External>()->Value()));
+  callback(index, cbinfo);
+  return ReturnValueImp<v8::Boolean>(cbinfo.GetReturnValue()).Value();
+}
+
+typedef v8::Handle<v8::Boolean> (*NativeIndexDeleter)
+    (uint32_t, const v8::AccessorInfo &);
+
+static
+v8::Handle<v8::Integer> IndexQueryCallbackWrapper(
+    uint32_t index, const v8::AccessorInfo &info) {
+  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
+  PropertyCallbackInfo<v8::Integer>
+      cbinfo(info, obj->GetInternalField(kDataIndex));
+  IndexQueryCallback callback = reinterpret_cast<IndexQueryCallback>(
+      reinterpret_cast<intptr_t>(
+          obj->GetInternalField(kIndexPropertyQueryIndex)
+              .As<v8::External>()->Value()));
+  callback(index, cbinfo);
+  return ReturnValueImp<v8::Integer>(cbinfo.GetReturnValue()).Value();
+}
+
+typedef v8::Handle<v8::Integer> (*NativeIndexQuery)
+    (uint32_t, const v8::AccessorInfo &);
+}  // end of namespace imp
+
+#endif  // NAN_CALLBACKS_PRE_12_INL_H_
diff --git a/node_modules/nan/nan_converters.h b/node_modules/nan/nan_converters.h
new file mode 100644
index 0000000..c0b3272
--- /dev/null
+++ b/node_modules/nan/nan_converters.h
@@ -0,0 +1,72 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_CONVERTERS_H_
+#define NAN_CONVERTERS_H_
+
+namespace imp {
+template<typename T> struct ToFactoryBase {
+  typedef MaybeLocal<T> return_t;
+};
+template<typename T> struct ValueFactoryBase { typedef Maybe<T> return_t; };
+
+template<typename T> struct ToFactory;
+
+template<>
+struct ToFactory<v8::Function> : ToFactoryBase<v8::Function> {
+  static inline return_t convert(v8::Local<v8::Value> val) {
+    if (val.IsEmpty() || !val->IsFunction()) return MaybeLocal<v8::Function>();
+    return MaybeLocal<v8::Function>(val.As<v8::Function>());
+  }
+};
+
+#define X(TYPE)                                                                \
+    template<>                                                                 \
+    struct ToFactory<v8::TYPE> : ToFactoryBase<v8::TYPE> {                     \
+      static inline return_t convert(v8::Local<v8::Value> val);                \
+    };
+
+X(Boolean)
+X(Number)
+X(String)
+X(Object)
+X(Integer)
+X(Uint32)
+X(Int32)
+
+#undef X
+
+#define X(TYPE)                                                                \
+    template<>                                                                 \
+    struct ToFactory<TYPE> : ValueFactoryBase<TYPE> {                          \
+      static inline return_t convert(v8::Local<v8::Value> val);                \
+    };
+
+X(bool)
+X(double)
+X(int64_t)
+X(uint32_t)
+X(int32_t)
+
+#undef X
+}  // end of namespace imp
+
+template<typename T>
+inline
+typename imp::ToFactory<T>::return_t To(v8::Local<v8::Value> val) {
+  return imp::ToFactory<T>::convert(val);
+}
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+# include "nan_converters_43_inl.h"
+#else
+# include "nan_converters_pre_43_inl.h"
+#endif
+
+#endif  // NAN_CONVERTERS_H_
diff --git a/node_modules/nan/nan_converters_43_inl.h b/node_modules/nan/nan_converters_43_inl.h
new file mode 100644
index 0000000..41b72de
--- /dev/null
+++ b/node_modules/nan/nan_converters_43_inl.h
@@ -0,0 +1,68 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_CONVERTERS_43_INL_H_
+#define NAN_CONVERTERS_43_INL_H_
+
+#define X(TYPE)                                                                \
+imp::ToFactory<v8::TYPE>::return_t                                             \
+imp::ToFactory<v8::TYPE>::convert(v8::Local<v8::Value> val) {                  \
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();                            \
+  v8::EscapableHandleScope scope(isolate);                                     \
+  return scope.Escape(                                                         \
+      val->To ## TYPE(isolate->GetCurrentContext())                            \
+          .FromMaybe(v8::Local<v8::TYPE>()));                                  \
+}
+
+X(Number)
+X(String)
+X(Object)
+X(Integer)
+X(Uint32)
+X(Int32)
+// V8 <= 7.0
+#if V8_MAJOR_VERSION < 7 || (V8_MAJOR_VERSION == 7 && V8_MINOR_VERSION == 0)
+X(Boolean)
+#else
+imp::ToFactory<v8::Boolean>::return_t                                          \
+imp::ToFactory<v8::Boolean>::convert(v8::Local<v8::Value> val) {               \
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();                            \
+  v8::EscapableHandleScope scope(isolate);                                     \
+  return scope.Escape(val->ToBoolean(isolate));                                \
+}
+#endif
+
+#undef X
+
+#define X(TYPE, NAME)                                                          \
+imp::ToFactory<TYPE>::return_t                                                 \
+imp::ToFactory<TYPE>::convert(v8::Local<v8::Value> val) {                      \
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();                            \
+  v8::HandleScope scope(isolate);                                              \
+  return val->NAME ## Value(isolate->GetCurrentContext());                     \
+}
+
+X(double, Number)
+X(int64_t, Integer)
+X(uint32_t, Uint32)
+X(int32_t, Int32)
+// V8 <= 7.0
+#if V8_MAJOR_VERSION < 7 || (V8_MAJOR_VERSION == 7 && V8_MINOR_VERSION == 0)
+X(bool, Boolean)
+#else
+imp::ToFactory<bool>::return_t                                                 \
+imp::ToFactory<bool>::convert(v8::Local<v8::Value> val) {                      \
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();                            \
+  v8::HandleScope scope(isolate);                                              \
+  return Just<bool>(val->BooleanValue(isolate));                               \
+}
+#endif
+
+#undef X
+
+#endif  // NAN_CONVERTERS_43_INL_H_
diff --git a/node_modules/nan/nan_converters_pre_43_inl.h b/node_modules/nan/nan_converters_pre_43_inl.h
new file mode 100644
index 0000000..ae0518a
--- /dev/null
+++ b/node_modules/nan/nan_converters_pre_43_inl.h
@@ -0,0 +1,42 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_CONVERTERS_PRE_43_INL_H_
+#define NAN_CONVERTERS_PRE_43_INL_H_
+
+#define X(TYPE)                                                                \
+imp::ToFactory<v8::TYPE>::return_t                                             \
+imp::ToFactory<v8::TYPE>::convert(v8::Local<v8::Value> val) {                  \
+  return val->To ## TYPE();                                                    \
+}
+
+X(Boolean)
+X(Number)
+X(String)
+X(Object)
+X(Integer)
+X(Uint32)
+X(Int32)
+
+#undef X
+
+#define X(TYPE, NAME)                                                          \
+imp::ToFactory<TYPE>::return_t                                                 \
+imp::ToFactory<TYPE>::convert(v8::Local<v8::Value> val) {                      \
+  return Just(val->NAME ## Value());                                           \
+}
+
+X(bool, Boolean)
+X(double, Number)
+X(int64_t, Integer)
+X(uint32_t, Uint32)
+X(int32_t, Int32)
+
+#undef X
+
+#endif  // NAN_CONVERTERS_PRE_43_INL_H_
diff --git a/node_modules/nan/nan_define_own_property_helper.h b/node_modules/nan/nan_define_own_property_helper.h
new file mode 100644
index 0000000..d710ef2
--- /dev/null
+++ b/node_modules/nan/nan_define_own_property_helper.h
@@ -0,0 +1,29 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_DEFINE_OWN_PROPERTY_HELPER_H_
+#define NAN_DEFINE_OWN_PROPERTY_HELPER_H_
+
+namespace imp {
+
+inline Maybe<bool> DefineOwnPropertyHelper(
+    v8::PropertyAttribute current
+  , v8::Handle<v8::Object> obj
+  , v8::Handle<v8::String> key
+  , v8::Handle<v8::Value> value
+  , v8::PropertyAttribute attribs = v8::None) {
+  return !(current & v8::DontDelete) ||                     // configurable OR
+                  (!(current & v8::ReadOnly) &&             // writable AND
+                   !((attribs ^ current) & ~v8::ReadOnly))  // same excluding RO
+             ? Just<bool>(obj->ForceSet(key, value, attribs))
+             : Nothing<bool>();
+}
+
+}  // end of namespace imp
+
+#endif  // NAN_DEFINE_OWN_PROPERTY_HELPER_H_
diff --git a/node_modules/nan/nan_implementation_12_inl.h b/node_modules/nan/nan_implementation_12_inl.h
new file mode 100644
index 0000000..255293a
--- /dev/null
+++ b/node_modules/nan/nan_implementation_12_inl.h
@@ -0,0 +1,430 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_IMPLEMENTATION_12_INL_H_
+#define NAN_IMPLEMENTATION_12_INL_H_
+//==============================================================================
+// node v0.11 implementation
+//==============================================================================
+
+namespace imp {
+
+//=== Array ====================================================================
+
+Factory<v8::Array>::return_t
+Factory<v8::Array>::New() {
+  return v8::Array::New(v8::Isolate::GetCurrent());
+}
+
+Factory<v8::Array>::return_t
+Factory<v8::Array>::New(int length) {
+  return v8::Array::New(v8::Isolate::GetCurrent(), length);
+}
+
+//=== Boolean ==================================================================
+
+Factory<v8::Boolean>::return_t
+Factory<v8::Boolean>::New(bool value) {
+  return v8::Boolean::New(v8::Isolate::GetCurrent(), value);
+}
+
+//=== Boolean Object ===========================================================
+
+Factory<v8::BooleanObject>::return_t
+Factory<v8::BooleanObject>::New(bool value) {
+#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION)
+  return v8::BooleanObject::New(
+    v8::Isolate::GetCurrent(), value).As<v8::BooleanObject>();
+#else
+  return v8::BooleanObject::New(value).As<v8::BooleanObject>();
+#endif
+}
+
+//=== Context ==================================================================
+
+Factory<v8::Context>::return_t
+Factory<v8::Context>::New( v8::ExtensionConfiguration* extensions
+                         , v8::Local<v8::ObjectTemplate> tmpl
+                         , v8::Local<v8::Value> obj) {
+  return v8::Context::New(v8::Isolate::GetCurrent(), extensions, tmpl, obj);
+}
+
+//=== Date =====================================================================
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+Factory<v8::Date>::return_t
+Factory<v8::Date>::New(double value) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(v8::Date::New(isolate->GetCurrentContext(), value)
+      .FromMaybe(v8::Local<v8::Value>()).As<v8::Date>());
+}
+#else
+Factory<v8::Date>::return_t
+Factory<v8::Date>::New(double value) {
+  return v8::Date::New(v8::Isolate::GetCurrent(), value).As<v8::Date>();
+}
+#endif
+
+//=== External =================================================================
+
+Factory<v8::External>::return_t
+Factory<v8::External>::New(void * value) {
+  return v8::External::New(v8::Isolate::GetCurrent(), value);
+}
+
+//=== Function =================================================================
+
+Factory<v8::Function>::return_t
+Factory<v8::Function>::New( FunctionCallback callback
+                          , v8::Local<v8::Value> data) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  v8::Local<v8::ObjectTemplate> tpl = v8::ObjectTemplate::New(isolate);
+  tpl->SetInternalFieldCount(imp::kFunctionFieldCount);
+  v8::Local<v8::Object> obj = NewInstance(tpl).ToLocalChecked();
+
+  obj->SetInternalField(
+      imp::kFunctionIndex
+    , v8::External::New(isolate, reinterpret_cast<void *>(callback)));
+
+  v8::Local<v8::Value> val = v8::Local<v8::Value>::New(isolate, data);
+
+  if (!val.IsEmpty()) {
+    obj->SetInternalField(imp::kDataIndex, val);
+  }
+
+#if NODE_MAJOR_VERSION >= 10
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
+  v8::Local<v8::Function> function =
+      v8::Function::New(context, imp::FunctionCallbackWrapper, obj)
+      .ToLocalChecked();
+#else
+  v8::Local<v8::Function> function =
+      v8::Function::New(isolate, imp::FunctionCallbackWrapper, obj);
+#endif
+
+  return scope.Escape(function);
+}
+
+//=== Function Template ========================================================
+
+Factory<v8::FunctionTemplate>::return_t
+Factory<v8::FunctionTemplate>::New( FunctionCallback callback
+                                  , v8::Local<v8::Value> data
+                                  , v8::Local<v8::Signature> signature) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  if (callback) {
+    v8::EscapableHandleScope scope(isolate);
+    v8::Local<v8::ObjectTemplate> tpl = v8::ObjectTemplate::New(isolate);
+    tpl->SetInternalFieldCount(imp::kFunctionFieldCount);
+    v8::Local<v8::Object> obj = NewInstance(tpl).ToLocalChecked();
+
+    obj->SetInternalField(
+        imp::kFunctionIndex
+      , v8::External::New(isolate, reinterpret_cast<void *>(callback)));
+    v8::Local<v8::Value> val = v8::Local<v8::Value>::New(isolate, data);
+
+    if (!val.IsEmpty()) {
+      obj->SetInternalField(imp::kDataIndex, val);
+    }
+
+    return scope.Escape(v8::FunctionTemplate::New( isolate
+                                    , imp::FunctionCallbackWrapper
+                                    , obj
+                                    , signature));
+  } else {
+    return v8::FunctionTemplate::New(isolate, 0, data, signature);
+  }
+}
+
+//=== Number ===================================================================
+
+Factory<v8::Number>::return_t
+Factory<v8::Number>::New(double value) {
+  return v8::Number::New(v8::Isolate::GetCurrent(), value);
+}
+
+//=== Number Object ============================================================
+
+Factory<v8::NumberObject>::return_t
+Factory<v8::NumberObject>::New(double value) {
+  return v8::NumberObject::New( v8::Isolate::GetCurrent()
+                              , value).As<v8::NumberObject>();
+}
+
+//=== Integer, Int32 and Uint32 ================================================
+
+template <typename T>
+typename IntegerFactory<T>::return_t
+IntegerFactory<T>::New(int32_t value) {
+  return To<T>(T::New(v8::Isolate::GetCurrent(), value));
+}
+
+template <typename T>
+typename IntegerFactory<T>::return_t
+IntegerFactory<T>::New(uint32_t value) {
+  return To<T>(T::NewFromUnsigned(v8::Isolate::GetCurrent(), value));
+}
+
+Factory<v8::Uint32>::return_t
+Factory<v8::Uint32>::New(int32_t value) {
+  return To<v8::Uint32>(
+      v8::Uint32::NewFromUnsigned(v8::Isolate::GetCurrent(), value));
+}
+
+Factory<v8::Uint32>::return_t
+Factory<v8::Uint32>::New(uint32_t value) {
+  return To<v8::Uint32>(
+      v8::Uint32::NewFromUnsigned(v8::Isolate::GetCurrent(), value));
+}
+
+//=== Object ===================================================================
+
+Factory<v8::Object>::return_t
+Factory<v8::Object>::New() {
+  return v8::Object::New(v8::Isolate::GetCurrent());
+}
+
+//=== Object Template ==========================================================
+
+Factory<v8::ObjectTemplate>::return_t
+Factory<v8::ObjectTemplate>::New() {
+  return v8::ObjectTemplate::New(v8::Isolate::GetCurrent());
+}
+
+//=== RegExp ===================================================================
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+Factory<v8::RegExp>::return_t
+Factory<v8::RegExp>::New(
+    v8::Local<v8::String> pattern
+  , v8::RegExp::Flags flags) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(
+      v8::RegExp::New(isolate->GetCurrentContext(), pattern, flags)
+          .FromMaybe(v8::Local<v8::RegExp>()));
+}
+#else
+Factory<v8::RegExp>::return_t
+Factory<v8::RegExp>::New(
+    v8::Local<v8::String> pattern
+  , v8::RegExp::Flags flags) {
+  return v8::RegExp::New(pattern, flags);
+}
+#endif
+
+//=== Script ===================================================================
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+Factory<v8::Script>::return_t
+Factory<v8::Script>::New( v8::Local<v8::String> source) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  v8::ScriptCompiler::Source src(source);
+  return scope.Escape(
+      v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &src)
+          .FromMaybe(v8::Local<v8::Script>()));
+}
+
+Factory<v8::Script>::return_t
+Factory<v8::Script>::New( v8::Local<v8::String> source
+                        , v8::ScriptOrigin const& origin) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  v8::ScriptCompiler::Source src(source, origin);
+  return scope.Escape(
+      v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &src)
+          .FromMaybe(v8::Local<v8::Script>()));
+}
+#else
+Factory<v8::Script>::return_t
+Factory<v8::Script>::New( v8::Local<v8::String> source) {
+  v8::ScriptCompiler::Source src(source);
+  return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &src);
+}
+
+Factory<v8::Script>::return_t
+Factory<v8::Script>::New( v8::Local<v8::String> source
+                        , v8::ScriptOrigin const& origin) {
+  v8::ScriptCompiler::Source src(source, origin);
+  return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &src);
+}
+#endif
+
+//=== Signature ================================================================
+
+Factory<v8::Signature>::return_t
+Factory<v8::Signature>::New(Factory<v8::Signature>::FTH receiver) {
+  return v8::Signature::New(v8::Isolate::GetCurrent(), receiver);
+}
+
+//=== String ===================================================================
+
+Factory<v8::String>::return_t
+Factory<v8::String>::New() {
+  return v8::String::Empty(v8::Isolate::GetCurrent());
+}
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+Factory<v8::String>::return_t
+Factory<v8::String>::New(const char * value, int length) {
+  return v8::String::NewFromUtf8(
+      v8::Isolate::GetCurrent(), value, v8::NewStringType::kNormal, length);
+}
+
+Factory<v8::String>::return_t
+Factory<v8::String>::New(std::string const& value) {
+  assert(value.size() <= INT_MAX && "string too long");
+  return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(),
+      value.data(), v8::NewStringType::kNormal, static_cast<int>(value.size()));
+}
+
+Factory<v8::String>::return_t
+Factory<v8::String>::New(const uint16_t * value, int length) {
+  return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), value,
+        v8::NewStringType::kNormal, length);
+}
+
+Factory<v8::String>::return_t
+Factory<v8::String>::New(v8::String::ExternalStringResource * value) {
+  return v8::String::NewExternalTwoByte(v8::Isolate::GetCurrent(), value);
+}
+
+Factory<v8::String>::return_t
+Factory<v8::String>::New(ExternalOneByteStringResource * value) {
+  return v8::String::NewExternalOneByte(v8::Isolate::GetCurrent(), value);
+}
+#else
+Factory<v8::String>::return_t
+Factory<v8::String>::New(const char * value, int length) {
+  return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), value,
+                                 v8::String::kNormalString, length);
+}
+
+Factory<v8::String>::return_t
+Factory<v8::String>::New(
+    std::string const& value) /* NOLINT(build/include_what_you_use) */ {
+  assert(value.size() <= INT_MAX && "string too long");
+  return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), value.data(),
+                                 v8::String::kNormalString,
+                                 static_cast<int>(value.size()));
+}
+
+Factory<v8::String>::return_t
+Factory<v8::String>::New(const uint16_t * value, int length) {
+  return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), value,
+                                    v8::String::kNormalString, length);
+}
+
+Factory<v8::String>::return_t
+Factory<v8::String>::New(v8::String::ExternalStringResource * value) {
+  return v8::String::NewExternal(v8::Isolate::GetCurrent(), value);
+}
+
+Factory<v8::String>::return_t
+Factory<v8::String>::New(ExternalOneByteStringResource * value) {
+  return v8::String::NewExternal(v8::Isolate::GetCurrent(), value);
+}
+#endif
+
+//=== String Object ============================================================
+
+// See https://github.com/nodejs/nan/pull/811#discussion_r224594980.
+// Disable the warning as there is no way around it.
+// TODO(bnoordhuis) Use isolate-based version in Node.js v12.
+Factory<v8::StringObject>::return_t
+Factory<v8::StringObject>::New(v8::Local<v8::String> value) {
+// V8 > 7.0
+#if V8_MAJOR_VERSION > 7 || (V8_MAJOR_VERSION == 7 && V8_MINOR_VERSION > 0)
+  return v8::StringObject::New(v8::Isolate::GetCurrent(), value)
+      .As<v8::StringObject>();
+#else
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable : 4996)
+#endif
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+  return v8::StringObject::New(value).As<v8::StringObject>();
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#endif
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+#endif
+}
+
+//=== Unbound Script ===========================================================
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+Factory<v8::UnboundScript>::return_t
+Factory<v8::UnboundScript>::New(v8::Local<v8::String> source) {
+  v8::ScriptCompiler::Source src(source);
+  return v8::ScriptCompiler::CompileUnboundScript(
+      v8::Isolate::GetCurrent(), &src);
+}
+
+Factory<v8::UnboundScript>::return_t
+Factory<v8::UnboundScript>::New( v8::Local<v8::String> source
+                               , v8::ScriptOrigin const& origin) {
+  v8::ScriptCompiler::Source src(source, origin);
+  return v8::ScriptCompiler::CompileUnboundScript(
+      v8::Isolate::GetCurrent(), &src);
+}
+#else
+Factory<v8::UnboundScript>::return_t
+Factory<v8::UnboundScript>::New(v8::Local<v8::String> source) {
+  v8::ScriptCompiler::Source src(source);
+  return v8::ScriptCompiler::CompileUnbound(v8::Isolate::GetCurrent(), &src);
+}
+
+Factory<v8::UnboundScript>::return_t
+Factory<v8::UnboundScript>::New( v8::Local<v8::String> source
+                               , v8::ScriptOrigin const& origin) {
+  v8::ScriptCompiler::Source src(source, origin);
+  return v8::ScriptCompiler::CompileUnbound(v8::Isolate::GetCurrent(), &src);
+}
+#endif
+
+}  // end of namespace imp
+
+//=== Presistents and Handles ==================================================
+
+#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+template <typename T>
+inline v8::Local<T> New(v8::Handle<T> h) {
+  return v8::Local<T>::New(v8::Isolate::GetCurrent(), h);
+}
+#endif
+
+template <typename T, typename M>
+inline v8::Local<T> New(v8::Persistent<T, M> const& p) {
+  return v8::Local<T>::New(v8::Isolate::GetCurrent(), p);
+}
+
+template <typename T, typename M>
+inline v8::Local<T> New(Persistent<T, M> const& p) {
+  return v8::Local<T>::New(v8::Isolate::GetCurrent(), p);
+}
+
+template <typename T>
+inline v8::Local<T> New(Global<T> const& p) {
+  return v8::Local<T>::New(v8::Isolate::GetCurrent(), p);
+}
+
+#endif  // NAN_IMPLEMENTATION_12_INL_H_
diff --git a/node_modules/nan/nan_implementation_pre_12_inl.h b/node_modules/nan/nan_implementation_pre_12_inl.h
new file mode 100644
index 0000000..1472421
--- /dev/null
+++ b/node_modules/nan/nan_implementation_pre_12_inl.h
@@ -0,0 +1,263 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_IMPLEMENTATION_PRE_12_INL_H_
+#define NAN_IMPLEMENTATION_PRE_12_INL_H_
+
+//==============================================================================
+// node v0.10 implementation
+//==============================================================================
+
+namespace imp {
+
+//=== Array ====================================================================
+
+Factory<v8::Array>::return_t
+Factory<v8::Array>::New() {
+  return v8::Array::New();
+}
+
+Factory<v8::Array>::return_t
+Factory<v8::Array>::New(int length) {
+  return v8::Array::New(length);
+}
+
+//=== Boolean ==================================================================
+
+Factory<v8::Boolean>::return_t
+Factory<v8::Boolean>::New(bool value) {
+  return v8::Boolean::New(value)->ToBoolean();
+}
+
+//=== Boolean Object ===========================================================
+
+Factory<v8::BooleanObject>::return_t
+Factory<v8::BooleanObject>::New(bool value) {
+  return v8::BooleanObject::New(value).As<v8::BooleanObject>();
+}
+
+//=== Context ==================================================================
+
+Factory<v8::Context>::return_t
+Factory<v8::Context>::New( v8::ExtensionConfiguration* extensions
+                         , v8::Local<v8::ObjectTemplate> tmpl
+                         , v8::Local<v8::Value> obj) {
+  v8::Persistent<v8::Context> ctx = v8::Context::New(extensions, tmpl, obj);
+  v8::Local<v8::Context> lctx = v8::Local<v8::Context>::New(ctx);
+  ctx.Dispose();
+  return lctx;
+}
+
+//=== Date =====================================================================
+
+Factory<v8::Date>::return_t
+Factory<v8::Date>::New(double value) {
+  return v8::Date::New(value).As<v8::Date>();
+}
+
+//=== External =================================================================
+
+Factory<v8::External>::return_t
+Factory<v8::External>::New(void * value) {
+  return v8::External::New(value);
+}
+
+//=== Function =================================================================
+
+Factory<v8::Function>::return_t
+Factory<v8::Function>::New( FunctionCallback callback
+                          , v8::Local<v8::Value> data) {
+  v8::HandleScope scope;
+
+  return scope.Close(Factory<v8::FunctionTemplate>::New(
+                         callback, data, v8::Local<v8::Signature>())
+                         ->GetFunction());
+}
+
+
+//=== FunctionTemplate =========================================================
+
+Factory<v8::FunctionTemplate>::return_t
+Factory<v8::FunctionTemplate>::New( FunctionCallback callback
+                                  , v8::Local<v8::Value> data
+                                  , v8::Local<v8::Signature> signature) {
+  if (callback) {
+    v8::HandleScope scope;
+
+    v8::Local<v8::ObjectTemplate> tpl = v8::ObjectTemplate::New();
+    tpl->SetInternalFieldCount(imp::kFunctionFieldCount);
+    v8::Local<v8::Object> obj = tpl->NewInstance();
+
+    obj->SetInternalField(
+        imp::kFunctionIndex
+      , v8::External::New(reinterpret_cast<void *>(callback)));
+
+    v8::Local<v8::Value> val = v8::Local<v8::Value>::New(data);
+
+    if (!val.IsEmpty()) {
+      obj->SetInternalField(imp::kDataIndex, val);
+    }
+
+    // Note(agnat): Emulate length argument here. Unfortunately, I couldn't find
+    // a way. Have at it though...
+    return scope.Close(
+        v8::FunctionTemplate::New(imp::FunctionCallbackWrapper
+                                 , obj
+                                 , signature));
+  } else {
+    return v8::FunctionTemplate::New(0, data, signature);
+  }
+}
+
+//=== Number ===================================================================
+
+Factory<v8::Number>::return_t
+Factory<v8::Number>::New(double value) {
+  return v8::Number::New(value);
+}
+
+//=== Number Object ============================================================
+
+Factory<v8::NumberObject>::return_t
+Factory<v8::NumberObject>::New(double value) {
+  return v8::NumberObject::New(value).As<v8::NumberObject>();
+}
+
+//=== Integer, Int32 and Uint32 ================================================
+
+template <typename T>
+typename IntegerFactory<T>::return_t
+IntegerFactory<T>::New(int32_t value) {
+  return To<T>(T::New(value));
+}
+
+template <typename T>
+typename IntegerFactory<T>::return_t
+IntegerFactory<T>::New(uint32_t value) {
+  return To<T>(T::NewFromUnsigned(value));
+}
+
+Factory<v8::Uint32>::return_t
+Factory<v8::Uint32>::New(int32_t value) {
+  return To<v8::Uint32>(v8::Uint32::NewFromUnsigned(value));
+}
+
+Factory<v8::Uint32>::return_t
+Factory<v8::Uint32>::New(uint32_t value) {
+  return To<v8::Uint32>(v8::Uint32::NewFromUnsigned(value));
+}
+
+
+//=== Object ===================================================================
+
+Factory<v8::Object>::return_t
+Factory<v8::Object>::New() {
+  return v8::Object::New();
+}
+
+//=== Object Template ==========================================================
+
+Factory<v8::ObjectTemplate>::return_t
+Factory<v8::ObjectTemplate>::New() {
+  return v8::ObjectTemplate::New();
+}
+
+//=== RegExp ===================================================================
+
+Factory<v8::RegExp>::return_t
+Factory<v8::RegExp>::New(
+    v8::Local<v8::String> pattern
+  , v8::RegExp::Flags flags) {
+  return v8::RegExp::New(pattern, flags);
+}
+
+//=== Script ===================================================================
+
+Factory<v8::Script>::return_t
+Factory<v8::Script>::New( v8::Local<v8::String> source) {
+  return v8::Script::New(source);
+}
+Factory<v8::Script>::return_t
+Factory<v8::Script>::New( v8::Local<v8::String> source
+                        , v8::ScriptOrigin const& origin) {
+  return v8::Script::New(source, const_cast<v8::ScriptOrigin*>(&origin));
+}
+
+//=== Signature ================================================================
+
+Factory<v8::Signature>::return_t
+Factory<v8::Signature>::New(Factory<v8::Signature>::FTH receiver) {
+  return v8::Signature::New(receiver);
+}
+
+//=== String ===================================================================
+
+Factory<v8::String>::return_t
+Factory<v8::String>::New() {
+  return v8::String::Empty();
+}
+
+Factory<v8::String>::return_t
+Factory<v8::String>::New(const char * value, int length) {
+  return v8::String::New(value, length);
+}
+
+Factory<v8::String>::return_t
+Factory<v8::String>::New(
+    std::string const& value) /* NOLINT(build/include_what_you_use) */ {
+  assert(value.size() <= INT_MAX && "string too long");
+  return v8::String::New(value.data(), static_cast<int>(value.size()));
+}
+
+Factory<v8::String>::return_t
+Factory<v8::String>::New(const uint16_t * value, int length) {
+  return v8::String::New(value, length);
+}
+
+Factory<v8::String>::return_t
+Factory<v8::String>::New(v8::String::ExternalStringResource * value) {
+  return v8::String::NewExternal(value);
+}
+
+Factory<v8::String>::return_t
+Factory<v8::String>::New(v8::String::ExternalAsciiStringResource * value) {
+  return v8::String::NewExternal(value);
+}
+
+//=== String Object ============================================================
+
+Factory<v8::StringObject>::return_t
+Factory<v8::StringObject>::New(v8::Local<v8::String> value) {
+  return v8::StringObject::New(value).As<v8::StringObject>();
+}
+
+}  // end of namespace imp
+
+//=== Presistents and Handles ==================================================
+
+template <typename T>
+inline v8::Local<T> New(v8::Handle<T> h) {
+  return v8::Local<T>::New(h);
+}
+
+template <typename T>
+inline v8::Local<T> New(v8::Persistent<T> const& p) {
+  return v8::Local<T>::New(p);
+}
+
+template <typename T, typename M>
+inline v8::Local<T> New(Persistent<T, M> const& p) {
+  return v8::Local<T>::New(p.persistent);
+}
+
+template <typename T>
+inline v8::Local<T> New(Global<T> const& p) {
+  return v8::Local<T>::New(p.persistent);
+}
+
+#endif  // NAN_IMPLEMENTATION_PRE_12_INL_H_
diff --git a/node_modules/nan/nan_json.h b/node_modules/nan/nan_json.h
new file mode 100644
index 0000000..33ac8ba
--- /dev/null
+++ b/node_modules/nan/nan_json.h
@@ -0,0 +1,166 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_JSON_H_
+#define NAN_JSON_H_
+
+#if NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION
+#define NAN_JSON_H_NEED_PARSE 1
+#else
+#define NAN_JSON_H_NEED_PARSE 0
+#endif  // NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION
+
+#if NODE_MODULE_VERSION >= NODE_7_0_MODULE_VERSION
+#define NAN_JSON_H_NEED_STRINGIFY 0
+#else
+#define NAN_JSON_H_NEED_STRINGIFY 1
+#endif  // NODE_MODULE_VERSION >= NODE_7_0_MODULE_VERSION
+
+class JSON {
+ public:
+  JSON() {
+#if NAN_JSON_H_NEED_PARSE + NAN_JSON_H_NEED_STRINGIFY
+    Nan::HandleScope scope;
+
+    Nan::MaybeLocal<v8::Value> maybe_global_json = Nan::Get(
+      Nan::GetCurrentContext()->Global(),
+      Nan::New("JSON").ToLocalChecked()
+    );
+
+    assert(!maybe_global_json.IsEmpty() && "global JSON is empty");
+    v8::Local<v8::Value> val_global_json = maybe_global_json.ToLocalChecked();
+
+    assert(val_global_json->IsObject() && "global JSON is not an object");
+    Nan::MaybeLocal<v8::Object> maybe_obj_global_json =
+      Nan::To<v8::Object>(val_global_json);
+
+    assert(!maybe_obj_global_json.IsEmpty() && "global JSON object is empty");
+    v8::Local<v8::Object> global_json = maybe_obj_global_json.ToLocalChecked();
+
+#if NAN_JSON_H_NEED_PARSE
+    Nan::MaybeLocal<v8::Value> maybe_parse_method = Nan::Get(
+      global_json, Nan::New("parse").ToLocalChecked()
+    );
+
+    assert(!maybe_parse_method.IsEmpty() && "JSON.parse is empty");
+    v8::Local<v8::Value> parse_method = maybe_parse_method.ToLocalChecked();
+
+    assert(parse_method->IsFunction() && "JSON.parse is not a function");
+    parse_cb_.Reset(parse_method.As<v8::Function>());
+#endif  // NAN_JSON_H_NEED_PARSE
+
+#if NAN_JSON_H_NEED_STRINGIFY
+    Nan::MaybeLocal<v8::Value> maybe_stringify_method = Nan::Get(
+      global_json, Nan::New("stringify").ToLocalChecked()
+    );
+
+    assert(!maybe_stringify_method.IsEmpty() && "JSON.stringify is empty");
+    v8::Local<v8::Value> stringify_method =
+      maybe_stringify_method.ToLocalChecked();
+
+    assert(
+      stringify_method->IsFunction() && "JSON.stringify is not a function"
+    );
+    stringify_cb_.Reset(stringify_method.As<v8::Function>());
+#endif  // NAN_JSON_H_NEED_STRINGIFY
+#endif  // NAN_JSON_H_NEED_PARSE + NAN_JSON_H_NEED_STRINGIFY
+  }
+
+  inline
+  Nan::MaybeLocal<v8::Value> Parse(v8::Local<v8::String> json_string) {
+    Nan::EscapableHandleScope scope;
+#if NAN_JSON_H_NEED_PARSE
+    return scope.Escape(parse(json_string));
+#else
+    Nan::MaybeLocal<v8::Value> result;
+#if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION && \
+    NODE_MODULE_VERSION <= IOJS_2_0_MODULE_VERSION
+    result = v8::JSON::Parse(json_string);
+#else
+#if NODE_MODULE_VERSION > NODE_6_0_MODULE_VERSION
+    v8::Local<v8::Context> context_or_isolate = Nan::GetCurrentContext();
+#else
+    v8::Isolate* context_or_isolate = v8::Isolate::GetCurrent();
+#endif  // NODE_MODULE_VERSION > NODE_6_0_MODULE_VERSION
+    result = v8::JSON::Parse(context_or_isolate, json_string);
+#endif  // NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION &&
+        // NODE_MODULE_VERSION <= IOJS_2_0_MODULE_VERSION
+    if (result.IsEmpty()) return v8::Local<v8::Value>();
+    return scope.Escape(result.ToLocalChecked());
+#endif  // NAN_JSON_H_NEED_PARSE
+  }
+
+  inline
+  Nan::MaybeLocal<v8::String> Stringify(v8::Local<v8::Object> json_object) {
+    Nan::EscapableHandleScope scope;
+    Nan::MaybeLocal<v8::String> result =
+#if NAN_JSON_H_NEED_STRINGIFY
+      Nan::To<v8::String>(stringify(json_object));
+#else
+      v8::JSON::Stringify(Nan::GetCurrentContext(), json_object);
+#endif  // NAN_JSON_H_NEED_STRINGIFY
+    if (result.IsEmpty()) return v8::Local<v8::String>();
+    return scope.Escape(result.ToLocalChecked());
+  }
+
+  inline
+  Nan::MaybeLocal<v8::String> Stringify(v8::Local<v8::Object> json_object,
+    v8::Local<v8::String> gap) {
+    Nan::EscapableHandleScope scope;
+    Nan::MaybeLocal<v8::String> result =
+#if NAN_JSON_H_NEED_STRINGIFY
+      Nan::To<v8::String>(stringify(json_object, gap));
+#else
+      v8::JSON::Stringify(Nan::GetCurrentContext(), json_object, gap);
+#endif  // NAN_JSON_H_NEED_STRINGIFY
+    if (result.IsEmpty()) return v8::Local<v8::String>();
+    return scope.Escape(result.ToLocalChecked());
+  }
+
+ private:
+  NAN_DISALLOW_ASSIGN_COPY_MOVE(JSON)
+#if NAN_JSON_H_NEED_PARSE
+  Nan::Callback parse_cb_;
+#endif  // NAN_JSON_H_NEED_PARSE
+#if NAN_JSON_H_NEED_STRINGIFY
+  Nan::Callback stringify_cb_;
+#endif  // NAN_JSON_H_NEED_STRINGIFY
+
+#if NAN_JSON_H_NEED_PARSE
+  inline v8::Local<v8::Value> parse(v8::Local<v8::Value> arg) {
+    assert(!parse_cb_.IsEmpty() && "parse_cb_ is empty");
+    AsyncResource resource("nan:JSON.parse");
+    return parse_cb_.Call(1, &arg, &resource).FromMaybe(v8::Local<v8::Value>());
+  }
+#endif  // NAN_JSON_H_NEED_PARSE
+
+#if NAN_JSON_H_NEED_STRINGIFY
+  inline v8::Local<v8::Value> stringify(v8::Local<v8::Value> arg) {
+    assert(!stringify_cb_.IsEmpty() && "stringify_cb_ is empty");
+    AsyncResource resource("nan:JSON.stringify");
+    return stringify_cb_.Call(1, &arg, &resource)
+        .FromMaybe(v8::Local<v8::Value>());
+  }
+
+  inline v8::Local<v8::Value> stringify(v8::Local<v8::Value> arg,
+    v8::Local<v8::String> gap) {
+    assert(!stringify_cb_.IsEmpty() && "stringify_cb_ is empty");
+
+    v8::Local<v8::Value> argv[] = {
+      arg,
+      Nan::Null(),
+      gap
+    };
+    AsyncResource resource("nan:JSON.stringify");
+    return stringify_cb_.Call(3, argv, &resource)
+        .FromMaybe(v8::Local<v8::Value>());
+  }
+#endif  // NAN_JSON_H_NEED_STRINGIFY
+};
+
+#endif  // NAN_JSON_H_
diff --git a/node_modules/nan/nan_maybe_43_inl.h b/node_modules/nan/nan_maybe_43_inl.h
new file mode 100644
index 0000000..c04ce30
--- /dev/null
+++ b/node_modules/nan/nan_maybe_43_inl.h
@@ -0,0 +1,356 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_MAYBE_43_INL_H_
+#define NAN_MAYBE_43_INL_H_
+
+template<typename T>
+using MaybeLocal = v8::MaybeLocal<T>;
+
+inline
+MaybeLocal<v8::String> ToDetailString(v8::Local<v8::Value> val) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(val->ToDetailString(isolate->GetCurrentContext())
+                          .FromMaybe(v8::Local<v8::String>()));
+}
+
+inline
+MaybeLocal<v8::Uint32> ToArrayIndex(v8::Local<v8::Value> val) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(val->ToArrayIndex(isolate->GetCurrentContext())
+                          .FromMaybe(v8::Local<v8::Uint32>()));
+}
+
+inline
+Maybe<bool> Equals(v8::Local<v8::Value> a, v8::Local<v8::Value>(b)) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return a->Equals(isolate->GetCurrentContext(), b);
+}
+
+inline
+MaybeLocal<v8::Object> NewInstance(v8::Local<v8::Function> h) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(h->NewInstance(isolate->GetCurrentContext())
+                          .FromMaybe(v8::Local<v8::Object>()));
+}
+
+inline
+MaybeLocal<v8::Object> NewInstance(
+      v8::Local<v8::Function> h
+    , int argc
+    , v8::Local<v8::Value> argv[]) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(h->NewInstance(isolate->GetCurrentContext(), argc, argv)
+                          .FromMaybe(v8::Local<v8::Object>()));
+}
+
+inline
+MaybeLocal<v8::Object> NewInstance(v8::Local<v8::ObjectTemplate> h) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(h->NewInstance(isolate->GetCurrentContext())
+                          .FromMaybe(v8::Local<v8::Object>()));
+}
+
+
+inline MaybeLocal<v8::Function> GetFunction(
+    v8::Local<v8::FunctionTemplate> t) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(t->GetFunction(isolate->GetCurrentContext())
+                          .FromMaybe(v8::Local<v8::Function>()));
+}
+
+inline Maybe<bool> Set(
+    v8::Local<v8::Object> obj
+  , v8::Local<v8::Value> key
+  , v8::Local<v8::Value> value) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return obj->Set(isolate->GetCurrentContext(), key, value);
+}
+
+inline Maybe<bool> Set(
+    v8::Local<v8::Object> obj
+  , uint32_t index
+  , v8::Local<v8::Value> value) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return obj->Set(isolate->GetCurrentContext(), index, value);
+}
+
+#if NODE_MODULE_VERSION < NODE_4_0_MODULE_VERSION
+#include "nan_define_own_property_helper.h"  // NOLINT(build/include)
+#endif
+
+inline Maybe<bool> DefineOwnProperty(
+    v8::Local<v8::Object> obj
+  , v8::Local<v8::String> key
+  , v8::Local<v8::Value> value
+  , v8::PropertyAttribute attribs = v8::None) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+#if NODE_MODULE_VERSION >= NODE_4_0_MODULE_VERSION
+  return obj->DefineOwnProperty(isolate->GetCurrentContext(), key, value,
+                                attribs);
+#else
+  Maybe<v8::PropertyAttribute> maybeCurrent =
+      obj->GetPropertyAttributes(isolate->GetCurrentContext(), key);
+  if (maybeCurrent.IsNothing()) {
+    return Nothing<bool>();
+  }
+  v8::PropertyAttribute current = maybeCurrent.FromJust();
+  return imp::DefineOwnPropertyHelper(current, obj, key, value, attribs);
+#endif
+}
+
+NAN_DEPRECATED inline Maybe<bool> ForceSet(
+    v8::Local<v8::Object> obj
+  , v8::Local<v8::Value> key
+  , v8::Local<v8::Value> value
+  , v8::PropertyAttribute attribs = v8::None) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+#if NODE_MODULE_VERSION >= NODE_9_0_MODULE_VERSION
+  return key->IsName()
+             ? obj->DefineOwnProperty(isolate->GetCurrentContext(),
+                                      key.As<v8::Name>(), value, attribs)
+             : Nothing<bool>();
+#else
+  return obj->ForceSet(isolate->GetCurrentContext(), key, value, attribs);
+#endif
+}
+
+inline MaybeLocal<v8::Value> Get(
+    v8::Local<v8::Object> obj
+  , v8::Local<v8::Value> key) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(obj->Get(isolate->GetCurrentContext(), key)
+                          .FromMaybe(v8::Local<v8::Value>()));
+}
+
+inline
+MaybeLocal<v8::Value> Get(v8::Local<v8::Object> obj, uint32_t index) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(obj->Get(isolate->GetCurrentContext(), index)
+                          .FromMaybe(v8::Local<v8::Value>()));
+}
+
+inline v8::PropertyAttribute GetPropertyAttributes(
+    v8::Local<v8::Object> obj
+  , v8::Local<v8::Value> key) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return obj->GetPropertyAttributes(isolate->GetCurrentContext(), key)
+      .FromJust();
+}
+
+inline Maybe<bool> Has(
+    v8::Local<v8::Object> obj
+  , v8::Local<v8::String> key) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return obj->Has(isolate->GetCurrentContext(), key);
+}
+
+inline Maybe<bool> Has(v8::Local<v8::Object> obj, uint32_t index) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return obj->Has(isolate->GetCurrentContext(), index);
+}
+
+inline Maybe<bool> Delete(
+    v8::Local<v8::Object> obj
+  , v8::Local<v8::String> key) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return obj->Delete(isolate->GetCurrentContext(), key);
+}
+
+inline
+Maybe<bool> Delete(v8::Local<v8::Object> obj, uint32_t index) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return obj->Delete(isolate->GetCurrentContext(), index);
+}
+
+inline
+MaybeLocal<v8::Array> GetPropertyNames(v8::Local<v8::Object> obj) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(obj->GetPropertyNames(isolate->GetCurrentContext())
+                          .FromMaybe(v8::Local<v8::Array>()));
+}
+
+inline
+MaybeLocal<v8::Array> GetOwnPropertyNames(v8::Local<v8::Object> obj) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(obj->GetOwnPropertyNames(isolate->GetCurrentContext())
+                          .FromMaybe(v8::Local<v8::Array>()));
+}
+
+inline Maybe<bool> SetPrototype(
+    v8::Local<v8::Object> obj
+  , v8::Local<v8::Value> prototype) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return obj->SetPrototype(isolate->GetCurrentContext(), prototype);
+}
+
+inline MaybeLocal<v8::String> ObjectProtoToString(
+    v8::Local<v8::Object> obj) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(obj->ObjectProtoToString(isolate->GetCurrentContext())
+                          .FromMaybe(v8::Local<v8::String>()));
+}
+
+inline Maybe<bool> HasOwnProperty(
+    v8::Local<v8::Object> obj
+  , v8::Local<v8::String> key) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return obj->HasOwnProperty(isolate->GetCurrentContext(), key);
+}
+
+inline Maybe<bool> HasRealNamedProperty(
+    v8::Local<v8::Object> obj
+  , v8::Local<v8::String> key) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return obj->HasRealNamedProperty(isolate->GetCurrentContext(), key);
+}
+
+inline Maybe<bool> HasRealIndexedProperty(
+    v8::Local<v8::Object> obj
+  , uint32_t index) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return obj->HasRealIndexedProperty(isolate->GetCurrentContext(), index);
+}
+
+inline Maybe<bool> HasRealNamedCallbackProperty(
+    v8::Local<v8::Object> obj
+  , v8::Local<v8::String> key) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return obj->HasRealNamedCallbackProperty(isolate->GetCurrentContext(), key);
+}
+
+inline MaybeLocal<v8::Value> GetRealNamedPropertyInPrototypeChain(
+    v8::Local<v8::Object> obj
+  , v8::Local<v8::String> key) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(obj->GetRealNamedPropertyInPrototypeChain(
+                             isolate->GetCurrentContext(), key)
+                          .FromMaybe(v8::Local<v8::Value>()));
+}
+
+inline MaybeLocal<v8::Value> GetRealNamedProperty(
+    v8::Local<v8::Object> obj
+  , v8::Local<v8::String> key) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(
+      obj->GetRealNamedProperty(isolate->GetCurrentContext(), key)
+          .FromMaybe(v8::Local<v8::Value>()));
+}
+
+inline MaybeLocal<v8::Value> CallAsFunction(
+    v8::Local<v8::Object> obj
+  , v8::Local<v8::Object> recv
+  , int argc
+  , v8::Local<v8::Value> argv[]) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(
+      obj->CallAsFunction(isolate->GetCurrentContext(), recv, argc, argv)
+          .FromMaybe(v8::Local<v8::Value>()));
+}
+
+inline MaybeLocal<v8::Value> CallAsConstructor(
+    v8::Local<v8::Object> obj
+  , int argc, v8::Local<v8::Value> argv[]) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(
+      obj->CallAsConstructor(isolate->GetCurrentContext(), argc, argv)
+          .FromMaybe(v8::Local<v8::Value>()));
+}
+
+inline
+MaybeLocal<v8::String> GetSourceLine(v8::Local<v8::Message> msg) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(msg->GetSourceLine(isolate->GetCurrentContext())
+                          .FromMaybe(v8::Local<v8::String>()));
+}
+
+inline Maybe<int> GetLineNumber(v8::Local<v8::Message> msg) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return msg->GetLineNumber(isolate->GetCurrentContext());
+}
+
+inline Maybe<int> GetStartColumn(v8::Local<v8::Message> msg) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return msg->GetStartColumn(isolate->GetCurrentContext());
+}
+
+inline Maybe<int> GetEndColumn(v8::Local<v8::Message> msg) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::HandleScope scope(isolate);
+  return msg->GetEndColumn(isolate->GetCurrentContext());
+}
+
+inline MaybeLocal<v8::Object> CloneElementAt(
+    v8::Local<v8::Array> array
+  , uint32_t index) {
+#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION)
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
+  v8::Local<v8::Value> elem;
+  v8::Local<v8::Object> obj;
+  if (!array->Get(context, index).ToLocal(&elem)) {
+    return scope.Escape(obj);
+  }
+  if (!elem->ToObject(context).ToLocal(&obj)) {
+    return scope.Escape(v8::Local<v8::Object>());
+  }
+  return scope.Escape(obj->Clone());
+#else
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(array->CloneElementAt(isolate->GetCurrentContext(), index)
+                          .FromMaybe(v8::Local<v8::Object>()));
+#endif
+}
+
+inline MaybeLocal<v8::Value> Call(
+    v8::Local<v8::Function> fun
+  , v8::Local<v8::Object> recv
+  , int argc
+  , v8::Local<v8::Value> argv[]) {
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  return scope.Escape(fun->Call(isolate->GetCurrentContext(), recv, argc, argv)
+                          .FromMaybe(v8::Local<v8::Value>()));
+}
+
+#endif  // NAN_MAYBE_43_INL_H_
diff --git a/node_modules/nan/nan_maybe_pre_43_inl.h b/node_modules/nan/nan_maybe_pre_43_inl.h
new file mode 100644
index 0000000..83325ae
--- /dev/null
+++ b/node_modules/nan/nan_maybe_pre_43_inl.h
@@ -0,0 +1,268 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_MAYBE_PRE_43_INL_H_
+#define NAN_MAYBE_PRE_43_INL_H_
+
+template<typename T>
+class MaybeLocal {
+ public:
+  inline MaybeLocal() : val_(v8::Local<T>()) {}
+
+  template<typename S>
+# if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION
+  inline
+  MaybeLocal(v8::Local<S> that) : val_(that) {}  // NOLINT(runtime/explicit)
+# else
+  inline
+  MaybeLocal(v8::Local<S> that) :  // NOLINT(runtime/explicit)
+      val_(*reinterpret_cast<v8::Local<T>*>(&that)) {}
+# endif
+
+  inline bool IsEmpty() const { return val_.IsEmpty(); }
+
+  template<typename S>
+  inline bool ToLocal(v8::Local<S> *out) const {
+    *out = val_;
+    return !IsEmpty();
+  }
+
+  inline v8::Local<T> ToLocalChecked() const {
+#if defined(V8_ENABLE_CHECKS)
+    assert(!IsEmpty() && "ToLocalChecked is Empty");
+#endif  // V8_ENABLE_CHECKS
+    return val_;
+  }
+
+  template<typename S>
+  inline v8::Local<S> FromMaybe(v8::Local<S> default_value) const {
+    return IsEmpty() ? default_value : v8::Local<S>(val_);
+  }
+
+ private:
+  v8::Local<T> val_;
+};
+
+inline
+MaybeLocal<v8::String> ToDetailString(v8::Handle<v8::Value> val) {
+  return MaybeLocal<v8::String>(val->ToDetailString());
+}
+
+inline
+MaybeLocal<v8::Uint32> ToArrayIndex(v8::Handle<v8::Value> val) {
+  return MaybeLocal<v8::Uint32>(val->ToArrayIndex());
+}
+
+inline
+Maybe<bool> Equals(v8::Handle<v8::Value> a, v8::Handle<v8::Value>(b)) {
+  return Just<bool>(a->Equals(b));
+}
+
+inline
+MaybeLocal<v8::Object> NewInstance(v8::Handle<v8::Function> h) {
+  return MaybeLocal<v8::Object>(h->NewInstance());
+}
+
+inline
+MaybeLocal<v8::Object> NewInstance(
+      v8::Local<v8::Function> h
+    , int argc
+    , v8::Local<v8::Value> argv[]) {
+  return MaybeLocal<v8::Object>(h->NewInstance(argc, argv));
+}
+
+inline
+MaybeLocal<v8::Object> NewInstance(v8::Handle<v8::ObjectTemplate> h) {
+  return MaybeLocal<v8::Object>(h->NewInstance());
+}
+
+inline
+MaybeLocal<v8::Function> GetFunction(v8::Handle<v8::FunctionTemplate> t) {
+  return MaybeLocal<v8::Function>(t->GetFunction());
+}
+
+inline Maybe<bool> Set(
+    v8::Handle<v8::Object> obj
+  , v8::Handle<v8::Value> key
+  , v8::Handle<v8::Value> value) {
+  return Just<bool>(obj->Set(key, value));
+}
+
+inline Maybe<bool> Set(
+    v8::Handle<v8::Object> obj
+  , uint32_t index
+  , v8::Handle<v8::Value> value) {
+  return Just<bool>(obj->Set(index, value));
+}
+
+#include "nan_define_own_property_helper.h"  // NOLINT(build/include)
+
+inline Maybe<bool> DefineOwnProperty(
+    v8::Handle<v8::Object> obj
+  , v8::Handle<v8::String> key
+  , v8::Handle<v8::Value> value
+  , v8::PropertyAttribute attribs = v8::None) {
+  v8::PropertyAttribute current = obj->GetPropertyAttributes(key);
+  return imp::DefineOwnPropertyHelper(current, obj, key, value, attribs);
+}
+
+NAN_DEPRECATED inline Maybe<bool> ForceSet(
+    v8::Handle<v8::Object> obj
+  , v8::Handle<v8::Value> key
+  , v8::Handle<v8::Value> value
+  , v8::PropertyAttribute attribs = v8::None) {
+  return Just<bool>(obj->ForceSet(key, value, attribs));
+}
+
+inline MaybeLocal<v8::Value> Get(
+    v8::Handle<v8::Object> obj
+  , v8::Handle<v8::Value> key) {
+  return MaybeLocal<v8::Value>(obj->Get(key));
+}
+
+inline MaybeLocal<v8::Value> Get(
+    v8::Handle<v8::Object> obj
+  , uint32_t index) {
+  return MaybeLocal<v8::Value>(obj->Get(index));
+}
+
+inline Maybe<v8::PropertyAttribute> GetPropertyAttributes(
+    v8::Handle<v8::Object> obj
+  , v8::Handle<v8::Value> key) {
+  return Just<v8::PropertyAttribute>(obj->GetPropertyAttributes(key));
+}
+
+inline Maybe<bool> Has(
+    v8::Handle<v8::Object> obj
+  , v8::Handle<v8::String> key) {
+  return Just<bool>(obj->Has(key));
+}
+
+inline Maybe<bool> Has(
+    v8::Handle<v8::Object> obj
+  , uint32_t index) {
+  return Just<bool>(obj->Has(index));
+}
+
+inline Maybe<bool> Delete(
+    v8::Handle<v8::Object> obj
+  , v8::Handle<v8::String> key) {
+  return Just<bool>(obj->Delete(key));
+}
+
+inline Maybe<bool> Delete(
+    v8::Handle<v8::Object> obj
+  , uint32_t index) {
+  return Just<bool>(obj->Delete(index));
+}
+
+inline
+MaybeLocal<v8::Array> GetPropertyNames(v8::Handle<v8::Object> obj) {
+  return MaybeLocal<v8::Array>(obj->GetPropertyNames());
+}
+
+inline
+MaybeLocal<v8::Array> GetOwnPropertyNames(v8::Handle<v8::Object> obj) {
+  return MaybeLocal<v8::Array>(obj->GetOwnPropertyNames());
+}
+
+inline Maybe<bool> SetPrototype(
+    v8::Handle<v8::Object> obj
+  , v8::Handle<v8::Value> prototype) {
+  return Just<bool>(obj->SetPrototype(prototype));
+}
+
+inline MaybeLocal<v8::String> ObjectProtoToString(
+    v8::Handle<v8::Object> obj) {
+  return MaybeLocal<v8::String>(obj->ObjectProtoToString());
+}
+
+inline Maybe<bool> HasOwnProperty(
+    v8::Handle<v8::Object> obj
+  , v8::Handle<v8::String> key) {
+  return Just<bool>(obj->HasOwnProperty(key));
+}
+
+inline Maybe<bool> HasRealNamedProperty(
+    v8::Handle<v8::Object> obj
+  , v8::Handle<v8::String> key) {
+  return Just<bool>(obj->HasRealNamedProperty(key));
+}
+
+inline Maybe<bool> HasRealIndexedProperty(
+    v8::Handle<v8::Object> obj
+  , uint32_t index) {
+  return Just<bool>(obj->HasRealIndexedProperty(index));
+}
+
+inline Maybe<bool> HasRealNamedCallbackProperty(
+    v8::Handle<v8::Object> obj
+  , v8::Handle<v8::String> key) {
+  return Just<bool>(obj->HasRealNamedCallbackProperty(key));
+}
+
+inline MaybeLocal<v8::Value> GetRealNamedPropertyInPrototypeChain(
+    v8::Handle<v8::Object> obj
+  , v8::Handle<v8::String> key) {
+  return MaybeLocal<v8::Value>(
+      obj->GetRealNamedPropertyInPrototypeChain(key));
+}
+
+inline MaybeLocal<v8::Value> GetRealNamedProperty(
+    v8::Handle<v8::Object> obj
+  , v8::Handle<v8::String> key) {
+  return MaybeLocal<v8::Value>(obj->GetRealNamedProperty(key));
+}
+
+inline MaybeLocal<v8::Value> CallAsFunction(
+    v8::Handle<v8::Object> obj
+  , v8::Handle<v8::Object> recv
+  , int argc
+  , v8::Handle<v8::Value> argv[]) {
+  return MaybeLocal<v8::Value>(obj->CallAsFunction(recv, argc, argv));
+}
+
+inline MaybeLocal<v8::Value> CallAsConstructor(
+    v8::Handle<v8::Object> obj
+  , int argc
+  , v8::Local<v8::Value> argv[]) {
+  return MaybeLocal<v8::Value>(obj->CallAsConstructor(argc, argv));
+}
+
+inline
+MaybeLocal<v8::String> GetSourceLine(v8::Handle<v8::Message> msg) {
+  return MaybeLocal<v8::String>(msg->GetSourceLine());
+}
+
+inline Maybe<int> GetLineNumber(v8::Handle<v8::Message> msg) {
+  return Just<int>(msg->GetLineNumber());
+}
+
+inline Maybe<int> GetStartColumn(v8::Handle<v8::Message> msg) {
+  return Just<int>(msg->GetStartColumn());
+}
+
+inline Maybe<int> GetEndColumn(v8::Handle<v8::Message> msg) {
+  return Just<int>(msg->GetEndColumn());
+}
+
+inline MaybeLocal<v8::Object> CloneElementAt(
+    v8::Handle<v8::Array> array
+  , uint32_t index) {
+  return MaybeLocal<v8::Object>(array->CloneElementAt(index));
+}
+
+inline MaybeLocal<v8::Value> Call(
+    v8::Local<v8::Function> fun
+  , v8::Local<v8::Object> recv
+  , int argc
+  , v8::Local<v8::Value> argv[]) {
+  return MaybeLocal<v8::Value>(fun->Call(recv, argc, argv));
+}
+
+#endif  // NAN_MAYBE_PRE_43_INL_H_
diff --git a/node_modules/nan/nan_new.h b/node_modules/nan/nan_new.h
new file mode 100644
index 0000000..cdf8bbe
--- /dev/null
+++ b/node_modules/nan/nan_new.h
@@ -0,0 +1,340 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_NEW_H_
+#define NAN_NEW_H_
+
+namespace imp {  // scnr
+
+// TODO(agnat): Generalize
+template <typename T> v8::Local<T> To(v8::Local<v8::Integer> i);
+
+template <>
+inline
+v8::Local<v8::Integer>
+To<v8::Integer>(v8::Local<v8::Integer> i) {
+  return Nan::To<v8::Integer>(i).ToLocalChecked();
+}
+
+template <>
+inline
+v8::Local<v8::Int32>
+To<v8::Int32>(v8::Local<v8::Integer> i) {
+  return Nan::To<v8::Int32>(i).ToLocalChecked();
+}
+
+template <>
+inline
+v8::Local<v8::Uint32>
+To<v8::Uint32>(v8::Local<v8::Integer> i) {
+  return Nan::To<v8::Uint32>(i).ToLocalChecked();
+}
+
+template <typename T> struct FactoryBase {
+  typedef v8::Local<T> return_t;
+};
+
+template <typename T> struct MaybeFactoryBase {
+  typedef MaybeLocal<T> return_t;
+};
+
+template <typename T> struct Factory;
+
+template <>
+struct Factory<v8::Array> : FactoryBase<v8::Array> {
+  static inline return_t New();
+  static inline return_t New(int length);
+};
+
+template <>
+struct Factory<v8::Boolean> : FactoryBase<v8::Boolean> {
+  static inline return_t New(bool value);
+};
+
+template <>
+struct Factory<v8::BooleanObject> : FactoryBase<v8::BooleanObject> {
+  static inline return_t New(bool value);
+};
+
+template <>
+struct Factory<v8::Context> : FactoryBase<v8::Context> {
+  static inline
+  return_t
+  New( v8::ExtensionConfiguration* extensions = NULL
+     , v8::Local<v8::ObjectTemplate> tmpl = v8::Local<v8::ObjectTemplate>()
+     , v8::Local<v8::Value> obj = v8::Local<v8::Value>());
+};
+
+template <>
+struct Factory<v8::Date> : MaybeFactoryBase<v8::Date> {
+  static inline return_t New(double value);
+};
+
+template <>
+struct Factory<v8::External> : FactoryBase<v8::External> {
+  static inline return_t New(void *value);
+};
+
+template <>
+struct Factory<v8::Function> : FactoryBase<v8::Function> {
+  static inline
+  return_t
+  New( FunctionCallback callback
+     , v8::Local<v8::Value> data = v8::Local<v8::Value>());
+};
+
+template <>
+struct Factory<v8::FunctionTemplate> : FactoryBase<v8::FunctionTemplate> {
+  static inline
+  return_t
+  New( FunctionCallback callback = NULL
+     , v8::Local<v8::Value> data = v8::Local<v8::Value>()
+     , v8::Local<v8::Signature> signature = v8::Local<v8::Signature>());
+};
+
+template <>
+struct Factory<v8::Number> : FactoryBase<v8::Number> {
+  static inline return_t New(double value);
+};
+
+template <>
+struct Factory<v8::NumberObject> : FactoryBase<v8::NumberObject> {
+  static inline return_t New(double value);
+};
+
+template <typename T>
+struct IntegerFactory : FactoryBase<T> {
+  typedef typename FactoryBase<T>::return_t return_t;
+  static inline return_t New(int32_t value);
+  static inline return_t New(uint32_t value);
+};
+
+template <>
+struct Factory<v8::Integer> : IntegerFactory<v8::Integer> {};
+
+template <>
+struct Factory<v8::Int32> : IntegerFactory<v8::Int32> {};
+
+template <>
+struct Factory<v8::Uint32> : FactoryBase<v8::Uint32> {
+  static inline return_t New(int32_t value);
+  static inline return_t New(uint32_t value);
+};
+
+template <>
+struct Factory<v8::Object> : FactoryBase<v8::Object> {
+  static inline return_t New();
+};
+
+template <>
+struct Factory<v8::ObjectTemplate> : FactoryBase<v8::ObjectTemplate> {
+  static inline return_t New();
+};
+
+template <>
+struct Factory<v8::RegExp> : MaybeFactoryBase<v8::RegExp> {
+  static inline return_t New(
+      v8::Local<v8::String> pattern, v8::RegExp::Flags flags);
+};
+
+template <>
+struct Factory<v8::Script> : MaybeFactoryBase<v8::Script> {
+  static inline return_t New( v8::Local<v8::String> source);
+  static inline return_t New( v8::Local<v8::String> source
+                            , v8::ScriptOrigin const& origin);
+};
+
+template <>
+struct Factory<v8::Signature> : FactoryBase<v8::Signature> {
+  typedef v8::Local<v8::FunctionTemplate> FTH;
+  static inline return_t New(FTH receiver = FTH());
+};
+
+template <>
+struct Factory<v8::String> : MaybeFactoryBase<v8::String> {
+  static inline return_t New();
+  static inline return_t New(const char *value, int length = -1);
+  static inline return_t New(const uint16_t *value, int length = -1);
+  static inline return_t New(std::string const& value);
+
+  static inline return_t New(v8::String::ExternalStringResource * value);
+  static inline return_t New(ExternalOneByteStringResource * value);
+};
+
+template <>
+struct Factory<v8::StringObject> : FactoryBase<v8::StringObject> {
+  static inline return_t New(v8::Local<v8::String> value);
+};
+
+}  // end of namespace imp
+
+#if (NODE_MODULE_VERSION >= 12)
+
+namespace imp {
+
+template <>
+struct Factory<v8::UnboundScript> : MaybeFactoryBase<v8::UnboundScript> {
+  static inline return_t New( v8::Local<v8::String> source);
+  static inline return_t New( v8::Local<v8::String> source
+                            , v8::ScriptOrigin const& origin);
+};
+
+}  // end of namespace imp
+
+# include "nan_implementation_12_inl.h"
+
+#else  // NODE_MODULE_VERSION >= 12
+
+# include "nan_implementation_pre_12_inl.h"
+
+#endif
+
+//=== API ======================================================================
+
+template <typename T>
+typename imp::Factory<T>::return_t
+New() {
+  return imp::Factory<T>::New();
+}
+
+template <typename T, typename A0>
+typename imp::Factory<T>::return_t
+New(A0 arg0) {
+  return imp::Factory<T>::New(arg0);
+}
+
+template <typename T, typename A0, typename A1>
+typename imp::Factory<T>::return_t
+New(A0 arg0, A1 arg1) {
+  return imp::Factory<T>::New(arg0, arg1);
+}
+
+template <typename T, typename A0, typename A1, typename A2>
+typename imp::Factory<T>::return_t
+New(A0 arg0, A1 arg1, A2 arg2) {
+  return imp::Factory<T>::New(arg0, arg1, arg2);
+}
+
+template <typename T, typename A0, typename A1, typename A2, typename A3>
+typename imp::Factory<T>::return_t
+New(A0 arg0, A1 arg1, A2 arg2, A3 arg3) {
+  return imp::Factory<T>::New(arg0, arg1, arg2, arg3);
+}
+
+// Note(agnat): When passing overloaded function pointers to template functions
+// as generic arguments the compiler needs help in picking the right overload.
+// These two functions handle New<Function> and New<FunctionTemplate> with
+// all argument variations.
+
+// v8::Function and v8::FunctionTemplate with one or two arguments
+template <typename T>
+typename imp::Factory<T>::return_t
+New( FunctionCallback callback
+      , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
+    return imp::Factory<T>::New(callback, data);
+}
+
+// v8::Function and v8::FunctionTemplate with three arguments
+template <typename T, typename A2>
+typename imp::Factory<T>::return_t
+New( FunctionCallback callback
+      , v8::Local<v8::Value> data = v8::Local<v8::Value>()
+      , A2 a2 = A2()) {
+    return imp::Factory<T>::New(callback, data, a2);
+}
+
+// Convenience
+
+#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
+template <typename T> inline v8::Local<T> New(v8::Handle<T> h);
+#endif
+
+#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+template <typename T, typename M>
+    inline v8::Local<T> New(v8::Persistent<T, M> const& p);
+#else
+template <typename T> inline v8::Local<T> New(v8::Persistent<T> const& p);
+#endif
+template <typename T, typename M>
+inline v8::Local<T> New(Persistent<T, M> const& p);
+template <typename T>
+inline v8::Local<T> New(Global<T> const& p);
+
+inline
+imp::Factory<v8::Boolean>::return_t
+New(bool value) {
+  return New<v8::Boolean>(value);
+}
+
+inline
+imp::Factory<v8::Int32>::return_t
+New(int32_t value) {
+  return New<v8::Int32>(value);
+}
+
+inline
+imp::Factory<v8::Uint32>::return_t
+New(uint32_t value) {
+  return New<v8::Uint32>(value);
+}
+
+inline
+imp::Factory<v8::Number>::return_t
+New(double value) {
+  return New<v8::Number>(value);
+}
+
+inline
+imp::Factory<v8::String>::return_t
+New(std::string const& value) {  // NOLINT(build/include_what_you_use)
+  return New<v8::String>(value);
+}
+
+inline
+imp::Factory<v8::String>::return_t
+New(const char * value, int length) {
+  return New<v8::String>(value, length);
+}
+
+inline
+imp::Factory<v8::String>::return_t
+New(const uint16_t * value, int length) {
+  return New<v8::String>(value, length);
+}
+
+inline
+imp::Factory<v8::String>::return_t
+New(const char * value) {
+  return New<v8::String>(value);
+}
+
+inline
+imp::Factory<v8::String>::return_t
+New(const uint16_t * value) {
+  return New<v8::String>(value);
+}
+
+inline
+imp::Factory<v8::String>::return_t
+New(v8::String::ExternalStringResource * value) {
+  return New<v8::String>(value);
+}
+
+inline
+imp::Factory<v8::String>::return_t
+New(ExternalOneByteStringResource * value) {
+  return New<v8::String>(value);
+}
+
+inline
+imp::Factory<v8::RegExp>::return_t
+New(v8::Local<v8::String> pattern, v8::RegExp::Flags flags) {
+  return New<v8::RegExp>(pattern, flags);
+}
+
+#endif  // NAN_NEW_H_
diff --git a/node_modules/nan/nan_object_wrap.h b/node_modules/nan/nan_object_wrap.h
new file mode 100644
index 0000000..78712f9
--- /dev/null
+++ b/node_modules/nan/nan_object_wrap.h
@@ -0,0 +1,156 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_OBJECT_WRAP_H_
+#define NAN_OBJECT_WRAP_H_
+
+class ObjectWrap {
+ public:
+  ObjectWrap() {
+    refs_ = 0;
+  }
+
+
+  virtual ~ObjectWrap() {
+    if (persistent().IsEmpty()) {
+      return;
+    }
+
+    persistent().ClearWeak();
+    persistent().Reset();
+  }
+
+
+  template <class T>
+  static inline T* Unwrap(v8::Local<v8::Object> object) {
+    assert(!object.IsEmpty());
+    assert(object->InternalFieldCount() > 0);
+    // Cast to ObjectWrap before casting to T.  A direct cast from void
+    // to T won't work right when T has more than one base class.
+    void* ptr = GetInternalFieldPointer(object, 0);
+    ObjectWrap* wrap = static_cast<ObjectWrap*>(ptr);
+    return static_cast<T*>(wrap);
+  }
+
+
+  inline v8::Local<v8::Object> handle() const {
+    return New(handle_);
+  }
+
+
+  inline Persistent<v8::Object>& persistent() {
+    return handle_;
+  }
+
+
+ protected:
+  inline void Wrap(v8::Local<v8::Object> object) {
+    assert(persistent().IsEmpty());
+    assert(object->InternalFieldCount() > 0);
+    SetInternalFieldPointer(object, 0, this);
+    persistent().Reset(object);
+    MakeWeak();
+  }
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+
+  inline void MakeWeak() {
+    persistent().v8::PersistentBase<v8::Object>::SetWeak(
+        this, WeakCallback, v8::WeakCallbackType::kParameter);
+#if NODE_MAJOR_VERSION < 10
+    // FIXME(bnoordhuis) Probably superfluous in older Node.js versions too.
+    persistent().MarkIndependent();
+#endif
+  }
+
+#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+
+  inline void MakeWeak() {
+    persistent().v8::PersistentBase<v8::Object>::SetWeak(this, WeakCallback);
+    persistent().MarkIndependent();
+  }
+
+#else
+
+  inline void MakeWeak() {
+    persistent().persistent.MakeWeak(this, WeakCallback);
+    persistent().MarkIndependent();
+  }
+
+#endif
+
+  /* Ref() marks the object as being attached to an event loop.
+   * Refed objects will not be garbage collected, even if
+   * all references are lost.
+   */
+  virtual void Ref() {
+    assert(!persistent().IsEmpty());
+    persistent().ClearWeak();
+    refs_++;
+  }
+
+  /* Unref() marks an object as detached from the event loop.  This is its
+   * default state.  When an object with a "weak" reference changes from
+   * attached to detached state it will be freed. Be careful not to access
+   * the object after making this call as it might be gone!
+   * (A "weak reference" means an object that only has a
+   * persistent handle.)
+   *
+   * DO NOT CALL THIS FROM DESTRUCTOR
+   */
+  virtual void Unref() {
+    assert(!persistent().IsEmpty());
+    assert(!persistent().IsWeak());
+    assert(refs_ > 0);
+    if (--refs_ == 0)
+      MakeWeak();
+  }
+
+  int refs_;  // ro
+
+ private:
+  NAN_DISALLOW_ASSIGN_COPY_MOVE(ObjectWrap)
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+
+  static void
+  WeakCallback(v8::WeakCallbackInfo<ObjectWrap> const& info) {
+    ObjectWrap* wrap = info.GetParameter();
+    assert(wrap->refs_ == 0);
+    wrap->handle_.Reset();
+    delete wrap;
+  }
+
+#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+
+  static void
+  WeakCallback(v8::WeakCallbackData<v8::Object, ObjectWrap> const& data) {
+    ObjectWrap* wrap = data.GetParameter();
+    assert(wrap->refs_ == 0);
+    assert(wrap->handle_.IsNearDeath());
+    wrap->handle_.Reset();
+    delete wrap;
+  }
+
+#else
+
+  static void WeakCallback(v8::Persistent<v8::Value> value, void *data) {
+    ObjectWrap *wrap = static_cast<ObjectWrap*>(data);
+    assert(wrap->refs_ == 0);
+    assert(wrap->handle_.IsNearDeath());
+    wrap->handle_.Reset();
+    delete wrap;
+  }
+
+#endif
+  Persistent<v8::Object> handle_;
+};
+
+
+#endif  // NAN_OBJECT_WRAP_H_
diff --git a/node_modules/nan/nan_persistent_12_inl.h b/node_modules/nan/nan_persistent_12_inl.h
new file mode 100644
index 0000000..d9649e8
--- /dev/null
+++ b/node_modules/nan/nan_persistent_12_inl.h
@@ -0,0 +1,132 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_PERSISTENT_12_INL_H_
+#define NAN_PERSISTENT_12_INL_H_
+
+template<typename T, typename M> class Persistent :
+    public v8::Persistent<T, M> {
+ public:
+  inline Persistent() : v8::Persistent<T, M>() {}
+
+  template<typename S> inline Persistent(v8::Local<S> that) :
+      v8::Persistent<T, M>(v8::Isolate::GetCurrent(), that) {}
+
+  template<typename S, typename M2>
+  inline
+  Persistent(const v8::Persistent<S, M2> &that) :  // NOLINT(runtime/explicit)
+      v8::Persistent<T, M2>(v8::Isolate::GetCurrent(), that) {}
+
+  inline void Reset() { v8::PersistentBase<T>::Reset(); }
+
+  template <typename S>
+  inline void Reset(const v8::Local<S> &other) {
+    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
+  }
+
+  template <typename S>
+  inline void Reset(const v8::PersistentBase<S> &other) {
+    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
+  }
+
+  template<typename P>
+  inline void SetWeak(
+    P *parameter
+    , typename WeakCallbackInfo<P>::Callback callback
+    , WeakCallbackType type);
+
+ private:
+  inline T *operator*() const { return *PersistentBase<T>::persistent; }
+
+  template<typename S, typename M2>
+  inline void Copy(const Persistent<S, M2> &that) {
+    TYPE_CHECK(T, S);
+
+    this->Reset();
+
+    if (!that.IsEmpty()) {
+      this->Reset(that);
+      M::Copy(that, this);
+    }
+  }
+};
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+template<typename T>
+class Global : public v8::Global<T> {
+ public:
+  inline Global() : v8::Global<T>() {}
+
+  template<typename S> inline Global(v8::Local<S> that) :
+    v8::Global<T>(v8::Isolate::GetCurrent(), that) {}
+
+  template<typename S>
+  inline
+  Global(const v8::PersistentBase<S> &that) :  // NOLINT(runtime/explicit)
+      v8::Global<S>(v8::Isolate::GetCurrent(), that) {}
+
+  inline void Reset() { v8::PersistentBase<T>::Reset(); }
+
+  template <typename S>
+  inline void Reset(const v8::Local<S> &other) {
+    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
+  }
+
+  template <typename S>
+  inline void Reset(const v8::PersistentBase<S> &other) {
+    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
+  }
+
+  template<typename P>
+  inline void SetWeak(
+    P *parameter
+    , typename WeakCallbackInfo<P>::Callback callback
+    , WeakCallbackType type) {
+    reinterpret_cast<Persistent<T>*>(this)->SetWeak(
+        parameter, callback, type);
+  }
+};
+#else
+template<typename T>
+class Global : public v8::UniquePersistent<T> {
+ public:
+  inline Global() : v8::UniquePersistent<T>() {}
+
+  template<typename S> inline Global(v8::Local<S> that) :
+    v8::UniquePersistent<T>(v8::Isolate::GetCurrent(), that) {}
+
+  template<typename S>
+  inline
+  Global(const v8::PersistentBase<S> &that) :  // NOLINT(runtime/explicit)
+      v8::UniquePersistent<S>(v8::Isolate::GetCurrent(), that) {}
+
+  inline void Reset() { v8::PersistentBase<T>::Reset(); }
+
+  template <typename S>
+  inline void Reset(const v8::Local<S> &other) {
+    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
+  }
+
+  template <typename S>
+  inline void Reset(const v8::PersistentBase<S> &other) {
+    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
+  }
+
+  template<typename P>
+  inline void SetWeak(
+    P *parameter
+    , typename WeakCallbackInfo<P>::Callback callback
+    , WeakCallbackType type) {
+    reinterpret_cast<Persistent<T>*>(this)->SetWeak(
+        parameter, callback, type);
+  }
+};
+#endif
+
+#endif  // NAN_PERSISTENT_12_INL_H_
diff --git a/node_modules/nan/nan_persistent_pre_12_inl.h b/node_modules/nan/nan_persistent_pre_12_inl.h
new file mode 100644
index 0000000..4c9c59d
--- /dev/null
+++ b/node_modules/nan/nan_persistent_pre_12_inl.h
@@ -0,0 +1,242 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_PERSISTENT_PRE_12_INL_H_
+#define NAN_PERSISTENT_PRE_12_INL_H_
+
+template<typename T>
+class PersistentBase {
+  v8::Persistent<T> persistent;
+  template<typename U>
+  friend v8::Local<U> New(const PersistentBase<U> &p);
+  template<typename U, typename M>
+  friend v8::Local<U> New(const Persistent<U, M> &p);
+  template<typename U>
+  friend v8::Local<U> New(const Global<U> &p);
+  template<typename S> friend class ReturnValue;
+
+ public:
+  inline PersistentBase() :
+      persistent() {}
+
+  inline void Reset() {
+    persistent.Dispose();
+    persistent.Clear();
+  }
+
+  template<typename S>
+  inline void Reset(const v8::Local<S> &other) {
+    TYPE_CHECK(T, S);
+
+    if (!persistent.IsEmpty()) {
+      persistent.Dispose();
+    }
+
+    if (other.IsEmpty()) {
+      persistent.Clear();
+    } else {
+      persistent = v8::Persistent<T>::New(other);
+    }
+  }
+
+  template<typename S>
+  inline void Reset(const PersistentBase<S> &other) {
+    TYPE_CHECK(T, S);
+
+    if (!persistent.IsEmpty()) {
+      persistent.Dispose();
+    }
+
+    if (other.IsEmpty()) {
+      persistent.Clear();
+    } else {
+      persistent = v8::Persistent<T>::New(other.persistent);
+    }
+  }
+
+  inline bool IsEmpty() const { return persistent.IsEmpty(); }
+
+  inline void Empty() { persistent.Clear(); }
+
+  template<typename S>
+  inline bool operator==(const PersistentBase<S> &that) const {
+    return this->persistent == that.persistent;
+  }
+
+  template<typename S>
+  inline bool operator==(const v8::Local<S> &that) const {
+    return this->persistent == that;
+  }
+
+  template<typename S>
+  inline bool operator!=(const PersistentBase<S> &that) const {
+    return !operator==(that);
+  }
+
+  template<typename S>
+  inline bool operator!=(const v8::Local<S> &that) const {
+    return !operator==(that);
+  }
+
+  template<typename P>
+  inline void SetWeak(
+    P *parameter
+    , typename WeakCallbackInfo<P>::Callback callback
+    , WeakCallbackType type);
+
+  inline void ClearWeak() { persistent.ClearWeak(); }
+
+  inline void MarkIndependent() { persistent.MarkIndependent(); }
+
+  inline bool IsIndependent() const { return persistent.IsIndependent(); }
+
+  inline bool IsNearDeath() const { return persistent.IsNearDeath(); }
+
+  inline bool IsWeak() const { return persistent.IsWeak(); }
+
+ private:
+  inline explicit PersistentBase(v8::Persistent<T> that) :
+      persistent(that) { }
+  inline explicit PersistentBase(T *val) : persistent(val) {}
+  template<typename S, typename M> friend class Persistent;
+  template<typename S> friend class Global;
+  friend class ObjectWrap;
+};
+
+template<typename T>
+class NonCopyablePersistentTraits {
+ public:
+  typedef Persistent<T, NonCopyablePersistentTraits<T> >
+      NonCopyablePersistent;
+  static const bool kResetInDestructor = false;
+  template<typename S, typename M>
+  inline static void Copy(const Persistent<S, M> &source,
+                             NonCopyablePersistent *dest) {
+    Uncompilable<v8::Object>();
+  }
+
+  template<typename O> inline static void Uncompilable() {
+    TYPE_CHECK(O, v8::Primitive);
+  }
+};
+
+template<typename T>
+struct CopyablePersistentTraits {
+  typedef Persistent<T, CopyablePersistentTraits<T> > CopyablePersistent;
+  static const bool kResetInDestructor = true;
+  template<typename S, typename M>
+  static inline void Copy(const Persistent<S, M> &source,
+                             CopyablePersistent *dest) {}
+};
+
+template<typename T, typename M> class Persistent :
+    public PersistentBase<T> {
+ public:
+  inline Persistent() {}
+
+  template<typename S> inline Persistent(v8::Handle<S> that)
+      : PersistentBase<T>(v8::Persistent<T>::New(that)) {
+    TYPE_CHECK(T, S);
+  }
+
+  inline Persistent(const Persistent &that) : PersistentBase<T>() {
+    Copy(that);
+  }
+
+  template<typename S, typename M2>
+  inline Persistent(const Persistent<S, M2> &that) :
+      PersistentBase<T>() {
+    Copy(that);
+  }
+
+  inline Persistent &operator=(const Persistent &that) {
+    Copy(that);
+    return *this;
+  }
+
+  template <class S, class M2>
+  inline Persistent &operator=(const Persistent<S, M2> &that) {
+    Copy(that);
+    return *this;
+  }
+
+  inline ~Persistent() {
+    if (M::kResetInDestructor) this->Reset();
+  }
+
+ private:
+  inline T *operator*() const { return *PersistentBase<T>::persistent; }
+
+  template<typename S, typename M2>
+  inline void Copy(const Persistent<S, M2> &that) {
+    TYPE_CHECK(T, S);
+
+    this->Reset();
+
+    if (!that.IsEmpty()) {
+      this->persistent = v8::Persistent<T>::New(that.persistent);
+      M::Copy(that, this);
+    }
+  }
+};
+
+template<typename T>
+class Global : public PersistentBase<T> {
+  struct RValue {
+    inline explicit RValue(Global* obj) : object(obj) {}
+    Global* object;
+  };
+
+ public:
+  inline Global() : PersistentBase<T>(0) { }
+
+  template <typename S>
+  inline Global(v8::Local<S> that)  // NOLINT(runtime/explicit)
+      : PersistentBase<T>(v8::Persistent<T>::New(that)) {
+    TYPE_CHECK(T, S);
+  }
+
+  template <typename S>
+  inline Global(const PersistentBase<S> &that)  // NOLINT(runtime/explicit)
+    : PersistentBase<T>(that) {
+    TYPE_CHECK(T, S);
+  }
+  /**
+   * Move constructor.
+   */
+  inline Global(RValue rvalue)  // NOLINT(runtime/explicit)
+    : PersistentBase<T>(rvalue.object->persistent) {
+    rvalue.object->Reset();
+  }
+  inline ~Global() { this->Reset(); }
+  /**
+   * Move via assignment.
+   */
+  template<typename S>
+  inline Global &operator=(Global<S> rhs) {
+    TYPE_CHECK(T, S);
+    this->Reset(rhs.persistent);
+    rhs.Reset();
+    return *this;
+  }
+  /**
+   * Cast operator for moves.
+   */
+  inline operator RValue() { return RValue(this); }
+  /**
+   * Pass allows returning uniques from functions, etc.
+   */
+  Global Pass() { return Global(RValue(this)); }
+
+ private:
+  Global(Global &);
+  void operator=(Global &);
+  template<typename S> friend class ReturnValue;
+};
+
+#endif  // NAN_PERSISTENT_PRE_12_INL_H_
diff --git a/node_modules/nan/nan_private.h b/node_modules/nan/nan_private.h
new file mode 100644
index 0000000..15f44cc
--- /dev/null
+++ b/node_modules/nan/nan_private.h
@@ -0,0 +1,73 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_PRIVATE_H_
+#define NAN_PRIVATE_H_
+
+inline Maybe<bool>
+HasPrivate(v8::Local<v8::Object> object, v8::Local<v8::String> key) {
+  HandleScope scope;
+#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
+  v8::Local<v8::Private> private_key = v8::Private::ForApi(isolate, key);
+  return object->HasPrivate(context, private_key);
+#else
+  return Just(!object->GetHiddenValue(key).IsEmpty());
+#endif
+}
+
+inline MaybeLocal<v8::Value>
+GetPrivate(v8::Local<v8::Object> object, v8::Local<v8::String> key) {
+#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::EscapableHandleScope scope(isolate);
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
+  v8::Local<v8::Private> private_key = v8::Private::ForApi(isolate, key);
+  v8::MaybeLocal<v8::Value> v = object->GetPrivate(context, private_key);
+  return scope.Escape(v.ToLocalChecked());
+#else
+  EscapableHandleScope scope;
+  v8::Local<v8::Value> v = object->GetHiddenValue(key);
+  if (v.IsEmpty()) {
+    v = Undefined();
+  }
+  return scope.Escape(v);
+#endif
+}
+
+inline Maybe<bool> SetPrivate(
+    v8::Local<v8::Object> object,
+    v8::Local<v8::String> key,
+    v8::Local<v8::Value> value) {
+#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION
+  HandleScope scope;
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
+  v8::Local<v8::Private> private_key = v8::Private::ForApi(isolate, key);
+  return object->SetPrivate(context, private_key, value);
+#else
+  return Just(object->SetHiddenValue(key, value));
+#endif
+}
+
+inline Maybe<bool> DeletePrivate(
+    v8::Local<v8::Object> object,
+    v8::Local<v8::String> key) {
+#if NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION
+  HandleScope scope;
+  v8::Isolate *isolate = v8::Isolate::GetCurrent();
+  v8::Local<v8::Private> private_key = v8::Private::ForApi(isolate, key);
+  return object->DeletePrivate(isolate->GetCurrentContext(), private_key);
+#else
+  return Just(object->DeleteHiddenValue(key));
+#endif
+}
+
+#endif  // NAN_PRIVATE_H_
+
diff --git a/node_modules/nan/nan_string_bytes.h b/node_modules/nan/nan_string_bytes.h
new file mode 100644
index 0000000..a2e6437
--- /dev/null
+++ b/node_modules/nan/nan_string_bytes.h
@@ -0,0 +1,305 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+#ifndef NAN_STRING_BYTES_H_
+#define NAN_STRING_BYTES_H_
+
+// Decodes a v8::Local<v8::String> or Buffer to a raw char*
+
+namespace imp {
+
+using v8::Local;
+using v8::Object;
+using v8::String;
+using v8::Value;
+
+
+//// Base 64 ////
+
+#define base64_encoded_size(size) ((size + 2 - ((size + 2) % 3)) / 3 * 4)
+
+
+
+//// HEX ////
+
+static bool contains_non_ascii_slow(const char* buf, size_t len) {
+  for (size_t i = 0; i < len; ++i) {
+    if (buf[i] & 0x80) return true;
+  }
+  return false;
+}
+
+
+static bool contains_non_ascii(const char* src, size_t len) {
+  if (len < 16) {
+    return contains_non_ascii_slow(src, len);
+  }
+
+  const unsigned bytes_per_word = sizeof(void*);
+  const unsigned align_mask = bytes_per_word - 1;
+  const unsigned unaligned = reinterpret_cast<uintptr_t>(src) & align_mask;
+
+  if (unaligned > 0) {
+    const unsigned n = bytes_per_word - unaligned;
+    if (contains_non_ascii_slow(src, n)) return true;
+    src += n;
+    len -= n;
+  }
+
+
+#if defined(__x86_64__) || defined(_WIN64)
+  const uintptr_t mask = 0x8080808080808080ll;
+#else
+  const uintptr_t mask = 0x80808080l;
+#endif
+
+  const uintptr_t* srcw = reinterpret_cast<const uintptr_t*>(src);
+
+  for (size_t i = 0, n = len / bytes_per_word; i < n; ++i) {
+    if (srcw[i] & mask) return true;
+  }
+
+  const unsigned remainder = len & align_mask;
+  if (remainder > 0) {
+    const size_t offset = len - remainder;
+    if (contains_non_ascii_slow(src + offset, remainder)) return true;
+  }
+
+  return false;
+}
+
+
+static void force_ascii_slow(const char* src, char* dst, size_t len) {
+  for (size_t i = 0; i < len; ++i) {
+    dst[i] = src[i] & 0x7f;
+  }
+}
+
+
+static void force_ascii(const char* src, char* dst, size_t len) {
+  if (len < 16) {
+    force_ascii_slow(src, dst, len);
+    return;
+  }
+
+  const unsigned bytes_per_word = sizeof(void*);
+  const unsigned align_mask = bytes_per_word - 1;
+  const unsigned src_unalign = reinterpret_cast<uintptr_t>(src) & align_mask;
+  const unsigned dst_unalign = reinterpret_cast<uintptr_t>(dst) & align_mask;
+
+  if (src_unalign > 0) {
+    if (src_unalign == dst_unalign) {
+      const unsigned unalign = bytes_per_word - src_unalign;
+      force_ascii_slow(src, dst, unalign);
+      src += unalign;
+      dst += unalign;
+      len -= src_unalign;
+    } else {
+      force_ascii_slow(src, dst, len);
+      return;
+    }
+  }
+
+#if defined(__x86_64__) || defined(_WIN64)
+  const uintptr_t mask = ~0x8080808080808080ll;
+#else
+  const uintptr_t mask = ~0x80808080l;
+#endif
+
+  const uintptr_t* srcw = reinterpret_cast<const uintptr_t*>(src);
+  uintptr_t* dstw = reinterpret_cast<uintptr_t*>(dst);
+
+  for (size_t i = 0, n = len / bytes_per_word; i < n; ++i) {
+    dstw[i] = srcw[i] & mask;
+  }
+
+  const unsigned remainder = len & align_mask;
+  if (remainder > 0) {
+    const size_t offset = len - remainder;
+    force_ascii_slow(src + offset, dst + offset, remainder);
+  }
+}
+
+
+static size_t base64_encode(const char* src,
+                            size_t slen,
+                            char* dst,
+                            size_t dlen) {
+  // We know how much we'll write, just make sure that there's space.
+  assert(dlen >= base64_encoded_size(slen) &&
+      "not enough space provided for base64 encode");
+
+  dlen = base64_encoded_size(slen);
+
+  unsigned a;
+  unsigned b;
+  unsigned c;
+  unsigned i;
+  unsigned k;
+  unsigned n;
+
+  static const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+                              "abcdefghijklmnopqrstuvwxyz"
+                              "0123456789+/";
+
+  i = 0;
+  k = 0;
+  n = slen / 3 * 3;
+
+  while (i < n) {
+    a = src[i + 0] & 0xff;
+    b = src[i + 1] & 0xff;
+    c = src[i + 2] & 0xff;
+
+    dst[k + 0] = table[a >> 2];
+    dst[k + 1] = table[((a & 3) << 4) | (b >> 4)];
+    dst[k + 2] = table[((b & 0x0f) << 2) | (c >> 6)];
+    dst[k + 3] = table[c & 0x3f];
+
+    i += 3;
+    k += 4;
+  }
+
+  if (n != slen) {
+    switch (slen - n) {
+      case 1:
+        a = src[i + 0] & 0xff;
+        dst[k + 0] = table[a >> 2];
+        dst[k + 1] = table[(a & 3) << 4];
+        dst[k + 2] = '=';
+        dst[k + 3] = '=';
+        break;
+
+      case 2:
+        a = src[i + 0] & 0xff;
+        b = src[i + 1] & 0xff;
+        dst[k + 0] = table[a >> 2];
+        dst[k + 1] = table[((a & 3) << 4) | (b >> 4)];
+        dst[k + 2] = table[(b & 0x0f) << 2];
+        dst[k + 3] = '=';
+        break;
+    }
+  }
+
+  return dlen;
+}
+
+
+static size_t hex_encode(const char* src, size_t slen, char* dst, size_t dlen) {
+  // We know how much we'll write, just make sure that there's space.
+  assert(dlen >= slen * 2 &&
+      "not enough space provided for hex encode");
+
+  dlen = slen * 2;
+  for (uint32_t i = 0, k = 0; k < dlen; i += 1, k += 2) {
+    static const char hex[] = "0123456789abcdef";
+    uint8_t val = static_cast<uint8_t>(src[i]);
+    dst[k + 0] = hex[val >> 4];
+    dst[k + 1] = hex[val & 15];
+  }
+
+  return dlen;
+}
+
+
+
+static Local<Value> Encode(const char* buf,
+                           size_t buflen,
+                           enum Encoding encoding) {
+  assert(buflen <= node::Buffer::kMaxLength);
+  if (!buflen && encoding != BUFFER)
+    return New("").ToLocalChecked();
+
+  Local<String> val;
+  switch (encoding) {
+    case BUFFER:
+      return CopyBuffer(buf, buflen).ToLocalChecked();
+
+    case ASCII:
+      if (contains_non_ascii(buf, buflen)) {
+        char* out = new char[buflen];
+        force_ascii(buf, out, buflen);
+        val = New<String>(out, buflen).ToLocalChecked();
+        delete[] out;
+      } else {
+        val = New<String>(buf, buflen).ToLocalChecked();
+      }
+      break;
+
+    case UTF8:
+      val = New<String>(buf, buflen).ToLocalChecked();
+      break;
+
+    case BINARY: {
+      // TODO(isaacs) use ExternalTwoByteString?
+      const unsigned char *cbuf = reinterpret_cast<const unsigned char*>(buf);
+      uint16_t * twobytebuf = new uint16_t[buflen];
+      for (size_t i = 0; i < buflen; i++) {
+        // XXX is the following line platform independent?
+        twobytebuf[i] = cbuf[i];
+      }
+      val = New<String>(twobytebuf, buflen).ToLocalChecked();
+      delete[] twobytebuf;
+      break;
+    }
+
+    case BASE64: {
+      size_t dlen = base64_encoded_size(buflen);
+      char* dst = new char[dlen];
+
+      size_t written = base64_encode(buf, buflen, dst, dlen);
+      assert(written == dlen);
+
+      val = New<String>(dst, dlen).ToLocalChecked();
+      delete[] dst;
+      break;
+    }
+
+    case UCS2: {
+      const uint16_t* data = reinterpret_cast<const uint16_t*>(buf);
+      val = New<String>(data, buflen / 2).ToLocalChecked();
+      break;
+    }
+
+    case HEX: {
+      size_t dlen = buflen * 2;
+      char* dst = new char[dlen];
+      size_t written = hex_encode(buf, buflen, dst, dlen);
+      assert(written == dlen);
+
+      val = New<String>(dst, dlen).ToLocalChecked();
+      delete[] dst;
+      break;
+    }
+
+    default:
+      assert(0 && "unknown encoding");
+      break;
+  }
+
+  return val;
+}
+
+#undef base64_encoded_size
+
+}  // end of namespace imp
+
+#endif  // NAN_STRING_BYTES_H_
diff --git a/node_modules/nan/nan_typedarray_contents.h b/node_modules/nan/nan_typedarray_contents.h
new file mode 100644
index 0000000..c6ac8a4
--- /dev/null
+++ b/node_modules/nan/nan_typedarray_contents.h
@@ -0,0 +1,96 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_TYPEDARRAY_CONTENTS_H_
+#define NAN_TYPEDARRAY_CONTENTS_H_
+
+template<typename T>
+class TypedArrayContents {
+ public:
+  inline explicit TypedArrayContents(v8::Local<v8::Value> from) :
+      length_(0), data_(NULL) {
+    HandleScope scope;
+
+    size_t length = 0;
+    void*  data = NULL;
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+
+    if (from->IsArrayBufferView()) {
+      v8::Local<v8::ArrayBufferView> array =
+        v8::Local<v8::ArrayBufferView>::Cast(from);
+
+      const size_t    byte_length = array->ByteLength();
+      const ptrdiff_t byte_offset = array->ByteOffset();
+      v8::Local<v8::ArrayBuffer> buffer = array->Buffer();
+
+      length = byte_length / sizeof(T);
+// Actually it's 7.9 here but this would lead to ABI issues with Node.js 13
+// using 7.8 till 13.2.0.
+#if (V8_MAJOR_VERSION >= 8)
+      data = static_cast<char*>(buffer->GetBackingStore()->Data()) + byte_offset;
+#else
+      data = static_cast<char*>(buffer->GetContents().Data()) + byte_offset;
+#endif
+    }
+
+#else
+
+    if (from->IsObject() && !from->IsNull()) {
+      v8::Local<v8::Object> array = v8::Local<v8::Object>::Cast(from);
+
+      MaybeLocal<v8::Value> buffer = Get(array,
+        New<v8::String>("buffer").ToLocalChecked());
+      MaybeLocal<v8::Value> byte_length = Get(array,
+        New<v8::String>("byteLength").ToLocalChecked());
+      MaybeLocal<v8::Value> byte_offset = Get(array,
+        New<v8::String>("byteOffset").ToLocalChecked());
+
+      if (!buffer.IsEmpty() &&
+          !byte_length.IsEmpty() && byte_length.ToLocalChecked()->IsUint32() &&
+          !byte_offset.IsEmpty() && byte_offset.ToLocalChecked()->IsUint32()) {
+        data = array->GetIndexedPropertiesExternalArrayData();
+        if(data) {
+          length = byte_length.ToLocalChecked()->Uint32Value() / sizeof(T);
+        }
+      }
+    }
+
+#endif
+
+#if defined(_MSC_VER) && _MSC_VER >= 1900 || __cplusplus >= 201103L
+    assert(reinterpret_cast<uintptr_t>(data) % alignof (T) == 0);
+#elif defined(_MSC_VER) && _MSC_VER >= 1600 || defined(__GNUC__)
+    assert(reinterpret_cast<uintptr_t>(data) % __alignof(T) == 0);
+#else
+    assert(reinterpret_cast<uintptr_t>(data) % sizeof (T) == 0);
+#endif
+
+    length_ = length;
+    data_   = static_cast<T*>(data);
+  }
+
+  inline size_t length() const      { return length_; }
+  inline T* operator*()             { return data_;   }
+  inline const T* operator*() const { return data_;   }
+
+ private:
+  NAN_DISALLOW_ASSIGN_COPY_MOVE(TypedArrayContents)
+
+  //Disable heap allocation
+  void *operator new(size_t size);
+  void operator delete(void *, size_t) {
+    abort();
+  }
+
+  size_t  length_;
+  T*      data_;
+};
+
+#endif  // NAN_TYPEDARRAY_CONTENTS_H_
diff --git a/node_modules/nan/nan_weak.h b/node_modules/nan/nan_weak.h
new file mode 100644
index 0000000..7e7ab07
--- /dev/null
+++ b/node_modules/nan/nan_weak.h
@@ -0,0 +1,437 @@
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+#ifndef NAN_WEAK_H_
+#define NAN_WEAK_H_
+
+static const int kInternalFieldsInWeakCallback = 2;
+static const int kNoInternalFieldIndex = -1;
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \
+    v8::WeakCallbackInfo<WeakCallbackInfo<T> > const&
+# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \
+    NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
+# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
+# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
+#elif NODE_MODULE_VERSION > IOJS_1_1_MODULE_VERSION
+# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \
+    v8::PhantomCallbackData<WeakCallbackInfo<T> > const&
+# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \
+    NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
+# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
+# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
+#elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
+# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \
+    v8::PhantomCallbackData<WeakCallbackInfo<T> > const&
+# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \
+    v8::InternalFieldsCallbackData<WeakCallbackInfo<T>, void> const&
+# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
+# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
+#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+# define NAN_WEAK_CALLBACK_DATA_TYPE_ \
+    v8::WeakCallbackData<S, WeakCallbackInfo<T> > const&
+# define NAN_WEAK_CALLBACK_SIG_ NAN_WEAK_CALLBACK_DATA_TYPE_
+#else
+# define NAN_WEAK_CALLBACK_DATA_TYPE_ void *
+# define NAN_WEAK_CALLBACK_SIG_ \
+    v8::Persistent<v8::Value>, NAN_WEAK_CALLBACK_DATA_TYPE_
+#endif
+
+template<typename T>
+class WeakCallbackInfo {
+ public:
+  typedef void (*Callback)(const WeakCallbackInfo<T>& data);
+  WeakCallbackInfo(
+      Persistent<v8::Value> *persistent
+    , Callback callback
+    , void *parameter
+    , void *field1 = 0
+    , void *field2 = 0) :
+        callback_(callback), isolate_(0), parameter_(parameter) {
+    std::memcpy(&persistent_, persistent, sizeof (v8::Persistent<v8::Value>));
+    internal_fields_[0] = field1;
+    internal_fields_[1] = field2;
+  }
+  inline v8::Isolate *GetIsolate() const { return isolate_; }
+  inline T *GetParameter() const { return static_cast<T*>(parameter_); }
+  inline void *GetInternalField(int index) const {
+    assert((index == 0 || index == 1) && "internal field index out of bounds");
+    if (index == 0) {
+      return internal_fields_[0];
+    } else {
+      return internal_fields_[1];
+    }
+  }
+
+ private:
+  NAN_DISALLOW_ASSIGN_COPY_MOVE(WeakCallbackInfo)
+  Callback callback_;
+  v8::Isolate *isolate_;
+  void *parameter_;
+  void *internal_fields_[kInternalFieldsInWeakCallback];
+  v8::Persistent<v8::Value> persistent_;
+  template<typename S, typename M> friend class Persistent;
+  template<typename S> friend class PersistentBase;
+#if NODE_MODULE_VERSION <= NODE_0_12_MODULE_VERSION
+# if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+  template<typename S>
+  static void invoke(NAN_WEAK_CALLBACK_SIG_ data);
+  template<typename S>
+  static WeakCallbackInfo *unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data);
+# else
+  static void invoke(NAN_WEAK_CALLBACK_SIG_ data);
+  static WeakCallbackInfo *unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data);
+# endif
+#else
+# if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                     \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+  template<bool isFirstPass>
+  static void invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data);
+  template<bool isFirstPass>
+  static void invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data);
+# else
+  static void invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data);
+  static void invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data);
+# endif
+  static WeakCallbackInfo *unwrapparameter(
+      NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data);
+  static WeakCallbackInfo *unwraptwofield(
+      NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data);
+#endif
+};
+
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+
+template<typename T>
+template<bool isFirstPass>
+void
+WeakCallbackInfo<T>::invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data) {
+  WeakCallbackInfo<T> *cbinfo = unwrapparameter(data);
+  if (isFirstPass) {
+    cbinfo->persistent_.Reset();
+    data.SetSecondPassCallback(invokeparameter<false>);
+  } else {
+    cbinfo->callback_(*cbinfo);
+    delete cbinfo;
+  }
+}
+
+template<typename T>
+template<bool isFirstPass>
+void
+WeakCallbackInfo<T>::invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data) {
+  WeakCallbackInfo<T> *cbinfo = unwraptwofield(data);
+  if (isFirstPass) {
+    cbinfo->persistent_.Reset();
+    data.SetSecondPassCallback(invoketwofield<false>);
+  } else {
+    cbinfo->callback_(*cbinfo);
+    delete cbinfo;
+  }
+}
+
+template<typename T>
+WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrapparameter(
+    NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data) {
+  WeakCallbackInfo<T> *cbinfo =
+      static_cast<WeakCallbackInfo<T>*>(data.GetParameter());
+  cbinfo->isolate_ = data.GetIsolate();
+  return cbinfo;
+}
+
+template<typename T>
+WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwraptwofield(
+    NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data) {
+  WeakCallbackInfo<T> *cbinfo =
+      static_cast<WeakCallbackInfo<T>*>(data.GetInternalField(0));
+  cbinfo->isolate_ = data.GetIsolate();
+  return cbinfo;
+}
+
+#undef NAN_WEAK_PARAMETER_CALLBACK_SIG_
+#undef NAN_WEAK_TWOFIELD_CALLBACK_SIG_
+#undef NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
+#undef NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
+# elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
+
+template<typename T>
+void
+WeakCallbackInfo<T>::invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data) {
+  WeakCallbackInfo<T> *cbinfo = unwrapparameter(data);
+  cbinfo->persistent_.Reset();
+  cbinfo->callback_(*cbinfo);
+  delete cbinfo;
+}
+
+template<typename T>
+void
+WeakCallbackInfo<T>::invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data) {
+  WeakCallbackInfo<T> *cbinfo = unwraptwofield(data);
+  cbinfo->persistent_.Reset();
+  cbinfo->callback_(*cbinfo);
+  delete cbinfo;
+}
+
+template<typename T>
+WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrapparameter(
+    NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data) {
+  WeakCallbackInfo<T> *cbinfo =
+       static_cast<WeakCallbackInfo<T>*>(data.GetParameter());
+  cbinfo->isolate_ = data.GetIsolate();
+  return cbinfo;
+}
+
+template<typename T>
+WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwraptwofield(
+    NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data) {
+  WeakCallbackInfo<T> *cbinfo =
+       static_cast<WeakCallbackInfo<T>*>(data.GetInternalField1());
+  cbinfo->isolate_ = data.GetIsolate();
+  return cbinfo;
+}
+
+#undef NAN_WEAK_PARAMETER_CALLBACK_SIG_
+#undef NAN_WEAK_TWOFIELD_CALLBACK_SIG_
+#undef NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
+#undef NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
+#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+
+template<typename T>
+template<typename S>
+void WeakCallbackInfo<T>::invoke(NAN_WEAK_CALLBACK_SIG_ data) {
+  WeakCallbackInfo<T> *cbinfo = unwrap(data);
+  cbinfo->persistent_.Reset();
+  cbinfo->callback_(*cbinfo);
+  delete cbinfo;
+}
+
+template<typename T>
+template<typename S>
+WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrap(
+    NAN_WEAK_CALLBACK_DATA_TYPE_ data) {
+  void *parameter = data.GetParameter();
+  WeakCallbackInfo<T> *cbinfo =
+      static_cast<WeakCallbackInfo<T>*>(parameter);
+  cbinfo->isolate_ = data.GetIsolate();
+  return cbinfo;
+}
+
+#undef NAN_WEAK_CALLBACK_SIG_
+#undef NAN_WEAK_CALLBACK_DATA_TYPE_
+#else
+
+template<typename T>
+void WeakCallbackInfo<T>::invoke(NAN_WEAK_CALLBACK_SIG_ data) {
+  WeakCallbackInfo<T> *cbinfo = unwrap(data);
+  cbinfo->persistent_.Dispose();
+  cbinfo->persistent_.Clear();
+  cbinfo->callback_(*cbinfo);
+  delete cbinfo;
+}
+
+template<typename T>
+WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrap(
+    NAN_WEAK_CALLBACK_DATA_TYPE_ data) {
+  WeakCallbackInfo<T> *cbinfo =
+      static_cast<WeakCallbackInfo<T>*>(data);
+  cbinfo->isolate_ = v8::Isolate::GetCurrent();
+  return cbinfo;
+}
+
+#undef NAN_WEAK_CALLBACK_SIG_
+#undef NAN_WEAK_CALLBACK_DATA_TYPE_
+#endif
+
+#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
+  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
+template<typename T, typename M>
+template<typename P>
+inline void Persistent<T, M>::SetWeak(
+    P *parameter
+  , typename WeakCallbackInfo<P>::Callback callback
+  , WeakCallbackType type) {
+  WeakCallbackInfo<P> *wcbd;
+  if (type == WeakCallbackType::kParameter) {
+    wcbd = new WeakCallbackInfo<P>(
+        reinterpret_cast<Persistent<v8::Value>*>(this)
+      , callback
+      , parameter);
+    v8::PersistentBase<T>::SetWeak(
+        wcbd
+      , WeakCallbackInfo<P>::template invokeparameter<true>
+      , type);
+  } else {
+    v8::Local<v8::Value>* self_v(reinterpret_cast<v8::Local<v8::Value>*>(this));
+    assert((*self_v)->IsObject());
+    v8::Local<v8::Object> self((*self_v).As<v8::Object>());
+    int count = self->InternalFieldCount();
+    void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
+    for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
+      internal_fields[i] = self->GetAlignedPointerFromInternalField(i);
+    }
+    wcbd = new WeakCallbackInfo<P>(
+        reinterpret_cast<Persistent<v8::Value>*>(this)
+      , callback
+      , 0
+      , internal_fields[0]
+      , internal_fields[1]);
+    self->SetAlignedPointerInInternalField(0, wcbd);
+    v8::PersistentBase<T>::SetWeak(
+        static_cast<WeakCallbackInfo<P>*>(0)
+      , WeakCallbackInfo<P>::template invoketwofield<true>
+      , type);
+  }
+}
+#elif NODE_MODULE_VERSION > IOJS_1_1_MODULE_VERSION
+template<typename T, typename M>
+template<typename P>
+inline void Persistent<T, M>::SetWeak(
+    P *parameter
+  , typename WeakCallbackInfo<P>::Callback callback
+  , WeakCallbackType type) {
+  WeakCallbackInfo<P> *wcbd;
+  if (type == WeakCallbackType::kParameter) {
+    wcbd = new WeakCallbackInfo<P>(
+        reinterpret_cast<Persistent<v8::Value>*>(this)
+      , callback
+      , parameter);
+    v8::PersistentBase<T>::SetPhantom(
+        wcbd
+      , WeakCallbackInfo<P>::invokeparameter);
+  } else {
+    v8::Local<v8::Value>* self_v(reinterpret_cast<v8::Local<v8::Value>*>(this));
+    assert((*self_v)->IsObject());
+    v8::Local<v8::Object> self((*self_v).As<v8::Object>());
+    int count = self->InternalFieldCount();
+    void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
+    for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
+      internal_fields[i] = self->GetAlignedPointerFromInternalField(i);
+    }
+    wcbd = new WeakCallbackInfo<P>(
+        reinterpret_cast<Persistent<v8::Value>*>(this)
+      , callback
+      , 0
+      , internal_fields[0]
+      , internal_fields[1]);
+    self->SetAlignedPointerInInternalField(0, wcbd);
+    v8::PersistentBase<T>::SetPhantom(
+        static_cast<WeakCallbackInfo<P>*>(0)
+      , WeakCallbackInfo<P>::invoketwofield
+      , 0
+      , count > 1 ? 1 : kNoInternalFieldIndex);
+  }
+}
+#elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
+template<typename T, typename M>
+template<typename P>
+inline void Persistent<T, M>::SetWeak(
+    P *parameter
+  , typename WeakCallbackInfo<P>::Callback callback
+  , WeakCallbackType type) {
+  WeakCallbackInfo<P> *wcbd;
+  if (type == WeakCallbackType::kParameter) {
+    wcbd = new WeakCallbackInfo<P>(
+        reinterpret_cast<Persistent<v8::Value>*>(this)
+      , callback
+      , parameter);
+    v8::PersistentBase<T>::SetPhantom(
+        wcbd
+      , WeakCallbackInfo<P>::invokeparameter);
+  } else {
+    v8::Local<v8::Value>* self_v(reinterpret_cast<v8::Local<v8::Value>*>(this));
+    assert((*self_v)->IsObject());
+    v8::Local<v8::Object> self((*self_v).As<v8::Object>());
+    int count = self->InternalFieldCount();
+    void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
+    for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
+      internal_fields[i] = self->GetAlignedPointerFromInternalField(i);
+    }
+    wcbd = new WeakCallbackInfo<P>(
+        reinterpret_cast<Persistent<v8::Value>*>(this)
+      , callback
+      , 0
+      , internal_fields[0]
+      , internal_fields[1]);
+    self->SetAlignedPointerInInternalField(0, wcbd);
+    v8::PersistentBase<T>::SetPhantom(
+        WeakCallbackInfo<P>::invoketwofield
+      , 0
+      , count > 1 ? 1 : kNoInternalFieldIndex);
+  }
+}
+#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
+template<typename T, typename M>
+template<typename P>
+inline void Persistent<T, M>::SetWeak(
+    P *parameter
+  , typename WeakCallbackInfo<P>::Callback callback
+  , WeakCallbackType type) {
+  WeakCallbackInfo<P> *wcbd;
+  if (type == WeakCallbackType::kParameter) {
+    wcbd = new WeakCallbackInfo<P>(
+        reinterpret_cast<Persistent<v8::Value>*>(this)
+      , callback
+      , parameter);
+    v8::PersistentBase<T>::SetWeak(wcbd, WeakCallbackInfo<P>::invoke);
+  } else {
+    v8::Local<v8::Value>* self_v(reinterpret_cast<v8::Local<v8::Value>*>(this));
+    assert((*self_v)->IsObject());
+    v8::Local<v8::Object> self((*self_v).As<v8::Object>());
+    int count = self->InternalFieldCount();
+    void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
+    for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
+      internal_fields[i] = self->GetAlignedPointerFromInternalField(i);
+    }
+    wcbd = new WeakCallbackInfo<P>(
+        reinterpret_cast<Persistent<v8::Value>*>(this)
+      , callback
+      , 0
+      , internal_fields[0]
+      , internal_fields[1]);
+    v8::PersistentBase<T>::SetWeak(wcbd, WeakCallbackInfo<P>::invoke);
+  }
+}
+#else
+template<typename T>
+template<typename P>
+inline void PersistentBase<T>::SetWeak(
+    P *parameter
+  , typename WeakCallbackInfo<P>::Callback callback
+  , WeakCallbackType type) {
+  WeakCallbackInfo<P> *wcbd;
+  if (type == WeakCallbackType::kParameter) {
+    wcbd = new WeakCallbackInfo<P>(
+        reinterpret_cast<Persistent<v8::Value>*>(this)
+      , callback
+      , parameter);
+    persistent.MakeWeak(wcbd, WeakCallbackInfo<P>::invoke);
+  } else {
+    v8::Local<v8::Value>* self_v(reinterpret_cast<v8::Local<v8::Value>*>(this));
+    assert((*self_v)->IsObject());
+    v8::Local<v8::Object> self((*self_v).As<v8::Object>());
+    int count = self->InternalFieldCount();
+    void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
+    for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
+      internal_fields[i] = self->GetPointerFromInternalField(i);
+    }
+    wcbd = new WeakCallbackInfo<P>(
+        reinterpret_cast<Persistent<v8::Value>*>(this)
+      , callback
+      , 0
+      , internal_fields[0]
+      , internal_fields[1]);
+    persistent.MakeWeak(wcbd, WeakCallbackInfo<P>::invoke);
+  }
+}
+#endif
+
+#endif  // NAN_WEAK_H_
diff --git a/node_modules/nan/package.json b/node_modules/nan/package.json
new file mode 100644
index 0000000..a575746
--- /dev/null
+++ b/node_modules/nan/package.json
@@ -0,0 +1,98 @@
+{
+  "_from": "nan@^2.14.2",
+  "_id": "nan@2.14.2",
+  "_inBundle": false,
+  "_integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==",
+  "_location": "/nan",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "nan@^2.14.2",
+    "name": "nan",
+    "escapedName": "nan",
+    "rawSpec": "^2.14.2",
+    "saveSpec": null,
+    "fetchSpec": "^2.14.2"
+  },
+  "_requiredBy": [
+    "/@serialport/bindings"
+  ],
+  "_resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
+  "_shasum": "f5376400695168f4cc694ac9393d0c9585eeea19",
+  "_spec": "nan@^2.14.2",
+  "_where": "F:\\vent-display\\node_modules\\@serialport\\bindings",
+  "bugs": {
+    "url": "https://github.com/nodejs/nan/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Rod Vagg",
+      "email": "r@va.gg",
+      "url": "https://github.com/rvagg"
+    },
+    {
+      "name": "Benjamin Byholm",
+      "email": "bbyholm@abo.fi",
+      "url": "https://github.com/kkoopa/"
+    },
+    {
+      "name": "Trevor Norris",
+      "email": "trev.norris@gmail.com",
+      "url": "https://github.com/trevnorris"
+    },
+    {
+      "name": "Nathan Rajlich",
+      "email": "nathan@tootallnate.net",
+      "url": "https://github.com/TooTallNate"
+    },
+    {
+      "name": "Brett Lawson",
+      "email": "brett19@gmail.com",
+      "url": "https://github.com/brett19"
+    },
+    {
+      "name": "Ben Noordhuis",
+      "email": "info@bnoordhuis.nl",
+      "url": "https://github.com/bnoordhuis"
+    },
+    {
+      "name": "David Siegel",
+      "email": "david@artcom.de",
+      "url": "https://github.com/agnat"
+    },
+    {
+      "name": "Michael Ira Krufky",
+      "email": "mkrufky@gmail.com",
+      "url": "https://github.com/mkrufky"
+    }
+  ],
+  "deprecated": false,
+  "description": "Native Abstractions for Node.js: C++ header for Node 0.8 -> 14 compatibility",
+  "devDependencies": {
+    "bindings": "~1.2.1",
+    "commander": "^2.8.1",
+    "glob": "^5.0.14",
+    "node-gyp": "~3.6.2",
+    "readable-stream": "^2.1.4",
+    "request": "=2.81.0",
+    "tap": "~0.7.1",
+    "xtend": "~4.0.0"
+  },
+  "homepage": "https://github.com/nodejs/nan#readme",
+  "license": "MIT",
+  "main": "include_dirs.js",
+  "name": "nan",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/nodejs/nan.git"
+  },
+  "scripts": {
+    "docs": "doc/.build.sh",
+    "rebuild-tests": "node-gyp rebuild --msvs_version=2015 --directory test",
+    "test": "tap --gc --stderr test/js/*-test.js",
+    "test:worker": "node --experimental-worker test/tap-as-worker.js --gc --stderr test/js/*-test.js"
+  },
+  "version": "2.14.2"
+}
diff --git a/node_modules/nan/tools/1to2.js b/node_modules/nan/tools/1to2.js
new file mode 100644
index 0000000..6af2505
--- /dev/null
+++ b/node_modules/nan/tools/1to2.js
@@ -0,0 +1,412 @@
+#!/usr/bin/env node
+/*********************************************************************
+ * NAN - Native Abstractions for Node.js
+ *
+ * Copyright (c) 2018 NAN contributors
+ *
+ * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
+ ********************************************************************/
+
+var commander = require('commander'),
+    fs = require('fs'),
+    glob = require('glob'),
+    groups = [],
+    total = 0,
+    warning1 = '/* ERROR: Rewrite using Buffer */\n',
+    warning2 = '\\/\\* ERROR\\: Rewrite using Buffer \\*\\/\\n',
+    length,
+    i;
+
+fs.readFile(__dirname + '/package.json', 'utf8', function (err, data) {
+  if (err) {
+    throw err;
+  }
+
+  commander
+      .version(JSON.parse(data).version)
+      .usage('[options] <file ...>')
+      .parse(process.argv);
+
+  if (!process.argv.slice(2).length) {
+    commander.outputHelp();
+  }
+});
+
+/* construct strings representing regular expressions
+   each expression contains a unique group allowing for identification of the match
+   the index of this key group, relative to the regular expression in question,
+    is indicated by the first array member */
+
+/* simple substistutions, key group is the entire match, 0 */
+groups.push([0, [
+  '_NAN_',
+  'NODE_SET_METHOD',
+  'NODE_SET_PROTOTYPE_METHOD',
+  'NanAsciiString',
+  'NanEscapeScope',
+  'NanReturnValue',
+  'NanUcs2String'].join('|')]);
+
+/* substitutions of parameterless macros, key group is 1 */
+groups.push([1, ['(', [
+  'NanEscapableScope',
+  'NanReturnNull',
+  'NanReturnUndefined',
+  'NanScope'].join('|'), ')\\(\\)'].join('')]);
+
+/* replace TryCatch with NanTryCatch once, gobbling possible namespace, key group 2 */
+groups.push([2, '(?:(?:v8\\:\\:)?|(Nan)?)(TryCatch)']);
+
+/* NanNew("string") will likely not fail a ToLocalChecked(), key group 1 */ 
+groups.push([1, ['(NanNew)', '(\\("[^\\"]*"[^\\)]*\\))(?!\\.ToLocalChecked\\(\\))'].join('')]);
+
+/* Removed v8 APIs, warn that the code needs rewriting using node::Buffer, key group 2 */
+groups.push([2, ['(', warning2, ')?', '^.*?(', [
+      'GetIndexedPropertiesExternalArrayDataLength',
+      'GetIndexedPropertiesExternalArrayData',
+      'GetIndexedPropertiesExternalArrayDataType',
+      'GetIndexedPropertiesPixelData',
+      'GetIndexedPropertiesPixelDataLength',
+      'HasIndexedPropertiesInExternalArrayData',
+      'HasIndexedPropertiesInPixelData',
+      'SetIndexedPropertiesToExternalArrayData',
+      'SetIndexedPropertiesToPixelData'].join('|'), ')'].join('')]);
+
+/* No need for NanScope in V8-exposed methods, key group 2 */
+groups.push([2, ['((', [
+      'NAN_METHOD',
+      'NAN_GETTER',
+      'NAN_SETTER',
+      'NAN_PROPERTY_GETTER',
+      'NAN_PROPERTY_SETTER',
+      'NAN_PROPERTY_ENUMERATOR',
+      'NAN_PROPERTY_DELETER',
+      'NAN_PROPERTY_QUERY',
+      'NAN_INDEX_GETTER',
+      'NAN_INDEX_SETTER',
+      'NAN_INDEX_ENUMERATOR',
+      'NAN_INDEX_DELETER',
+      'NAN_INDEX_QUERY'].join('|'), ')\\([^\\)]*\\)\\s*\\{)\\s*NanScope\\(\\)\\s*;'].join('')]);
+
+/* v8::Value::ToXXXXXXX returns v8::MaybeLocal<T>, key group 3 */
+groups.push([3, ['([\\s\\(\\)])([^\\s\\(\\)]+)->(', [
+      'Boolean',
+      'Number',
+      'String',
+      'Object',
+      'Integer',
+      'Uint32',
+      'Int32'].join('|'), ')\\('].join('')]);
+
+/* v8::Value::XXXXXXXValue returns v8::Maybe<T>, key group 3 */
+groups.push([3, ['([\\s\\(\\)])([^\\s\\(\\)]+)->((?:', [
+      'Boolean',
+      'Number',
+      'Integer',
+      'Uint32',
+      'Int32'].join('|'), ')Value)\\('].join('')]);
+
+/* NAN_WEAK_CALLBACK macro was removed, write out callback definition, key group 1 */
+groups.push([1, '(NAN_WEAK_CALLBACK)\\(([^\\s\\)]+)\\)']);
+
+/* node::ObjectWrap and v8::Persistent have been replaced with Nan implementations, key group 1 */
+groups.push([1, ['(', [
+  'NanDisposePersistent',
+  'NanObjectWrapHandle'].join('|'), ')\\s*\\(\\s*([^\\s\\)]+)'].join('')]);
+
+/* Since NanPersistent there is no need for NanMakeWeakPersistent, key group 1 */
+groups.push([1, '(NanMakeWeakPersistent)\\s*\\(\\s*([^\\s,]+)\\s*,\\s*']);
+
+/* Many methods of v8::Object and others now return v8::MaybeLocal<T>, key group 3 */
+groups.push([3, ['([\\s])([^\\s]+)->(', [
+  'GetEndColumn',
+  'GetFunction',
+  'GetLineNumber',
+  'NewInstance',
+  'GetPropertyNames',
+  'GetOwnPropertyNames',
+  'GetSourceLine',
+  'GetStartColumn',
+  'ObjectProtoToString',
+  'ToArrayIndex',
+  'ToDetailString',
+  'CallAsConstructor',
+  'CallAsFunction',
+  'CloneElementAt',
+  'Delete',
+  'ForceSet',
+  'Get',
+  'GetPropertyAttributes',
+  'GetRealNamedProperty',
+  'GetRealNamedPropertyInPrototypeChain',
+  'Has',
+  'HasOwnProperty',
+  'HasRealIndexedProperty',
+  'HasRealNamedCallbackProperty',
+  'HasRealNamedProperty',
+  'Set',
+  'SetAccessor',
+  'SetIndexedPropertyHandler',
+  'SetNamedPropertyHandler',
+  'SetPrototype'].join('|'), ')\\('].join('')]);
+
+/* You should get an error if any of these fail anyways,
+   or handle the error better, it is indicated either way, key group 2 */
+groups.push([2, ['NanNew(<(?:v8\\:\\:)?(', ['Date', 'String', 'RegExp'].join('|'), ')>)(\\([^\\)]*\\))(?!\\.ToLocalChecked\\(\\))'].join('')]);
+
+/* v8::Value::Equals now returns a v8::Maybe, key group 3 */
+groups.push([3, '([\\s\\(\\)])([^\\s\\(\\)]+)->(Equals)\\(([^\\s\\)]+)']);
+
+/* NanPersistent makes this unnecessary, key group 1 */
+groups.push([1, '(NanAssignPersistent)(?:<v8\\:\\:[^>]+>)?\\(([^,]+),\\s*']);
+
+/* args has been renamed to info, key group 2 */
+groups.push([2, '(\\W)(args)(\\W)'])
+
+/* node::ObjectWrap was replaced with NanObjectWrap, key group 2 */
+groups.push([2, '(\\W)(?:node\\:\\:)?(ObjectWrap)(\\W)']);
+
+/* v8::Persistent was replaced with NanPersistent, key group 2 */
+groups.push([2, '(\\W)(?:v8\\:\\:)?(Persistent)(\\W)']);
+
+/* counts the number of capturing groups in a well-formed regular expression,
+   ignoring non-capturing groups and escaped parentheses */
+function groupcount(s) {
+  var positive = s.match(/\((?!\?)/g),
+      negative = s.match(/\\\(/g);
+  return (positive ? positive.length : 0) - (negative ? negative.length : 0);
+}
+
+/* compute the absolute position of each key group in the joined master RegExp */
+for (i = 1, length = groups.length; i < length; i++) {
+	total += groupcount(groups[i - 1][1]);
+	groups[i][0] += total;
+}
+
+/* create the master RegExp, whis is the union of all the groups' expressions */
+master = new RegExp(groups.map(function (a) { return a[1]; }).join('|'), 'gm');
+
+/* replacement function for String.replace, receives 21 arguments */
+function replace() {
+	/* simple expressions */
+      switch (arguments[groups[0][0]]) {
+        case '_NAN_':
+          return 'NAN_';
+        case 'NODE_SET_METHOD':
+          return 'NanSetMethod';
+        case 'NODE_SET_PROTOTYPE_METHOD':
+          return 'NanSetPrototypeMethod';
+        case 'NanAsciiString':
+          return 'NanUtf8String';
+        case 'NanEscapeScope':
+          return 'scope.Escape';
+        case 'NanReturnNull':
+          return 'info.GetReturnValue().SetNull';
+        case 'NanReturnValue':
+          return 'info.GetReturnValue().Set';
+        case 'NanUcs2String':
+          return 'v8::String::Value';
+        default:
+      }
+
+      /* macros without arguments */
+      switch (arguments[groups[1][0]]) {
+        case 'NanEscapableScope':
+          return 'NanEscapableScope scope'
+        case 'NanReturnUndefined':
+          return 'return';
+        case 'NanScope':
+          return 'NanScope scope';
+        default:
+      }
+
+      /* TryCatch, emulate negative backref */
+      if (arguments[groups[2][0]] === 'TryCatch') {
+        return arguments[groups[2][0] - 1] ? arguments[0] : 'NanTryCatch';
+      }
+
+      /* NanNew("foo") --> NanNew("foo").ToLocalChecked() */
+      if (arguments[groups[3][0]] === 'NanNew') {
+        return [arguments[0], '.ToLocalChecked()'].join('');
+      }
+
+      /* insert warning for removed functions as comment on new line above */
+      switch (arguments[groups[4][0]]) {
+        case 'GetIndexedPropertiesExternalArrayData':
+        case 'GetIndexedPropertiesExternalArrayDataLength':
+        case 'GetIndexedPropertiesExternalArrayDataType':
+        case 'GetIndexedPropertiesPixelData':
+        case 'GetIndexedPropertiesPixelDataLength':
+        case 'HasIndexedPropertiesInExternalArrayData':
+        case 'HasIndexedPropertiesInPixelData':
+        case 'SetIndexedPropertiesToExternalArrayData':
+        case 'SetIndexedPropertiesToPixelData':
+          return arguments[groups[4][0] - 1] ? arguments[0] : [warning1, arguments[0]].join('');
+        default:
+      }
+
+     /* remove unnecessary NanScope() */
+      switch (arguments[groups[5][0]]) {
+        case 'NAN_GETTER':
+        case 'NAN_METHOD':
+        case 'NAN_SETTER':
+        case 'NAN_INDEX_DELETER':
+        case 'NAN_INDEX_ENUMERATOR':
+        case 'NAN_INDEX_GETTER':
+        case 'NAN_INDEX_QUERY':
+        case 'NAN_INDEX_SETTER':
+        case 'NAN_PROPERTY_DELETER':
+        case 'NAN_PROPERTY_ENUMERATOR':
+        case 'NAN_PROPERTY_GETTER':
+        case 'NAN_PROPERTY_QUERY':
+        case 'NAN_PROPERTY_SETTER':
+          return arguments[groups[5][0] - 1];
+        default:
+      }
+
+      /* Value conversion */
+      switch (arguments[groups[6][0]]) {
+        case 'Boolean':
+        case 'Int32':
+        case 'Integer':
+        case 'Number':
+        case 'Object':
+        case 'String':
+        case 'Uint32':
+          return [arguments[groups[6][0] - 2], 'NanTo<v8::', arguments[groups[6][0]], '>(',  arguments[groups[6][0] - 1]].join('');
+        default:
+      }
+
+      /* other value conversion */
+      switch (arguments[groups[7][0]]) {
+        case 'BooleanValue':
+          return [arguments[groups[7][0] - 2], 'NanTo<bool>(', arguments[groups[7][0] - 1]].join('');
+        case 'Int32Value':
+          return [arguments[groups[7][0] - 2], 'NanTo<int32_t>(', arguments[groups[7][0] - 1]].join('');
+        case 'IntegerValue':
+          return [arguments[groups[7][0] - 2], 'NanTo<int64_t>(', arguments[groups[7][0] - 1]].join('');
+        case 'Uint32Value':
+          return [arguments[groups[7][0] - 2], 'NanTo<uint32_t>(', arguments[groups[7][0] - 1]].join('');
+        default:
+      }
+
+      /* NAN_WEAK_CALLBACK */
+      if (arguments[groups[8][0]] === 'NAN_WEAK_CALLBACK') {
+        return ['template<typename T>\nvoid ',
+          arguments[groups[8][0] + 1], '(const NanWeakCallbackInfo<T> &data)'].join('');
+      }
+
+      /* use methods on NAN classes instead */
+      switch (arguments[groups[9][0]]) {
+        case 'NanDisposePersistent':
+          return [arguments[groups[9][0] + 1], '.Reset('].join('');
+        case 'NanObjectWrapHandle':
+          return [arguments[groups[9][0] + 1], '->handle('].join('');
+        default:
+      }
+
+      /* use method on NanPersistent instead */
+      if (arguments[groups[10][0]] === 'NanMakeWeakPersistent') {
+        return arguments[groups[10][0] + 1] + '.SetWeak(';
+      }
+
+      /* These return Maybes, the upper ones take no arguments */
+      switch (arguments[groups[11][0]]) {
+        case 'GetEndColumn':
+        case 'GetFunction':
+        case 'GetLineNumber':
+        case 'GetOwnPropertyNames':
+        case 'GetPropertyNames':
+        case 'GetSourceLine':
+        case 'GetStartColumn':
+        case 'NewInstance':
+        case 'ObjectProtoToString':
+        case 'ToArrayIndex':
+        case 'ToDetailString':
+          return [arguments[groups[11][0] - 2], 'Nan', arguments[groups[11][0]], '(', arguments[groups[11][0] - 1]].join('');
+        case 'CallAsConstructor':
+        case 'CallAsFunction':
+        case 'CloneElementAt':
+        case 'Delete':
+        case 'ForceSet':
+        case 'Get':
+        case 'GetPropertyAttributes':
+        case 'GetRealNamedProperty':
+        case 'GetRealNamedPropertyInPrototypeChain':
+        case 'Has':
+        case 'HasOwnProperty':
+        case 'HasRealIndexedProperty':
+        case 'HasRealNamedCallbackProperty':
+        case 'HasRealNamedProperty':
+        case 'Set':
+        case 'SetAccessor':
+        case 'SetIndexedPropertyHandler':
+        case 'SetNamedPropertyHandler':
+        case 'SetPrototype':
+          return [arguments[groups[11][0] - 2], 'Nan', arguments[groups[11][0]], '(', arguments[groups[11][0] - 1], ', '].join('');
+        default:
+      }
+
+      /* Automatic ToLocalChecked(), take it or leave it */
+      switch (arguments[groups[12][0]]) {
+        case 'Date':
+        case 'String':
+        case 'RegExp':
+          return ['NanNew', arguments[groups[12][0] - 1], arguments[groups[12][0] + 1], '.ToLocalChecked()'].join('');
+        default:
+      }
+
+      /* NanEquals is now required for uniformity */
+      if (arguments[groups[13][0]] === 'Equals') {
+        return [arguments[groups[13][0] - 1], 'NanEquals(', arguments[groups[13][0] - 1], ', ', arguments[groups[13][0] + 1]].join('');
+      }
+
+      /* use method on replacement class instead */
+      if (arguments[groups[14][0]] === 'NanAssignPersistent') {
+        return [arguments[groups[14][0] + 1], '.Reset('].join('');
+      }
+
+      /* args --> info */
+      if (arguments[groups[15][0]] === 'args') {
+        return [arguments[groups[15][0] - 1], 'info', arguments[groups[15][0] + 1]].join('');
+      }
+
+      /* ObjectWrap --> NanObjectWrap */
+      if (arguments[groups[16][0]] === 'ObjectWrap') {
+        return [arguments[groups[16][0] - 1], 'NanObjectWrap', arguments[groups[16][0] + 1]].join('');
+      }
+
+      /* Persistent --> NanPersistent */
+      if (arguments[groups[17][0]] === 'Persistent') {
+        return [arguments[groups[17][0] - 1], 'NanPersistent', arguments[groups[17][0] + 1]].join('');
+      }
+
+      /* This should not happen. A switch is probably missing a case if it does. */
+      throw 'Unhandled match: ' + arguments[0];
+}
+
+/* reads a file, runs replacement and writes it back */
+function processFile(file) {
+  fs.readFile(file, {encoding: 'utf8'}, function (err, data) {
+    if (err) {
+      throw err;
+    }
+
+    /* run replacement twice, might need more runs */
+    fs.writeFile(file, data.replace(master, replace).replace(master, replace), function (err) {
+      if (err) {
+        throw err;
+      }
+    });
+  });
+}
+
+/* process file names from command line and process the identified files */
+for (i = 2, length = process.argv.length; i < length; i++) {
+  glob(process.argv[i], function (err, matches) {
+    if (err) {
+      throw err;
+    }
+    matches.forEach(processFile);
+  });
+}
diff --git a/node_modules/nan/tools/README.md b/node_modules/nan/tools/README.md
new file mode 100644
index 0000000..7f07e4b
--- /dev/null
+++ b/node_modules/nan/tools/README.md
@@ -0,0 +1,14 @@
+1to2 naively converts source code files from NAN 1 to NAN 2. There will be erroneous conversions,
+false positives and missed opportunities. The input files are rewritten in place. Make sure that
+you have backups. You will have to manually review the changes afterwards and do some touchups.
+
+```sh
+$ tools/1to2.js
+
+  Usage: 1to2 [options] <file ...>
+
+  Options:
+
+    -h, --help     output usage information
+    -V, --version  output the version number
+```
diff --git a/node_modules/nan/tools/package.json b/node_modules/nan/tools/package.json
new file mode 100644
index 0000000..2dcdd78
--- /dev/null
+++ b/node_modules/nan/tools/package.json
@@ -0,0 +1,19 @@
+{
+  "name": "1to2",
+  "version": "1.0.0",
+  "description": "NAN 1 -> 2 Migration Script",
+  "main": "1to2.js",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/nodejs/nan.git"
+  },
+  "contributors": [
+    "Benjamin Byholm <bbyholm@abo.fi> (https://github.com/kkoopa/)",
+    "Mathias Küsel (https://github.com/mathiask88/)"
+  ],
+  "dependencies": {
+    "glob": "~5.0.10",
+    "commander": "~2.8.1"
+  },
+  "license": "MIT"
+}
diff --git a/node_modules/napi-build-utils/LICENSE b/node_modules/napi-build-utils/LICENSE
new file mode 100644
index 0000000..8e0248a
--- /dev/null
+++ b/node_modules/napi-build-utils/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 inspiredware
+
+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/napi-build-utils/README.md b/node_modules/napi-build-utils/README.md
new file mode 100644
index 0000000..f056002
--- /dev/null
+++ b/node_modules/napi-build-utils/README.md
@@ -0,0 +1,48 @@
+# napi-build-utils
+
+[![npm](https://img.shields.io/npm/v/napi-build-utils.svg)](https://www.npmjs.com/package/napi-build-utils)
+![Node version](https://img.shields.io/node/v/prebuild.svg)
+[![Build Status](https://travis-ci.org/inspiredware/napi-build-utils.svg?branch=master)](https://travis-ci.org/inspiredware/napi-build-utils) 
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/) 
+[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 
+
+A set of utilities to assist developers of tools that build [N-API](https://nodejs.org/api/n-api.html#n_api_n_api) native add-ons.
+
+## Background
+
+This module is targeted to developers creating tools that build N-API native add-ons. 
+
+It implements a set of functions that aid in determining the N-API version supported by the currently running Node instance and the set of N-API versions against which the N-API native add-on is designed to be built. Other functions determine whether a particular N-API version can be built and can issue console warnings for unsupported N-API versions. 
+
+Unlike the modules this code is designed to facilitate building, this module is written entirely in JavaScript. 
+
+## Quick start
+
+```bash
+$ npm install napi-build-utils
+```
+
+The module exports a set of functions documented [here](./index.md). For example:
+
+```javascript
+var napiBuildUtils = require('napi-build-utils');
+var napiVersion = napiBuildUtils.getNapiVersion(); // N-API version supported by Node, or undefined.
+```
+
+## Declaring supported N-API versions
+
+Native modules that are designed to work with [N-API](https://nodejs.org/api/n-api.html#n_api_n_api) must explicitly declare the N-API version(s) against which they are coded to build. This is accomplished by including a `binary.napi_versions` property in the module's `package.json` file. For example:
+
+```json
+"binary": {
+  "napi_versions": [2,3]
+}
+``` 
+
+In the absence of a need to compile against a specific N-API version, the value `3` is a good choice as this is the N-API version that was supported when N-API left experimental status. 
+
+Modules that are built against a specific N-API version will continue to operate indefinitely, even as later versions of N-API are introduced. 
+
+## Support
+
+If you run into problems or limitations, please file an issue and we'll take a look. Pull requests are also welcome.  
diff --git a/node_modules/napi-build-utils/index.js b/node_modules/napi-build-utils/index.js
new file mode 100644
index 0000000..1643994
--- /dev/null
+++ b/node_modules/napi-build-utils/index.js
@@ -0,0 +1,213 @@
+'use strict'
+// Copyright (c) 2018 inspiredware
+
+var path = require('path')
+var pkg = require(path.resolve('package.json'))
+
+var versionArray = process.version
+  .substr(1)
+  .replace(/-.*$/, '')
+  .split('.')
+  .map(function (item) {
+    return +item
+  })
+
+/**
+ *
+ * A set of utilities to assist developers of tools that build
+ * [N-API](https://nodejs.org/api/n-api.html#n_api_n_api) native add-ons.
+ *
+ * The main repository can be found
+ * [here](https://github.com/inspiredware/napi-build-utils#napi-build-utils).
+ *
+ * @module napi-build-utils
+ */
+
+/**
+ * Implements a consistent name of `napi` for N-API runtimes.
+ *
+ * @param {string} runtime The runtime string.
+ * @returns {boolean}
+ */
+exports.isNapiRuntime = function (runtime) {
+  return runtime === 'napi'
+}
+
+/**
+ * Determines whether the specified N-API version is supported
+ * by both the currently running Node instance and the package.
+ *
+ * @param {string} napiVersion The N-API version to check.
+ * @returns {boolean}
+ */
+exports.isSupportedVersion = function (napiVersion) {
+  var version = parseInt(napiVersion, 10)
+  return version <= exports.getNapiVersion() && exports.packageSupportsVersion(version)
+}
+
+/**
+ * Determines whether the specified N-API version is supported by the package.
+ * The N-API version must be preseent in the `package.json`
+ * `binary.napi_versions` array.
+ *
+ * @param {number} napiVersion The N-API version to check.
+ * @returns {boolean}
+ * @private
+ */
+exports.packageSupportsVersion = function (napiVersion) {
+  if (pkg.binary && pkg.binary.napi_versions &&
+      pkg.binary.napi_versions instanceof Array) {
+    for (var i = 0; i < pkg.binary.napi_versions.length; i++) {
+      if (pkg.binary.napi_versions[i] === napiVersion) return true
+    };
+  };
+  return false
+}
+
+/**
+ * Issues a warning to the supplied log if the N-API version is not supported
+ * by the current Node instance or if the N-API version is not supported
+ * by the package.
+ *
+ * @param {string} napiVersion The N-API version to check.
+ * @param {Object} log The log object to which the warnings are to be issued.
+ * Must implement the `warn` method.
+ */
+exports.logUnsupportedVersion = function (napiVersion, log) {
+  if (!exports.isSupportedVersion(napiVersion)) {
+    if (exports.packageSupportsVersion(napiVersion)) {
+      log.warn('This Node instance does not support N-API version ' + napiVersion)
+    } else {
+      log.warn('This package does not support N-API version ' + napiVersion)
+    }
+  }
+}
+
+/**
+ * Issues warnings to the supplied log for those N-API versions not supported
+ * by the N-API runtime or the package.
+ *
+ * Note that this function is specific to the
+ * [`prebuild`](https://github.com/prebuild/prebuild#prebuild) package.
+ *
+ * `target` is the list of targets to be built and is determined in one of
+ * three ways from the command line arguments:
+ * (1) `--target` specifies a specific target to build.
+ * (2) `--all` specifies all N-API versions supported by the package.
+ * (3) Neither of these specifies to build the single "best version available."
+ *
+ * `prebuild` is an array of objects in the form `{runtime: 'napi', target: '2'}`.
+ * The array contains the list of N-API versions that are supported by both the
+ * package being built and the currently running Node instance.
+ *
+ * The objective of this function is to issue a warning for those items that appear
+ * in the `target` argument but not in the `prebuild` argument.
+ * If a specific target is supported by the package (`packageSupportsVersion`) but
+ * but note in `prebuild`, the assumption is that the target is not supported by
+ * Node.
+ *
+ * @param {(Array<string>|string)} target The N-API version(s) to check. Target is
+ * @param {Array<Object>} prebuild A config object created by the `prebuild` package.
+ * @param {Object} log The log object to which the warnings are to be issued.
+ * Must implement the `warn` method.
+ * @private
+ */
+exports.logMissingNapiVersions = function (target, prebuild, log) {
+  if (exports.getNapiBuildVersions()) {
+    var targets = [].concat(target)
+    targets.forEach(function (napiVersion) {
+      if (!prebuildExists(prebuild, napiVersion)) {
+        if (exports.packageSupportsVersion(parseInt(napiVersion, 10))) {
+          log.warn('This Node instance does not support N-API version ' + napiVersion)
+        } else {
+          log.warn('This package does not support N-API version ' + napiVersion)
+        }
+      }
+    })
+  } else {
+    log.error('Builds with runtime \'napi\' require a binary.napi_versions ' +
+              'property on the package.json file')
+  }
+}
+
+/**
+ * Determines whether the specified N-API version exists in the prebuild
+ * configuration object.
+ *
+ * Note that this function is speicifc to the `prebuild` and `prebuild-install`
+ * packages.
+ *
+ * @param {Object} prebuild A config object created by the `prebuild` package.
+ * @param {string} napiVersion The N-APi version to be checked.
+ * @return {boolean}
+ * @private
+ */
+var prebuildExists = function (prebuild, napiVersion) {
+  if (prebuild) {
+    for (var i = 0; i < prebuild.length; i++) {
+      if (prebuild[i].target === napiVersion) return true
+    }
+  }
+  return false
+}
+
+/**
+ * Returns the best N-API version to build given the highest N-API
+ * version supported by the current Node instance and the N-API versions
+ * supported by the package, or undefined if a suitable N-API version
+ * cannot be determined.
+ *
+ * The best build version is the greatest N-API version supported by
+ * the package that is less than or equal to the highest N-API version
+ * supported by the current Node instance.
+ *
+ * @returns {number|undefined}
+ */
+exports.getBestNapiBuildVersion = function () {
+  var bestNapiBuildVersion = 0
+  var napiBuildVersions = exports.getNapiBuildVersions(pkg)
+  if (napiBuildVersions) {
+    var ourNapiVersion = exports.getNapiVersion()
+    napiBuildVersions.forEach(function (napiBuildVersion) {
+      if (napiBuildVersion > bestNapiBuildVersion &&
+        napiBuildVersion <= ourNapiVersion) {
+        bestNapiBuildVersion = napiBuildVersion
+      }
+    })
+  }
+  return bestNapiBuildVersion === 0 ? undefined : bestNapiBuildVersion
+}
+
+/**
+ * Returns an array of N-API versions supported by the package.
+ *
+ * @returns {Array<string>}
+ */
+exports.getNapiBuildVersions = function () {
+  var napiBuildVersions = []
+  // remove duplicates, convert to text
+  if (pkg.binary && pkg.binary.napi_versions) {
+    pkg.binary.napi_versions.forEach(function (napiVersion) {
+      var duplicated = napiBuildVersions.indexOf('' + napiVersion) !== -1
+      if (!duplicated) {
+        napiBuildVersions.push('' + napiVersion)
+      }
+    })
+  }
+  return napiBuildVersions.length ? napiBuildVersions : undefined
+}
+
+/**
+ * Returns the highest N-API version supported by the current node instance
+ * or undefined if N-API is not supported.
+ *
+ * @returns {string|undefined}
+ */
+exports.getNapiVersion = function () {
+  var version = process.versions.napi // string, can be undefined
+  if (!version) { // this code should never need to be updated
+    if (versionArray[0] === 9 && versionArray[1] >= 3) version = '2' // 9.3.0+
+    else if (versionArray[0] === 8) version = '1' // 8.0.0+
+  }
+  return version
+}
diff --git a/node_modules/napi-build-utils/index.md b/node_modules/napi-build-utils/index.md
new file mode 100644
index 0000000..ce8d3e8
--- /dev/null
+++ b/node_modules/napi-build-utils/index.md
@@ -0,0 +1,81 @@
+<a name="module_napi-build-utils"></a>
+
+## napi-build-utils
+A set of utilities to assist developers of tools that build
+[N-API](https://nodejs.org/api/n-api.html#n_api_n_api) native add-ons.
+
+The main repository can be found
+[here](https://github.com/inspiredware/napi-build-utils#napi-build-utils).
+
+
+* [napi-build-utils](#module_napi-build-utils)
+    * [.isNapiRuntime(runtime)](#module_napi-build-utils.isNapiRuntime) ⇒ <code>boolean</code>
+    * [.isSupportedVersion(napiVersion)](#module_napi-build-utils.isSupportedVersion) ⇒ <code>boolean</code>
+    * [.logUnsupportedVersion(napiVersion, log)](#module_napi-build-utils.logUnsupportedVersion)
+    * [.getBestNapiBuildVersion()](#module_napi-build-utils.getBestNapiBuildVersion) ⇒ <code>number</code> \| <code>undefined</code>
+    * [.getNapiBuildVersions()](#module_napi-build-utils.getNapiBuildVersions) ⇒ <code>Array.&lt;string&gt;</code>
+    * [.getNapiVersion()](#module_napi-build-utils.getNapiVersion) ⇒ <code>string</code> \| <code>undefined</code>
+
+<a name="module_napi-build-utils.isNapiRuntime"></a>
+
+### napi-build-utils.isNapiRuntime(runtime) ⇒ <code>boolean</code>
+Implements a consistent name of `napi` for N-API runtimes.
+
+**Kind**: static method of [<code>napi-build-utils</code>](#module_napi-build-utils)  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| runtime | <code>string</code> | The runtime string. |
+
+<a name="module_napi-build-utils.isSupportedVersion"></a>
+
+### napi-build-utils.isSupportedVersion(napiVersion) ⇒ <code>boolean</code>
+Determines whether the specified N-API version is supported
+by both the currently running Node instance and the package.
+
+**Kind**: static method of [<code>napi-build-utils</code>](#module_napi-build-utils)  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| napiVersion | <code>string</code> | The N-API version to check. |
+
+<a name="module_napi-build-utils.logUnsupportedVersion"></a>
+
+### napi-build-utils.logUnsupportedVersion(napiVersion, log)
+Issues a warning to the supplied log if the N-API version is not supported
+by the current Node instance or if the N-API version is not supported
+by the package.
+
+**Kind**: static method of [<code>napi-build-utils</code>](#module_napi-build-utils)  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| napiVersion | <code>string</code> | The N-API version to check. |
+| log | <code>Object</code> | The log object to which the warnings are to be issued. Must implement the `warn` method. |
+
+<a name="module_napi-build-utils.getBestNapiBuildVersion"></a>
+
+### napi-build-utils.getBestNapiBuildVersion() ⇒ <code>number</code> \| <code>undefined</code>
+Returns the best N-API version to build given the highest N-API
+version supported by the current Node instance and the N-API versions
+supported by the package, or undefined if a suitable N-API version
+cannot be determined.
+
+The best build version is the greatest N-API version supported by
+the package that is less than or equal to the highest N-API version
+supported by the current Node instance.
+
+**Kind**: static method of [<code>napi-build-utils</code>](#module_napi-build-utils)  
+<a name="module_napi-build-utils.getNapiBuildVersions"></a>
+
+### napi-build-utils.getNapiBuildVersions() ⇒ <code>Array.&lt;string&gt;</code>
+Returns an array of N-API versions supported by the package.
+
+**Kind**: static method of [<code>napi-build-utils</code>](#module_napi-build-utils)  
+<a name="module_napi-build-utils.getNapiVersion"></a>
+
+### napi-build-utils.getNapiVersion() ⇒ <code>string</code> \| <code>undefined</code>
+Returns the highest N-API version supported by the current node instance
+or undefined if N-API is not supported.
+
+**Kind**: static method of [<code>napi-build-utils</code>](#module_napi-build-utils)  
diff --git a/node_modules/napi-build-utils/package.json b/node_modules/napi-build-utils/package.json
new file mode 100644
index 0000000..48f8e4f
--- /dev/null
+++ b/node_modules/napi-build-utils/package.json
@@ -0,0 +1,68 @@
+{
+  "_from": "napi-build-utils@^1.0.1",
+  "_id": "napi-build-utils@1.0.2",
+  "_inBundle": false,
+  "_integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
+  "_location": "/napi-build-utils",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "napi-build-utils@^1.0.1",
+    "name": "napi-build-utils",
+    "escapedName": "napi-build-utils",
+    "rawSpec": "^1.0.1",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.1"
+  },
+  "_requiredBy": [
+    "/prebuild-install"
+  ],
+  "_resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
+  "_shasum": "b1fddc0b2c46e380a0b7a76f984dd47c41a13806",
+  "_spec": "napi-build-utils@^1.0.1",
+  "_where": "F:\\vent-display\\node_modules\\prebuild-install",
+  "author": {
+    "name": "Jim Schlight"
+  },
+  "binary": {
+    "note": "napi-build-tools is not an N-API module. This entry is for unit testing.",
+    "napi_versions": [
+      2,
+      2,
+      3
+    ]
+  },
+  "bugs": {
+    "url": "https://github.com/inspiredware/napi-build-utils/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "A set of utilities to assist developers of tools that build N-API native add-ons",
+  "devDependencies": {
+    "chai": "^4.1.2",
+    "jsdoc-to-markdown": "^4.0.1",
+    "mocha": "^5.2.0",
+    "standard": "^12.0.1"
+  },
+  "homepage": "https://github.com/inspiredware/napi-build-utils#readme",
+  "keywords": [
+    "n-api",
+    "prebuild",
+    "prebuild-install"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "napi-build-utils",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/inspiredware/napi-build-utils.git"
+  },
+  "scripts": {
+    "doc": "jsdoc2md index.js >index.md",
+    "lint": "standard",
+    "prepublishOnly": "npm run test && npm run doc",
+    "test": "mocha test/ && npm run lint"
+  },
+  "version": "1.0.2"
+}
diff --git a/node_modules/node-abi/.github/workflows/update-abi.yml b/node_modules/node-abi/.github/workflows/update-abi.yml
new file mode 100644
index 0000000..385d05d
--- /dev/null
+++ b/node_modules/node-abi/.github/workflows/update-abi.yml
@@ -0,0 +1,41 @@
+name: Auto-update ABI JSON file
+on:
+  schedule:
+    - cron: '0 0 * * *'
+jobs:
+  autoupdate:
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v2
+    - uses: actions/setup-node@v1
+      with:
+        node-version: '12.x'
+    - name: Get npm cache directory
+      id: npm-cache
+      run: |
+        echo "::set-output name=dir::$(npm config get cache)"
+    - uses: actions/cache@v1
+      with:
+        path: ${{ steps.npm-cache.outputs.dir }}
+        key: ${{ runner.os }}-node-${{ hashFiles('**/package.json') }}
+        restore-keys: |
+          ${{ runner.os }}-node-
+    - run: npm install --no-package-lock
+    - name: Update ABI registry
+      run: npm run update-abi-registry
+    - name: Commit Changes to ABI registry
+      env:
+        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      run: |
+        echo "machine github.com login $GITHUB_ACTOR password $GITHUB_TOKEN" > ~/.netrc
+        chmod 600 ~/.netrc
+        git add abi_registry.json
+        if test -n "$(git status -s)"; then
+          git config user.name "GitHub Actions"
+          git config user.email "github-actions@users.noreply.github.com"
+          git diff --cached
+          git commit -m "feat: update ABI registry"
+          git push origin HEAD:$GITHUB_REF
+        else
+          echo No update needed
+        fi
diff --git a/node_modules/node-abi/.travis.yml b/node_modules/node-abi/.travis.yml
new file mode 100644
index 0000000..6f637f7
--- /dev/null
+++ b/node_modules/node-abi/.travis.yml
@@ -0,0 +1,19 @@
+language: node_js
+cache:
+  directories:
+    - ~/.npm
+notifications:
+  email: false
+node_js:
+  - '10'
+  - '9'
+  - '8'
+  - '6'
+  - '4'
+  - '0.12'
+  - '0.10'
+after_success:
+  - npm run travis-deploy-once "npm run semantic-release"
+branches:
+  except:
+    - /^v\d+\.\d+\.\d+$/
diff --git a/node_modules/node-abi/CODE_OF_CONDUCT.md b/node_modules/node-abi/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..a28ec15
--- /dev/null
+++ b/node_modules/node-abi/CODE_OF_CONDUCT.md
@@ -0,0 +1,73 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, gender identity and expression, level of experience,
+nationality, personal appearance, race, religion, or sexual identity and
+orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+  advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+  address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+  professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at lukas.geiger94@gmail.com. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct/
+
+[homepage]: https://www.contributor-covenant.org
diff --git a/node_modules/node-abi/CONTRIBUTING.md b/node_modules/node-abi/CONTRIBUTING.md
new file mode 100644
index 0000000..3a83ae9
--- /dev/null
+++ b/node_modules/node-abi/CONTRIBUTING.md
@@ -0,0 +1,53 @@
+# Contributing to `node-abi`
+
+:+1::tada: First off, thanks for taking the time to contribute to `node-abi`! :tada::+1:
+
+## Commit Message Guidelines
+
+This module uses [`semantic-release`](https://github.com/semantic-release/semantic-release) to automatically release new versions via Travis.
+Therefor we have very precise rules over how our git commit messages can be formatted.
+
+Each commit message consists of a **header**, a **body** and a **footer**.  The header has a special
+format that includes a **type**, a **scope** and a **subject** ([full explanation](https://github.com/stevemao/conventional-changelog-angular/blob/master/convention.md)):
+
+```
+<type>(<scope>): <subject>
+<BLANK LINE>
+<body>
+<BLANK LINE>
+<footer>
+```
+
+### Type
+
+Must be one of the following:
+
+- **feat**: A new feature. **Will trigger a new release**
+- **fix**: A bug fix or a addition to one of the target arrays. **Will trigger a new release**
+- **docs**: Documentation only changes
+- **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
+- **refactor**: A code change that neither fixes a bug nor adds a feature
+- **perf**: A code change that improves performance
+- **test**: Adding missing or correcting existing tests
+- **chore**: Changes to the build process or auxiliary tools and libraries such as documentation generation
+
+
+### Patch Release
+
+```
+fix(electron): Support Electron 1.8.0
+```
+
+### ~~Minor~~ Feature Release
+
+```
+feat: add .getTarget(abi, runtime)
+```
+
+### ~~Major~~ Breaking Release
+
+```
+feat: Add amazing new feature
+
+BREAKING CHANGE: This removes support for Node 0.10 and 0.12.
+```
diff --git a/node_modules/node-abi/LICENSE b/node_modules/node-abi/LICENSE
new file mode 100644
index 0000000..5513de0
--- /dev/null
+++ b/node_modules/node-abi/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016 Lukas Geiger
+
+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/node-abi/README.md b/node_modules/node-abi/README.md
new file mode 100644
index 0000000..abab600
--- /dev/null
+++ b/node_modules/node-abi/README.md
@@ -0,0 +1,50 @@
+# Node.js ABI
+
+[![Build Status](https://travis-ci.org/lgeiger/node-abi.svg?branch=v1.0.0)](https://travis-ci.org/lgeiger/node-abi) [![Greenkeeper badge](https://badges.greenkeeper.io/lgeiger/node-abi.svg)](https://greenkeeper.io/)
+
+
+Get the Node ABI for a given target and runtime, and vice versa.
+
+## Installation
+```
+npm install node-abi
+```
+
+## Usage
+```javascript
+const nodeAbi = require('node-abi')
+
+nodeAbi.getAbi('7.2.0', 'node')
+// '51'
+nodeAbi.getAbi('1.4.10', 'electron')
+// '50'
+nodeAbi.getTarget('51', 'node')
+// '7.2.0'
+nodeAbi.getTarget('50', 'electron')
+// '1.4.15'
+
+nodeAbi.allTargets
+// [
+//  { runtime: 'node', target: '0.10.48', abi: '11', lts: false },
+//  { runtime: 'node', target: '0.12.17', abi: '14', lts: false },
+//  { runtime: 'node', target: '4.6.1', abi: '46', lts: true },
+//  { runtime: 'node', target: '5.12.0', abi: '47', lts: false },
+//  { runtime: 'node', target: '6.9.4', abi: '48', lts: true },
+//  { runtime: 'node', target: '7.4.0', abi: '51', lts: false },
+//  { runtime: 'electron', target: '1.0.2', abi: '47', lts: false },
+//  { runtime: 'electron', target: '1.2.8', abi: '48', lts: false },
+//  { runtime: 'electron', target: '1.3.13', abi: '49', lts: false },
+//  { runtime: 'electron', target: '1.4.15', abi: '50', lts: false }
+// ]
+nodeAbi.deprecatedTargets
+nodeAbi.supportedTargets
+nodeAbi.additionalTargets
+nodeAbi.futureTargets
+// ...
+```
+
+## References
+
+- https://github.com/lgeiger/electron-abi
+- https://nodejs.org/en/download/releases/
+- https://github.com/nodejs/LTS
diff --git a/node_modules/node-abi/abi_registry.json b/node_modules/node-abi/abi_registry.json
new file mode 100644
index 0000000..bc1436d
--- /dev/null
+++ b/node_modules/node-abi/abi_registry.json
@@ -0,0 +1,99 @@
+[
+  {
+    "runtime": "node",
+    "target": "11.0.0",
+    "lts": false,
+    "future": false,
+    "abi": "67"
+  },
+  {
+    "runtime": "node",
+    "target": "12.0.0",
+    "lts": [
+      "2019-10-21",
+      "2020-11-30"
+    ],
+    "future": false,
+    "abi": "72"
+  },
+  {
+    "runtime": "node",
+    "target": "13.0.0",
+    "lts": false,
+    "future": false,
+    "abi": "79"
+  },
+  {
+    "runtime": "node",
+    "target": "14.0.0",
+    "lts": [
+      "2020-10-27",
+      "2021-10-19"
+    ],
+    "future": false,
+    "abi": "83"
+  },
+  {
+    "runtime": "node",
+    "target": "15.0.0",
+    "lts": false,
+    "future": false,
+    "abi": "88"
+  },
+  {
+    "abi": "70",
+    "future": false,
+    "lts": false,
+    "runtime": "electron",
+    "target": "5.0.0-beta.9"
+  },
+  {
+    "abi": "73",
+    "future": false,
+    "lts": false,
+    "runtime": "electron",
+    "target": "6.0.0-beta.1"
+  },
+  {
+    "abi": "75",
+    "future": false,
+    "lts": false,
+    "runtime": "electron",
+    "target": "7.0.0-beta.1"
+  },
+  {
+    "abi": "76",
+    "future": false,
+    "lts": false,
+    "runtime": "electron",
+    "target": "8.0.0-beta.1"
+  },
+  {
+    "abi": "80",
+    "future": false,
+    "lts": false,
+    "runtime": "electron",
+    "target": "9.0.0-beta.2"
+  },
+  {
+    "abi": "82",
+    "future": false,
+    "lts": false,
+    "runtime": "electron",
+    "target": "10.0.0-beta.1"
+  },
+  {
+    "abi": "85",
+    "future": false,
+    "lts": false,
+    "runtime": "electron",
+    "target": "11.0.0-beta.11"
+  },
+  {
+    "abi": "87",
+    "future": true,
+    "lts": false,
+    "runtime": "electron",
+    "target": "12.0.0-nightly.20201013"
+  }
+]
\ No newline at end of file
diff --git a/node_modules/node-abi/index.js b/node_modules/node-abi/index.js
new file mode 100644
index 0000000..2deb0de
--- /dev/null
+++ b/node_modules/node-abi/index.js
@@ -0,0 +1,170 @@
+var semver = require('semver')
+
+function getNextTarget (runtime, targets) {
+  if (targets == null) targets = allTargets
+  var latest = targets.filter(function (t) { return t.runtime === runtime }).slice(-1)[0]
+  var increment = runtime === 'electron' ? 'minor' : 'major'
+  return semver.inc(latest.target, increment)
+}
+
+function getAbi (target, runtime) {
+  if (target === String(Number(target))) return target
+  if (target) target = target.replace(/^v/, '')
+  if (!runtime) runtime = 'node'
+
+  if (runtime === 'node') {
+    if (!target) return process.versions.modules
+    if (target === process.versions.node) return process.versions.modules
+  }
+
+  var abi
+
+  for (var i = 0; i < allTargets.length; i++) {
+    var t = allTargets[i]
+    if (t.runtime !== runtime) continue
+    if (semver.lte(t.target, target)) abi = t.abi
+    else break
+  }
+
+  if (abi && semver.lt(target, getNextTarget(runtime))) return abi
+  throw new Error('Could not detect abi for version ' + target + ' and runtime ' + runtime + '.  Updating "node-abi" might help solve this issue if it is a new release of ' + runtime)
+}
+
+function getTarget (abi, runtime) {
+  if (abi && abi !== String(Number(abi))) return abi
+  if (!runtime) runtime = 'node'
+
+  if (runtime === 'node' && !abi) return process.versions.node
+
+  var match = allTargets
+    .filter(function (t) {
+      return t.abi === abi && t.runtime === runtime
+    })
+    .map(function (t) {
+      return t.target
+    })
+  if (match.length) {
+    var betaSeparatorIndex = match[0].indexOf("-")
+    return betaSeparatorIndex > -1
+      ? match[0].substring(0, betaSeparatorIndex)
+      : match[0]
+  }
+
+  throw new Error('Could not detect target for abi ' + abi + ' and runtime ' + runtime)
+}
+
+function sortByTargetFn (a, b) {
+  var abiComp = Number(a.abi) - Number(b.abi)
+  if (abiComp !== 0) return abiComp
+  if (a.target < b.target) return -1
+  if (a.target > b.target) return 1
+  return 0
+}
+
+function loadGeneratedTargets () {
+  var registry = require('./abi_registry.json')
+  var targets = {
+    supported: [],
+    additional: [],
+    future: []
+  }
+
+  registry.forEach(function (item) {
+    var target = {
+      runtime: item.runtime,
+      target: item.target,
+      abi: item.abi
+    }
+    if (item.lts) {
+      var startDate = new Date(Date.parse(item.lts[0]))
+      var endDate = new Date(Date.parse(item.lts[1]))
+      var currentDate = new Date()
+      target.lts = startDate < currentDate && currentDate < endDate
+    } else {
+      target.lts = false
+    }
+
+    if (target.runtime === 'node-webkit') {
+      targets.additional.push(target)
+    } else if (item.future) {
+      targets.future.push(target)
+    } else {
+      targets.supported.push(target)
+    }
+  })
+
+  targets.supported.sort(sortByTargetFn)
+  targets.additional.sort(sortByTargetFn)
+  targets.future.sort(sortByTargetFn)
+
+  return targets
+}
+
+var generatedTargets = loadGeneratedTargets()
+
+var supportedTargets = [
+  {runtime: 'node', target: '5.0.0', abi: '47', lts: false},
+  {runtime: 'node', target: '6.0.0', abi: '48', lts: false},
+  {runtime: 'node', target: '7.0.0', abi: '51', lts: false},
+  {runtime: 'node', target: '8.0.0', abi: '57', lts: false},
+  {runtime: 'node', target: '9.0.0', abi: '59', lts: false},
+  {runtime: 'node', target: '10.0.0', abi: '64', lts: new Date(2018, 10, 1) < new Date() && new Date() < new Date(2020, 4, 31)},
+  {runtime: 'electron', target: '0.36.0', abi: '47', lts: false},
+  {runtime: 'electron', target: '1.1.0', abi: '48', lts: false},
+  {runtime: 'electron', target: '1.3.0', abi: '49', lts: false},
+  {runtime: 'electron', target: '1.4.0', abi: '50', lts: false},
+  {runtime: 'electron', target: '1.5.0', abi: '51', lts: false},
+  {runtime: 'electron', target: '1.6.0', abi: '53', lts: false},
+  {runtime: 'electron', target: '1.7.0', abi: '54', lts: false},
+  {runtime: 'electron', target: '1.8.0', abi: '57', lts: false},
+  {runtime: 'electron', target: '2.0.0', abi: '57', lts: false},
+  {runtime: 'electron', target: '3.0.0', abi: '64', lts: false},
+  {runtime: 'electron', target: '4.0.0', abi: '64', lts: false},
+  {runtime: 'electron', target: '4.0.4', abi: '69', lts: false}
+]
+
+supportedTargets.push.apply(supportedTargets, generatedTargets.supported)
+
+var additionalTargets = [
+  {runtime: 'node-webkit', target: '0.13.0', abi: '47', lts: false},
+  {runtime: 'node-webkit', target: '0.15.0', abi: '48', lts: false},
+  {runtime: 'node-webkit', target: '0.18.3', abi: '51', lts: false},
+  {runtime: 'node-webkit', target: '0.23.0', abi: '57', lts: false},
+  {runtime: 'node-webkit', target: '0.26.5', abi: '59', lts: false}
+]
+
+additionalTargets.push.apply(additionalTargets, generatedTargets.additional)
+
+var deprecatedTargets = [
+  {runtime: 'node', target: '0.2.0', abi: '1', lts: false},
+  {runtime: 'node', target: '0.9.1', abi: '0x000A', lts: false},
+  {runtime: 'node', target: '0.9.9', abi: '0x000B', lts: false},
+  {runtime: 'node', target: '0.10.4', abi: '11', lts: false},
+  {runtime: 'node', target: '0.11.0', abi: '0x000C', lts: false},
+  {runtime: 'node', target: '0.11.8', abi: '13', lts: false},
+  {runtime: 'node', target: '0.11.11', abi: '14', lts: false},
+  {runtime: 'node', target: '1.0.0', abi: '42', lts: false},
+  {runtime: 'node', target: '1.1.0', abi: '43', lts: false},
+  {runtime: 'node', target: '2.0.0', abi: '44', lts: false},
+  {runtime: 'node', target: '3.0.0', abi: '45', lts: false},
+  {runtime: 'node', target: '4.0.0', abi: '46', lts: false},
+  {runtime: 'electron', target: '0.30.0', abi: '44', lts: false},
+  {runtime: 'electron', target: '0.31.0', abi: '45', lts: false},
+  {runtime: 'electron', target: '0.33.0', abi: '46', lts: false}
+]
+
+var futureTargets = generatedTargets.future
+
+var allTargets = deprecatedTargets
+  .concat(supportedTargets)
+  .concat(additionalTargets)
+  .concat(futureTargets)
+
+exports.getAbi = getAbi
+exports.getTarget = getTarget
+exports.deprecatedTargets = deprecatedTargets
+exports.supportedTargets = supportedTargets
+exports.additionalTargets = additionalTargets
+exports.futureTargets = futureTargets
+exports.allTargets = allTargets
+exports._getNextTarget = getNextTarget
diff --git a/node_modules/node-abi/package.json b/node_modules/node-abi/package.json
new file mode 100644
index 0000000..ccb1a7d
--- /dev/null
+++ b/node_modules/node-abi/package.json
@@ -0,0 +1,65 @@
+{
+  "_from": "node-abi@^2.7.0",
+  "_id": "node-abi@2.19.3",
+  "_inBundle": false,
+  "_integrity": "sha512-9xZrlyfvKhWme2EXFKQhZRp1yNWT/uI1luYPr3sFl+H4keYY4xR+1jO7mvTTijIsHf1M+QDe9uWuKeEpLInIlg==",
+  "_location": "/node-abi",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "node-abi@^2.7.0",
+    "name": "node-abi",
+    "escapedName": "node-abi",
+    "rawSpec": "^2.7.0",
+    "saveSpec": null,
+    "fetchSpec": "^2.7.0"
+  },
+  "_requiredBy": [
+    "/prebuild-install"
+  ],
+  "_resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.3.tgz",
+  "_shasum": "252f5dcab12dad1b5503b2d27eddd4733930282d",
+  "_spec": "node-abi@^2.7.0",
+  "_where": "F:\\vent-display\\node_modules\\prebuild-install",
+  "author": {
+    "name": "Lukas Geiger"
+  },
+  "bugs": {
+    "url": "https://github.com/lgeiger/node-abi/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "semver": "^5.4.1"
+  },
+  "deprecated": false,
+  "description": "Get the Node ABI for a given target and runtime, and vice versa.",
+  "devDependencies": {
+    "got": "^10.6.0",
+    "semantic-release": "^15.8.0",
+    "tape": "^4.6.3",
+    "travis-deploy-once": "^5.0.1"
+  },
+  "homepage": "https://github.com/lgeiger/node-abi#readme",
+  "keywords": [
+    "node",
+    "electron",
+    "node_module_version",
+    "abi",
+    "v8"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "node-abi",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/lgeiger/node-abi.git"
+  },
+  "scripts": {
+    "semantic-release": "semantic-release",
+    "test": "tape test/index.js",
+    "travis-deploy-once": "travis-deploy-once",
+    "update-abi-registry": "node --unhandled-rejections=strict scripts/update-abi-registry.js"
+  },
+  "version": "2.19.3"
+}
diff --git a/node_modules/node-abi/scripts/update-abi-registry.js b/node_modules/node-abi/scripts/update-abi-registry.js
new file mode 100644
index 0000000..58e3a47
--- /dev/null
+++ b/node_modules/node-abi/scripts/update-abi-registry.js
@@ -0,0 +1,113 @@
+const got = require('got')
+const path = require('path')
+const semver = require('semver')
+const { writeFile } = require('fs').promises
+
+async function getJSONFromCDN (urlPath) {
+  const response = await got(`https://cdn.jsdelivr.net/gh/${urlPath}`)
+  return JSON.parse(response.body)
+}
+
+async function fetchElectronReleases () {
+  return (await getJSONFromCDN('electron/releases/lite.json'))
+}
+
+async function fetchNodeVersions () {
+  const schedule = await getJSONFromCDN('nodejs/Release/schedule.json')
+  const versions = {}
+
+  for (const [majorVersion, metadata] of Object.entries(schedule)) {
+    if (majorVersion.startsWith('v0')) {
+      continue
+    }
+    const version = `${majorVersion.slice(1)}.0.0`
+    const lts = metadata.hasOwnProperty('lts') ? [metadata.lts, metadata.maintenance] : false
+    versions[version] = {
+      runtime: 'node',
+      target: version,
+      lts: lts,
+      future: new Date(Date.parse(metadata.start)) > new Date()
+    }
+  }
+
+  return versions
+}
+
+async function fetchAbiVersions () {
+  return (await getJSONFromCDN('nodejs/node/doc/abi_version_registry.json'))
+    .NODE_MODULE_VERSION
+    .filter(({ modules }) => modules > 66)
+}
+
+function electronReleasesToTargets (releases) {
+  const versions = releases.map(({ version }) => version)
+  const versionsByModules = releases
+    .filter(release => release.deps && Number(release.deps.modules) >= 70)
+    .map(({ version, deps: { modules } }) => ({
+      version,
+      modules,
+    }))
+    .reduce(
+      (acc, { modules, version }) => ({
+        ...acc,
+        [modules]: version,
+      }),
+      {}
+    )
+
+    return Object.entries(versionsByModules)
+      .map(
+        ([modules, version]) => ({
+          abi: modules,
+          future: !versions.find(
+            v => {
+              const major = version.split(".")[0]
+              return semver.satisfies(
+                v,
+                /^[0-9]/.test(major) ? `>= ${major}` : major
+              )
+            }
+          ),
+          lts: false,
+          runtime: 'electron',
+          target: version
+        })
+      )
+}
+
+function nodeVersionsToTargets (abiVersions, nodeVersions) {
+  return Object.values(
+    abiVersions
+      .filter(({ runtime }) => runtime === 'node')
+      .reduce(
+        (acc, abiVersion) => {
+          const { version: nodeVersion } = semver.coerce(abiVersion.versions)
+
+          return {
+            [nodeVersion]: {
+              ...nodeVersions[nodeVersion],
+              abi: abiVersion.modules.toString(),
+            },
+            ...acc,
+          };
+        },
+        {}
+      )
+  )
+}
+
+async function main () {
+  const nodeVersions = await fetchNodeVersions()
+  const abiVersions = await fetchAbiVersions()
+  const electronReleases = await fetchElectronReleases()
+  const electronTargets = electronReleasesToTargets(electronReleases)
+  const nodeTargets = nodeVersionsToTargets(abiVersions, nodeVersions)
+  const supportedTargets = [
+    ...nodeTargets,
+    ...electronTargets,
+  ]
+
+  await writeFile(path.resolve(__dirname, '..', 'abi_registry.json'), JSON.stringify(supportedTargets, null, 2))
+}
+
+main()
diff --git a/node_modules/node-abi/test/index.js b/node_modules/node-abi/test/index.js
new file mode 100644
index 0000000..e14cd6f
--- /dev/null
+++ b/node_modules/node-abi/test/index.js
@@ -0,0 +1,174 @@
+var test = require('tape')
+var semver = require('semver')
+var getAbi = require('../index').getAbi
+var getTarget = require('../index').getTarget
+var getNextTarget = require('../index')._getNextTarget
+var allTargets = require('../index').allTargets
+
+test('getNextTarget gets the next unsupported target', function (t) {
+  var mockTargets = [
+    {runtime: 'node', target: '7.0.0', abi: '51', lts: false},
+    {runtime: 'node', target: '8.0.0', abi: '57', lts: false},
+    {runtime: 'electron', target: '0.36.0', abi: '47', lts: false},
+    {runtime: 'electron', target: '1.1.0', abi: '48', lts: false}
+  ]
+  t.equal(getNextTarget('node', mockTargets), '9.0.0')
+  t.equal(getNextTarget('electron', mockTargets), '1.2.0')
+  t.end()
+})
+
+test('getTarget calculates correct Node target', function (t) {
+  t.equal(getTarget(undefined), process.versions.node)
+  t.equal(getTarget(null), process.versions.node)
+  t.equal(getTarget('11'), '0.10.4')
+  t.equal(getTarget('14'), '0.11.11')
+  t.equal(getTarget('46'), '4.0.0')
+  t.equal(getTarget('47'), '5.0.0')
+  t.equal(getTarget('48'), '6.0.0')
+  t.equal(getTarget('51'), '7.0.0')
+  t.equal(getTarget('67'), '11.0.0')
+  t.equal(getTarget('72'), '12.0.0')
+  t.equal(getTarget('83'), '14.0.0')
+  t.equal(getTarget('88'), '15.0.0')
+  t.end()
+})
+
+test('getTarget calculates correct Electron target', function (t) {
+  t.throws(getTarget.bind(null, '14', 'electron'))
+  t.equal(getTarget('47', 'electron'), '0.36.0')
+  t.equal(getTarget('48', 'electron'), '1.1.0')
+  t.equal(getTarget('49', 'electron'), '1.3.0')
+  t.equal(getTarget('50', 'electron'), '1.4.0')
+  t.equal(getTarget('76', 'electron'), '8.0.0')
+  t.equal(getTarget('82', 'electron'), '10.0.0')
+  t.end()
+})
+
+test('getTarget calculates correct Node-Webkit target', function (t) {
+  t.throws(getTarget.bind(null, '14', 'ode-webkit'))
+  t.equal(getTarget('47', 'node-webkit'), '0.13.0')
+  t.equal(getTarget('48', 'node-webkit'), '0.15.0')
+  t.equal(getTarget('51', 'node-webkit'), '0.18.3')
+  t.equal(getTarget('57', 'node-webkit'), '0.23.0')
+  t.equal(getTarget('59', 'node-webkit'), '0.26.5')
+  t.end()
+})
+
+test('getAbi calculates correct Node ABI', function (t) {
+  t.equal(getAbi(undefined), process.versions.modules)
+  t.equal(getAbi(null), process.versions.modules)
+  t.throws(function () { getAbi('a.b.c') })
+  t.throws(function () { getAbi(getNextTarget('node')) })
+  t.equal(getAbi('15.0.0'), '88')
+  t.equal(getAbi('14.0.0'), '83')
+  t.equal(getAbi('13.0.0'), '79')
+  t.equal(getAbi('12.0.0'), '72')
+  t.equal(getAbi('11.0.0'), '67')
+  t.equal(getAbi('7.2.0'), '51')
+  t.equal(getAbi('7.0.0'), '51')
+  t.equal(getAbi('6.9.9'), '48')
+  t.equal(getAbi('6.0.0'), '48')
+  t.equal(getAbi('5.9.9'), '47')
+  t.equal(getAbi('5.0.0'), '47')
+  t.equal(getAbi('4.9.9'), '46')
+  t.equal(getAbi('4.0.0'), '46')
+  t.equal(getAbi('0.12.17'), '14')
+  t.equal(getAbi('0.12.0'), '14')
+  t.equal(getAbi('0.11.16'), '14')
+  t.equal(getAbi('0.11.11'), '14')
+  t.equal(getAbi('0.11.10'), '13')
+  t.equal(getAbi('0.11.8'), '13')
+  t.equal(getAbi('0.11.7'), '0x000C')
+  t.equal(getAbi('0.11.0'), '0x000C')
+  t.equal(getAbi('0.10.48'), '11')
+  t.equal(getAbi('0.10.30'), '11')
+  t.equal(getAbi('0.10.4'), '11')
+  t.equal(getAbi('0.10.3'), '0x000B')
+  t.equal(getAbi('0.10.1'), '0x000B')
+  t.equal(getAbi('0.10.0'), '0x000B')
+  t.equal(getAbi('0.9.12'), '0x000B')
+  t.equal(getAbi('0.9.9'), '0x000B')
+  t.equal(getAbi('0.9.8'), '0x000A')
+  t.equal(getAbi('0.9.1'), '0x000A')
+  t.equal(getAbi('0.9.0'), '1')
+  t.equal(getAbi('0.8.0'), '1')
+  t.equal(getAbi('0.2.0'), '1')
+  t.end()
+})
+
+test('getAbi calculates correct Electron ABI', function (t) {
+  t.throws(function () { getAbi(undefined, 'electron') })
+  t.throws(function () { getAbi(getNextTarget('electron'), 'electron') })
+  t.equal(getAbi('10.0.0-beta.1', 'electron'), '82')
+  t.equal(getAbi('10.0.0', 'electron'), '82')
+  t.equal(getAbi('9.0.0', 'electron'), '80')
+  t.equal(getAbi('8.0.0', 'electron'), '76')
+  t.equal(getAbi('7.0.0', 'electron'), '75')
+  t.equal(getAbi('6.0.0', 'electron'), '73')
+  t.equal(getAbi('5.0.0', 'electron'), '70')
+  t.equal(getAbi('4.1.4', 'electron'), '69')
+  t.equal(getAbi('4.0.4', 'electron'), '69')
+  t.equal(getAbi('4.0.3', 'electron'), '64')
+  t.equal(getAbi('3.1.8', 'electron'), '64')
+  t.equal(getAbi('2.0.18', 'electron'), '57')
+  t.equal(getAbi('1.4.0', 'electron'), '50')
+  t.equal(getAbi('1.3.0', 'electron'), '49')
+  t.equal(getAbi('1.2.0', 'electron'), '48')
+  t.equal(getAbi('1.1.0', 'electron'), '48')
+  t.equal(getAbi('1.0.0', 'electron'), '47')
+  t.equal(getAbi('0.37.0', 'electron'), '47')
+  t.equal(getAbi('0.36.0', 'electron'), '47')
+  t.equal(getAbi('0.35.0', 'electron'), '46')
+  t.equal(getAbi('0.34.0', 'electron'), '46')
+  t.equal(getAbi('0.33.0', 'electron'), '46')
+  t.equal(getAbi('0.32.0', 'electron'), '45')
+  t.equal(getAbi('0.31.0', 'electron'), '45')
+  t.equal(getAbi('0.30.0', 'electron'), '44')
+  t.end()
+})
+
+test('getAbi calculates correct Node-Webkit ABI', function (t) {
+  t.throws(function () { getAbi(undefined, 'node-webkit') })
+  t.throws(function () { getAbi(getNextTarget('node-webkit'), 'node-webkit') })
+  t.equal(getAbi('0.13.0', 'node-webkit'), '47')
+  t.equal(getAbi('0.14.0', 'node-webkit'), '47')
+  t.equal(getAbi('0.15.0', 'node-webkit'), '48')
+  t.equal(getAbi('0.16.0', 'node-webkit'), '48')
+  t.equal(getAbi('0.17.0', 'node-webkit'), '48')
+  t.equal(getAbi('0.18.2', 'node-webkit'), '48')
+  t.equal(getAbi('0.18.3', 'node-webkit'), '51')
+  t.equal(getAbi('0.19.0', 'node-webkit'), '51')
+  t.equal(getAbi('0.20.0', 'node-webkit'), '51')
+  t.equal(getAbi('0.21.0', 'node-webkit'), '51')
+  t.equal(getAbi('0.22.0', 'node-webkit'), '51')
+  t.equal(getAbi('0.23.0', 'node-webkit'), '57')
+  t.equal(getAbi('0.24.0', 'node-webkit'), '57')
+  t.equal(getAbi('0.25.0', 'node-webkit'), '57')
+  t.equal(getAbi('0.26.4', 'node-webkit'), '57')
+  t.equal(getAbi('0.26.5', 'node-webkit'), '59')
+  t.end()
+})
+
+test('getAbi supports leading v', function (t) {
+  t.equal(getAbi('v7.2.0'), '51')
+  t.end()
+})
+
+test('getAbi returns abi if passed as target', function (t) {
+  t.equal(getAbi('57'), '57')
+  t.end()
+})
+
+test('allTargets are sorted', function (t) {
+  var electron = allTargets.filter(function (t) { return t.runtime === 'electron' })
+  var node = allTargets.filter(function (t) { return t.runtime === 'node' })
+  var nodeWebkit = allTargets.filter(function (t) { return t.runtime === 'node-webkit' })
+  function sort (t1, t2) {
+    return semver.compare(t1.target, t2.target)
+  }
+
+  t.deepEqual(electron, electron.slice().sort(sort), 'electron targets are sorted')
+  t.deepEqual(node, node.slice().sort(sort), 'node targets are sorted')
+  t.deepEqual(nodeWebkit, nodeWebkit.slice().sort(sort), 'node-webkit targets are sorted')
+  t.end()
+})
diff --git a/node_modules/noop-logger/.npmignore b/node_modules/noop-logger/.npmignore
new file mode 100644
index 0000000..b512c09
--- /dev/null
+++ b/node_modules/noop-logger/.npmignore
@@ -0,0 +1 @@
+node_modules
\ No newline at end of file
diff --git a/node_modules/noop-logger/History.md b/node_modules/noop-logger/History.md
new file mode 100644
index 0000000..5eaa2d6
--- /dev/null
+++ b/node_modules/noop-logger/History.md
@@ -0,0 +1,16 @@
+
+0.1.1 / 2016-02-16
+==================
+
+  * add logger.verbose
+
+0.1.0 / 2014-04-04
+==================
+
+ * add ci
+ * add critical, alert and emergency
+ * docs
+
+0.0.1 - February 27, 2013
+-------------------------
+:sparkles:
diff --git a/node_modules/noop-logger/Makefile b/node_modules/noop-logger/Makefile
new file mode 100644
index 0000000..e367278
--- /dev/null
+++ b/node_modules/noop-logger/Makefile
@@ -0,0 +1,8 @@
+
+node_modules: package.json
+	@npm install
+
+test: node_modules
+	@./node_modules/.bin/mocha --reporter spec
+
+.PHONY: test
\ No newline at end of file
diff --git a/node_modules/noop-logger/Readme.md b/node_modules/noop-logger/Readme.md
new file mode 100644
index 0000000..ae6b4c7
--- /dev/null
+++ b/node_modules/noop-logger/Readme.md
@@ -0,0 +1,27 @@
+[![Build Status](https://circleci.com/gh/segmentio/noop-logger.png?circle-token=3281390270513cae0e50fd18b8d972eb48a56879)](https://circleci.com/gh/segmentio/noop-logger)
+
+# noop-logger
+
+  A logger that does exactly nothing, useful when you want to test modules that require a logger to be passed in.
+
+## Installation
+
+    $ npm install noop-logger
+
+## API
+
+  Exposes the following noops:
+
+  - `logger.debug`
+  - `logger.info`
+  - `logger.warn`
+  - `logger.error`
+  - `logger.critical`
+  - `logger.alert`
+  - `logger.emergency`
+  - `logger.notice`
+  - `logger.fatal`
+
+## License
+
+  MIT
diff --git a/node_modules/noop-logger/circle.yml b/node_modules/noop-logger/circle.yml
new file mode 100644
index 0000000..82c53e9
--- /dev/null
+++ b/node_modules/noop-logger/circle.yml
@@ -0,0 +1,9 @@
+machine:
+  node:
+    version: 0.10.26
+checkout:
+  post:
+    - echo "_auth = `printf $AUTH`" > npmrc
+dependencies:
+  override:
+    - npm install --userconfig npmrc --registry https://segmentio.registry.nodejitsu.com --no-strict-ssl --always-auth
diff --git a/node_modules/noop-logger/lib/index.js b/node_modules/noop-logger/lib/index.js
new file mode 100644
index 0000000..9028eca
--- /dev/null
+++ b/node_modules/noop-logger/lib/index.js
@@ -0,0 +1,25 @@
+
+/**
+ * Methods.
+ */
+
+var methods = [
+  'debug',
+  'info',
+  'warn',
+  'error',
+  'critical',
+  'alert',
+  'emergency',
+  'notice',
+  'verbose',
+  'fatal'
+];
+
+/**
+ * Expose methods.
+ */
+
+methods.forEach(function(method){
+  exports[method] = function(){};
+});
diff --git a/node_modules/noop-logger/package.json b/node_modules/noop-logger/package.json
new file mode 100644
index 0000000..56ca832
--- /dev/null
+++ b/node_modules/noop-logger/package.json
@@ -0,0 +1,47 @@
+{
+  "_from": "noop-logger@^0.1.1",
+  "_id": "noop-logger@0.1.1",
+  "_inBundle": false,
+  "_integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=",
+  "_location": "/noop-logger",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "noop-logger@^0.1.1",
+    "name": "noop-logger",
+    "escapedName": "noop-logger",
+    "rawSpec": "^0.1.1",
+    "saveSpec": null,
+    "fetchSpec": "^0.1.1"
+  },
+  "_requiredBy": [
+    "/prebuild-install"
+  ],
+  "_resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz",
+  "_shasum": "94a2b1633c4f1317553007d8966fd0e841b6a4c2",
+  "_spec": "noop-logger@^0.1.1",
+  "_where": "F:\\vent-display\\node_modules\\prebuild-install",
+  "bugs": {
+    "url": "https://github.com/segmentio/noop-logger/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {},
+  "deprecated": false,
+  "description": "A logger that does exactly nothing.",
+  "devDependencies": {
+    "mocha": "1.x"
+  },
+  "homepage": "https://github.com/segmentio/noop-logger#readme",
+  "license": "MIT",
+  "main": "lib/index.js",
+  "name": "noop-logger",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/segmentio/noop-logger.git"
+  },
+  "scripts": {
+    "test": "mocha"
+  },
+  "version": "0.1.1"
+}
diff --git a/node_modules/noop-logger/test/index.js b/node_modules/noop-logger/test/index.js
new file mode 100644
index 0000000..e9eac5b
--- /dev/null
+++ b/node_modules/noop-logger/test/index.js
@@ -0,0 +1,18 @@
+
+var assert = require('assert');
+var logger = require('..');
+
+describe('noop-logger', function(){
+  it('should expose methods', function(){
+    assert.equal('function', typeof logger.debug);
+    assert.equal('function', typeof logger.info);
+    assert.equal('function', typeof logger.warn);
+    assert.equal('function', typeof logger.error);
+    assert.equal('function', typeof logger.critical);
+    assert.equal('function', typeof logger.alert);
+    assert.equal('function', typeof logger.emergency);
+    assert.equal('function', typeof logger.notice);
+    assert.equal('function', typeof logger.verbose);
+    assert.equal('function', typeof logger.fatal);
+  });
+});
diff --git a/node_modules/npmlog/CHANGELOG.md b/node_modules/npmlog/CHANGELOG.md
new file mode 100644
index 0000000..51e4abc
--- /dev/null
+++ b/node_modules/npmlog/CHANGELOG.md
@@ -0,0 +1,49 @@
+### v4.0.2
+
+* Added installation instructions.
+
+### v4.0.1
+
+* Fix bugs where `log.progressEnabled` got out of sync with how `gauge` kept
+  track of these things resulting in a progressbar that couldn't be disabled.
+
+### v4.0.0
+
+* Allow creating log levels that are an empty string or 0.
+
+### v3.1.2
+
+* Update to `gauge@1.6.0` adding support for default values for template
+  items.
+
+### v3.1.1
+
+* Update to `gauge@1.5.3` to fix to `1.x` compatibility when it comes to
+  when a progress bar is enabled.  In `1.x` if you didn't have a TTY the
+  progress bar was never shown.  In `2.x` it merely defaults to disabled,
+  but you can enable it explicitly if you still want progress updates.
+
+### v3.1.0
+
+* Update to `gauge@2.5.2`:
+  * Updates the `signal-exit` dependency which fixes an incompatibility with
+    the node profiler.
+  * Uses externalizes its ansi code generation in `console-control-strings`
+* Make the default progress bar include the last line printed, colored as it
+  would be when printing to a tty.
+
+### v3.0.0
+
+* Switch to `gauge@2.0.0`, for better performance, better look.
+* Set stderr/stdout blocking if they're tty's, so that we can hide a
+  progress bar going to stderr and then safely print to stdout.  Without
+  this the two can end up overlapping producing confusing and sometimes
+  corrupted output.
+
+### v2.0.0
+
+* Make the `error` event non-fatal so that folks can use it as a prefix.
+
+### v1.0.0
+
+* Add progress bar with `gauge@1.1.0`
diff --git a/node_modules/npmlog/LICENSE b/node_modules/npmlog/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/npmlog/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/npmlog/README.md b/node_modules/npmlog/README.md
new file mode 100644
index 0000000..268a4af
--- /dev/null
+++ b/node_modules/npmlog/README.md
@@ -0,0 +1,216 @@
+# npmlog
+
+The logger util that npm uses.
+
+This logger is very basic.  It does the logging for npm.  It supports
+custom levels and colored output.
+
+By default, logs are written to stderr.  If you want to send log messages
+to outputs other than streams, then you can change the `log.stream`
+member, or you can just listen to the events that it emits, and do
+whatever you want with them.
+
+# Installation
+
+```console
+npm install npmlog --save
+```
+
+# Basic Usage
+
+```javascript
+var log = require('npmlog')
+
+// additional stuff ---------------------------+
+// message ----------+                         |
+// prefix ----+      |                         |
+// level -+   |      |                         |
+//        v   v      v                         v
+    log.info('fyi', 'I have a kitty cat: %j', myKittyCat)
+```
+
+## log.level
+
+* {String}
+
+The level to display logs at.  Any logs at or above this level will be
+displayed.  The special level `silent` will prevent anything from being
+displayed ever.
+
+## log.record
+
+* {Array}
+
+An array of all the log messages that have been entered.
+
+## log.maxRecordSize
+
+* {Number}
+
+The maximum number of records to keep.  If log.record gets bigger than
+10% over this value, then it is sliced down to 90% of this value.
+
+The reason for the 10% window is so that it doesn't have to resize a
+large array on every log entry.
+
+## log.prefixStyle
+
+* {Object}
+
+A style object that specifies how prefixes are styled.  (See below)
+
+## log.headingStyle
+
+* {Object}
+
+A style object that specifies how the heading is styled.  (See below)
+
+## log.heading
+
+* {String} Default: ""
+
+If set, a heading that is printed at the start of every line.
+
+## log.stream
+
+* {Stream} Default: `process.stderr`
+
+The stream where output is written.
+
+## log.enableColor()
+
+Force colors to be used on all messages, regardless of the output
+stream.
+
+## log.disableColor()
+
+Disable colors on all messages.
+
+## log.enableProgress()
+
+Enable the display of log activity spinner and progress bar
+
+## log.disableProgress()
+
+Disable the display of a progress bar
+
+## log.enableUnicode()
+
+Force the unicode theme to be used for the progress bar.
+
+## log.disableUnicode()
+
+Disable the use of unicode in the progress bar.
+
+## log.setGaugeTemplate(template)
+
+Set a template for outputting the progress bar. See the [gauge documentation] for details.
+
+[gauge documentation]: https://npmjs.com/package/gauge
+
+## log.setGaugeThemeset(themes)
+
+Select a themeset to pick themes from for the progress bar. See the [gauge documentation] for details.
+
+## log.pause()
+
+Stop emitting messages to the stream, but do not drop them.
+
+## log.resume()
+
+Emit all buffered messages that were written while paused.
+
+## log.log(level, prefix, message, ...)
+
+* `level` {String} The level to emit the message at
+* `prefix` {String} A string prefix.  Set to "" to skip.
+* `message...` Arguments to `util.format`
+
+Emit a log message at the specified level.
+
+## log\[level](prefix, message, ...)
+
+For example,
+
+* log.silly(prefix, message, ...)
+* log.verbose(prefix, message, ...)
+* log.info(prefix, message, ...)
+* log.http(prefix, message, ...)
+* log.warn(prefix, message, ...)
+* log.error(prefix, message, ...)
+
+Like `log.log(level, prefix, message, ...)`.  In this way, each level is
+given a shorthand, so you can do `log.info(prefix, message)`.
+
+## log.addLevel(level, n, style, disp)
+
+* `level` {String} Level indicator
+* `n` {Number} The numeric level
+* `style` {Object} Object with fg, bg, inverse, etc.
+* `disp` {String} Optional replacement for `level` in the output.
+
+Sets up a new level with a shorthand function and so forth.
+
+Note that if the number is `Infinity`, then setting the level to that
+will cause all log messages to be suppressed.  If the number is
+`-Infinity`, then the only way to show it is to enable all log messages.
+
+## log.newItem(name, todo, weight)
+
+* `name` {String} Optional; progress item name.
+* `todo` {Number} Optional; total amount of work to be done. Default 0.
+* `weight` {Number} Optional; the weight of this item relative to others. Default 1.
+
+This adds a new `are-we-there-yet` item tracker to the progress tracker. The
+object returned has the `log[level]` methods but is otherwise an
+`are-we-there-yet` `Tracker` object.
+
+## log.newStream(name, todo, weight)
+
+This adds a new `are-we-there-yet` stream tracker to the progress tracker. The
+object returned has the `log[level]` methods but is otherwise an
+`are-we-there-yet` `TrackerStream` object.
+
+## log.newGroup(name, weight)
+
+This adds a new `are-we-there-yet` tracker group to the progress tracker. The
+object returned has the `log[level]` methods but is otherwise an
+`are-we-there-yet` `TrackerGroup` object.
+
+# Events
+
+Events are all emitted with the message object.
+
+* `log` Emitted for all messages
+* `log.<level>` Emitted for all messages with the `<level>` level.
+* `<prefix>` Messages with prefixes also emit their prefix as an event.
+
+# Style Objects
+
+Style objects can have the following fields:
+
+* `fg` {String} Color for the foreground text
+* `bg` {String} Color for the background
+* `bold`, `inverse`, `underline` {Boolean} Set the associated property
+* `bell` {Boolean} Make a noise (This is pretty annoying, probably.)
+
+# Message Objects
+
+Every log event is emitted with a message object, and the `log.record`
+list contains all of them that have been created.  They have the
+following fields:
+
+* `id` {Number}
+* `level` {String}
+* `prefix` {String}
+* `message` {String} Result of `util.format()`
+* `messageRaw` {Array} Arguments to `util.format()`
+
+# Blocking TTYs
+
+We use [`set-blocking`](https://npmjs.com/package/set-blocking) to set
+stderr and stdout blocking if they are tty's and have the setBlocking call.
+This is a work around for an issue in early versions of Node.js 6.x, which
+made stderr and stdout non-blocking on OSX. (They are always blocking
+Windows and were never blocking on Linux.) `npmlog` needs them to be blocking
+so that it can allow output to stdout and stderr to be interlaced.
diff --git a/node_modules/npmlog/log.js b/node_modules/npmlog/log.js
new file mode 100644
index 0000000..341f331
--- /dev/null
+++ b/node_modules/npmlog/log.js
@@ -0,0 +1,309 @@
+'use strict'
+var Progress = require('are-we-there-yet')
+var Gauge = require('gauge')
+var EE = require('events').EventEmitter
+var log = exports = module.exports = new EE()
+var util = require('util')
+
+var setBlocking = require('set-blocking')
+var consoleControl = require('console-control-strings')
+
+setBlocking(true)
+var stream = process.stderr
+Object.defineProperty(log, 'stream', {
+  set: function (newStream) {
+    stream = newStream
+    if (this.gauge) this.gauge.setWriteTo(stream, stream)
+  },
+  get: function () {
+    return stream
+  }
+})
+
+// by default, decide based on tty-ness.
+var colorEnabled
+log.useColor = function () {
+  return colorEnabled != null ? colorEnabled : stream.isTTY
+}
+
+log.enableColor = function () {
+  colorEnabled = true
+  this.gauge.setTheme({hasColor: colorEnabled, hasUnicode: unicodeEnabled})
+}
+log.disableColor = function () {
+  colorEnabled = false
+  this.gauge.setTheme({hasColor: colorEnabled, hasUnicode: unicodeEnabled})
+}
+
+// default level
+log.level = 'info'
+
+log.gauge = new Gauge(stream, {
+  enabled: false, // no progress bars unless asked
+  theme: {hasColor: log.useColor()},
+  template: [
+    {type: 'progressbar', length: 20},
+    {type: 'activityIndicator', kerning: 1, length: 1},
+    {type: 'section', default: ''},
+    ':',
+    {type: 'logline', kerning: 1, default: ''}
+  ]
+})
+
+log.tracker = new Progress.TrackerGroup()
+
+// we track this separately as we may need to temporarily disable the
+// display of the status bar for our own loggy purposes.
+log.progressEnabled = log.gauge.isEnabled()
+
+var unicodeEnabled
+
+log.enableUnicode = function () {
+  unicodeEnabled = true
+  this.gauge.setTheme({hasColor: this.useColor(), hasUnicode: unicodeEnabled})
+}
+
+log.disableUnicode = function () {
+  unicodeEnabled = false
+  this.gauge.setTheme({hasColor: this.useColor(), hasUnicode: unicodeEnabled})
+}
+
+log.setGaugeThemeset = function (themes) {
+  this.gauge.setThemeset(themes)
+}
+
+log.setGaugeTemplate = function (template) {
+  this.gauge.setTemplate(template)
+}
+
+log.enableProgress = function () {
+  if (this.progressEnabled) return
+  this.progressEnabled = true
+  this.tracker.on('change', this.showProgress)
+  if (this._pause) return
+  this.gauge.enable()
+}
+
+log.disableProgress = function () {
+  if (!this.progressEnabled) return
+  this.progressEnabled = false
+  this.tracker.removeListener('change', this.showProgress)
+  this.gauge.disable()
+}
+
+var trackerConstructors = ['newGroup', 'newItem', 'newStream']
+
+var mixinLog = function (tracker) {
+  // mixin the public methods from log into the tracker
+  // (except: conflicts and one's we handle specially)
+  Object.keys(log).forEach(function (P) {
+    if (P[0] === '_') return
+    if (trackerConstructors.filter(function (C) { return C === P }).length) return
+    if (tracker[P]) return
+    if (typeof log[P] !== 'function') return
+    var func = log[P]
+    tracker[P] = function () {
+      return func.apply(log, arguments)
+    }
+  })
+  // if the new tracker is a group, make sure any subtrackers get
+  // mixed in too
+  if (tracker instanceof Progress.TrackerGroup) {
+    trackerConstructors.forEach(function (C) {
+      var func = tracker[C]
+      tracker[C] = function () { return mixinLog(func.apply(tracker, arguments)) }
+    })
+  }
+  return tracker
+}
+
+// Add tracker constructors to the top level log object
+trackerConstructors.forEach(function (C) {
+  log[C] = function () { return mixinLog(this.tracker[C].apply(this.tracker, arguments)) }
+})
+
+log.clearProgress = function (cb) {
+  if (!this.progressEnabled) return cb && process.nextTick(cb)
+  this.gauge.hide(cb)
+}
+
+log.showProgress = function (name, completed) {
+  if (!this.progressEnabled) return
+  var values = {}
+  if (name) values.section = name
+  var last = log.record[log.record.length - 1]
+  if (last) {
+    values.subsection = last.prefix
+    var disp = log.disp[last.level] || last.level
+    var logline = this._format(disp, log.style[last.level])
+    if (last.prefix) logline += ' ' + this._format(last.prefix, this.prefixStyle)
+    logline += ' ' + last.message.split(/\r?\n/)[0]
+    values.logline = logline
+  }
+  values.completed = completed || this.tracker.completed()
+  this.gauge.show(values)
+}.bind(log) // bind for use in tracker's on-change listener
+
+// temporarily stop emitting, but don't drop
+log.pause = function () {
+  this._paused = true
+  if (this.progressEnabled) this.gauge.disable()
+}
+
+log.resume = function () {
+  if (!this._paused) return
+  this._paused = false
+
+  var b = this._buffer
+  this._buffer = []
+  b.forEach(function (m) {
+    this.emitLog(m)
+  }, this)
+  if (this.progressEnabled) this.gauge.enable()
+}
+
+log._buffer = []
+
+var id = 0
+log.record = []
+log.maxRecordSize = 10000
+log.log = function (lvl, prefix, message) {
+  var l = this.levels[lvl]
+  if (l === undefined) {
+    return this.emit('error', new Error(util.format(
+      'Undefined log level: %j', lvl)))
+  }
+
+  var a = new Array(arguments.length - 2)
+  var stack = null
+  for (var i = 2; i < arguments.length; i++) {
+    var arg = a[i - 2] = arguments[i]
+
+    // resolve stack traces to a plain string.
+    if (typeof arg === 'object' && arg &&
+        (arg instanceof Error) && arg.stack) {
+
+      Object.defineProperty(arg, 'stack', {
+        value: stack = arg.stack + '',
+        enumerable: true,
+        writable: true
+      })
+    }
+  }
+  if (stack) a.unshift(stack + '\n')
+  message = util.format.apply(util, a)
+
+  var m = { id: id++,
+            level: lvl,
+            prefix: String(prefix || ''),
+            message: message,
+            messageRaw: a }
+
+  this.emit('log', m)
+  this.emit('log.' + lvl, m)
+  if (m.prefix) this.emit(m.prefix, m)
+
+  this.record.push(m)
+  var mrs = this.maxRecordSize
+  var n = this.record.length - mrs
+  if (n > mrs / 10) {
+    var newSize = Math.floor(mrs * 0.9)
+    this.record = this.record.slice(-1 * newSize)
+  }
+
+  this.emitLog(m)
+}.bind(log)
+
+log.emitLog = function (m) {
+  if (this._paused) {
+    this._buffer.push(m)
+    return
+  }
+  if (this.progressEnabled) this.gauge.pulse(m.prefix)
+  var l = this.levels[m.level]
+  if (l === undefined) return
+  if (l < this.levels[this.level]) return
+  if (l > 0 && !isFinite(l)) return
+
+  // If 'disp' is null or undefined, use the lvl as a default
+  // Allows: '', 0 as valid disp
+  var disp = log.disp[m.level] != null ? log.disp[m.level] : m.level
+  this.clearProgress()
+  m.message.split(/\r?\n/).forEach(function (line) {
+    if (this.heading) {
+      this.write(this.heading, this.headingStyle)
+      this.write(' ')
+    }
+    this.write(disp, log.style[m.level])
+    var p = m.prefix || ''
+    if (p) this.write(' ')
+    this.write(p, this.prefixStyle)
+    this.write(' ' + line + '\n')
+  }, this)
+  this.showProgress()
+}
+
+log._format = function (msg, style) {
+  if (!stream) return
+
+  var output = ''
+  if (this.useColor()) {
+    style = style || {}
+    var settings = []
+    if (style.fg) settings.push(style.fg)
+    if (style.bg) settings.push('bg' + style.bg[0].toUpperCase() + style.bg.slice(1))
+    if (style.bold) settings.push('bold')
+    if (style.underline) settings.push('underline')
+    if (style.inverse) settings.push('inverse')
+    if (settings.length) output += consoleControl.color(settings)
+    if (style.beep) output += consoleControl.beep()
+  }
+  output += msg
+  if (this.useColor()) {
+    output += consoleControl.color('reset')
+  }
+  return output
+}
+
+log.write = function (msg, style) {
+  if (!stream) return
+
+  stream.write(this._format(msg, style))
+}
+
+log.addLevel = function (lvl, n, style, disp) {
+  // If 'disp' is null or undefined, use the lvl as a default
+  if (disp == null) disp = lvl
+  this.levels[lvl] = n
+  this.style[lvl] = style
+  if (!this[lvl]) {
+    this[lvl] = function () {
+      var a = new Array(arguments.length + 1)
+      a[0] = lvl
+      for (var i = 0; i < arguments.length; i++) {
+        a[i + 1] = arguments[i]
+      }
+      return this.log.apply(this, a)
+    }.bind(this)
+  }
+  this.disp[lvl] = disp
+}
+
+log.prefixStyle = { fg: 'magenta' }
+log.headingStyle = { fg: 'white', bg: 'black' }
+
+log.style = {}
+log.levels = {}
+log.disp = {}
+log.addLevel('silly', -Infinity, { inverse: true }, 'sill')
+log.addLevel('verbose', 1000, { fg: 'blue', bg: 'black' }, 'verb')
+log.addLevel('info', 2000, { fg: 'green' })
+log.addLevel('timing', 2500, { fg: 'green', bg: 'black' })
+log.addLevel('http', 3000, { fg: 'green', bg: 'black' })
+log.addLevel('notice', 3500, { fg: 'blue', bg: 'black' })
+log.addLevel('warn', 4000, { fg: 'black', bg: 'yellow' }, 'WARN')
+log.addLevel('error', 5000, { fg: 'red', bg: 'black' }, 'ERR!')
+log.addLevel('silent', Infinity)
+
+// allow 'error' prefix
+log.on('error', function () {})
diff --git a/node_modules/npmlog/package.json b/node_modules/npmlog/package.json
new file mode 100644
index 0000000..ec81f72
--- /dev/null
+++ b/node_modules/npmlog/package.json
@@ -0,0 +1,61 @@
+{
+  "_from": "npmlog@^4.0.1",
+  "_id": "npmlog@4.1.2",
+  "_inBundle": false,
+  "_integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+  "_location": "/npmlog",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "npmlog@^4.0.1",
+    "name": "npmlog",
+    "escapedName": "npmlog",
+    "rawSpec": "^4.0.1",
+    "saveSpec": null,
+    "fetchSpec": "^4.0.1"
+  },
+  "_requiredBy": [
+    "/prebuild-install"
+  ],
+  "_resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+  "_shasum": "08a7f2a8bf734604779a9efa4ad5cc717abb954b",
+  "_spec": "npmlog@^4.0.1",
+  "_where": "F:\\vent-display\\node_modules\\prebuild-install",
+  "author": {
+    "name": "Isaac Z. Schlueter",
+    "email": "i@izs.me",
+    "url": "http://blog.izs.me/"
+  },
+  "bugs": {
+    "url": "https://github.com/npm/npmlog/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "are-we-there-yet": "~1.1.2",
+    "console-control-strings": "~1.1.0",
+    "gauge": "~2.7.3",
+    "set-blocking": "~2.0.0"
+  },
+  "deprecated": false,
+  "description": "logger for npm",
+  "devDependencies": {
+    "standard": "~7.1.2",
+    "tap": "~5.7.3"
+  },
+  "files": [
+    "log.js"
+  ],
+  "homepage": "https://github.com/npm/npmlog#readme",
+  "license": "ISC",
+  "main": "log.js",
+  "name": "npmlog",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/npm/npmlog.git"
+  },
+  "scripts": {
+    "test": "standard && tap test/*.js"
+  },
+  "version": "4.1.2"
+}
diff --git a/node_modules/number-is-nan/index.js b/node_modules/number-is-nan/index.js
new file mode 100644
index 0000000..79be4b9
--- /dev/null
+++ b/node_modules/number-is-nan/index.js
@@ -0,0 +1,4 @@
+'use strict';
+module.exports = Number.isNaN || function (x) {
+	return x !== x;
+};
diff --git a/node_modules/number-is-nan/license b/node_modules/number-is-nan/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/number-is-nan/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/number-is-nan/package.json b/node_modules/number-is-nan/package.json
new file mode 100644
index 0000000..2ba1bd1
--- /dev/null
+++ b/node_modules/number-is-nan/package.json
@@ -0,0 +1,67 @@
+{
+  "_from": "number-is-nan@^1.0.0",
+  "_id": "number-is-nan@1.0.1",
+  "_inBundle": false,
+  "_integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+  "_location": "/number-is-nan",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "number-is-nan@^1.0.0",
+    "name": "number-is-nan",
+    "escapedName": "number-is-nan",
+    "rawSpec": "^1.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.0"
+  },
+  "_requiredBy": [
+    "/is-fullwidth-code-point"
+  ],
+  "_resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+  "_shasum": "097b602b53422a522c1afb8790318336941a011d",
+  "_spec": "number-is-nan@^1.0.0",
+  "_where": "F:\\vent-display\\node_modules\\is-fullwidth-code-point",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "bugs": {
+    "url": "https://github.com/sindresorhus/number-is-nan/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "ES2015 Number.isNaN() ponyfill",
+  "devDependencies": {
+    "ava": "*"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/sindresorhus/number-is-nan#readme",
+  "keywords": [
+    "es2015",
+    "ecmascript",
+    "ponyfill",
+    "polyfill",
+    "shim",
+    "number",
+    "is",
+    "nan",
+    "not"
+  ],
+  "license": "MIT",
+  "name": "number-is-nan",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/sindresorhus/number-is-nan.git"
+  },
+  "scripts": {
+    "test": "ava"
+  },
+  "version": "1.0.1"
+}
diff --git a/node_modules/number-is-nan/readme.md b/node_modules/number-is-nan/readme.md
new file mode 100644
index 0000000..2463508
--- /dev/null
+++ b/node_modules/number-is-nan/readme.md
@@ -0,0 +1,28 @@
+# number-is-nan [![Build Status](https://travis-ci.org/sindresorhus/number-is-nan.svg?branch=master)](https://travis-ci.org/sindresorhus/number-is-nan)
+
+> ES2015 [`Number.isNaN()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN) [ponyfill](https://ponyfill.com)
+
+
+## Install
+
+```
+$ npm install --save number-is-nan
+```
+
+
+## Usage
+
+```js
+var numberIsNan = require('number-is-nan');
+
+numberIsNan(NaN);
+//=> true
+
+numberIsNan('unicorn');
+//=> false
+```
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/object-assign/index.js b/node_modules/object-assign/index.js
new file mode 100644
index 0000000..0930cf8
--- /dev/null
+++ b/node_modules/object-assign/index.js
@@ -0,0 +1,90 @@
+/*
+object-assign
+(c) Sindre Sorhus
+@license MIT
+*/
+
+'use strict';
+/* eslint-disable no-unused-vars */
+var getOwnPropertySymbols = Object.getOwnPropertySymbols;
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+var propIsEnumerable = Object.prototype.propertyIsEnumerable;
+
+function toObject(val) {
+	if (val === null || val === undefined) {
+		throw new TypeError('Object.assign cannot be called with null or undefined');
+	}
+
+	return Object(val);
+}
+
+function shouldUseNative() {
+	try {
+		if (!Object.assign) {
+			return false;
+		}
+
+		// Detect buggy property enumeration order in older V8 versions.
+
+		// https://bugs.chromium.org/p/v8/issues/detail?id=4118
+		var test1 = new String('abc');  // eslint-disable-line no-new-wrappers
+		test1[5] = 'de';
+		if (Object.getOwnPropertyNames(test1)[0] === '5') {
+			return false;
+		}
+
+		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
+		var test2 = {};
+		for (var i = 0; i < 10; i++) {
+			test2['_' + String.fromCharCode(i)] = i;
+		}
+		var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
+			return test2[n];
+		});
+		if (order2.join('') !== '0123456789') {
+			return false;
+		}
+
+		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
+		var test3 = {};
+		'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
+			test3[letter] = letter;
+		});
+		if (Object.keys(Object.assign({}, test3)).join('') !==
+				'abcdefghijklmnopqrst') {
+			return false;
+		}
+
+		return true;
+	} catch (err) {
+		// We don't expect any of the above to throw, but better to be safe.
+		return false;
+	}
+}
+
+module.exports = shouldUseNative() ? Object.assign : function (target, source) {
+	var from;
+	var to = toObject(target);
+	var symbols;
+
+	for (var s = 1; s < arguments.length; s++) {
+		from = Object(arguments[s]);
+
+		for (var key in from) {
+			if (hasOwnProperty.call(from, key)) {
+				to[key] = from[key];
+			}
+		}
+
+		if (getOwnPropertySymbols) {
+			symbols = getOwnPropertySymbols(from);
+			for (var i = 0; i < symbols.length; i++) {
+				if (propIsEnumerable.call(from, symbols[i])) {
+					to[symbols[i]] = from[symbols[i]];
+				}
+			}
+		}
+	}
+
+	return to;
+};
diff --git a/node_modules/object-assign/license b/node_modules/object-assign/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/object-assign/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/object-assign/package.json b/node_modules/object-assign/package.json
new file mode 100644
index 0000000..294368d
--- /dev/null
+++ b/node_modules/object-assign/package.json
@@ -0,0 +1,74 @@
+{
+  "_from": "object-assign@^4.1.0",
+  "_id": "object-assign@4.1.1",
+  "_inBundle": false,
+  "_integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+  "_location": "/object-assign",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "object-assign@^4.1.0",
+    "name": "object-assign",
+    "escapedName": "object-assign",
+    "rawSpec": "^4.1.0",
+    "saveSpec": null,
+    "fetchSpec": "^4.1.0"
+  },
+  "_requiredBy": [
+    "/gauge"
+  ],
+  "_resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+  "_shasum": "2109adc7965887cfc05cbbd442cac8bfbb360863",
+  "_spec": "object-assign@^4.1.0",
+  "_where": "F:\\vent-display\\node_modules\\gauge",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "bugs": {
+    "url": "https://github.com/sindresorhus/object-assign/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "ES2015 `Object.assign()` ponyfill",
+  "devDependencies": {
+    "ava": "^0.16.0",
+    "lodash": "^4.16.4",
+    "matcha": "^0.7.0",
+    "xo": "^0.16.0"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/sindresorhus/object-assign#readme",
+  "keywords": [
+    "object",
+    "assign",
+    "extend",
+    "properties",
+    "es2015",
+    "ecmascript",
+    "harmony",
+    "ponyfill",
+    "prollyfill",
+    "polyfill",
+    "shim",
+    "browser"
+  ],
+  "license": "MIT",
+  "name": "object-assign",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/sindresorhus/object-assign.git"
+  },
+  "scripts": {
+    "bench": "matcha bench.js",
+    "test": "xo && ava"
+  },
+  "version": "4.1.1"
+}
diff --git a/node_modules/object-assign/readme.md b/node_modules/object-assign/readme.md
new file mode 100644
index 0000000..1be09d3
--- /dev/null
+++ b/node_modules/object-assign/readme.md
@@ -0,0 +1,61 @@
+# object-assign [![Build Status](https://travis-ci.org/sindresorhus/object-assign.svg?branch=master)](https://travis-ci.org/sindresorhus/object-assign)
+
+> ES2015 [`Object.assign()`](http://www.2ality.com/2014/01/object-assign.html) [ponyfill](https://ponyfill.com)
+
+
+## Use the built-in
+
+Node.js 4 and up, as well as every evergreen browser (Chrome, Edge, Firefox, Opera, Safari),
+support `Object.assign()` :tada:. If you target only those environments, then by all
+means, use `Object.assign()` instead of this package.
+
+
+## Install
+
+```
+$ npm install --save object-assign
+```
+
+
+## Usage
+
+```js
+const objectAssign = require('object-assign');
+
+objectAssign({foo: 0}, {bar: 1});
+//=> {foo: 0, bar: 1}
+
+// multiple sources
+objectAssign({foo: 0}, {bar: 1}, {baz: 2});
+//=> {foo: 0, bar: 1, baz: 2}
+
+// overwrites equal keys
+objectAssign({foo: 0}, {foo: 1}, {foo: 2});
+//=> {foo: 2}
+
+// ignores null and undefined sources
+objectAssign({foo: 0}, null, {bar: 1}, undefined);
+//=> {foo: 0, bar: 1}
+```
+
+
+## API
+
+### objectAssign(target, [source, ...])
+
+Assigns enumerable own properties of `source` objects to the `target` object and returns the `target` object. Additional `source` objects will overwrite previous ones.
+
+
+## Resources
+
+- [ES2015 spec - Object.assign](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign)
+
+
+## Related
+
+- [deep-assign](https://github.com/sindresorhus/deep-assign) - Recursive `Object.assign()`
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/once/LICENSE b/node_modules/once/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/once/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/once/README.md b/node_modules/once/README.md
new file mode 100644
index 0000000..1f1ffca
--- /dev/null
+++ b/node_modules/once/README.md
@@ -0,0 +1,79 @@
+# once
+
+Only call a function once.
+
+## usage
+
+```javascript
+var once = require('once')
+
+function load (file, cb) {
+  cb = once(cb)
+  loader.load('file')
+  loader.once('load', cb)
+  loader.once('error', cb)
+}
+```
+
+Or add to the Function.prototype in a responsible way:
+
+```javascript
+// only has to be done once
+require('once').proto()
+
+function load (file, cb) {
+  cb = cb.once()
+  loader.load('file')
+  loader.once('load', cb)
+  loader.once('error', cb)
+}
+```
+
+Ironically, the prototype feature makes this module twice as
+complicated as necessary.
+
+To check whether you function has been called, use `fn.called`. Once the
+function is called for the first time the return value of the original
+function is saved in `fn.value` and subsequent calls will continue to
+return this value.
+
+```javascript
+var once = require('once')
+
+function load (cb) {
+  cb = once(cb)
+  var stream = createStream()
+  stream.once('data', cb)
+  stream.once('end', function () {
+    if (!cb.called) cb(new Error('not found'))
+  })
+}
+```
+
+## `once.strict(func)`
+
+Throw an error if the function is called twice.
+
+Some functions are expected to be called only once. Using `once` for them would
+potentially hide logical errors.
+
+In the example below, the `greet` function has to call the callback only once:
+
+```javascript
+function greet (name, cb) {
+  // return is missing from the if statement
+  // when no name is passed, the callback is called twice
+  if (!name) cb('Hello anonymous')
+  cb('Hello ' + name)
+}
+
+function log (msg) {
+  console.log(msg)
+}
+
+// this will print 'Hello anonymous' but the logical error will be missed
+greet(null, once(msg))
+
+// once.strict will print 'Hello anonymous' and throw an error when the callback will be called the second time
+greet(null, once.strict(msg))
+```
diff --git a/node_modules/once/once.js b/node_modules/once/once.js
new file mode 100644
index 0000000..2354067
--- /dev/null
+++ b/node_modules/once/once.js
@@ -0,0 +1,42 @@
+var wrappy = require('wrappy')
+module.exports = wrappy(once)
+module.exports.strict = wrappy(onceStrict)
+
+once.proto = once(function () {
+  Object.defineProperty(Function.prototype, 'once', {
+    value: function () {
+      return once(this)
+    },
+    configurable: true
+  })
+
+  Object.defineProperty(Function.prototype, 'onceStrict', {
+    value: function () {
+      return onceStrict(this)
+    },
+    configurable: true
+  })
+})
+
+function once (fn) {
+  var f = function () {
+    if (f.called) return f.value
+    f.called = true
+    return f.value = fn.apply(this, arguments)
+  }
+  f.called = false
+  return f
+}
+
+function onceStrict (fn) {
+  var f = function () {
+    if (f.called)
+      throw new Error(f.onceError)
+    f.called = true
+    return f.value = fn.apply(this, arguments)
+  }
+  var name = fn.name || 'Function wrapped with `once`'
+  f.onceError = name + " shouldn't be called more than once"
+  f.called = false
+  return f
+}
diff --git a/node_modules/once/package.json b/node_modules/once/package.json
new file mode 100644
index 0000000..8813f54
--- /dev/null
+++ b/node_modules/once/package.json
@@ -0,0 +1,68 @@
+{
+  "_from": "once@^1.3.1",
+  "_id": "once@1.4.0",
+  "_inBundle": false,
+  "_integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+  "_location": "/once",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "once@^1.3.1",
+    "name": "once",
+    "escapedName": "once",
+    "rawSpec": "^1.3.1",
+    "saveSpec": null,
+    "fetchSpec": "^1.3.1"
+  },
+  "_requiredBy": [
+    "/end-of-stream",
+    "/pump",
+    "/simple-get"
+  ],
+  "_resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+  "_shasum": "583b1aa775961d4b113ac17d9c50baef9dd76bd1",
+  "_spec": "once@^1.3.1",
+  "_where": "F:\\vent-display\\node_modules\\pump",
+  "author": {
+    "name": "Isaac Z. Schlueter",
+    "email": "i@izs.me",
+    "url": "http://blog.izs.me/"
+  },
+  "bugs": {
+    "url": "https://github.com/isaacs/once/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "wrappy": "1"
+  },
+  "deprecated": false,
+  "description": "Run a function exactly one time",
+  "devDependencies": {
+    "tap": "^7.0.1"
+  },
+  "directories": {
+    "test": "test"
+  },
+  "files": [
+    "once.js"
+  ],
+  "homepage": "https://github.com/isaacs/once#readme",
+  "keywords": [
+    "once",
+    "function",
+    "one",
+    "single"
+  ],
+  "license": "ISC",
+  "main": "once.js",
+  "name": "once",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/isaacs/once.git"
+  },
+  "scripts": {
+    "test": "tap test/*.js"
+  },
+  "version": "1.4.0"
+}
diff --git a/node_modules/prebuild-install/.travis.yml b/node_modules/prebuild-install/.travis.yml
new file mode 100644
index 0000000..4289264
--- /dev/null
+++ b/node_modules/prebuild-install/.travis.yml
@@ -0,0 +1,19 @@
+language: node_js
+
+os:
+  - linux
+  - osx
+
+node_js:
+  - 6
+  - 8
+  - 10
+  - 12
+  - 14
+
+jobs:
+  include:
+    - name: npm 7
+      os: linux
+      node_js: 14
+      before_install: npm i npm@7 -g
diff --git a/node_modules/prebuild-install/CHANGELOG.md b/node_modules/prebuild-install/CHANGELOG.md
new file mode 100644
index 0000000..d67c243
--- /dev/null
+++ b/node_modules/prebuild-install/CHANGELOG.md
@@ -0,0 +1,27 @@
+# Changelog
+
+## [6.0.0] - 2020-10-23
+
+### Changed
+
+- **Breaking:** don't skip downloads in standalone mode ([`b6f3b36`](https://github.com/prebuild/prebuild-install/commit/b6f3b36)) ([**@vweevers**](https://github.com/vweevers))
+
+### Added
+
+- Document cross platform options ([`e5c9a5a`](https://github.com/prebuild/prebuild-install/commit/e5c9a5a)) ([**@fishbone1**](https://github.com/fishbone1))
+
+### Removed
+
+- **Breaking:** remove `--compile` and `--prebuild` options ([`94f2492`](https://github.com/prebuild/prebuild-install/commit/94f2492)) ([**@vweevers**](https://github.com/vweevers))
+
+### Fixed
+
+- Support npm 7 ([`8acccac`](https://github.com/prebuild/prebuild-install/commit/8acccac), [`08eaf6d`](https://github.com/prebuild/prebuild-install/commit/08eaf6d), [`22175b8`](https://github.com/prebuild/prebuild-install/commit/22175b8)) ([**@vweevers**](https://github.com/vweevers))
+
+## 5.3.6 - 2020-10-20
+
+### Changed
+
+- Replace `mkdirp` dependency with `mkdirp-classic` ([**@ralphtheninja**](https://github.com/ralphtheninja))
+
+[6.0.0]: https://github.com/prebuild/prebuild-install/compare/v5.3.6...v6.0.0
diff --git a/node_modules/prebuild-install/CONTRIBUTING.md b/node_modules/prebuild-install/CONTRIBUTING.md
new file mode 100644
index 0000000..07860da
--- /dev/null
+++ b/node_modules/prebuild-install/CONTRIBUTING.md
@@ -0,0 +1,6 @@
+# Contributing to prebuild
+
+- no commits direct to master
+- all commits as pull requests (one or several per PR)
+- each commit solves one identifiable problem
+- never merge one's own PRs, another contributor does this
diff --git a/node_modules/prebuild-install/LICENSE b/node_modules/prebuild-install/LICENSE
new file mode 100644
index 0000000..66a4d2a
--- /dev/null
+++ b/node_modules/prebuild-install/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Mathias Buus
+
+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/prebuild-install/README.md b/node_modules/prebuild-install/README.md
new file mode 100644
index 0000000..06f2b7c
--- /dev/null
+++ b/node_modules/prebuild-install/README.md
@@ -0,0 +1,110 @@
+# prebuild-install
+
+> A command line tool to easily install prebuilt binaries for multiple version of node/iojs on a specific platform.
+
+[![npm](https://img.shields.io/npm/v/prebuild-install.svg)](https://www.npmjs.com/package/prebuild-install)
+![Node version](https://img.shields.io/node/v/prebuild-install.svg)
+[![Build Status](https://travis-ci.org/prebuild/prebuild-install.svg?branch=master)](https://travis-ci.org/prebuild/prebuild-install)
+[![Build status](https://ci.appveyor.com/api/projects/status/6v6hxxwgjrr99pc8/branch/master?svg=true)](https://ci.appveyor.com/project/mathiask88/prebuild-install)
+[![david](https://david-dm.org/prebuild/prebuild-install.svg)](https://david-dm.org/prebuild/prebuild-install)
+[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)
+
+`prebuild-install` supports installing prebuilt binaries from GitHub by default.
+
+## Usage
+
+Change your package.json install script to:
+
+```json
+{
+  "scripts": {
+    "install": "prebuild-install || node-gyp rebuild"
+  }
+}
+```
+
+### Requirements
+
+You need to provide prebuilds made by [`prebuild`](https://github.com/prebuild/prebuild).
+
+### Help
+
+```
+prebuild-install [options]
+
+  --download    -d  [url]       (download prebuilds, no url means github)
+  --target      -t  version     (version to install for)
+  --runtime     -r  runtime     (Node runtime [node, napi or electron] to build or install for, default is node)
+  --path        -p  path        (make a prebuild-install here)
+  --token       -T  gh-token    (github token for private repos)
+  --arch            arch        (target CPU architecture, see Node OS module docs, default is current arch)
+  --platform        platform    (target platform, see Node OS module docs, default is current platform)
+  --tag-prefix <prefix>         (github tag prefix, default is "v")
+  --build-from-source           (skip prebuild download)
+  --verbose                     (log verbosely)
+  --libc                        (use provided libc rather than system default)
+  --debug                       (set Debug or Release configuration)
+  --version                     (print prebuild-install version and exit)
+```
+
+When `prebuild-install` is run via an `npm` script, options
+`--build-from-source`, `--debug`, `--download`, `--target`, `--runtime`, `--arch` and `--platform` may be passed through via
+arguments given to the `npm` command. Alternatively you can set environment variables `npm_config_build_from_source=true`, `npm_config_platform`, `npm_config_arch`, `npm_config_target` and `npm_config_runtime`.
+
+### Private Repositories
+
+`prebuild-install` supports downloading prebuilds from private GitHub repositories using the `-T <github-token>`:
+
+```
+$ prebuild-install -T <github-token>
+```
+
+If you don't want to use the token on cli you can put it in `~/.prebuild-installrc`:
+
+```
+token=<github-token>
+```
+
+Alternatively you can specify it in the `prebuild-install_token` environment variable.
+
+Note that using a GitHub token uses the API to resolve the correct release meaning that you are subject to the ([GitHub Rate Limit](https://developer.github.com/v3/rate_limit/)).
+
+### Create GitHub Token
+
+To create a token:
+
+- Go to [this page](https://github.com/settings/tokens)
+- Click the `Generate new token` button
+- Give the token a name and click the `Generate token` button, see below
+
+![prebuild-token](https://cloud.githubusercontent.com/assets/13285808/20844584/d0b85268-b8c0-11e6-8b08-2b19522165a9.png)
+
+The default scopes should be fine.
+
+### Custom binaries
+
+The end user can override binary download location through environment variables in their .npmrc file.
+The variable needs to meet the mask `% your package name %_binary_host` or `% your package name %_binary_host_mirror`. For example:
+
+```
+leveldown_binary_host=http://overriden-host.com/overriden-path
+```
+
+Note that the package version subpath and file name will still be appended.
+So if you are installing `leveldown@1.2.3` the resulting url will be:
+
+```
+http://overriden-host.com/overriden-path/v1.2.3/leveldown-v1.2.3-node-v57-win32-x64.tar.gz
+```
+
+### Cache
+
+All prebuilt binaries are cached to minimize traffic. So first `prebuild-install` picks binaries from the cache and if no binary could be found, it will be downloaded. Depending on the environment, the cache folder is determined in the following order:
+
+- `${npm_config_cache}/_prebuilds`
+- `${APP_DATA}/npm-cache/_prebuilds`
+- `${HOME}/.npm/_prebuilds`
+
+## License
+
+MIT
diff --git a/node_modules/prebuild-install/appveyor.yml b/node_modules/prebuild-install/appveyor.yml
new file mode 100644
index 0000000..2245e49
--- /dev/null
+++ b/node_modules/prebuild-install/appveyor.yml
@@ -0,0 +1,40 @@
+# http://www.appveyor.com/docs/appveyor-yml
+
+# Don't actually build
+build: off
+
+# Skip tag builds
+skip_tags: true
+
+# Set build version format
+version: "{build}"
+
+# Set up build environment
+environment:
+  # Test against these versions of Node.js
+  matrix:
+    - nodejs_version: "14.2.0"
+    - nodejs_version: "12"
+    - nodejs_version: "10"
+    - nodejs_version: "8"
+    - nodejs_version: "6"
+
+# Build on both platforms
+platform:
+  - x86
+  - x64
+
+# Install scripts (runs after repo cloning)
+install:
+  # Get the latest version of $env:nodejs_version
+  - ps: Update-NodeJsInstallation (Get-NodeJsLatestBuild $env:nodejs_version) $env:platform
+  # Output useful info for debugging
+  - node --version
+  - npm --version
+  # Install modules
+  - npm install
+
+# Post-install test scripts
+test_script:
+  # Run module tests
+  - npm test
diff --git a/node_modules/prebuild-install/asset.js b/node_modules/prebuild-install/asset.js
new file mode 100644
index 0000000..6ff8c72
--- /dev/null
+++ b/node_modules/prebuild-install/asset.js
@@ -0,0 +1,48 @@
+var get = require('simple-get')
+var util = require('./util')
+var proxy = require('./proxy')
+var noop = Object.assign({
+  http: function () {},
+  silly: function () {}
+}, require('noop-logger'))
+
+function findAssetId (opts, cb) {
+  var downloadUrl = util.getDownloadUrl(opts)
+  var apiUrl = util.getApiUrl(opts)
+  var log = opts.log || noop
+
+  log.http('request', 'GET ' + apiUrl)
+  var reqOpts = proxy({
+    url: apiUrl,
+    json: true,
+    headers: {
+      'User-Agent': 'simple-get',
+      Authorization: 'token ' + opts.token
+    }
+  }, opts)
+
+  var req = get.concat(reqOpts, function (err, res, data) {
+    if (err) return cb(err)
+    log.http(res.statusCode, apiUrl)
+    if (res.statusCode !== 200) return cb(err)
+
+    // Find asset id in release
+    for (var release of data) {
+      if (release.tag_name === opts['tag-prefix'] + opts.pkg.version) {
+        for (var asset of release.assets) {
+          if (asset.browser_download_url === downloadUrl) {
+            return cb(null, asset.id)
+          }
+        }
+      }
+    }
+
+    cb(new Error('Could not find GitHub release for version'))
+  })
+
+  req.setTimeout(30 * 1000, function () {
+    req.abort()
+  })
+}
+
+module.exports = findAssetId
diff --git a/node_modules/prebuild-install/bin.js b/node_modules/prebuild-install/bin.js
new file mode 100644
index 0000000..3759727
--- /dev/null
+++ b/node_modules/prebuild-install/bin.js
@@ -0,0 +1,83 @@
+#!/usr/bin/env node
+
+var path = require('path')
+var fs = require('fs')
+var whichPmRuns = require('which-pm-runs')
+var napi = require('napi-build-utils')
+
+var pkg = require(path.resolve('package.json'))
+var rc = require('./rc')(pkg)
+var log = require('./log')(rc, process.env)
+var download = require('./download')
+var asset = require('./asset')
+var util = require('./util')
+
+var prebuildClientVersion = require('./package.json').version
+if (rc.version) {
+  console.log(prebuildClientVersion)
+  process.exit(0)
+}
+
+if (rc.path) process.chdir(rc.path)
+
+if (rc.runtime === 'electron' && rc.target[0] === '4' && rc.abi === '64') {
+  log.error(`Electron version ${rc.target} found - skipping prebuild-install work due to known ABI issue`)
+  log.error('More information about this issue can be found at https://github.com/lgeiger/node-abi/issues/54')
+  process.exit(1)
+}
+
+if (!fs.existsSync('package.json')) {
+  log.error('setup', 'No package.json found. Aborting...')
+  process.exit(1)
+}
+
+if (rc.help) {
+  console.error(fs.readFileSync(path.join(__dirname, 'help.txt'), 'utf-8'))
+  process.exit(0)
+}
+
+log.info('begin', 'Prebuild-install version', prebuildClientVersion)
+
+var opts = Object.assign({}, rc, { pkg: pkg, log: log })
+
+if (napi.isNapiRuntime(rc.runtime)) napi.logUnsupportedVersion(rc.target, log)
+
+var pm = whichPmRuns()
+var isNpm = !pm || pm.name === 'npm'
+var origin = util.packageOrigin(process.env, pkg)
+
+if (!isNpm && /node_modules/.test(process.cwd())) {
+  // From yarn repository
+} else if (opts.force) {
+  log.warn('install', 'prebuilt binaries enforced with --force!')
+  log.warn('install', 'prebuilt binaries may be out of date!')
+} else if (origin && origin.length > 4 && origin.substr(0, 4) === 'git+') {
+  log.info('install', 'installing from git repository, skipping download.')
+  process.exit(1)
+} else if (opts.buildFromSource) {
+  log.info('install', '--build-from-source specified, not attempting download.')
+  process.exit(1)
+}
+
+var startDownload = function (downloadUrl) {
+  download(downloadUrl, opts, function (err) {
+    if (err) {
+      log.warn('install', err.message)
+      return process.exit(1)
+    }
+    log.info('install', 'Successfully installed prebuilt binary!')
+  })
+}
+
+if (opts.token) {
+  asset(opts, function (err, assetId) {
+    if (err) {
+      log.warn('install', err.message)
+      return process.exit(1)
+    }
+
+    startDownload(util.getAssetUrl(opts, assetId))
+  })
+} else {
+  startDownload(util.getDownloadUrl(opts))
+}
diff --git a/node_modules/prebuild-install/download.js b/node_modules/prebuild-install/download.js
new file mode 100644
index 0000000..13cb9f4
--- /dev/null
+++ b/node_modules/prebuild-install/download.js
@@ -0,0 +1,130 @@
+var path = require('path')
+var fs = require('fs')
+var get = require('simple-get')
+var pump = require('pump')
+var tfs = require('tar-fs')
+var noop = Object.assign({
+  http: function () {},
+  silly: function () {}
+}, require('noop-logger'))
+var zlib = require('zlib')
+var util = require('./util')
+var error = require('./error')
+var proxy = require('./proxy')
+var mkdirp = require('mkdirp-classic')
+
+function downloadPrebuild (downloadUrl, opts, cb) {
+  var cachedPrebuild = util.cachedPrebuild(downloadUrl)
+  var tempFile = util.tempFile(cachedPrebuild)
+  var log = opts.log || noop
+
+  ensureNpmCacheDir(function (err) {
+    if (err) return onerror(err)
+
+    log.info('looking for cached prebuild @', cachedPrebuild)
+    fs.access(cachedPrebuild, fs.R_OK | fs.W_OK, function (err) {
+      if (!(err && err.code === 'ENOENT')) {
+        log.info('found cached prebuild')
+        return unpack()
+      }
+
+      log.http('request', 'GET ' + downloadUrl)
+      var reqOpts = proxy({ url: downloadUrl }, opts)
+
+      if (opts.token) {
+        reqOpts.url += '?access_token=' + opts.token
+        reqOpts.headers = {
+          'User-Agent': 'simple-get',
+          Accept: 'application/octet-stream'
+        }
+      }
+
+      var req = get(reqOpts, function (err, res) {
+        if (err) return onerror(err)
+        log.http(res.statusCode, downloadUrl)
+        if (res.statusCode !== 200) return onerror()
+        mkdirp(util.prebuildCache(), function () {
+          log.info('downloading to @', tempFile)
+          pump(res, fs.createWriteStream(tempFile), function (err) {
+            if (err) return onerror(err)
+            fs.rename(tempFile, cachedPrebuild, function (err) {
+              if (err) return cb(err)
+              log.info('renaming to @', cachedPrebuild)
+              unpack()
+            })
+          })
+        })
+      })
+
+      req.setTimeout(30 * 1000, function () {
+        req.abort()
+      })
+    })
+
+    function onerror (err) {
+      fs.unlink(tempFile, function () {
+        cb(err || error.noPrebuilts(opts))
+      })
+    }
+  })
+
+  function unpack () {
+    var binaryName
+
+    var updateName = opts.updateName || function (entry) {
+      if (/\.node$/i.test(entry.name)) binaryName = entry.name
+    }
+
+    log.info('unpacking @', cachedPrebuild)
+
+    var options = {
+      readable: true,
+      writable: true,
+      hardlinkAsFilesFallback: true
+    }
+    var extract = tfs.extract(opts.path, options).on('entry', updateName)
+
+    pump(fs.createReadStream(cachedPrebuild), zlib.createGunzip(), extract,
+      function (err) {
+        if (err) return cb(err)
+
+        var resolved
+        if (binaryName) {
+          try {
+            resolved = path.resolve(opts.path || '.', binaryName)
+          } catch (err) {
+            return cb(err)
+          }
+          log.info('unpack', 'resolved to ' + resolved)
+
+          if (opts.runtime === 'node' && opts.platform === process.platform && opts.abi === process.versions.modules && opts.arch === process.arch) {
+            try {
+              require(resolved)
+            } catch (err) {
+              return cb(err)
+            }
+            log.info('unpack', 'required ' + resolved + ' successfully')
+          }
+        }
+
+        cb(null, resolved)
+      })
+  }
+
+  function ensureNpmCacheDir (cb) {
+    var cacheFolder = util.npmCache()
+    fs.access(cacheFolder, fs.R_OK | fs.W_OK, function (err) {
+      if (err && err.code === 'ENOENT') {
+        return makeNpmCacheDir()
+      }
+      cb(err)
+    })
+
+    function makeNpmCacheDir () {
+      log.info('npm cache directory missing, creating it...')
+      mkdirp(cacheFolder, cb)
+    }
+  }
+}
+
+module.exports = downloadPrebuild
diff --git a/node_modules/prebuild-install/error.js b/node_modules/prebuild-install/error.js
new file mode 100644
index 0000000..c266c18
--- /dev/null
+++ b/node_modules/prebuild-install/error.js
@@ -0,0 +1,14 @@
+exports.noPrebuilts = function (opts) {
+  return new Error([
+    'No prebuilt binaries found',
+    '(target=' + opts.target,
+    'runtime=' + opts.runtime,
+    'arch=' + opts.arch,
+    'libc=' + opts.libc,
+    'platform=' + opts.platform + ')'
+  ].join(' '))
+}
+
+exports.invalidArchive = function () {
+  return new Error('Missing .node file in archive')
+}
diff --git a/node_modules/prebuild-install/help.txt b/node_modules/prebuild-install/help.txt
new file mode 100644
index 0000000..0dd316e
--- /dev/null
+++ b/node_modules/prebuild-install/help.txt
@@ -0,0 +1,16 @@
+prebuild-install [options]
+
+  --download    -d  [url]       (download prebuilds, no url means github)
+  --target      -t  version     (version to install for)
+  --runtime     -r  runtime     (Node runtime [node or electron] to build or install for, default is node)
+  --path        -p  path        (make a prebuild-install here)
+  --token       -T  gh-token    (github token for private repos)
+  --arch            arch        (target CPU architecture, see Node OS module docs, default is current arch)
+  --platform        platform    (target platform, see Node OS module docs, default is current platform)
+  --tag-prefix <prefix>         (github tag prefix, default is "v")
+  --force                       (always use prebuilt binaries when available)
+  --build-from-source           (skip prebuild download)
+  --verbose                     (log verbosely)
+  --libc                        (use provided libc rather than system default)
+  --debug                       (set Debug or Release configuration)
+  --version                     (print prebuild-install version and exit)
diff --git a/node_modules/prebuild-install/index.js b/node_modules/prebuild-install/index.js
new file mode 100644
index 0000000..b5fc28a
--- /dev/null
+++ b/node_modules/prebuild-install/index.js
@@ -0,0 +1 @@
+exports.download = require('./download')
diff --git a/node_modules/prebuild-install/log.js b/node_modules/prebuild-install/log.js
new file mode 100644
index 0000000..be12d1d
--- /dev/null
+++ b/node_modules/prebuild-install/log.js
@@ -0,0 +1,25 @@
+var log = require('npmlog')
+var fs = require('fs')
+var path = require('path')
+
+module.exports = function (rc, env) {
+  log.heading = 'prebuild-install'
+
+  if (rc.verbose) {
+    log.level = 'verbose'
+  } else {
+    log.level = env.npm_config_loglevel || 'notice'
+  }
+
+  // Temporary workaround for npm 7 which swallows our output
+  if (process.env.npm_config_prebuild_install_logfile) {
+    var fp = path.resolve(process.env.npm_config_prebuild_install_logfile)
+
+    log.on('log', function (msg) {
+      // Only for tests, don't care about performance
+      fs.appendFileSync(fp, [log.heading, msg.level, msg.prefix, msg.message].join(' ') + '\n')
+    })
+  }
+
+  return log
+}
diff --git a/node_modules/prebuild-install/package.json b/node_modules/prebuild-install/package.json
new file mode 100644
index 0000000..2e1134f
--- /dev/null
+++ b/node_modules/prebuild-install/package.json
@@ -0,0 +1,129 @@
+{
+  "_from": "prebuild-install@^6.0.0",
+  "_id": "prebuild-install@6.0.0",
+  "_inBundle": false,
+  "_integrity": "sha512-h2ZJ1PXHKWZpp1caLw0oX9sagVpL2YTk+ZwInQbQ3QqNd4J03O6MpFNmMTJlkfgPENWqe5kP0WjQLqz5OjLfsw==",
+  "_location": "/prebuild-install",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "prebuild-install@^6.0.0",
+    "name": "prebuild-install",
+    "escapedName": "prebuild-install",
+    "rawSpec": "^6.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^6.0.0"
+  },
+  "_requiredBy": [
+    "/@serialport/bindings"
+  ],
+  "_resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.0.0.tgz",
+  "_shasum": "669022bcde57c710a869e39c5ca6bf9cd207f316",
+  "_spec": "prebuild-install@^6.0.0",
+  "_where": "F:\\vent-display\\node_modules\\@serialport\\bindings",
+  "author": {
+    "name": "Mathias Buus",
+    "url": "@mafintosh"
+  },
+  "bin": {
+    "prebuild-install": "bin.js"
+  },
+  "bugs": {
+    "url": "https://github.com/prebuild/prebuild-install/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Julian Gruber",
+      "email": "julian@juliangruber.com",
+      "url": "https://github.com/juliangruber"
+    },
+    {
+      "name": "Brett Lawson",
+      "email": "brett19@gmail.com",
+      "url": "https://github.com/brett19"
+    },
+    {
+      "name": "Pieter Hintjens",
+      "email": "ph@imatix.com",
+      "url": "https://github.com/hintjens"
+    },
+    {
+      "name": "Lars-Magnus Skog",
+      "email": "ralphtheninja@riseup.net",
+      "url": "https://github.com/ralphtheninja"
+    },
+    {
+      "name": "Jesús Leganés Combarro",
+      "email": "piranna@gmail.com",
+      "url": "https://github.com/piranna"
+    },
+    {
+      "name": "Mathias Küsel",
+      "email": "mathiask@hotmail.de",
+      "url": "https://github.com/mathiask88"
+    },
+    {
+      "name": "Lukas Geiger",
+      "email": "lukas.geiger94@gmail.com",
+      "url": "https://github.com/lgeiger"
+    }
+  ],
+  "dependencies": {
+    "detect-libc": "^1.0.3",
+    "expand-template": "^2.0.3",
+    "github-from-package": "0.0.0",
+    "minimist": "^1.2.3",
+    "mkdirp-classic": "^0.5.3",
+    "napi-build-utils": "^1.0.1",
+    "node-abi": "^2.7.0",
+    "noop-logger": "^0.1.1",
+    "npmlog": "^4.0.1",
+    "pump": "^3.0.0",
+    "rc": "^1.2.7",
+    "simple-get": "^3.0.3",
+    "tar-fs": "^2.0.0",
+    "tunnel-agent": "^0.6.0",
+    "which-pm-runs": "^1.0.0"
+  },
+  "deprecated": false,
+  "description": "A command line tool to easily install prebuilt binaries for multiple version of node/iojs on a specific platform",
+  "devDependencies": {
+    "a-native-module": "^1.0.0",
+    "hallmark": "^3.0.0",
+    "nock": "^10.0.6",
+    "rimraf": "^2.5.2",
+    "standard": "^13.0.2",
+    "tape": "^4.5.1",
+    "tempy": "0.2.1"
+  },
+  "engines": {
+    "node": ">=6"
+  },
+  "homepage": "https://github.com/prebuild/prebuild-install",
+  "keywords": [
+    "prebuilt",
+    "binaries",
+    "native",
+    "addon",
+    "module",
+    "c",
+    "c++",
+    "bindings",
+    "devops",
+    "napi"
+  ],
+  "license": "MIT",
+  "name": "prebuild-install",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/prebuild/prebuild-install.git"
+  },
+  "scripts": {
+    "hallmark": "hallmark --fix",
+    "lint": "standard && hallmark",
+    "test": "tape test/*-test.js && npm run lint"
+  },
+  "version": "6.0.0"
+}
diff --git a/node_modules/prebuild-install/proxy.js b/node_modules/prebuild-install/proxy.js
new file mode 100644
index 0000000..0fa67ad
--- /dev/null
+++ b/node_modules/prebuild-install/proxy.js
@@ -0,0 +1,38 @@
+var url = require('url')
+var tunnel = require('tunnel-agent')
+var noop = Object.assign({
+  http: function () {},
+  silly: function () {}
+}, require('noop-logger'))
+
+function applyProxy (reqOpts, opts) {
+  var log = opts.log || noop
+
+  var proxy = opts['https-proxy'] || opts.proxy
+
+  if (proxy) {
+    // eslint-disable-next-line node/no-deprecated-api
+    var parsedDownloadUrl = url.parse(reqOpts.url)
+    // eslint-disable-next-line node/no-deprecated-api
+    var parsedProxy = url.parse(proxy)
+    var uriProtocol = (parsedDownloadUrl.protocol === 'https:' ? 'https' : 'http')
+    var proxyProtocol = (parsedProxy.protocol === 'https:' ? 'Https' : 'Http')
+    var tunnelFnName = [uriProtocol, proxyProtocol].join('Over')
+    reqOpts.agent = tunnel[tunnelFnName]({
+      proxy: {
+        host: parsedProxy.hostname,
+        port: +parsedProxy.port,
+        proxyAuth: parsedProxy.auth
+      }
+    })
+    log.http('request', 'Proxy setup detected (Host: ' +
+    parsedProxy.hostname + ', Port: ' +
+      parsedProxy.port + ', Authentication: ' +
+      (parsedProxy.auth ? 'Yes' : 'No') + ')' +
+      ' Tunneling with ' + tunnelFnName)
+  }
+
+  return reqOpts
+}
+
+module.exports = applyProxy
diff --git a/node_modules/prebuild-install/rc.js b/node_modules/prebuild-install/rc.js
new file mode 100644
index 0000000..41c4a94
--- /dev/null
+++ b/node_modules/prebuild-install/rc.js
@@ -0,0 +1,60 @@
+var minimist = require('minimist')
+var getAbi = require('node-abi').getAbi
+var detectLibc = require('detect-libc')
+var napi = require('napi-build-utils')
+
+var env = process.env
+var libc = env.LIBC || (detectLibc.isNonGlibcLinux && detectLibc.family) || ''
+
+// Get the configuration
+module.exports = function (pkg) {
+  var pkgConf = pkg.config || {}
+  var buildFromSource = env.npm_config_build_from_source
+
+  var rc = require('rc')('prebuild-install', {
+    target: pkgConf.target || env.npm_config_target || process.versions.node,
+    runtime: pkgConf.runtime || env.npm_config_runtime || 'node',
+    arch: pkgConf.arch || env.npm_config_arch || process.arch,
+    libc: libc,
+    platform: env.npm_config_platform || process.platform,
+    debug: env.npm_config_debug === 'true',
+    force: false,
+    verbose: env.npm_config_verbose === 'true',
+    buildFromSource: buildFromSource === pkg.name || buildFromSource === 'true',
+    path: '.',
+    proxy: env.npm_config_proxy || env['http_proxy'] || env['HTTP_PROXY'],
+    'https-proxy': env.npm_config_https_proxy || env['https_proxy'] || env['HTTPS_PROXY'],
+    'local-address': env.npm_config_local_address,
+    'tag-prefix': 'v',
+    download: env.npm_config_download
+  }, minimist(process.argv, {
+    alias: {
+      target: 't',
+      runtime: 'r',
+      help: 'h',
+      arch: 'a',
+      path: 'p',
+      version: 'v',
+      download: 'd',
+      buildFromSource: 'build-from-source',
+      token: 'T'
+    }
+  }))
+
+  if (rc.path === true) {
+    delete rc.path
+  }
+
+  if (napi.isNapiRuntime(rc.runtime) && rc.target === process.versions.node) {
+    rc.target = napi.getBestNapiBuildVersion()
+  }
+
+  rc.abi = napi.isNapiRuntime(rc.runtime) ? rc.target : getAbi(rc.target, rc.runtime)
+
+  return rc
+}
+
+// Print the configuration values when executed standalone for testing purposses
+if (!module.parent) {
+  console.log(JSON.stringify(module.exports({}), null, 2))
+}
diff --git a/node_modules/prebuild-install/util.js b/node_modules/prebuild-install/util.js
new file mode 100644
index 0000000..db358c9
--- /dev/null
+++ b/node_modules/prebuild-install/util.js
@@ -0,0 +1,116 @@
+var path = require('path')
+var github = require('github-from-package')
+var home = require('os').homedir
+var crypto = require('crypto')
+var expandTemplate = require('expand-template')()
+
+function getDownloadUrl (opts) {
+  var pkgName = opts.pkg.name.replace(/^@\w+\//, '')
+  return expandTemplate(urlTemplate(opts), {
+    name: pkgName,
+    package_name: pkgName,
+    version: opts.pkg.version,
+    major: opts.pkg.version.split('.')[0],
+    minor: opts.pkg.version.split('.')[1],
+    patch: opts.pkg.version.split('.')[2],
+    prerelease: opts.pkg.version.split('-')[1],
+    build: opts.pkg.version.split('+')[1],
+    abi: opts.abi || process.versions.modules,
+    node_abi: process.versions.modules,
+    runtime: opts.runtime || 'node',
+    platform: opts.platform,
+    arch: opts.arch,
+    libc: opts.libc || process.env.LIBC || '',
+    configuration: (opts.debug ? 'Debug' : 'Release'),
+    module_name: opts.pkg.binary && opts.pkg.binary.module_name,
+    tag_prefix: opts['tag-prefix'] || 'v'
+  })
+}
+
+function getApiUrl (opts) {
+  return github(opts.pkg).replace('github.com', 'api.github.com/repos') + '/releases'
+}
+
+function getAssetUrl (opts, assetId) {
+  return getApiUrl(opts) + '/assets/' + assetId
+}
+
+function urlTemplate (opts) {
+  if (typeof opts.download === 'string') {
+    return opts.download
+  }
+
+  var packageName = '{name}-v{version}-{runtime}-v{abi}-{platform}{libc}-{arch}.tar.gz'
+  var hostMirrorUrl = getHostMirrorUrl(opts)
+
+  if (hostMirrorUrl) {
+    return hostMirrorUrl + '/{tag_prefix}{version}/' + packageName
+  }
+
+  if (opts.pkg.binary && opts.pkg.binary.host) {
+    return [
+      opts.pkg.binary.host,
+      opts.pkg.binary.remote_path,
+      opts.pkg.binary.package_name || packageName
+    ].map(function (path) {
+      return trimSlashes(path)
+    }).filter(Boolean).join('/')
+  }
+
+  return github(opts.pkg) + '/releases/download/{tag_prefix}{version}/' + packageName
+}
+
+function getHostMirrorUrl (opts) {
+  var propName = 'npm_config_' + (opts.pkg.name || '').replace(/[^a-zA-Z0-9]/g, '_') + '_binary_host'
+  return process.env[propName] || process.env[propName + '_mirror']
+}
+
+function trimSlashes (str) {
+  if (str) return str.replace(/^\.\/|^\/|\/$/g, '')
+}
+
+function cachedPrebuild (url) {
+  var digest = crypto.createHash('md5').update(url).digest('hex').slice(0, 6)
+  return path.join(prebuildCache(), digest + '-' + path.basename(url).replace(/[^a-zA-Z0-9.]+/g, '-'))
+}
+
+function npmCache () {
+  var env = process.env
+  return env.npm_config_cache || (env.APPDATA ? path.join(env.APPDATA, 'npm-cache') : path.join(home(), '.npm'))
+}
+
+function prebuildCache () {
+  return path.join(npmCache(), '_prebuilds')
+}
+
+function tempFile (cached) {
+  return cached + '.' + process.pid + '-' + Math.random().toString(16).slice(2) + '.tmp'
+}
+
+function packageOrigin (env, pkg) {
+  // npm <= 6: metadata is stored on disk in node_modules
+  if (pkg._from) {
+    return pkg._from
+  }
+
+  // npm 7: metadata is exposed to environment by arborist
+  if (env.npm_package_from) {
+    // NOTE: seems undefined atm (npm 7.0.2)
+    return env.npm_package_from
+  }
+
+  if (env.npm_package_resolved) {
+    // NOTE: not sure about the difference with _from, but it's all we have
+    return env.npm_package_resolved
+  }
+}
+
+exports.getDownloadUrl = getDownloadUrl
+exports.getApiUrl = getApiUrl
+exports.getAssetUrl = getAssetUrl
+exports.urlTemplate = urlTemplate
+exports.cachedPrebuild = cachedPrebuild
+exports.prebuildCache = prebuildCache
+exports.npmCache = npmCache
+exports.tempFile = tempFile
+exports.packageOrigin = packageOrigin
diff --git a/node_modules/process-nextick-args/index.js b/node_modules/process-nextick-args/index.js
new file mode 100644
index 0000000..3eecf11
--- /dev/null
+++ b/node_modules/process-nextick-args/index.js
@@ -0,0 +1,45 @@
+'use strict';
+
+if (typeof process === 'undefined' ||
+    !process.version ||
+    process.version.indexOf('v0.') === 0 ||
+    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
+  module.exports = { nextTick: nextTick };
+} else {
+  module.exports = process
+}
+
+function nextTick(fn, arg1, arg2, arg3) {
+  if (typeof fn !== 'function') {
+    throw new TypeError('"callback" argument must be a function');
+  }
+  var len = arguments.length;
+  var args, i;
+  switch (len) {
+  case 0:
+  case 1:
+    return process.nextTick(fn);
+  case 2:
+    return process.nextTick(function afterTickOne() {
+      fn.call(null, arg1);
+    });
+  case 3:
+    return process.nextTick(function afterTickTwo() {
+      fn.call(null, arg1, arg2);
+    });
+  case 4:
+    return process.nextTick(function afterTickThree() {
+      fn.call(null, arg1, arg2, arg3);
+    });
+  default:
+    args = new Array(len - 1);
+    i = 0;
+    while (i < args.length) {
+      args[i++] = arguments[i];
+    }
+    return process.nextTick(function afterTick() {
+      fn.apply(null, args);
+    });
+  }
+}
+
diff --git a/node_modules/process-nextick-args/license.md b/node_modules/process-nextick-args/license.md
new file mode 100644
index 0000000..c67e353
--- /dev/null
+++ b/node_modules/process-nextick-args/license.md
@@ -0,0 +1,19 @@
+# Copyright (c) 2015 Calvin Metcalf
+
+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/process-nextick-args/package.json b/node_modules/process-nextick-args/package.json
new file mode 100644
index 0000000..0f7c8ec
--- /dev/null
+++ b/node_modules/process-nextick-args/package.json
@@ -0,0 +1,50 @@
+{
+  "_from": "process-nextick-args@~2.0.0",
+  "_id": "process-nextick-args@2.0.1",
+  "_inBundle": false,
+  "_integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+  "_location": "/process-nextick-args",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "process-nextick-args@~2.0.0",
+    "name": "process-nextick-args",
+    "escapedName": "process-nextick-args",
+    "rawSpec": "~2.0.0",
+    "saveSpec": null,
+    "fetchSpec": "~2.0.0"
+  },
+  "_requiredBy": [
+    "/readable-stream"
+  ],
+  "_resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+  "_shasum": "7820d9b16120cc55ca9ae7792680ae7dba6d7fe2",
+  "_spec": "process-nextick-args@~2.0.0",
+  "_where": "F:\\vent-display\\node_modules\\readable-stream",
+  "author": "",
+  "bugs": {
+    "url": "https://github.com/calvinmetcalf/process-nextick-args/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "process.nextTick but always with args",
+  "devDependencies": {
+    "tap": "~0.2.6"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/calvinmetcalf/process-nextick-args",
+  "license": "MIT",
+  "main": "index.js",
+  "name": "process-nextick-args",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/calvinmetcalf/process-nextick-args.git"
+  },
+  "scripts": {
+    "test": "node test.js"
+  },
+  "version": "2.0.1"
+}
diff --git a/node_modules/process-nextick-args/readme.md b/node_modules/process-nextick-args/readme.md
new file mode 100644
index 0000000..ecb432c
--- /dev/null
+++ b/node_modules/process-nextick-args/readme.md
@@ -0,0 +1,18 @@
+process-nextick-args
+=====
+
+[![Build Status](https://travis-ci.org/calvinmetcalf/process-nextick-args.svg?branch=master)](https://travis-ci.org/calvinmetcalf/process-nextick-args)
+
+```bash
+npm install --save process-nextick-args
+```
+
+Always be able to pass arguments to process.nextTick, no matter the platform
+
+```js
+var pna = require('process-nextick-args');
+
+pna.nextTick(function (a, b, c) {
+  console.log(a, b, c);
+}, 'step', 3,  'profit');
+```
diff --git a/node_modules/pump/.travis.yml b/node_modules/pump/.travis.yml
new file mode 100644
index 0000000..17f9433
--- /dev/null
+++ b/node_modules/pump/.travis.yml
@@ -0,0 +1,5 @@
+language: node_js
+node_js:
+  - "0.10"
+
+script: "npm test"
diff --git a/node_modules/pump/LICENSE b/node_modules/pump/LICENSE
new file mode 100644
index 0000000..757562e
--- /dev/null
+++ b/node_modules/pump/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Mathias Buus
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/pump/README.md b/node_modules/pump/README.md
new file mode 100644
index 0000000..4c81471
--- /dev/null
+++ b/node_modules/pump/README.md
@@ -0,0 +1,65 @@
+# pump
+
+pump is a small node module that pipes streams together and destroys all of them if one of them closes.
+
+```
+npm install pump
+```
+
+[![build status](http://img.shields.io/travis/mafintosh/pump.svg?style=flat)](http://travis-ci.org/mafintosh/pump)
+
+## What problem does it solve?
+
+When using standard `source.pipe(dest)` source will _not_ be destroyed if dest emits close or an error.
+You are also not able to provide a callback to tell when then pipe has finished.
+
+pump does these two things for you
+
+## Usage
+
+Simply pass the streams you want to pipe together to pump and add an optional callback
+
+``` js
+var pump = require('pump')
+var fs = require('fs')
+
+var source = fs.createReadStream('/dev/random')
+var dest = fs.createWriteStream('/dev/null')
+
+pump(source, dest, function(err) {
+  console.log('pipe finished', err)
+})
+
+setTimeout(function() {
+  dest.destroy() // when dest is closed pump will destroy source
+}, 1000)
+```
+
+You can use pump to pipe more than two streams together as well
+
+``` js
+var transform = someTransformStream()
+
+pump(source, transform, anotherTransform, dest, function(err) {
+  console.log('pipe finished', err)
+})
+```
+
+If `source`, `transform`, `anotherTransform` or `dest` closes all of them will be destroyed.
+
+Similarly to `stream.pipe()`, `pump()` returns the last stream passed in, so you can do:
+
+```
+return pump(s1, s2) // returns s2
+```
+
+If you want to return a stream that combines *both* s1 and s2 to a single stream use
+[pumpify](https://github.com/mafintosh/pumpify) instead.
+
+## License
+
+MIT
+
+## Related
+
+`pump` is part of the [mississippi stream utility collection](https://github.com/maxogden/mississippi) which includes more useful stream modules similar to this one.
diff --git a/node_modules/pump/index.js b/node_modules/pump/index.js
new file mode 100644
index 0000000..c15059f
--- /dev/null
+++ b/node_modules/pump/index.js
@@ -0,0 +1,82 @@
+var once = require('once')
+var eos = require('end-of-stream')
+var fs = require('fs') // we only need fs to get the ReadStream and WriteStream prototypes
+
+var noop = function () {}
+var ancient = /^v?\.0/.test(process.version)
+
+var isFn = function (fn) {
+  return typeof fn === 'function'
+}
+
+var isFS = function (stream) {
+  if (!ancient) return false // newer node version do not need to care about fs is a special way
+  if (!fs) return false // browser
+  return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close)
+}
+
+var isRequest = function (stream) {
+  return stream.setHeader && isFn(stream.abort)
+}
+
+var destroyer = function (stream, reading, writing, callback) {
+  callback = once(callback)
+
+  var closed = false
+  stream.on('close', function () {
+    closed = true
+  })
+
+  eos(stream, {readable: reading, writable: writing}, function (err) {
+    if (err) return callback(err)
+    closed = true
+    callback()
+  })
+
+  var destroyed = false
+  return function (err) {
+    if (closed) return
+    if (destroyed) return
+    destroyed = true
+
+    if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks
+    if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want
+
+    if (isFn(stream.destroy)) return stream.destroy()
+
+    callback(err || new Error('stream was destroyed'))
+  }
+}
+
+var call = function (fn) {
+  fn()
+}
+
+var pipe = function (from, to) {
+  return from.pipe(to)
+}
+
+var pump = function () {
+  var streams = Array.prototype.slice.call(arguments)
+  var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop
+
+  if (Array.isArray(streams[0])) streams = streams[0]
+  if (streams.length < 2) throw new Error('pump requires two streams per minimum')
+
+  var error
+  var destroys = streams.map(function (stream, i) {
+    var reading = i < streams.length - 1
+    var writing = i > 0
+    return destroyer(stream, reading, writing, function (err) {
+      if (!error) error = err
+      if (err) destroys.forEach(call)
+      if (reading) return
+      destroys.forEach(call)
+      callback(error)
+    })
+  })
+
+  return streams.reduce(pipe)
+}
+
+module.exports = pump
diff --git a/node_modules/pump/package.json b/node_modules/pump/package.json
new file mode 100644
index 0000000..17393c2
--- /dev/null
+++ b/node_modules/pump/package.json
@@ -0,0 +1,60 @@
+{
+  "_from": "pump@^3.0.0",
+  "_id": "pump@3.0.0",
+  "_inBundle": false,
+  "_integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+  "_location": "/pump",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "pump@^3.0.0",
+    "name": "pump",
+    "escapedName": "pump",
+    "rawSpec": "^3.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^3.0.0"
+  },
+  "_requiredBy": [
+    "/prebuild-install",
+    "/tar-fs"
+  ],
+  "_resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+  "_shasum": "b4a2116815bde2f4e1ea602354e8c75565107a64",
+  "_spec": "pump@^3.0.0",
+  "_where": "F:\\vent-display\\node_modules\\prebuild-install",
+  "author": {
+    "name": "Mathias Buus Madsen",
+    "email": "mathiasbuus@gmail.com"
+  },
+  "browser": {
+    "fs": false
+  },
+  "bugs": {
+    "url": "https://github.com/mafintosh/pump/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "end-of-stream": "^1.1.0",
+    "once": "^1.3.1"
+  },
+  "deprecated": false,
+  "description": "pipe streams together and close all of them if one of them closes",
+  "homepage": "https://github.com/mafintosh/pump#readme",
+  "keywords": [
+    "streams",
+    "pipe",
+    "destroy",
+    "callback"
+  ],
+  "license": "MIT",
+  "name": "pump",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/mafintosh/pump.git"
+  },
+  "scripts": {
+    "test": "node test-browser.js && node test-node.js"
+  },
+  "version": "3.0.0"
+}
diff --git a/node_modules/pump/test-browser.js b/node_modules/pump/test-browser.js
new file mode 100644
index 0000000..9a06c8a
--- /dev/null
+++ b/node_modules/pump/test-browser.js
@@ -0,0 +1,66 @@
+var stream = require('stream')
+var pump = require('./index')
+
+var rs = new stream.Readable()
+var ws = new stream.Writable()
+
+rs._read = function (size) {
+  this.push(Buffer(size).fill('abc'))
+}
+
+ws._write = function (chunk, encoding, cb) {
+  setTimeout(function () {
+    cb()
+  }, 100)
+}
+
+var toHex = function () {
+  var reverse = new (require('stream').Transform)()
+
+  reverse._transform = function (chunk, enc, callback) {
+    reverse.push(chunk.toString('hex'))
+    callback()
+  }
+
+  return reverse
+}
+
+var wsClosed = false
+var rsClosed = false
+var callbackCalled = false
+
+var check = function () {
+  if (wsClosed && rsClosed && callbackCalled) {
+    console.log('test-browser.js passes')
+    clearTimeout(timeout)
+  }
+}
+
+ws.on('finish', function () {
+  wsClosed = true
+  check()
+})
+
+rs.on('end', function () {
+  rsClosed = true
+  check()
+})
+
+var res = pump(rs, toHex(), toHex(), toHex(), ws, function () {
+  callbackCalled = true
+  check()
+})
+
+if (res !== ws) {
+  throw new Error('should return last stream')
+}
+
+setTimeout(function () {
+  rs.push(null)
+  rs.emit('close')
+}, 1000)
+
+var timeout = setTimeout(function () {
+  check()
+  throw new Error('timeout')
+}, 5000)
diff --git a/node_modules/pump/test-node.js b/node_modules/pump/test-node.js
new file mode 100644
index 0000000..561251a
--- /dev/null
+++ b/node_modules/pump/test-node.js
@@ -0,0 +1,53 @@
+var pump = require('./index')
+
+var rs = require('fs').createReadStream('/dev/random')
+var ws = require('fs').createWriteStream('/dev/null')
+
+var toHex = function () {
+  var reverse = new (require('stream').Transform)()
+
+  reverse._transform = function (chunk, enc, callback) {
+    reverse.push(chunk.toString('hex'))
+    callback()
+  }
+
+  return reverse
+}
+
+var wsClosed = false
+var rsClosed = false
+var callbackCalled = false
+
+var check = function () {
+  if (wsClosed && rsClosed && callbackCalled) {
+    console.log('test-node.js passes')
+    clearTimeout(timeout)
+  }
+}
+
+ws.on('close', function () {
+  wsClosed = true
+  check()
+})
+
+rs.on('close', function () {
+  rsClosed = true
+  check()
+})
+
+var res = pump(rs, toHex(), toHex(), toHex(), ws, function () {
+  callbackCalled = true
+  check()
+})
+
+if (res !== ws) {
+  throw new Error('should return last stream')
+}
+
+setTimeout(function () {
+  rs.destroy()
+}, 1000)
+
+var timeout = setTimeout(function () {
+  throw new Error('timeout')
+}, 5000)
diff --git a/node_modules/rc/LICENSE.APACHE2 b/node_modules/rc/LICENSE.APACHE2
new file mode 100644
index 0000000..6366c04
--- /dev/null
+++ b/node_modules/rc/LICENSE.APACHE2
@@ -0,0 +1,15 @@
+Apache License, Version 2.0
+
+Copyright (c) 2011 Dominic Tarr
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/node_modules/rc/LICENSE.BSD b/node_modules/rc/LICENSE.BSD
new file mode 100644
index 0000000..96bb796
--- /dev/null
+++ b/node_modules/rc/LICENSE.BSD
@@ -0,0 +1,26 @@
+Copyright (c) 2013, Dominic Tarr
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met: 
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer. 
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution. 
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The views and conclusions contained in the software and documentation are those
+of the authors and should not be interpreted as representing official policies, 
+either expressed or implied, of the FreeBSD Project.
diff --git a/node_modules/rc/LICENSE.MIT b/node_modules/rc/LICENSE.MIT
new file mode 100644
index 0000000..6eafbd7
--- /dev/null
+++ b/node_modules/rc/LICENSE.MIT
@@ -0,0 +1,24 @@
+The MIT License
+
+Copyright (c) 2011 Dominic Tarr
+
+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/rc/README.md b/node_modules/rc/README.md
new file mode 100644
index 0000000..e6522e2
--- /dev/null
+++ b/node_modules/rc/README.md
@@ -0,0 +1,227 @@
+# rc
+
+The non-configurable configuration loader for lazy people.
+
+## Usage
+
+The only option is to pass rc the name of your app, and your default configuration.
+
+```javascript
+var conf = require('rc')(appname, {
+  //defaults go here.
+  port: 2468,
+
+  //defaults which are objects will be merged, not replaced
+  views: {
+    engine: 'jade'
+  }
+});
+```
+
+`rc` will return your configuration options merged with the defaults you specify.
+If you pass in a predefined defaults object, it will be mutated:
+
+```javascript
+var conf = {};
+require('rc')(appname, conf);
+```
+
+If `rc` finds any config files for your app, the returned config object will have
+a `configs` array containing their paths:
+
+```javascript
+var appCfg = require('rc')(appname, conf);
+appCfg.configs[0] // /etc/appnamerc
+appCfg.configs[1] // /home/dominictarr/.config/appname
+appCfg.config // same as appCfg.configs[appCfg.configs.length - 1]
+```
+
+## Standards
+
+Given your application name (`appname`), rc will look in all the obvious places for configuration.
+
+  * command line arguments, parsed by minimist _(e.g. `--foo baz`, also nested: `--foo.bar=baz`)_
+  * environment variables prefixed with `${appname}_`
+    * or use "\_\_" to indicate nested properties <br/> _(e.g. `appname_foo__bar__baz` => `foo.bar.baz`)_
+  * if you passed an option `--config file` then from that file
+  * a local `.${appname}rc` or the first found looking in `./ ../ ../../ ../../../` etc.
+  * `$HOME/.${appname}rc`
+  * `$HOME/.${appname}/config`
+  * `$HOME/.config/${appname}`
+  * `$HOME/.config/${appname}/config`
+  * `/etc/${appname}rc`
+  * `/etc/${appname}/config`
+  * the defaults object you passed in.
+
+All configuration sources that were found will be flattened into one object,
+so that sources **earlier** in this list override later ones.
+
+
+## Configuration File Formats
+
+Configuration files (e.g. `.appnamerc`) may be in either [json](http://json.org/example) or [ini](http://en.wikipedia.org/wiki/INI_file) format. **No** file extension (`.json` or `.ini`) should be used. The example configurations below are equivalent:
+
+
+#### Formatted as `ini`
+
+```
+; You can include comments in `ini` format if you want.
+
+dependsOn=0.10.0
+
+
+; `rc` has built-in support for ini sections, see?
+
+[commands]
+  www     = ./commands/www
+  console = ./commands/repl
+
+
+; You can even do nested sections
+
+[generators.options]
+  engine  = ejs
+
+[generators.modules]
+  new     = generate-new
+  engine  = generate-backend
+
+```
+
+#### Formatted as `json`
+
+```javascript
+{
+  // You can even comment your JSON, if you want
+  "dependsOn": "0.10.0",
+  "commands": {
+    "www": "./commands/www",
+    "console": "./commands/repl"
+  },
+  "generators": {
+    "options": {
+      "engine": "ejs"
+    },
+    "modules": {
+      "new": "generate-new",
+      "backend": "generate-backend"
+    }
+  }
+}
+```
+
+Comments are stripped from JSON config via [strip-json-comments](https://github.com/sindresorhus/strip-json-comments).
+
+> Since ini, and env variables do not have a standard for types, your application needs be prepared for strings.
+
+To ensure that string representations of booleans and numbers are always converted into their proper types (especially useful if you intend to do strict `===` comparisons), consider using a module such as [parse-strings-in-object](https://github.com/anselanza/parse-strings-in-object) to wrap the config object returned from rc.
+
+
+## Simple example demonstrating precedence
+Assume you have an application like this (notice the hard-coded defaults passed to rc):
+```
+const conf = require('rc')('myapp', {
+    port: 12345,
+    mode: 'test'
+});
+
+console.log(JSON.stringify(conf, null, 2));
+```
+You also have a file `config.json`, with these contents:
+```
+{
+  "port": 9000,
+  "foo": "from config json",
+  "something": "else"
+}
+```
+And a file `.myapprc` in the same folder, with these contents:
+```
+{
+  "port": "3001",
+  "foo": "bar"
+}
+```
+Here is the expected output from various commands:
+
+`node .`
+```
+{
+  "port": "3001",
+  "mode": "test",
+  "foo": "bar",
+  "_": [],
+  "configs": [
+    "/Users/stephen/repos/conftest/.myapprc"
+  ],
+  "config": "/Users/stephen/repos/conftest/.myapprc"
+}
+```
+*Default `mode` from hard-coded object is retained, but port is overridden by `.myapprc` file (automatically found based on appname match), and `foo` is added.*
+
+
+`node . --foo baz`
+```
+{
+  "port": "3001",
+  "mode": "test",
+  "foo": "baz",
+  "_": [],
+  "configs": [
+    "/Users/stephen/repos/conftest/.myapprc"
+  ],
+  "config": "/Users/stephen/repos/conftest/.myapprc"
+}
+```
+*Same result as above but `foo` is overridden because command-line arguments take precedence over `.myapprc` file.*
+
+`node . --foo barbar --config config.json`
+```
+{
+  "port": 9000,
+  "mode": "test",
+  "foo": "barbar",
+  "something": "else",
+  "_": [],
+  "config": "config.json",
+  "configs": [
+    "/Users/stephen/repos/conftest/.myapprc",
+    "config.json"
+  ]
+}
+```
+*Now the `port` comes from the `config.json` file specified (overriding the value from `.myapprc`), and `foo` value is overriden by command-line despite also being specified in the `config.json` file.*
+ 
+
+
+## Advanced Usage
+
+#### Pass in your own `argv`
+
+You may pass in your own `argv` as the third argument to `rc`.  This is in case you want to [use your own command-line opts parser](https://github.com/dominictarr/rc/pull/12).
+
+```javascript
+require('rc')(appname, defaults, customArgvParser);
+```
+
+## Pass in your own parser
+
+If you have a special need to use a non-standard parser,
+you can do so by passing in the parser as the 4th argument.
+(leave the 3rd as null to get the default args parser)
+
+```javascript
+require('rc')(appname, defaults, null, parser);
+```
+
+This may also be used to force a more strict format,
+such as strict, valid JSON only.
+
+## Note on Performance
+
+`rc` is running `fs.statSync`-- so make sure you don't use it in a hot code path (e.g. a request handler) 
+
+
+## License
+
+Multi-licensed under the two-clause BSD License, MIT License, or Apache License, version 2.0
diff --git a/node_modules/rc/browser.js b/node_modules/rc/browser.js
new file mode 100644
index 0000000..8c230c5
--- /dev/null
+++ b/node_modules/rc/browser.js
@@ -0,0 +1,7 @@
+
+// when this is loaded into the browser, 
+// just use the defaults...
+
+module.exports = function (name, defaults) {
+  return defaults
+}
diff --git a/node_modules/rc/cli.js b/node_modules/rc/cli.js
new file mode 100644
index 0000000..ab05b60
--- /dev/null
+++ b/node_modules/rc/cli.js
@@ -0,0 +1,4 @@
+#! /usr/bin/env node
+var rc = require('./index')
+
+console.log(JSON.stringify(rc(process.argv[2]), false, 2))
diff --git a/node_modules/rc/index.js b/node_modules/rc/index.js
new file mode 100644
index 0000000..65eb47a
--- /dev/null
+++ b/node_modules/rc/index.js
@@ -0,0 +1,53 @@
+var cc   = require('./lib/utils')
+var join = require('path').join
+var deepExtend = require('deep-extend')
+var etc = '/etc'
+var win = process.platform === "win32"
+var home = win
+           ? process.env.USERPROFILE
+           : process.env.HOME
+
+module.exports = function (name, defaults, argv, parse) {
+  if('string' !== typeof name)
+    throw new Error('rc(name): name *must* be string')
+  if(!argv)
+    argv = require('minimist')(process.argv.slice(2))
+  defaults = (
+      'string' === typeof defaults
+    ? cc.json(defaults) : defaults
+    ) || {}
+
+  parse = parse || cc.parse
+
+  var env = cc.env(name + '_')
+
+  var configs = [defaults]
+  var configFiles = []
+  function addConfigFile (file) {
+    if (configFiles.indexOf(file) >= 0) return
+    var fileConfig = cc.file(file)
+    if (fileConfig) {
+      configs.push(parse(fileConfig))
+      configFiles.push(file)
+    }
+  }
+
+  // which files do we look at?
+  if (!win)
+   [join(etc, name, 'config'),
+    join(etc, name + 'rc')].forEach(addConfigFile)
+  if (home)
+   [join(home, '.config', name, 'config'),
+    join(home, '.config', name),
+    join(home, '.' + name, 'config'),
+    join(home, '.' + name + 'rc')].forEach(addConfigFile)
+  addConfigFile(cc.find('.'+name+'rc'))
+  if (env.config) addConfigFile(env.config)
+  if (argv.config) addConfigFile(argv.config)
+
+  return deepExtend.apply(null, configs.concat([
+    env,
+    argv,
+    configFiles.length ? {configs: configFiles, config: configFiles[configFiles.length - 1]} : undefined,
+  ]))
+}
diff --git a/node_modules/rc/lib/utils.js b/node_modules/rc/lib/utils.js
new file mode 100644
index 0000000..8b3beff
--- /dev/null
+++ b/node_modules/rc/lib/utils.js
@@ -0,0 +1,104 @@
+'use strict';
+var fs   = require('fs')
+var ini  = require('ini')
+var path = require('path')
+var stripJsonComments = require('strip-json-comments')
+
+var parse = exports.parse = function (content) {
+
+  //if it ends in .json or starts with { then it must be json.
+  //must be done this way, because ini accepts everything.
+  //can't just try and parse it and let it throw if it's not ini.
+  //everything is ini. even json with a syntax error.
+
+  if(/^\s*{/.test(content))
+    return JSON.parse(stripJsonComments(content))
+  return ini.parse(content)
+
+}
+
+var file = exports.file = function () {
+  var args = [].slice.call(arguments).filter(function (arg) { return arg != null })
+
+  //path.join breaks if it's a not a string, so just skip this.
+  for(var i in args)
+    if('string' !== typeof args[i])
+      return
+
+  var file = path.join.apply(null, args)
+  var content
+  try {
+    return fs.readFileSync(file,'utf-8')
+  } catch (err) {
+    return
+  }
+}
+
+var json = exports.json = function () {
+  var content = file.apply(null, arguments)
+  return content ? parse(content) : null
+}
+
+var env = exports.env = function (prefix, env) {
+  env = env || process.env
+  var obj = {}
+  var l = prefix.length
+  for(var k in env) {
+    if(k.toLowerCase().indexOf(prefix.toLowerCase()) === 0) {
+
+      var keypath = k.substring(l).split('__')
+
+      // Trim empty strings from keypath array
+      var _emptyStringIndex
+      while ((_emptyStringIndex=keypath.indexOf('')) > -1) {
+        keypath.splice(_emptyStringIndex, 1)
+      }
+
+      var cursor = obj
+      keypath.forEach(function _buildSubObj(_subkey,i){
+
+        // (check for _subkey first so we ignore empty strings)
+        // (check for cursor to avoid assignment to primitive objects)
+        if (!_subkey || typeof cursor !== 'object')
+          return
+
+        // If this is the last key, just stuff the value in there
+        // Assigns actual value from env variable to final key
+        // (unless it's just an empty string- in that case use the last valid key)
+        if (i === keypath.length-1)
+          cursor[_subkey] = env[k]
+
+
+        // Build sub-object if nothing already exists at the keypath
+        if (cursor[_subkey] === undefined)
+          cursor[_subkey] = {}
+
+        // Increment cursor used to track the object at the current depth
+        cursor = cursor[_subkey]
+
+      })
+
+    }
+
+  }
+
+  return obj
+}
+
+var find = exports.find = function () {
+  var rel = path.join.apply(null, [].slice.call(arguments))
+
+  function find(start, rel) {
+    var file = path.join(start, rel)
+    try {
+      fs.statSync(file)
+      return file
+    } catch (err) {
+      if(path.dirname(start) !== start) // root
+        return find(path.dirname(start), rel)
+    }
+  }
+  return find(process.cwd(), rel)
+}
+
+
diff --git a/node_modules/rc/package.json b/node_modules/rc/package.json
new file mode 100644
index 0000000..3ef1ce6
--- /dev/null
+++ b/node_modules/rc/package.json
@@ -0,0 +1,64 @@
+{
+  "_from": "rc@^1.2.7",
+  "_id": "rc@1.2.8",
+  "_inBundle": false,
+  "_integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+  "_location": "/rc",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "rc@^1.2.7",
+    "name": "rc",
+    "escapedName": "rc",
+    "rawSpec": "^1.2.7",
+    "saveSpec": null,
+    "fetchSpec": "^1.2.7"
+  },
+  "_requiredBy": [
+    "/prebuild-install"
+  ],
+  "_resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+  "_shasum": "cd924bf5200a075b83c188cd6b9e211b7fc0d3ed",
+  "_spec": "rc@^1.2.7",
+  "_where": "F:\\vent-display\\node_modules\\prebuild-install",
+  "author": {
+    "name": "Dominic Tarr",
+    "email": "dominic.tarr@gmail.com",
+    "url": "dominictarr.com"
+  },
+  "bin": {
+    "rc": "cli.js"
+  },
+  "browser": "browser.js",
+  "bugs": {
+    "url": "https://github.com/dominictarr/rc/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "deep-extend": "^0.6.0",
+    "ini": "~1.3.0",
+    "minimist": "^1.2.0",
+    "strip-json-comments": "~2.0.1"
+  },
+  "deprecated": false,
+  "description": "hardwired configuration loader",
+  "homepage": "https://github.com/dominictarr/rc#readme",
+  "keywords": [
+    "config",
+    "rc",
+    "unix",
+    "defaults"
+  ],
+  "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+  "main": "index.js",
+  "name": "rc",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/dominictarr/rc.git"
+  },
+  "scripts": {
+    "test": "set -e; node test/test.js; node test/ini.js; node test/nested-env-vars.js"
+  },
+  "version": "1.2.8"
+}
diff --git a/node_modules/rc/test/ini.js b/node_modules/rc/test/ini.js
new file mode 100644
index 0000000..e6857f8
--- /dev/null
+++ b/node_modules/rc/test/ini.js
@@ -0,0 +1,16 @@
+var cc =require('../lib/utils')
+var INI = require('ini')
+var assert = require('assert')
+
+function test(obj) {
+
+  var _json, _ini
+  var json = cc.parse (_json = JSON.stringify(obj))
+  var ini = cc.parse (_ini = INI.stringify(obj))
+  console.log(_ini, _json)
+  assert.deepEqual(json, ini)
+}
+
+
+test({hello: true})
+
diff --git a/node_modules/rc/test/nested-env-vars.js b/node_modules/rc/test/nested-env-vars.js
new file mode 100644
index 0000000..0ecd176
--- /dev/null
+++ b/node_modules/rc/test/nested-env-vars.js
@@ -0,0 +1,50 @@
+
+var seed = Math.random();
+var n = 'rc'+ seed;
+var N = 'RC'+ seed;
+var assert = require('assert')
+
+
+// Basic usage
+process.env[n+'_someOpt__a'] = 42
+process.env[n+'_someOpt__x__'] = 99
+process.env[n+'_someOpt__a__b'] = 186
+process.env[n+'_someOpt__a__b__c'] = 243
+process.env[n+'_someOpt__x__y'] = 1862
+process.env[n+'_someOpt__z'] = 186577
+
+// Should ignore empty strings from orphaned '__'
+process.env[n+'_someOpt__z__x__'] = 18629
+process.env[n+'_someOpt__w__w__'] = 18629
+
+// Leading '__' should ignore everything up to 'z'
+process.env[n+'___z__i__'] = 9999
+
+// should ignore case for config name section.
+process.env[N+'_test_upperCase'] = 187
+
+function testPrefix(prefix) {
+	var config = require('../')(prefix, {
+	  option: true
+	})
+
+	console.log('\n\n------ nested-env-vars ------\n',{prefix: prefix}, '\n', config);
+
+	assert.equal(config.option, true)
+	assert.equal(config.someOpt.a, 42)
+	assert.equal(config.someOpt.x, 99)
+	// Should not override `a` once it's been set
+	assert.equal(config.someOpt.a/*.b*/, 42)
+	// Should not override `x` once it's been set
+	assert.equal(config.someOpt.x/*.y*/, 99)
+	assert.equal(config.someOpt.z, 186577)
+	// Should not override `z` once it's been set
+	assert.equal(config.someOpt.z/*.x*/, 186577)
+	assert.equal(config.someOpt.w.w, 18629)
+	assert.equal(config.z.i, 9999)
+
+	assert.equal(config.test_upperCase, 187)
+}
+
+testPrefix(n);
+testPrefix(N);
diff --git a/node_modules/rc/test/test.js b/node_modules/rc/test/test.js
new file mode 100644
index 0000000..4f63351
--- /dev/null
+++ b/node_modules/rc/test/test.js
@@ -0,0 +1,59 @@
+
+var n = 'rc'+Math.random()
+var assert = require('assert')
+
+process.env[n+'_envOption'] = 42
+
+var config = require('../')(n, {
+  option: true
+})
+
+console.log(config)
+
+assert.equal(config.option, true)
+assert.equal(config.envOption, 42)
+
+var customArgv = require('../')(n, {
+  option: true
+}, { // nopt-like argv
+  option: false,
+  envOption: 24,
+  argv: {
+    remain: [],
+    cooked: ['--no-option', '--envOption', '24'],
+    original: ['--no-option', '--envOption=24']
+  }
+})
+
+console.log(customArgv)
+
+assert.equal(customArgv.option, false)
+assert.equal(customArgv.envOption, 24)
+
+var fs = require('fs')
+var path = require('path')
+var jsonrc = path.resolve('.' + n + 'rc');
+
+fs.writeFileSync(jsonrc, [
+  '{',
+    '// json overrides default',
+    '"option": false,',
+    '/* env overrides json */',
+    '"envOption": 24',
+  '}'
+].join('\n'));
+
+var commentedJSON = require('../')(n, {
+  option: true
+})
+
+fs.unlinkSync(jsonrc);
+
+console.log(commentedJSON)
+
+assert.equal(commentedJSON.option, false)
+assert.equal(commentedJSON.envOption, 42)
+
+assert.equal(commentedJSON.config, jsonrc)
+assert.equal(commentedJSON.configs.length, 1)
+assert.equal(commentedJSON.configs[0], jsonrc)
diff --git a/node_modules/readable-stream/.travis.yml b/node_modules/readable-stream/.travis.yml
new file mode 100644
index 0000000..f62cdac
--- /dev/null
+++ b/node_modules/readable-stream/.travis.yml
@@ -0,0 +1,34 @@
+sudo: false
+language: node_js
+before_install:
+  - (test $NPM_LEGACY && npm install -g npm@2 && npm install -g npm@3) || true
+notifications:
+  email: false
+matrix:
+  fast_finish: true
+  include:
+  - node_js: '0.8'
+    env: NPM_LEGACY=true
+  - node_js: '0.10'
+    env: NPM_LEGACY=true
+  - node_js: '0.11'
+    env: NPM_LEGACY=true
+  - node_js: '0.12'
+    env: NPM_LEGACY=true
+  - node_js: 1
+    env: NPM_LEGACY=true
+  - node_js: 2
+    env: NPM_LEGACY=true
+  - node_js: 3
+    env: NPM_LEGACY=true
+  - node_js: 4
+  - node_js: 5
+  - node_js: 6
+  - node_js: 7
+  - node_js: 8
+  - node_js: 9
+script: "npm run test"
+env:
+  global:
+  - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc=
+  - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI=
diff --git a/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/readable-stream/CONTRIBUTING.md
new file mode 100644
index 0000000..f478d58
--- /dev/null
+++ b/node_modules/readable-stream/CONTRIBUTING.md
@@ -0,0 +1,38 @@
+# Developer's Certificate of Origin 1.1
+
+By making a contribution to this project, I certify that:
+
+* (a) The contribution was created in whole or in part by me and I
+  have the right to submit it under the open source license
+  indicated in the file; or
+
+* (b) The contribution is based upon previous work that, to the best
+  of my knowledge, is covered under an appropriate open source
+  license and I have the right under that license to submit that
+  work with modifications, whether created in whole or in part
+  by me, under the same open source license (unless I am
+  permitted to submit under a different license), as indicated
+  in the file; or
+
+* (c) The contribution was provided directly to me by some other
+  person who certified (a), (b) or (c) and I have not modified
+  it.
+
+* (d) I understand and agree that this project and the contribution
+  are public and that a record of the contribution (including all
+  personal information I submit with it, including my sign-off) is
+  maintained indefinitely and may be redistributed consistent with
+  this project or the open source license(s) involved.
+
+## Moderation Policy
+
+The [Node.js Moderation Policy] applies to this WG.
+
+## Code of Conduct
+
+The [Node.js Code of Conduct][] applies to this WG.
+
+[Node.js Code of Conduct]:
+https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md
+[Node.js Moderation Policy]:
+https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md
diff --git a/node_modules/readable-stream/GOVERNANCE.md b/node_modules/readable-stream/GOVERNANCE.md
new file mode 100644
index 0000000..16ffb93
--- /dev/null
+++ b/node_modules/readable-stream/GOVERNANCE.md
@@ -0,0 +1,136 @@
+### Streams Working Group
+
+The Node.js Streams is jointly governed by a Working Group
+(WG)
+that is responsible for high-level guidance of the project.
+
+The WG has final authority over this project including:
+
+* Technical direction
+* Project governance and process (including this policy)
+* Contribution policy
+* GitHub repository hosting
+* Conduct guidelines
+* Maintaining the list of additional Collaborators
+
+For the current list of WG members, see the project
+[README.md](./README.md#current-project-team-members).
+
+### Collaborators
+
+The readable-stream GitHub repository is
+maintained by the WG and additional Collaborators who are added by the
+WG on an ongoing basis.
+
+Individuals making significant and valuable contributions are made
+Collaborators and given commit-access to the project. These
+individuals are identified by the WG and their addition as
+Collaborators is discussed during the WG meeting.
+
+_Note:_ If you make a significant contribution and are not considered
+for commit-access log an issue or contact a WG member directly and it
+will be brought up in the next WG meeting.
+
+Modifications of the contents of the readable-stream repository are
+made on
+a collaborative basis. Anybody with a GitHub account may propose a
+modification via pull request and it will be considered by the project
+Collaborators. All pull requests must be reviewed and accepted by a
+Collaborator with sufficient expertise who is able to take full
+responsibility for the change. In the case of pull requests proposed
+by an existing Collaborator, an additional Collaborator is required
+for sign-off. Consensus should be sought if additional Collaborators
+participate and there is disagreement around a particular
+modification. See _Consensus Seeking Process_ below for further detail
+on the consensus model used for governance.
+
+Collaborators may opt to elevate significant or controversial
+modifications, or modifications that have not found consensus to the
+WG for discussion by assigning the ***WG-agenda*** tag to a pull
+request or issue. The WG should serve as the final arbiter where
+required.
+
+For the current list of Collaborators, see the project
+[README.md](./README.md#members).
+
+### WG Membership
+
+WG seats are not time-limited.  There is no fixed size of the WG.
+However, the expected target is between 6 and 12, to ensure adequate
+coverage of important areas of expertise, balanced with the ability to
+make decisions efficiently.
+
+There is no specific set of requirements or qualifications for WG
+membership beyond these rules.
+
+The WG may add additional members to the WG by unanimous consensus.
+
+A WG member may be removed from the WG by voluntary resignation, or by
+unanimous consensus of all other WG members.
+
+Changes to WG membership should be posted in the agenda, and may be
+suggested as any other agenda item (see "WG Meetings" below).
+
+If an addition or removal is proposed during a meeting, and the full
+WG is not in attendance to participate, then the addition or removal
+is added to the agenda for the subsequent meeting.  This is to ensure
+that all members are given the opportunity to participate in all
+membership decisions.  If a WG member is unable to attend a meeting
+where a planned membership decision is being made, then their consent
+is assumed.
+
+No more than 1/3 of the WG members may be affiliated with the same
+employer.  If removal or resignation of a WG member, or a change of
+employment by a WG member, creates a situation where more than 1/3 of
+the WG membership shares an employer, then the situation must be
+immediately remedied by the resignation or removal of one or more WG
+members affiliated with the over-represented employer(s).
+
+### WG Meetings
+
+The WG meets occasionally on a Google Hangout On Air. A designated moderator
+approved by the WG runs the meeting. Each meeting should be
+published to YouTube.
+
+Items are added to the WG agenda that are considered contentious or
+are modifications of governance, contribution policy, WG membership,
+or release process.
+
+The intention of the agenda is not to approve or review all patches;
+that should happen continuously on GitHub and be handled by the larger
+group of Collaborators.
+
+Any community member or contributor can ask that something be added to
+the next meeting's agenda by logging a GitHub Issue. Any Collaborator,
+WG member or the moderator can add the item to the agenda by adding
+the ***WG-agenda*** tag to the issue.
+
+Prior to each WG meeting the moderator will share the Agenda with
+members of the WG. WG members can add any items they like to the
+agenda at the beginning of each meeting. The moderator and the WG
+cannot veto or remove items.
+
+The WG may invite persons or representatives from certain projects to
+participate in a non-voting capacity.
+
+The moderator is responsible for summarizing the discussion of each
+agenda item and sends it as a pull request after the meeting.
+
+### Consensus Seeking Process
+
+The WG follows a
+[Consensus
+Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making)
+decision-making model.
+
+When an agenda item has appeared to reach a consensus the moderator
+will ask "Does anyone object?" as a final call for dissent from the
+consensus.
+
+If an agenda item cannot reach a consensus a WG member can call for
+either a closing vote or a vote to table the issue to the next
+meeting. The call for a vote must be seconded by a majority of the WG
+or else the discussion will continue. Simple majority wins.
+
+Note that changes to WG membership require a majority consensus.  See
+"WG Membership" above.
diff --git a/node_modules/readable-stream/LICENSE b/node_modules/readable-stream/LICENSE
new file mode 100644
index 0000000..2873b3b
--- /dev/null
+++ b/node_modules/readable-stream/LICENSE
@@ -0,0 +1,47 @@
+Node.js is licensed for use as follows:
+
+"""
+Copyright Node.js contributors. All rights reserved.
+
+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.
+"""
+
+This license applies to parts of Node.js originating from the
+https://github.com/joyent/node repository:
+
+"""
+Copyright Joyent, Inc. and other Node contributors. All rights reserved.
+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/readable-stream/README.md b/node_modules/readable-stream/README.md
new file mode 100644
index 0000000..23fe3f3
--- /dev/null
+++ b/node_modules/readable-stream/README.md
@@ -0,0 +1,58 @@
+# readable-stream
+
+***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream)
+
+
+[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/)
+[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/)
+
+
+[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream)
+
+```bash
+npm install --save readable-stream
+```
+
+***Node-core streams for userland***
+
+This package is a mirror of the Streams2 and Streams3 implementations in
+Node-core.
+
+Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html).
+
+If you want to guarantee a stable streams base, regardless of what version of
+Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).
+
+As of version 2.0.0 **readable-stream** uses semantic versioning.
+
+# Streams Working Group
+
+`readable-stream` is maintained by the Streams Working Group, which
+oversees the development and maintenance of the Streams API within
+Node.js. The responsibilities of the Streams Working Group include:
+
+* Addressing stream issues on the Node.js issue tracker.
+* Authoring and editing stream documentation within the Node.js project.
+* Reviewing changes to stream subclasses within the Node.js project.
+* Redirecting changes to streams from the Node.js project to this
+  project.
+* Assisting in the implementation of stream providers within Node.js.
+* Recommending versions of `readable-stream` to be included in Node.js.
+* Messaging about the future of streams to give the community advance
+  notice of changes.
+
+<a name="members"></a>
+## Team Members
+
+* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) &lt;christopher.s.dickinson@gmail.com&gt;
+  - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B
+* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) &lt;calvin.metcalf@gmail.com&gt;
+  - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242
+* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) &lt;rod@vagg.org&gt;
+  - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D
+* **Sam Newman** ([@sonewman](https://github.com/sonewman)) &lt;newmansam@outlook.com&gt;
+* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) &lt;mathiasbuus@gmail.com&gt;
+* **Domenic Denicola** ([@domenic](https://github.com/domenic)) &lt;d@domenic.me&gt;
+* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) &lt;matteo.collina@gmail.com&gt;
+  - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E
+* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) &lt;shestak.irina@gmail.com&gt;
diff --git a/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md
new file mode 100644
index 0000000..83275f1
--- /dev/null
+++ b/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md
@@ -0,0 +1,60 @@
+# streams WG Meeting 2015-01-30
+
+## Links
+
+* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg
+* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106
+* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/
+
+## Agenda
+
+Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting.
+
+* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105)
+* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101)
+* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102)
+* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99)
+
+## Minutes
+
+### adopt a charter
+
+* group: +1's all around
+
+### What versioning scheme should be adopted?
+* group: +1’s 3.0.0
+* domenic+group: pulling in patches from other sources where appropriate
+* mikeal: version independently, suggesting versions for io.js
+* mikeal+domenic: work with TC to notify in advance of changes
+simpler stream creation
+
+### streamline creation of streams
+* sam: streamline creation of streams
+* domenic: nice simple solution posted
+  but, we lose the opportunity to change the model
+  may not be backwards incompatible (double check keys)
+
+  **action item:** domenic will check
+
+### remove implicit flowing of streams on(‘data’)
+* add isFlowing / isPaused
+* mikeal: worrying that we’re documenting polyfill methods – confuses users
+* domenic: more reflective API is probably good, with warning labels for users
+* new section for mad scientists (reflective stream access)
+* calvin: name the “third state”
+* mikeal: maybe borrow the name from whatwg?
+* domenic: we’re missing the “third state”
+* consensus: kind of difficult to name the third state
+* mikeal: figure out differences in states / compat
+* mathias: always flow on data – eliminates third state
+  * explore what it breaks
+
+**action items:**
+* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream)
+* ask rod/build for infrastructure
+* **chris**: explore the “flow on data” approach
+* add isPaused/isFlowing
+* add new docs section
+* move isPaused to that section
+
+
diff --git a/node_modules/readable-stream/duplex-browser.js b/node_modules/readable-stream/duplex-browser.js
new file mode 100644
index 0000000..f8b2db8
--- /dev/null
+++ b/node_modules/readable-stream/duplex-browser.js
@@ -0,0 +1 @@
+module.exports = require('./lib/_stream_duplex.js');
diff --git a/node_modules/readable-stream/duplex.js b/node_modules/readable-stream/duplex.js
new file mode 100644
index 0000000..46924cb
--- /dev/null
+++ b/node_modules/readable-stream/duplex.js
@@ -0,0 +1 @@
+module.exports = require('./readable').Duplex
diff --git a/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/readable-stream/lib/_stream_duplex.js
new file mode 100644
index 0000000..57003c3
--- /dev/null
+++ b/node_modules/readable-stream/lib/_stream_duplex.js
@@ -0,0 +1,131 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+// a duplex stream is just a stream that is both readable and writable.
+// Since JS doesn't have multiple prototypal inheritance, this class
+// prototypally inherits from Readable, and then parasitically from
+// Writable.
+
+'use strict';
+
+/*<replacement>*/
+
+var pna = require('process-nextick-args');
+/*</replacement>*/
+
+/*<replacement>*/
+var objectKeys = Object.keys || function (obj) {
+  var keys = [];
+  for (var key in obj) {
+    keys.push(key);
+  }return keys;
+};
+/*</replacement>*/
+
+module.exports = Duplex;
+
+/*<replacement>*/
+var util = Object.create(require('core-util-is'));
+util.inherits = require('inherits');
+/*</replacement>*/
+
+var Readable = require('./_stream_readable');
+var Writable = require('./_stream_writable');
+
+util.inherits(Duplex, Readable);
+
+{
+  // avoid scope creep, the keys array can then be collected
+  var keys = objectKeys(Writable.prototype);
+  for (var v = 0; v < keys.length; v++) {
+    var method = keys[v];
+    if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
+  }
+}
+
+function Duplex(options) {
+  if (!(this instanceof Duplex)) return new Duplex(options);
+
+  Readable.call(this, options);
+  Writable.call(this, options);
+
+  if (options && options.readable === false) this.readable = false;
+
+  if (options && options.writable === false) this.writable = false;
+
+  this.allowHalfOpen = true;
+  if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
+
+  this.once('end', onend);
+}
+
+Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function () {
+    return this._writableState.highWaterMark;
+  }
+});
+
+// the no-half-open enforcer
+function onend() {
+  // if we allow half-open state, or if the writable side ended,
+  // then we're ok.
+  if (this.allowHalfOpen || this._writableState.ended) return;
+
+  // no more data can be written.
+  // But allow more writes to happen in this tick.
+  pna.nextTick(onEndNT, this);
+}
+
+function onEndNT(self) {
+  self.end();
+}
+
+Object.defineProperty(Duplex.prototype, 'destroyed', {
+  get: function () {
+    if (this._readableState === undefined || this._writableState === undefined) {
+      return false;
+    }
+    return this._readableState.destroyed && this._writableState.destroyed;
+  },
+  set: function (value) {
+    // we ignore the value if the stream
+    // has not been initialized yet
+    if (this._readableState === undefined || this._writableState === undefined) {
+      return;
+    }
+
+    // backward compatibility, the user is explicitly
+    // managing destroyed
+    this._readableState.destroyed = value;
+    this._writableState.destroyed = value;
+  }
+});
+
+Duplex.prototype._destroy = function (err, cb) {
+  this.push(null);
+  this.end();
+
+  pna.nextTick(cb, err);
+};
\ No newline at end of file
diff --git a/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/readable-stream/lib/_stream_passthrough.js
new file mode 100644
index 0000000..612edb4
--- /dev/null
+++ b/node_modules/readable-stream/lib/_stream_passthrough.js
@@ -0,0 +1,47 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+// a passthrough stream.
+// basically just the most minimal sort of Transform stream.
+// Every written chunk gets output as-is.
+
+'use strict';
+
+module.exports = PassThrough;
+
+var Transform = require('./_stream_transform');
+
+/*<replacement>*/
+var util = Object.create(require('core-util-is'));
+util.inherits = require('inherits');
+/*</replacement>*/
+
+util.inherits(PassThrough, Transform);
+
+function PassThrough(options) {
+  if (!(this instanceof PassThrough)) return new PassThrough(options);
+
+  Transform.call(this, options);
+}
+
+PassThrough.prototype._transform = function (chunk, encoding, cb) {
+  cb(null, chunk);
+};
\ No newline at end of file
diff --git a/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/readable-stream/lib/_stream_readable.js
new file mode 100644
index 0000000..0f80764
--- /dev/null
+++ b/node_modules/readable-stream/lib/_stream_readable.js
@@ -0,0 +1,1019 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+'use strict';
+
+/*<replacement>*/
+
+var pna = require('process-nextick-args');
+/*</replacement>*/
+
+module.exports = Readable;
+
+/*<replacement>*/
+var isArray = require('isarray');
+/*</replacement>*/
+
+/*<replacement>*/
+var Duplex;
+/*</replacement>*/
+
+Readable.ReadableState = ReadableState;
+
+/*<replacement>*/
+var EE = require('events').EventEmitter;
+
+var EElistenerCount = function (emitter, type) {
+  return emitter.listeners(type).length;
+};
+/*</replacement>*/
+
+/*<replacement>*/
+var Stream = require('./internal/streams/stream');
+/*</replacement>*/
+
+/*<replacement>*/
+
+var Buffer = require('safe-buffer').Buffer;
+var OurUint8Array = global.Uint8Array || function () {};
+function _uint8ArrayToBuffer(chunk) {
+  return Buffer.from(chunk);
+}
+function _isUint8Array(obj) {
+  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
+
+/*</replacement>*/
+
+/*<replacement>*/
+var util = Object.create(require('core-util-is'));
+util.inherits = require('inherits');
+/*</replacement>*/
+
+/*<replacement>*/
+var debugUtil = require('util');
+var debug = void 0;
+if (debugUtil && debugUtil.debuglog) {
+  debug = debugUtil.debuglog('stream');
+} else {
+  debug = function () {};
+}
+/*</replacement>*/
+
+var BufferList = require('./internal/streams/BufferList');
+var destroyImpl = require('./internal/streams/destroy');
+var StringDecoder;
+
+util.inherits(Readable, Stream);
+
+var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
+
+function prependListener(emitter, event, fn) {
+  // Sadly this is not cacheable as some libraries bundle their own
+  // event emitter implementation with them.
+  if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);
+
+  // This is a hack to make sure that our error handler is attached before any
+  // userland ones.  NEVER DO THIS. This is here only because this code needs
+  // to continue to work with older versions of Node.js that do not include
+  // the prependListener() method. The goal is to eventually remove this hack.
+  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
+}
+
+function ReadableState(options, stream) {
+  Duplex = Duplex || require('./_stream_duplex');
+
+  options = options || {};
+
+  // Duplex streams are both readable and writable, but share
+  // the same options object.
+  // However, some cases require setting options to different
+  // values for the readable and the writable sides of the duplex stream.
+  // These options can be provided separately as readableXXX and writableXXX.
+  var isDuplex = stream instanceof Duplex;
+
+  // object stream flag. Used to make read(n) ignore n and to
+  // make all the buffer merging and length checks go away
+  this.objectMode = !!options.objectMode;
+
+  if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
+
+  // the point at which it stops calling _read() to fill the buffer
+  // Note: 0 is a valid value, means "don't call _read preemptively ever"
+  var hwm = options.highWaterMark;
+  var readableHwm = options.readableHighWaterMark;
+  var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+
+  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;
+
+  // cast to ints.
+  this.highWaterMark = Math.floor(this.highWaterMark);
+
+  // A linked list is used to store data chunks instead of an array because the
+  // linked list can remove elements from the beginning faster than
+  // array.shift()
+  this.buffer = new BufferList();
+  this.length = 0;
+  this.pipes = null;
+  this.pipesCount = 0;
+  this.flowing = null;
+  this.ended = false;
+  this.endEmitted = false;
+  this.reading = false;
+
+  // a flag to be able to tell if the event 'readable'/'data' is emitted
+  // immediately, or on a later tick.  We set this to true at first, because
+  // any actions that shouldn't happen until "later" should generally also
+  // not happen before the first read call.
+  this.sync = true;
+
+  // whenever we return null, then we set a flag to say
+  // that we're awaiting a 'readable' event emission.
+  this.needReadable = false;
+  this.emittedReadable = false;
+  this.readableListening = false;
+  this.resumeScheduled = false;
+
+  // has it been destroyed
+  this.destroyed = false;
+
+  // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+  this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+  // the number of writers that are awaiting a drain event in .pipe()s
+  this.awaitDrain = 0;
+
+  // if true, a maybeReadMore has been scheduled
+  this.readingMore = false;
+
+  this.decoder = null;
+  this.encoding = null;
+  if (options.encoding) {
+    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+    this.decoder = new StringDecoder(options.encoding);
+    this.encoding = options.encoding;
+  }
+}
+
+function Readable(options) {
+  Duplex = Duplex || require('./_stream_duplex');
+
+  if (!(this instanceof Readable)) return new Readable(options);
+
+  this._readableState = new ReadableState(options, this);
+
+  // legacy
+  this.readable = true;
+
+  if (options) {
+    if (typeof options.read === 'function') this._read = options.read;
+
+    if (typeof options.destroy === 'function') this._destroy = options.destroy;
+  }
+
+  Stream.call(this);
+}
+
+Object.defineProperty(Readable.prototype, 'destroyed', {
+  get: function () {
+    if (this._readableState === undefined) {
+      return false;
+    }
+    return this._readableState.destroyed;
+  },
+  set: function (value) {
+    // we ignore the value if the stream
+    // has not been initialized yet
+    if (!this._readableState) {
+      return;
+    }
+
+    // backward compatibility, the user is explicitly
+    // managing destroyed
+    this._readableState.destroyed = value;
+  }
+});
+
+Readable.prototype.destroy = destroyImpl.destroy;
+Readable.prototype._undestroy = destroyImpl.undestroy;
+Readable.prototype._destroy = function (err, cb) {
+  this.push(null);
+  cb(err);
+};
+
+// Manually shove something into the read() buffer.
+// This returns true if the highWaterMark has not been hit yet,
+// similar to how Writable.write() returns true if you should
+// write() some more.
+Readable.prototype.push = function (chunk, encoding) {
+  var state = this._readableState;
+  var skipChunkCheck;
+
+  if (!state.objectMode) {
+    if (typeof chunk === 'string') {
+      encoding = encoding || state.defaultEncoding;
+      if (encoding !== state.encoding) {
+        chunk = Buffer.from(chunk, encoding);
+        encoding = '';
+      }
+      skipChunkCheck = true;
+    }
+  } else {
+    skipChunkCheck = true;
+  }
+
+  return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
+};
+
+// Unshift should *always* be something directly out of read()
+Readable.prototype.unshift = function (chunk) {
+  return readableAddChunk(this, chunk, null, true, false);
+};
+
+function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
+  var state = stream._readableState;
+  if (chunk === null) {
+    state.reading = false;
+    onEofChunk(stream, state);
+  } else {
+    var er;
+    if (!skipChunkCheck) er = chunkInvalid(state, chunk);
+    if (er) {
+      stream.emit('error', er);
+    } else if (state.objectMode || chunk && chunk.length > 0) {
+      if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
+        chunk = _uint8ArrayToBuffer(chunk);
+      }
+
+      if (addToFront) {
+        if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
+      } else if (state.ended) {
+        stream.emit('error', new Error('stream.push() after EOF'));
+      } else {
+        state.reading = false;
+        if (state.decoder && !encoding) {
+          chunk = state.decoder.write(chunk);
+          if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
+        } else {
+          addChunk(stream, state, chunk, false);
+        }
+      }
+    } else if (!addToFront) {
+      state.reading = false;
+    }
+  }
+
+  return needMoreData(state);
+}
+
+function addChunk(stream, state, chunk, addToFront) {
+  if (state.flowing && state.length === 0 && !state.sync) {
+    stream.emit('data', chunk);
+    stream.read(0);
+  } else {
+    // update the buffer info.
+    state.length += state.objectMode ? 1 : chunk.length;
+    if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
+
+    if (state.needReadable) emitReadable(stream);
+  }
+  maybeReadMore(stream, state);
+}
+
+function chunkInvalid(state, chunk) {
+  var er;
+  if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+    er = new TypeError('Invalid non-string/buffer chunk');
+  }
+  return er;
+}
+
+// if it's past the high water mark, we can push in some more.
+// Also, if we have no data yet, we can stand some
+// more bytes.  This is to work around cases where hwm=0,
+// such as the repl.  Also, if the push() triggered a
+// readable event, and the user called read(largeNumber) such that
+// needReadable was set, then we ought to push more, so that another
+// 'readable' event will be triggered.
+function needMoreData(state) {
+  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
+}
+
+Readable.prototype.isPaused = function () {
+  return this._readableState.flowing === false;
+};
+
+// backwards compatibility.
+Readable.prototype.setEncoding = function (enc) {
+  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+  this._readableState.decoder = new StringDecoder(enc);
+  this._readableState.encoding = enc;
+  return this;
+};
+
+// Don't raise the hwm > 8MB
+var MAX_HWM = 0x800000;
+function computeNewHighWaterMark(n) {
+  if (n >= MAX_HWM) {
+    n = MAX_HWM;
+  } else {
+    // Get the next highest power of 2 to prevent increasing hwm excessively in
+    // tiny amounts
+    n--;
+    n |= n >>> 1;
+    n |= n >>> 2;
+    n |= n >>> 4;
+    n |= n >>> 8;
+    n |= n >>> 16;
+    n++;
+  }
+  return n;
+}
+
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function howMuchToRead(n, state) {
+  if (n <= 0 || state.length === 0 && state.ended) return 0;
+  if (state.objectMode) return 1;
+  if (n !== n) {
+    // Only flow one buffer at a time
+    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
+  }
+  // If we're asking for more than the current hwm, then raise the hwm.
+  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
+  if (n <= state.length) return n;
+  // Don't have enough
+  if (!state.ended) {
+    state.needReadable = true;
+    return 0;
+  }
+  return state.length;
+}
+
+// you can override either this method, or the async _read(n) below.
+Readable.prototype.read = function (n) {
+  debug('read', n);
+  n = parseInt(n, 10);
+  var state = this._readableState;
+  var nOrig = n;
+
+  if (n !== 0) state.emittedReadable = false;
+
+  // if we're doing read(0) to trigger a readable event, but we
+  // already have a bunch of data in the buffer, then just trigger
+  // the 'readable' event and move on.
+  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
+    debug('read: emitReadable', state.length, state.ended);
+    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
+    return null;
+  }
+
+  n = howMuchToRead(n, state);
+
+  // if we've ended, and we're now clear, then finish it up.
+  if (n === 0 && state.ended) {
+    if (state.length === 0) endReadable(this);
+    return null;
+  }
+
+  // All the actual chunk generation logic needs to be
+  // *below* the call to _read.  The reason is that in certain
+  // synthetic stream cases, such as passthrough streams, _read
+  // may be a completely synchronous operation which may change
+  // the state of the read buffer, providing enough data when
+  // before there was *not* enough.
+  //
+  // So, the steps are:
+  // 1. Figure out what the state of things will be after we do
+  // a read from the buffer.
+  //
+  // 2. If that resulting state will trigger a _read, then call _read.
+  // Note that this may be asynchronous, or synchronous.  Yes, it is
+  // deeply ugly to write APIs this way, but that still doesn't mean
+  // that the Readable class should behave improperly, as streams are
+  // designed to be sync/async agnostic.
+  // Take note if the _read call is sync or async (ie, if the read call
+  // has returned yet), so that we know whether or not it's safe to emit
+  // 'readable' etc.
+  //
+  // 3. Actually pull the requested chunks out of the buffer and return.
+
+  // if we need a readable event, then we need to do some reading.
+  var doRead = state.needReadable;
+  debug('need readable', doRead);
+
+  // if we currently have less than the highWaterMark, then also read some
+  if (state.length === 0 || state.length - n < state.highWaterMark) {
+    doRead = true;
+    debug('length less than watermark', doRead);
+  }
+
+  // however, if we've ended, then there's no point, and if we're already
+  // reading, then it's unnecessary.
+  if (state.ended || state.reading) {
+    doRead = false;
+    debug('reading or ended', doRead);
+  } else if (doRead) {
+    debug('do read');
+    state.reading = true;
+    state.sync = true;
+    // if the length is currently zero, then we *need* a readable event.
+    if (state.length === 0) state.needReadable = true;
+    // call internal read method
+    this._read(state.highWaterMark);
+    state.sync = false;
+    // If _read pushed data synchronously, then `reading` will be false,
+    // and we need to re-evaluate how much data we can return to the user.
+    if (!state.reading) n = howMuchToRead(nOrig, state);
+  }
+
+  var ret;
+  if (n > 0) ret = fromList(n, state);else ret = null;
+
+  if (ret === null) {
+    state.needReadable = true;
+    n = 0;
+  } else {
+    state.length -= n;
+  }
+
+  if (state.length === 0) {
+    // If we have nothing in the buffer, then we want to know
+    // as soon as we *do* get something into the buffer.
+    if (!state.ended) state.needReadable = true;
+
+    // If we tried to read() past the EOF, then emit end on the next tick.
+    if (nOrig !== n && state.ended) endReadable(this);
+  }
+
+  if (ret !== null) this.emit('data', ret);
+
+  return ret;
+};
+
+function onEofChunk(stream, state) {
+  if (state.ended) return;
+  if (state.decoder) {
+    var chunk = state.decoder.end();
+    if (chunk && chunk.length) {
+      state.buffer.push(chunk);
+      state.length += state.objectMode ? 1 : chunk.length;
+    }
+  }
+  state.ended = true;
+
+  // emit 'readable' now to make sure it gets picked up.
+  emitReadable(stream);
+}
+
+// Don't emit readable right away in sync mode, because this can trigger
+// another read() call => stack overflow.  This way, it might trigger
+// a nextTick recursion warning, but that's not so bad.
+function emitReadable(stream) {
+  var state = stream._readableState;
+  state.needReadable = false;
+  if (!state.emittedReadable) {
+    debug('emitReadable', state.flowing);
+    state.emittedReadable = true;
+    if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);
+  }
+}
+
+function emitReadable_(stream) {
+  debug('emit readable');
+  stream.emit('readable');
+  flow(stream);
+}
+
+// at this point, the user has presumably seen the 'readable' event,
+// and called read() to consume some data.  that may have triggered
+// in turn another _read(n) call, in which case reading = true if
+// it's in progress.
+// However, if we're not ended, or reading, and the length < hwm,
+// then go ahead and try to read some more preemptively.
+function maybeReadMore(stream, state) {
+  if (!state.readingMore) {
+    state.readingMore = true;
+    pna.nextTick(maybeReadMore_, stream, state);
+  }
+}
+
+function maybeReadMore_(stream, state) {
+  var len = state.length;
+  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
+    debug('maybeReadMore read 0');
+    stream.read(0);
+    if (len === state.length)
+      // didn't get any data, stop spinning.
+      break;else len = state.length;
+  }
+  state.readingMore = false;
+}
+
+// abstract method.  to be overridden in specific implementation classes.
+// call cb(er, data) where data is <= n in length.
+// for virtual (non-string, non-buffer) streams, "length" is somewhat
+// arbitrary, and perhaps not very meaningful.
+Readable.prototype._read = function (n) {
+  this.emit('error', new Error('_read() is not implemented'));
+};
+
+Readable.prototype.pipe = function (dest, pipeOpts) {
+  var src = this;
+  var state = this._readableState;
+
+  switch (state.pipesCount) {
+    case 0:
+      state.pipes = dest;
+      break;
+    case 1:
+      state.pipes = [state.pipes, dest];
+      break;
+    default:
+      state.pipes.push(dest);
+      break;
+  }
+  state.pipesCount += 1;
+  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
+
+  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
+
+  var endFn = doEnd ? onend : unpipe;
+  if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);
+
+  dest.on('unpipe', onunpipe);
+  function onunpipe(readable, unpipeInfo) {
+    debug('onunpipe');
+    if (readable === src) {
+      if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
+        unpipeInfo.hasUnpiped = true;
+        cleanup();
+      }
+    }
+  }
+
+  function onend() {
+    debug('onend');
+    dest.end();
+  }
+
+  // when the dest drains, it reduces the awaitDrain counter
+  // on the source.  This would be more elegant with a .once()
+  // handler in flow(), but adding and removing repeatedly is
+  // too slow.
+  var ondrain = pipeOnDrain(src);
+  dest.on('drain', ondrain);
+
+  var cleanedUp = false;
+  function cleanup() {
+    debug('cleanup');
+    // cleanup event handlers once the pipe is broken
+    dest.removeListener('close', onclose);
+    dest.removeListener('finish', onfinish);
+    dest.removeListener('drain', ondrain);
+    dest.removeListener('error', onerror);
+    dest.removeListener('unpipe', onunpipe);
+    src.removeListener('end', onend);
+    src.removeListener('end', unpipe);
+    src.removeListener('data', ondata);
+
+    cleanedUp = true;
+
+    // if the reader is waiting for a drain event from this
+    // specific writer, then it would cause it to never start
+    // flowing again.
+    // So, if this is awaiting a drain, then we just call it now.
+    // If we don't know, then assume that we are waiting for one.
+    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
+  }
+
+  // If the user pushes more data while we're writing to dest then we'll end up
+  // in ondata again. However, we only want to increase awaitDrain once because
+  // dest will only emit one 'drain' event for the multiple writes.
+  // => Introduce a guard on increasing awaitDrain.
+  var increasedAwaitDrain = false;
+  src.on('data', ondata);
+  function ondata(chunk) {
+    debug('ondata');
+    increasedAwaitDrain = false;
+    var ret = dest.write(chunk);
+    if (false === ret && !increasedAwaitDrain) {
+      // If the user unpiped during `dest.write()`, it is possible
+      // to get stuck in a permanently paused state if that write
+      // also returned false.
+      // => Check whether `dest` is still a piping destination.
+      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
+        debug('false write response, pause', src._readableState.awaitDrain);
+        src._readableState.awaitDrain++;
+        increasedAwaitDrain = true;
+      }
+      src.pause();
+    }
+  }
+
+  // if the dest has an error, then stop piping into it.
+  // however, don't suppress the throwing behavior for this.
+  function onerror(er) {
+    debug('onerror', er);
+    unpipe();
+    dest.removeListener('error', onerror);
+    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
+  }
+
+  // Make sure our error handler is attached before userland ones.
+  prependListener(dest, 'error', onerror);
+
+  // Both close and finish should trigger unpipe, but only once.
+  function onclose() {
+    dest.removeListener('finish', onfinish);
+    unpipe();
+  }
+  dest.once('close', onclose);
+  function onfinish() {
+    debug('onfinish');
+    dest.removeListener('close', onclose);
+    unpipe();
+  }
+  dest.once('finish', onfinish);
+
+  function unpipe() {
+    debug('unpipe');
+    src.unpipe(dest);
+  }
+
+  // tell the dest that it's being piped to
+  dest.emit('pipe', src);
+
+  // start the flow if it hasn't been started already.
+  if (!state.flowing) {
+    debug('pipe resume');
+    src.resume();
+  }
+
+  return dest;
+};
+
+function pipeOnDrain(src) {
+  return function () {
+    var state = src._readableState;
+    debug('pipeOnDrain', state.awaitDrain);
+    if (state.awaitDrain) state.awaitDrain--;
+    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
+      state.flowing = true;
+      flow(src);
+    }
+  };
+}
+
+Readable.prototype.unpipe = function (dest) {
+  var state = this._readableState;
+  var unpipeInfo = { hasUnpiped: false };
+
+  // if we're not piping anywhere, then do nothing.
+  if (state.pipesCount === 0) return this;
+
+  // just one destination.  most common case.
+  if (state.pipesCount === 1) {
+    // passed in one, but it's not the right one.
+    if (dest && dest !== state.pipes) return this;
+
+    if (!dest) dest = state.pipes;
+
+    // got a match.
+    state.pipes = null;
+    state.pipesCount = 0;
+    state.flowing = false;
+    if (dest) dest.emit('unpipe', this, unpipeInfo);
+    return this;
+  }
+
+  // slow case. multiple pipe destinations.
+
+  if (!dest) {
+    // remove all.
+    var dests = state.pipes;
+    var len = state.pipesCount;
+    state.pipes = null;
+    state.pipesCount = 0;
+    state.flowing = false;
+
+    for (var i = 0; i < len; i++) {
+      dests[i].emit('unpipe', this, unpipeInfo);
+    }return this;
+  }
+
+  // try to find the right one.
+  var index = indexOf(state.pipes, dest);
+  if (index === -1) return this;
+
+  state.pipes.splice(index, 1);
+  state.pipesCount -= 1;
+  if (state.pipesCount === 1) state.pipes = state.pipes[0];
+
+  dest.emit('unpipe', this, unpipeInfo);
+
+  return this;
+};
+
+// set up data events if they are asked for
+// Ensure readable listeners eventually get something
+Readable.prototype.on = function (ev, fn) {
+  var res = Stream.prototype.on.call(this, ev, fn);
+
+  if (ev === 'data') {
+    // Start flowing on next tick if stream isn't explicitly paused
+    if (this._readableState.flowing !== false) this.resume();
+  } else if (ev === 'readable') {
+    var state = this._readableState;
+    if (!state.endEmitted && !state.readableListening) {
+      state.readableListening = state.needReadable = true;
+      state.emittedReadable = false;
+      if (!state.reading) {
+        pna.nextTick(nReadingNextTick, this);
+      } else if (state.length) {
+        emitReadable(this);
+      }
+    }
+  }
+
+  return res;
+};
+Readable.prototype.addListener = Readable.prototype.on;
+
+function nReadingNextTick(self) {
+  debug('readable nexttick read 0');
+  self.read(0);
+}
+
+// pause() and resume() are remnants of the legacy readable stream API
+// If the user uses them, then switch into old mode.
+Readable.prototype.resume = function () {
+  var state = this._readableState;
+  if (!state.flowing) {
+    debug('resume');
+    state.flowing = true;
+    resume(this, state);
+  }
+  return this;
+};
+
+function resume(stream, state) {
+  if (!state.resumeScheduled) {
+    state.resumeScheduled = true;
+    pna.nextTick(resume_, stream, state);
+  }
+}
+
+function resume_(stream, state) {
+  if (!state.reading) {
+    debug('resume read 0');
+    stream.read(0);
+  }
+
+  state.resumeScheduled = false;
+  state.awaitDrain = 0;
+  stream.emit('resume');
+  flow(stream);
+  if (state.flowing && !state.reading) stream.read(0);
+}
+
+Readable.prototype.pause = function () {
+  debug('call pause flowing=%j', this._readableState.flowing);
+  if (false !== this._readableState.flowing) {
+    debug('pause');
+    this._readableState.flowing = false;
+    this.emit('pause');
+  }
+  return this;
+};
+
+function flow(stream) {
+  var state = stream._readableState;
+  debug('flow', state.flowing);
+  while (state.flowing && stream.read() !== null) {}
+}
+
+// wrap an old-style stream as the async data source.
+// This is *not* part of the readable stream interface.
+// It is an ugly unfortunate mess of history.
+Readable.prototype.wrap = function (stream) {
+  var _this = this;
+
+  var state = this._readableState;
+  var paused = false;
+
+  stream.on('end', function () {
+    debug('wrapped end');
+    if (state.decoder && !state.ended) {
+      var chunk = state.decoder.end();
+      if (chunk && chunk.length) _this.push(chunk);
+    }
+
+    _this.push(null);
+  });
+
+  stream.on('data', function (chunk) {
+    debug('wrapped data');
+    if (state.decoder) chunk = state.decoder.write(chunk);
+
+    // don't skip over falsy values in objectMode
+    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
+
+    var ret = _this.push(chunk);
+    if (!ret) {
+      paused = true;
+      stream.pause();
+    }
+  });
+
+  // proxy all the other methods.
+  // important when wrapping filters and duplexes.
+  for (var i in stream) {
+    if (this[i] === undefined && typeof stream[i] === 'function') {
+      this[i] = function (method) {
+        return function () {
+          return stream[method].apply(stream, arguments);
+        };
+      }(i);
+    }
+  }
+
+  // proxy certain important events.
+  for (var n = 0; n < kProxyEvents.length; n++) {
+    stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
+  }
+
+  // when we try to consume some more bytes, simply unpause the
+  // underlying stream.
+  this._read = function (n) {
+    debug('wrapped _read', n);
+    if (paused) {
+      paused = false;
+      stream.resume();
+    }
+  };
+
+  return this;
+};
+
+Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function () {
+    return this._readableState.highWaterMark;
+  }
+});
+
+// exposed for testing purposes only.
+Readable._fromList = fromList;
+
+// Pluck off n bytes from an array of buffers.
+// Length is the combined lengths of all the buffers in the list.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function fromList(n, state) {
+  // nothing buffered
+  if (state.length === 0) return null;
+
+  var ret;
+  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
+    // read it all, truncate the list
+    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
+    state.buffer.clear();
+  } else {
+    // read part of list
+    ret = fromListPartial(n, state.buffer, state.decoder);
+  }
+
+  return ret;
+}
+
+// Extracts only enough buffered data to satisfy the amount requested.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function fromListPartial(n, list, hasStrings) {
+  var ret;
+  if (n < list.head.data.length) {
+    // slice is the same for buffers and strings
+    ret = list.head.data.slice(0, n);
+    list.head.data = list.head.data.slice(n);
+  } else if (n === list.head.data.length) {
+    // first chunk is a perfect match
+    ret = list.shift();
+  } else {
+    // result spans more than one buffer
+    ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
+  }
+  return ret;
+}
+
+// Copies a specified amount of characters from the list of buffered data
+// chunks.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function copyFromBufferString(n, list) {
+  var p = list.head;
+  var c = 1;
+  var ret = p.data;
+  n -= ret.length;
+  while (p = p.next) {
+    var str = p.data;
+    var nb = n > str.length ? str.length : n;
+    if (nb === str.length) ret += str;else ret += str.slice(0, n);
+    n -= nb;
+    if (n === 0) {
+      if (nb === str.length) {
+        ++c;
+        if (p.next) list.head = p.next;else list.head = list.tail = null;
+      } else {
+        list.head = p;
+        p.data = str.slice(nb);
+      }
+      break;
+    }
+    ++c;
+  }
+  list.length -= c;
+  return ret;
+}
+
+// Copies a specified amount of bytes from the list of buffered data chunks.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function copyFromBuffer(n, list) {
+  var ret = Buffer.allocUnsafe(n);
+  var p = list.head;
+  var c = 1;
+  p.data.copy(ret);
+  n -= p.data.length;
+  while (p = p.next) {
+    var buf = p.data;
+    var nb = n > buf.length ? buf.length : n;
+    buf.copy(ret, ret.length - n, 0, nb);
+    n -= nb;
+    if (n === 0) {
+      if (nb === buf.length) {
+        ++c;
+        if (p.next) list.head = p.next;else list.head = list.tail = null;
+      } else {
+        list.head = p;
+        p.data = buf.slice(nb);
+      }
+      break;
+    }
+    ++c;
+  }
+  list.length -= c;
+  return ret;
+}
+
+function endReadable(stream) {
+  var state = stream._readableState;
+
+  // If we get here before consuming all the bytes, then that is a
+  // bug in node.  Should never happen.
+  if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
+
+  if (!state.endEmitted) {
+    state.ended = true;
+    pna.nextTick(endReadableNT, state, stream);
+  }
+}
+
+function endReadableNT(state, stream) {
+  // Check that we didn't get one last unshift.
+  if (!state.endEmitted && state.length === 0) {
+    state.endEmitted = true;
+    stream.readable = false;
+    stream.emit('end');
+  }
+}
+
+function indexOf(xs, x) {
+  for (var i = 0, l = xs.length; i < l; i++) {
+    if (xs[i] === x) return i;
+  }
+  return -1;
+}
\ No newline at end of file
diff --git a/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/readable-stream/lib/_stream_transform.js
new file mode 100644
index 0000000..fcfc105
--- /dev/null
+++ b/node_modules/readable-stream/lib/_stream_transform.js
@@ -0,0 +1,214 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+// a transform stream is a readable/writable stream where you do
+// something with the data.  Sometimes it's called a "filter",
+// but that's not a great name for it, since that implies a thing where
+// some bits pass through, and others are simply ignored.  (That would
+// be a valid example of a transform, of course.)
+//
+// While the output is causally related to the input, it's not a
+// necessarily symmetric or synchronous transformation.  For example,
+// a zlib stream might take multiple plain-text writes(), and then
+// emit a single compressed chunk some time in the future.
+//
+// Here's how this works:
+//
+// The Transform stream has all the aspects of the readable and writable
+// stream classes.  When you write(chunk), that calls _write(chunk,cb)
+// internally, and returns false if there's a lot of pending writes
+// buffered up.  When you call read(), that calls _read(n) until
+// there's enough pending readable data buffered up.
+//
+// In a transform stream, the written data is placed in a buffer.  When
+// _read(n) is called, it transforms the queued up data, calling the
+// buffered _write cb's as it consumes chunks.  If consuming a single
+// written chunk would result in multiple output chunks, then the first
+// outputted bit calls the readcb, and subsequent chunks just go into
+// the read buffer, and will cause it to emit 'readable' if necessary.
+//
+// This way, back-pressure is actually determined by the reading side,
+// since _read has to be called to start processing a new chunk.  However,
+// a pathological inflate type of transform can cause excessive buffering
+// here.  For example, imagine a stream where every byte of input is
+// interpreted as an integer from 0-255, and then results in that many
+// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
+// 1kb of data being output.  In this case, you could write a very small
+// amount of input, and end up with a very large amount of output.  In
+// such a pathological inflating mechanism, there'd be no way to tell
+// the system to stop doing the transform.  A single 4MB write could
+// cause the system to run out of memory.
+//
+// However, even in such a pathological case, only a single written chunk
+// would be consumed, and then the rest would wait (un-transformed) until
+// the results of the previous transformed chunk were consumed.
+
+'use strict';
+
+module.exports = Transform;
+
+var Duplex = require('./_stream_duplex');
+
+/*<replacement>*/
+var util = Object.create(require('core-util-is'));
+util.inherits = require('inherits');
+/*</replacement>*/
+
+util.inherits(Transform, Duplex);
+
+function afterTransform(er, data) {
+  var ts = this._transformState;
+  ts.transforming = false;
+
+  var cb = ts.writecb;
+
+  if (!cb) {
+    return this.emit('error', new Error('write callback called multiple times'));
+  }
+
+  ts.writechunk = null;
+  ts.writecb = null;
+
+  if (data != null) // single equals check for both `null` and `undefined`
+    this.push(data);
+
+  cb(er);
+
+  var rs = this._readableState;
+  rs.reading = false;
+  if (rs.needReadable || rs.length < rs.highWaterMark) {
+    this._read(rs.highWaterMark);
+  }
+}
+
+function Transform(options) {
+  if (!(this instanceof Transform)) return new Transform(options);
+
+  Duplex.call(this, options);
+
+  this._transformState = {
+    afterTransform: afterTransform.bind(this),
+    needTransform: false,
+    transforming: false,
+    writecb: null,
+    writechunk: null,
+    writeencoding: null
+  };
+
+  // start out asking for a readable event once data is transformed.
+  this._readableState.needReadable = true;
+
+  // we have implemented the _read method, and done the other things
+  // that Readable wants before the first _read call, so unset the
+  // sync guard flag.
+  this._readableState.sync = false;
+
+  if (options) {
+    if (typeof options.transform === 'function') this._transform = options.transform;
+
+    if (typeof options.flush === 'function') this._flush = options.flush;
+  }
+
+  // When the writable side finishes, then flush out anything remaining.
+  this.on('prefinish', prefinish);
+}
+
+function prefinish() {
+  var _this = this;
+
+  if (typeof this._flush === 'function') {
+    this._flush(function (er, data) {
+      done(_this, er, data);
+    });
+  } else {
+    done(this, null, null);
+  }
+}
+
+Transform.prototype.push = function (chunk, encoding) {
+  this._transformState.needTransform = false;
+  return Duplex.prototype.push.call(this, chunk, encoding);
+};
+
+// This is the part where you do stuff!
+// override this function in implementation classes.
+// 'chunk' is an input chunk.
+//
+// Call `push(newChunk)` to pass along transformed output
+// to the readable side.  You may call 'push' zero or more times.
+//
+// Call `cb(err)` when you are done with this chunk.  If you pass
+// an error, then that'll put the hurt on the whole operation.  If you
+// never call cb(), then you'll never get another chunk.
+Transform.prototype._transform = function (chunk, encoding, cb) {
+  throw new Error('_transform() is not implemented');
+};
+
+Transform.prototype._write = function (chunk, encoding, cb) {
+  var ts = this._transformState;
+  ts.writecb = cb;
+  ts.writechunk = chunk;
+  ts.writeencoding = encoding;
+  if (!ts.transforming) {
+    var rs = this._readableState;
+    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
+  }
+};
+
+// Doesn't matter what the args are here.
+// _transform does all the work.
+// That we got here means that the readable side wants more data.
+Transform.prototype._read = function (n) {
+  var ts = this._transformState;
+
+  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
+    ts.transforming = true;
+    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
+  } else {
+    // mark that we need a transform, so that any data that comes in
+    // will get processed, now that we've asked for it.
+    ts.needTransform = true;
+  }
+};
+
+Transform.prototype._destroy = function (err, cb) {
+  var _this2 = this;
+
+  Duplex.prototype._destroy.call(this, err, function (err2) {
+    cb(err2);
+    _this2.emit('close');
+  });
+};
+
+function done(stream, er, data) {
+  if (er) return stream.emit('error', er);
+
+  if (data != null) // single equals check for both `null` and `undefined`
+    stream.push(data);
+
+  // if there's nothing in the write buffer, then that means
+  // that nothing more will ever be provided
+  if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');
+
+  if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');
+
+  return stream.push(null);
+}
\ No newline at end of file
diff --git a/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/readable-stream/lib/_stream_writable.js
new file mode 100644
index 0000000..b0b0220
--- /dev/null
+++ b/node_modules/readable-stream/lib/_stream_writable.js
@@ -0,0 +1,687 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+// A bit simpler than readable streams.
+// Implement an async ._write(chunk, encoding, cb), and it'll handle all
+// the drain event emission and buffering.
+
+'use strict';
+
+/*<replacement>*/
+
+var pna = require('process-nextick-args');
+/*</replacement>*/
+
+module.exports = Writable;
+
+/* <replacement> */
+function WriteReq(chunk, encoding, cb) {
+  this.chunk = chunk;
+  this.encoding = encoding;
+  this.callback = cb;
+  this.next = null;
+}
+
+// It seems a linked list but it is not
+// there will be only 2 of these for each stream
+function CorkedRequest(state) {
+  var _this = this;
+
+  this.next = null;
+  this.entry = null;
+  this.finish = function () {
+    onCorkedFinish(_this, state);
+  };
+}
+/* </replacement> */
+
+/*<replacement>*/
+var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;
+/*</replacement>*/
+
+/*<replacement>*/
+var Duplex;
+/*</replacement>*/
+
+Writable.WritableState = WritableState;
+
+/*<replacement>*/
+var util = Object.create(require('core-util-is'));
+util.inherits = require('inherits');
+/*</replacement>*/
+
+/*<replacement>*/
+var internalUtil = {
+  deprecate: require('util-deprecate')
+};
+/*</replacement>*/
+
+/*<replacement>*/
+var Stream = require('./internal/streams/stream');
+/*</replacement>*/
+
+/*<replacement>*/
+
+var Buffer = require('safe-buffer').Buffer;
+var OurUint8Array = global.Uint8Array || function () {};
+function _uint8ArrayToBuffer(chunk) {
+  return Buffer.from(chunk);
+}
+function _isUint8Array(obj) {
+  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
+
+/*</replacement>*/
+
+var destroyImpl = require('./internal/streams/destroy');
+
+util.inherits(Writable, Stream);
+
+function nop() {}
+
+function WritableState(options, stream) {
+  Duplex = Duplex || require('./_stream_duplex');
+
+  options = options || {};
+
+  // Duplex streams are both readable and writable, but share
+  // the same options object.
+  // However, some cases require setting options to different
+  // values for the readable and the writable sides of the duplex stream.
+  // These options can be provided separately as readableXXX and writableXXX.
+  var isDuplex = stream instanceof Duplex;
+
+  // object stream flag to indicate whether or not this stream
+  // contains buffers or objects.
+  this.objectMode = !!options.objectMode;
+
+  if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
+
+  // the point at which write() starts returning false
+  // Note: 0 is a valid value, means that we always return false if
+  // the entire buffer is not flushed immediately on write()
+  var hwm = options.highWaterMark;
+  var writableHwm = options.writableHighWaterMark;
+  var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+
+  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;
+
+  // cast to ints.
+  this.highWaterMark = Math.floor(this.highWaterMark);
+
+  // if _final has been called
+  this.finalCalled = false;
+
+  // drain event flag.
+  this.needDrain = false;
+  // at the start of calling end()
+  this.ending = false;
+  // when end() has been called, and returned
+  this.ended = false;
+  // when 'finish' is emitted
+  this.finished = false;
+
+  // has it been destroyed
+  this.destroyed = false;
+
+  // should we decode strings into buffers before passing to _write?
+  // this is here so that some node-core streams can optimize string
+  // handling at a lower level.
+  var noDecode = options.decodeStrings === false;
+  this.decodeStrings = !noDecode;
+
+  // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+  this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+  // not an actual buffer we keep track of, but a measurement
+  // of how much we're waiting to get pushed to some underlying
+  // socket or file.
+  this.length = 0;
+
+  // a flag to see when we're in the middle of a write.
+  this.writing = false;
+
+  // when true all writes will be buffered until .uncork() call
+  this.corked = 0;
+
+  // a flag to be able to tell if the onwrite cb is called immediately,
+  // or on a later tick.  We set this to true at first, because any
+  // actions that shouldn't happen until "later" should generally also
+  // not happen before the first write call.
+  this.sync = true;
+
+  // a flag to know if we're processing previously buffered items, which
+  // may call the _write() callback in the same tick, so that we don't
+  // end up in an overlapped onwrite situation.
+  this.bufferProcessing = false;
+
+  // the callback that's passed to _write(chunk,cb)
+  this.onwrite = function (er) {
+    onwrite(stream, er);
+  };
+
+  // the callback that the user supplies to write(chunk,encoding,cb)
+  this.writecb = null;
+
+  // the amount that is being written when _write is called.
+  this.writelen = 0;
+
+  this.bufferedRequest = null;
+  this.lastBufferedRequest = null;
+
+  // number of pending user-supplied write callbacks
+  // this must be 0 before 'finish' can be emitted
+  this.pendingcb = 0;
+
+  // emit prefinish if the only thing we're waiting for is _write cbs
+  // This is relevant for synchronous Transform streams
+  this.prefinished = false;
+
+  // True if the error was already emitted and should not be thrown again
+  this.errorEmitted = false;
+
+  // count buffered requests
+  this.bufferedRequestCount = 0;
+
+  // allocate the first CorkedRequest, there is always
+  // one allocated and free to use, and we maintain at most two
+  this.corkedRequestsFree = new CorkedRequest(this);
+}
+
+WritableState.prototype.getBuffer = function getBuffer() {
+  var current = this.bufferedRequest;
+  var out = [];
+  while (current) {
+    out.push(current);
+    current = current.next;
+  }
+  return out;
+};
+
+(function () {
+  try {
+    Object.defineProperty(WritableState.prototype, 'buffer', {
+      get: internalUtil.deprecate(function () {
+        return this.getBuffer();
+      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
+    });
+  } catch (_) {}
+})();
+
+// Test _writableState for inheritance to account for Duplex streams,
+// whose prototype chain only points to Readable.
+var realHasInstance;
+if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
+  realHasInstance = Function.prototype[Symbol.hasInstance];
+  Object.defineProperty(Writable, Symbol.hasInstance, {
+    value: function (object) {
+      if (realHasInstance.call(this, object)) return true;
+      if (this !== Writable) return false;
+
+      return object && object._writableState instanceof WritableState;
+    }
+  });
+} else {
+  realHasInstance = function (object) {
+    return object instanceof this;
+  };
+}
+
+function Writable(options) {
+  Duplex = Duplex || require('./_stream_duplex');
+
+  // Writable ctor is applied to Duplexes, too.
+  // `realHasInstance` is necessary because using plain `instanceof`
+  // would return false, as no `_writableState` property is attached.
+
+  // Trying to use the custom `instanceof` for Writable here will also break the
+  // Node.js LazyTransform implementation, which has a non-trivial getter for
+  // `_writableState` that would lead to infinite recursion.
+  if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {
+    return new Writable(options);
+  }
+
+  this._writableState = new WritableState(options, this);
+
+  // legacy.
+  this.writable = true;
+
+  if (options) {
+    if (typeof options.write === 'function') this._write = options.write;
+
+    if (typeof options.writev === 'function') this._writev = options.writev;
+
+    if (typeof options.destroy === 'function') this._destroy = options.destroy;
+
+    if (typeof options.final === 'function') this._final = options.final;
+  }
+
+  Stream.call(this);
+}
+
+// Otherwise people can pipe Writable streams, which is just wrong.
+Writable.prototype.pipe = function () {
+  this.emit('error', new Error('Cannot pipe, not readable'));
+};
+
+function writeAfterEnd(stream, cb) {
+  var er = new Error('write after end');
+  // TODO: defer error events consistently everywhere, not just the cb
+  stream.emit('error', er);
+  pna.nextTick(cb, er);
+}
+
+// Checks that a user-supplied chunk is valid, especially for the particular
+// mode the stream is in. Currently this means that `null` is never accepted
+// and undefined/non-string values are only allowed in object mode.
+function validChunk(stream, state, chunk, cb) {
+  var valid = true;
+  var er = false;
+
+  if (chunk === null) {
+    er = new TypeError('May not write null values to stream');
+  } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+    er = new TypeError('Invalid non-string/buffer chunk');
+  }
+  if (er) {
+    stream.emit('error', er);
+    pna.nextTick(cb, er);
+    valid = false;
+  }
+  return valid;
+}
+
+Writable.prototype.write = function (chunk, encoding, cb) {
+  var state = this._writableState;
+  var ret = false;
+  var isBuf = !state.objectMode && _isUint8Array(chunk);
+
+  if (isBuf && !Buffer.isBuffer(chunk)) {
+    chunk = _uint8ArrayToBuffer(chunk);
+  }
+
+  if (typeof encoding === 'function') {
+    cb = encoding;
+    encoding = null;
+  }
+
+  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
+
+  if (typeof cb !== 'function') cb = nop;
+
+  if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
+    state.pendingcb++;
+    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
+  }
+
+  return ret;
+};
+
+Writable.prototype.cork = function () {
+  var state = this._writableState;
+
+  state.corked++;
+};
+
+Writable.prototype.uncork = function () {
+  var state = this._writableState;
+
+  if (state.corked) {
+    state.corked--;
+
+    if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
+  }
+};
+
+Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
+  // node::ParseEncoding() requires lower case.
+  if (typeof encoding === 'string') encoding = encoding.toLowerCase();
+  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
+  this._writableState.defaultEncoding = encoding;
+  return this;
+};
+
+function decodeChunk(state, chunk, encoding) {
+  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
+    chunk = Buffer.from(chunk, encoding);
+  }
+  return chunk;
+}
+
+Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function () {
+    return this._writableState.highWaterMark;
+  }
+});
+
+// if we're already writing something, then just put this
+// in the queue, and wait our turn.  Otherwise, call _write
+// If we return false, then we need a drain event, so set that flag.
+function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
+  if (!isBuf) {
+    var newChunk = decodeChunk(state, chunk, encoding);
+    if (chunk !== newChunk) {
+      isBuf = true;
+      encoding = 'buffer';
+      chunk = newChunk;
+    }
+  }
+  var len = state.objectMode ? 1 : chunk.length;
+
+  state.length += len;
+
+  var ret = state.length < state.highWaterMark;
+  // we must ensure that previous needDrain will not be reset to false.
+  if (!ret) state.needDrain = true;
+
+  if (state.writing || state.corked) {
+    var last = state.lastBufferedRequest;
+    state.lastBufferedRequest = {
+      chunk: chunk,
+      encoding: encoding,
+      isBuf: isBuf,
+      callback: cb,
+      next: null
+    };
+    if (last) {
+      last.next = state.lastBufferedRequest;
+    } else {
+      state.bufferedRequest = state.lastBufferedRequest;
+    }
+    state.bufferedRequestCount += 1;
+  } else {
+    doWrite(stream, state, false, len, chunk, encoding, cb);
+  }
+
+  return ret;
+}
+
+function doWrite(stream, state, writev, len, chunk, encoding, cb) {
+  state.writelen = len;
+  state.writecb = cb;
+  state.writing = true;
+  state.sync = true;
+  if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
+  state.sync = false;
+}
+
+function onwriteError(stream, state, sync, er, cb) {
+  --state.pendingcb;
+
+  if (sync) {
+    // defer the callback if we are being called synchronously
+    // to avoid piling up things on the stack
+    pna.nextTick(cb, er);
+    // this can emit finish, and it will always happen
+    // after error
+    pna.nextTick(finishMaybe, stream, state);
+    stream._writableState.errorEmitted = true;
+    stream.emit('error', er);
+  } else {
+    // the caller expect this to happen before if
+    // it is async
+    cb(er);
+    stream._writableState.errorEmitted = true;
+    stream.emit('error', er);
+    // this can emit finish, but finish must
+    // always follow error
+    finishMaybe(stream, state);
+  }
+}
+
+function onwriteStateUpdate(state) {
+  state.writing = false;
+  state.writecb = null;
+  state.length -= state.writelen;
+  state.writelen = 0;
+}
+
+function onwrite(stream, er) {
+  var state = stream._writableState;
+  var sync = state.sync;
+  var cb = state.writecb;
+
+  onwriteStateUpdate(state);
+
+  if (er) onwriteError(stream, state, sync, er, cb);else {
+    // Check if we're actually ready to finish, but don't emit yet
+    var finished = needFinish(state);
+
+    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
+      clearBuffer(stream, state);
+    }
+
+    if (sync) {
+      /*<replacement>*/
+      asyncWrite(afterWrite, stream, state, finished, cb);
+      /*</replacement>*/
+    } else {
+      afterWrite(stream, state, finished, cb);
+    }
+  }
+}
+
+function afterWrite(stream, state, finished, cb) {
+  if (!finished) onwriteDrain(stream, state);
+  state.pendingcb--;
+  cb();
+  finishMaybe(stream, state);
+}
+
+// Must force callback to be called on nextTick, so that we don't
+// emit 'drain' before the write() consumer gets the 'false' return
+// value, and has a chance to attach a 'drain' listener.
+function onwriteDrain(stream, state) {
+  if (state.length === 0 && state.needDrain) {
+    state.needDrain = false;
+    stream.emit('drain');
+  }
+}
+
+// if there's something in the buffer waiting, then process it
+function clearBuffer(stream, state) {
+  state.bufferProcessing = true;
+  var entry = state.bufferedRequest;
+
+  if (stream._writev && entry && entry.next) {
+    // Fast case, write everything using _writev()
+    var l = state.bufferedRequestCount;
+    var buffer = new Array(l);
+    var holder = state.corkedRequestsFree;
+    holder.entry = entry;
+
+    var count = 0;
+    var allBuffers = true;
+    while (entry) {
+      buffer[count] = entry;
+      if (!entry.isBuf) allBuffers = false;
+      entry = entry.next;
+      count += 1;
+    }
+    buffer.allBuffers = allBuffers;
+
+    doWrite(stream, state, true, state.length, buffer, '', holder.finish);
+
+    // doWrite is almost always async, defer these to save a bit of time
+    // as the hot path ends with doWrite
+    state.pendingcb++;
+    state.lastBufferedRequest = null;
+    if (holder.next) {
+      state.corkedRequestsFree = holder.next;
+      holder.next = null;
+    } else {
+      state.corkedRequestsFree = new CorkedRequest(state);
+    }
+    state.bufferedRequestCount = 0;
+  } else {
+    // Slow case, write chunks one-by-one
+    while (entry) {
+      var chunk = entry.chunk;
+      var encoding = entry.encoding;
+      var cb = entry.callback;
+      var len = state.objectMode ? 1 : chunk.length;
+
+      doWrite(stream, state, false, len, chunk, encoding, cb);
+      entry = entry.next;
+      state.bufferedRequestCount--;
+      // if we didn't call the onwrite immediately, then
+      // it means that we need to wait until it does.
+      // also, that means that the chunk and cb are currently
+      // being processed, so move the buffer counter past them.
+      if (state.writing) {
+        break;
+      }
+    }
+
+    if (entry === null) state.lastBufferedRequest = null;
+  }
+
+  state.bufferedRequest = entry;
+  state.bufferProcessing = false;
+}
+
+Writable.prototype._write = function (chunk, encoding, cb) {
+  cb(new Error('_write() is not implemented'));
+};
+
+Writable.prototype._writev = null;
+
+Writable.prototype.end = function (chunk, encoding, cb) {
+  var state = this._writableState;
+
+  if (typeof chunk === 'function') {
+    cb = chunk;
+    chunk = null;
+    encoding = null;
+  } else if (typeof encoding === 'function') {
+    cb = encoding;
+    encoding = null;
+  }
+
+  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
+
+  // .end() fully uncorks
+  if (state.corked) {
+    state.corked = 1;
+    this.uncork();
+  }
+
+  // ignore unnecessary end() calls.
+  if (!state.ending && !state.finished) endWritable(this, state, cb);
+};
+
+function needFinish(state) {
+  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
+}
+function callFinal(stream, state) {
+  stream._final(function (err) {
+    state.pendingcb--;
+    if (err) {
+      stream.emit('error', err);
+    }
+    state.prefinished = true;
+    stream.emit('prefinish');
+    finishMaybe(stream, state);
+  });
+}
+function prefinish(stream, state) {
+  if (!state.prefinished && !state.finalCalled) {
+    if (typeof stream._final === 'function') {
+      state.pendingcb++;
+      state.finalCalled = true;
+      pna.nextTick(callFinal, stream, state);
+    } else {
+      state.prefinished = true;
+      stream.emit('prefinish');
+    }
+  }
+}
+
+function finishMaybe(stream, state) {
+  var need = needFinish(state);
+  if (need) {
+    prefinish(stream, state);
+    if (state.pendingcb === 0) {
+      state.finished = true;
+      stream.emit('finish');
+    }
+  }
+  return need;
+}
+
+function endWritable(stream, state, cb) {
+  state.ending = true;
+  finishMaybe(stream, state);
+  if (cb) {
+    if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);
+  }
+  state.ended = true;
+  stream.writable = false;
+}
+
+function onCorkedFinish(corkReq, state, err) {
+  var entry = corkReq.entry;
+  corkReq.entry = null;
+  while (entry) {
+    var cb = entry.callback;
+    state.pendingcb--;
+    cb(err);
+    entry = entry.next;
+  }
+  if (state.corkedRequestsFree) {
+    state.corkedRequestsFree.next = corkReq;
+  } else {
+    state.corkedRequestsFree = corkReq;
+  }
+}
+
+Object.defineProperty(Writable.prototype, 'destroyed', {
+  get: function () {
+    if (this._writableState === undefined) {
+      return false;
+    }
+    return this._writableState.destroyed;
+  },
+  set: function (value) {
+    // we ignore the value if the stream
+    // has not been initialized yet
+    if (!this._writableState) {
+      return;
+    }
+
+    // backward compatibility, the user is explicitly
+    // managing destroyed
+    this._writableState.destroyed = value;
+  }
+});
+
+Writable.prototype.destroy = destroyImpl.destroy;
+Writable.prototype._undestroy = destroyImpl.undestroy;
+Writable.prototype._destroy = function (err, cb) {
+  this.end();
+  cb(err);
+};
\ No newline at end of file
diff --git a/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/readable-stream/lib/internal/streams/BufferList.js
new file mode 100644
index 0000000..aefc68b
--- /dev/null
+++ b/node_modules/readable-stream/lib/internal/streams/BufferList.js
@@ -0,0 +1,79 @@
+'use strict';
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var Buffer = require('safe-buffer').Buffer;
+var util = require('util');
+
+function copyBuffer(src, target, offset) {
+  src.copy(target, offset);
+}
+
+module.exports = function () {
+  function BufferList() {
+    _classCallCheck(this, BufferList);
+
+    this.head = null;
+    this.tail = null;
+    this.length = 0;
+  }
+
+  BufferList.prototype.push = function push(v) {
+    var entry = { data: v, next: null };
+    if (this.length > 0) this.tail.next = entry;else this.head = entry;
+    this.tail = entry;
+    ++this.length;
+  };
+
+  BufferList.prototype.unshift = function unshift(v) {
+    var entry = { data: v, next: this.head };
+    if (this.length === 0) this.tail = entry;
+    this.head = entry;
+    ++this.length;
+  };
+
+  BufferList.prototype.shift = function shift() {
+    if (this.length === 0) return;
+    var ret = this.head.data;
+    if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
+    --this.length;
+    return ret;
+  };
+
+  BufferList.prototype.clear = function clear() {
+    this.head = this.tail = null;
+    this.length = 0;
+  };
+
+  BufferList.prototype.join = function join(s) {
+    if (this.length === 0) return '';
+    var p = this.head;
+    var ret = '' + p.data;
+    while (p = p.next) {
+      ret += s + p.data;
+    }return ret;
+  };
+
+  BufferList.prototype.concat = function concat(n) {
+    if (this.length === 0) return Buffer.alloc(0);
+    if (this.length === 1) return this.head.data;
+    var ret = Buffer.allocUnsafe(n >>> 0);
+    var p = this.head;
+    var i = 0;
+    while (p) {
+      copyBuffer(p.data, ret, i);
+      i += p.data.length;
+      p = p.next;
+    }
+    return ret;
+  };
+
+  return BufferList;
+}();
+
+if (util && util.inspect && util.inspect.custom) {
+  module.exports.prototype[util.inspect.custom] = function () {
+    var obj = util.inspect({ length: this.length });
+    return this.constructor.name + ' ' + obj;
+  };
+}
\ No newline at end of file
diff --git a/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/readable-stream/lib/internal/streams/destroy.js
new file mode 100644
index 0000000..5a0a0d8
--- /dev/null
+++ b/node_modules/readable-stream/lib/internal/streams/destroy.js
@@ -0,0 +1,74 @@
+'use strict';
+
+/*<replacement>*/
+
+var pna = require('process-nextick-args');
+/*</replacement>*/
+
+// undocumented cb() API, needed for core, not for public API
+function destroy(err, cb) {
+  var _this = this;
+
+  var readableDestroyed = this._readableState && this._readableState.destroyed;
+  var writableDestroyed = this._writableState && this._writableState.destroyed;
+
+  if (readableDestroyed || writableDestroyed) {
+    if (cb) {
+      cb(err);
+    } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {
+      pna.nextTick(emitErrorNT, this, err);
+    }
+    return this;
+  }
+
+  // we set destroyed to true before firing error callbacks in order
+  // to make it re-entrance safe in case destroy() is called within callbacks
+
+  if (this._readableState) {
+    this._readableState.destroyed = true;
+  }
+
+  // if this is a duplex stream mark the writable part as destroyed as well
+  if (this._writableState) {
+    this._writableState.destroyed = true;
+  }
+
+  this._destroy(err || null, function (err) {
+    if (!cb && err) {
+      pna.nextTick(emitErrorNT, _this, err);
+      if (_this._writableState) {
+        _this._writableState.errorEmitted = true;
+      }
+    } else if (cb) {
+      cb(err);
+    }
+  });
+
+  return this;
+}
+
+function undestroy() {
+  if (this._readableState) {
+    this._readableState.destroyed = false;
+    this._readableState.reading = false;
+    this._readableState.ended = false;
+    this._readableState.endEmitted = false;
+  }
+
+  if (this._writableState) {
+    this._writableState.destroyed = false;
+    this._writableState.ended = false;
+    this._writableState.ending = false;
+    this._writableState.finished = false;
+    this._writableState.errorEmitted = false;
+  }
+}
+
+function emitErrorNT(self, err) {
+  self.emit('error', err);
+}
+
+module.exports = {
+  destroy: destroy,
+  undestroy: undestroy
+};
\ No newline at end of file
diff --git a/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/readable-stream/lib/internal/streams/stream-browser.js
new file mode 100644
index 0000000..9332a3f
--- /dev/null
+++ b/node_modules/readable-stream/lib/internal/streams/stream-browser.js
@@ -0,0 +1 @@
+module.exports = require('events').EventEmitter;
diff --git a/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/readable-stream/lib/internal/streams/stream.js
new file mode 100644
index 0000000..ce2ad5b
--- /dev/null
+++ b/node_modules/readable-stream/lib/internal/streams/stream.js
@@ -0,0 +1 @@
+module.exports = require('stream');
diff --git a/node_modules/readable-stream/package.json b/node_modules/readable-stream/package.json
new file mode 100644
index 0000000..0afcd09
--- /dev/null
+++ b/node_modules/readable-stream/package.json
@@ -0,0 +1,81 @@
+{
+  "_from": "readable-stream@^2.0.6",
+  "_id": "readable-stream@2.3.7",
+  "_inBundle": false,
+  "_integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+  "_location": "/readable-stream",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "readable-stream@^2.0.6",
+    "name": "readable-stream",
+    "escapedName": "readable-stream",
+    "rawSpec": "^2.0.6",
+    "saveSpec": null,
+    "fetchSpec": "^2.0.6"
+  },
+  "_requiredBy": [
+    "/are-we-there-yet"
+  ],
+  "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+  "_shasum": "1eca1cf711aef814c04f62252a36a62f6cb23b57",
+  "_spec": "readable-stream@^2.0.6",
+  "_where": "F:\\vent-display\\node_modules\\are-we-there-yet",
+  "browser": {
+    "util": false,
+    "./readable.js": "./readable-browser.js",
+    "./writable.js": "./writable-browser.js",
+    "./duplex.js": "./duplex-browser.js",
+    "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js"
+  },
+  "bugs": {
+    "url": "https://github.com/nodejs/readable-stream/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "core-util-is": "~1.0.0",
+    "inherits": "~2.0.3",
+    "isarray": "~1.0.0",
+    "process-nextick-args": "~2.0.0",
+    "safe-buffer": "~5.1.1",
+    "string_decoder": "~1.1.1",
+    "util-deprecate": "~1.0.1"
+  },
+  "deprecated": false,
+  "description": "Streams3, a user-land copy of the stream library from Node.js",
+  "devDependencies": {
+    "assert": "^1.4.0",
+    "babel-polyfill": "^6.9.1",
+    "buffer": "^4.9.0",
+    "lolex": "^2.3.2",
+    "nyc": "^6.4.0",
+    "tap": "^0.7.0",
+    "tape": "^4.8.0"
+  },
+  "homepage": "https://github.com/nodejs/readable-stream#readme",
+  "keywords": [
+    "readable",
+    "stream",
+    "pipe"
+  ],
+  "license": "MIT",
+  "main": "readable.js",
+  "name": "readable-stream",
+  "nyc": {
+    "include": [
+      "lib/**.js"
+    ]
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/nodejs/readable-stream.git"
+  },
+  "scripts": {
+    "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js",
+    "cover": "nyc npm test",
+    "report": "nyc report --reporter=lcov",
+    "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js"
+  },
+  "version": "2.3.7"
+}
diff --git a/node_modules/readable-stream/passthrough.js b/node_modules/readable-stream/passthrough.js
new file mode 100644
index 0000000..ffd791d
--- /dev/null
+++ b/node_modules/readable-stream/passthrough.js
@@ -0,0 +1 @@
+module.exports = require('./readable').PassThrough
diff --git a/node_modules/readable-stream/readable-browser.js b/node_modules/readable-stream/readable-browser.js
new file mode 100644
index 0000000..e503725
--- /dev/null
+++ b/node_modules/readable-stream/readable-browser.js
@@ -0,0 +1,7 @@
+exports = module.exports = require('./lib/_stream_readable.js');
+exports.Stream = exports;
+exports.Readable = exports;
+exports.Writable = require('./lib/_stream_writable.js');
+exports.Duplex = require('./lib/_stream_duplex.js');
+exports.Transform = require('./lib/_stream_transform.js');
+exports.PassThrough = require('./lib/_stream_passthrough.js');
diff --git a/node_modules/readable-stream/readable.js b/node_modules/readable-stream/readable.js
new file mode 100644
index 0000000..ec89ec5
--- /dev/null
+++ b/node_modules/readable-stream/readable.js
@@ -0,0 +1,19 @@
+var Stream = require('stream');
+if (process.env.READABLE_STREAM === 'disable' && Stream) {
+  module.exports = Stream;
+  exports = module.exports = Stream.Readable;
+  exports.Readable = Stream.Readable;
+  exports.Writable = Stream.Writable;
+  exports.Duplex = Stream.Duplex;
+  exports.Transform = Stream.Transform;
+  exports.PassThrough = Stream.PassThrough;
+  exports.Stream = Stream;
+} else {
+  exports = module.exports = require('./lib/_stream_readable.js');
+  exports.Stream = Stream || exports;
+  exports.Readable = exports;
+  exports.Writable = require('./lib/_stream_writable.js');
+  exports.Duplex = require('./lib/_stream_duplex.js');
+  exports.Transform = require('./lib/_stream_transform.js');
+  exports.PassThrough = require('./lib/_stream_passthrough.js');
+}
diff --git a/node_modules/readable-stream/transform.js b/node_modules/readable-stream/transform.js
new file mode 100644
index 0000000..b1baba2
--- /dev/null
+++ b/node_modules/readable-stream/transform.js
@@ -0,0 +1 @@
+module.exports = require('./readable').Transform
diff --git a/node_modules/readable-stream/writable-browser.js b/node_modules/readable-stream/writable-browser.js
new file mode 100644
index 0000000..ebdde6a
--- /dev/null
+++ b/node_modules/readable-stream/writable-browser.js
@@ -0,0 +1 @@
+module.exports = require('./lib/_stream_writable.js');
diff --git a/node_modules/readable-stream/writable.js b/node_modules/readable-stream/writable.js
new file mode 100644
index 0000000..3211a6f
--- /dev/null
+++ b/node_modules/readable-stream/writable.js
@@ -0,0 +1,8 @@
+var Stream = require("stream")
+var Writable = require("./lib/_stream_writable.js")
+
+if (process.env.READABLE_STREAM === 'disable') {
+  module.exports = Stream && Stream.Writable || Writable
+} else {
+  module.exports = Writable
+}
diff --git a/node_modules/safe-buffer/LICENSE b/node_modules/safe-buffer/LICENSE
new file mode 100644
index 0000000..0c068ce
--- /dev/null
+++ b/node_modules/safe-buffer/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Feross Aboukhadijeh
+
+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/safe-buffer/README.md b/node_modules/safe-buffer/README.md
new file mode 100644
index 0000000..e9a81af
--- /dev/null
+++ b/node_modules/safe-buffer/README.md
@@ -0,0 +1,584 @@
+# safe-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url]
+
+[travis-image]: https://img.shields.io/travis/feross/safe-buffer/master.svg
+[travis-url]: https://travis-ci.org/feross/safe-buffer
+[npm-image]: https://img.shields.io/npm/v/safe-buffer.svg
+[npm-url]: https://npmjs.org/package/safe-buffer
+[downloads-image]: https://img.shields.io/npm/dm/safe-buffer.svg
+[downloads-url]: https://npmjs.org/package/safe-buffer
+[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg
+[standard-url]: https://standardjs.com
+
+#### Safer Node.js Buffer API
+
+**Use the new Node.js Buffer APIs (`Buffer.from`, `Buffer.alloc`,
+`Buffer.allocUnsafe`, `Buffer.allocUnsafeSlow`) in all versions of Node.js.**
+
+**Uses the built-in implementation when available.**
+
+## install
+
+```
+npm install safe-buffer
+```
+
+## usage
+
+The goal of this package is to provide a safe replacement for the node.js `Buffer`.
+
+It's a drop-in replacement for `Buffer`. You can use it by adding one `require` line to
+the top of your node.js modules:
+
+```js
+var Buffer = require('safe-buffer').Buffer
+
+// Existing buffer code will continue to work without issues:
+
+new Buffer('hey', 'utf8')
+new Buffer([1, 2, 3], 'utf8')
+new Buffer(obj)
+new Buffer(16) // create an uninitialized buffer (potentially unsafe)
+
+// But you can use these new explicit APIs to make clear what you want:
+
+Buffer.from('hey', 'utf8') // convert from many types to a Buffer
+Buffer.alloc(16) // create a zero-filled buffer (safe)
+Buffer.allocUnsafe(16) // create an uninitialized buffer (potentially unsafe)
+```
+
+## api
+
+### Class Method: Buffer.from(array)
+<!-- YAML
+added: v3.0.0
+-->
+
+* `array` {Array}
+
+Allocates a new `Buffer` using an `array` of octets.
+
+```js
+const buf = Buffer.from([0x62,0x75,0x66,0x66,0x65,0x72]);
+  // creates a new Buffer containing ASCII bytes
+  // ['b','u','f','f','e','r']
+```
+
+A `TypeError` will be thrown if `array` is not an `Array`.
+
+### Class Method: Buffer.from(arrayBuffer[, byteOffset[, length]])
+<!-- YAML
+added: v5.10.0
+-->
+
+* `arrayBuffer` {ArrayBuffer} The `.buffer` property of a `TypedArray` or
+  a `new ArrayBuffer()`
+* `byteOffset` {Number} Default: `0`
+* `length` {Number} Default: `arrayBuffer.length - byteOffset`
+
+When passed a reference to the `.buffer` property of a `TypedArray` instance,
+the newly created `Buffer` will share the same allocated memory as the
+TypedArray.
+
+```js
+const arr = new Uint16Array(2);
+arr[0] = 5000;
+arr[1] = 4000;
+
+const buf = Buffer.from(arr.buffer); // shares the memory with arr;
+
+console.log(buf);
+  // Prints: <Buffer 88 13 a0 0f>
+
+// changing the TypedArray changes the Buffer also
+arr[1] = 6000;
+
+console.log(buf);
+  // Prints: <Buffer 88 13 70 17>
+```
+
+The optional `byteOffset` and `length` arguments specify a memory range within
+the `arrayBuffer` that will be shared by the `Buffer`.
+
+```js
+const ab = new ArrayBuffer(10);
+const buf = Buffer.from(ab, 0, 2);
+console.log(buf.length);
+  // Prints: 2
+```
+
+A `TypeError` will be thrown if `arrayBuffer` is not an `ArrayBuffer`.
+
+### Class Method: Buffer.from(buffer)
+<!-- YAML
+added: v3.0.0
+-->
+
+* `buffer` {Buffer}
+
+Copies the passed `buffer` data onto a new `Buffer` instance.
+
+```js
+const buf1 = Buffer.from('buffer');
+const buf2 = Buffer.from(buf1);
+
+buf1[0] = 0x61;
+console.log(buf1.toString());
+  // 'auffer'
+console.log(buf2.toString());
+  // 'buffer' (copy is not changed)
+```
+
+A `TypeError` will be thrown if `buffer` is not a `Buffer`.
+
+### Class Method: Buffer.from(str[, encoding])
+<!-- YAML
+added: v5.10.0
+-->
+
+* `str` {String} String to encode.
+* `encoding` {String} Encoding to use, Default: `'utf8'`
+
+Creates a new `Buffer` containing the given JavaScript string `str`. If
+provided, the `encoding` parameter identifies the character encoding.
+If not provided, `encoding` defaults to `'utf8'`.
+
+```js
+const buf1 = Buffer.from('this is a tést');
+console.log(buf1.toString());
+  // prints: this is a tést
+console.log(buf1.toString('ascii'));
+  // prints: this is a tC)st
+
+const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex');
+console.log(buf2.toString());
+  // prints: this is a tést
+```
+
+A `TypeError` will be thrown if `str` is not a string.
+
+### Class Method: Buffer.alloc(size[, fill[, encoding]])
+<!-- YAML
+added: v5.10.0
+-->
+
+* `size` {Number}
+* `fill` {Value} Default: `undefined`
+* `encoding` {String} Default: `utf8`
+
+Allocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the
+`Buffer` will be *zero-filled*.
+
+```js
+const buf = Buffer.alloc(5);
+console.log(buf);
+  // <Buffer 00 00 00 00 00>
+```
+
+The `size` must be less than or equal to the value of
+`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is
+`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will
+be created if a `size` less than or equal to 0 is specified.
+
+If `fill` is specified, the allocated `Buffer` will be initialized by calling
+`buf.fill(fill)`. See [`buf.fill()`][] for more information.
+
+```js
+const buf = Buffer.alloc(5, 'a');
+console.log(buf);
+  // <Buffer 61 61 61 61 61>
+```
+
+If both `fill` and `encoding` are specified, the allocated `Buffer` will be
+initialized by calling `buf.fill(fill, encoding)`. For example:
+
+```js
+const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
+console.log(buf);
+  // <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>
+```
+
+Calling `Buffer.alloc(size)` can be significantly slower than the alternative
+`Buffer.allocUnsafe(size)` but ensures that the newly created `Buffer` instance
+contents will *never contain sensitive data*.
+
+A `TypeError` will be thrown if `size` is not a number.
+
+### Class Method: Buffer.allocUnsafe(size)
+<!-- YAML
+added: v5.10.0
+-->
+
+* `size` {Number}
+
+Allocates a new *non-zero-filled* `Buffer` of `size` bytes.  The `size` must
+be less than or equal to the value of `require('buffer').kMaxLength` (on 64-bit
+architectures, `kMaxLength` is `(2^31)-1`). Otherwise, a [`RangeError`][] is
+thrown. A zero-length Buffer will be created if a `size` less than or equal to
+0 is specified.
+
+The underlying memory for `Buffer` instances created in this way is *not
+initialized*. The contents of the newly created `Buffer` are unknown and
+*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such
+`Buffer` instances to zeroes.
+
+```js
+const buf = Buffer.allocUnsafe(5);
+console.log(buf);
+  // <Buffer 78 e0 82 02 01>
+  // (octets will be different, every time)
+buf.fill(0);
+console.log(buf);
+  // <Buffer 00 00 00 00 00>
+```
+
+A `TypeError` will be thrown if `size` is not a number.
+
+Note that the `Buffer` module pre-allocates an internal `Buffer` instance of
+size `Buffer.poolSize` that is used as a pool for the fast allocation of new
+`Buffer` instances created using `Buffer.allocUnsafe(size)` (and the deprecated
+`new Buffer(size)` constructor) only when `size` is less than or equal to
+`Buffer.poolSize >> 1` (floor of `Buffer.poolSize` divided by two). The default
+value of `Buffer.poolSize` is `8192` but can be modified.
+
+Use of this pre-allocated internal memory pool is a key difference between
+calling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`.
+Specifically, `Buffer.alloc(size, fill)` will *never* use the internal Buffer
+pool, while `Buffer.allocUnsafe(size).fill(fill)` *will* use the internal
+Buffer pool if `size` is less than or equal to half `Buffer.poolSize`. The
+difference is subtle but can be important when an application requires the
+additional performance that `Buffer.allocUnsafe(size)` provides.
+
+### Class Method: Buffer.allocUnsafeSlow(size)
+<!-- YAML
+added: v5.10.0
+-->
+
+* `size` {Number}
+
+Allocates a new *non-zero-filled* and non-pooled `Buffer` of `size` bytes.  The
+`size` must be less than or equal to the value of
+`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is
+`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will
+be created if a `size` less than or equal to 0 is specified.
+
+The underlying memory for `Buffer` instances created in this way is *not
+initialized*. The contents of the newly created `Buffer` are unknown and
+*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such
+`Buffer` instances to zeroes.
+
+When using `Buffer.allocUnsafe()` to allocate new `Buffer` instances,
+allocations under 4KB are, by default, sliced from a single pre-allocated
+`Buffer`. This allows applications to avoid the garbage collection overhead of
+creating many individually allocated Buffers. This approach improves both
+performance and memory usage by eliminating the need to track and cleanup as
+many `Persistent` objects.
+
+However, in the case where a developer may need to retain a small chunk of
+memory from a pool for an indeterminate amount of time, it may be appropriate
+to create an un-pooled Buffer instance using `Buffer.allocUnsafeSlow()` then
+copy out the relevant bits.
+
+```js
+// need to keep around a few small chunks of memory
+const store = [];
+
+socket.on('readable', () => {
+  const data = socket.read();
+  // allocate for retained data
+  const sb = Buffer.allocUnsafeSlow(10);
+  // copy the data into the new allocation
+  data.copy(sb, 0, 0, 10);
+  store.push(sb);
+});
+```
+
+Use of `Buffer.allocUnsafeSlow()` should be used only as a last resort *after*
+a developer has observed undue memory retention in their applications.
+
+A `TypeError` will be thrown if `size` is not a number.
+
+### All the Rest
+
+The rest of the `Buffer` API is exactly the same as in node.js.
+[See the docs](https://nodejs.org/api/buffer.html).
+
+
+## Related links
+
+- [Node.js issue: Buffer(number) is unsafe](https://github.com/nodejs/node/issues/4660)
+- [Node.js Enhancement Proposal: Buffer.from/Buffer.alloc/Buffer.zalloc/Buffer() soft-deprecate](https://github.com/nodejs/node-eps/pull/4)
+
+## Why is `Buffer` unsafe?
+
+Today, the node.js `Buffer` constructor is overloaded to handle many different argument
+types like `String`, `Array`, `Object`, `TypedArrayView` (`Uint8Array`, etc.),
+`ArrayBuffer`, and also `Number`.
+
+The API is optimized for convenience: you can throw any type at it, and it will try to do
+what you want.
+
+Because the Buffer constructor is so powerful, you often see code like this:
+
+```js
+// Convert UTF-8 strings to hex
+function toHex (str) {
+  return new Buffer(str).toString('hex')
+}
+```
+
+***But what happens if `toHex` is called with a `Number` argument?***
+
+### Remote Memory Disclosure
+
+If an attacker can make your program call the `Buffer` constructor with a `Number`
+argument, then they can make it allocate uninitialized memory from the node.js process.
+This could potentially disclose TLS private keys, user data, or database passwords.
+
+When the `Buffer` constructor is passed a `Number` argument, it returns an
+**UNINITIALIZED** block of memory of the specified `size`. When you create a `Buffer` like
+this, you **MUST** overwrite the contents before returning it to the user.
+
+From the [node.js docs](https://nodejs.org/api/buffer.html#buffer_new_buffer_size):
+
+> `new Buffer(size)`
+>
+> - `size` Number
+>
+> The underlying memory for `Buffer` instances created in this way is not initialized.
+> **The contents of a newly created `Buffer` are unknown and could contain sensitive
+> data.** Use `buf.fill(0)` to initialize a Buffer to zeroes.
+
+(Emphasis our own.)
+
+Whenever the programmer intended to create an uninitialized `Buffer` you often see code
+like this:
+
+```js
+var buf = new Buffer(16)
+
+// Immediately overwrite the uninitialized buffer with data from another buffer
+for (var i = 0; i < buf.length; i++) {
+  buf[i] = otherBuf[i]
+}
+```
+
+
+### Would this ever be a problem in real code?
+
+Yes. It's surprisingly common to forget to check the type of your variables in a
+dynamically-typed language like JavaScript.
+
+Usually the consequences of assuming the wrong type is that your program crashes with an
+uncaught exception. But the failure mode for forgetting to check the type of arguments to
+the `Buffer` constructor is more catastrophic.
+
+Here's an example of a vulnerable service that takes a JSON payload and converts it to
+hex:
+
+```js
+// Take a JSON payload {str: "some string"} and convert it to hex
+var server = http.createServer(function (req, res) {
+  var data = ''
+  req.setEncoding('utf8')
+  req.on('data', function (chunk) {
+    data += chunk
+  })
+  req.on('end', function () {
+    var body = JSON.parse(data)
+    res.end(new Buffer(body.str).toString('hex'))
+  })
+})
+
+server.listen(8080)
+```
+
+In this example, an http client just has to send:
+
+```json
+{
+  "str": 1000
+}
+```
+
+and it will get back 1,000 bytes of uninitialized memory from the server.
+
+This is a very serious bug. It's similar in severity to the
+[the Heartbleed bug](http://heartbleed.com/) that allowed disclosure of OpenSSL process
+memory by remote attackers.
+
+
+### Which real-world packages were vulnerable?
+
+#### [`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht)
+
+[Mathias Buus](https://github.com/mafintosh) and I
+([Feross Aboukhadijeh](http://feross.org/)) found this issue in one of our own packages,
+[`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht). The bug would allow
+anyone on the internet to send a series of messages to a user of `bittorrent-dht` and get
+them to reveal 20 bytes at a time of uninitialized memory from the node.js process.
+
+Here's
+[the commit](https://github.com/feross/bittorrent-dht/commit/6c7da04025d5633699800a99ec3fbadf70ad35b8)
+that fixed it. We released a new fixed version, created a
+[Node Security Project disclosure](https://nodesecurity.io/advisories/68), and deprecated all
+vulnerable versions on npm so users will get a warning to upgrade to a newer version.
+
+#### [`ws`](https://www.npmjs.com/package/ws)
+
+That got us wondering if there were other vulnerable packages. Sure enough, within a short
+period of time, we found the same issue in [`ws`](https://www.npmjs.com/package/ws), the
+most popular WebSocket implementation in node.js.
+
+If certain APIs were called with `Number` parameters instead of `String` or `Buffer` as
+expected, then uninitialized server memory would be disclosed to the remote peer.
+
+These were the vulnerable methods:
+
+```js
+socket.send(number)
+socket.ping(number)
+socket.pong(number)
+```
+
+Here's a vulnerable socket server with some echo functionality:
+
+```js
+server.on('connection', function (socket) {
+  socket.on('message', function (message) {
+    message = JSON.parse(message)
+    if (message.type === 'echo') {
+      socket.send(message.data) // send back the user's message
+    }
+  })
+})
+```
+
+`socket.send(number)` called on the server, will disclose server memory.
+
+Here's [the release](https://github.com/websockets/ws/releases/tag/1.0.1) where the issue
+was fixed, with a more detailed explanation. Props to
+[Arnout Kazemier](https://github.com/3rd-Eden) for the quick fix. Here's the
+[Node Security Project disclosure](https://nodesecurity.io/advisories/67).
+
+
+### What's the solution?
+
+It's important that node.js offers a fast way to get memory otherwise performance-critical
+applications would needlessly get a lot slower.
+
+But we need a better way to *signal our intent* as programmers. **When we want
+uninitialized memory, we should request it explicitly.**
+
+Sensitive functionality should not be packed into a developer-friendly API that loosely
+accepts many different types. This type of API encourages the lazy practice of passing
+variables in without checking the type very carefully.
+
+#### A new API: `Buffer.allocUnsafe(number)`
+
+The functionality of creating buffers with uninitialized memory should be part of another
+API. We propose `Buffer.allocUnsafe(number)`. This way, it's not part of an API that
+frequently gets user input of all sorts of different types passed into it.
+
+```js
+var buf = Buffer.allocUnsafe(16) // careful, uninitialized memory!
+
+// Immediately overwrite the uninitialized buffer with data from another buffer
+for (var i = 0; i < buf.length; i++) {
+  buf[i] = otherBuf[i]
+}
+```
+
+
+### How do we fix node.js core?
+
+We sent [a PR to node.js core](https://github.com/nodejs/node/pull/4514) (merged as
+`semver-major`) which defends against one case:
+
+```js
+var str = 16
+new Buffer(str, 'utf8')
+```
+
+In this situation, it's implied that the programmer intended the first argument to be a
+string, since they passed an encoding as a second argument. Today, node.js will allocate
+uninitialized memory in the case of `new Buffer(number, encoding)`, which is probably not
+what the programmer intended.
+
+But this is only a partial solution, since if the programmer does `new Buffer(variable)`
+(without an `encoding` parameter) there's no way to know what they intended. If `variable`
+is sometimes a number, then uninitialized memory will sometimes be returned.
+
+### What's the real long-term fix?
+
+We could deprecate and remove `new Buffer(number)` and use `Buffer.allocUnsafe(number)` when
+we need uninitialized memory. But that would break 1000s of packages.
+
+~~We believe the best solution is to:~~
+
+~~1. Change `new Buffer(number)` to return safe, zeroed-out memory~~
+
+~~2. Create a new API for creating uninitialized Buffers. We propose: `Buffer.allocUnsafe(number)`~~
+
+#### Update
+
+We now support adding three new APIs:
+
+- `Buffer.from(value)` - convert from any type to a buffer
+- `Buffer.alloc(size)` - create a zero-filled buffer
+- `Buffer.allocUnsafe(size)` - create an uninitialized buffer with given size
+
+This solves the core problem that affected `ws` and `bittorrent-dht` which is
+`Buffer(variable)` getting tricked into taking a number argument.
+
+This way, existing code continues working and the impact on the npm ecosystem will be
+minimal. Over time, npm maintainers can migrate performance-critical code to use
+`Buffer.allocUnsafe(number)` instead of `new Buffer(number)`.
+
+
+### Conclusion
+
+We think there's a serious design issue with the `Buffer` API as it exists today. It
+promotes insecure software by putting high-risk functionality into a convenient API
+with friendly "developer ergonomics".
+
+This wasn't merely a theoretical exercise because we found the issue in some of the
+most popular npm packages.
+
+Fortunately, there's an easy fix that can be applied today. Use `safe-buffer` in place of
+`buffer`.
+
+```js
+var Buffer = require('safe-buffer').Buffer
+```
+
+Eventually, we hope that node.js core can switch to this new, safer behavior. We believe
+the impact on the ecosystem would be minimal since it's not a breaking change.
+Well-maintained, popular packages would be updated to use `Buffer.alloc` quickly, while
+older, insecure packages would magically become safe from this attack vector.
+
+
+## links
+
+- [Node.js PR: buffer: throw if both length and enc are passed](https://github.com/nodejs/node/pull/4514)
+- [Node Security Project disclosure for `ws`](https://nodesecurity.io/advisories/67)
+- [Node Security Project disclosure for`bittorrent-dht`](https://nodesecurity.io/advisories/68)
+
+
+## credit
+
+The original issues in `bittorrent-dht`
+([disclosure](https://nodesecurity.io/advisories/68)) and
+`ws` ([disclosure](https://nodesecurity.io/advisories/67)) were discovered by
+[Mathias Buus](https://github.com/mafintosh) and
+[Feross Aboukhadijeh](http://feross.org/).
+
+Thanks to [Adam Baldwin](https://github.com/evilpacket) for helping disclose these issues
+and for his work running the [Node Security Project](https://nodesecurity.io/).
+
+Thanks to [John Hiesey](https://github.com/jhiesey) for proofreading this README and
+auditing the code.
+
+
+## license
+
+MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org)
diff --git a/node_modules/safe-buffer/index.d.ts b/node_modules/safe-buffer/index.d.ts
new file mode 100644
index 0000000..e9fed80
--- /dev/null
+++ b/node_modules/safe-buffer/index.d.ts
@@ -0,0 +1,187 @@
+declare module "safe-buffer" {
+  export class Buffer {
+    length: number
+    write(string: string, offset?: number, length?: number, encoding?: string): number;
+    toString(encoding?: string, start?: number, end?: number): string;
+    toJSON(): { type: 'Buffer', data: any[] };
+    equals(otherBuffer: Buffer): boolean;
+    compare(otherBuffer: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number;
+    copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number;
+    slice(start?: number, end?: number): Buffer;
+    writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
+    writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
+    writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
+    writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number;
+    readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number;
+    readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number;
+    readIntLE(offset: number, byteLength: number, noAssert?: boolean): number;
+    readIntBE(offset: number, byteLength: number, noAssert?: boolean): number;
+    readUInt8(offset: number, noAssert?: boolean): number;
+    readUInt16LE(offset: number, noAssert?: boolean): number;
+    readUInt16BE(offset: number, noAssert?: boolean): number;
+    readUInt32LE(offset: number, noAssert?: boolean): number;
+    readUInt32BE(offset: number, noAssert?: boolean): number;
+    readInt8(offset: number, noAssert?: boolean): number;
+    readInt16LE(offset: number, noAssert?: boolean): number;
+    readInt16BE(offset: number, noAssert?: boolean): number;
+    readInt32LE(offset: number, noAssert?: boolean): number;
+    readInt32BE(offset: number, noAssert?: boolean): number;
+    readFloatLE(offset: number, noAssert?: boolean): number;
+    readFloatBE(offset: number, noAssert?: boolean): number;
+    readDoubleLE(offset: number, noAssert?: boolean): number;
+    readDoubleBE(offset: number, noAssert?: boolean): number;
+    swap16(): Buffer;
+    swap32(): Buffer;
+    swap64(): Buffer;
+    writeUInt8(value: number, offset: number, noAssert?: boolean): number;
+    writeUInt16LE(value: number, offset: number, noAssert?: boolean): number;
+    writeUInt16BE(value: number, offset: number, noAssert?: boolean): number;
+    writeUInt32LE(value: number, offset: number, noAssert?: boolean): number;
+    writeUInt32BE(value: number, offset: number, noAssert?: boolean): number;
+    writeInt8(value: number, offset: number, noAssert?: boolean): number;
+    writeInt16LE(value: number, offset: number, noAssert?: boolean): number;
+    writeInt16BE(value: number, offset: number, noAssert?: boolean): number;
+    writeInt32LE(value: number, offset: number, noAssert?: boolean): number;
+    writeInt32BE(value: number, offset: number, noAssert?: boolean): number;
+    writeFloatLE(value: number, offset: number, noAssert?: boolean): number;
+    writeFloatBE(value: number, offset: number, noAssert?: boolean): number;
+    writeDoubleLE(value: number, offset: number, noAssert?: boolean): number;
+    writeDoubleBE(value: number, offset: number, noAssert?: boolean): number;
+    fill(value: any, offset?: number, end?: number): this;
+    indexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number;
+    lastIndexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number;
+    includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean;
+
+    /**
+     * Allocates a new buffer containing the given {str}.
+     *
+     * @param str String to store in buffer.
+     * @param encoding encoding to use, optional.  Default is 'utf8'
+     */
+     constructor (str: string, encoding?: string);
+    /**
+     * Allocates a new buffer of {size} octets.
+     *
+     * @param size count of octets to allocate.
+     */
+    constructor (size: number);
+    /**
+     * Allocates a new buffer containing the given {array} of octets.
+     *
+     * @param array The octets to store.
+     */
+    constructor (array: Uint8Array);
+    /**
+     * Produces a Buffer backed by the same allocated memory as
+     * the given {ArrayBuffer}.
+     *
+     *
+     * @param arrayBuffer The ArrayBuffer with which to share memory.
+     */
+    constructor (arrayBuffer: ArrayBuffer);
+    /**
+     * Allocates a new buffer containing the given {array} of octets.
+     *
+     * @param array The octets to store.
+     */
+    constructor (array: any[]);
+    /**
+     * Copies the passed {buffer} data onto a new {Buffer} instance.
+     *
+     * @param buffer The buffer to copy.
+     */
+    constructor (buffer: Buffer);
+    prototype: Buffer;
+    /**
+     * Allocates a new Buffer using an {array} of octets.
+     *
+     * @param array
+     */
+    static from(array: any[]): Buffer;
+    /**
+     * When passed a reference to the .buffer property of a TypedArray instance,
+     * the newly created Buffer will share the same allocated memory as the TypedArray.
+     * The optional {byteOffset} and {length} arguments specify a memory range
+     * within the {arrayBuffer} that will be shared by the Buffer.
+     *
+     * @param arrayBuffer The .buffer property of a TypedArray or a new ArrayBuffer()
+     * @param byteOffset
+     * @param length
+     */
+    static from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer;
+    /**
+     * Copies the passed {buffer} data onto a new Buffer instance.
+     *
+     * @param buffer
+     */
+    static from(buffer: Buffer): Buffer;
+    /**
+     * Creates a new Buffer containing the given JavaScript string {str}.
+     * If provided, the {encoding} parameter identifies the character encoding.
+     * If not provided, {encoding} defaults to 'utf8'.
+     *
+     * @param str
+     */
+    static from(str: string, encoding?: string): Buffer;
+    /**
+     * Returns true if {obj} is a Buffer
+     *
+     * @param obj object to test.
+     */
+    static isBuffer(obj: any): obj is Buffer;
+    /**
+     * Returns true if {encoding} is a valid encoding argument.
+     * Valid string encodings in Node 0.12: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'binary'(deprecated)|'hex'
+     *
+     * @param encoding string to test.
+     */
+    static isEncoding(encoding: string): boolean;
+    /**
+     * Gives the actual byte length of a string. encoding defaults to 'utf8'.
+     * This is not the same as String.prototype.length since that returns the number of characters in a string.
+     *
+     * @param string string to test.
+     * @param encoding encoding used to evaluate (defaults to 'utf8')
+     */
+    static byteLength(string: string, encoding?: string): number;
+    /**
+     * Returns a buffer which is the result of concatenating all the buffers in the list together.
+     *
+     * If the list has no items, or if the totalLength is 0, then it returns a zero-length buffer.
+     * If the list has exactly one item, then the first item of the list is returned.
+     * If the list has more than one item, then a new Buffer is created.
+     *
+     * @param list An array of Buffer objects to concatenate
+     * @param totalLength Total length of the buffers when concatenated.
+     *   If totalLength is not provided, it is read from the buffers in the list. However, this adds an additional loop to the function, so it is faster to provide the length explicitly.
+     */
+    static concat(list: Buffer[], totalLength?: number): Buffer;
+    /**
+     * The same as buf1.compare(buf2).
+     */
+    static compare(buf1: Buffer, buf2: Buffer): number;
+    /**
+     * Allocates a new buffer of {size} octets.
+     *
+     * @param size count of octets to allocate.
+     * @param fill if specified, buffer will be initialized by calling buf.fill(fill).
+     *    If parameter is omitted, buffer will be filled with zeros.
+     * @param encoding encoding used for call to buf.fill while initalizing
+     */
+    static alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer;
+    /**
+     * Allocates a new buffer of {size} octets, leaving memory not initialized, so the contents
+     * of the newly created Buffer are unknown and may contain sensitive data.
+     *
+     * @param size count of octets to allocate
+     */
+    static allocUnsafe(size: number): Buffer;
+    /**
+     * Allocates a new non-pooled buffer of {size} octets, leaving memory not initialized, so the contents
+     * of the newly created Buffer are unknown and may contain sensitive data.
+     *
+     * @param size count of octets to allocate
+     */
+    static allocUnsafeSlow(size: number): Buffer;
+  }
+}
\ No newline at end of file
diff --git a/node_modules/safe-buffer/index.js b/node_modules/safe-buffer/index.js
new file mode 100644
index 0000000..22438da
--- /dev/null
+++ b/node_modules/safe-buffer/index.js
@@ -0,0 +1,62 @@
+/* eslint-disable node/no-deprecated-api */
+var buffer = require('buffer')
+var Buffer = buffer.Buffer
+
+// alternative to using Object.keys for old browsers
+function copyProps (src, dst) {
+  for (var key in src) {
+    dst[key] = src[key]
+  }
+}
+if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
+  module.exports = buffer
+} else {
+  // Copy properties from require('buffer')
+  copyProps(buffer, exports)
+  exports.Buffer = SafeBuffer
+}
+
+function SafeBuffer (arg, encodingOrOffset, length) {
+  return Buffer(arg, encodingOrOffset, length)
+}
+
+// Copy static methods from Buffer
+copyProps(Buffer, SafeBuffer)
+
+SafeBuffer.from = function (arg, encodingOrOffset, length) {
+  if (typeof arg === 'number') {
+    throw new TypeError('Argument must not be a number')
+  }
+  return Buffer(arg, encodingOrOffset, length)
+}
+
+SafeBuffer.alloc = function (size, fill, encoding) {
+  if (typeof size !== 'number') {
+    throw new TypeError('Argument must be a number')
+  }
+  var buf = Buffer(size)
+  if (fill !== undefined) {
+    if (typeof encoding === 'string') {
+      buf.fill(fill, encoding)
+    } else {
+      buf.fill(fill)
+    }
+  } else {
+    buf.fill(0)
+  }
+  return buf
+}
+
+SafeBuffer.allocUnsafe = function (size) {
+  if (typeof size !== 'number') {
+    throw new TypeError('Argument must be a number')
+  }
+  return Buffer(size)
+}
+
+SafeBuffer.allocUnsafeSlow = function (size) {
+  if (typeof size !== 'number') {
+    throw new TypeError('Argument must be a number')
+  }
+  return buffer.SlowBuffer(size)
+}
diff --git a/node_modules/safe-buffer/package.json b/node_modules/safe-buffer/package.json
new file mode 100644
index 0000000..c22e991
--- /dev/null
+++ b/node_modules/safe-buffer/package.json
@@ -0,0 +1,64 @@
+{
+  "_from": "safe-buffer@~5.1.1",
+  "_id": "safe-buffer@5.1.2",
+  "_inBundle": false,
+  "_integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+  "_location": "/safe-buffer",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "safe-buffer@~5.1.1",
+    "name": "safe-buffer",
+    "escapedName": "safe-buffer",
+    "rawSpec": "~5.1.1",
+    "saveSpec": null,
+    "fetchSpec": "~5.1.1"
+  },
+  "_requiredBy": [
+    "/readable-stream",
+    "/string_decoder",
+    "/tunnel-agent"
+  ],
+  "_resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+  "_shasum": "991ec69d296e0313747d59bdfd2b745c35f8828d",
+  "_spec": "safe-buffer@~5.1.1",
+  "_where": "F:\\vent-display\\node_modules\\readable-stream",
+  "author": {
+    "name": "Feross Aboukhadijeh",
+    "email": "feross@feross.org",
+    "url": "http://feross.org"
+  },
+  "bugs": {
+    "url": "https://github.com/feross/safe-buffer/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Safer Node.js Buffer API",
+  "devDependencies": {
+    "standard": "*",
+    "tape": "^4.0.0"
+  },
+  "homepage": "https://github.com/feross/safe-buffer",
+  "keywords": [
+    "buffer",
+    "buffer allocate",
+    "node security",
+    "safe",
+    "safe-buffer",
+    "security",
+    "uninitialized"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "safe-buffer",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/feross/safe-buffer.git"
+  },
+  "scripts": {
+    "test": "standard && tape test/*.js"
+  },
+  "types": "index.d.ts",
+  "version": "5.1.2"
+}
diff --git a/node_modules/semver/CHANGELOG.md b/node_modules/semver/CHANGELOG.md
new file mode 100644
index 0000000..66304fd
--- /dev/null
+++ b/node_modules/semver/CHANGELOG.md
@@ -0,0 +1,39 @@
+# changes log
+
+## 5.7
+
+* Add `minVersion` method
+
+## 5.6
+
+* Move boolean `loose` param to an options object, with
+  backwards-compatibility protection.
+* Add ability to opt out of special prerelease version handling with
+  the `includePrerelease` option flag.
+
+## 5.5
+
+* Add version coercion capabilities
+
+## 5.4
+
+* Add intersection checking
+
+## 5.3
+
+* Add `minSatisfying` method
+
+## 5.2
+
+* Add `prerelease(v)` that returns prerelease components
+
+## 5.1
+
+* Add Backus-Naur for ranges
+* Remove excessively cute inspection methods
+
+## 5.0
+
+* Remove AMD/Browserified build artifacts
+* Fix ltr and gtr when using the `*` range
+* Fix for range `*` with a prerelease identifier
diff --git a/node_modules/semver/LICENSE b/node_modules/semver/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/semver/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/semver/README.md b/node_modules/semver/README.md
new file mode 100644
index 0000000..f8dfa5a
--- /dev/null
+++ b/node_modules/semver/README.md
@@ -0,0 +1,412 @@
+semver(1) -- The semantic versioner for npm
+===========================================
+
+## Install
+
+```bash
+npm install --save semver
+````
+
+## Usage
+
+As a node module:
+
+```js
+const semver = require('semver')
+
+semver.valid('1.2.3') // '1.2.3'
+semver.valid('a.b.c') // null
+semver.clean('  =v1.2.3   ') // '1.2.3'
+semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true
+semver.gt('1.2.3', '9.8.7') // false
+semver.lt('1.2.3', '9.8.7') // true
+semver.minVersion('>=1.0.0') // '1.0.0'
+semver.valid(semver.coerce('v2')) // '2.0.0'
+semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
+```
+
+As a command-line utility:
+
+```
+$ semver -h
+
+A JavaScript implementation of the https://semver.org/ specification
+Copyright Isaac Z. Schlueter
+
+Usage: semver [options] <version> [<version> [...]]
+Prints valid versions sorted by SemVer precedence
+
+Options:
+-r --range <range>
+        Print versions that match the specified range.
+
+-i --increment [<level>]
+        Increment a version by the specified level.  Level can
+        be one of: major, minor, patch, premajor, preminor,
+        prepatch, or prerelease.  Default level is 'patch'.
+        Only one version may be specified.
+
+--preid <identifier>
+        Identifier to be used to prefix premajor, preminor,
+        prepatch or prerelease version increments.
+
+-l --loose
+        Interpret versions and ranges loosely
+
+-p --include-prerelease
+        Always include prerelease versions in range matching
+
+-c --coerce
+        Coerce a string into SemVer if possible
+        (does not imply --loose)
+
+Program exits successfully if any valid version satisfies
+all supplied ranges, and prints all satisfying versions.
+
+If no satisfying versions are found, then exits failure.
+
+Versions are printed in ascending order, so supplying
+multiple versions to the utility will just sort them.
+```
+
+## Versions
+
+A "version" is described by the `v2.0.0` specification found at
+<https://semver.org/>.
+
+A leading `"="` or `"v"` character is stripped off and ignored.
+
+## Ranges
+
+A `version range` is a set of `comparators` which specify versions
+that satisfy the range.
+
+A `comparator` is composed of an `operator` and a `version`.  The set
+of primitive `operators` is:
+
+* `<` Less than
+* `<=` Less than or equal to
+* `>` Greater than
+* `>=` Greater than or equal to
+* `=` Equal.  If no operator is specified, then equality is assumed,
+  so this operator is optional, but MAY be included.
+
+For example, the comparator `>=1.2.7` would match the versions
+`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6`
+or `1.1.0`.
+
+Comparators can be joined by whitespace to form a `comparator set`,
+which is satisfied by the **intersection** of all of the comparators
+it includes.
+
+A range is composed of one or more comparator sets, joined by `||`.  A
+version matches a range if and only if every comparator in at least
+one of the `||`-separated comparator sets is satisfied by the version.
+
+For example, the range `>=1.2.7 <1.3.0` would match the versions
+`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`,
+or `1.1.0`.
+
+The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`,
+`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`.
+
+### Prerelease Tags
+
+If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then
+it will only be allowed to satisfy comparator sets if at least one
+comparator with the same `[major, minor, patch]` tuple also has a
+prerelease tag.
+
+For example, the range `>1.2.3-alpha.3` would be allowed to match the
+version `1.2.3-alpha.7`, but it would *not* be satisfied by
+`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater
+than" `1.2.3-alpha.3` according to the SemVer sort rules.  The version
+range only accepts prerelease tags on the `1.2.3` version.  The
+version `3.4.5` *would* satisfy the range, because it does not have a
+prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`.
+
+The purpose for this behavior is twofold.  First, prerelease versions
+frequently are updated very quickly, and contain many breaking changes
+that are (by the author's design) not yet fit for public consumption.
+Therefore, by default, they are excluded from range matching
+semantics.
+
+Second, a user who has opted into using a prerelease version has
+clearly indicated the intent to use *that specific* set of
+alpha/beta/rc versions.  By including a prerelease tag in the range,
+the user is indicating that they are aware of the risk.  However, it
+is still not appropriate to assume that they have opted into taking a
+similar risk on the *next* set of prerelease versions.
+
+Note that this behavior can be suppressed (treating all prerelease
+versions as if they were normal versions, for the purpose of range
+matching) by setting the `includePrerelease` flag on the options
+object to any
+[functions](https://github.com/npm/node-semver#functions) that do
+range matching.
+
+#### Prerelease Identifiers
+
+The method `.inc` takes an additional `identifier` string argument that
+will append the value of the string as a prerelease identifier:
+
+```javascript
+semver.inc('1.2.3', 'prerelease', 'beta')
+// '1.2.4-beta.0'
+```
+
+command-line example:
+
+```bash
+$ semver 1.2.3 -i prerelease --preid beta
+1.2.4-beta.0
+```
+
+Which then can be used to increment further:
+
+```bash
+$ semver 1.2.4-beta.0 -i prerelease
+1.2.4-beta.1
+```
+
+### Advanced Range Syntax
+
+Advanced range syntax desugars to primitive comparators in
+deterministic ways.
+
+Advanced ranges may be combined in the same way as primitive
+comparators using white space or `||`.
+
+#### Hyphen Ranges `X.Y.Z - A.B.C`
+
+Specifies an inclusive set.
+
+* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`
+
+If a partial version is provided as the first version in the inclusive
+range, then the missing pieces are replaced with zeroes.
+
+* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4`
+
+If a partial version is provided as the second version in the
+inclusive range, then all versions that start with the supplied parts
+of the tuple are accepted, but nothing that would be greater than the
+provided tuple parts.
+
+* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0`
+* `1.2.3 - 2` := `>=1.2.3 <3.0.0`
+
+#### X-Ranges `1.2.x` `1.X` `1.2.*` `*`
+
+Any of `X`, `x`, or `*` may be used to "stand in" for one of the
+numeric values in the `[major, minor, patch]` tuple.
+
+* `*` := `>=0.0.0` (Any version satisfies)
+* `1.x` := `>=1.0.0 <2.0.0` (Matching major version)
+* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions)
+
+A partial version range is treated as an X-Range, so the special
+character is in fact optional.
+
+* `""` (empty string) := `*` := `>=0.0.0`
+* `1` := `1.x.x` := `>=1.0.0 <2.0.0`
+* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0`
+
+#### Tilde Ranges `~1.2.3` `~1.2` `~1`
+
+Allows patch-level changes if a minor version is specified on the
+comparator.  Allows minor-level changes if not.
+
+* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0`
+* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`)
+* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`)
+* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0`
+* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`)
+* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`)
+* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in
+  the `1.2.3` version will be allowed, if they are greater than or
+  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but
+  `1.2.4-beta.2` would not, because it is a prerelease of a
+  different `[major, minor, patch]` tuple.
+
+#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4`
+
+Allows changes that do not modify the left-most non-zero digit in the
+`[major, minor, patch]` tuple.  In other words, this allows patch and
+minor updates for versions `1.0.0` and above, patch updates for
+versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`.
+
+Many authors treat a `0.x` version as if the `x` were the major
+"breaking-change" indicator.
+
+Caret ranges are ideal when an author may make breaking changes
+between `0.2.4` and `0.3.0` releases, which is a common practice.
+However, it presumes that there will *not* be breaking changes between
+`0.2.4` and `0.2.5`.  It allows for changes that are presumed to be
+additive (but non-breaking), according to commonly observed practices.
+
+* `^1.2.3` := `>=1.2.3 <2.0.0`
+* `^0.2.3` := `>=0.2.3 <0.3.0`
+* `^0.0.3` := `>=0.0.3 <0.0.4`
+* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in
+  the `1.2.3` version will be allowed, if they are greater than or
+  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but
+  `1.2.4-beta.2` would not, because it is a prerelease of a
+  different `[major, minor, patch]` tuple.
+* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4`  Note that prereleases in the
+  `0.0.3` version *only* will be allowed, if they are greater than or
+  equal to `beta`.  So, `0.0.3-pr.2` would be allowed.
+
+When parsing caret ranges, a missing `patch` value desugars to the
+number `0`, but will allow flexibility within that value, even if the
+major and minor versions are both `0`.
+
+* `^1.2.x` := `>=1.2.0 <2.0.0`
+* `^0.0.x` := `>=0.0.0 <0.1.0`
+* `^0.0` := `>=0.0.0 <0.1.0`
+
+A missing `minor` and `patch` values will desugar to zero, but also
+allow flexibility within those values, even if the major version is
+zero.
+
+* `^1.x` := `>=1.0.0 <2.0.0`
+* `^0.x` := `>=0.0.0 <1.0.0`
+
+### Range Grammar
+
+Putting all this together, here is a Backus-Naur grammar for ranges,
+for the benefit of parser authors:
+
+```bnf
+range-set  ::= range ( logical-or range ) *
+logical-or ::= ( ' ' ) * '||' ( ' ' ) *
+range      ::= hyphen | simple ( ' ' simple ) * | ''
+hyphen     ::= partial ' - ' partial
+simple     ::= primitive | partial | tilde | caret
+primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
+partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
+xr         ::= 'x' | 'X' | '*' | nr
+nr         ::= '0' | ['1'-'9'] ( ['0'-'9'] ) *
+tilde      ::= '~' partial
+caret      ::= '^' partial
+qualifier  ::= ( '-' pre )? ( '+' build )?
+pre        ::= parts
+build      ::= parts
+parts      ::= part ( '.' part ) *
+part       ::= nr | [-0-9A-Za-z]+
+```
+
+## Functions
+
+All methods and classes take a final `options` object argument.  All
+options in this object are `false` by default.  The options supported
+are:
+
+- `loose`  Be more forgiving about not-quite-valid semver strings.
+  (Any resulting output will always be 100% strict compliant, of
+  course.)  For backwards compatibility reasons, if the `options`
+  argument is a boolean value instead of an object, it is interpreted
+  to be the `loose` param.
+- `includePrerelease`  Set to suppress the [default
+  behavior](https://github.com/npm/node-semver#prerelease-tags) of
+  excluding prerelease tagged versions from ranges unless they are
+  explicitly opted into.
+
+Strict-mode Comparators and Ranges will be strict about the SemVer
+strings that they parse.
+
+* `valid(v)`: Return the parsed version, or null if it's not valid.
+* `inc(v, release)`: Return the version incremented by the release
+  type (`major`,   `premajor`, `minor`, `preminor`, `patch`,
+  `prepatch`, or `prerelease`), or null if it's not valid
+  * `premajor` in one call will bump the version up to the next major
+    version and down to a prerelease of that major version.
+    `preminor`, and `prepatch` work the same way.
+  * If called from a non-prerelease version, the `prerelease` will work the
+    same as `prepatch`. It increments the patch version, then makes a
+    prerelease. If the input version is already a prerelease it simply
+    increments it.
+* `prerelease(v)`: Returns an array of prerelease components, or null
+  if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]`
+* `major(v)`: Return the major version number.
+* `minor(v)`: Return the minor version number.
+* `patch(v)`: Return the patch version number.
+* `intersects(r1, r2, loose)`: Return true if the two supplied ranges
+  or comparators intersect.
+* `parse(v)`: Attempt to parse a string as a semantic version, returning either
+  a `SemVer` object or `null`.
+
+### Comparison
+
+* `gt(v1, v2)`: `v1 > v2`
+* `gte(v1, v2)`: `v1 >= v2`
+* `lt(v1, v2)`: `v1 < v2`
+* `lte(v1, v2)`: `v1 <= v2`
+* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,
+  even if they're not the exact same string.  You already know how to
+  compare strings.
+* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.
+* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call
+  the corresponding function above.  `"==="` and `"!=="` do simple
+  string comparison, but are included for completeness.  Throws if an
+  invalid comparison string is provided.
+* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if
+  `v2` is greater.  Sorts in ascending order if passed to `Array.sort()`.
+* `rcompare(v1, v2)`: The reverse of compare.  Sorts an array of versions
+  in descending order when passed to `Array.sort()`.
+* `diff(v1, v2)`: Returns difference between two versions by the release type
+  (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`),
+  or null if the versions are the same.
+
+### Comparators
+
+* `intersects(comparator)`: Return true if the comparators intersect
+
+### Ranges
+
+* `validRange(range)`: Return the valid range or null if it's not valid
+* `satisfies(version, range)`: Return true if the version satisfies the
+  range.
+* `maxSatisfying(versions, range)`: Return the highest version in the list
+  that satisfies the range, or `null` if none of them do.
+* `minSatisfying(versions, range)`: Return the lowest version in the list
+  that satisfies the range, or `null` if none of them do.
+* `minVersion(range)`: Return the lowest version that can possibly match
+  the given range.
+* `gtr(version, range)`: Return `true` if version is greater than all the
+  versions possible in the range.
+* `ltr(version, range)`: Return `true` if version is less than all the
+  versions possible in the range.
+* `outside(version, range, hilo)`: Return true if the version is outside
+  the bounds of the range in either the high or low direction.  The
+  `hilo` argument must be either the string `'>'` or `'<'`.  (This is
+  the function called by `gtr` and `ltr`.)
+* `intersects(range)`: Return true if any of the ranges comparators intersect
+
+Note that, since ranges may be non-contiguous, a version might not be
+greater than a range, less than a range, *or* satisfy a range!  For
+example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`
+until `2.0.0`, so the version `1.2.10` would not be greater than the
+range (because `2.0.1` satisfies, which is higher), nor less than the
+range (since `1.2.8` satisfies, which is lower), and it also does not
+satisfy the range.
+
+If you want to know if a version satisfies or does not satisfy a
+range, use the `satisfies(version, range)` function.
+
+### Coercion
+
+* `coerce(version)`: Coerces a string to semver if possible
+
+This aims to provide a very forgiving translation of a non-semver string to
+semver. It looks for the first digit in a string, and consumes all
+remaining characters which satisfy at least a partial semver (e.g., `1`,
+`1.2`, `1.2.3`) up to the max permitted length (256 characters).  Longer
+versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`).  All
+surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes
+`3.4.0`).  Only text which lacks digits will fail coercion (`version one`
+is not valid).  The maximum  length for any semver component considered for
+coercion is 16 characters; longer components will be ignored
+(`10000000000000000.4.7.4` becomes `4.7.4`).  The maximum value for any
+semver component is `Number.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value
+components are invalid (`9999999999999999.4.7.4` is likely invalid).
diff --git a/node_modules/semver/bin/semver b/node_modules/semver/bin/semver
new file mode 100644
index 0000000..801e77f
--- /dev/null
+++ b/node_modules/semver/bin/semver
@@ -0,0 +1,160 @@
+#!/usr/bin/env node
+// Standalone semver comparison program.
+// Exits successfully and prints matching version(s) if
+// any supplied version is valid and passes all tests.
+
+var argv = process.argv.slice(2)
+
+var versions = []
+
+var range = []
+
+var inc = null
+
+var version = require('../package.json').version
+
+var loose = false
+
+var includePrerelease = false
+
+var coerce = false
+
+var identifier
+
+var semver = require('../semver')
+
+var reverse = false
+
+var options = {}
+
+main()
+
+function main () {
+  if (!argv.length) return help()
+  while (argv.length) {
+    var a = argv.shift()
+    var indexOfEqualSign = a.indexOf('=')
+    if (indexOfEqualSign !== -1) {
+      a = a.slice(0, indexOfEqualSign)
+      argv.unshift(a.slice(indexOfEqualSign + 1))
+    }
+    switch (a) {
+      case '-rv': case '-rev': case '--rev': case '--reverse':
+        reverse = true
+        break
+      case '-l': case '--loose':
+        loose = true
+        break
+      case '-p': case '--include-prerelease':
+        includePrerelease = true
+        break
+      case '-v': case '--version':
+        versions.push(argv.shift())
+        break
+      case '-i': case '--inc': case '--increment':
+        switch (argv[0]) {
+          case 'major': case 'minor': case 'patch': case 'prerelease':
+          case 'premajor': case 'preminor': case 'prepatch':
+            inc = argv.shift()
+            break
+          default:
+            inc = 'patch'
+            break
+        }
+        break
+      case '--preid':
+        identifier = argv.shift()
+        break
+      case '-r': case '--range':
+        range.push(argv.shift())
+        break
+      case '-c': case '--coerce':
+        coerce = true
+        break
+      case '-h': case '--help': case '-?':
+        return help()
+      default:
+        versions.push(a)
+        break
+    }
+  }
+
+  var options = { loose: loose, includePrerelease: includePrerelease }
+
+  versions = versions.map(function (v) {
+    return coerce ? (semver.coerce(v) || { version: v }).version : v
+  }).filter(function (v) {
+    return semver.valid(v)
+  })
+  if (!versions.length) return fail()
+  if (inc && (versions.length !== 1 || range.length)) { return failInc() }
+
+  for (var i = 0, l = range.length; i < l; i++) {
+    versions = versions.filter(function (v) {
+      return semver.satisfies(v, range[i], options)
+    })
+    if (!versions.length) return fail()
+  }
+  return success(versions)
+}
+
+function failInc () {
+  console.error('--inc can only be used on a single version with no range')
+  fail()
+}
+
+function fail () { process.exit(1) }
+
+function success () {
+  var compare = reverse ? 'rcompare' : 'compare'
+  versions.sort(function (a, b) {
+    return semver[compare](a, b, options)
+  }).map(function (v) {
+    return semver.clean(v, options)
+  }).map(function (v) {
+    return inc ? semver.inc(v, inc, options, identifier) : v
+  }).forEach(function (v, i, _) { console.log(v) })
+}
+
+function help () {
+  console.log(['SemVer ' + version,
+    '',
+    'A JavaScript implementation of the https://semver.org/ specification',
+    'Copyright Isaac Z. Schlueter',
+    '',
+    'Usage: semver [options] <version> [<version> [...]]',
+    'Prints valid versions sorted by SemVer precedence',
+    '',
+    'Options:',
+    '-r --range <range>',
+    '        Print versions that match the specified range.',
+    '',
+    '-i --increment [<level>]',
+    '        Increment a version by the specified level.  Level can',
+    '        be one of: major, minor, patch, premajor, preminor,',
+    "        prepatch, or prerelease.  Default level is 'patch'.",
+    '        Only one version may be specified.',
+    '',
+    '--preid <identifier>',
+    '        Identifier to be used to prefix premajor, preminor,',
+    '        prepatch or prerelease version increments.',
+    '',
+    '-l --loose',
+    '        Interpret versions and ranges loosely',
+    '',
+    '-p --include-prerelease',
+    '        Always include prerelease versions in range matching',
+    '',
+    '-c --coerce',
+    '        Coerce a string into SemVer if possible',
+    '        (does not imply --loose)',
+    '',
+    'Program exits successfully if any valid version satisfies',
+    'all supplied ranges, and prints all satisfying versions.',
+    '',
+    'If no satisfying versions are found, then exits failure.',
+    '',
+    'Versions are printed in ascending order, so supplying',
+    'multiple versions to the utility will just sort them.'
+  ].join('\n'))
+}
diff --git a/node_modules/semver/package.json b/node_modules/semver/package.json
new file mode 100644
index 0000000..f7ab92c
--- /dev/null
+++ b/node_modules/semver/package.json
@@ -0,0 +1,60 @@
+{
+  "_from": "semver@^5.4.1",
+  "_id": "semver@5.7.1",
+  "_inBundle": false,
+  "_integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+  "_location": "/semver",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "semver@^5.4.1",
+    "name": "semver",
+    "escapedName": "semver",
+    "rawSpec": "^5.4.1",
+    "saveSpec": null,
+    "fetchSpec": "^5.4.1"
+  },
+  "_requiredBy": [
+    "/node-abi"
+  ],
+  "_resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+  "_shasum": "a954f931aeba508d307bbf069eff0c01c96116f7",
+  "_spec": "semver@^5.4.1",
+  "_where": "F:\\vent-display\\node_modules\\node-abi",
+  "bin": {
+    "semver": "bin/semver"
+  },
+  "bugs": {
+    "url": "https://github.com/npm/node-semver/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "The semantic version parser used by npm.",
+  "devDependencies": {
+    "tap": "^13.0.0-rc.18"
+  },
+  "files": [
+    "bin",
+    "range.bnf",
+    "semver.js"
+  ],
+  "homepage": "https://github.com/npm/node-semver#readme",
+  "license": "ISC",
+  "main": "semver.js",
+  "name": "semver",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/npm/node-semver.git"
+  },
+  "scripts": {
+    "postpublish": "git push origin --all; git push origin --tags",
+    "postversion": "npm publish",
+    "preversion": "npm test",
+    "test": "tap"
+  },
+  "tap": {
+    "check-coverage": true
+  },
+  "version": "5.7.1"
+}
diff --git a/node_modules/semver/range.bnf b/node_modules/semver/range.bnf
new file mode 100644
index 0000000..d4c6ae0
--- /dev/null
+++ b/node_modules/semver/range.bnf
@@ -0,0 +1,16 @@
+range-set  ::= range ( logical-or range ) *
+logical-or ::= ( ' ' ) * '||' ( ' ' ) *
+range      ::= hyphen | simple ( ' ' simple ) * | ''
+hyphen     ::= partial ' - ' partial
+simple     ::= primitive | partial | tilde | caret
+primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
+partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
+xr         ::= 'x' | 'X' | '*' | nr
+nr         ::= '0' | [1-9] ( [0-9] ) *
+tilde      ::= '~' partial
+caret      ::= '^' partial
+qualifier  ::= ( '-' pre )? ( '+' build )?
+pre        ::= parts
+build      ::= parts
+parts      ::= part ( '.' part ) *
+part       ::= nr | [-0-9A-Za-z]+
diff --git a/node_modules/semver/semver.js b/node_modules/semver/semver.js
new file mode 100644
index 0000000..d315d5d
--- /dev/null
+++ b/node_modules/semver/semver.js
@@ -0,0 +1,1483 @@
+exports = module.exports = SemVer
+
+var debug
+/* istanbul ignore next */
+if (typeof process === 'object' &&
+    process.env &&
+    process.env.NODE_DEBUG &&
+    /\bsemver\b/i.test(process.env.NODE_DEBUG)) {
+  debug = function () {
+    var args = Array.prototype.slice.call(arguments, 0)
+    args.unshift('SEMVER')
+    console.log.apply(console, args)
+  }
+} else {
+  debug = function () {}
+}
+
+// Note: this is the semver.org version of the spec that it implements
+// Not necessarily the package version of this code.
+exports.SEMVER_SPEC_VERSION = '2.0.0'
+
+var MAX_LENGTH = 256
+var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
+  /* istanbul ignore next */ 9007199254740991
+
+// Max safe segment length for coercion.
+var MAX_SAFE_COMPONENT_LENGTH = 16
+
+// The actual regexps go on exports.re
+var re = exports.re = []
+var src = exports.src = []
+var R = 0
+
+// The following Regular Expressions can be used for tokenizing,
+// validating, and parsing SemVer version strings.
+
+// ## Numeric Identifier
+// A single `0`, or a non-zero digit followed by zero or more digits.
+
+var NUMERICIDENTIFIER = R++
+src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'
+var NUMERICIDENTIFIERLOOSE = R++
+src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'
+
+// ## Non-numeric Identifier
+// Zero or more digits, followed by a letter or hyphen, and then zero or
+// more letters, digits, or hyphens.
+
+var NONNUMERICIDENTIFIER = R++
+src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'
+
+// ## Main Version
+// Three dot-separated numeric identifiers.
+
+var MAINVERSION = R++
+src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' +
+                   '(' + src[NUMERICIDENTIFIER] + ')\\.' +
+                   '(' + src[NUMERICIDENTIFIER] + ')'
+
+var MAINVERSIONLOOSE = R++
+src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
+                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
+                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')'
+
+// ## Pre-release Version Identifier
+// A numeric identifier, or a non-numeric identifier.
+
+var PRERELEASEIDENTIFIER = R++
+src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +
+                            '|' + src[NONNUMERICIDENTIFIER] + ')'
+
+var PRERELEASEIDENTIFIERLOOSE = R++
+src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +
+                                 '|' + src[NONNUMERICIDENTIFIER] + ')'
+
+// ## Pre-release Version
+// Hyphen, followed by one or more dot-separated pre-release version
+// identifiers.
+
+var PRERELEASE = R++
+src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +
+                  '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'
+
+var PRERELEASELOOSE = R++
+src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +
+                       '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'
+
+// ## Build Metadata Identifier
+// Any combination of digits, letters, or hyphens.
+
+var BUILDIDENTIFIER = R++
+src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'
+
+// ## Build Metadata
+// Plus sign, followed by one or more period-separated build metadata
+// identifiers.
+
+var BUILD = R++
+src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
+             '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'
+
+// ## Full Version String
+// A main version, followed optionally by a pre-release version and
+// build metadata.
+
+// Note that the only major, minor, patch, and pre-release sections of
+// the version string are capturing groups.  The build metadata is not a
+// capturing group, because it should not ever be used in version
+// comparison.
+
+var FULL = R++
+var FULLPLAIN = 'v?' + src[MAINVERSION] +
+                src[PRERELEASE] + '?' +
+                src[BUILD] + '?'
+
+src[FULL] = '^' + FULLPLAIN + '$'
+
+// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
+// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
+// common in the npm registry.
+var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] +
+                 src[PRERELEASELOOSE] + '?' +
+                 src[BUILD] + '?'
+
+var LOOSE = R++
+src[LOOSE] = '^' + LOOSEPLAIN + '$'
+
+var GTLT = R++
+src[GTLT] = '((?:<|>)?=?)'
+
+// Something like "2.*" or "1.2.x".
+// Note that "x.x" is a valid xRange identifer, meaning "any version"
+// Only the first item is strictly required.
+var XRANGEIDENTIFIERLOOSE = R++
+src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'
+var XRANGEIDENTIFIER = R++
+src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'
+
+var XRANGEPLAIN = R++
+src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
+                   '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
+                   '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
+                   '(?:' + src[PRERELEASE] + ')?' +
+                   src[BUILD] + '?' +
+                   ')?)?'
+
+var XRANGEPLAINLOOSE = R++
+src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
+                        '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
+                        '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
+                        '(?:' + src[PRERELEASELOOSE] + ')?' +
+                        src[BUILD] + '?' +
+                        ')?)?'
+
+var XRANGE = R++
+src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'
+var XRANGELOOSE = R++
+src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'
+
+// Coercion.
+// Extract anything that could conceivably be a part of a valid semver
+var COERCE = R++
+src[COERCE] = '(?:^|[^\\d])' +
+              '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
+              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
+              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
+              '(?:$|[^\\d])'
+
+// Tilde ranges.
+// Meaning is "reasonably at or greater than"
+var LONETILDE = R++
+src[LONETILDE] = '(?:~>?)'
+
+var TILDETRIM = R++
+src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'
+re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g')
+var tildeTrimReplace = '$1~'
+
+var TILDE = R++
+src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'
+var TILDELOOSE = R++
+src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'
+
+// Caret ranges.
+// Meaning is "at least and backwards compatible with"
+var LONECARET = R++
+src[LONECARET] = '(?:\\^)'
+
+var CARETTRIM = R++
+src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'
+re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g')
+var caretTrimReplace = '$1^'
+
+var CARET = R++
+src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'
+var CARETLOOSE = R++
+src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'
+
+// A simple gt/lt/eq thing, or just "" to indicate "any version"
+var COMPARATORLOOSE = R++
+src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'
+var COMPARATOR = R++
+src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'
+
+// An expression to strip any whitespace between the gtlt and the thing
+// it modifies, so that `> 1.2.3` ==> `>1.2.3`
+var COMPARATORTRIM = R++
+src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] +
+                      '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'
+
+// this one has to use the /g flag
+re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g')
+var comparatorTrimReplace = '$1$2$3'
+
+// Something like `1.2.3 - 1.2.4`
+// Note that these all use the loose form, because they'll be
+// checked against either the strict or loose comparator form
+// later.
+var HYPHENRANGE = R++
+src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' +
+                   '\\s+-\\s+' +
+                   '(' + src[XRANGEPLAIN] + ')' +
+                   '\\s*$'
+
+var HYPHENRANGELOOSE = R++
+src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' +
+                        '\\s+-\\s+' +
+                        '(' + src[XRANGEPLAINLOOSE] + ')' +
+                        '\\s*$'
+
+// Star ranges basically just allow anything at all.
+var STAR = R++
+src[STAR] = '(<|>)?=?\\s*\\*'
+
+// Compile to actual regexp objects.
+// All are flag-free, unless they were created above with a flag.
+for (var i = 0; i < R; i++) {
+  debug(i, src[i])
+  if (!re[i]) {
+    re[i] = new RegExp(src[i])
+  }
+}
+
+exports.parse = parse
+function parse (version, options) {
+  if (!options || typeof options !== 'object') {
+    options = {
+      loose: !!options,
+      includePrerelease: false
+    }
+  }
+
+  if (version instanceof SemVer) {
+    return version
+  }
+
+  if (typeof version !== 'string') {
+    return null
+  }
+
+  if (version.length > MAX_LENGTH) {
+    return null
+  }
+
+  var r = options.loose ? re[LOOSE] : re[FULL]
+  if (!r.test(version)) {
+    return null
+  }
+
+  try {
+    return new SemVer(version, options)
+  } catch (er) {
+    return null
+  }
+}
+
+exports.valid = valid
+function valid (version, options) {
+  var v = parse(version, options)
+  return v ? v.version : null
+}
+
+exports.clean = clean
+function clean (version, options) {
+  var s = parse(version.trim().replace(/^[=v]+/, ''), options)
+  return s ? s.version : null
+}
+
+exports.SemVer = SemVer
+
+function SemVer (version, options) {
+  if (!options || typeof options !== 'object') {
+    options = {
+      loose: !!options,
+      includePrerelease: false
+    }
+  }
+  if (version instanceof SemVer) {
+    if (version.loose === options.loose) {
+      return version
+    } else {
+      version = version.version
+    }
+  } else if (typeof version !== 'string') {
+    throw new TypeError('Invalid Version: ' + version)
+  }
+
+  if (version.length > MAX_LENGTH) {
+    throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')
+  }
+
+  if (!(this instanceof SemVer)) {
+    return new SemVer(version, options)
+  }
+
+  debug('SemVer', version, options)
+  this.options = options
+  this.loose = !!options.loose
+
+  var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL])
+
+  if (!m) {
+    throw new TypeError('Invalid Version: ' + version)
+  }
+
+  this.raw = version
+
+  // these are actually numbers
+  this.major = +m[1]
+  this.minor = +m[2]
+  this.patch = +m[3]
+
+  if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
+    throw new TypeError('Invalid major version')
+  }
+
+  if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
+    throw new TypeError('Invalid minor version')
+  }
+
+  if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
+    throw new TypeError('Invalid patch version')
+  }
+
+  // numberify any prerelease numeric ids
+  if (!m[4]) {
+    this.prerelease = []
+  } else {
+    this.prerelease = m[4].split('.').map(function (id) {
+      if (/^[0-9]+$/.test(id)) {
+        var num = +id
+        if (num >= 0 && num < MAX_SAFE_INTEGER) {
+          return num
+        }
+      }
+      return id
+    })
+  }
+
+  this.build = m[5] ? m[5].split('.') : []
+  this.format()
+}
+
+SemVer.prototype.format = function () {
+  this.version = this.major + '.' + this.minor + '.' + this.patch
+  if (this.prerelease.length) {
+    this.version += '-' + this.prerelease.join('.')
+  }
+  return this.version
+}
+
+SemVer.prototype.toString = function () {
+  return this.version
+}
+
+SemVer.prototype.compare = function (other) {
+  debug('SemVer.compare', this.version, this.options, other)
+  if (!(other instanceof SemVer)) {
+    other = new SemVer(other, this.options)
+  }
+
+  return this.compareMain(other) || this.comparePre(other)
+}
+
+SemVer.prototype.compareMain = function (other) {
+  if (!(other instanceof SemVer)) {
+    other = new SemVer(other, this.options)
+  }
+
+  return compareIdentifiers(this.major, other.major) ||
+         compareIdentifiers(this.minor, other.minor) ||
+         compareIdentifiers(this.patch, other.patch)
+}
+
+SemVer.prototype.comparePre = function (other) {
+  if (!(other instanceof SemVer)) {
+    other = new SemVer(other, this.options)
+  }
+
+  // NOT having a prerelease is > having one
+  if (this.prerelease.length && !other.prerelease.length) {
+    return -1
+  } else if (!this.prerelease.length && other.prerelease.length) {
+    return 1
+  } else if (!this.prerelease.length && !other.prerelease.length) {
+    return 0
+  }
+
+  var i = 0
+  do {
+    var a = this.prerelease[i]
+    var b = other.prerelease[i]
+    debug('prerelease compare', i, a, b)
+    if (a === undefined && b === undefined) {
+      return 0
+    } else if (b === undefined) {
+      return 1
+    } else if (a === undefined) {
+      return -1
+    } else if (a === b) {
+      continue
+    } else {
+      return compareIdentifiers(a, b)
+    }
+  } while (++i)
+}
+
+// preminor will bump the version up to the next minor release, and immediately
+// down to pre-release. premajor and prepatch work the same way.
+SemVer.prototype.inc = function (release, identifier) {
+  switch (release) {
+    case 'premajor':
+      this.prerelease.length = 0
+      this.patch = 0
+      this.minor = 0
+      this.major++
+      this.inc('pre', identifier)
+      break
+    case 'preminor':
+      this.prerelease.length = 0
+      this.patch = 0
+      this.minor++
+      this.inc('pre', identifier)
+      break
+    case 'prepatch':
+      // If this is already a prerelease, it will bump to the next version
+      // drop any prereleases that might already exist, since they are not
+      // relevant at this point.
+      this.prerelease.length = 0
+      this.inc('patch', identifier)
+      this.inc('pre', identifier)
+      break
+    // If the input is a non-prerelease version, this acts the same as
+    // prepatch.
+    case 'prerelease':
+      if (this.prerelease.length === 0) {
+        this.inc('patch', identifier)
+      }
+      this.inc('pre', identifier)
+      break
+
+    case 'major':
+      // If this is a pre-major version, bump up to the same major version.
+      // Otherwise increment major.
+      // 1.0.0-5 bumps to 1.0.0
+      // 1.1.0 bumps to 2.0.0
+      if (this.minor !== 0 ||
+          this.patch !== 0 ||
+          this.prerelease.length === 0) {
+        this.major++
+      }
+      this.minor = 0
+      this.patch = 0
+      this.prerelease = []
+      break
+    case 'minor':
+      // If this is a pre-minor version, bump up to the same minor version.
+      // Otherwise increment minor.
+      // 1.2.0-5 bumps to 1.2.0
+      // 1.2.1 bumps to 1.3.0
+      if (this.patch !== 0 || this.prerelease.length === 0) {
+        this.minor++
+      }
+      this.patch = 0
+      this.prerelease = []
+      break
+    case 'patch':
+      // If this is not a pre-release version, it will increment the patch.
+      // If it is a pre-release it will bump up to the same patch version.
+      // 1.2.0-5 patches to 1.2.0
+      // 1.2.0 patches to 1.2.1
+      if (this.prerelease.length === 0) {
+        this.patch++
+      }
+      this.prerelease = []
+      break
+    // This probably shouldn't be used publicly.
+    // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
+    case 'pre':
+      if (this.prerelease.length === 0) {
+        this.prerelease = [0]
+      } else {
+        var i = this.prerelease.length
+        while (--i >= 0) {
+          if (typeof this.prerelease[i] === 'number') {
+            this.prerelease[i]++
+            i = -2
+          }
+        }
+        if (i === -1) {
+          // didn't increment anything
+          this.prerelease.push(0)
+        }
+      }
+      if (identifier) {
+        // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
+        // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
+        if (this.prerelease[0] === identifier) {
+          if (isNaN(this.prerelease[1])) {
+            this.prerelease = [identifier, 0]
+          }
+        } else {
+          this.prerelease = [identifier, 0]
+        }
+      }
+      break
+
+    default:
+      throw new Error('invalid increment argument: ' + release)
+  }
+  this.format()
+  this.raw = this.version
+  return this
+}
+
+exports.inc = inc
+function inc (version, release, loose, identifier) {
+  if (typeof (loose) === 'string') {
+    identifier = loose
+    loose = undefined
+  }
+
+  try {
+    return new SemVer(version, loose).inc(release, identifier).version
+  } catch (er) {
+    return null
+  }
+}
+
+exports.diff = diff
+function diff (version1, version2) {
+  if (eq(version1, version2)) {
+    return null
+  } else {
+    var v1 = parse(version1)
+    var v2 = parse(version2)
+    var prefix = ''
+    if (v1.prerelease.length || v2.prerelease.length) {
+      prefix = 'pre'
+      var defaultResult = 'prerelease'
+    }
+    for (var key in v1) {
+      if (key === 'major' || key === 'minor' || key === 'patch') {
+        if (v1[key] !== v2[key]) {
+          return prefix + key
+        }
+      }
+    }
+    return defaultResult // may be undefined
+  }
+}
+
+exports.compareIdentifiers = compareIdentifiers
+
+var numeric = /^[0-9]+$/
+function compareIdentifiers (a, b) {
+  var anum = numeric.test(a)
+  var bnum = numeric.test(b)
+
+  if (anum && bnum) {
+    a = +a
+    b = +b
+  }
+
+  return a === b ? 0
+    : (anum && !bnum) ? -1
+    : (bnum && !anum) ? 1
+    : a < b ? -1
+    : 1
+}
+
+exports.rcompareIdentifiers = rcompareIdentifiers
+function rcompareIdentifiers (a, b) {
+  return compareIdentifiers(b, a)
+}
+
+exports.major = major
+function major (a, loose) {
+  return new SemVer(a, loose).major
+}
+
+exports.minor = minor
+function minor (a, loose) {
+  return new SemVer(a, loose).minor
+}
+
+exports.patch = patch
+function patch (a, loose) {
+  return new SemVer(a, loose).patch
+}
+
+exports.compare = compare
+function compare (a, b, loose) {
+  return new SemVer(a, loose).compare(new SemVer(b, loose))
+}
+
+exports.compareLoose = compareLoose
+function compareLoose (a, b) {
+  return compare(a, b, true)
+}
+
+exports.rcompare = rcompare
+function rcompare (a, b, loose) {
+  return compare(b, a, loose)
+}
+
+exports.sort = sort
+function sort (list, loose) {
+  return list.sort(function (a, b) {
+    return exports.compare(a, b, loose)
+  })
+}
+
+exports.rsort = rsort
+function rsort (list, loose) {
+  return list.sort(function (a, b) {
+    return exports.rcompare(a, b, loose)
+  })
+}
+
+exports.gt = gt
+function gt (a, b, loose) {
+  return compare(a, b, loose) > 0
+}
+
+exports.lt = lt
+function lt (a, b, loose) {
+  return compare(a, b, loose) < 0
+}
+
+exports.eq = eq
+function eq (a, b, loose) {
+  return compare(a, b, loose) === 0
+}
+
+exports.neq = neq
+function neq (a, b, loose) {
+  return compare(a, b, loose) !== 0
+}
+
+exports.gte = gte
+function gte (a, b, loose) {
+  return compare(a, b, loose) >= 0
+}
+
+exports.lte = lte
+function lte (a, b, loose) {
+  return compare(a, b, loose) <= 0
+}
+
+exports.cmp = cmp
+function cmp (a, op, b, loose) {
+  switch (op) {
+    case '===':
+      if (typeof a === 'object')
+        a = a.version
+      if (typeof b === 'object')
+        b = b.version
+      return a === b
+
+    case '!==':
+      if (typeof a === 'object')
+        a = a.version
+      if (typeof b === 'object')
+        b = b.version
+      return a !== b
+
+    case '':
+    case '=':
+    case '==':
+      return eq(a, b, loose)
+
+    case '!=':
+      return neq(a, b, loose)
+
+    case '>':
+      return gt(a, b, loose)
+
+    case '>=':
+      return gte(a, b, loose)
+
+    case '<':
+      return lt(a, b, loose)
+
+    case '<=':
+      return lte(a, b, loose)
+
+    default:
+      throw new TypeError('Invalid operator: ' + op)
+  }
+}
+
+exports.Comparator = Comparator
+function Comparator (comp, options) {
+  if (!options || typeof options !== 'object') {
+    options = {
+      loose: !!options,
+      includePrerelease: false
+    }
+  }
+
+  if (comp instanceof Comparator) {
+    if (comp.loose === !!options.loose) {
+      return comp
+    } else {
+      comp = comp.value
+    }
+  }
+
+  if (!(this instanceof Comparator)) {
+    return new Comparator(comp, options)
+  }
+
+  debug('comparator', comp, options)
+  this.options = options
+  this.loose = !!options.loose
+  this.parse(comp)
+
+  if (this.semver === ANY) {
+    this.value = ''
+  } else {
+    this.value = this.operator + this.semver.version
+  }
+
+  debug('comp', this)
+}
+
+var ANY = {}
+Comparator.prototype.parse = function (comp) {
+  var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]
+  var m = comp.match(r)
+
+  if (!m) {
+    throw new TypeError('Invalid comparator: ' + comp)
+  }
+
+  this.operator = m[1]
+  if (this.operator === '=') {
+    this.operator = ''
+  }
+
+  // if it literally is just '>' or '' then allow anything.
+  if (!m[2]) {
+    this.semver = ANY
+  } else {
+    this.semver = new SemVer(m[2], this.options.loose)
+  }
+}
+
+Comparator.prototype.toString = function () {
+  return this.value
+}
+
+Comparator.prototype.test = function (version) {
+  debug('Comparator.test', version, this.options.loose)
+
+  if (this.semver === ANY) {
+    return true
+  }
+
+  if (typeof version === 'string') {
+    version = new SemVer(version, this.options)
+  }
+
+  return cmp(version, this.operator, this.semver, this.options)
+}
+
+Comparator.prototype.intersects = function (comp, options) {
+  if (!(comp instanceof Comparator)) {
+    throw new TypeError('a Comparator is required')
+  }
+
+  if (!options || typeof options !== 'object') {
+    options = {
+      loose: !!options,
+      includePrerelease: false
+    }
+  }
+
+  var rangeTmp
+
+  if (this.operator === '') {
+    rangeTmp = new Range(comp.value, options)
+    return satisfies(this.value, rangeTmp, options)
+  } else if (comp.operator === '') {
+    rangeTmp = new Range(this.value, options)
+    return satisfies(comp.semver, rangeTmp, options)
+  }
+
+  var sameDirectionIncreasing =
+    (this.operator === '>=' || this.operator === '>') &&
+    (comp.operator === '>=' || comp.operator === '>')
+  var sameDirectionDecreasing =
+    (this.operator === '<=' || this.operator === '<') &&
+    (comp.operator === '<=' || comp.operator === '<')
+  var sameSemVer = this.semver.version === comp.semver.version
+  var differentDirectionsInclusive =
+    (this.operator === '>=' || this.operator === '<=') &&
+    (comp.operator === '>=' || comp.operator === '<=')
+  var oppositeDirectionsLessThan =
+    cmp(this.semver, '<', comp.semver, options) &&
+    ((this.operator === '>=' || this.operator === '>') &&
+    (comp.operator === '<=' || comp.operator === '<'))
+  var oppositeDirectionsGreaterThan =
+    cmp(this.semver, '>', comp.semver, options) &&
+    ((this.operator === '<=' || this.operator === '<') &&
+    (comp.operator === '>=' || comp.operator === '>'))
+
+  return sameDirectionIncreasing || sameDirectionDecreasing ||
+    (sameSemVer && differentDirectionsInclusive) ||
+    oppositeDirectionsLessThan || oppositeDirectionsGreaterThan
+}
+
+exports.Range = Range
+function Range (range, options) {
+  if (!options || typeof options !== 'object') {
+    options = {
+      loose: !!options,
+      includePrerelease: false
+    }
+  }
+
+  if (range instanceof Range) {
+    if (range.loose === !!options.loose &&
+        range.includePrerelease === !!options.includePrerelease) {
+      return range
+    } else {
+      return new Range(range.raw, options)
+    }
+  }
+
+  if (range instanceof Comparator) {
+    return new Range(range.value, options)
+  }
+
+  if (!(this instanceof Range)) {
+    return new Range(range, options)
+  }
+
+  this.options = options
+  this.loose = !!options.loose
+  this.includePrerelease = !!options.includePrerelease
+
+  // First, split based on boolean or ||
+  this.raw = range
+  this.set = range.split(/\s*\|\|\s*/).map(function (range) {
+    return this.parseRange(range.trim())
+  }, this).filter(function (c) {
+    // throw out any that are not relevant for whatever reason
+    return c.length
+  })
+
+  if (!this.set.length) {
+    throw new TypeError('Invalid SemVer Range: ' + range)
+  }
+
+  this.format()
+}
+
+Range.prototype.format = function () {
+  this.range = this.set.map(function (comps) {
+    return comps.join(' ').trim()
+  }).join('||').trim()
+  return this.range
+}
+
+Range.prototype.toString = function () {
+  return this.range
+}
+
+Range.prototype.parseRange = function (range) {
+  var loose = this.options.loose
+  range = range.trim()
+  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
+  var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]
+  range = range.replace(hr, hyphenReplace)
+  debug('hyphen replace', range)
+  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
+  range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace)
+  debug('comparator trim', range, re[COMPARATORTRIM])
+
+  // `~ 1.2.3` => `~1.2.3`
+  range = range.replace(re[TILDETRIM], tildeTrimReplace)
+
+  // `^ 1.2.3` => `^1.2.3`
+  range = range.replace(re[CARETTRIM], caretTrimReplace)
+
+  // normalize spaces
+  range = range.split(/\s+/).join(' ')
+
+  // At this point, the range is completely trimmed and
+  // ready to be split into comparators.
+
+  var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]
+  var set = range.split(' ').map(function (comp) {
+    return parseComparator(comp, this.options)
+  }, this).join(' ').split(/\s+/)
+  if (this.options.loose) {
+    // in loose mode, throw out any that are not valid comparators
+    set = set.filter(function (comp) {
+      return !!comp.match(compRe)
+    })
+  }
+  set = set.map(function (comp) {
+    return new Comparator(comp, this.options)
+  }, this)
+
+  return set
+}
+
+Range.prototype.intersects = function (range, options) {
+  if (!(range instanceof Range)) {
+    throw new TypeError('a Range is required')
+  }
+
+  return this.set.some(function (thisComparators) {
+    return thisComparators.every(function (thisComparator) {
+      return range.set.some(function (rangeComparators) {
+        return rangeComparators.every(function (rangeComparator) {
+          return thisComparator.intersects(rangeComparator, options)
+        })
+      })
+    })
+  })
+}
+
+// Mostly just for testing and legacy API reasons
+exports.toComparators = toComparators
+function toComparators (range, options) {
+  return new Range(range, options).set.map(function (comp) {
+    return comp.map(function (c) {
+      return c.value
+    }).join(' ').trim().split(' ')
+  })
+}
+
+// comprised of xranges, tildes, stars, and gtlt's at this point.
+// already replaced the hyphen ranges
+// turn into a set of JUST comparators.
+function parseComparator (comp, options) {
+  debug('comp', comp, options)
+  comp = replaceCarets(comp, options)
+  debug('caret', comp)
+  comp = replaceTildes(comp, options)
+  debug('tildes', comp)
+  comp = replaceXRanges(comp, options)
+  debug('xrange', comp)
+  comp = replaceStars(comp, options)
+  debug('stars', comp)
+  return comp
+}
+
+function isX (id) {
+  return !id || id.toLowerCase() === 'x' || id === '*'
+}
+
+// ~, ~> --> * (any, kinda silly)
+// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
+// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
+// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
+// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
+// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
+function replaceTildes (comp, options) {
+  return comp.trim().split(/\s+/).map(function (comp) {
+    return replaceTilde(comp, options)
+  }).join(' ')
+}
+
+function replaceTilde (comp, options) {
+  var r = options.loose ? re[TILDELOOSE] : re[TILDE]
+  return comp.replace(r, function (_, M, m, p, pr) {
+    debug('tilde', comp, _, M, m, p, pr)
+    var ret
+
+    if (isX(M)) {
+      ret = ''
+    } else if (isX(m)) {
+      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
+    } else if (isX(p)) {
+      // ~1.2 == >=1.2.0 <1.3.0
+      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
+    } else if (pr) {
+      debug('replaceTilde pr', pr)
+      ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
+            ' <' + M + '.' + (+m + 1) + '.0'
+    } else {
+      // ~1.2.3 == >=1.2.3 <1.3.0
+      ret = '>=' + M + '.' + m + '.' + p +
+            ' <' + M + '.' + (+m + 1) + '.0'
+    }
+
+    debug('tilde return', ret)
+    return ret
+  })
+}
+
+// ^ --> * (any, kinda silly)
+// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
+// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
+// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
+// ^1.2.3 --> >=1.2.3 <2.0.0
+// ^1.2.0 --> >=1.2.0 <2.0.0
+function replaceCarets (comp, options) {
+  return comp.trim().split(/\s+/).map(function (comp) {
+    return replaceCaret(comp, options)
+  }).join(' ')
+}
+
+function replaceCaret (comp, options) {
+  debug('caret', comp, options)
+  var r = options.loose ? re[CARETLOOSE] : re[CARET]
+  return comp.replace(r, function (_, M, m, p, pr) {
+    debug('caret', comp, _, M, m, p, pr)
+    var ret
+
+    if (isX(M)) {
+      ret = ''
+    } else if (isX(m)) {
+      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
+    } else if (isX(p)) {
+      if (M === '0') {
+        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
+      } else {
+        ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'
+      }
+    } else if (pr) {
+      debug('replaceCaret pr', pr)
+      if (M === '0') {
+        if (m === '0') {
+          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
+                ' <' + M + '.' + m + '.' + (+p + 1)
+        } else {
+          ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
+                ' <' + M + '.' + (+m + 1) + '.0'
+        }
+      } else {
+        ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
+              ' <' + (+M + 1) + '.0.0'
+      }
+    } else {
+      debug('no pr')
+      if (M === '0') {
+        if (m === '0') {
+          ret = '>=' + M + '.' + m + '.' + p +
+                ' <' + M + '.' + m + '.' + (+p + 1)
+        } else {
+          ret = '>=' + M + '.' + m + '.' + p +
+                ' <' + M + '.' + (+m + 1) + '.0'
+        }
+      } else {
+        ret = '>=' + M + '.' + m + '.' + p +
+              ' <' + (+M + 1) + '.0.0'
+      }
+    }
+
+    debug('caret return', ret)
+    return ret
+  })
+}
+
+function replaceXRanges (comp, options) {
+  debug('replaceXRanges', comp, options)
+  return comp.split(/\s+/).map(function (comp) {
+    return replaceXRange(comp, options)
+  }).join(' ')
+}
+
+function replaceXRange (comp, options) {
+  comp = comp.trim()
+  var r = options.loose ? re[XRANGELOOSE] : re[XRANGE]
+  return comp.replace(r, function (ret, gtlt, M, m, p, pr) {
+    debug('xRange', comp, ret, gtlt, M, m, p, pr)
+    var xM = isX(M)
+    var xm = xM || isX(m)
+    var xp = xm || isX(p)
+    var anyX = xp
+
+    if (gtlt === '=' && anyX) {
+      gtlt = ''
+    }
+
+    if (xM) {
+      if (gtlt === '>' || gtlt === '<') {
+        // nothing is allowed
+        ret = '<0.0.0'
+      } else {
+        // nothing is forbidden
+        ret = '*'
+      }
+    } else if (gtlt && anyX) {
+      // we know patch is an x, because we have any x at all.
+      // replace X with 0
+      if (xm) {
+        m = 0
+      }
+      p = 0
+
+      if (gtlt === '>') {
+        // >1 => >=2.0.0
+        // >1.2 => >=1.3.0
+        // >1.2.3 => >= 1.2.4
+        gtlt = '>='
+        if (xm) {
+          M = +M + 1
+          m = 0
+          p = 0
+        } else {
+          m = +m + 1
+          p = 0
+        }
+      } else if (gtlt === '<=') {
+        // <=0.7.x is actually <0.8.0, since any 0.7.x should
+        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
+        gtlt = '<'
+        if (xm) {
+          M = +M + 1
+        } else {
+          m = +m + 1
+        }
+      }
+
+      ret = gtlt + M + '.' + m + '.' + p
+    } else if (xm) {
+      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
+    } else if (xp) {
+      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
+    }
+
+    debug('xRange return', ret)
+
+    return ret
+  })
+}
+
+// Because * is AND-ed with everything else in the comparator,
+// and '' means "any version", just remove the *s entirely.
+function replaceStars (comp, options) {
+  debug('replaceStars', comp, options)
+  // Looseness is ignored here.  star is always as loose as it gets!
+  return comp.trim().replace(re[STAR], '')
+}
+
+// This function is passed to string.replace(re[HYPHENRANGE])
+// M, m, patch, prerelease, build
+// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
+// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
+// 1.2 - 3.4 => >=1.2.0 <3.5.0
+function hyphenReplace ($0,
+  from, fM, fm, fp, fpr, fb,
+  to, tM, tm, tp, tpr, tb) {
+  if (isX(fM)) {
+    from = ''
+  } else if (isX(fm)) {
+    from = '>=' + fM + '.0.0'
+  } else if (isX(fp)) {
+    from = '>=' + fM + '.' + fm + '.0'
+  } else {
+    from = '>=' + from
+  }
+
+  if (isX(tM)) {
+    to = ''
+  } else if (isX(tm)) {
+    to = '<' + (+tM + 1) + '.0.0'
+  } else if (isX(tp)) {
+    to = '<' + tM + '.' + (+tm + 1) + '.0'
+  } else if (tpr) {
+    to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr
+  } else {
+    to = '<=' + to
+  }
+
+  return (from + ' ' + to).trim()
+}
+
+// if ANY of the sets match ALL of its comparators, then pass
+Range.prototype.test = function (version) {
+  if (!version) {
+    return false
+  }
+
+  if (typeof version === 'string') {
+    version = new SemVer(version, this.options)
+  }
+
+  for (var i = 0; i < this.set.length; i++) {
+    if (testSet(this.set[i], version, this.options)) {
+      return true
+    }
+  }
+  return false
+}
+
+function testSet (set, version, options) {
+  for (var i = 0; i < set.length; i++) {
+    if (!set[i].test(version)) {
+      return false
+    }
+  }
+
+  if (version.prerelease.length && !options.includePrerelease) {
+    // Find the set of versions that are allowed to have prereleases
+    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
+    // That should allow `1.2.3-pr.2` to pass.
+    // However, `1.2.4-alpha.notready` should NOT be allowed,
+    // even though it's within the range set by the comparators.
+    for (i = 0; i < set.length; i++) {
+      debug(set[i].semver)
+      if (set[i].semver === ANY) {
+        continue
+      }
+
+      if (set[i].semver.prerelease.length > 0) {
+        var allowed = set[i].semver
+        if (allowed.major === version.major &&
+            allowed.minor === version.minor &&
+            allowed.patch === version.patch) {
+          return true
+        }
+      }
+    }
+
+    // Version has a -pre, but it's not one of the ones we like.
+    return false
+  }
+
+  return true
+}
+
+exports.satisfies = satisfies
+function satisfies (version, range, options) {
+  try {
+    range = new Range(range, options)
+  } catch (er) {
+    return false
+  }
+  return range.test(version)
+}
+
+exports.maxSatisfying = maxSatisfying
+function maxSatisfying (versions, range, options) {
+  var max = null
+  var maxSV = null
+  try {
+    var rangeObj = new Range(range, options)
+  } catch (er) {
+    return null
+  }
+  versions.forEach(function (v) {
+    if (rangeObj.test(v)) {
+      // satisfies(v, range, options)
+      if (!max || maxSV.compare(v) === -1) {
+        // compare(max, v, true)
+        max = v
+        maxSV = new SemVer(max, options)
+      }
+    }
+  })
+  return max
+}
+
+exports.minSatisfying = minSatisfying
+function minSatisfying (versions, range, options) {
+  var min = null
+  var minSV = null
+  try {
+    var rangeObj = new Range(range, options)
+  } catch (er) {
+    return null
+  }
+  versions.forEach(function (v) {
+    if (rangeObj.test(v)) {
+      // satisfies(v, range, options)
+      if (!min || minSV.compare(v) === 1) {
+        // compare(min, v, true)
+        min = v
+        minSV = new SemVer(min, options)
+      }
+    }
+  })
+  return min
+}
+
+exports.minVersion = minVersion
+function minVersion (range, loose) {
+  range = new Range(range, loose)
+
+  var minver = new SemVer('0.0.0')
+  if (range.test(minver)) {
+    return minver
+  }
+
+  minver = new SemVer('0.0.0-0')
+  if (range.test(minver)) {
+    return minver
+  }
+
+  minver = null
+  for (var i = 0; i < range.set.length; ++i) {
+    var comparators = range.set[i]
+
+    comparators.forEach(function (comparator) {
+      // Clone to avoid manipulating the comparator's semver object.
+      var compver = new SemVer(comparator.semver.version)
+      switch (comparator.operator) {
+        case '>':
+          if (compver.prerelease.length === 0) {
+            compver.patch++
+          } else {
+            compver.prerelease.push(0)
+          }
+          compver.raw = compver.format()
+          /* fallthrough */
+        case '':
+        case '>=':
+          if (!minver || gt(minver, compver)) {
+            minver = compver
+          }
+          break
+        case '<':
+        case '<=':
+          /* Ignore maximum versions */
+          break
+        /* istanbul ignore next */
+        default:
+          throw new Error('Unexpected operation: ' + comparator.operator)
+      }
+    })
+  }
+
+  if (minver && range.test(minver)) {
+    return minver
+  }
+
+  return null
+}
+
+exports.validRange = validRange
+function validRange (range, options) {
+  try {
+    // Return '*' instead of '' so that truthiness works.
+    // This will throw if it's invalid anyway
+    return new Range(range, options).range || '*'
+  } catch (er) {
+    return null
+  }
+}
+
+// Determine if version is less than all the versions possible in the range
+exports.ltr = ltr
+function ltr (version, range, options) {
+  return outside(version, range, '<', options)
+}
+
+// Determine if version is greater than all the versions possible in the range.
+exports.gtr = gtr
+function gtr (version, range, options) {
+  return outside(version, range, '>', options)
+}
+
+exports.outside = outside
+function outside (version, range, hilo, options) {
+  version = new SemVer(version, options)
+  range = new Range(range, options)
+
+  var gtfn, ltefn, ltfn, comp, ecomp
+  switch (hilo) {
+    case '>':
+      gtfn = gt
+      ltefn = lte
+      ltfn = lt
+      comp = '>'
+      ecomp = '>='
+      break
+    case '<':
+      gtfn = lt
+      ltefn = gte
+      ltfn = gt
+      comp = '<'
+      ecomp = '<='
+      break
+    default:
+      throw new TypeError('Must provide a hilo val of "<" or ">"')
+  }
+
+  // If it satisifes the range it is not outside
+  if (satisfies(version, range, options)) {
+    return false
+  }
+
+  // From now on, variable terms are as if we're in "gtr" mode.
+  // but note that everything is flipped for the "ltr" function.
+
+  for (var i = 0; i < range.set.length; ++i) {
+    var comparators = range.set[i]
+
+    var high = null
+    var low = null
+
+    comparators.forEach(function (comparator) {
+      if (comparator.semver === ANY) {
+        comparator = new Comparator('>=0.0.0')
+      }
+      high = high || comparator
+      low = low || comparator
+      if (gtfn(comparator.semver, high.semver, options)) {
+        high = comparator
+      } else if (ltfn(comparator.semver, low.semver, options)) {
+        low = comparator
+      }
+    })
+
+    // If the edge version comparator has a operator then our version
+    // isn't outside it
+    if (high.operator === comp || high.operator === ecomp) {
+      return false
+    }
+
+    // If the lowest version comparator has an operator and our version
+    // is less than it then it isn't higher than the range
+    if ((!low.operator || low.operator === comp) &&
+        ltefn(version, low.semver)) {
+      return false
+    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
+      return false
+    }
+  }
+  return true
+}
+
+exports.prerelease = prerelease
+function prerelease (version, options) {
+  var parsed = parse(version, options)
+  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
+}
+
+exports.intersects = intersects
+function intersects (r1, r2, options) {
+  r1 = new Range(r1, options)
+  r2 = new Range(r2, options)
+  return r1.intersects(r2)
+}
+
+exports.coerce = coerce
+function coerce (version) {
+  if (version instanceof SemVer) {
+    return version
+  }
+
+  if (typeof version !== 'string') {
+    return null
+  }
+
+  var match = version.match(re[COERCE])
+
+  if (match == null) {
+    return null
+  }
+
+  return parse(match[1] +
+    '.' + (match[2] || '0') +
+    '.' + (match[3] || '0'))
+}
diff --git a/node_modules/serialport/CHANGELOG.md b/node_modules/serialport/CHANGELOG.md
new file mode 100644
index 0000000..05ed049
--- /dev/null
+++ b/node_modules/serialport/CHANGELOG.md
@@ -0,0 +1,67 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+
+## [9.0.4](https://github.com/serialport/node-serialport/compare/v9.0.3...v9.0.4) (2020-12-17)
+
+**Note:** Version bump only for package serialport
+
+
+
+
+
+## [9.0.3](https://github.com/serialport/node-serialport/compare/v9.0.2...v9.0.3) (2020-12-04)
+
+**Note:** Version bump only for package serialport
+
+
+
+
+
+## [9.0.2](https://github.com/serialport/node-serialport/compare/v9.0.1...v9.0.2) (2020-10-16)
+
+**Note:** Version bump only for package serialport
+
+
+
+
+
+## [9.0.1](https://github.com/serialport/node-serialport/compare/v9.0.0...v9.0.1) (2020-08-08)
+
+**Note:** Version bump only for package serialport
+
+
+
+
+
+# [9.0.0](https://github.com/serialport/node-serialport/compare/v8.0.8...v9.0.0) (2020-05-10)
+
+**Note:** Version bump only for package serialport
+
+
+
+
+
+## [8.0.8](https://github.com/serialport/node-serialport/compare/v8.0.7...v8.0.8) (2020-05-07)
+
+**Note:** Version bump only for package serialport
+
+
+
+
+
+## [8.0.7](https://github.com/serialport/node-serialport/compare/v8.0.6...v8.0.7) (2020-01-30)
+
+**Note:** Version bump only for package serialport
+
+
+
+
+
+## [8.0.6](https://github.com/serialport/node-serialport/compare/v8.0.5...v8.0.6) (2019-12-25)
+
+
+### Bug Fixes
+
+* stream required bindings-mock as a dep ([#1970](https://github.com/serialport/node-serialport/issues/1970)) ([e978b7e](https://github.com/serialport/node-serialport/commit/e978b7eb244b87a6be2ae914965adeb1f4562935))
diff --git a/node_modules/serialport/LICENSE b/node_modules/serialport/LICENSE
new file mode 100644
index 0000000..800d776
--- /dev/null
+++ b/node_modules/serialport/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright 2010 Christopher Williams. All rights reserved.
+
+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/serialport/README.md b/node_modules/serialport/README.md
new file mode 100644
index 0000000..ac8b8e2
--- /dev/null
+++ b/node_modules/serialport/README.md
@@ -0,0 +1,91 @@
+# SerialPort
+
+Access serial ports with JavaScript. Linux, OSX and Windows. Welcome your robotic JavaScript overlords. Better yet, program them!
+
+> Go to https://serialport.io/ to learn more, find guides and api documentation.
+
+## Quick Links
+- [**Guides**](https://serialport.io/docs/guide-about)
+- [**API Docs**](https://serialport.io/docs/api-serialport)
+- [The `serialport` package api docs](https://serialport.io/docs/api-serialport)
+
+
+### Serialport
+- [`serialport`](https://serialport.io/docs/api-serialport) Chances are you're looking for the `serialport` package which provides a good set of defaults for most projects. However it is quite easy to mix and match the parts of serialport you need.
+
+### Bindings
+The Bindings provide a low level interface to work with your serialport. It is possible to use them alone but it's usually easier to use them with an interface.
+- [`@serialport/bindings`](https://serialport.io/docs/api-bindings) bindings for Linux, Mac and Windows
+- [`@serialport/binding-abstract`](https://serialport.io/docs/api-bindings-abstract) as an abstract class to use if you're making your own bindings
+- [`@serialport/binding-mock`](https://serialport.io/docs/api-binding-mock) for a mock binding package for testing
+
+### Interfaces
+Interfaces take a binding object and provide a different API on top of it. Currently we only ship a Node Stream Interface.
+
+- [`@serialport/stream`](https://serialport.io/docs/api-stream) our traditional Node.js Stream interface
+
+### Parsers
+
+Parsers are used to take raw binary data and transform them into usable messages. This may include tasks such as converting the data to text, emitting useful chunks of data when they have been fully received, or even validating protocols.
+
+Parsers are traditionally Transform streams, but Duplex streams and other non stream interfaces are acceptable.
+
+- [@serialport/parser-byte-length](https://serialport.io/docs/api-parser-byte-length)
+- [@serialport/parser-cctalk](https://serialport.io/docs/api-parser-cctalk)
+- [@serialport/parser-delimiter](https://serialport.io/docs/api-parser-delimiter)
+- [@serialport/parser-readline](https://serialport.io/docs/api-parser-readline)
+- [@serialport/parser-ready](https://serialport.io/docs/api-parser-ready)
+- [@serialport/parser-regex](https://serialport.io/docs/api-parser-regex)
+- [@serialport/parser-slip-encoder](https://serialport.io/docs/api-parser-slip-encoder)
+
+## Developing
+
+### Developing node serialport projects
+1. Clone this repo `git clone git@github.com:serialport/node-serialport.git`
+1. Run `npm install` to setup local package dependencies (run this any time you depend on a package local to this repo)
+1. Run `npm test` to ensure everything is working properly
+1. Run `npm run generate` to generate a new project
+1. Add dev dependencies to the root package.json and package dependencies to the package's one.
+
+### Developing Docs
+
+You can develop the docs by running
+
+```bash
+npm run docs:dev
+```
+
+And build them by running
+```bash
+npm run docs
+```
+
+Docs are automatically built with [netlify](https://www.netlify.com/pricing/) including previews on branches. The master branch is deployed to https://serialport.io
+
+## License
+SerialPort packages are all [MIT licensed](LICENSE) and all it's dependencies are MIT licensed.
+
+## Code of Conduct
+SerialPort follows the [Nodebots Code of Conduct](http://nodebots.io/conduct.html). While the code is MIT licensed participation in the community has some rules to make this a good place to work and learn.
+
+### TLDR
+- Be respectful.
+- Abusive behavior is never tolerated.
+- Data published to NodeBots is hosted at the discretion of the service administrators, and may be removed.
+- Don't build evil robots.
+- Violations of this code may result in swift and permanent expulsion from the NodeBots community.
+
+## Governance and Community
+
+SerialPort is currently employees a [governance](https://medium.com/the-node-js-collection/healthy-open-source-967fa8be7951) with a group of maintainers, committers and contributors, all fixing bugs and adding features and improving documentation. You need not apply to work on SerialPort, all are welcome to join, build, and maintain this project.
+
+- A Contributor is any individual creating or commenting on an issue or pull request. By participating, this is you.
+- Committers are contributors who have been given write access to the repository. They can review and merge pull requests.
+- Maintainers are committers representing the required technical expertise to resolve rare disputes.
+
+If you have a PR that improves the project people in any or all of the above people will help you land it.
+
+**Maintainers**
+
+- [Francis Gulotta](https://twitter.com/reconbot) | [reconbot](https://github.com/reconbot)
+- [Nick Hehr](https://twitter.com/hipsterbrown) | [hipsterbrown](https://github.com/hipsterbrown)
diff --git a/node_modules/serialport/lib/index.js b/node_modules/serialport/lib/index.js
new file mode 100644
index 0000000..e40447c
--- /dev/null
+++ b/node_modules/serialport/lib/index.js
@@ -0,0 +1,15 @@
+const SerialPort = require('@serialport/stream')
+const Binding = require('@serialport/bindings')
+const parsers = require('./parsers')
+
+/**
+ * @type {AbstractBinding}
+ */
+SerialPort.Binding = Binding
+
+/**
+ * @type {Parsers}
+ */
+SerialPort.parsers = parsers
+
+module.exports = SerialPort
diff --git a/node_modules/serialport/lib/parsers.js b/node_modules/serialport/lib/parsers.js
new file mode 100644
index 0000000..617118e
--- /dev/null
+++ b/node_modules/serialport/lib/parsers.js
@@ -0,0 +1,8 @@
+module.exports = {
+  ByteLength: require('@serialport/parser-byte-length'),
+  CCTalk: require('@serialport/parser-cctalk'),
+  Delimiter: require('@serialport/parser-delimiter'),
+  Readline: require('@serialport/parser-readline'),
+  Ready: require('@serialport/parser-ready'),
+  Regex: require('@serialport/parser-regex'),
+}
diff --git a/node_modules/serialport/package.json b/node_modules/serialport/package.json
new file mode 100644
index 0000000..6c86dc8
--- /dev/null
+++ b/node_modules/serialport/package.json
@@ -0,0 +1,98 @@
+{
+  "_from": "serialport",
+  "_id": "serialport@9.0.4",
+  "_inBundle": false,
+  "_integrity": "sha512-Wtl6sxciHKNdJKW8jUZm+f5KRXt0J0UP25ksM8N31l08KTdAhZ5MmKNUFpoO/YYG6TvHFOu+07PUX35m+TUw7g==",
+  "_location": "/serialport",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "serialport",
+    "name": "serialport",
+    "escapedName": "serialport",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/serialport/-/serialport-9.0.4.tgz",
+  "_shasum": "9d6264fd738e0ba86c731071900c87ee52e34fd5",
+  "_spec": "serialport",
+  "_where": "F:\\vent-display",
+  "bugs": {
+    "url": "https://github.com/serialport/node-serialport/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "@serialport/binding-mock": "^9.0.2",
+    "@serialport/bindings": "^9.0.4",
+    "@serialport/parser-byte-length": "^9.0.1",
+    "@serialport/parser-cctalk": "^9.0.1",
+    "@serialport/parser-delimiter": "^9.0.1",
+    "@serialport/parser-readline": "^9.0.1",
+    "@serialport/parser-ready": "^9.0.1",
+    "@serialport/parser-regex": "^9.0.1",
+    "@serialport/stream": "^9.0.2",
+    "debug": "^4.1.1"
+  },
+  "deprecated": false,
+  "description": "Node.js package to access serial ports. Linux, OSX and Windows. Welcome your robotic JavaScript overlords. Better yet, program them!",
+  "engines": {
+    "node": ">=8.6.0"
+  },
+  "gitHead": "b8b12c0671f783193e2b798cb3d8ef67edd2de4b",
+  "homepage": "https://github.com/serialport/node-serialport#readme",
+  "keywords": [
+    "ccTalk",
+    "com port",
+    "data logging",
+    "hardware",
+    "iot",
+    "johnny-five",
+    "modem",
+    "nodebots",
+    "RFID",
+    "robotics",
+    "sensor",
+    "serial port",
+    "serial",
+    "serialport",
+    "sms gateway",
+    "sms",
+    "stream",
+    "tty",
+    "UART"
+  ],
+  "license": "MIT",
+  "main": "lib",
+  "maintainers": [
+    {
+      "name": "Francis Gulotta",
+      "email": "wizard@roborooter.com",
+      "url": "https://www.roborooter.com"
+    },
+    {
+      "name": "Nick Hehr",
+      "email": "headhipster@hipsterbrown.com",
+      "url": "https://hipsterbrown.com/"
+    },
+    {
+      "name": "Maybe you? Come and help out!",
+      "url": "https://github.com/node-serialport"
+    }
+  ],
+  "name": "serialport",
+  "preferUnplugged": false,
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/serialport/node-serialport.git"
+  },
+  "scripts": {
+    "postinstall": "node thank-you.js"
+  },
+  "version": "9.0.4"
+}
diff --git a/node_modules/serialport/test.js b/node_modules/serialport/test.js
new file mode 100644
index 0000000..3540505
--- /dev/null
+++ b/node_modules/serialport/test.js
@@ -0,0 +1,8 @@
+const SerialPort = require('@serialport/stream')
+const Binding = require('@serialport/binding-mock')
+const parsers = require('./lib/parsers')
+
+SerialPort.Binding = Binding
+SerialPort.parsers = parsers
+
+module.exports = SerialPort
diff --git a/node_modules/serialport/thank-you.js b/node_modules/serialport/thank-you.js
new file mode 100644
index 0000000..efd512a
--- /dev/null
+++ b/node_modules/serialport/thank-you.js
@@ -0,0 +1,3 @@
+const message =
+  '\u001b[96m\u001b[1mThank you for using serialport!\u001b[96m\u001b[1m\n\u001b[0m\u001b[96mIf you rely on this package, please consider supporting our open collective:\u001b[22m\u001b[39m\n> \u001b[94mhttps://opencollective.com/serialport/donate\u001b[0m\n\n'
+console.log(message)
diff --git a/node_modules/set-blocking/CHANGELOG.md b/node_modules/set-blocking/CHANGELOG.md
new file mode 100644
index 0000000..03bf591
--- /dev/null
+++ b/node_modules/set-blocking/CHANGELOG.md
@@ -0,0 +1,26 @@
+# Change Log
+
+All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+
+<a name="2.0.0"></a>
+# [2.0.0](https://github.com/yargs/set-blocking/compare/v1.0.0...v2.0.0) (2016-05-17)
+
+
+### Features
+
+* add an isTTY check ([#3](https://github.com/yargs/set-blocking/issues/3)) ([66ce277](https://github.com/yargs/set-blocking/commit/66ce277))
+
+
+### BREAKING CHANGES
+
+* stdio/stderr will not be set to blocking if isTTY === false
+
+
+
+<a name="1.0.0"></a>
+# 1.0.0 (2016-05-14)
+
+
+### Features
+
+* implemented shim for stream._handle.setBlocking ([6bde0c0](https://github.com/yargs/set-blocking/commit/6bde0c0))
diff --git a/node_modules/set-blocking/LICENSE.txt b/node_modules/set-blocking/LICENSE.txt
new file mode 100644
index 0000000..836440b
--- /dev/null
+++ b/node_modules/set-blocking/LICENSE.txt
@@ -0,0 +1,14 @@
+Copyright (c) 2016, Contributors
+
+Permission to use, copy, modify, and/or distribute this software
+for any purpose with or without fee is hereby granted, provided
+that the above copyright notice and this permission notice
+appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
+LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
+OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/set-blocking/README.md b/node_modules/set-blocking/README.md
new file mode 100644
index 0000000..e93b420
--- /dev/null
+++ b/node_modules/set-blocking/README.md
@@ -0,0 +1,31 @@
+# set-blocking
+
+[![Build Status](https://travis-ci.org/yargs/set-blocking.svg)](https://travis-ci.org/yargs/set-blocking)
+[![NPM version](https://img.shields.io/npm/v/set-blocking.svg)](https://www.npmjs.com/package/set-blocking)
+[![Coverage Status](https://coveralls.io/repos/yargs/set-blocking/badge.svg?branch=)](https://coveralls.io/r/yargs/set-blocking?branch=master)
+[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version)
+
+set blocking `stdio` and `stderr` ensuring that terminal output does not truncate.
+
+```js
+const setBlocking = require('set-blocking')
+setBlocking(true)
+console.log(someLargeStringToOutput)
+```
+
+## Historical Context/Word of Warning
+
+This was created as a shim to address the bug discussed in [node #6456](https://github.com/nodejs/node/issues/6456). This bug crops up on
+newer versions of Node.js (`0.12+`), truncating terminal output.
+
+You should be mindful of the side-effects caused by using `set-blocking`:
+
+* if your module sets blocking to `true`, it will effect other modules
+  consuming your library. In [yargs](https://github.com/yargs/yargs/blob/master/yargs.js#L653) we only call
+  `setBlocking(true)` once we already know we are about to call `process.exit(code)`.
+* this patch will not apply to subprocesses spawned with `isTTY = true`, this is
+  the [default `spawn()` behavior](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options).
+
+## License
+
+ISC
diff --git a/node_modules/set-blocking/index.js b/node_modules/set-blocking/index.js
new file mode 100644
index 0000000..6f78774
--- /dev/null
+++ b/node_modules/set-blocking/index.js
@@ -0,0 +1,7 @@
+module.exports = function (blocking) {
+  [process.stdout, process.stderr].forEach(function (stream) {
+    if (stream._handle && stream.isTTY && typeof stream._handle.setBlocking === 'function') {
+      stream._handle.setBlocking(blocking)
+    }
+  })
+}
diff --git a/node_modules/set-blocking/package.json b/node_modules/set-blocking/package.json
new file mode 100644
index 0000000..4f8b7c7
--- /dev/null
+++ b/node_modules/set-blocking/package.json
@@ -0,0 +1,70 @@
+{
+  "_from": "set-blocking@~2.0.0",
+  "_id": "set-blocking@2.0.0",
+  "_inBundle": false,
+  "_integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+  "_location": "/set-blocking",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "set-blocking@~2.0.0",
+    "name": "set-blocking",
+    "escapedName": "set-blocking",
+    "rawSpec": "~2.0.0",
+    "saveSpec": null,
+    "fetchSpec": "~2.0.0"
+  },
+  "_requiredBy": [
+    "/npmlog"
+  ],
+  "_resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+  "_shasum": "045f9782d011ae9a6803ddd382b24392b3d890f7",
+  "_spec": "set-blocking@~2.0.0",
+  "_where": "F:\\vent-display\\node_modules\\npmlog",
+  "author": {
+    "name": "Ben Coe",
+    "email": "ben@npmjs.com"
+  },
+  "bugs": {
+    "url": "https://github.com/yargs/set-blocking/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "set blocking stdio and stderr ensuring that terminal output does not truncate",
+  "devDependencies": {
+    "chai": "^3.5.0",
+    "coveralls": "^2.11.9",
+    "mocha": "^2.4.5",
+    "nyc": "^6.4.4",
+    "standard": "^7.0.1",
+    "standard-version": "^2.2.1"
+  },
+  "files": [
+    "index.js",
+    "LICENSE.txt"
+  ],
+  "homepage": "https://github.com/yargs/set-blocking#readme",
+  "keywords": [
+    "flush",
+    "terminal",
+    "blocking",
+    "shim",
+    "stdio",
+    "stderr"
+  ],
+  "license": "ISC",
+  "main": "index.js",
+  "name": "set-blocking",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/yargs/set-blocking.git"
+  },
+  "scripts": {
+    "coverage": "nyc report --reporter=text-lcov | coveralls",
+    "pretest": "standard",
+    "test": "nyc mocha ./test/*.js",
+    "version": "standard-version"
+  },
+  "version": "2.0.0"
+}
diff --git a/node_modules/signal-exit/CHANGELOG.md b/node_modules/signal-exit/CHANGELOG.md
new file mode 100644
index 0000000..ed104f4
--- /dev/null
+++ b/node_modules/signal-exit/CHANGELOG.md
@@ -0,0 +1,35 @@
+# Changelog
+
+All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+
+### [3.0.3](https://github.com/tapjs/signal-exit/compare/v3.0.2...v3.0.3) (2020-03-26)
+
+
+### Bug Fixes
+
+* patch `SIGHUP` to `SIGINT` when on Windows ([cfd1046](https://github.com/tapjs/signal-exit/commit/cfd1046079af4f0e44f93c69c237a09de8c23ef2))
+* **ci:** use Travis for Windows builds ([007add7](https://github.com/tapjs/signal-exit/commit/007add793d2b5ae3c382512103adbf321768a0b8))
+
+<a name="3.0.1"></a>
+## [3.0.1](https://github.com/tapjs/signal-exit/compare/v3.0.0...v3.0.1) (2016-09-08)
+
+
+### Bug Fixes
+
+* do not listen on SIGBUS, SIGFPE, SIGSEGV and SIGILL ([#40](https://github.com/tapjs/signal-exit/issues/40)) ([5b105fb](https://github.com/tapjs/signal-exit/commit/5b105fb))
+
+
+
+<a name="3.0.0"></a>
+# [3.0.0](https://github.com/tapjs/signal-exit/compare/v2.1.2...v3.0.0) (2016-06-13)
+
+
+### Bug Fixes
+
+* get our test suite running on Windows ([#23](https://github.com/tapjs/signal-exit/issues/23)) ([6f3eda8](https://github.com/tapjs/signal-exit/commit/6f3eda8))
+* hooking SIGPROF was interfering with profilers see [#21](https://github.com/tapjs/signal-exit/issues/21) ([#24](https://github.com/tapjs/signal-exit/issues/24)) ([1248a4c](https://github.com/tapjs/signal-exit/commit/1248a4c))
+
+
+### BREAKING CHANGES
+
+* signal-exit no longer wires into SIGPROF
diff --git a/node_modules/signal-exit/LICENSE.txt b/node_modules/signal-exit/LICENSE.txt
new file mode 100644
index 0000000..eead04a
--- /dev/null
+++ b/node_modules/signal-exit/LICENSE.txt
@@ -0,0 +1,16 @@
+The ISC License
+
+Copyright (c) 2015, Contributors
+
+Permission to use, copy, modify, and/or distribute this software
+for any purpose with or without fee is hereby granted, provided
+that the above copyright notice and this permission notice
+appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
+LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
+OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/signal-exit/README.md b/node_modules/signal-exit/README.md
new file mode 100644
index 0000000..9f8eb59
--- /dev/null
+++ b/node_modules/signal-exit/README.md
@@ -0,0 +1,39 @@
+# signal-exit
+
+[![Build Status](https://travis-ci.org/tapjs/signal-exit.png)](https://travis-ci.org/tapjs/signal-exit)
+[![Coverage](https://coveralls.io/repos/tapjs/signal-exit/badge.svg?branch=master)](https://coveralls.io/r/tapjs/signal-exit?branch=master)
+[![NPM version](https://img.shields.io/npm/v/signal-exit.svg)](https://www.npmjs.com/package/signal-exit)
+[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version)
+
+When you want to fire an event no matter how a process exits:
+
+* reaching the end of execution.
+* explicitly having `process.exit(code)` called.
+* having `process.kill(pid, sig)` called.
+* receiving a fatal signal from outside the process
+
+Use `signal-exit`.
+
+```js
+var onExit = require('signal-exit')
+
+onExit(function (code, signal) {
+  console.log('process exited!')
+})
+```
+
+## API
+
+`var remove = onExit(function (code, signal) {}, options)`
+
+The return value of the function is a function that will remove the
+handler.
+
+Note that the function *only* fires for signals if the signal would
+cause the proces to exit.  That is, there are no other listeners, and
+it is a fatal signal.
+
+## Options
+
+* `alwaysLast`: Run this handler after any other signal or exit
+  handlers.  This causes `process.emit` to be monkeypatched.
diff --git a/node_modules/signal-exit/index.js b/node_modules/signal-exit/index.js
new file mode 100644
index 0000000..6b6c43a
--- /dev/null
+++ b/node_modules/signal-exit/index.js
@@ -0,0 +1,163 @@
+// Note: since nyc uses this module to output coverage, any lines
+// that are in the direct sync flow of nyc's outputCoverage are
+// ignored, since we can never get coverage for them.
+var assert = require('assert')
+var signals = require('./signals.js')
+var isWin = /^win/i.test(process.platform)
+
+var EE = require('events')
+/* istanbul ignore if */
+if (typeof EE !== 'function') {
+  EE = EE.EventEmitter
+}
+
+var emitter
+if (process.__signal_exit_emitter__) {
+  emitter = process.__signal_exit_emitter__
+} else {
+  emitter = process.__signal_exit_emitter__ = new EE()
+  emitter.count = 0
+  emitter.emitted = {}
+}
+
+// Because this emitter is a global, we have to check to see if a
+// previous version of this library failed to enable infinite listeners.
+// I know what you're about to say.  But literally everything about
+// signal-exit is a compromise with evil.  Get used to it.
+if (!emitter.infinite) {
+  emitter.setMaxListeners(Infinity)
+  emitter.infinite = true
+}
+
+module.exports = function (cb, opts) {
+  assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler')
+
+  if (loaded === false) {
+    load()
+  }
+
+  var ev = 'exit'
+  if (opts && opts.alwaysLast) {
+    ev = 'afterexit'
+  }
+
+  var remove = function () {
+    emitter.removeListener(ev, cb)
+    if (emitter.listeners('exit').length === 0 &&
+        emitter.listeners('afterexit').length === 0) {
+      unload()
+    }
+  }
+  emitter.on(ev, cb)
+
+  return remove
+}
+
+module.exports.unload = unload
+function unload () {
+  if (!loaded) {
+    return
+  }
+  loaded = false
+
+  signals.forEach(function (sig) {
+    try {
+      process.removeListener(sig, sigListeners[sig])
+    } catch (er) {}
+  })
+  process.emit = originalProcessEmit
+  process.reallyExit = originalProcessReallyExit
+  emitter.count -= 1
+}
+
+function emit (event, code, signal) {
+  if (emitter.emitted[event]) {
+    return
+  }
+  emitter.emitted[event] = true
+  emitter.emit(event, code, signal)
+}
+
+// { <signal>: <listener fn>, ... }
+var sigListeners = {}
+signals.forEach(function (sig) {
+  sigListeners[sig] = function listener () {
+    // If there are no other listeners, an exit is coming!
+    // Simplest way: remove us and then re-send the signal.
+    // We know that this will kill the process, so we can
+    // safely emit now.
+    var listeners = process.listeners(sig)
+    if (listeners.length === emitter.count) {
+      unload()
+      emit('exit', null, sig)
+      /* istanbul ignore next */
+      emit('afterexit', null, sig)
+      /* istanbul ignore next */
+      if (isWin && sig === 'SIGHUP') {
+        // "SIGHUP" throws an `ENOSYS` error on Windows,
+        // so use a supported signal instead
+        sig = 'SIGINT'
+      }
+      process.kill(process.pid, sig)
+    }
+  }
+})
+
+module.exports.signals = function () {
+  return signals
+}
+
+module.exports.load = load
+
+var loaded = false
+
+function load () {
+  if (loaded) {
+    return
+  }
+  loaded = true
+
+  // This is the number of onSignalExit's that are in play.
+  // It's important so that we can count the correct number of
+  // listeners on signals, and don't wait for the other one to
+  // handle it instead of us.
+  emitter.count += 1
+
+  signals = signals.filter(function (sig) {
+    try {
+      process.on(sig, sigListeners[sig])
+      return true
+    } catch (er) {
+      return false
+    }
+  })
+
+  process.emit = processEmit
+  process.reallyExit = processReallyExit
+}
+
+var originalProcessReallyExit = process.reallyExit
+function processReallyExit (code) {
+  process.exitCode = code || 0
+  emit('exit', process.exitCode, null)
+  /* istanbul ignore next */
+  emit('afterexit', process.exitCode, null)
+  /* istanbul ignore next */
+  originalProcessReallyExit.call(process, process.exitCode)
+}
+
+var originalProcessEmit = process.emit
+function processEmit (ev, arg) {
+  if (ev === 'exit') {
+    if (arg !== undefined) {
+      process.exitCode = arg
+    }
+    var ret = originalProcessEmit.apply(this, arguments)
+    emit('exit', process.exitCode, null)
+    /* istanbul ignore next */
+    emit('afterexit', process.exitCode, null)
+    return ret
+  } else {
+    return originalProcessEmit.apply(this, arguments)
+  }
+}
diff --git a/node_modules/signal-exit/package.json b/node_modules/signal-exit/package.json
new file mode 100644
index 0000000..f45a156
--- /dev/null
+++ b/node_modules/signal-exit/package.json
@@ -0,0 +1,66 @@
+{
+  "_from": "signal-exit@^3.0.0",
+  "_id": "signal-exit@3.0.3",
+  "_inBundle": false,
+  "_integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+  "_location": "/signal-exit",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "signal-exit@^3.0.0",
+    "name": "signal-exit",
+    "escapedName": "signal-exit",
+    "rawSpec": "^3.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^3.0.0"
+  },
+  "_requiredBy": [
+    "/gauge"
+  ],
+  "_resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+  "_shasum": "a1410c2edd8f077b08b4e253c8eacfcaf057461c",
+  "_spec": "signal-exit@^3.0.0",
+  "_where": "F:\\vent-display\\node_modules\\gauge",
+  "author": {
+    "name": "Ben Coe",
+    "email": "ben@npmjs.com"
+  },
+  "bugs": {
+    "url": "https://github.com/tapjs/signal-exit/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "when you want to fire an event no matter how a process exits.",
+  "devDependencies": {
+    "chai": "^3.5.0",
+    "coveralls": "^2.11.10",
+    "nyc": "^8.1.0",
+    "standard": "^8.1.0",
+    "standard-version": "^2.3.0",
+    "tap": "^8.0.1"
+  },
+  "files": [
+    "index.js",
+    "signals.js"
+  ],
+  "homepage": "https://github.com/tapjs/signal-exit",
+  "keywords": [
+    "signal",
+    "exit"
+  ],
+  "license": "ISC",
+  "main": "index.js",
+  "name": "signal-exit",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/tapjs/signal-exit.git"
+  },
+  "scripts": {
+    "coverage": "nyc report --reporter=text-lcov | coveralls",
+    "pretest": "standard",
+    "release": "standard-version",
+    "test": "tap --timeout=240 ./test/*.js --cov"
+  },
+  "version": "3.0.3"
+}
diff --git a/node_modules/signal-exit/signals.js b/node_modules/signal-exit/signals.js
new file mode 100644
index 0000000..3bd67a8
--- /dev/null
+++ b/node_modules/signal-exit/signals.js
@@ -0,0 +1,53 @@
+// This is not the set of all possible signals.
+//
+// It IS, however, the set of all signals that trigger
+// an exit on either Linux or BSD systems.  Linux is a
+// superset of the signal names supported on BSD, and
+// the unknown signals just fail to register, so we can
+// catch that easily enough.
+//
+// Don't bother with SIGKILL.  It's uncatchable, which
+// means that we can't fire any callbacks anyway.
+//
+// If a user does happen to register a handler on a non-
+// fatal signal like SIGWINCH or something, and then
+// exit, it'll end up firing `process.emit('exit')`, so
+// the handler will be fired anyway.
+//
+// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised
+// artificially, inherently leave the process in a
+// state from which it is not safe to try and enter JS
+// listeners.
+module.exports = [
+  'SIGABRT',
+  'SIGALRM',
+  'SIGHUP',
+  'SIGINT',
+  'SIGTERM'
+]
+
+if (process.platform !== 'win32') {
+  module.exports.push(
+    'SIGVTALRM',
+    'SIGXCPU',
+    'SIGXFSZ',
+    'SIGUSR2',
+    'SIGTRAP',
+    'SIGSYS',
+    'SIGQUIT',
+    'SIGIOT'
+    // should detect profiler and enable/disable accordingly.
+    // see #21
+    // 'SIGPROF'
+  )
+}
+
+if (process.platform === 'linux') {
+  module.exports.push(
+    'SIGIO',
+    'SIGPOLL',
+    'SIGPWR',
+    'SIGSTKFLT',
+    'SIGUNUSED'
+  )
+}
diff --git a/node_modules/simple-concat/.travis.yml b/node_modules/simple-concat/.travis.yml
new file mode 100644
index 0000000..c159f6a
--- /dev/null
+++ b/node_modules/simple-concat/.travis.yml
@@ -0,0 +1,3 @@
+language: node_js
+node_js:
+  - lts/*
diff --git a/node_modules/simple-concat/LICENSE b/node_modules/simple-concat/LICENSE
new file mode 100644
index 0000000..c7e6852
--- /dev/null
+++ b/node_modules/simple-concat/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) Feross Aboukhadijeh
+
+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/simple-concat/README.md b/node_modules/simple-concat/README.md
new file mode 100644
index 0000000..b7d39bd
--- /dev/null
+++ b/node_modules/simple-concat/README.md
@@ -0,0 +1,44 @@
+# simple-concat [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url]
+
+[travis-image]: https://img.shields.io/travis/feross/simple-concat/master.svg
+[travis-url]: https://travis-ci.org/feross/simple-concat
+[npm-image]: https://img.shields.io/npm/v/simple-concat.svg
+[npm-url]: https://npmjs.org/package/simple-concat
+[downloads-image]: https://img.shields.io/npm/dm/simple-concat.svg
+[downloads-url]: https://npmjs.org/package/simple-concat
+[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg
+[standard-url]: https://standardjs.com
+
+### Super-minimalist version of [`concat-stream`](https://github.com/maxogden/concat-stream). Less than 15 lines!
+
+## install
+
+```
+npm install simple-concat
+```
+
+## usage
+
+This example is longer than the implementation.
+
+```js
+var s = new stream.PassThrough()
+concat(s, function (err, buf) {
+  if (err) throw err
+  console.error(buf)
+})
+s.write('abc')
+setTimeout(function () {
+  s.write('123')
+}, 10)
+setTimeout(function () {
+  s.write('456')
+}, 20)
+setTimeout(function () {
+  s.end('789')
+}, 30)
+```
+
+## license
+
+MIT. Copyright (c) [Feross Aboukhadijeh](http://feross.org).
diff --git a/node_modules/simple-concat/index.js b/node_modules/simple-concat/index.js
new file mode 100644
index 0000000..59237fc
--- /dev/null
+++ b/node_modules/simple-concat/index.js
@@ -0,0 +1,15 @@
+/*! simple-concat. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
+module.exports = function (stream, cb) {
+  var chunks = []
+  stream.on('data', function (chunk) {
+    chunks.push(chunk)
+  })
+  stream.once('end', function () {
+    if (cb) cb(null, Buffer.concat(chunks))
+    cb = null
+  })
+  stream.once('error', function (err) {
+    if (cb) cb(err)
+    cb = null
+  })
+}
diff --git a/node_modules/simple-concat/package.json b/node_modules/simple-concat/package.json
new file mode 100644
index 0000000..4885da8
--- /dev/null
+++ b/node_modules/simple-concat/package.json
@@ -0,0 +1,72 @@
+{
+  "_from": "simple-concat@^1.0.0",
+  "_id": "simple-concat@1.0.1",
+  "_inBundle": false,
+  "_integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+  "_location": "/simple-concat",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "simple-concat@^1.0.0",
+    "name": "simple-concat",
+    "escapedName": "simple-concat",
+    "rawSpec": "^1.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.0"
+  },
+  "_requiredBy": [
+    "/simple-get"
+  ],
+  "_resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+  "_shasum": "f46976082ba35c2263f1c8ab5edfe26c41c9552f",
+  "_spec": "simple-concat@^1.0.0",
+  "_where": "F:\\vent-display\\node_modules\\simple-get",
+  "author": {
+    "name": "Feross Aboukhadijeh",
+    "email": "feross@feross.org",
+    "url": "https://feross.org"
+  },
+  "bugs": {
+    "url": "https://github.com/feross/simple-concat/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {},
+  "deprecated": false,
+  "description": "Super-minimalist version of `concat-stream`. Less than 15 lines!",
+  "devDependencies": {
+    "standard": "*",
+    "tape": "^5.0.1"
+  },
+  "funding": [
+    {
+      "type": "github",
+      "url": "https://github.com/sponsors/feross"
+    },
+    {
+      "type": "patreon",
+      "url": "https://www.patreon.com/feross"
+    },
+    {
+      "type": "consulting",
+      "url": "https://feross.org/support"
+    }
+  ],
+  "homepage": "https://github.com/feross/simple-concat",
+  "keywords": [
+    "concat",
+    "concat-stream",
+    "concat stream"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "simple-concat",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/feross/simple-concat.git"
+  },
+  "scripts": {
+    "test": "standard && tape test/*.js"
+  },
+  "version": "1.0.1"
+}
diff --git a/node_modules/simple-concat/test/basic.js b/node_modules/simple-concat/test/basic.js
new file mode 100644
index 0000000..4bf6f9c
--- /dev/null
+++ b/node_modules/simple-concat/test/basic.js
@@ -0,0 +1,41 @@
+var concat = require('../')
+var stream = require('stream')
+var test = require('tape')
+
+test('basic', function (t) {
+  t.plan(2)
+  var s = new stream.PassThrough()
+  concat(s, function (err, buf) {
+    t.error(err)
+    t.deepEqual(buf, Buffer.from('abc123456789'))
+  })
+  s.write('abc')
+  setTimeout(function () {
+    s.write('123')
+  }, 10)
+  setTimeout(function () {
+    s.write('456')
+  }, 20)
+  setTimeout(function () {
+    s.end('789')
+  }, 30)
+})
+
+test('error', function (t) {
+  t.plan(2)
+  var s = new stream.PassThrough()
+  concat(s, function (err, buf) {
+    t.ok(err, 'got expected error')
+    t.ok(!buf)
+  })
+  s.write('abc')
+  setTimeout(function () {
+    s.write('123')
+  }, 10)
+  setTimeout(function () {
+    s.write('456')
+  }, 20)
+  setTimeout(function () {
+    s.emit('error', new Error('error'))
+  }, 30)
+})
diff --git a/node_modules/simple-get/LICENSE b/node_modules/simple-get/LICENSE
new file mode 100644
index 0000000..c7e6852
--- /dev/null
+++ b/node_modules/simple-get/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) Feross Aboukhadijeh
+
+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/simple-get/README.md b/node_modules/simple-get/README.md
new file mode 100644
index 0000000..0fecf37
--- /dev/null
+++ b/node_modules/simple-get/README.md
@@ -0,0 +1,319 @@
+# simple-get [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url]
+
+[travis-image]: https://img.shields.io/travis/feross/simple-get/master.svg
+[travis-url]: https://travis-ci.org/feross/simple-get
+[npm-image]: https://img.shields.io/npm/v/simple-get.svg
+[npm-url]: https://npmjs.org/package/simple-get
+[downloads-image]: https://img.shields.io/npm/dm/simple-get.svg
+[downloads-url]: https://npmjs.org/package/simple-get
+[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg
+[standard-url]: https://standardjs.com
+
+### Simplest way to make http get requests
+
+## features
+
+This module is the lightest possible wrapper on top of node.js `http`, but supporting these essential features:
+
+- follows redirects
+- automatically handles gzip/deflate responses
+- supports HTTPS
+- supports specifying a timeout
+- supports convenience `url` key so there's no need to use `url.parse` on the url when specifying options
+- composes well with npm packages for features like cookies, proxies, form data, & OAuth
+
+All this in < 100 lines of code.
+
+## install
+
+```
+npm install simple-get
+```
+
+## usage
+
+Note, all these examples also work in the browser with [browserify](http://browserify.org/).
+
+### simple GET request
+
+Doesn't get easier than this:
+
+```js
+const get = require('simple-get')
+
+get('http://example.com', function (err, res) {
+  if (err) throw err
+  console.log(res.statusCode) // 200
+  res.pipe(process.stdout) // `res` is a stream
+})
+```
+
+### even simpler GET request
+
+If you just want the data, and don't want to deal with streams:
+
+```js
+const get = require('simple-get')
+
+get.concat('http://example.com', function (err, res, data) {
+  if (err) throw err
+  console.log(res.statusCode) // 200
+  console.log(data) // Buffer('this is the server response')
+})
+```
+
+### POST, PUT, PATCH, HEAD, DELETE support
+
+For `POST`, call `get.post` or use option `{ method: 'POST' }`.
+
+```js
+const get = require('simple-get')
+
+const opts = {
+  url: 'http://example.com',
+  body: 'this is the POST body'
+}
+get.post(opts, function (err, res) {
+  if (err) throw err
+  res.pipe(process.stdout) // `res` is a stream
+})
+```
+
+#### A more complex example:
+
+```js
+const get = require('simple-get')
+
+get({
+  url: 'http://example.com',
+  method: 'POST',
+  body: 'this is the POST body',
+
+  // simple-get accepts all options that node.js `http` accepts
+  // See: http://nodejs.org/api/http.html#http_http_request_options_callback
+  headers: {
+    'user-agent': 'my cool app'
+  }
+}, function (err, res) {
+  if (err) throw err
+
+  // All properties/methods from http.IncomingResponse are available,
+  // even if a gunzip/inflate transform stream was returned.
+  // See: http://nodejs.org/api/http.html#http_http_incomingmessage
+  res.setTimeout(10000)
+  console.log(res.headers)
+
+  res.on('data', function (chunk) {
+    // `chunk` is the decoded response, after it's been gunzipped or inflated
+    // (if applicable)
+    console.log('got a chunk of the response: ' + chunk)
+  }))
+
+})
+```
+
+### JSON
+
+You can serialize/deserialize request and response with JSON:
+
+```js
+const get = require('simple-get')
+
+const opts = {
+  method: 'POST',
+  url: 'http://example.com',
+  body: {
+    key: 'value'
+  },
+  json: true
+}
+get.concat(opts, function (err, res, data) {
+  if (err) throw err
+  console.log(data.key) // `data` is an object
+})
+```
+
+### Timeout
+
+You can set a timeout (in milliseconds) on the request with the `timeout` option.
+If the request takes longer than `timeout` to complete, then the entire request
+will fail with an `Error`.
+
+```js
+const get = require('simple-get')
+
+const opts = {
+  url: 'http://example.com',
+  timeout: 2000 // 2 second timeout
+}
+
+get(opts, function (err, res) {})
+```
+
+### One Quick Tip
+
+It's a good idea to set the `'user-agent'` header so the provider can more easily
+see how their resource is used.
+
+```js
+const get = require('simple-get')
+const pkg = require('./package.json')
+
+get('http://example.com', {
+  headers: {
+    'user-agent': `my-module/${pkg.version} (https://github.com/username/my-module)`
+  }
+})
+```
+
+### Proxies
+
+You can use the [`tunnel`](https://github.com/koichik/node-tunnel) module with the
+`agent` option to work with proxies:
+
+```js
+const get = require('simple-get')
+const tunnel = require('tunnel')
+
+const opts = {
+  url: 'http://example.com',
+  agent: tunnel.httpOverHttp({
+    proxy: {
+      host: 'localhost'
+    }
+  })
+}
+
+get(opts, function (err, res) {})
+```
+
+### Cookies
+
+You can use the [`cookie`](https://github.com/jshttp/cookie) module to include
+cookies in a request:
+
+```js
+const get = require('simple-get')
+const cookie = require('cookie')
+
+const opts = {
+  url: 'http://example.com',
+  headers: {
+    cookie: cookie.serialize('foo', 'bar')
+  }
+}
+
+get(opts, function (err, res) {})
+```
+
+### Form data
+
+You can use the [`form-data`](https://github.com/form-data/form-data) module to
+create POST request with form data:
+
+```js
+const fs = require('fs')
+const get = require('simple-get')
+const FormData = require('form-data')
+const form = new FormData()
+
+form.append('my_file', fs.createReadStream('/foo/bar.jpg'))
+
+const opts = {
+  url: 'http://example.com',
+  body: form
+}
+
+get.post(opts, function (err, res) {})
+```
+
+#### Or, include `application/x-www-form-urlencoded` form data manually:
+
+```js
+const get = require('simple-get')
+
+const opts = {
+  url: 'http://example.com',
+  form: {
+    key: 'value'
+  }
+}
+get.post(opts, function (err, res) {})
+```
+
+### Specifically disallowing redirects
+
+```js
+const get = require('simple-get')
+
+const opts = {
+  url: 'http://example.com/will-redirect-elsewhere',
+  followRedirects: false
+}
+// res.statusCode will be 301, no error thrown
+get(opts, function (err, res) {})
+```
+
+### OAuth
+
+You can use the [`oauth-1.0a`](https://github.com/ddo/oauth-1.0a) module to create
+a signed OAuth request:
+
+```js
+const get = require('simple-get')
+const crypto  = require('crypto')
+const OAuth = require('oauth-1.0a')
+
+const oauth = OAuth({
+  consumer: {
+    key: process.env.CONSUMER_KEY,
+    secret: process.env.CONSUMER_SECRET
+  },
+  signature_method: 'HMAC-SHA1',
+  hash_function: (baseString, key) => crypto.createHmac('sha1', key).update(baseString).digest('base64')
+})
+
+const token = {
+  key: process.env.ACCESS_TOKEN,
+  secret: process.env.ACCESS_TOKEN_SECRET
+}
+
+const url = 'https://api.twitter.com/1.1/statuses/home_timeline.json'
+
+const opts = {
+  url: url,
+  headers: oauth.toHeader(oauth.authorize({url, method: 'GET'}, token)),
+  json: true
+}
+
+get(opts, function (err, res) {})
+```
+
+### Throttle requests
+
+You can use [limiter](https://github.com/jhurliman/node-rate-limiter) to throttle requests. This is useful when calling an API that is rate limited.
+
+```js
+const simpleGet = require('simple-get')
+const RateLimiter = require('limiter').RateLimiter
+const limiter = new RateLimiter(1, 'second')
+
+const get = (opts, cb) => limiter.removeTokens(1, () => simpleGet(opts, cb))
+get.concat = (opts, cb) => limiter.removeTokens(1, () => simpleGet.concat(opts, cb))
+
+var opts = {
+  url: 'http://example.com'
+}
+
+get.concat(opts, processResult)
+get.concat(opts, processResult)
+
+function processResult (err, res, data) {
+  if (err) throw err
+  console.log(data.toString())
+}
+```
+
+## license
+
+MIT. Copyright (c) [Feross Aboukhadijeh](http://feross.org).
diff --git a/node_modules/simple-get/index.js b/node_modules/simple-get/index.js
new file mode 100644
index 0000000..a054837
--- /dev/null
+++ b/node_modules/simple-get/index.js
@@ -0,0 +1,99 @@
+module.exports = simpleGet
+
+const concat = require('simple-concat')
+const decompressResponse = require('decompress-response') // excluded from browser build
+const http = require('http')
+const https = require('https')
+const once = require('once')
+const querystring = require('querystring')
+const url = require('url')
+
+const isStream = o => o !== null && typeof o === 'object' && typeof o.pipe === 'function'
+
+function simpleGet (opts, cb) {
+  opts = Object.assign({ maxRedirects: 10 }, typeof opts === 'string' ? { url: opts } : opts)
+  cb = once(cb)
+
+  if (opts.url) {
+    const { hostname, port, protocol, auth, path } = url.parse(opts.url) // eslint-disable-line node/no-deprecated-api
+    delete opts.url
+    if (!hostname && !port && !protocol && !auth) opts.path = path // Relative redirect
+    else Object.assign(opts, { hostname, port, protocol, auth, path }) // Absolute redirect
+  }
+
+  const headers = { 'accept-encoding': 'gzip, deflate' }
+  if (opts.headers) Object.keys(opts.headers).forEach(k => (headers[k.toLowerCase()] = opts.headers[k]))
+  opts.headers = headers
+
+  let body
+  if (opts.body) {
+    body = opts.json && !isStream(opts.body) ? JSON.stringify(opts.body) : opts.body
+  } else if (opts.form) {
+    body = typeof opts.form === 'string' ? opts.form : querystring.stringify(opts.form)
+    opts.headers['content-type'] = 'application/x-www-form-urlencoded'
+  }
+
+  if (body) {
+    if (!opts.method) opts.method = 'POST'
+    if (!isStream(body)) opts.headers['content-length'] = Buffer.byteLength(body)
+    if (opts.json && !opts.form) opts.headers['content-type'] = 'application/json'
+  }
+  delete opts.body; delete opts.form
+
+  if (opts.json) opts.headers.accept = 'application/json'
+  if (opts.method) opts.method = opts.method.toUpperCase()
+
+  const protocol = opts.protocol === 'https:' ? https : http // Support http/https urls
+  const req = protocol.request(opts, res => {
+    if (opts.followRedirects !== false && res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
+      opts.url = res.headers.location // Follow 3xx redirects
+      delete opts.headers.host // Discard `host` header on redirect (see #32)
+      res.resume() // Discard response
+
+      if (opts.method === 'POST' && [301, 302].includes(res.statusCode)) {
+        opts.method = 'GET' // On 301/302 redirect, change POST to GET (see #35)
+        delete opts.headers['content-length']; delete opts.headers['content-type']
+      }
+
+      if (opts.maxRedirects-- === 0) return cb(new Error('too many redirects'))
+      else return simpleGet(opts, cb)
+    }
+
+    const tryUnzip = typeof decompressResponse === 'function' && opts.method !== 'HEAD'
+    cb(null, tryUnzip ? decompressResponse(res) : res)
+  })
+  req.on('timeout', () => {
+    req.abort()
+    cb(new Error('Request timed out'))
+  })
+  req.on('error', cb)
+
+  if (isStream(body)) body.on('error', cb).pipe(req)
+  else req.end(body)
+
+  return req
+}
+
+simpleGet.concat = (opts, cb) => {
+  return simpleGet(opts, (err, res) => {
+    if (err) return cb(err)
+    concat(res, (err, data) => {
+      if (err) return cb(err)
+      if (opts.json) {
+        try {
+          data = JSON.parse(data.toString())
+        } catch (err) {
+          return cb(err, res, data)
+        }
+      }
+      cb(null, res, data)
+    })
+  })
+}
+
+;['get', 'post', 'put', 'patch', 'head', 'delete'].forEach(method => {
+  simpleGet[method] = (opts, cb) => {
+    if (typeof opts === 'string') opts = { url: opts }
+    return simpleGet(Object.assign({ method: method.toUpperCase() }, opts), cb)
+  }
+})
diff --git a/node_modules/simple-get/package.json b/node_modules/simple-get/package.json
new file mode 100644
index 0000000..6fb674b
--- /dev/null
+++ b/node_modules/simple-get/package.json
@@ -0,0 +1,78 @@
+{
+  "_from": "simple-get@^3.0.3",
+  "_id": "simple-get@3.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==",
+  "_location": "/simple-get",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "simple-get@^3.0.3",
+    "name": "simple-get",
+    "escapedName": "simple-get",
+    "rawSpec": "^3.0.3",
+    "saveSpec": null,
+    "fetchSpec": "^3.0.3"
+  },
+  "_requiredBy": [
+    "/prebuild-install"
+  ],
+  "_resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz",
+  "_shasum": "b45be062435e50d159540b576202ceec40b9c6b3",
+  "_spec": "simple-get@^3.0.3",
+  "_where": "F:\\vent-display\\node_modules\\prebuild-install",
+  "author": {
+    "name": "Feross Aboukhadijeh",
+    "email": "feross@feross.org",
+    "url": "http://feross.org/"
+  },
+  "browser": {
+    "decompress-response": false
+  },
+  "bugs": {
+    "url": "https://github.com/feross/simple-get/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "decompress-response": "^4.2.0",
+    "once": "^1.3.1",
+    "simple-concat": "^1.0.0"
+  },
+  "deprecated": false,
+  "description": "Simplest way to make http get requests. Supports HTTPS, redirects, gzip/deflate, streams in < 100 lines.",
+  "devDependencies": {
+    "self-signed-https": "^1.0.5",
+    "standard": "*",
+    "string-to-stream": "^3.0.0",
+    "tape": "^4.0.0"
+  },
+  "homepage": "https://github.com/feross/simple-get",
+  "keywords": [
+    "request",
+    "http",
+    "GET",
+    "get request",
+    "http.get",
+    "redirects",
+    "follow redirects",
+    "gzip",
+    "deflate",
+    "https",
+    "http-https",
+    "stream",
+    "simple request",
+    "simple get"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "simple-get",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/feross/simple-get.git"
+  },
+  "scripts": {
+    "test": "standard && tape test/*.js"
+  },
+  "version": "3.1.0"
+}
diff --git a/node_modules/string-width/index.js b/node_modules/string-width/index.js
new file mode 100644
index 0000000..b9bec62
--- /dev/null
+++ b/node_modules/string-width/index.js
@@ -0,0 +1,37 @@
+'use strict';
+var stripAnsi = require('strip-ansi');
+var codePointAt = require('code-point-at');
+var isFullwidthCodePoint = require('is-fullwidth-code-point');
+
+// https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1345
+module.exports = function (str) {
+	if (typeof str !== 'string' || str.length === 0) {
+		return 0;
+	}
+
+	var width = 0;
+
+	str = stripAnsi(str);
+
+	for (var i = 0; i < str.length; i++) {
+		var code = codePointAt(str, i);
+
+		// ignore control characters
+		if (code <= 0x1f || (code >= 0x7f && code <= 0x9f)) {
+			continue;
+		}
+
+		// surrogates
+		if (code >= 0x10000) {
+			i++;
+		}
+
+		if (isFullwidthCodePoint(code)) {
+			width += 2;
+		} else {
+			width++;
+		}
+	}
+
+	return width;
+};
diff --git a/node_modules/string-width/license b/node_modules/string-width/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/string-width/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/string-width/package.json b/node_modules/string-width/package.json
new file mode 100644
index 0000000..87b3931
--- /dev/null
+++ b/node_modules/string-width/package.json
@@ -0,0 +1,89 @@
+{
+  "_from": "string-width@^1.0.1",
+  "_id": "string-width@1.0.2",
+  "_inBundle": false,
+  "_integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+  "_location": "/string-width",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "string-width@^1.0.1",
+    "name": "string-width",
+    "escapedName": "string-width",
+    "rawSpec": "^1.0.1",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.1"
+  },
+  "_requiredBy": [
+    "/gauge",
+    "/wide-align"
+  ],
+  "_resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+  "_shasum": "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3",
+  "_spec": "string-width@^1.0.1",
+  "_where": "F:\\vent-display\\node_modules\\gauge",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "bugs": {
+    "url": "https://github.com/sindresorhus/string-width/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "code-point-at": "^1.0.0",
+    "is-fullwidth-code-point": "^1.0.0",
+    "strip-ansi": "^3.0.0"
+  },
+  "deprecated": false,
+  "description": "Get the visual width of a string - the number of columns required to display it",
+  "devDependencies": {
+    "ava": "*",
+    "xo": "*"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/sindresorhus/string-width#readme",
+  "keywords": [
+    "string",
+    "str",
+    "character",
+    "char",
+    "unicode",
+    "width",
+    "visual",
+    "column",
+    "columns",
+    "fullwidth",
+    "full-width",
+    "full",
+    "ansi",
+    "escape",
+    "codes",
+    "cli",
+    "command-line",
+    "terminal",
+    "console",
+    "cjk",
+    "chinese",
+    "japanese",
+    "korean",
+    "fixed-width"
+  ],
+  "license": "MIT",
+  "name": "string-width",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/sindresorhus/string-width.git"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "version": "1.0.2"
+}
diff --git a/node_modules/string-width/readme.md b/node_modules/string-width/readme.md
new file mode 100644
index 0000000..1ab42c9
--- /dev/null
+++ b/node_modules/string-width/readme.md
@@ -0,0 +1,42 @@
+# string-width [![Build Status](https://travis-ci.org/sindresorhus/string-width.svg?branch=master)](https://travis-ci.org/sindresorhus/string-width)
+
+> Get the visual width of a string - the number of columns required to display it
+
+Some Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width.
+
+Useful to be able to measure the actual width of command-line output.
+
+
+## Install
+
+```
+$ npm install --save string-width
+```
+
+
+## Usage
+
+```js
+const stringWidth = require('string-width');
+
+stringWidth('古');
+//=> 2
+
+stringWidth('\u001b[1m古\u001b[22m');
+//=> 2
+
+stringWidth('a');
+//=> 1
+```
+
+
+## Related
+
+- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module
+- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string
+- [widest-line](https://github.com/sindresorhus/widest-line) - Get the visual width of the widest line in a string
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/string_decoder/.travis.yml b/node_modules/string_decoder/.travis.yml
new file mode 100644
index 0000000..3347a72
--- /dev/null
+++ b/node_modules/string_decoder/.travis.yml
@@ -0,0 +1,50 @@
+sudo: false
+language: node_js
+before_install:
+  - npm install -g npm@2
+  - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g
+notifications:
+  email: false
+matrix:
+  fast_finish: true
+  include:
+  - node_js: '0.8'
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: '0.10'
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: '0.11'
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: '0.12'
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: 1
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: 2
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: 3
+    env:
+      - TASK=test
+      - NPM_LEGACY=true
+  - node_js: 4
+    env: TASK=test
+  - node_js: 5
+    env: TASK=test
+  - node_js: 6
+    env: TASK=test
+  - node_js: 7
+    env: TASK=test
+  - node_js: 8
+    env: TASK=test
+  - node_js: 9
+    env: TASK=test
diff --git a/node_modules/string_decoder/LICENSE b/node_modules/string_decoder/LICENSE
new file mode 100644
index 0000000..778edb2
--- /dev/null
+++ b/node_modules/string_decoder/LICENSE
@@ -0,0 +1,48 @@
+Node.js is licensed for use as follows:
+
+"""
+Copyright Node.js contributors. All rights reserved.
+
+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.
+"""
+
+This license applies to parts of Node.js originating from the
+https://github.com/joyent/node repository:
+
+"""
+Copyright Joyent, Inc. and other Node contributors. All rights reserved.
+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/string_decoder/README.md b/node_modules/string_decoder/README.md
new file mode 100644
index 0000000..5fd5831
--- /dev/null
+++ b/node_modules/string_decoder/README.md
@@ -0,0 +1,47 @@
+# string_decoder
+
+***Node-core v8.9.4 string_decoder for userland***
+
+
+[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/)
+[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/)
+
+
+```bash
+npm install --save string_decoder
+```
+
+***Node-core string_decoder for userland***
+
+This package is a mirror of the string_decoder implementation in Node-core.
+
+Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/).
+
+As of version 1.0.0 **string_decoder** uses semantic versioning.
+
+## Previous versions
+
+Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10.
+
+## Update
+
+The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version.
+
+## Streams Working Group
+
+`string_decoder` is maintained by the Streams Working Group, which
+oversees the development and maintenance of the Streams API within
+Node.js. The responsibilities of the Streams Working Group include:
+
+* Addressing stream issues on the Node.js issue tracker.
+* Authoring and editing stream documentation within the Node.js project.
+* Reviewing changes to stream subclasses within the Node.js project.
+* Redirecting changes to streams from the Node.js project to this
+  project.
+* Assisting in the implementation of stream providers within Node.js.
+* Recommending versions of `readable-stream` to be included in Node.js.
+* Messaging about the future of streams to give the community advance
+  notice of changes.
+
+See [readable-stream](https://github.com/nodejs/readable-stream) for
+more details.
diff --git a/node_modules/string_decoder/lib/string_decoder.js b/node_modules/string_decoder/lib/string_decoder.js
new file mode 100644
index 0000000..2e89e63
--- /dev/null
+++ b/node_modules/string_decoder/lib/string_decoder.js
@@ -0,0 +1,296 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+
+'use strict';
+
+/*<replacement>*/
+
+var Buffer = require('safe-buffer').Buffer;
+/*</replacement>*/
+
+var isEncoding = Buffer.isEncoding || function (encoding) {
+  encoding = '' + encoding;
+  switch (encoding && encoding.toLowerCase()) {
+    case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
+      return true;
+    default:
+      return false;
+  }
+};
+
+function _normalizeEncoding(enc) {
+  if (!enc) return 'utf8';
+  var retried;
+  while (true) {
+    switch (enc) {
+      case 'utf8':
+      case 'utf-8':
+        return 'utf8';
+      case 'ucs2':
+      case 'ucs-2':
+      case 'utf16le':
+      case 'utf-16le':
+        return 'utf16le';
+      case 'latin1':
+      case 'binary':
+        return 'latin1';
+      case 'base64':
+      case 'ascii':
+      case 'hex':
+        return enc;
+      default:
+        if (retried) return; // undefined
+        enc = ('' + enc).toLowerCase();
+        retried = true;
+    }
+  }
+};
+
+// Do not cache `Buffer.isEncoding` when checking encoding names as some
+// modules monkey-patch it to support additional encodings
+function normalizeEncoding(enc) {
+  var nenc = _normalizeEncoding(enc);
+  if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
+  return nenc || enc;
+}
+
+// StringDecoder provides an interface for efficiently splitting a series of
+// buffers into a series of JS strings without breaking apart multi-byte
+// characters.
+exports.StringDecoder = StringDecoder;
+function StringDecoder(encoding) {
+  this.encoding = normalizeEncoding(encoding);
+  var nb;
+  switch (this.encoding) {
+    case 'utf16le':
+      this.text = utf16Text;
+      this.end = utf16End;
+      nb = 4;
+      break;
+    case 'utf8':
+      this.fillLast = utf8FillLast;
+      nb = 4;
+      break;
+    case 'base64':
+      this.text = base64Text;
+      this.end = base64End;
+      nb = 3;
+      break;
+    default:
+      this.write = simpleWrite;
+      this.end = simpleEnd;
+      return;
+  }
+  this.lastNeed = 0;
+  this.lastTotal = 0;
+  this.lastChar = Buffer.allocUnsafe(nb);
+}
+
+StringDecoder.prototype.write = function (buf) {
+  if (buf.length === 0) return '';
+  var r;
+  var i;
+  if (this.lastNeed) {
+    r = this.fillLast(buf);
+    if (r === undefined) return '';
+    i = this.lastNeed;
+    this.lastNeed = 0;
+  } else {
+    i = 0;
+  }
+  if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
+  return r || '';
+};
+
+StringDecoder.prototype.end = utf8End;
+
+// Returns only complete characters in a Buffer
+StringDecoder.prototype.text = utf8Text;
+
+// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
+StringDecoder.prototype.fillLast = function (buf) {
+  if (this.lastNeed <= buf.length) {
+    buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
+    return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+  }
+  buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
+  this.lastNeed -= buf.length;
+};
+
+// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
+// continuation byte. If an invalid byte is detected, -2 is returned.
+function utf8CheckByte(byte) {
+  if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
+  return byte >> 6 === 0x02 ? -1 : -2;
+}
+
+// Checks at most 3 bytes at the end of a Buffer in order to detect an
+// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
+// needed to complete the UTF-8 character (if applicable) are returned.
+function utf8CheckIncomplete(self, buf, i) {
+  var j = buf.length - 1;
+  if (j < i) return 0;
+  var nb = utf8CheckByte(buf[j]);
+  if (nb >= 0) {
+    if (nb > 0) self.lastNeed = nb - 1;
+    return nb;
+  }
+  if (--j < i || nb === -2) return 0;
+  nb = utf8CheckByte(buf[j]);
+  if (nb >= 0) {
+    if (nb > 0) self.lastNeed = nb - 2;
+    return nb;
+  }
+  if (--j < i || nb === -2) return 0;
+  nb = utf8CheckByte(buf[j]);
+  if (nb >= 0) {
+    if (nb > 0) {
+      if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
+    }
+    return nb;
+  }
+  return 0;
+}
+
+// Validates as many continuation bytes for a multi-byte UTF-8 character as
+// needed or are available. If we see a non-continuation byte where we expect
+// one, we "replace" the validated continuation bytes we've seen so far with
+// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
+// behavior. The continuation byte check is included three times in the case
+// where all of the continuation bytes for a character exist in the same buffer.
+// It is also done this way as a slight performance increase instead of using a
+// loop.
+function utf8CheckExtraBytes(self, buf, p) {
+  if ((buf[0] & 0xC0) !== 0x80) {
+    self.lastNeed = 0;
+    return '\ufffd';
+  }
+  if (self.lastNeed > 1 && buf.length > 1) {
+    if ((buf[1] & 0xC0) !== 0x80) {
+      self.lastNeed = 1;
+      return '\ufffd';
+    }
+    if (self.lastNeed > 2 && buf.length > 2) {
+      if ((buf[2] & 0xC0) !== 0x80) {
+        self.lastNeed = 2;
+        return '\ufffd';
+      }
+    }
+  }
+}
+
+// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
+function utf8FillLast(buf) {
+  var p = this.lastTotal - this.lastNeed;
+  var r = utf8CheckExtraBytes(this, buf, p);
+  if (r !== undefined) return r;
+  if (this.lastNeed <= buf.length) {
+    buf.copy(this.lastChar, p, 0, this.lastNeed);
+    return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+  }
+  buf.copy(this.lastChar, p, 0, buf.length);
+  this.lastNeed -= buf.length;
+}
+
+// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
+// partial character, the character's bytes are buffered until the required
+// number of bytes are available.
+function utf8Text(buf, i) {
+  var total = utf8CheckIncomplete(this, buf, i);
+  if (!this.lastNeed) return buf.toString('utf8', i);
+  this.lastTotal = total;
+  var end = buf.length - (total - this.lastNeed);
+  buf.copy(this.lastChar, 0, end);
+  return buf.toString('utf8', i, end);
+}
+
+// For UTF-8, a replacement character is added when ending on a partial
+// character.
+function utf8End(buf) {
+  var r = buf && buf.length ? this.write(buf) : '';
+  if (this.lastNeed) return r + '\ufffd';
+  return r;
+}
+
+// UTF-16LE typically needs two bytes per character, but even if we have an even
+// number of bytes available, we need to check if we end on a leading/high
+// surrogate. In that case, we need to wait for the next two bytes in order to
+// decode the last character properly.
+function utf16Text(buf, i) {
+  if ((buf.length - i) % 2 === 0) {
+    var r = buf.toString('utf16le', i);
+    if (r) {
+      var c = r.charCodeAt(r.length - 1);
+      if (c >= 0xD800 && c <= 0xDBFF) {
+        this.lastNeed = 2;
+        this.lastTotal = 4;
+        this.lastChar[0] = buf[buf.length - 2];
+        this.lastChar[1] = buf[buf.length - 1];
+        return r.slice(0, -1);
+      }
+    }
+    return r;
+  }
+  this.lastNeed = 1;
+  this.lastTotal = 2;
+  this.lastChar[0] = buf[buf.length - 1];
+  return buf.toString('utf16le', i, buf.length - 1);
+}
+
+// For UTF-16LE we do not explicitly append special replacement characters if we
+// end on a partial character, we simply let v8 handle that.
+function utf16End(buf) {
+  var r = buf && buf.length ? this.write(buf) : '';
+  if (this.lastNeed) {
+    var end = this.lastTotal - this.lastNeed;
+    return r + this.lastChar.toString('utf16le', 0, end);
+  }
+  return r;
+}
+
+function base64Text(buf, i) {
+  var n = (buf.length - i) % 3;
+  if (n === 0) return buf.toString('base64', i);
+  this.lastNeed = 3 - n;
+  this.lastTotal = 3;
+  if (n === 1) {
+    this.lastChar[0] = buf[buf.length - 1];
+  } else {
+    this.lastChar[0] = buf[buf.length - 2];
+    this.lastChar[1] = buf[buf.length - 1];
+  }
+  return buf.toString('base64', i, buf.length - n);
+}
+
+function base64End(buf) {
+  var r = buf && buf.length ? this.write(buf) : '';
+  if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
+  return r;
+}
+
+// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
+function simpleWrite(buf) {
+  return buf.toString(this.encoding);
+}
+
+function simpleEnd(buf) {
+  return buf && buf.length ? this.write(buf) : '';
+}
\ No newline at end of file
diff --git a/node_modules/string_decoder/package.json b/node_modules/string_decoder/package.json
new file mode 100644
index 0000000..274df41
--- /dev/null
+++ b/node_modules/string_decoder/package.json
@@ -0,0 +1,61 @@
+{
+  "_from": "string_decoder@~1.1.1",
+  "_id": "string_decoder@1.1.1",
+  "_inBundle": false,
+  "_integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+  "_location": "/string_decoder",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "string_decoder@~1.1.1",
+    "name": "string_decoder",
+    "escapedName": "string_decoder",
+    "rawSpec": "~1.1.1",
+    "saveSpec": null,
+    "fetchSpec": "~1.1.1"
+  },
+  "_requiredBy": [
+    "/bl/readable-stream",
+    "/readable-stream",
+    "/tar-stream/readable-stream"
+  ],
+  "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+  "_shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8",
+  "_spec": "string_decoder@~1.1.1",
+  "_where": "F:\\vent-display\\node_modules\\readable-stream",
+  "bugs": {
+    "url": "https://github.com/nodejs/string_decoder/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "safe-buffer": "~5.1.0"
+  },
+  "deprecated": false,
+  "description": "The string_decoder module from Node core",
+  "devDependencies": {
+    "babel-polyfill": "^6.23.0",
+    "core-util-is": "^1.0.2",
+    "inherits": "^2.0.3",
+    "tap": "~0.4.8"
+  },
+  "homepage": "https://github.com/nodejs/string_decoder",
+  "keywords": [
+    "string",
+    "decoder",
+    "browser",
+    "browserify"
+  ],
+  "license": "MIT",
+  "main": "lib/string_decoder.js",
+  "name": "string_decoder",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/nodejs/string_decoder.git"
+  },
+  "scripts": {
+    "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js",
+    "test": "tap test/parallel/*.js && node test/verify-dependencies"
+  },
+  "version": "1.1.1"
+}
diff --git a/node_modules/strip-ansi/index.js b/node_modules/strip-ansi/index.js
new file mode 100644
index 0000000..099480f
--- /dev/null
+++ b/node_modules/strip-ansi/index.js
@@ -0,0 +1,6 @@
+'use strict';
+var ansiRegex = require('ansi-regex')();
+
+module.exports = function (str) {
+	return typeof str === 'string' ? str.replace(ansiRegex, '') : str;
+};
diff --git a/node_modules/strip-ansi/license b/node_modules/strip-ansi/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/strip-ansi/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/strip-ansi/package.json b/node_modules/strip-ansi/package.json
new file mode 100644
index 0000000..13f7ef0
--- /dev/null
+++ b/node_modules/strip-ansi/package.json
@@ -0,0 +1,102 @@
+{
+  "_from": "strip-ansi@^3.0.1",
+  "_id": "strip-ansi@3.0.1",
+  "_inBundle": false,
+  "_integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+  "_location": "/strip-ansi",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "strip-ansi@^3.0.1",
+    "name": "strip-ansi",
+    "escapedName": "strip-ansi",
+    "rawSpec": "^3.0.1",
+    "saveSpec": null,
+    "fetchSpec": "^3.0.1"
+  },
+  "_requiredBy": [
+    "/gauge",
+    "/string-width"
+  ],
+  "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+  "_shasum": "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf",
+  "_spec": "strip-ansi@^3.0.1",
+  "_where": "F:\\vent-display\\node_modules\\gauge",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "bugs": {
+    "url": "https://github.com/chalk/strip-ansi/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "ansi-regex": "^2.0.0"
+  },
+  "deprecated": false,
+  "description": "Strip ANSI escape codes",
+  "devDependencies": {
+    "ava": "*",
+    "xo": "*"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/chalk/strip-ansi#readme",
+  "keywords": [
+    "strip",
+    "trim",
+    "remove",
+    "ansi",
+    "styles",
+    "color",
+    "colour",
+    "colors",
+    "terminal",
+    "console",
+    "string",
+    "tty",
+    "escape",
+    "formatting",
+    "rgb",
+    "256",
+    "shell",
+    "xterm",
+    "log",
+    "logging",
+    "command-line",
+    "text"
+  ],
+  "license": "MIT",
+  "maintainers": [
+    {
+      "name": "Sindre Sorhus",
+      "email": "sindresorhus@gmail.com",
+      "url": "sindresorhus.com"
+    },
+    {
+      "name": "Joshua Boy Nicolai Appelman",
+      "email": "joshua@jbna.nl",
+      "url": "jbna.nl"
+    },
+    {
+      "name": "JD Ballard",
+      "email": "i.am.qix@gmail.com",
+      "url": "github.com/qix-"
+    }
+  ],
+  "name": "strip-ansi",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/chalk/strip-ansi.git"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "version": "3.0.1"
+}
diff --git a/node_modules/strip-ansi/readme.md b/node_modules/strip-ansi/readme.md
new file mode 100644
index 0000000..cb7d9ff
--- /dev/null
+++ b/node_modules/strip-ansi/readme.md
@@ -0,0 +1,33 @@
+# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi)
+
+> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
+
+
+## Install
+
+```
+$ npm install --save strip-ansi
+```
+
+
+## Usage
+
+```js
+var stripAnsi = require('strip-ansi');
+
+stripAnsi('\u001b[4mcake\u001b[0m');
+//=> 'cake'
+```
+
+
+## Related
+
+- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module
+- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes
+- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes
+- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/strip-json-comments/index.js b/node_modules/strip-json-comments/index.js
new file mode 100644
index 0000000..4e6576e
--- /dev/null
+++ b/node_modules/strip-json-comments/index.js
@@ -0,0 +1,70 @@
+'use strict';
+var singleComment = 1;
+var multiComment = 2;
+
+function stripWithoutWhitespace() {
+	return '';
+}
+
+function stripWithWhitespace(str, start, end) {
+	return str.slice(start, end).replace(/\S/g, ' ');
+}
+
+module.exports = function (str, opts) {
+	opts = opts || {};
+
+	var currentChar;
+	var nextChar;
+	var insideString = false;
+	var insideComment = false;
+	var offset = 0;
+	var ret = '';
+	var strip = opts.whitespace === false ? stripWithoutWhitespace : stripWithWhitespace;
+
+	for (var i = 0; i < str.length; i++) {
+		currentChar = str[i];
+		nextChar = str[i + 1];
+
+		if (!insideComment && currentChar === '"') {
+			var escaped = str[i - 1] === '\\' && str[i - 2] !== '\\';
+			if (!escaped) {
+				insideString = !insideString;
+			}
+		}
+
+		if (insideString) {
+			continue;
+		}
+
+		if (!insideComment && currentChar + nextChar === '//') {
+			ret += str.slice(offset, i);
+			offset = i;
+			insideComment = singleComment;
+			i++;
+		} else if (insideComment === singleComment && currentChar + nextChar === '\r\n') {
+			i++;
+			insideComment = false;
+			ret += strip(str, offset, i);
+			offset = i;
+			continue;
+		} else if (insideComment === singleComment && currentChar === '\n') {
+			insideComment = false;
+			ret += strip(str, offset, i);
+			offset = i;
+		} else if (!insideComment && currentChar + nextChar === '/*') {
+			ret += str.slice(offset, i);
+			offset = i;
+			insideComment = multiComment;
+			i++;
+			continue;
+		} else if (insideComment === multiComment && currentChar + nextChar === '*/') {
+			i++;
+			insideComment = false;
+			ret += strip(str, offset, i + 1);
+			offset = i + 1;
+			continue;
+		}
+	}
+
+	return ret + (insideComment ? strip(str.substr(offset)) : str.substr(offset));
+};
diff --git a/node_modules/strip-json-comments/license b/node_modules/strip-json-comments/license
new file mode 100644
index 0000000..654d0bf
--- /dev/null
+++ b/node_modules/strip-json-comments/license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/strip-json-comments/package.json b/node_modules/strip-json-comments/package.json
new file mode 100644
index 0000000..124dae3
--- /dev/null
+++ b/node_modules/strip-json-comments/package.json
@@ -0,0 +1,74 @@
+{
+  "_from": "strip-json-comments@~2.0.1",
+  "_id": "strip-json-comments@2.0.1",
+  "_inBundle": false,
+  "_integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+  "_location": "/strip-json-comments",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "strip-json-comments@~2.0.1",
+    "name": "strip-json-comments",
+    "escapedName": "strip-json-comments",
+    "rawSpec": "~2.0.1",
+    "saveSpec": null,
+    "fetchSpec": "~2.0.1"
+  },
+  "_requiredBy": [
+    "/rc"
+  ],
+  "_resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+  "_shasum": "3c531942e908c2697c0ec344858c286c7ca0a60a",
+  "_spec": "strip-json-comments@~2.0.1",
+  "_where": "F:\\vent-display\\node_modules\\rc",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "bugs": {
+    "url": "https://github.com/sindresorhus/strip-json-comments/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Strip comments from JSON. Lets you use comments in your JSON files!",
+  "devDependencies": {
+    "ava": "*",
+    "xo": "*"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/sindresorhus/strip-json-comments#readme",
+  "keywords": [
+    "json",
+    "strip",
+    "remove",
+    "delete",
+    "trim",
+    "comments",
+    "multiline",
+    "parse",
+    "config",
+    "configuration",
+    "conf",
+    "settings",
+    "util",
+    "env",
+    "environment"
+  ],
+  "license": "MIT",
+  "name": "strip-json-comments",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/sindresorhus/strip-json-comments.git"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "version": "2.0.1"
+}
diff --git a/node_modules/strip-json-comments/readme.md b/node_modules/strip-json-comments/readme.md
new file mode 100644
index 0000000..0ee58df
--- /dev/null
+++ b/node_modules/strip-json-comments/readme.md
@@ -0,0 +1,64 @@
+# strip-json-comments [![Build Status](https://travis-ci.org/sindresorhus/strip-json-comments.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-json-comments)
+
+> Strip comments from JSON. Lets you use comments in your JSON files!
+
+This is now possible:
+
+```js
+{
+	// rainbows
+	"unicorn": /* ❤ */ "cake"
+}
+```
+
+It will replace single-line comments `//` and multi-line comments `/**/` with whitespace. This allows JSON error positions to remain as close as possible to the original source.
+
+Also available as a [gulp](https://github.com/sindresorhus/gulp-strip-json-comments)/[grunt](https://github.com/sindresorhus/grunt-strip-json-comments)/[broccoli](https://github.com/sindresorhus/broccoli-strip-json-comments) plugin.
+
+
+## Install
+
+```
+$ npm install --save strip-json-comments
+```
+
+
+## Usage
+
+```js
+const json = '{/*rainbows*/"unicorn":"cake"}';
+
+JSON.parse(stripJsonComments(json));
+//=> {unicorn: 'cake'}
+```
+
+
+## API
+
+### stripJsonComments(input, [options])
+
+#### input
+
+Type: `string`
+
+Accepts a string with JSON and returns a string without comments.
+
+#### options
+
+##### whitespace
+
+Type: `boolean`  
+Default: `true`
+
+Replace comments with whitespace instead of stripping them entirely.
+
+
+## Related
+
+- [strip-json-comments-cli](https://github.com/sindresorhus/strip-json-comments-cli) - CLI for this module
+- [strip-css-comments](https://github.com/sindresorhus/strip-css-comments) - Strip comments from CSS
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/tar-fs/.travis.yml b/node_modules/tar-fs/.travis.yml
new file mode 100644
index 0000000..977f7a6
--- /dev/null
+++ b/node_modules/tar-fs/.travis.yml
@@ -0,0 +1,6 @@
+language: node_js
+node_js:
+  - 8
+  - 10
+  - 12
+  - 14
diff --git a/node_modules/tar-fs/LICENSE b/node_modules/tar-fs/LICENSE
new file mode 100644
index 0000000..757562e
--- /dev/null
+++ b/node_modules/tar-fs/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Mathias Buus
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/tar-fs/README.md b/node_modules/tar-fs/README.md
new file mode 100644
index 0000000..c6d35cf
--- /dev/null
+++ b/node_modules/tar-fs/README.md
@@ -0,0 +1,165 @@
+# tar-fs
+
+filesystem bindings for [tar-stream](https://github.com/mafintosh/tar-stream).
+
+```
+npm install tar-fs
+```
+
+[![build status](https://secure.travis-ci.org/mafintosh/tar-fs.png)](http://travis-ci.org/mafintosh/tar-fs)
+
+## Usage
+
+tar-fs allows you to pack directories into tarballs and extract tarballs into directories.
+
+It doesn't gunzip for you, so if you want to extract a `.tar.gz` with this you'll need to use something like [gunzip-maybe](https://github.com/mafintosh/gunzip-maybe) in addition to this.
+
+``` js
+var tar = require('tar-fs')
+var fs = require('fs')
+
+// packing a directory
+tar.pack('./my-directory').pipe(fs.createWriteStream('my-tarball.tar'))
+
+// extracting a directory
+fs.createReadStream('my-other-tarball.tar').pipe(tar.extract('./my-other-directory'))
+```
+
+To ignore various files when packing or extracting add a ignore function to the options. `ignore`
+is also an alias for `filter`. Additionally you get `header` if you use ignore while extracting.
+That way you could also filter by metadata.
+
+``` js
+var pack = tar.pack('./my-directory', {
+  ignore: function(name) {
+    return path.extname(name) === '.bin' // ignore .bin files when packing
+  }
+})
+
+var extract = tar.extract('./my-other-directory', {
+  ignore: function(name) {
+    return path.extname(name) === '.bin' // ignore .bin files inside the tarball when extracing
+  }
+})
+
+var extractFilesDirs = tar.extract('./my-other-other-directory', {
+  ignore: function(_, header) {
+    // pass files & directories, ignore e.g. symlinks
+    return header.type !== 'file' && header.type !== 'directory'
+  }
+})
+```
+
+You can also specify which entries to pack using the `entries` option
+
+```js
+var pack = tar.pack('./my-directory', {
+  entries: ['file1', 'subdir/file2'] // only the specific entries will be packed
+})
+```
+
+If you want to modify the headers when packing/extracting add a map function to the options
+
+``` js
+var pack = tar.pack('./my-directory', {
+  map: function(header) {
+    header.name = 'prefixed/'+header.name
+    return header
+  }
+})
+
+var extract = tar.extract('./my-directory', {
+  map: function(header) {
+    header.name = 'another-prefix/'+header.name
+    return header
+  }
+})
+```
+
+Similarly you can use `mapStream` incase you wanna modify the input/output file streams
+
+``` js
+var pack = tar.pack('./my-directory', {
+  mapStream: function(fileStream, header) {
+    // NOTE: the returned stream HAS to have the same length as the input stream.
+    // If not make sure to update the size in the header passed in here.
+    if (path.extname(header.name) === '.js') {
+      return fileStream.pipe(someTransform)
+    }
+    return fileStream;
+  }
+})
+
+var extract = tar.extract('./my-directory', {
+  mapStream: function(fileStream, header) {
+    if (path.extname(header.name) === '.js') {
+      return fileStream.pipe(someTransform)
+    }
+    return fileStream;
+  }
+})
+```
+
+Set `options.fmode` and `options.dmode` to ensure that files/directories extracted have the corresponding modes
+
+``` js
+var extract = tar.extract('./my-directory', {
+  dmode: parseInt(555, 8), // all dirs should be readable
+  fmode: parseInt(444, 8) // all files should be readable
+})
+```
+
+It can be useful to use `dmode` and `fmode` if you are packing/unpacking tarballs between *nix/windows to ensure that all files/directories unpacked are readable.
+
+Alternatively you can set `options.readable` and/or `options.writable` to set the dmode and fmode to readable/writable.
+
+``` js
+var extract = tar.extract('./my-directory', {
+  readable: true, // all dirs and files should be readable
+  writable: true, // all dirs and files should be writable
+})
+```
+
+Set `options.strict` to `false` if you want to ignore errors due to unsupported entry types (like device files)
+
+To dereference symlinks (pack the contents of the symlink instead of the link itself) set `options.dereference` to `true`.
+
+## Copy a directory
+
+Copying a directory with permissions and mtime intact is as simple as
+
+``` js
+tar.pack('source-directory').pipe(tar.extract('dest-directory'))
+```
+
+## Interaction with [`tar-stream`](https://github.com/mafintosh/tar-stream)
+
+Use `finalize: false` and the `finish` hook to
+leave the pack stream open for further entries (see
+[`tar-stream#pack`](https://github.com/mafintosh/tar-stream#packing)),
+and use `pack` to pass an existing pack stream.
+
+``` js
+var mypack = tar.pack('./my-directory', {
+  finalize: false,
+  finish: function(sameAsMypack) {
+    mypack.entry({name: 'generated-file.txt'}, "hello")
+    tar.pack('./other-directory', {
+      pack: sameAsMypack
+    })
+  }
+})
+```
+
+
+## Performance
+
+Packing and extracting a 6.1 GB with 2496 directories and 2398 files yields the following results on my Macbook Air.
+[See the benchmark here](https://gist.github.com/mafintosh/8102201)
+
+* tar-fs: 34.261 seconds
+* [node-tar](https://github.com/isaacs/node-tar): 366.123 seconds (or 10x slower)
+
+## License
+
+MIT
diff --git a/node_modules/tar-fs/index.js b/node_modules/tar-fs/index.js
new file mode 100644
index 0000000..18a28ee
--- /dev/null
+++ b/node_modules/tar-fs/index.js
@@ -0,0 +1,351 @@
+var chownr = require('chownr')
+var tar = require('tar-stream')
+var pump = require('pump')
+var mkdirp = require('mkdirp-classic')
+var fs = require('fs')
+var path = require('path')
+var os = require('os')
+
+var win32 = os.platform() === 'win32'
+
+var noop = function () {}
+
+var echo = function (name) {
+  return name
+}
+
+var normalize = !win32 ? echo : function (name) {
+  return name.replace(/\\/g, '/').replace(/[:?<>|]/g, '_')
+}
+
+var statAll = function (fs, stat, cwd, ignore, entries, sort) {
+  var queue = entries || ['.']
+
+  return function loop (callback) {
+    if (!queue.length) return callback()
+    var next = queue.shift()
+    var nextAbs = path.join(cwd, next)
+
+    stat.call(fs, nextAbs, function (err, stat) {
+      if (err) return callback(err)
+
+      if (!stat.isDirectory()) return callback(null, next, stat)
+
+      fs.readdir(nextAbs, function (err, files) {
+        if (err) return callback(err)
+
+        if (sort) files.sort()
+        for (var i = 0; i < files.length; i++) {
+          if (!ignore(path.join(cwd, next, files[i]))) queue.push(path.join(next, files[i]))
+        }
+
+        callback(null, next, stat)
+      })
+    })
+  }
+}
+
+var strip = function (map, level) {
+  return function (header) {
+    header.name = header.name.split('/').slice(level).join('/')
+
+    var linkname = header.linkname
+    if (linkname && (header.type === 'link' || path.isAbsolute(linkname))) {
+      header.linkname = linkname.split('/').slice(level).join('/')
+    }
+
+    return map(header)
+  }
+}
+
+exports.pack = function (cwd, opts) {
+  if (!cwd) cwd = '.'
+  if (!opts) opts = {}
+
+  var xfs = opts.fs || fs
+  var ignore = opts.ignore || opts.filter || noop
+  var map = opts.map || noop
+  var mapStream = opts.mapStream || echo
+  var statNext = statAll(xfs, opts.dereference ? xfs.stat : xfs.lstat, cwd, ignore, opts.entries, opts.sort)
+  var strict = opts.strict !== false
+  var umask = typeof opts.umask === 'number' ? ~opts.umask : ~processUmask()
+  var dmode = typeof opts.dmode === 'number' ? opts.dmode : 0
+  var fmode = typeof opts.fmode === 'number' ? opts.fmode : 0
+  var pack = opts.pack || tar.pack()
+  var finish = opts.finish || noop
+
+  if (opts.strip) map = strip(map, opts.strip)
+
+  if (opts.readable) {
+    dmode |= parseInt(555, 8)
+    fmode |= parseInt(444, 8)
+  }
+  if (opts.writable) {
+    dmode |= parseInt(333, 8)
+    fmode |= parseInt(222, 8)
+  }
+
+  var onsymlink = function (filename, header) {
+    xfs.readlink(path.join(cwd, filename), function (err, linkname) {
+      if (err) return pack.destroy(err)
+      header.linkname = normalize(linkname)
+      pack.entry(header, onnextentry)
+    })
+  }
+
+  var onstat = function (err, filename, stat) {
+    if (err) return pack.destroy(err)
+    if (!filename) {
+      if (opts.finalize !== false) pack.finalize()
+      return finish(pack)
+    }
+
+    if (stat.isSocket()) return onnextentry() // tar does not support sockets...
+
+    var header = {
+      name: normalize(filename),
+      mode: (stat.mode | (stat.isDirectory() ? dmode : fmode)) & umask,
+      mtime: stat.mtime,
+      size: stat.size,
+      type: 'file',
+      uid: stat.uid,
+      gid: stat.gid
+    }
+
+    if (stat.isDirectory()) {
+      header.size = 0
+      header.type = 'directory'
+      header = map(header) || header
+      return pack.entry(header, onnextentry)
+    }
+
+    if (stat.isSymbolicLink()) {
+      header.size = 0
+      header.type = 'symlink'
+      header = map(header) || header
+      return onsymlink(filename, header)
+    }
+
+    // TODO: add fifo etc...
+
+    header = map(header) || header
+
+    if (!stat.isFile()) {
+      if (strict) return pack.destroy(new Error('unsupported type for ' + filename))
+      return onnextentry()
+    }
+
+    var entry = pack.entry(header, onnextentry)
+    if (!entry) return
+
+    var rs = mapStream(xfs.createReadStream(path.join(cwd, filename), { start: 0, end: header.size > 0 ? header.size - 1 : header.size }), header)
+
+    rs.on('error', function (err) { // always forward errors on destroy
+      entry.destroy(err)
+    })
+
+    pump(rs, entry)
+  }
+
+  var onnextentry = function (err) {
+    if (err) return pack.destroy(err)
+    statNext(onstat)
+  }
+
+  onnextentry()
+
+  return pack
+}
+
+var head = function (list) {
+  return list.length ? list[list.length - 1] : null
+}
+
+var processGetuid = function () {
+  return process.getuid ? process.getuid() : -1
+}
+
+var processUmask = function () {
+  return process.umask ? process.umask() : 0
+}
+
+exports.extract = function (cwd, opts) {
+  if (!cwd) cwd = '.'
+  if (!opts) opts = {}
+
+  var xfs = opts.fs || fs
+  var ignore = opts.ignore || opts.filter || noop
+  var map = opts.map || noop
+  var mapStream = opts.mapStream || echo
+  var own = opts.chown !== false && !win32 && processGetuid() === 0
+  var extract = opts.extract || tar.extract()
+  var stack = []
+  var now = new Date()
+  var umask = typeof opts.umask === 'number' ? ~opts.umask : ~processUmask()
+  var dmode = typeof opts.dmode === 'number' ? opts.dmode : 0
+  var fmode = typeof opts.fmode === 'number' ? opts.fmode : 0
+  var strict = opts.strict !== false
+
+  if (opts.strip) map = strip(map, opts.strip)
+
+  if (opts.readable) {
+    dmode |= parseInt(555, 8)
+    fmode |= parseInt(444, 8)
+  }
+  if (opts.writable) {
+    dmode |= parseInt(333, 8)
+    fmode |= parseInt(222, 8)
+  }
+
+  var utimesParent = function (name, cb) { // we just set the mtime on the parent dir again everytime we write an entry
+    var top
+    while ((top = head(stack)) && name.slice(0, top[0].length) !== top[0]) stack.pop()
+    if (!top) return cb()
+    xfs.utimes(top[0], now, top[1], cb)
+  }
+
+  var utimes = function (name, header, cb) {
+    if (opts.utimes === false) return cb()
+
+    if (header.type === 'directory') return xfs.utimes(name, now, header.mtime, cb)
+    if (header.type === 'symlink') return utimesParent(name, cb) // TODO: how to set mtime on link?
+
+    xfs.utimes(name, now, header.mtime, function (err) {
+      if (err) return cb(err)
+      utimesParent(name, cb)
+    })
+  }
+
+  var chperm = function (name, header, cb) {
+    var link = header.type === 'symlink'
+
+    /* eslint-disable node/no-deprecated-api */
+    var chmod = link ? xfs.lchmod : xfs.chmod
+    var chown = link ? xfs.lchown : xfs.chown
+    /* eslint-enable node/no-deprecated-api */
+
+    if (!chmod) return cb()
+
+    var mode = (header.mode | (header.type === 'directory' ? dmode : fmode)) & umask
+
+    if (chown && own) chown.call(xfs, name, header.uid, header.gid, onchown)
+    else onchown(null)
+
+    function onchown (err) {
+      if (err) return cb(err)
+      if (!chmod) return cb()
+      chmod.call(xfs, name, mode, cb)
+    }
+  }
+
+  extract.on('entry', function (header, stream, next) {
+    header = map(header) || header
+    header.name = normalize(header.name)
+    var name = path.join(cwd, path.join('/', header.name))
+
+    if (ignore(name, header)) {
+      stream.resume()
+      return next()
+    }
+
+    var stat = function (err) {
+      if (err) return next(err)
+      utimes(name, header, function (err) {
+        if (err) return next(err)
+        if (win32) return next()
+        chperm(name, header, next)
+      })
+    }
+
+    var onsymlink = function () {
+      if (win32) return next() // skip symlinks on win for now before it can be tested
+      xfs.unlink(name, function () {
+        xfs.symlink(header.linkname, name, stat)
+      })
+    }
+
+    var onlink = function () {
+      if (win32) return next() // skip links on win for now before it can be tested
+      xfs.unlink(name, function () {
+        var srcpath = path.join(cwd, path.join('/', header.linkname))
+
+        xfs.link(srcpath, name, function (err) {
+          if (err && err.code === 'EPERM' && opts.hardlinkAsFilesFallback) {
+            stream = xfs.createReadStream(srcpath)
+            return onfile()
+          }
+
+          stat(err)
+        })
+      })
+    }
+
+    var onfile = function () {
+      var ws = xfs.createWriteStream(name)
+      var rs = mapStream(stream, header)
+
+      ws.on('error', function (err) { // always forward errors on destroy
+        rs.destroy(err)
+      })
+
+      pump(rs, ws, function (err) {
+        if (err) return next(err)
+        ws.on('close', stat)
+      })
+    }
+
+    if (header.type === 'directory') {
+      stack.push([name, header.mtime])
+      return mkdirfix(name, {
+        fs: xfs, own: own, uid: header.uid, gid: header.gid
+      }, stat)
+    }
+
+    var dir = path.dirname(name)
+
+    validate(xfs, dir, path.join(cwd, '.'), function (err, valid) {
+      if (err) return next(err)
+      if (!valid) return next(new Error(dir + ' is not a valid path'))
+
+      mkdirfix(dir, {
+        fs: xfs, own: own, uid: header.uid, gid: header.gid
+      }, function (err) {
+        if (err) return next(err)
+
+        switch (header.type) {
+          case 'file': return onfile()
+          case 'link': return onlink()
+          case 'symlink': return onsymlink()
+        }
+
+        if (strict) return next(new Error('unsupported type for ' + name + ' (' + header.type + ')'))
+
+        stream.resume()
+        next()
+      })
+    })
+  })
+
+  if (opts.finish) extract.on('finish', opts.finish)
+
+  return extract
+}
+
+function validate (fs, name, root, cb) {
+  if (name === root) return cb(null, true)
+  fs.lstat(name, function (err, st) {
+    if (err && err.code !== 'ENOENT') return cb(err)
+    if (err || st.isDirectory()) return validate(fs, path.join(name, '..'), root, cb)
+    cb(null, false)
+  })
+}
+
+function mkdirfix (name, opts, cb) {
+  mkdirp(name, { fs: opts.fs }, function (err, made) {
+    if (!err && made && opts.own) {
+      chownr(made, opts.uid, opts.gid, cb)
+    } else {
+      cb(err)
+    }
+  })
+}
diff --git a/node_modules/tar-fs/package.json b/node_modules/tar-fs/package.json
new file mode 100644
index 0000000..2412370
--- /dev/null
+++ b/node_modules/tar-fs/package.json
@@ -0,0 +1,68 @@
+{
+  "_from": "tar-fs@^2.0.0",
+  "_id": "tar-fs@2.1.1",
+  "_inBundle": false,
+  "_integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+  "_location": "/tar-fs",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "tar-fs@^2.0.0",
+    "name": "tar-fs",
+    "escapedName": "tar-fs",
+    "rawSpec": "^2.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^2.0.0"
+  },
+  "_requiredBy": [
+    "/prebuild-install"
+  ],
+  "_resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+  "_shasum": "489a15ab85f1f0befabb370b7de4f9eb5cbe8784",
+  "_spec": "tar-fs@^2.0.0",
+  "_where": "F:\\vent-display\\node_modules\\prebuild-install",
+  "author": {
+    "name": "Mathias Buus"
+  },
+  "bugs": {
+    "url": "https://github.com/mafintosh/tar-fs/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "chownr": "^1.1.1",
+    "mkdirp-classic": "^0.5.2",
+    "pump": "^3.0.0",
+    "tar-stream": "^2.1.4"
+  },
+  "deprecated": false,
+  "description": "filesystem bindings for tar-stream",
+  "devDependencies": {
+    "rimraf": "^2.6.3",
+    "standard": "^13.0.1",
+    "tape": "^4.9.2"
+  },
+  "directories": {
+    "test": "test"
+  },
+  "homepage": "https://github.com/mafintosh/tar-fs",
+  "keywords": [
+    "tar",
+    "fs",
+    "file",
+    "tarball",
+    "directory",
+    "stream"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "tar-fs",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/mafintosh/tar-fs.git"
+  },
+  "scripts": {
+    "test": "standard && tape test/index.js"
+  },
+  "version": "2.1.1"
+}
diff --git a/node_modules/tar-fs/test/fixtures/a/hello.txt b/node_modules/tar-fs/test/fixtures/a/hello.txt
new file mode 100644
index 0000000..3b18e51
--- /dev/null
+++ b/node_modules/tar-fs/test/fixtures/a/hello.txt
@@ -0,0 +1 @@
+hello world
diff --git a/node_modules/tar-fs/test/fixtures/b/a/test.txt b/node_modules/tar-fs/test/fixtures/b/a/test.txt
new file mode 100644
index 0000000..9daeafb
--- /dev/null
+++ b/node_modules/tar-fs/test/fixtures/b/a/test.txt
@@ -0,0 +1 @@
+test
diff --git a/node_modules/tar-fs/test/fixtures/d/file1 b/node_modules/tar-fs/test/fixtures/d/file1
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/tar-fs/test/fixtures/d/file2 b/node_modules/tar-fs/test/fixtures/d/file2
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 b/node_modules/tar-fs/test/fixtures/d/sub-dir/file5
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/tar-fs/test/fixtures/d/sub-files/file3 b/node_modules/tar-fs/test/fixtures/d/sub-files/file3
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/tar-fs/test/fixtures/d/sub-files/file4 b/node_modules/tar-fs/test/fixtures/d/sub-files/file4
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/tar-fs/test/fixtures/e/directory/.ignore b/node_modules/tar-fs/test/fixtures/e/directory/.ignore
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/tar-fs/test/fixtures/e/file b/node_modules/tar-fs/test/fixtures/e/file
new file mode 100644
index 0000000..e69de29
diff --git a/node_modules/tar-fs/test/fixtures/invalid.tar b/node_modules/tar-fs/test/fixtures/invalid.tar
new file mode 100644
index 0000000000000000000000000000000000000000..a645e9ce59e35b70c748a3c47c5b791c86d61ae3
GIT binary patch
literal 2560
zcmYex&u5@DFfcGMGci$M0MbB!PD2C@jg8C=jZKZr3{4aa3=IrT3>6rR^z`&;?KXze
z;*!K7pwlR|2<#0c&rxa~o%E;W=j$f{1AvwQ7&HXp-&6rD{!PqHf$4;nj)Ivz!s9<9
bH7AGmB>*h2N9oZJ7!85Z5Eu=C!4d)hnE)h9

literal 0
HcmV?d00001

diff --git a/node_modules/tar-fs/test/index.js b/node_modules/tar-fs/test/index.js
new file mode 100644
index 0000000..a01f82a
--- /dev/null
+++ b/node_modules/tar-fs/test/index.js
@@ -0,0 +1,346 @@
+var test = require('tape')
+var rimraf = require('rimraf')
+var tar = require('../index')
+var tarStream = require('tar-stream')
+var path = require('path')
+var fs = require('fs')
+var os = require('os')
+
+var win32 = os.platform() === 'win32'
+
+var mtime = function (st) {
+  return Math.floor(st.mtime.getTime() / 1000)
+}
+
+test('copy a -> copy/a', function (t) {
+  t.plan(5)
+
+  var a = path.join(__dirname, 'fixtures', 'a')
+  var b = path.join(__dirname, 'fixtures', 'copy', 'a')
+
+  rimraf.sync(b)
+  tar.pack(a)
+    .pipe(tar.extract(b))
+    .on('finish', function () {
+      var files = fs.readdirSync(b)
+      t.same(files.length, 1)
+      t.same(files[0], 'hello.txt')
+      var fileB = path.join(b, files[0])
+      var fileA = path.join(a, files[0])
+      t.same(fs.readFileSync(fileB, 'utf-8'), fs.readFileSync(fileA, 'utf-8'))
+      t.same(fs.statSync(fileB).mode, fs.statSync(fileA).mode)
+      t.same(mtime(fs.statSync(fileB)), mtime(fs.statSync(fileA)))
+    })
+})
+
+test('copy b -> copy/b', function (t) {
+  t.plan(8)
+
+  var a = path.join(__dirname, 'fixtures', 'b')
+  var b = path.join(__dirname, 'fixtures', 'copy', 'b')
+
+  rimraf.sync(b)
+  tar.pack(a)
+    .pipe(tar.extract(b))
+    .on('finish', function () {
+      var files = fs.readdirSync(b)
+      t.same(files.length, 1)
+      t.same(files[0], 'a')
+      var dirB = path.join(b, files[0])
+      var dirA = path.join(a, files[0])
+      t.same(fs.statSync(dirB).mode, fs.statSync(dirA).mode)
+      t.same(mtime(fs.statSync(dirB)), mtime(fs.statSync(dirA)))
+      t.ok(fs.statSync(dirB).isDirectory())
+      var fileB = path.join(dirB, 'test.txt')
+      var fileA = path.join(dirA, 'test.txt')
+      t.same(fs.readFileSync(fileB, 'utf-8'), fs.readFileSync(fileA, 'utf-8'))
+      t.same(fs.statSync(fileB).mode, fs.statSync(fileA).mode)
+      t.same(mtime(fs.statSync(fileB)), mtime(fs.statSync(fileA)))
+    })
+})
+
+test('symlink', function (t) {
+  if (win32) { // no symlink support on win32 currently. TODO: test if this can be enabled somehow
+    t.plan(1)
+    t.ok(true)
+    return
+  }
+
+  t.plan(5)
+
+  var a = path.join(__dirname, 'fixtures', 'c')
+
+  rimraf.sync(path.join(a, 'link'))
+  fs.symlinkSync('.gitignore', path.join(a, 'link'))
+
+  var b = path.join(__dirname, 'fixtures', 'copy', 'c')
+
+  rimraf.sync(b)
+  tar.pack(a)
+    .pipe(tar.extract(b))
+    .on('finish', function () {
+      var files = fs.readdirSync(b).sort()
+      t.same(files.length, 2)
+      t.same(files[0], '.gitignore')
+      t.same(files[1], 'link')
+
+      var linkA = path.join(a, 'link')
+      var linkB = path.join(b, 'link')
+
+      t.same(mtime(fs.lstatSync(linkB)), mtime(fs.lstatSync(linkA)))
+      t.same(fs.readlinkSync(linkB), fs.readlinkSync(linkA))
+    })
+})
+
+test('follow symlinks', function (t) {
+  if (win32) { // no symlink support on win32 currently. TODO: test if this can be enabled somehow
+    t.plan(1)
+    t.ok(true)
+    return
+  }
+
+  t.plan(5)
+
+  var a = path.join(__dirname, 'fixtures', 'c')
+
+  rimraf.sync(path.join(a, 'link'))
+  fs.symlinkSync('.gitignore', path.join(a, 'link'))
+
+  var b = path.join(__dirname, 'fixtures', 'copy', 'c-dereference')
+
+  rimraf.sync(b)
+  tar.pack(a, { dereference: true })
+    .pipe(tar.extract(b))
+    .on('finish', function () {
+      var files = fs.readdirSync(b).sort()
+      t.same(files.length, 2)
+      t.same(files[0], '.gitignore')
+      t.same(files[1], 'link')
+
+      var file1 = path.join(b, '.gitignore')
+      var file2 = path.join(b, 'link')
+
+      t.same(mtime(fs.lstatSync(file1)), mtime(fs.lstatSync(file2)))
+      t.same(fs.readFileSync(file1), fs.readFileSync(file2))
+    })
+})
+
+test('strip', function (t) {
+  t.plan(2)
+
+  var a = path.join(__dirname, 'fixtures', 'b')
+  var b = path.join(__dirname, 'fixtures', 'copy', 'b-strip')
+
+  rimraf.sync(b)
+
+  tar.pack(a)
+    .pipe(tar.extract(b, { strip: 1 }))
+    .on('finish', function () {
+      var files = fs.readdirSync(b).sort()
+      t.same(files.length, 1)
+      t.same(files[0], 'test.txt')
+    })
+})
+
+test('strip + map', function (t) {
+  t.plan(2)
+
+  var a = path.join(__dirname, 'fixtures', 'b')
+  var b = path.join(__dirname, 'fixtures', 'copy', 'b-strip')
+
+  rimraf.sync(b)
+
+  var uppercase = function (header) {
+    header.name = header.name.toUpperCase()
+    return header
+  }
+
+  tar.pack(a)
+    .pipe(tar.extract(b, { strip: 1, map: uppercase }))
+    .on('finish', function () {
+      var files = fs.readdirSync(b).sort()
+      t.same(files.length, 1)
+      t.same(files[0], 'TEST.TXT')
+    })
+})
+
+test('map + dir + permissions', function (t) {
+  t.plan(win32 ? 1 : 2) // skip chmod test, it's not working like unix
+
+  var a = path.join(__dirname, 'fixtures', 'b')
+  var b = path.join(__dirname, 'fixtures', 'copy', 'a-perms')
+
+  rimraf.sync(b)
+
+  var aWithMode = function (header) {
+    if (header.name === 'a') {
+      header.mode = parseInt(700, 8)
+    }
+    return header
+  }
+
+  tar.pack(a)
+    .pipe(tar.extract(b, { map: aWithMode }))
+    .on('finish', function () {
+      var files = fs.readdirSync(b).sort()
+      var stat = fs.statSync(path.join(b, 'a'))
+      t.same(files.length, 1)
+      if (!win32) {
+        t.same(stat.mode & parseInt(777, 8), parseInt(700, 8))
+      }
+    })
+})
+
+test('specific entries', function (t) {
+  t.plan(6)
+
+  var a = path.join(__dirname, 'fixtures', 'd')
+  var b = path.join(__dirname, 'fixtures', 'copy', 'd-entries')
+
+  var entries = ['file1', 'sub-files/file3', 'sub-dir']
+
+  rimraf.sync(b)
+  tar.pack(a, { entries: entries })
+    .pipe(tar.extract(b))
+    .on('finish', function () {
+      var files = fs.readdirSync(b)
+      t.same(files.length, 3)
+      t.notSame(files.indexOf('file1'), -1)
+      t.notSame(files.indexOf('sub-files'), -1)
+      t.notSame(files.indexOf('sub-dir'), -1)
+      var subFiles = fs.readdirSync(path.join(b, 'sub-files'))
+      t.same(subFiles, ['file3'])
+      var subDir = fs.readdirSync(path.join(b, 'sub-dir'))
+      t.same(subDir, ['file5'])
+    })
+})
+
+test('check type while mapping header on packing', function (t) {
+  t.plan(3)
+
+  var e = path.join(__dirname, 'fixtures', 'e')
+
+  var checkHeaderType = function (header) {
+    if (header.name.indexOf('.') === -1) t.same(header.type, header.name)
+  }
+
+  tar.pack(e, { map: checkHeaderType })
+})
+
+test('finish callbacks', function (t) {
+  t.plan(3)
+
+  var a = path.join(__dirname, 'fixtures', 'a')
+  var b = path.join(__dirname, 'fixtures', 'copy', 'a')
+
+  rimraf.sync(b)
+
+  var packEntries = 0
+  var extractEntries = 0
+
+  var countPackEntry = function (header) { packEntries++ }
+  var countExtractEntry = function (header) { extractEntries++ }
+
+  var pack
+  var onPackFinish = function (passedPack) {
+    t.equal(packEntries, 2, 'All entries have been packed') // 2 entries - the file and base directory
+    t.equal(passedPack, pack, 'The finish hook passes the pack')
+  }
+
+  var onExtractFinish = function () { t.equal(extractEntries, 2) }
+
+  pack = tar.pack(a, { map: countPackEntry, finish: onPackFinish })
+
+  pack.pipe(tar.extract(b, { map: countExtractEntry, finish: onExtractFinish }))
+    .on('finish', function () {
+      t.end()
+    })
+})
+
+test('not finalizing the pack', function (t) {
+  t.plan(2)
+
+  var a = path.join(__dirname, 'fixtures', 'a')
+  var b = path.join(__dirname, 'fixtures', 'b')
+
+  var out = path.join(__dirname, 'fixtures', 'copy', 'merged-packs')
+
+  rimraf.sync(out)
+
+  var prefixer = function (prefix) {
+    return function (header) {
+      header.name = path.join(prefix, header.name)
+      return header
+    }
+  }
+
+  tar.pack(a, {
+    map: prefixer('a-files'),
+    finalize: false,
+    finish: packB
+  })
+
+  function packB (pack) {
+    tar.pack(b, { pack: pack, map: prefixer('b-files') })
+      .pipe(tar.extract(out))
+      .on('finish', assertResults)
+  }
+
+  function assertResults () {
+    var containers = fs.readdirSync(out)
+    t.deepEqual(containers, ['a-files', 'b-files'])
+    var aFiles = fs.readdirSync(path.join(out, 'a-files'))
+    t.deepEqual(aFiles, ['hello.txt'])
+  }
+})
+
+test('do not extract invalid tar', function (t) {
+  var a = path.join(__dirname, 'fixtures', 'invalid.tar')
+
+  var out = path.join(__dirname, 'fixtures', 'invalid')
+
+  rimraf.sync(out)
+
+  fs.createReadStream(a)
+    .pipe(tar.extract(out))
+    .on('error', function (err) {
+      t.ok(/is not a valid path/i.test(err.message))
+      fs.stat(path.join(out, '../bar'), function (err) {
+        t.ok(err)
+        t.end()
+      })
+    })
+})
+
+test('no abs hardlink targets', function (t) {
+  var out = path.join(__dirname, 'fixtures', 'invalid')
+  var outside = path.join(__dirname, 'fixtures', 'outside')
+
+  rimraf.sync(out)
+
+  var s = tarStream.pack()
+
+  fs.writeFileSync(outside, 'something')
+
+  s.entry({
+    type: 'link',
+    name: 'link',
+    linkname: outside
+  })
+
+  s.entry({
+    name: 'link'
+  }, 'overwrite')
+
+  s.finalize()
+
+  s.pipe(tar.extract(out))
+    .on('error', function (err) {
+      t.ok(err, 'had error')
+      fs.readFile(outside, 'utf-8', function (err, str) {
+        t.error(err, 'no error')
+        t.same(str, 'something')
+        t.end()
+      })
+    })
+})
diff --git a/node_modules/tar-stream/LICENSE b/node_modules/tar-stream/LICENSE
new file mode 100644
index 0000000..757562e
--- /dev/null
+++ b/node_modules/tar-stream/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Mathias Buus
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/tar-stream/README.md b/node_modules/tar-stream/README.md
new file mode 100644
index 0000000..2679d9d
--- /dev/null
+++ b/node_modules/tar-stream/README.md
@@ -0,0 +1,168 @@
+# tar-stream
+
+tar-stream is a streaming tar parser and generator and nothing else. It is streams2 and operates purely using streams which means you can easily extract/parse tarballs without ever hitting the file system.
+
+Note that you still need to gunzip your data if you have a `.tar.gz`. We recommend using [gunzip-maybe](https://github.com/mafintosh/gunzip-maybe) in conjunction with this.
+
+```
+npm install tar-stream
+```
+
+[![build status](https://secure.travis-ci.org/mafintosh/tar-stream.png)](http://travis-ci.org/mafintosh/tar-stream)
+[![License](https://img.shields.io/badge/license-MIT-blue.svg)](http://opensource.org/licenses/MIT)
+
+## Usage
+
+tar-stream exposes two streams, [pack](https://github.com/mafintosh/tar-stream#packing) which creates tarballs and [extract](https://github.com/mafintosh/tar-stream#extracting) which extracts tarballs. To [modify an existing tarball](https://github.com/mafintosh/tar-stream#modifying-existing-tarballs) use both.
+
+
+It implementes USTAR with additional support for pax extended headers. It should be compatible with all popular tar distributions out there (gnutar, bsdtar etc)
+
+## Related
+
+If you want to pack/unpack directories on the file system check out [tar-fs](https://github.com/mafintosh/tar-fs) which provides file system bindings to this module.
+
+## Packing
+
+To create a pack stream use `tar.pack()` and call `pack.entry(header, [callback])` to add tar entries.
+
+``` js
+var tar = require('tar-stream')
+var pack = tar.pack() // pack is a streams2 stream
+
+// add a file called my-test.txt with the content "Hello World!"
+pack.entry({ name: 'my-test.txt' }, 'Hello World!')
+
+// add a file called my-stream-test.txt from a stream
+var entry = pack.entry({ name: 'my-stream-test.txt', size: 11 }, function(err) {
+  // the stream was added
+  // no more entries
+  pack.finalize()
+})
+
+entry.write('hello')
+entry.write(' ')
+entry.write('world')
+entry.end()
+
+// pipe the pack stream somewhere
+pack.pipe(process.stdout)
+```
+
+## Extracting
+
+To extract a stream use `tar.extract()` and listen for `extract.on('entry', (header, stream, next) )`
+
+``` js
+var extract = tar.extract()
+
+extract.on('entry', function(header, stream, next) {
+  // header is the tar header
+  // stream is the content body (might be an empty stream)
+  // call next when you are done with this entry
+
+  stream.on('end', function() {
+    next() // ready for next entry
+  })
+
+  stream.resume() // just auto drain the stream
+})
+
+extract.on('finish', function() {
+  // all entries read
+})
+
+pack.pipe(extract)
+```
+
+The tar archive is streamed sequentially, meaning you **must** drain each entry's stream as you get them or else the main extract stream will receive backpressure and stop reading.
+
+## Headers
+
+The header object using in `entry` should contain the following properties.
+Most of these values can be found by stat'ing a file.
+
+``` js
+{
+  name: 'path/to/this/entry.txt',
+  size: 1314,        // entry size. defaults to 0
+  mode: 0o644,       // entry mode. defaults to to 0o755 for dirs and 0o644 otherwise
+  mtime: new Date(), // last modified date for entry. defaults to now.
+  type: 'file',      // type of entry. defaults to file. can be:
+                     // file | link | symlink | directory | block-device
+                     // character-device | fifo | contiguous-file
+  linkname: 'path',  // linked file name
+  uid: 0,            // uid of entry owner. defaults to 0
+  gid: 0,            // gid of entry owner. defaults to 0
+  uname: 'maf',      // uname of entry owner. defaults to null
+  gname: 'staff',    // gname of entry owner. defaults to null
+  devmajor: 0,       // device major version. defaults to 0
+  devminor: 0        // device minor version. defaults to 0
+}
+```
+
+## Modifying existing tarballs
+
+Using tar-stream it is easy to rewrite paths / change modes etc in an existing tarball.
+
+``` js
+var extract = tar.extract()
+var pack = tar.pack()
+var path = require('path')
+
+extract.on('entry', function(header, stream, callback) {
+  // let's prefix all names with 'tmp'
+  header.name = path.join('tmp', header.name)
+  // write the new entry to the pack stream
+  stream.pipe(pack.entry(header, callback))
+})
+
+extract.on('finish', function() {
+  // all entries done - lets finalize it
+  pack.finalize()
+})
+
+// pipe the old tarball to the extractor
+oldTarballStream.pipe(extract)
+
+// pipe the new tarball the another stream
+pack.pipe(newTarballStream)
+```
+
+## Saving tarball to fs
+
+
+``` js
+var fs = require('fs')
+var tar = require('tar-stream')
+
+var pack = tar.pack() // pack is a streams2 stream
+var path = 'YourTarBall.tar'
+var yourTarball = fs.createWriteStream(path)
+
+// add a file called YourFile.txt with the content "Hello World!"
+pack.entry({name: 'YourFile.txt'}, 'Hello World!', function (err) {
+  if (err) throw err
+  pack.finalize()
+})
+
+// pipe the pack stream to your file
+pack.pipe(yourTarball)
+
+yourTarball.on('close', function () {
+  console.log(path + ' has been written')
+  fs.stat(path, function(err, stats) {
+    if (err) throw err
+    console.log(stats)
+    console.log('Got file info successfully!')
+  })
+})
+```
+
+## Performance
+
+[See tar-fs for a performance comparison with node-tar](https://github.com/mafintosh/tar-fs/blob/master/README.md#performance)
+
+# License
+
+MIT
diff --git a/node_modules/tar-stream/extract.js b/node_modules/tar-stream/extract.js
new file mode 100644
index 0000000..11b13b7
--- /dev/null
+++ b/node_modules/tar-stream/extract.js
@@ -0,0 +1,257 @@
+var util = require('util')
+var bl = require('bl')
+var headers = require('./headers')
+
+var Writable = require('readable-stream').Writable
+var PassThrough = require('readable-stream').PassThrough
+
+var noop = function () {}
+
+var overflow = function (size) {
+  size &= 511
+  return size && 512 - size
+}
+
+var emptyStream = function (self, offset) {
+  var s = new Source(self, offset)
+  s.end()
+  return s
+}
+
+var mixinPax = function (header, pax) {
+  if (pax.path) header.name = pax.path
+  if (pax.linkpath) header.linkname = pax.linkpath
+  if (pax.size) header.size = parseInt(pax.size, 10)
+  header.pax = pax
+  return header
+}
+
+var Source = function (self, offset) {
+  this._parent = self
+  this.offset = offset
+  PassThrough.call(this, { autoDestroy: false })
+}
+
+util.inherits(Source, PassThrough)
+
+Source.prototype.destroy = function (err) {
+  this._parent.destroy(err)
+}
+
+var Extract = function (opts) {
+  if (!(this instanceof Extract)) return new Extract(opts)
+  Writable.call(this, opts)
+
+  opts = opts || {}
+
+  this._offset = 0
+  this._buffer = bl()
+  this._missing = 0
+  this._partial = false
+  this._onparse = noop
+  this._header = null
+  this._stream = null
+  this._overflow = null
+  this._cb = null
+  this._locked = false
+  this._destroyed = false
+  this._pax = null
+  this._paxGlobal = null
+  this._gnuLongPath = null
+  this._gnuLongLinkPath = null
+
+  var self = this
+  var b = self._buffer
+
+  var oncontinue = function () {
+    self._continue()
+  }
+
+  var onunlock = function (err) {
+    self._locked = false
+    if (err) return self.destroy(err)
+    if (!self._stream) oncontinue()
+  }
+
+  var onstreamend = function () {
+    self._stream = null
+    var drain = overflow(self._header.size)
+    if (drain) self._parse(drain, ondrain)
+    else self._parse(512, onheader)
+    if (!self._locked) oncontinue()
+  }
+
+  var ondrain = function () {
+    self._buffer.consume(overflow(self._header.size))
+    self._parse(512, onheader)
+    oncontinue()
+  }
+
+  var onpaxglobalheader = function () {
+    var size = self._header.size
+    self._paxGlobal = headers.decodePax(b.slice(0, size))
+    b.consume(size)
+    onstreamend()
+  }
+
+  var onpaxheader = function () {
+    var size = self._header.size
+    self._pax = headers.decodePax(b.slice(0, size))
+    if (self._paxGlobal) self._pax = Object.assign({}, self._paxGlobal, self._pax)
+    b.consume(size)
+    onstreamend()
+  }
+
+  var ongnulongpath = function () {
+    var size = self._header.size
+    this._gnuLongPath = headers.decodeLongPath(b.slice(0, size), opts.filenameEncoding)
+    b.consume(size)
+    onstreamend()
+  }
+
+  var ongnulonglinkpath = function () {
+    var size = self._header.size
+    this._gnuLongLinkPath = headers.decodeLongPath(b.slice(0, size), opts.filenameEncoding)
+    b.consume(size)
+    onstreamend()
+  }
+
+  var onheader = function () {
+    var offset = self._offset
+    var header
+    try {
+      header = self._header = headers.decode(b.slice(0, 512), opts.filenameEncoding, opts.allowUnknownFormat)
+    } catch (err) {
+      self.emit('error', err)
+    }
+    b.consume(512)
+
+    if (!header) {
+      self._parse(512, onheader)
+      oncontinue()
+      return
+    }
+    if (header.type === 'gnu-long-path') {
+      self._parse(header.size, ongnulongpath)
+      oncontinue()
+      return
+    }
+    if (header.type === 'gnu-long-link-path') {
+      self._parse(header.size, ongnulonglinkpath)
+      oncontinue()
+      return
+    }
+    if (header.type === 'pax-global-header') {
+      self._parse(header.size, onpaxglobalheader)
+      oncontinue()
+      return
+    }
+    if (header.type === 'pax-header') {
+      self._parse(header.size, onpaxheader)
+      oncontinue()
+      return
+    }
+
+    if (self._gnuLongPath) {
+      header.name = self._gnuLongPath
+      self._gnuLongPath = null
+    }
+
+    if (self._gnuLongLinkPath) {
+      header.linkname = self._gnuLongLinkPath
+      self._gnuLongLinkPath = null
+    }
+
+    if (self._pax) {
+      self._header = header = mixinPax(header, self._pax)
+      self._pax = null
+    }
+
+    self._locked = true
+
+    if (!header.size || header.type === 'directory') {
+      self._parse(512, onheader)
+      self.emit('entry', header, emptyStream(self, offset), onunlock)
+      return
+    }
+
+    self._stream = new Source(self, offset)
+
+    self.emit('entry', header, self._stream, onunlock)
+    self._parse(header.size, onstreamend)
+    oncontinue()
+  }
+
+  this._onheader = onheader
+  this._parse(512, onheader)
+}
+
+util.inherits(Extract, Writable)
+
+Extract.prototype.destroy = function (err) {
+  if (this._destroyed) return
+  this._destroyed = true
+
+  if (err) this.emit('error', err)
+  this.emit('close')
+  if (this._stream) this._stream.emit('close')
+}
+
+Extract.prototype._parse = function (size, onparse) {
+  if (this._destroyed) return
+  this._offset += size
+  this._missing = size
+  if (onparse === this._onheader) this._partial = false
+  this._onparse = onparse
+}
+
+Extract.prototype._continue = function () {
+  if (this._destroyed) return
+  var cb = this._cb
+  this._cb = noop
+  if (this._overflow) this._write(this._overflow, undefined, cb)
+  else cb()
+}
+
+Extract.prototype._write = function (data, enc, cb) {
+  if (this._destroyed) return
+
+  var s = this._stream
+  var b = this._buffer
+  var missing = this._missing
+  if (data.length) this._partial = true
+
+  // we do not reach end-of-chunk now. just forward it
+
+  if (data.length < missing) {
+    this._missing -= data.length
+    this._overflow = null
+    if (s) return s.write(data, cb)
+    b.append(data)
+    return cb()
+  }
+
+  // end-of-chunk. the parser should call cb.
+
+  this._cb = cb
+  this._missing = 0
+
+  var overflow = null
+  if (data.length > missing) {
+    overflow = data.slice(missing)
+    data = data.slice(0, missing)
+  }
+
+  if (s) s.end(data)
+  else b.append(data)
+
+  this._overflow = overflow
+  this._onparse()
+}
+
+Extract.prototype._final = function (cb) {
+  if (this._partial) return this.destroy(new Error('Unexpected end of data'))
+  cb()
+}
+
+module.exports = Extract
diff --git a/node_modules/tar-stream/headers.js b/node_modules/tar-stream/headers.js
new file mode 100644
index 0000000..aba4ca4
--- /dev/null
+++ b/node_modules/tar-stream/headers.js
@@ -0,0 +1,295 @@
+var alloc = Buffer.alloc
+
+var ZEROS = '0000000000000000000'
+var SEVENS = '7777777777777777777'
+var ZERO_OFFSET = '0'.charCodeAt(0)
+var USTAR_MAGIC = Buffer.from('ustar\x00', 'binary')
+var USTAR_VER = Buffer.from('00', 'binary')
+var GNU_MAGIC = Buffer.from('ustar\x20', 'binary')
+var GNU_VER = Buffer.from('\x20\x00', 'binary')
+var MASK = parseInt('7777', 8)
+var MAGIC_OFFSET = 257
+var VERSION_OFFSET = 263
+
+var clamp = function (index, len, defaultValue) {
+  if (typeof index !== 'number') return defaultValue
+  index = ~~index // Coerce to integer.
+  if (index >= len) return len
+  if (index >= 0) return index
+  index += len
+  if (index >= 0) return index
+  return 0
+}
+
+var toType = function (flag) {
+  switch (flag) {
+    case 0:
+      return 'file'
+    case 1:
+      return 'link'
+    case 2:
+      return 'symlink'
+    case 3:
+      return 'character-device'
+    case 4:
+      return 'block-device'
+    case 5:
+      return 'directory'
+    case 6:
+      return 'fifo'
+    case 7:
+      return 'contiguous-file'
+    case 72:
+      return 'pax-header'
+    case 55:
+      return 'pax-global-header'
+    case 27:
+      return 'gnu-long-link-path'
+    case 28:
+    case 30:
+      return 'gnu-long-path'
+  }
+
+  return null
+}
+
+var toTypeflag = function (flag) {
+  switch (flag) {
+    case 'file':
+      return 0
+    case 'link':
+      return 1
+    case 'symlink':
+      return 2
+    case 'character-device':
+      return 3
+    case 'block-device':
+      return 4
+    case 'directory':
+      return 5
+    case 'fifo':
+      return 6
+    case 'contiguous-file':
+      return 7
+    case 'pax-header':
+      return 72
+  }
+
+  return 0
+}
+
+var indexOf = function (block, num, offset, end) {
+  for (; offset < end; offset++) {
+    if (block[offset] === num) return offset
+  }
+  return end
+}
+
+var cksum = function (block) {
+  var sum = 8 * 32
+  for (var i = 0; i < 148; i++) sum += block[i]
+  for (var j = 156; j < 512; j++) sum += block[j]
+  return sum
+}
+
+var encodeOct = function (val, n) {
+  val = val.toString(8)
+  if (val.length > n) return SEVENS.slice(0, n) + ' '
+  else return ZEROS.slice(0, n - val.length) + val + ' '
+}
+
+/* Copied from the node-tar repo and modified to meet
+ * tar-stream coding standard.
+ *
+ * Source: https://github.com/npm/node-tar/blob/51b6627a1f357d2eb433e7378e5f05e83b7aa6cd/lib/header.js#L349
+ */
+function parse256 (buf) {
+  // first byte MUST be either 80 or FF
+  // 80 for positive, FF for 2's comp
+  var positive
+  if (buf[0] === 0x80) positive = true
+  else if (buf[0] === 0xFF) positive = false
+  else return null
+
+  // build up a base-256 tuple from the least sig to the highest
+  var tuple = []
+  for (var i = buf.length - 1; i > 0; i--) {
+    var byte = buf[i]
+    if (positive) tuple.push(byte)
+    else tuple.push(0xFF - byte)
+  }
+
+  var sum = 0
+  var l = tuple.length
+  for (i = 0; i < l; i++) {
+    sum += tuple[i] * Math.pow(256, i)
+  }
+
+  return positive ? sum : -1 * sum
+}
+
+var decodeOct = function (val, offset, length) {
+  val = val.slice(offset, offset + length)
+  offset = 0
+
+  // If prefixed with 0x80 then parse as a base-256 integer
+  if (val[offset] & 0x80) {
+    return parse256(val)
+  } else {
+    // Older versions of tar can prefix with spaces
+    while (offset < val.length && val[offset] === 32) offset++
+    var end = clamp(indexOf(val, 32, offset, val.length), val.length, val.length)
+    while (offset < end && val[offset] === 0) offset++
+    if (end === offset) return 0
+    return parseInt(val.slice(offset, end).toString(), 8)
+  }
+}
+
+var decodeStr = function (val, offset, length, encoding) {
+  return val.slice(offset, indexOf(val, 0, offset, offset + length)).toString(encoding)
+}
+
+var addLength = function (str) {
+  var len = Buffer.byteLength(str)
+  var digits = Math.floor(Math.log(len) / Math.log(10)) + 1
+  if (len + digits >= Math.pow(10, digits)) digits++
+
+  return (len + digits) + str
+}
+
+exports.decodeLongPath = function (buf, encoding) {
+  return decodeStr(buf, 0, buf.length, encoding)
+}
+
+exports.encodePax = function (opts) { // TODO: encode more stuff in pax
+  var result = ''
+  if (opts.name) result += addLength(' path=' + opts.name + '\n')
+  if (opts.linkname) result += addLength(' linkpath=' + opts.linkname + '\n')
+  var pax = opts.pax
+  if (pax) {
+    for (var key in pax) {
+      result += addLength(' ' + key + '=' + pax[key] + '\n')
+    }
+  }
+  return Buffer.from(result)
+}
+
+exports.decodePax = function (buf) {
+  var result = {}
+
+  while (buf.length) {
+    var i = 0
+    while (i < buf.length && buf[i] !== 32) i++
+    var len = parseInt(buf.slice(0, i).toString(), 10)
+    if (!len) return result
+
+    var b = buf.slice(i + 1, len - 1).toString()
+    var keyIndex = b.indexOf('=')
+    if (keyIndex === -1) return result
+    result[b.slice(0, keyIndex)] = b.slice(keyIndex + 1)
+
+    buf = buf.slice(len)
+  }
+
+  return result
+}
+
+exports.encode = function (opts) {
+  var buf = alloc(512)
+  var name = opts.name
+  var prefix = ''
+
+  if (opts.typeflag === 5 && name[name.length - 1] !== '/') name += '/'
+  if (Buffer.byteLength(name) !== name.length) return null // utf-8
+
+  while (Buffer.byteLength(name) > 100) {
+    var i = name.indexOf('/')
+    if (i === -1) return null
+    prefix += prefix ? '/' + name.slice(0, i) : name.slice(0, i)
+    name = name.slice(i + 1)
+  }
+
+  if (Buffer.byteLength(name) > 100 || Buffer.byteLength(prefix) > 155) return null
+  if (opts.linkname && Buffer.byteLength(opts.linkname) > 100) return null
+
+  buf.write(name)
+  buf.write(encodeOct(opts.mode & MASK, 6), 100)
+  buf.write(encodeOct(opts.uid, 6), 108)
+  buf.write(encodeOct(opts.gid, 6), 116)
+  buf.write(encodeOct(opts.size, 11), 124)
+  buf.write(encodeOct((opts.mtime.getTime() / 1000) | 0, 11), 136)
+
+  buf[156] = ZERO_OFFSET + toTypeflag(opts.type)
+
+  if (opts.linkname) buf.write(opts.linkname, 157)
+
+  USTAR_MAGIC.copy(buf, MAGIC_OFFSET)
+  USTAR_VER.copy(buf, VERSION_OFFSET)
+  if (opts.uname) buf.write(opts.uname, 265)
+  if (opts.gname) buf.write(opts.gname, 297)
+  buf.write(encodeOct(opts.devmajor || 0, 6), 329)
+  buf.write(encodeOct(opts.devminor || 0, 6), 337)
+
+  if (prefix) buf.write(prefix, 345)
+
+  buf.write(encodeOct(cksum(buf), 6), 148)
+
+  return buf
+}
+
+exports.decode = function (buf, filenameEncoding, allowUnknownFormat) {
+  var typeflag = buf[156] === 0 ? 0 : buf[156] - ZERO_OFFSET
+
+  var name = decodeStr(buf, 0, 100, filenameEncoding)
+  var mode = decodeOct(buf, 100, 8)
+  var uid = decodeOct(buf, 108, 8)
+  var gid = decodeOct(buf, 116, 8)
+  var size = decodeOct(buf, 124, 12)
+  var mtime = decodeOct(buf, 136, 12)
+  var type = toType(typeflag)
+  var linkname = buf[157] === 0 ? null : decodeStr(buf, 157, 100, filenameEncoding)
+  var uname = decodeStr(buf, 265, 32)
+  var gname = decodeStr(buf, 297, 32)
+  var devmajor = decodeOct(buf, 329, 8)
+  var devminor = decodeOct(buf, 337, 8)
+
+  var c = cksum(buf)
+
+  // checksum is still initial value if header was null.
+  if (c === 8 * 32) return null
+
+  // valid checksum
+  if (c !== decodeOct(buf, 148, 8)) throw new Error('Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?')
+
+  if (USTAR_MAGIC.compare(buf, MAGIC_OFFSET, MAGIC_OFFSET + 6) === 0) {
+    // ustar (posix) format.
+    // prepend prefix, if present.
+    if (buf[345]) name = decodeStr(buf, 345, 155, filenameEncoding) + '/' + name
+  } else if (GNU_MAGIC.compare(buf, MAGIC_OFFSET, MAGIC_OFFSET + 6) === 0 &&
+             GNU_VER.compare(buf, VERSION_OFFSET, VERSION_OFFSET + 2) === 0) {
+    // 'gnu'/'oldgnu' format. Similar to ustar, but has support for incremental and
+    // multi-volume tarballs.
+  } else {
+    if (!allowUnknownFormat) {
+      throw new Error('Invalid tar header: unknown format.')
+    }
+  }
+
+  // to support old tar versions that use trailing / to indicate dirs
+  if (typeflag === 0 && name && name[name.length - 1] === '/') typeflag = 5
+
+  return {
+    name,
+    mode,
+    uid,
+    gid,
+    size,
+    mtime: new Date(1000 * mtime),
+    type,
+    linkname,
+    uname,
+    gname,
+    devmajor,
+    devminor
+  }
+}
diff --git a/node_modules/tar-stream/index.js b/node_modules/tar-stream/index.js
new file mode 100644
index 0000000..6481704
--- /dev/null
+++ b/node_modules/tar-stream/index.js
@@ -0,0 +1,2 @@
+exports.extract = require('./extract')
+exports.pack = require('./pack')
diff --git a/node_modules/tar-stream/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/tar-stream/node_modules/readable-stream/CONTRIBUTING.md
new file mode 100644
index 0000000..f478d58
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/CONTRIBUTING.md
@@ -0,0 +1,38 @@
+# Developer's Certificate of Origin 1.1
+
+By making a contribution to this project, I certify that:
+
+* (a) The contribution was created in whole or in part by me and I
+  have the right to submit it under the open source license
+  indicated in the file; or
+
+* (b) The contribution is based upon previous work that, to the best
+  of my knowledge, is covered under an appropriate open source
+  license and I have the right under that license to submit that
+  work with modifications, whether created in whole or in part
+  by me, under the same open source license (unless I am
+  permitted to submit under a different license), as indicated
+  in the file; or
+
+* (c) The contribution was provided directly to me by some other
+  person who certified (a), (b) or (c) and I have not modified
+  it.
+
+* (d) I understand and agree that this project and the contribution
+  are public and that a record of the contribution (including all
+  personal information I submit with it, including my sign-off) is
+  maintained indefinitely and may be redistributed consistent with
+  this project or the open source license(s) involved.
+
+## Moderation Policy
+
+The [Node.js Moderation Policy] applies to this WG.
+
+## Code of Conduct
+
+The [Node.js Code of Conduct][] applies to this WG.
+
+[Node.js Code of Conduct]:
+https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md
+[Node.js Moderation Policy]:
+https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md
diff --git a/node_modules/tar-stream/node_modules/readable-stream/GOVERNANCE.md b/node_modules/tar-stream/node_modules/readable-stream/GOVERNANCE.md
new file mode 100644
index 0000000..16ffb93
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/GOVERNANCE.md
@@ -0,0 +1,136 @@
+### Streams Working Group
+
+The Node.js Streams is jointly governed by a Working Group
+(WG)
+that is responsible for high-level guidance of the project.
+
+The WG has final authority over this project including:
+
+* Technical direction
+* Project governance and process (including this policy)
+* Contribution policy
+* GitHub repository hosting
+* Conduct guidelines
+* Maintaining the list of additional Collaborators
+
+For the current list of WG members, see the project
+[README.md](./README.md#current-project-team-members).
+
+### Collaborators
+
+The readable-stream GitHub repository is
+maintained by the WG and additional Collaborators who are added by the
+WG on an ongoing basis.
+
+Individuals making significant and valuable contributions are made
+Collaborators and given commit-access to the project. These
+individuals are identified by the WG and their addition as
+Collaborators is discussed during the WG meeting.
+
+_Note:_ If you make a significant contribution and are not considered
+for commit-access log an issue or contact a WG member directly and it
+will be brought up in the next WG meeting.
+
+Modifications of the contents of the readable-stream repository are
+made on
+a collaborative basis. Anybody with a GitHub account may propose a
+modification via pull request and it will be considered by the project
+Collaborators. All pull requests must be reviewed and accepted by a
+Collaborator with sufficient expertise who is able to take full
+responsibility for the change. In the case of pull requests proposed
+by an existing Collaborator, an additional Collaborator is required
+for sign-off. Consensus should be sought if additional Collaborators
+participate and there is disagreement around a particular
+modification. See _Consensus Seeking Process_ below for further detail
+on the consensus model used for governance.
+
+Collaborators may opt to elevate significant or controversial
+modifications, or modifications that have not found consensus to the
+WG for discussion by assigning the ***WG-agenda*** tag to a pull
+request or issue. The WG should serve as the final arbiter where
+required.
+
+For the current list of Collaborators, see the project
+[README.md](./README.md#members).
+
+### WG Membership
+
+WG seats are not time-limited.  There is no fixed size of the WG.
+However, the expected target is between 6 and 12, to ensure adequate
+coverage of important areas of expertise, balanced with the ability to
+make decisions efficiently.
+
+There is no specific set of requirements or qualifications for WG
+membership beyond these rules.
+
+The WG may add additional members to the WG by unanimous consensus.
+
+A WG member may be removed from the WG by voluntary resignation, or by
+unanimous consensus of all other WG members.
+
+Changes to WG membership should be posted in the agenda, and may be
+suggested as any other agenda item (see "WG Meetings" below).
+
+If an addition or removal is proposed during a meeting, and the full
+WG is not in attendance to participate, then the addition or removal
+is added to the agenda for the subsequent meeting.  This is to ensure
+that all members are given the opportunity to participate in all
+membership decisions.  If a WG member is unable to attend a meeting
+where a planned membership decision is being made, then their consent
+is assumed.
+
+No more than 1/3 of the WG members may be affiliated with the same
+employer.  If removal or resignation of a WG member, or a change of
+employment by a WG member, creates a situation where more than 1/3 of
+the WG membership shares an employer, then the situation must be
+immediately remedied by the resignation or removal of one or more WG
+members affiliated with the over-represented employer(s).
+
+### WG Meetings
+
+The WG meets occasionally on a Google Hangout On Air. A designated moderator
+approved by the WG runs the meeting. Each meeting should be
+published to YouTube.
+
+Items are added to the WG agenda that are considered contentious or
+are modifications of governance, contribution policy, WG membership,
+or release process.
+
+The intention of the agenda is not to approve or review all patches;
+that should happen continuously on GitHub and be handled by the larger
+group of Collaborators.
+
+Any community member or contributor can ask that something be added to
+the next meeting's agenda by logging a GitHub Issue. Any Collaborator,
+WG member or the moderator can add the item to the agenda by adding
+the ***WG-agenda*** tag to the issue.
+
+Prior to each WG meeting the moderator will share the Agenda with
+members of the WG. WG members can add any items they like to the
+agenda at the beginning of each meeting. The moderator and the WG
+cannot veto or remove items.
+
+The WG may invite persons or representatives from certain projects to
+participate in a non-voting capacity.
+
+The moderator is responsible for summarizing the discussion of each
+agenda item and sends it as a pull request after the meeting.
+
+### Consensus Seeking Process
+
+The WG follows a
+[Consensus
+Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making)
+decision-making model.
+
+When an agenda item has appeared to reach a consensus the moderator
+will ask "Does anyone object?" as a final call for dissent from the
+consensus.
+
+If an agenda item cannot reach a consensus a WG member can call for
+either a closing vote or a vote to table the issue to the next
+meeting. The call for a vote must be seconded by a majority of the WG
+or else the discussion will continue. Simple majority wins.
+
+Note that changes to WG membership require a majority consensus.  See
+"WG Membership" above.
diff --git a/node_modules/tar-stream/node_modules/readable-stream/LICENSE b/node_modules/tar-stream/node_modules/readable-stream/LICENSE
new file mode 100644
index 0000000..2873b3b
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/LICENSE
@@ -0,0 +1,47 @@
+Node.js is licensed for use as follows:
+
+"""
+Copyright Node.js contributors. All rights reserved.
+
+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.
+"""
+
+This license applies to parts of Node.js originating from the
+https://github.com/joyent/node repository:
+
+"""
+Copyright Joyent, Inc. and other Node contributors. All rights reserved.
+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/tar-stream/node_modules/readable-stream/README.md b/node_modules/tar-stream/node_modules/readable-stream/README.md
new file mode 100644
index 0000000..6f035ab
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/README.md
@@ -0,0 +1,106 @@
+# readable-stream
+
+***Node.js core streams for userland*** [![Build Status](https://travis-ci.com/nodejs/readable-stream.svg?branch=master)](https://travis-ci.com/nodejs/readable-stream)
+
+
+[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/)
+[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/)
+
+
+[![Sauce Test Status](https://saucelabs.com/browser-matrix/readabe-stream.svg)](https://saucelabs.com/u/readabe-stream)
+
+```bash
+npm install --save readable-stream
+```
+
+This package is a mirror of the streams implementations in Node.js.
+
+Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v10.19.0/docs/api/stream.html).
+
+If you want to guarantee a stable streams base, regardless of what version of
+Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).
+
+As of version 2.0.0 **readable-stream** uses semantic versioning.
+
+## Version 3.x.x
+
+v3.x.x of `readable-stream` is a cut from Node 10. This version supports Node 6, 8, and 10, as well as evergreen browsers, IE 11 and latest Safari. The breaking changes introduced by v3 are composed by the combined breaking changes in [Node v9](https://nodejs.org/en/blog/release/v9.0.0/) and [Node v10](https://nodejs.org/en/blog/release/v10.0.0/), as follows:
+
+1. Error codes: https://github.com/nodejs/node/pull/13310,
+   https://github.com/nodejs/node/pull/13291,
+   https://github.com/nodejs/node/pull/16589,
+   https://github.com/nodejs/node/pull/15042,
+   https://github.com/nodejs/node/pull/15665,
+   https://github.com/nodejs/readable-stream/pull/344
+2. 'readable' have precedence over flowing
+   https://github.com/nodejs/node/pull/18994
+3. make virtual methods errors consistent
+   https://github.com/nodejs/node/pull/18813
+4. updated streams error handling
+   https://github.com/nodejs/node/pull/18438
+5. writable.end should return this.
+   https://github.com/nodejs/node/pull/18780
+6. readable continues to read when push('')
+   https://github.com/nodejs/node/pull/18211
+7. add custom inspect to BufferList
+   https://github.com/nodejs/node/pull/17907
+8. always defer 'readable' with nextTick
+   https://github.com/nodejs/node/pull/17979
+
+## Version 2.x.x
+v2.x.x of `readable-stream` is a cut of the stream module from Node 8 (there have been no semver-major changes from Node 4 to 8). This version supports all Node.js versions from 0.8, as well as evergreen browsers and IE 10 & 11.
+
+### Big Thanks
+
+Cross-browser Testing Platform and Open Source <3 Provided by [Sauce Labs][sauce]
+
+# Usage
+
+You can swap your `require('stream')` with `require('readable-stream')`
+without any changes, if you are just using one of the main classes and
+functions.
+
+```js
+const {
+  Readable,
+  Writable,
+  Transform,
+  Duplex,
+  pipeline,
+  finished
+} = require('readable-stream')
+````
+
+Note that `require('stream')` will return `Stream`, while
+`require('readable-stream')` will return `Readable`. We discourage using
+whatever is exported directly, but rather use one of the properties as
+shown in the example above.
+
+# Streams Working Group
+
+`readable-stream` is maintained by the Streams Working Group, which
+oversees the development and maintenance of the Streams API within
+Node.js. The responsibilities of the Streams Working Group include:
+
+* Addressing stream issues on the Node.js issue tracker.
+* Authoring and editing stream documentation within the Node.js project.
+* Reviewing changes to stream subclasses within the Node.js project.
+* Redirecting changes to streams from the Node.js project to this
+  project.
+* Assisting in the implementation of stream providers within Node.js.
+* Recommending versions of `readable-stream` to be included in Node.js.
+* Messaging about the future of streams to give the community advance
+  notice of changes.
+
+<a name="members"></a>
+## Team Members
+
+* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) &lt;calvin.metcalf@gmail.com&gt;
+  - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242
+* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) &lt;mathiasbuus@gmail.com&gt;
+* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) &lt;matteo.collina@gmail.com&gt;
+  - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E
+* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) &lt;shestak.irina@gmail.com&gt;
+* **Yoshua Wyuts** ([@yoshuawuyts](https://github.com/yoshuawuyts)) &lt;yoshuawuyts@gmail.com&gt;
+
+[sauce]: https://saucelabs.com
diff --git a/node_modules/tar-stream/node_modules/readable-stream/errors-browser.js b/node_modules/tar-stream/node_modules/readable-stream/errors-browser.js
new file mode 100644
index 0000000..fb8e73e
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/errors-browser.js
@@ -0,0 +1,127 @@
+'use strict';
+
+function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
+
+var codes = {};
+
+function createErrorType(code, message, Base) {
+  if (!Base) {
+    Base = Error;
+  }
+
+  function getMessage(arg1, arg2, arg3) {
+    if (typeof message === 'string') {
+      return message;
+    } else {
+      return message(arg1, arg2, arg3);
+    }
+  }
+
+  var NodeError =
+  /*#__PURE__*/
+  function (_Base) {
+    _inheritsLoose(NodeError, _Base);
+
+    function NodeError(arg1, arg2, arg3) {
+      return _Base.call(this, getMessage(arg1, arg2, arg3)) || this;
+    }
+
+    return NodeError;
+  }(Base);
+
+  NodeError.prototype.name = Base.name;
+  NodeError.prototype.code = code;
+  codes[code] = NodeError;
+} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js
+
+
+function oneOf(expected, thing) {
+  if (Array.isArray(expected)) {
+    var len = expected.length;
+    expected = expected.map(function (i) {
+      return String(i);
+    });
+
+    if (len > 2) {
+      return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1];
+    } else if (len === 2) {
+      return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]);
+    } else {
+      return "of ".concat(thing, " ").concat(expected[0]);
+    }
+  } else {
+    return "of ".concat(thing, " ").concat(String(expected));
+  }
+} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
+
+
+function startsWith(str, search, pos) {
+  return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
+} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
+
+
+function endsWith(str, search, this_len) {
+  if (this_len === undefined || this_len > str.length) {
+    this_len = str.length;
+  }
+
+  return str.substring(this_len - search.length, this_len) === search;
+} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
+
+
+function includes(str, search, start) {
+  if (typeof start !== 'number') {
+    start = 0;
+  }
+
+  if (start + search.length > str.length) {
+    return false;
+  } else {
+    return str.indexOf(search, start) !== -1;
+  }
+}
+
+createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {
+  return 'The value "' + value + '" is invalid for option "' + name + '"';
+}, TypeError);
+createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {
+  // determiner: 'must be' or 'must not be'
+  var determiner;
+
+  if (typeof expected === 'string' && startsWith(expected, 'not ')) {
+    determiner = 'must not be';
+    expected = expected.replace(/^not /, '');
+  } else {
+    determiner = 'must be';
+  }
+
+  var msg;
+
+  if (endsWith(name, ' argument')) {
+    // For cases like 'first argument'
+    msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
+  } else {
+    var type = includes(name, '.') ? 'property' : 'argument';
+    msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
+  }
+
+  msg += ". Received type ".concat(typeof actual);
+  return msg;
+}, TypeError);
+createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');
+createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {
+  return 'The ' + name + ' method is not implemented';
+});
+createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');
+createErrorType('ERR_STREAM_DESTROYED', function (name) {
+  return 'Cannot call ' + name + ' after a stream was destroyed';
+});
+createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');
+createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');
+createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');
+createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
+createErrorType('ERR_UNKNOWN_ENCODING', function (arg) {
+  return 'Unknown encoding: ' + arg;
+}, TypeError);
+createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');
+module.exports.codes = codes;
diff --git a/node_modules/tar-stream/node_modules/readable-stream/errors.js b/node_modules/tar-stream/node_modules/readable-stream/errors.js
new file mode 100644
index 0000000..8471526
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/errors.js
@@ -0,0 +1,116 @@
+'use strict';
+
+const codes = {};
+
+function createErrorType(code, message, Base) {
+  if (!Base) {
+    Base = Error
+  }
+
+  function getMessage (arg1, arg2, arg3) {
+    if (typeof message === 'string') {
+      return message
+    } else {
+      return message(arg1, arg2, arg3)
+    }
+  }
+
+  class NodeError extends Base {
+    constructor (arg1, arg2, arg3) {
+      super(getMessage(arg1, arg2, arg3));
+    }
+  }
+
+  NodeError.prototype.name = Base.name;
+  NodeError.prototype.code = code;
+
+  codes[code] = NodeError;
+}
+
+// https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js
+function oneOf(expected, thing) {
+  if (Array.isArray(expected)) {
+    const len = expected.length;
+    expected = expected.map((i) => String(i));
+    if (len > 2) {
+      return `one of ${thing} ${expected.slice(0, len - 1).join(', ')}, or ` +
+             expected[len - 1];
+    } else if (len === 2) {
+      return `one of ${thing} ${expected[0]} or ${expected[1]}`;
+    } else {
+      return `of ${thing} ${expected[0]}`;
+    }
+  } else {
+    return `of ${thing} ${String(expected)}`;
+  }
+}
+
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
+function startsWith(str, search, pos) {
+	return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
+}
+
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
+function endsWith(str, search, this_len) {
+	if (this_len === undefined || this_len > str.length) {
+		this_len = str.length;
+	}
+	return str.substring(this_len - search.length, this_len) === search;
+}
+
+// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
+function includes(str, search, start) {
+  if (typeof start !== 'number') {
+    start = 0;
+  }
+
+  if (start + search.length > str.length) {
+    return false;
+  } else {
+    return str.indexOf(search, start) !== -1;
+  }
+}
+
+createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {
+  return 'The value "' + value + '" is invalid for option "' + name + '"'
+}, TypeError);
+createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {
+  // determiner: 'must be' or 'must not be'
+  let determiner;
+  if (typeof expected === 'string' && startsWith(expected, 'not ')) {
+    determiner = 'must not be';
+    expected = expected.replace(/^not /, '');
+  } else {
+    determiner = 'must be';
+  }
+
+  let msg;
+  if (endsWith(name, ' argument')) {
+    // For cases like 'first argument'
+    msg = `The ${name} ${determiner} ${oneOf(expected, 'type')}`;
+  } else {
+    const type = includes(name, '.') ? 'property' : 'argument';
+    msg = `The "${name}" ${type} ${determiner} ${oneOf(expected, 'type')}`;
+  }
+
+  msg += `. Received type ${typeof actual}`;
+  return msg;
+}, TypeError);
+createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');
+createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {
+  return 'The ' + name + ' method is not implemented'
+});
+createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');
+createErrorType('ERR_STREAM_DESTROYED', function (name) {
+  return 'Cannot call ' + name + ' after a stream was destroyed';
+});
+createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');
+createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');
+createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');
+createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
+createErrorType('ERR_UNKNOWN_ENCODING', function (arg) {
+  return 'Unknown encoding: ' + arg
+}, TypeError);
+createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');
+
+module.exports.codes = codes;
diff --git a/node_modules/tar-stream/node_modules/readable-stream/experimentalWarning.js b/node_modules/tar-stream/node_modules/readable-stream/experimentalWarning.js
new file mode 100644
index 0000000..78e8414
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/experimentalWarning.js
@@ -0,0 +1,17 @@
+'use strict'
+
+var experimentalWarnings = new Set();
+
+function emitExperimentalWarning(feature) {
+  if (experimentalWarnings.has(feature)) return;
+  var msg = feature + ' is an experimental feature. This feature could ' +
+       'change at any time';
+  experimentalWarnings.add(feature);
+  process.emitWarning(msg, 'ExperimentalWarning');
+}
+
+function noop() {}
+
+module.exports.emitExperimentalWarning = process.emitWarning
+  ? emitExperimentalWarning
+  : noop;
diff --git a/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_duplex.js
new file mode 100644
index 0000000..6752519
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_duplex.js
@@ -0,0 +1,139 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+// a duplex stream is just a stream that is both readable and writable.
+// Since JS doesn't have multiple prototypal inheritance, this class
+// prototypally inherits from Readable, and then parasitically from
+// Writable.
+'use strict';
+/*<replacement>*/
+
+var objectKeys = Object.keys || function (obj) {
+  var keys = [];
+
+  for (var key in obj) {
+    keys.push(key);
+  }
+
+  return keys;
+};
+/*</replacement>*/
+
+
+module.exports = Duplex;
+
+var Readable = require('./_stream_readable');
+
+var Writable = require('./_stream_writable');
+
+require('inherits')(Duplex, Readable);
+
+{
+  // Allow the keys array to be GC'ed.
+  var keys = objectKeys(Writable.prototype);
+
+  for (var v = 0; v < keys.length; v++) {
+    var method = keys[v];
+    if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
+  }
+}
+
+function Duplex(options) {
+  if (!(this instanceof Duplex)) return new Duplex(options);
+  Readable.call(this, options);
+  Writable.call(this, options);
+  this.allowHalfOpen = true;
+
+  if (options) {
+    if (options.readable === false) this.readable = false;
+    if (options.writable === false) this.writable = false;
+
+    if (options.allowHalfOpen === false) {
+      this.allowHalfOpen = false;
+      this.once('end', onend);
+    }
+  }
+}
+
+Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._writableState.highWaterMark;
+  }
+});
+Object.defineProperty(Duplex.prototype, 'writableBuffer', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._writableState && this._writableState.getBuffer();
+  }
+});
+Object.defineProperty(Duplex.prototype, 'writableLength', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._writableState.length;
+  }
+}); // the no-half-open enforcer
+
+function onend() {
+  // If the writable side ended, then we're ok.
+  if (this._writableState.ended) return; // no more data can be written.
+  // But allow more writes to happen in this tick.
+
+  process.nextTick(onEndNT, this);
+}
+
+function onEndNT(self) {
+  self.end();
+}
+
+Object.defineProperty(Duplex.prototype, 'destroyed', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    if (this._readableState === undefined || this._writableState === undefined) {
+      return false;
+    }
+
+    return this._readableState.destroyed && this._writableState.destroyed;
+  },
+  set: function set(value) {
+    // we ignore the value if the stream
+    // has not been initialized yet
+    if (this._readableState === undefined || this._writableState === undefined) {
+      return;
+    } // backward compatibility, the user is explicitly
+    // managing destroyed
+
+
+    this._readableState.destroyed = value;
+    this._writableState.destroyed = value;
+  }
+});
\ No newline at end of file
diff --git a/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_passthrough.js
new file mode 100644
index 0000000..32e7414
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_passthrough.js
@@ -0,0 +1,39 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+// a passthrough stream.
+// basically just the most minimal sort of Transform stream.
+// Every written chunk gets output as-is.
+'use strict';
+
+module.exports = PassThrough;
+
+var Transform = require('./_stream_transform');
+
+require('inherits')(PassThrough, Transform);
+
+function PassThrough(options) {
+  if (!(this instanceof PassThrough)) return new PassThrough(options);
+  Transform.call(this, options);
+}
+
+PassThrough.prototype._transform = function (chunk, encoding, cb) {
+  cb(null, chunk);
+};
\ No newline at end of file
diff --git a/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_readable.js
new file mode 100644
index 0000000..192d451
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_readable.js
@@ -0,0 +1,1124 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+'use strict';
+
+module.exports = Readable;
+/*<replacement>*/
+
+var Duplex;
+/*</replacement>*/
+
+Readable.ReadableState = ReadableState;
+/*<replacement>*/
+
+var EE = require('events').EventEmitter;
+
+var EElistenerCount = function EElistenerCount(emitter, type) {
+  return emitter.listeners(type).length;
+};
+/*</replacement>*/
+
+/*<replacement>*/
+
+
+var Stream = require('./internal/streams/stream');
+/*</replacement>*/
+
+
+var Buffer = require('buffer').Buffer;
+
+var OurUint8Array = global.Uint8Array || function () {};
+
+function _uint8ArrayToBuffer(chunk) {
+  return Buffer.from(chunk);
+}
+
+function _isUint8Array(obj) {
+  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
+/*<replacement>*/
+
+
+var debugUtil = require('util');
+
+var debug;
+
+if (debugUtil && debugUtil.debuglog) {
+  debug = debugUtil.debuglog('stream');
+} else {
+  debug = function debug() {};
+}
+/*</replacement>*/
+
+
+var BufferList = require('./internal/streams/buffer_list');
+
+var destroyImpl = require('./internal/streams/destroy');
+
+var _require = require('./internal/streams/state'),
+    getHighWaterMark = _require.getHighWaterMark;
+
+var _require$codes = require('../errors').codes,
+    ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
+    ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF,
+    ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
+    ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance.
+
+
+var StringDecoder;
+var createReadableStreamAsyncIterator;
+var from;
+
+require('inherits')(Readable, Stream);
+
+var errorOrDestroy = destroyImpl.errorOrDestroy;
+var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
+
+function prependListener(emitter, event, fn) {
+  // Sadly this is not cacheable as some libraries bundle their own
+  // event emitter implementation with them.
+  if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any
+  // userland ones.  NEVER DO THIS. This is here only because this code needs
+  // to continue to work with older versions of Node.js that do not include
+  // the prependListener() method. The goal is to eventually remove this hack.
+
+  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
+}
+
+function ReadableState(options, stream, isDuplex) {
+  Duplex = Duplex || require('./_stream_duplex');
+  options = options || {}; // Duplex streams are both readable and writable, but share
+  // the same options object.
+  // However, some cases require setting options to different
+  // values for the readable and the writable sides of the duplex stream.
+  // These options can be provided separately as readableXXX and writableXXX.
+
+  if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to
+  // make all the buffer merging and length checks go away
+
+  this.objectMode = !!options.objectMode;
+  if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer
+  // Note: 0 is a valid value, means "don't call _read preemptively ever"
+
+  this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the
+  // linked list can remove elements from the beginning faster than
+  // array.shift()
+
+  this.buffer = new BufferList();
+  this.length = 0;
+  this.pipes = null;
+  this.pipesCount = 0;
+  this.flowing = null;
+  this.ended = false;
+  this.endEmitted = false;
+  this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted
+  // immediately, or on a later tick.  We set this to true at first, because
+  // any actions that shouldn't happen until "later" should generally also
+  // not happen before the first read call.
+
+  this.sync = true; // whenever we return null, then we set a flag to say
+  // that we're awaiting a 'readable' event emission.
+
+  this.needReadable = false;
+  this.emittedReadable = false;
+  this.readableListening = false;
+  this.resumeScheduled = false;
+  this.paused = true; // Should close be emitted on destroy. Defaults to true.
+
+  this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish')
+
+  this.autoDestroy = !!options.autoDestroy; // has it been destroyed
+
+  this.destroyed = false; // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+
+  this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s
+
+  this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled
+
+  this.readingMore = false;
+  this.decoder = null;
+  this.encoding = null;
+
+  if (options.encoding) {
+    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+    this.decoder = new StringDecoder(options.encoding);
+    this.encoding = options.encoding;
+  }
+}
+
+function Readable(options) {
+  Duplex = Duplex || require('./_stream_duplex');
+  if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside
+  // the ReadableState constructor, at least with V8 6.5
+
+  var isDuplex = this instanceof Duplex;
+  this._readableState = new ReadableState(options, this, isDuplex); // legacy
+
+  this.readable = true;
+
+  if (options) {
+    if (typeof options.read === 'function') this._read = options.read;
+    if (typeof options.destroy === 'function') this._destroy = options.destroy;
+  }
+
+  Stream.call(this);
+}
+
+Object.defineProperty(Readable.prototype, 'destroyed', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    if (this._readableState === undefined) {
+      return false;
+    }
+
+    return this._readableState.destroyed;
+  },
+  set: function set(value) {
+    // we ignore the value if the stream
+    // has not been initialized yet
+    if (!this._readableState) {
+      return;
+    } // backward compatibility, the user is explicitly
+    // managing destroyed
+
+
+    this._readableState.destroyed = value;
+  }
+});
+Readable.prototype.destroy = destroyImpl.destroy;
+Readable.prototype._undestroy = destroyImpl.undestroy;
+
+Readable.prototype._destroy = function (err, cb) {
+  cb(err);
+}; // Manually shove something into the read() buffer.
+// This returns true if the highWaterMark has not been hit yet,
+// similar to how Writable.write() returns true if you should
+// write() some more.
+
+
+Readable.prototype.push = function (chunk, encoding) {
+  var state = this._readableState;
+  var skipChunkCheck;
+
+  if (!state.objectMode) {
+    if (typeof chunk === 'string') {
+      encoding = encoding || state.defaultEncoding;
+
+      if (encoding !== state.encoding) {
+        chunk = Buffer.from(chunk, encoding);
+        encoding = '';
+      }
+
+      skipChunkCheck = true;
+    }
+  } else {
+    skipChunkCheck = true;
+  }
+
+  return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
+}; // Unshift should *always* be something directly out of read()
+
+
+Readable.prototype.unshift = function (chunk) {
+  return readableAddChunk(this, chunk, null, true, false);
+};
+
+function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
+  debug('readableAddChunk', chunk);
+  var state = stream._readableState;
+
+  if (chunk === null) {
+    state.reading = false;
+    onEofChunk(stream, state);
+  } else {
+    var er;
+    if (!skipChunkCheck) er = chunkInvalid(state, chunk);
+
+    if (er) {
+      errorOrDestroy(stream, er);
+    } else if (state.objectMode || chunk && chunk.length > 0) {
+      if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
+        chunk = _uint8ArrayToBuffer(chunk);
+      }
+
+      if (addToFront) {
+        if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);
+      } else if (state.ended) {
+        errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
+      } else if (state.destroyed) {
+        return false;
+      } else {
+        state.reading = false;
+
+        if (state.decoder && !encoding) {
+          chunk = state.decoder.write(chunk);
+          if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
+        } else {
+          addChunk(stream, state, chunk, false);
+        }
+      }
+    } else if (!addToFront) {
+      state.reading = false;
+      maybeReadMore(stream, state);
+    }
+  } // We can push more data if we are below the highWaterMark.
+  // Also, if we have no data yet, we can stand some more bytes.
+  // This is to work around cases where hwm=0, such as the repl.
+
+
+  return !state.ended && (state.length < state.highWaterMark || state.length === 0);
+}
+
+function addChunk(stream, state, chunk, addToFront) {
+  if (state.flowing && state.length === 0 && !state.sync) {
+    state.awaitDrain = 0;
+    stream.emit('data', chunk);
+  } else {
+    // update the buffer info.
+    state.length += state.objectMode ? 1 : chunk.length;
+    if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
+    if (state.needReadable) emitReadable(stream);
+  }
+
+  maybeReadMore(stream, state);
+}
+
+function chunkInvalid(state, chunk) {
+  var er;
+
+  if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+    er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);
+  }
+
+  return er;
+}
+
+Readable.prototype.isPaused = function () {
+  return this._readableState.flowing === false;
+}; // backwards compatibility.
+
+
+Readable.prototype.setEncoding = function (enc) {
+  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+  var decoder = new StringDecoder(enc);
+  this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8
+
+  this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers:
+
+  var p = this._readableState.buffer.head;
+  var content = '';
+
+  while (p !== null) {
+    content += decoder.write(p.data);
+    p = p.next;
+  }
+
+  this._readableState.buffer.clear();
+
+  if (content !== '') this._readableState.buffer.push(content);
+  this._readableState.length = content.length;
+  return this;
+}; // Don't raise the hwm > 1GB
+
+
+var MAX_HWM = 0x40000000;
+
+function computeNewHighWaterMark(n) {
+  if (n >= MAX_HWM) {
+    // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE.
+    n = MAX_HWM;
+  } else {
+    // Get the next highest power of 2 to prevent increasing hwm excessively in
+    // tiny amounts
+    n--;
+    n |= n >>> 1;
+    n |= n >>> 2;
+    n |= n >>> 4;
+    n |= n >>> 8;
+    n |= n >>> 16;
+    n++;
+  }
+
+  return n;
+} // This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+
+
+function howMuchToRead(n, state) {
+  if (n <= 0 || state.length === 0 && state.ended) return 0;
+  if (state.objectMode) return 1;
+
+  if (n !== n) {
+    // Only flow one buffer at a time
+    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
+  } // If we're asking for more than the current hwm, then raise the hwm.
+
+
+  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
+  if (n <= state.length) return n; // Don't have enough
+
+  if (!state.ended) {
+    state.needReadable = true;
+    return 0;
+  }
+
+  return state.length;
+} // you can override either this method, or the async _read(n) below.
+
+
+Readable.prototype.read = function (n) {
+  debug('read', n);
+  n = parseInt(n, 10);
+  var state = this._readableState;
+  var nOrig = n;
+  if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we
+  // already have a bunch of data in the buffer, then just trigger
+  // the 'readable' event and move on.
+
+  if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) {
+    debug('read: emitReadable', state.length, state.ended);
+    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
+    return null;
+  }
+
+  n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up.
+
+  if (n === 0 && state.ended) {
+    if (state.length === 0) endReadable(this);
+    return null;
+  } // All the actual chunk generation logic needs to be
+  // *below* the call to _read.  The reason is that in certain
+  // synthetic stream cases, such as passthrough streams, _read
+  // may be a completely synchronous operation which may change
+  // the state of the read buffer, providing enough data when
+  // before there was *not* enough.
+  //
+  // So, the steps are:
+  // 1. Figure out what the state of things will be after we do
+  // a read from the buffer.
+  //
+  // 2. If that resulting state will trigger a _read, then call _read.
+  // Note that this may be asynchronous, or synchronous.  Yes, it is
+  // deeply ugly to write APIs this way, but that still doesn't mean
+  // that the Readable class should behave improperly, as streams are
+  // designed to be sync/async agnostic.
+  // Take note if the _read call is sync or async (ie, if the read call
+  // has returned yet), so that we know whether or not it's safe to emit
+  // 'readable' etc.
+  //
+  // 3. Actually pull the requested chunks out of the buffer and return.
+  // if we need a readable event, then we need to do some reading.
+
+
+  var doRead = state.needReadable;
+  debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some
+
+  if (state.length === 0 || state.length - n < state.highWaterMark) {
+    doRead = true;
+    debug('length less than watermark', doRead);
+  } // however, if we've ended, then there's no point, and if we're already
+  // reading, then it's unnecessary.
+
+
+  if (state.ended || state.reading) {
+    doRead = false;
+    debug('reading or ended', doRead);
+  } else if (doRead) {
+    debug('do read');
+    state.reading = true;
+    state.sync = true; // if the length is currently zero, then we *need* a readable event.
+
+    if (state.length === 0) state.needReadable = true; // call internal read method
+
+    this._read(state.highWaterMark);
+
+    state.sync = false; // If _read pushed data synchronously, then `reading` will be false,
+    // and we need to re-evaluate how much data we can return to the user.
+
+    if (!state.reading) n = howMuchToRead(nOrig, state);
+  }
+
+  var ret;
+  if (n > 0) ret = fromList(n, state);else ret = null;
+
+  if (ret === null) {
+    state.needReadable = state.length <= state.highWaterMark;
+    n = 0;
+  } else {
+    state.length -= n;
+    state.awaitDrain = 0;
+  }
+
+  if (state.length === 0) {
+    // If we have nothing in the buffer, then we want to know
+    // as soon as we *do* get something into the buffer.
+    if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick.
+
+    if (nOrig !== n && state.ended) endReadable(this);
+  }
+
+  if (ret !== null) this.emit('data', ret);
+  return ret;
+};
+
+function onEofChunk(stream, state) {
+  debug('onEofChunk');
+  if (state.ended) return;
+
+  if (state.decoder) {
+    var chunk = state.decoder.end();
+
+    if (chunk && chunk.length) {
+      state.buffer.push(chunk);
+      state.length += state.objectMode ? 1 : chunk.length;
+    }
+  }
+
+  state.ended = true;
+
+  if (state.sync) {
+    // if we are sync, wait until next tick to emit the data.
+    // Otherwise we risk emitting data in the flow()
+    // the readable code triggers during a read() call
+    emitReadable(stream);
+  } else {
+    // emit 'readable' now to make sure it gets picked up.
+    state.needReadable = false;
+
+    if (!state.emittedReadable) {
+      state.emittedReadable = true;
+      emitReadable_(stream);
+    }
+  }
+} // Don't emit readable right away in sync mode, because this can trigger
+// another read() call => stack overflow.  This way, it might trigger
+// a nextTick recursion warning, but that's not so bad.
+
+
+function emitReadable(stream) {
+  var state = stream._readableState;
+  debug('emitReadable', state.needReadable, state.emittedReadable);
+  state.needReadable = false;
+
+  if (!state.emittedReadable) {
+    debug('emitReadable', state.flowing);
+    state.emittedReadable = true;
+    process.nextTick(emitReadable_, stream);
+  }
+}
+
+function emitReadable_(stream) {
+  var state = stream._readableState;
+  debug('emitReadable_', state.destroyed, state.length, state.ended);
+
+  if (!state.destroyed && (state.length || state.ended)) {
+    stream.emit('readable');
+    state.emittedReadable = false;
+  } // The stream needs another readable event if
+  // 1. It is not flowing, as the flow mechanism will take
+  //    care of it.
+  // 2. It is not ended.
+  // 3. It is below the highWaterMark, so we can schedule
+  //    another readable later.
+
+
+  state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;
+  flow(stream);
+} // at this point, the user has presumably seen the 'readable' event,
+// and called read() to consume some data.  that may have triggered
+// in turn another _read(n) call, in which case reading = true if
+// it's in progress.
+// However, if we're not ended, or reading, and the length < hwm,
+// then go ahead and try to read some more preemptively.
+
+
+function maybeReadMore(stream, state) {
+  if (!state.readingMore) {
+    state.readingMore = true;
+    process.nextTick(maybeReadMore_, stream, state);
+  }
+}
+
+function maybeReadMore_(stream, state) {
+  // Attempt to read more data if we should.
+  //
+  // The conditions for reading more data are (one of):
+  // - Not enough data buffered (state.length < state.highWaterMark). The loop
+  //   is responsible for filling the buffer with enough data if such data
+  //   is available. If highWaterMark is 0 and we are not in the flowing mode
+  //   we should _not_ attempt to buffer any extra data. We'll get more data
+  //   when the stream consumer calls read() instead.
+  // - No data in the buffer, and the stream is in flowing mode. In this mode
+  //   the loop below is responsible for ensuring read() is called. Failing to
+  //   call read here would abort the flow and there's no other mechanism for
+  //   continuing the flow if the stream consumer has just subscribed to the
+  //   'data' event.
+  //
+  // In addition to the above conditions to keep reading data, the following
+  // conditions prevent the data from being read:
+  // - The stream has ended (state.ended).
+  // - There is already a pending 'read' operation (state.reading). This is a
+  //   case where the the stream has called the implementation defined _read()
+  //   method, but they are processing the call asynchronously and have _not_
+  //   called push() with new data. In this case we skip performing more
+  //   read()s. The execution ends in this method again after the _read() ends
+  //   up calling push() with more data.
+  while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) {
+    var len = state.length;
+    debug('maybeReadMore read 0');
+    stream.read(0);
+    if (len === state.length) // didn't get any data, stop spinning.
+      break;
+  }
+
+  state.readingMore = false;
+} // abstract method.  to be overridden in specific implementation classes.
+// call cb(er, data) where data is <= n in length.
+// for virtual (non-string, non-buffer) streams, "length" is somewhat
+// arbitrary, and perhaps not very meaningful.
+
+
+Readable.prototype._read = function (n) {
+  errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()'));
+};
+
+Readable.prototype.pipe = function (dest, pipeOpts) {
+  var src = this;
+  var state = this._readableState;
+
+  switch (state.pipesCount) {
+    case 0:
+      state.pipes = dest;
+      break;
+
+    case 1:
+      state.pipes = [state.pipes, dest];
+      break;
+
+    default:
+      state.pipes.push(dest);
+      break;
+  }
+
+  state.pipesCount += 1;
+  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
+  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
+  var endFn = doEnd ? onend : unpipe;
+  if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn);
+  dest.on('unpipe', onunpipe);
+
+  function onunpipe(readable, unpipeInfo) {
+    debug('onunpipe');
+
+    if (readable === src) {
+      if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
+        unpipeInfo.hasUnpiped = true;
+        cleanup();
+      }
+    }
+  }
+
+  function onend() {
+    debug('onend');
+    dest.end();
+  } // when the dest drains, it reduces the awaitDrain counter
+  // on the source.  This would be more elegant with a .once()
+  // handler in flow(), but adding and removing repeatedly is
+  // too slow.
+
+
+  var ondrain = pipeOnDrain(src);
+  dest.on('drain', ondrain);
+  var cleanedUp = false;
+
+  function cleanup() {
+    debug('cleanup'); // cleanup event handlers once the pipe is broken
+
+    dest.removeListener('close', onclose);
+    dest.removeListener('finish', onfinish);
+    dest.removeListener('drain', ondrain);
+    dest.removeListener('error', onerror);
+    dest.removeListener('unpipe', onunpipe);
+    src.removeListener('end', onend);
+    src.removeListener('end', unpipe);
+    src.removeListener('data', ondata);
+    cleanedUp = true; // if the reader is waiting for a drain event from this
+    // specific writer, then it would cause it to never start
+    // flowing again.
+    // So, if this is awaiting a drain, then we just call it now.
+    // If we don't know, then assume that we are waiting for one.
+
+    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
+  }
+
+  src.on('data', ondata);
+
+  function ondata(chunk) {
+    debug('ondata');
+    var ret = dest.write(chunk);
+    debug('dest.write', ret);
+
+    if (ret === false) {
+      // If the user unpiped during `dest.write()`, it is possible
+      // to get stuck in a permanently paused state if that write
+      // also returned false.
+      // => Check whether `dest` is still a piping destination.
+      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
+        debug('false write response, pause', state.awaitDrain);
+        state.awaitDrain++;
+      }
+
+      src.pause();
+    }
+  } // if the dest has an error, then stop piping into it.
+  // however, don't suppress the throwing behavior for this.
+
+
+  function onerror(er) {
+    debug('onerror', er);
+    unpipe();
+    dest.removeListener('error', onerror);
+    if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er);
+  } // Make sure our error handler is attached before userland ones.
+
+
+  prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once.
+
+  function onclose() {
+    dest.removeListener('finish', onfinish);
+    unpipe();
+  }
+
+  dest.once('close', onclose);
+
+  function onfinish() {
+    debug('onfinish');
+    dest.removeListener('close', onclose);
+    unpipe();
+  }
+
+  dest.once('finish', onfinish);
+
+  function unpipe() {
+    debug('unpipe');
+    src.unpipe(dest);
+  } // tell the dest that it's being piped to
+
+
+  dest.emit('pipe', src); // start the flow if it hasn't been started already.
+
+  if (!state.flowing) {
+    debug('pipe resume');
+    src.resume();
+  }
+
+  return dest;
+};
+
+function pipeOnDrain(src) {
+  return function pipeOnDrainFunctionResult() {
+    var state = src._readableState;
+    debug('pipeOnDrain', state.awaitDrain);
+    if (state.awaitDrain) state.awaitDrain--;
+
+    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
+      state.flowing = true;
+      flow(src);
+    }
+  };
+}
+
+Readable.prototype.unpipe = function (dest) {
+  var state = this._readableState;
+  var unpipeInfo = {
+    hasUnpiped: false
+  }; // if we're not piping anywhere, then do nothing.
+
+  if (state.pipesCount === 0) return this; // just one destination.  most common case.
+
+  if (state.pipesCount === 1) {
+    // passed in one, but it's not the right one.
+    if (dest && dest !== state.pipes) return this;
+    if (!dest) dest = state.pipes; // got a match.
+
+    state.pipes = null;
+    state.pipesCount = 0;
+    state.flowing = false;
+    if (dest) dest.emit('unpipe', this, unpipeInfo);
+    return this;
+  } // slow case. multiple pipe destinations.
+
+
+  if (!dest) {
+    // remove all.
+    var dests = state.pipes;
+    var len = state.pipesCount;
+    state.pipes = null;
+    state.pipesCount = 0;
+    state.flowing = false;
+
+    for (var i = 0; i < len; i++) {
+      dests[i].emit('unpipe', this, {
+        hasUnpiped: false
+      });
+    }
+
+    return this;
+  } // try to find the right one.
+
+
+  var index = indexOf(state.pipes, dest);
+  if (index === -1) return this;
+  state.pipes.splice(index, 1);
+  state.pipesCount -= 1;
+  if (state.pipesCount === 1) state.pipes = state.pipes[0];
+  dest.emit('unpipe', this, unpipeInfo);
+  return this;
+}; // set up data events if they are asked for
+// Ensure readable listeners eventually get something
+
+
+Readable.prototype.on = function (ev, fn) {
+  var res = Stream.prototype.on.call(this, ev, fn);
+  var state = this._readableState;
+
+  if (ev === 'data') {
+    // update readableListening so that resume() may be a no-op
+    // a few lines down. This is needed to support once('readable').
+    state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused
+
+    if (state.flowing !== false) this.resume();
+  } else if (ev === 'readable') {
+    if (!state.endEmitted && !state.readableListening) {
+      state.readableListening = state.needReadable = true;
+      state.flowing = false;
+      state.emittedReadable = false;
+      debug('on readable', state.length, state.reading);
+
+      if (state.length) {
+        emitReadable(this);
+      } else if (!state.reading) {
+        process.nextTick(nReadingNextTick, this);
+      }
+    }
+  }
+
+  return res;
+};
+
+Readable.prototype.addListener = Readable.prototype.on;
+
+Readable.prototype.removeListener = function (ev, fn) {
+  var res = Stream.prototype.removeListener.call(this, ev, fn);
+
+  if (ev === 'readable') {
+    // We need to check if there is someone still listening to
+    // readable and reset the state. However this needs to happen
+    // after readable has been emitted but before I/O (nextTick) to
+    // support once('readable', fn) cycles. This means that calling
+    // resume within the same tick will have no
+    // effect.
+    process.nextTick(updateReadableListening, this);
+  }
+
+  return res;
+};
+
+Readable.prototype.removeAllListeners = function (ev) {
+  var res = Stream.prototype.removeAllListeners.apply(this, arguments);
+
+  if (ev === 'readable' || ev === undefined) {
+    // We need to check if there is someone still listening to
+    // readable and reset the state. However this needs to happen
+    // after readable has been emitted but before I/O (nextTick) to
+    // support once('readable', fn) cycles. This means that calling
+    // resume within the same tick will have no
+    // effect.
+    process.nextTick(updateReadableListening, this);
+  }
+
+  return res;
+};
+
+function updateReadableListening(self) {
+  var state = self._readableState;
+  state.readableListening = self.listenerCount('readable') > 0;
+
+  if (state.resumeScheduled && !state.paused) {
+    // flowing needs to be set to true now, otherwise
+    // the upcoming resume will not flow.
+    state.flowing = true; // crude way to check if we should resume
+  } else if (self.listenerCount('data') > 0) {
+    self.resume();
+  }
+}
+
+function nReadingNextTick(self) {
+  debug('readable nexttick read 0');
+  self.read(0);
+} // pause() and resume() are remnants of the legacy readable stream API
+// If the user uses them, then switch into old mode.
+
+
+Readable.prototype.resume = function () {
+  var state = this._readableState;
+
+  if (!state.flowing) {
+    debug('resume'); // we flow only if there is no one listening
+    // for readable, but we still have to call
+    // resume()
+
+    state.flowing = !state.readableListening;
+    resume(this, state);
+  }
+
+  state.paused = false;
+  return this;
+};
+
+function resume(stream, state) {
+  if (!state.resumeScheduled) {
+    state.resumeScheduled = true;
+    process.nextTick(resume_, stream, state);
+  }
+}
+
+function resume_(stream, state) {
+  debug('resume', state.reading);
+
+  if (!state.reading) {
+    stream.read(0);
+  }
+
+  state.resumeScheduled = false;
+  stream.emit('resume');
+  flow(stream);
+  if (state.flowing && !state.reading) stream.read(0);
+}
+
+Readable.prototype.pause = function () {
+  debug('call pause flowing=%j', this._readableState.flowing);
+
+  if (this._readableState.flowing !== false) {
+    debug('pause');
+    this._readableState.flowing = false;
+    this.emit('pause');
+  }
+
+  this._readableState.paused = true;
+  return this;
+};
+
+function flow(stream) {
+  var state = stream._readableState;
+  debug('flow', state.flowing);
+
+  while (state.flowing && stream.read() !== null) {
+    ;
+  }
+} // wrap an old-style stream as the async data source.
+// This is *not* part of the readable stream interface.
+// It is an ugly unfortunate mess of history.
+
+
+Readable.prototype.wrap = function (stream) {
+  var _this = this;
+
+  var state = this._readableState;
+  var paused = false;
+  stream.on('end', function () {
+    debug('wrapped end');
+
+    if (state.decoder && !state.ended) {
+      var chunk = state.decoder.end();
+      if (chunk && chunk.length) _this.push(chunk);
+    }
+
+    _this.push(null);
+  });
+  stream.on('data', function (chunk) {
+    debug('wrapped data');
+    if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode
+
+    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
+
+    var ret = _this.push(chunk);
+
+    if (!ret) {
+      paused = true;
+      stream.pause();
+    }
+  }); // proxy all the other methods.
+  // important when wrapping filters and duplexes.
+
+  for (var i in stream) {
+    if (this[i] === undefined && typeof stream[i] === 'function') {
+      this[i] = function methodWrap(method) {
+        return function methodWrapReturnFunction() {
+          return stream[method].apply(stream, arguments);
+        };
+      }(i);
+    }
+  } // proxy certain important events.
+
+
+  for (var n = 0; n < kProxyEvents.length; n++) {
+    stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
+  } // when we try to consume some more bytes, simply unpause the
+  // underlying stream.
+
+
+  this._read = function (n) {
+    debug('wrapped _read', n);
+
+    if (paused) {
+      paused = false;
+      stream.resume();
+    }
+  };
+
+  return this;
+};
+
+if (typeof Symbol === 'function') {
+  Readable.prototype[Symbol.asyncIterator] = function () {
+    if (createReadableStreamAsyncIterator === undefined) {
+      createReadableStreamAsyncIterator = require('./internal/streams/async_iterator');
+    }
+
+    return createReadableStreamAsyncIterator(this);
+  };
+}
+
+Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._readableState.highWaterMark;
+  }
+});
+Object.defineProperty(Readable.prototype, 'readableBuffer', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._readableState && this._readableState.buffer;
+  }
+});
+Object.defineProperty(Readable.prototype, 'readableFlowing', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._readableState.flowing;
+  },
+  set: function set(state) {
+    if (this._readableState) {
+      this._readableState.flowing = state;
+    }
+  }
+}); // exposed for testing purposes only.
+
+Readable._fromList = fromList;
+Object.defineProperty(Readable.prototype, 'readableLength', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._readableState.length;
+  }
+}); // Pluck off n bytes from an array of buffers.
+// Length is the combined lengths of all the buffers in the list.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+
+function fromList(n, state) {
+  // nothing buffered
+  if (state.length === 0) return null;
+  var ret;
+  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
+    // read it all, truncate the list
+    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length);
+    state.buffer.clear();
+  } else {
+    // read part of list
+    ret = state.buffer.consume(n, state.decoder);
+  }
+  return ret;
+}
+
+function endReadable(stream) {
+  var state = stream._readableState;
+  debug('endReadable', state.endEmitted);
+
+  if (!state.endEmitted) {
+    state.ended = true;
+    process.nextTick(endReadableNT, state, stream);
+  }
+}
+
+function endReadableNT(state, stream) {
+  debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift.
+
+  if (!state.endEmitted && state.length === 0) {
+    state.endEmitted = true;
+    stream.readable = false;
+    stream.emit('end');
+
+    if (state.autoDestroy) {
+      // In case of duplex streams we need a way to detect
+      // if the writable side is ready for autoDestroy as well
+      var wState = stream._writableState;
+
+      if (!wState || wState.autoDestroy && wState.finished) {
+        stream.destroy();
+      }
+    }
+  }
+}
+
+if (typeof Symbol === 'function') {
+  Readable.from = function (iterable, opts) {
+    if (from === undefined) {
+      from = require('./internal/streams/from');
+    }
+
+    return from(Readable, iterable, opts);
+  };
+}
+
+function indexOf(xs, x) {
+  for (var i = 0, l = xs.length; i < l; i++) {
+    if (xs[i] === x) return i;
+  }
+
+  return -1;
+}
\ No newline at end of file
diff --git a/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_transform.js
new file mode 100644
index 0000000..41a738c
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_transform.js
@@ -0,0 +1,201 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+// a transform stream is a readable/writable stream where you do
+// something with the data.  Sometimes it's called a "filter",
+// but that's not a great name for it, since that implies a thing where
+// some bits pass through, and others are simply ignored.  (That would
+// be a valid example of a transform, of course.)
+//
+// While the output is causally related to the input, it's not a
+// necessarily symmetric or synchronous transformation.  For example,
+// a zlib stream might take multiple plain-text writes(), and then
+// emit a single compressed chunk some time in the future.
+//
+// Here's how this works:
+//
+// The Transform stream has all the aspects of the readable and writable
+// stream classes.  When you write(chunk), that calls _write(chunk,cb)
+// internally, and returns false if there's a lot of pending writes
+// buffered up.  When you call read(), that calls _read(n) until
+// there's enough pending readable data buffered up.
+//
+// In a transform stream, the written data is placed in a buffer.  When
+// _read(n) is called, it transforms the queued up data, calling the
+// buffered _write cb's as it consumes chunks.  If consuming a single
+// written chunk would result in multiple output chunks, then the first
+// outputted bit calls the readcb, and subsequent chunks just go into
+// the read buffer, and will cause it to emit 'readable' if necessary.
+//
+// This way, back-pressure is actually determined by the reading side,
+// since _read has to be called to start processing a new chunk.  However,
+// a pathological inflate type of transform can cause excessive buffering
+// here.  For example, imagine a stream where every byte of input is
+// interpreted as an integer from 0-255, and then results in that many
+// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
+// 1kb of data being output.  In this case, you could write a very small
+// amount of input, and end up with a very large amount of output.  In
+// such a pathological inflating mechanism, there'd be no way to tell
+// the system to stop doing the transform.  A single 4MB write could
+// cause the system to run out of memory.
+//
+// However, even in such a pathological case, only a single written chunk
+// would be consumed, and then the rest would wait (un-transformed) until
+// the results of the previous transformed chunk were consumed.
+'use strict';
+
+module.exports = Transform;
+
+var _require$codes = require('../errors').codes,
+    ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
+    ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
+    ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING,
+    ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0;
+
+var Duplex = require('./_stream_duplex');
+
+require('inherits')(Transform, Duplex);
+
+function afterTransform(er, data) {
+  var ts = this._transformState;
+  ts.transforming = false;
+  var cb = ts.writecb;
+
+  if (cb === null) {
+    return this.emit('error', new ERR_MULTIPLE_CALLBACK());
+  }
+
+  ts.writechunk = null;
+  ts.writecb = null;
+  if (data != null) // single equals check for both `null` and `undefined`
+    this.push(data);
+  cb(er);
+  var rs = this._readableState;
+  rs.reading = false;
+
+  if (rs.needReadable || rs.length < rs.highWaterMark) {
+    this._read(rs.highWaterMark);
+  }
+}
+
+function Transform(options) {
+  if (!(this instanceof Transform)) return new Transform(options);
+  Duplex.call(this, options);
+  this._transformState = {
+    afterTransform: afterTransform.bind(this),
+    needTransform: false,
+    transforming: false,
+    writecb: null,
+    writechunk: null,
+    writeencoding: null
+  }; // start out asking for a readable event once data is transformed.
+
+  this._readableState.needReadable = true; // we have implemented the _read method, and done the other things
+  // that Readable wants before the first _read call, so unset the
+  // sync guard flag.
+
+  this._readableState.sync = false;
+
+  if (options) {
+    if (typeof options.transform === 'function') this._transform = options.transform;
+    if (typeof options.flush === 'function') this._flush = options.flush;
+  } // When the writable side finishes, then flush out anything remaining.
+
+
+  this.on('prefinish', prefinish);
+}
+
+function prefinish() {
+  var _this = this;
+
+  if (typeof this._flush === 'function' && !this._readableState.destroyed) {
+    this._flush(function (er, data) {
+      done(_this, er, data);
+    });
+  } else {
+    done(this, null, null);
+  }
+}
+
+Transform.prototype.push = function (chunk, encoding) {
+  this._transformState.needTransform = false;
+  return Duplex.prototype.push.call(this, chunk, encoding);
+}; // This is the part where you do stuff!
+// override this function in implementation classes.
+// 'chunk' is an input chunk.
+//
+// Call `push(newChunk)` to pass along transformed output
+// to the readable side.  You may call 'push' zero or more times.
+//
+// Call `cb(err)` when you are done with this chunk.  If you pass
+// an error, then that'll put the hurt on the whole operation.  If you
+// never call cb(), then you'll never get another chunk.
+
+
+Transform.prototype._transform = function (chunk, encoding, cb) {
+  cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()'));
+};
+
+Transform.prototype._write = function (chunk, encoding, cb) {
+  var ts = this._transformState;
+  ts.writecb = cb;
+  ts.writechunk = chunk;
+  ts.writeencoding = encoding;
+
+  if (!ts.transforming) {
+    var rs = this._readableState;
+    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
+  }
+}; // Doesn't matter what the args are here.
+// _transform does all the work.
+// That we got here means that the readable side wants more data.
+
+
+Transform.prototype._read = function (n) {
+  var ts = this._transformState;
+
+  if (ts.writechunk !== null && !ts.transforming) {
+    ts.transforming = true;
+
+    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
+  } else {
+    // mark that we need a transform, so that any data that comes in
+    // will get processed, now that we've asked for it.
+    ts.needTransform = true;
+  }
+};
+
+Transform.prototype._destroy = function (err, cb) {
+  Duplex.prototype._destroy.call(this, err, function (err2) {
+    cb(err2);
+  });
+};
+
+function done(stream, er, data) {
+  if (er) return stream.emit('error', er);
+  if (data != null) // single equals check for both `null` and `undefined`
+    stream.push(data); // TODO(BridgeAR): Write a test for these two error cases
+  // if there's nothing in the write buffer, then that means
+  // that nothing more will ever be provided
+
+  if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0();
+  if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING();
+  return stream.push(null);
+}
\ No newline at end of file
diff --git a/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_writable.js
new file mode 100644
index 0000000..a2634d7
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/lib/_stream_writable.js
@@ -0,0 +1,697 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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.
+// A bit simpler than readable streams.
+// Implement an async ._write(chunk, encoding, cb), and it'll handle all
+// the drain event emission and buffering.
+'use strict';
+
+module.exports = Writable;
+/* <replacement> */
+
+function WriteReq(chunk, encoding, cb) {
+  this.chunk = chunk;
+  this.encoding = encoding;
+  this.callback = cb;
+  this.next = null;
+} // It seems a linked list but it is not
+// there will be only 2 of these for each stream
+
+
+function CorkedRequest(state) {
+  var _this = this;
+
+  this.next = null;
+  this.entry = null;
+
+  this.finish = function () {
+    onCorkedFinish(_this, state);
+  };
+}
+/* </replacement> */
+
+/*<replacement>*/
+
+
+var Duplex;
+/*</replacement>*/
+
+Writable.WritableState = WritableState;
+/*<replacement>*/
+
+var internalUtil = {
+  deprecate: require('util-deprecate')
+};
+/*</replacement>*/
+
+/*<replacement>*/
+
+var Stream = require('./internal/streams/stream');
+/*</replacement>*/
+
+
+var Buffer = require('buffer').Buffer;
+
+var OurUint8Array = global.Uint8Array || function () {};
+
+function _uint8ArrayToBuffer(chunk) {
+  return Buffer.from(chunk);
+}
+
+function _isUint8Array(obj) {
+  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
+
+var destroyImpl = require('./internal/streams/destroy');
+
+var _require = require('./internal/streams/state'),
+    getHighWaterMark = _require.getHighWaterMark;
+
+var _require$codes = require('../errors').codes,
+    ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
+    ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
+    ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
+    ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE,
+    ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED,
+    ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES,
+    ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END,
+    ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING;
+
+var errorOrDestroy = destroyImpl.errorOrDestroy;
+
+require('inherits')(Writable, Stream);
+
+function nop() {}
+
+function WritableState(options, stream, isDuplex) {
+  Duplex = Duplex || require('./_stream_duplex');
+  options = options || {}; // Duplex streams are both readable and writable, but share
+  // the same options object.
+  // However, some cases require setting options to different
+  // values for the readable and the writable sides of the duplex stream,
+  // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.
+
+  if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream
+  // contains buffers or objects.
+
+  this.objectMode = !!options.objectMode;
+  if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false
+  // Note: 0 is a valid value, means that we always return false if
+  // the entire buffer is not flushed immediately on write()
+
+  this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called
+
+  this.finalCalled = false; // drain event flag.
+
+  this.needDrain = false; // at the start of calling end()
+
+  this.ending = false; // when end() has been called, and returned
+
+  this.ended = false; // when 'finish' is emitted
+
+  this.finished = false; // has it been destroyed
+
+  this.destroyed = false; // should we decode strings into buffers before passing to _write?
+  // this is here so that some node-core streams can optimize string
+  // handling at a lower level.
+
+  var noDecode = options.decodeStrings === false;
+  this.decodeStrings = !noDecode; // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+
+  this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement
+  // of how much we're waiting to get pushed to some underlying
+  // socket or file.
+
+  this.length = 0; // a flag to see when we're in the middle of a write.
+
+  this.writing = false; // when true all writes will be buffered until .uncork() call
+
+  this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately,
+  // or on a later tick.  We set this to true at first, because any
+  // actions that shouldn't happen until "later" should generally also
+  // not happen before the first write call.
+
+  this.sync = true; // a flag to know if we're processing previously buffered items, which
+  // may call the _write() callback in the same tick, so that we don't
+  // end up in an overlapped onwrite situation.
+
+  this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb)
+
+  this.onwrite = function (er) {
+    onwrite(stream, er);
+  }; // the callback that the user supplies to write(chunk,encoding,cb)
+
+
+  this.writecb = null; // the amount that is being written when _write is called.
+
+  this.writelen = 0;
+  this.bufferedRequest = null;
+  this.lastBufferedRequest = null; // number of pending user-supplied write callbacks
+  // this must be 0 before 'finish' can be emitted
+
+  this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs
+  // This is relevant for synchronous Transform streams
+
+  this.prefinished = false; // True if the error was already emitted and should not be thrown again
+
+  this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true.
+
+  this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end')
+
+  this.autoDestroy = !!options.autoDestroy; // count buffered requests
+
+  this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always
+  // one allocated and free to use, and we maintain at most two
+
+  this.corkedRequestsFree = new CorkedRequest(this);
+}
+
+WritableState.prototype.getBuffer = function getBuffer() {
+  var current = this.bufferedRequest;
+  var out = [];
+
+  while (current) {
+    out.push(current);
+    current = current.next;
+  }
+
+  return out;
+};
+
+(function () {
+  try {
+    Object.defineProperty(WritableState.prototype, 'buffer', {
+      get: internalUtil.deprecate(function writableStateBufferGetter() {
+        return this.getBuffer();
+      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
+    });
+  } catch (_) {}
+})(); // Test _writableState for inheritance to account for Duplex streams,
+// whose prototype chain only points to Readable.
+
+
+var realHasInstance;
+
+if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
+  realHasInstance = Function.prototype[Symbol.hasInstance];
+  Object.defineProperty(Writable, Symbol.hasInstance, {
+    value: function value(object) {
+      if (realHasInstance.call(this, object)) return true;
+      if (this !== Writable) return false;
+      return object && object._writableState instanceof WritableState;
+    }
+  });
+} else {
+  realHasInstance = function realHasInstance(object) {
+    return object instanceof this;
+  };
+}
+
+function Writable(options) {
+  Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too.
+  // `realHasInstance` is necessary because using plain `instanceof`
+  // would return false, as no `_writableState` property is attached.
+  // Trying to use the custom `instanceof` for Writable here will also break the
+  // Node.js LazyTransform implementation, which has a non-trivial getter for
+  // `_writableState` that would lead to infinite recursion.
+  // Checking for a Stream.Duplex instance is faster here instead of inside
+  // the WritableState constructor, at least with V8 6.5
+
+  var isDuplex = this instanceof Duplex;
+  if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options);
+  this._writableState = new WritableState(options, this, isDuplex); // legacy.
+
+  this.writable = true;
+
+  if (options) {
+    if (typeof options.write === 'function') this._write = options.write;
+    if (typeof options.writev === 'function') this._writev = options.writev;
+    if (typeof options.destroy === 'function') this._destroy = options.destroy;
+    if (typeof options.final === 'function') this._final = options.final;
+  }
+
+  Stream.call(this);
+} // Otherwise people can pipe Writable streams, which is just wrong.
+
+
+Writable.prototype.pipe = function () {
+  errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());
+};
+
+function writeAfterEnd(stream, cb) {
+  var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb
+
+  errorOrDestroy(stream, er);
+  process.nextTick(cb, er);
+} // Checks that a user-supplied chunk is valid, especially for the particular
+// mode the stream is in. Currently this means that `null` is never accepted
+// and undefined/non-string values are only allowed in object mode.
+
+
+function validChunk(stream, state, chunk, cb) {
+  var er;
+
+  if (chunk === null) {
+    er = new ERR_STREAM_NULL_VALUES();
+  } else if (typeof chunk !== 'string' && !state.objectMode) {
+    er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk);
+  }
+
+  if (er) {
+    errorOrDestroy(stream, er);
+    process.nextTick(cb, er);
+    return false;
+  }
+
+  return true;
+}
+
+Writable.prototype.write = function (chunk, encoding, cb) {
+  var state = this._writableState;
+  var ret = false;
+
+  var isBuf = !state.objectMode && _isUint8Array(chunk);
+
+  if (isBuf && !Buffer.isBuffer(chunk)) {
+    chunk = _uint8ArrayToBuffer(chunk);
+  }
+
+  if (typeof encoding === 'function') {
+    cb = encoding;
+    encoding = null;
+  }
+
+  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
+  if (typeof cb !== 'function') cb = nop;
+  if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
+    state.pendingcb++;
+    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
+  }
+  return ret;
+};
+
+Writable.prototype.cork = function () {
+  this._writableState.corked++;
+};
+
+Writable.prototype.uncork = function () {
+  var state = this._writableState;
+
+  if (state.corked) {
+    state.corked--;
+    if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
+  }
+};
+
+Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
+  // node::ParseEncoding() requires lower case.
+  if (typeof encoding === 'string') encoding = encoding.toLowerCase();
+  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding);
+  this._writableState.defaultEncoding = encoding;
+  return this;
+};
+
+Object.defineProperty(Writable.prototype, 'writableBuffer', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._writableState && this._writableState.getBuffer();
+  }
+});
+
+function decodeChunk(state, chunk, encoding) {
+  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
+    chunk = Buffer.from(chunk, encoding);
+  }
+
+  return chunk;
+}
+
+Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._writableState.highWaterMark;
+  }
+}); // if we're already writing something, then just put this
+// in the queue, and wait our turn.  Otherwise, call _write
+// If we return false, then we need a drain event, so set that flag.
+
+function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
+  if (!isBuf) {
+    var newChunk = decodeChunk(state, chunk, encoding);
+
+    if (chunk !== newChunk) {
+      isBuf = true;
+      encoding = 'buffer';
+      chunk = newChunk;
+    }
+  }
+
+  var len = state.objectMode ? 1 : chunk.length;
+  state.length += len;
+  var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false.
+
+  if (!ret) state.needDrain = true;
+
+  if (state.writing || state.corked) {
+    var last = state.lastBufferedRequest;
+    state.lastBufferedRequest = {
+      chunk: chunk,
+      encoding: encoding,
+      isBuf: isBuf,
+      callback: cb,
+      next: null
+    };
+
+    if (last) {
+      last.next = state.lastBufferedRequest;
+    } else {
+      state.bufferedRequest = state.lastBufferedRequest;
+    }
+
+    state.bufferedRequestCount += 1;
+  } else {
+    doWrite(stream, state, false, len, chunk, encoding, cb);
+  }
+
+  return ret;
+}
+
+function doWrite(stream, state, writev, len, chunk, encoding, cb) {
+  state.writelen = len;
+  state.writecb = cb;
+  state.writing = true;
+  state.sync = true;
+  if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
+  state.sync = false;
+}
+
+function onwriteError(stream, state, sync, er, cb) {
+  --state.pendingcb;
+
+  if (sync) {
+    // defer the callback if we are being called synchronously
+    // to avoid piling up things on the stack
+    process.nextTick(cb, er); // this can emit finish, and it will always happen
+    // after error
+
+    process.nextTick(finishMaybe, stream, state);
+    stream._writableState.errorEmitted = true;
+    errorOrDestroy(stream, er);
+  } else {
+    // the caller expect this to happen before if
+    // it is async
+    cb(er);
+    stream._writableState.errorEmitted = true;
+    errorOrDestroy(stream, er); // this can emit finish, but finish must
+    // always follow error
+
+    finishMaybe(stream, state);
+  }
+}
+
+function onwriteStateUpdate(state) {
+  state.writing = false;
+  state.writecb = null;
+  state.length -= state.writelen;
+  state.writelen = 0;
+}
+
+function onwrite(stream, er) {
+  var state = stream._writableState;
+  var sync = state.sync;
+  var cb = state.writecb;
+  if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK();
+  onwriteStateUpdate(state);
+  if (er) onwriteError(stream, state, sync, er, cb);else {
+    // Check if we're actually ready to finish, but don't emit yet
+    var finished = needFinish(state) || stream.destroyed;
+
+    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
+      clearBuffer(stream, state);
+    }
+
+    if (sync) {
+      process.nextTick(afterWrite, stream, state, finished, cb);
+    } else {
+      afterWrite(stream, state, finished, cb);
+    }
+  }
+}
+
+function afterWrite(stream, state, finished, cb) {
+  if (!finished) onwriteDrain(stream, state);
+  state.pendingcb--;
+  cb();
+  finishMaybe(stream, state);
+} // Must force callback to be called on nextTick, so that we don't
+// emit 'drain' before the write() consumer gets the 'false' return
+// value, and has a chance to attach a 'drain' listener.
+
+
+function onwriteDrain(stream, state) {
+  if (state.length === 0 && state.needDrain) {
+    state.needDrain = false;
+    stream.emit('drain');
+  }
+} // if there's something in the buffer waiting, then process it
+
+
+function clearBuffer(stream, state) {
+  state.bufferProcessing = true;
+  var entry = state.bufferedRequest;
+
+  if (stream._writev && entry && entry.next) {
+    // Fast case, write everything using _writev()
+    var l = state.bufferedRequestCount;
+    var buffer = new Array(l);
+    var holder = state.corkedRequestsFree;
+    holder.entry = entry;
+    var count = 0;
+    var allBuffers = true;
+
+    while (entry) {
+      buffer[count] = entry;
+      if (!entry.isBuf) allBuffers = false;
+      entry = entry.next;
+      count += 1;
+    }
+
+    buffer.allBuffers = allBuffers;
+    doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time
+    // as the hot path ends with doWrite
+
+    state.pendingcb++;
+    state.lastBufferedRequest = null;
+
+    if (holder.next) {
+      state.corkedRequestsFree = holder.next;
+      holder.next = null;
+    } else {
+      state.corkedRequestsFree = new CorkedRequest(state);
+    }
+
+    state.bufferedRequestCount = 0;
+  } else {
+    // Slow case, write chunks one-by-one
+    while (entry) {
+      var chunk = entry.chunk;
+      var encoding = entry.encoding;
+      var cb = entry.callback;
+      var len = state.objectMode ? 1 : chunk.length;
+      doWrite(stream, state, false, len, chunk, encoding, cb);
+      entry = entry.next;
+      state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then
+      // it means that we need to wait until it does.
+      // also, that means that the chunk and cb are currently
+      // being processed, so move the buffer counter past them.
+
+      if (state.writing) {
+        break;
+      }
+    }
+
+    if (entry === null) state.lastBufferedRequest = null;
+  }
+
+  state.bufferedRequest = entry;
+  state.bufferProcessing = false;
+}
+
+Writable.prototype._write = function (chunk, encoding, cb) {
+  cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()'));
+};
+
+Writable.prototype._writev = null;
+
+Writable.prototype.end = function (chunk, encoding, cb) {
+  var state = this._writableState;
+
+  if (typeof chunk === 'function') {
+    cb = chunk;
+    chunk = null;
+    encoding = null;
+  } else if (typeof encoding === 'function') {
+    cb = encoding;
+    encoding = null;
+  }
+
+  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks
+
+  if (state.corked) {
+    state.corked = 1;
+    this.uncork();
+  } // ignore unnecessary end() calls.
+
+
+  if (!state.ending) endWritable(this, state, cb);
+  return this;
+};
+
+Object.defineProperty(Writable.prototype, 'writableLength', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    return this._writableState.length;
+  }
+});
+
+function needFinish(state) {
+  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
+}
+
+function callFinal(stream, state) {
+  stream._final(function (err) {
+    state.pendingcb--;
+
+    if (err) {
+      errorOrDestroy(stream, err);
+    }
+
+    state.prefinished = true;
+    stream.emit('prefinish');
+    finishMaybe(stream, state);
+  });
+}
+
+function prefinish(stream, state) {
+  if (!state.prefinished && !state.finalCalled) {
+    if (typeof stream._final === 'function' && !state.destroyed) {
+      state.pendingcb++;
+      state.finalCalled = true;
+      process.nextTick(callFinal, stream, state);
+    } else {
+      state.prefinished = true;
+      stream.emit('prefinish');
+    }
+  }
+}
+
+function finishMaybe(stream, state) {
+  var need = needFinish(state);
+
+  if (need) {
+    prefinish(stream, state);
+
+    if (state.pendingcb === 0) {
+      state.finished = true;
+      stream.emit('finish');
+
+      if (state.autoDestroy) {
+        // In case of duplex streams we need a way to detect
+        // if the readable side is ready for autoDestroy as well
+        var rState = stream._readableState;
+
+        if (!rState || rState.autoDestroy && rState.endEmitted) {
+          stream.destroy();
+        }
+      }
+    }
+  }
+
+  return need;
+}
+
+function endWritable(stream, state, cb) {
+  state.ending = true;
+  finishMaybe(stream, state);
+
+  if (cb) {
+    if (state.finished) process.nextTick(cb);else stream.once('finish', cb);
+  }
+
+  state.ended = true;
+  stream.writable = false;
+}
+
+function onCorkedFinish(corkReq, state, err) {
+  var entry = corkReq.entry;
+  corkReq.entry = null;
+
+  while (entry) {
+    var cb = entry.callback;
+    state.pendingcb--;
+    cb(err);
+    entry = entry.next;
+  } // reuse the free corkReq.
+
+
+  state.corkedRequestsFree.next = corkReq;
+}
+
+Object.defineProperty(Writable.prototype, 'destroyed', {
+  // making it explicit this property is not enumerable
+  // because otherwise some prototype manipulation in
+  // userland will fail
+  enumerable: false,
+  get: function get() {
+    if (this._writableState === undefined) {
+      return false;
+    }
+
+    return this._writableState.destroyed;
+  },
+  set: function set(value) {
+    // we ignore the value if the stream
+    // has not been initialized yet
+    if (!this._writableState) {
+      return;
+    } // backward compatibility, the user is explicitly
+    // managing destroyed
+
+
+    this._writableState.destroyed = value;
+  }
+});
+Writable.prototype.destroy = destroyImpl.destroy;
+Writable.prototype._undestroy = destroyImpl.undestroy;
+
+Writable.prototype._destroy = function (err, cb) {
+  cb(err);
+};
\ No newline at end of file
diff --git a/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/async_iterator.js b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/async_iterator.js
new file mode 100644
index 0000000..9fb615a
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/async_iterator.js
@@ -0,0 +1,207 @@
+'use strict';
+
+var _Object$setPrototypeO;
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+var finished = require('./end-of-stream');
+
+var kLastResolve = Symbol('lastResolve');
+var kLastReject = Symbol('lastReject');
+var kError = Symbol('error');
+var kEnded = Symbol('ended');
+var kLastPromise = Symbol('lastPromise');
+var kHandlePromise = Symbol('handlePromise');
+var kStream = Symbol('stream');
+
+function createIterResult(value, done) {
+  return {
+    value: value,
+    done: done
+  };
+}
+
+function readAndResolve(iter) {
+  var resolve = iter[kLastResolve];
+
+  if (resolve !== null) {
+    var data = iter[kStream].read(); // we defer if data is null
+    // we can be expecting either 'end' or
+    // 'error'
+
+    if (data !== null) {
+      iter[kLastPromise] = null;
+      iter[kLastResolve] = null;
+      iter[kLastReject] = null;
+      resolve(createIterResult(data, false));
+    }
+  }
+}
+
+function onReadable(iter) {
+  // we wait for the next tick, because it might
+  // emit an error with process.nextTick
+  process.nextTick(readAndResolve, iter);
+}
+
+function wrapForNext(lastPromise, iter) {
+  return function (resolve, reject) {
+    lastPromise.then(function () {
+      if (iter[kEnded]) {
+        resolve(createIterResult(undefined, true));
+        return;
+      }
+
+      iter[kHandlePromise](resolve, reject);
+    }, reject);
+  };
+}
+
+var AsyncIteratorPrototype = Object.getPrototypeOf(function () {});
+var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = {
+  get stream() {
+    return this[kStream];
+  },
+
+  next: function next() {
+    var _this = this;
+
+    // if we have detected an error in the meanwhile
+    // reject straight away
+    var error = this[kError];
+
+    if (error !== null) {
+      return Promise.reject(error);
+    }
+
+    if (this[kEnded]) {
+      return Promise.resolve(createIterResult(undefined, true));
+    }
+
+    if (this[kStream].destroyed) {
+      // We need to defer via nextTick because if .destroy(err) is
+      // called, the error will be emitted via nextTick, and
+      // we cannot guarantee that there is no error lingering around
+      // waiting to be emitted.
+      return new Promise(function (resolve, reject) {
+        process.nextTick(function () {
+          if (_this[kError]) {
+            reject(_this[kError]);
+          } else {
+            resolve(createIterResult(undefined, true));
+          }
+        });
+      });
+    } // if we have multiple next() calls
+    // we will wait for the previous Promise to finish
+    // this logic is optimized to support for await loops,
+    // where next() is only called once at a time
+
+
+    var lastPromise = this[kLastPromise];
+    var promise;
+
+    if (lastPromise) {
+      promise = new Promise(wrapForNext(lastPromise, this));
+    } else {
+      // fast path needed to support multiple this.push()
+      // without triggering the next() queue
+      var data = this[kStream].read();
+
+      if (data !== null) {
+        return Promise.resolve(createIterResult(data, false));
+      }
+
+      promise = new Promise(this[kHandlePromise]);
+    }
+
+    this[kLastPromise] = promise;
+    return promise;
+  }
+}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () {
+  return this;
+}), _defineProperty(_Object$setPrototypeO, "return", function _return() {
+  var _this2 = this;
+
+  // destroy(err, cb) is a private API
+  // we can guarantee we have that here, because we control the
+  // Readable class this is attached to
+  return new Promise(function (resolve, reject) {
+    _this2[kStream].destroy(null, function (err) {
+      if (err) {
+        reject(err);
+        return;
+      }
+
+      resolve(createIterResult(undefined, true));
+    });
+  });
+}), _Object$setPrototypeO), AsyncIteratorPrototype);
+
+var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) {
+  var _Object$create;
+
+  var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, {
+    value: stream,
+    writable: true
+  }), _defineProperty(_Object$create, kLastResolve, {
+    value: null,
+    writable: true
+  }), _defineProperty(_Object$create, kLastReject, {
+    value: null,
+    writable: true
+  }), _defineProperty(_Object$create, kError, {
+    value: null,
+    writable: true
+  }), _defineProperty(_Object$create, kEnded, {
+    value: stream._readableState.endEmitted,
+    writable: true
+  }), _defineProperty(_Object$create, kHandlePromise, {
+    value: function value(resolve, reject) {
+      var data = iterator[kStream].read();
+
+      if (data) {
+        iterator[kLastPromise] = null;
+        iterator[kLastResolve] = null;
+        iterator[kLastReject] = null;
+        resolve(createIterResult(data, false));
+      } else {
+        iterator[kLastResolve] = resolve;
+        iterator[kLastReject] = reject;
+      }
+    },
+    writable: true
+  }), _Object$create));
+  iterator[kLastPromise] = null;
+  finished(stream, function (err) {
+    if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
+      var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise
+      // returned by next() and store the error
+
+      if (reject !== null) {
+        iterator[kLastPromise] = null;
+        iterator[kLastResolve] = null;
+        iterator[kLastReject] = null;
+        reject(err);
+      }
+
+      iterator[kError] = err;
+      return;
+    }
+
+    var resolve = iterator[kLastResolve];
+
+    if (resolve !== null) {
+      iterator[kLastPromise] = null;
+      iterator[kLastResolve] = null;
+      iterator[kLastReject] = null;
+      resolve(createIterResult(undefined, true));
+    }
+
+    iterator[kEnded] = true;
+  });
+  stream.on('readable', onReadable.bind(null, iterator));
+  return iterator;
+};
+
+module.exports = createReadableStreamAsyncIterator;
\ No newline at end of file
diff --git a/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/buffer_list.js b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/buffer_list.js
new file mode 100644
index 0000000..cdea425
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/buffer_list.js
@@ -0,0 +1,210 @@
+'use strict';
+
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
+
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+var _require = require('buffer'),
+    Buffer = _require.Buffer;
+
+var _require2 = require('util'),
+    inspect = _require2.inspect;
+
+var custom = inspect && inspect.custom || 'inspect';
+
+function copyBuffer(src, target, offset) {
+  Buffer.prototype.copy.call(src, target, offset);
+}
+
+module.exports =
+/*#__PURE__*/
+function () {
+  function BufferList() {
+    _classCallCheck(this, BufferList);
+
+    this.head = null;
+    this.tail = null;
+    this.length = 0;
+  }
+
+  _createClass(BufferList, [{
+    key: "push",
+    value: function push(v) {
+      var entry = {
+        data: v,
+        next: null
+      };
+      if (this.length > 0) this.tail.next = entry;else this.head = entry;
+      this.tail = entry;
+      ++this.length;
+    }
+  }, {
+    key: "unshift",
+    value: function unshift(v) {
+      var entry = {
+        data: v,
+        next: this.head
+      };
+      if (this.length === 0) this.tail = entry;
+      this.head = entry;
+      ++this.length;
+    }
+  }, {
+    key: "shift",
+    value: function shift() {
+      if (this.length === 0) return;
+      var ret = this.head.data;
+      if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
+      --this.length;
+      return ret;
+    }
+  }, {
+    key: "clear",
+    value: function clear() {
+      this.head = this.tail = null;
+      this.length = 0;
+    }
+  }, {
+    key: "join",
+    value: function join(s) {
+      if (this.length === 0) return '';
+      var p = this.head;
+      var ret = '' + p.data;
+
+      while (p = p.next) {
+        ret += s + p.data;
+      }
+
+      return ret;
+    }
+  }, {
+    key: "concat",
+    value: function concat(n) {
+      if (this.length === 0) return Buffer.alloc(0);
+      var ret = Buffer.allocUnsafe(n >>> 0);
+      var p = this.head;
+      var i = 0;
+
+      while (p) {
+        copyBuffer(p.data, ret, i);
+        i += p.data.length;
+        p = p.next;
+      }
+
+      return ret;
+    } // Consumes a specified amount of bytes or characters from the buffered data.
+
+  }, {
+    key: "consume",
+    value: function consume(n, hasStrings) {
+      var ret;
+
+      if (n < this.head.data.length) {
+        // `slice` is the same for buffers and strings.
+        ret = this.head.data.slice(0, n);
+        this.head.data = this.head.data.slice(n);
+      } else if (n === this.head.data.length) {
+        // First chunk is a perfect match.
+        ret = this.shift();
+      } else {
+        // Result spans more than one buffer.
+        ret = hasStrings ? this._getString(n) : this._getBuffer(n);
+      }
+
+      return ret;
+    }
+  }, {
+    key: "first",
+    value: function first() {
+      return this.head.data;
+    } // Consumes a specified amount of characters from the buffered data.
+
+  }, {
+    key: "_getString",
+    value: function _getString(n) {
+      var p = this.head;
+      var c = 1;
+      var ret = p.data;
+      n -= ret.length;
+
+      while (p = p.next) {
+        var str = p.data;
+        var nb = n > str.length ? str.length : n;
+        if (nb === str.length) ret += str;else ret += str.slice(0, n);
+        n -= nb;
+
+        if (n === 0) {
+          if (nb === str.length) {
+            ++c;
+            if (p.next) this.head = p.next;else this.head = this.tail = null;
+          } else {
+            this.head = p;
+            p.data = str.slice(nb);
+          }
+
+          break;
+        }
+
+        ++c;
+      }
+
+      this.length -= c;
+      return ret;
+    } // Consumes a specified amount of bytes from the buffered data.
+
+  }, {
+    key: "_getBuffer",
+    value: function _getBuffer(n) {
+      var ret = Buffer.allocUnsafe(n);
+      var p = this.head;
+      var c = 1;
+      p.data.copy(ret);
+      n -= p.data.length;
+
+      while (p = p.next) {
+        var buf = p.data;
+        var nb = n > buf.length ? buf.length : n;
+        buf.copy(ret, ret.length - n, 0, nb);
+        n -= nb;
+
+        if (n === 0) {
+          if (nb === buf.length) {
+            ++c;
+            if (p.next) this.head = p.next;else this.head = this.tail = null;
+          } else {
+            this.head = p;
+            p.data = buf.slice(nb);
+          }
+
+          break;
+        }
+
+        ++c;
+      }
+
+      this.length -= c;
+      return ret;
+    } // Make sure the linked list only shows the minimal necessary information.
+
+  }, {
+    key: custom,
+    value: function value(_, options) {
+      return inspect(this, _objectSpread({}, options, {
+        // Only inspect one level.
+        depth: 0,
+        // It should not recurse.
+        customInspect: false
+      }));
+    }
+  }]);
+
+  return BufferList;
+}();
\ No newline at end of file
diff --git a/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/destroy.js
new file mode 100644
index 0000000..3268a16
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/destroy.js
@@ -0,0 +1,105 @@
+'use strict'; // undocumented cb() API, needed for core, not for public API
+
+function destroy(err, cb) {
+  var _this = this;
+
+  var readableDestroyed = this._readableState && this._readableState.destroyed;
+  var writableDestroyed = this._writableState && this._writableState.destroyed;
+
+  if (readableDestroyed || writableDestroyed) {
+    if (cb) {
+      cb(err);
+    } else if (err) {
+      if (!this._writableState) {
+        process.nextTick(emitErrorNT, this, err);
+      } else if (!this._writableState.errorEmitted) {
+        this._writableState.errorEmitted = true;
+        process.nextTick(emitErrorNT, this, err);
+      }
+    }
+
+    return this;
+  } // we set destroyed to true before firing error callbacks in order
+  // to make it re-entrance safe in case destroy() is called within callbacks
+
+
+  if (this._readableState) {
+    this._readableState.destroyed = true;
+  } // if this is a duplex stream mark the writable part as destroyed as well
+
+
+  if (this._writableState) {
+    this._writableState.destroyed = true;
+  }
+
+  this._destroy(err || null, function (err) {
+    if (!cb && err) {
+      if (!_this._writableState) {
+        process.nextTick(emitErrorAndCloseNT, _this, err);
+      } else if (!_this._writableState.errorEmitted) {
+        _this._writableState.errorEmitted = true;
+        process.nextTick(emitErrorAndCloseNT, _this, err);
+      } else {
+        process.nextTick(emitCloseNT, _this);
+      }
+    } else if (cb) {
+      process.nextTick(emitCloseNT, _this);
+      cb(err);
+    } else {
+      process.nextTick(emitCloseNT, _this);
+    }
+  });
+
+  return this;
+}
+
+function emitErrorAndCloseNT(self, err) {
+  emitErrorNT(self, err);
+  emitCloseNT(self);
+}
+
+function emitCloseNT(self) {
+  if (self._writableState && !self._writableState.emitClose) return;
+  if (self._readableState && !self._readableState.emitClose) return;
+  self.emit('close');
+}
+
+function undestroy() {
+  if (this._readableState) {
+    this._readableState.destroyed = false;
+    this._readableState.reading = false;
+    this._readableState.ended = false;
+    this._readableState.endEmitted = false;
+  }
+
+  if (this._writableState) {
+    this._writableState.destroyed = false;
+    this._writableState.ended = false;
+    this._writableState.ending = false;
+    this._writableState.finalCalled = false;
+    this._writableState.prefinished = false;
+    this._writableState.finished = false;
+    this._writableState.errorEmitted = false;
+  }
+}
+
+function emitErrorNT(self, err) {
+  self.emit('error', err);
+}
+
+function errorOrDestroy(stream, err) {
+  // We have tests that rely on errors being emitted
+  // in the same tick, so changing this is semver major.
+  // For now when you opt-in to autoDestroy we allow
+  // the error to be emitted nextTick. In a future
+  // semver major update we should change the default to this.
+  var rState = stream._readableState;
+  var wState = stream._writableState;
+  if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err);
+}
+
+module.exports = {
+  destroy: destroy,
+  undestroy: undestroy,
+  errorOrDestroy: errorOrDestroy
+};
\ No newline at end of file
diff --git a/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/end-of-stream.js b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/end-of-stream.js
new file mode 100644
index 0000000..831f286
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/end-of-stream.js
@@ -0,0 +1,104 @@
+// Ported from https://github.com/mafintosh/end-of-stream with
+// permission from the author, Mathias Buus (@mafintosh).
+'use strict';
+
+var ERR_STREAM_PREMATURE_CLOSE = require('../../../errors').codes.ERR_STREAM_PREMATURE_CLOSE;
+
+function once(callback) {
+  var called = false;
+  return function () {
+    if (called) return;
+    called = true;
+
+    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+      args[_key] = arguments[_key];
+    }
+
+    callback.apply(this, args);
+  };
+}
+
+function noop() {}
+
+function isRequest(stream) {
+  return stream.setHeader && typeof stream.abort === 'function';
+}
+
+function eos(stream, opts, callback) {
+  if (typeof opts === 'function') return eos(stream, null, opts);
+  if (!opts) opts = {};
+  callback = once(callback || noop);
+  var readable = opts.readable || opts.readable !== false && stream.readable;
+  var writable = opts.writable || opts.writable !== false && stream.writable;
+
+  var onlegacyfinish = function onlegacyfinish() {
+    if (!stream.writable) onfinish();
+  };
+
+  var writableEnded = stream._writableState && stream._writableState.finished;
+
+  var onfinish = function onfinish() {
+    writable = false;
+    writableEnded = true;
+    if (!readable) callback.call(stream);
+  };
+
+  var readableEnded = stream._readableState && stream._readableState.endEmitted;
+
+  var onend = function onend() {
+    readable = false;
+    readableEnded = true;
+    if (!writable) callback.call(stream);
+  };
+
+  var onerror = function onerror(err) {
+    callback.call(stream, err);
+  };
+
+  var onclose = function onclose() {
+    var err;
+
+    if (readable && !readableEnded) {
+      if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
+      return callback.call(stream, err);
+    }
+
+    if (writable && !writableEnded) {
+      if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
+      return callback.call(stream, err);
+    }
+  };
+
+  var onrequest = function onrequest() {
+    stream.req.on('finish', onfinish);
+  };
+
+  if (isRequest(stream)) {
+    stream.on('complete', onfinish);
+    stream.on('abort', onclose);
+    if (stream.req) onrequest();else stream.on('request', onrequest);
+  } else if (writable && !stream._writableState) {
+    // legacy streams
+    stream.on('end', onlegacyfinish);
+    stream.on('close', onlegacyfinish);
+  }
+
+  stream.on('end', onend);
+  stream.on('finish', onfinish);
+  if (opts.error !== false) stream.on('error', onerror);
+  stream.on('close', onclose);
+  return function () {
+    stream.removeListener('complete', onfinish);
+    stream.removeListener('abort', onclose);
+    stream.removeListener('request', onrequest);
+    if (stream.req) stream.req.removeListener('finish', onfinish);
+    stream.removeListener('end', onlegacyfinish);
+    stream.removeListener('close', onlegacyfinish);
+    stream.removeListener('finish', onfinish);
+    stream.removeListener('end', onend);
+    stream.removeListener('error', onerror);
+    stream.removeListener('close', onclose);
+  };
+}
+
+module.exports = eos;
\ No newline at end of file
diff --git a/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from-browser.js b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from-browser.js
new file mode 100644
index 0000000..a4ce56f
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from-browser.js
@@ -0,0 +1,3 @@
+module.exports = function () {
+  throw new Error('Readable.from is not available in the browser')
+};
diff --git a/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from.js b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from.js
new file mode 100644
index 0000000..6c41284
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/from.js
@@ -0,0 +1,64 @@
+'use strict';
+
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
+
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+var ERR_INVALID_ARG_TYPE = require('../../../errors').codes.ERR_INVALID_ARG_TYPE;
+
+function from(Readable, iterable, opts) {
+  var iterator;
+
+  if (iterable && typeof iterable.next === 'function') {
+    iterator = iterable;
+  } else if (iterable && iterable[Symbol.asyncIterator]) iterator = iterable[Symbol.asyncIterator]();else if (iterable && iterable[Symbol.iterator]) iterator = iterable[Symbol.iterator]();else throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable);
+
+  var readable = new Readable(_objectSpread({
+    objectMode: true
+  }, opts)); // Reading boolean to protect against _read
+  // being called before last iteration completion.
+
+  var reading = false;
+
+  readable._read = function () {
+    if (!reading) {
+      reading = true;
+      next();
+    }
+  };
+
+  function next() {
+    return _next2.apply(this, arguments);
+  }
+
+  function _next2() {
+    _next2 = _asyncToGenerator(function* () {
+      try {
+        var _ref = yield iterator.next(),
+            value = _ref.value,
+            done = _ref.done;
+
+        if (done) {
+          readable.push(null);
+        } else if (readable.push((yield value))) {
+          next();
+        } else {
+          reading = false;
+        }
+      } catch (err) {
+        readable.destroy(err);
+      }
+    });
+    return _next2.apply(this, arguments);
+  }
+
+  return readable;
+}
+
+module.exports = from;
\ No newline at end of file
diff --git a/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/pipeline.js b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/pipeline.js
new file mode 100644
index 0000000..6589909
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/pipeline.js
@@ -0,0 +1,97 @@
+// Ported from https://github.com/mafintosh/pump with
+// permission from the author, Mathias Buus (@mafintosh).
+'use strict';
+
+var eos;
+
+function once(callback) {
+  var called = false;
+  return function () {
+    if (called) return;
+    called = true;
+    callback.apply(void 0, arguments);
+  };
+}
+
+var _require$codes = require('../../../errors').codes,
+    ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS,
+    ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED;
+
+function noop(err) {
+  // Rethrow the error if it exists to avoid swallowing it
+  if (err) throw err;
+}
+
+function isRequest(stream) {
+  return stream.setHeader && typeof stream.abort === 'function';
+}
+
+function destroyer(stream, reading, writing, callback) {
+  callback = once(callback);
+  var closed = false;
+  stream.on('close', function () {
+    closed = true;
+  });
+  if (eos === undefined) eos = require('./end-of-stream');
+  eos(stream, {
+    readable: reading,
+    writable: writing
+  }, function (err) {
+    if (err) return callback(err);
+    closed = true;
+    callback();
+  });
+  var destroyed = false;
+  return function (err) {
+    if (closed) return;
+    if (destroyed) return;
+    destroyed = true; // request.destroy just do .end - .abort is what we want
+
+    if (isRequest(stream)) return stream.abort();
+    if (typeof stream.destroy === 'function') return stream.destroy();
+    callback(err || new ERR_STREAM_DESTROYED('pipe'));
+  };
+}
+
+function call(fn) {
+  fn();
+}
+
+function pipe(from, to) {
+  return from.pipe(to);
+}
+
+function popCallback(streams) {
+  if (!streams.length) return noop;
+  if (typeof streams[streams.length - 1] !== 'function') return noop;
+  return streams.pop();
+}
+
+function pipeline() {
+  for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) {
+    streams[_key] = arguments[_key];
+  }
+
+  var callback = popCallback(streams);
+  if (Array.isArray(streams[0])) streams = streams[0];
+
+  if (streams.length < 2) {
+    throw new ERR_MISSING_ARGS('streams');
+  }
+
+  var error;
+  var destroys = streams.map(function (stream, i) {
+    var reading = i < streams.length - 1;
+    var writing = i > 0;
+    return destroyer(stream, reading, writing, function (err) {
+      if (!error) error = err;
+      if (err) destroys.forEach(call);
+      if (reading) return;
+      destroys.forEach(call);
+      callback(error);
+    });
+  });
+  return streams.reduce(pipe);
+}
+
+module.exports = pipeline;
\ No newline at end of file
diff --git a/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/state.js b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/state.js
new file mode 100644
index 0000000..19887eb
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/state.js
@@ -0,0 +1,27 @@
+'use strict';
+
+var ERR_INVALID_OPT_VALUE = require('../../../errors').codes.ERR_INVALID_OPT_VALUE;
+
+function highWaterMarkFrom(options, isDuplex, duplexKey) {
+  return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null;
+}
+
+function getHighWaterMark(state, options, duplexKey, isDuplex) {
+  var hwm = highWaterMarkFrom(options, isDuplex, duplexKey);
+
+  if (hwm != null) {
+    if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) {
+      var name = isDuplex ? duplexKey : 'highWaterMark';
+      throw new ERR_INVALID_OPT_VALUE(name, hwm);
+    }
+
+    return Math.floor(hwm);
+  } // Default value
+
+
+  return state.objectMode ? 16 : 16 * 1024;
+}
+
+module.exports = {
+  getHighWaterMark: getHighWaterMark
+};
\ No newline at end of file
diff --git a/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js
new file mode 100644
index 0000000..9332a3f
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js
@@ -0,0 +1 @@
+module.exports = require('events').EventEmitter;
diff --git a/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream.js
new file mode 100644
index 0000000..ce2ad5b
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/lib/internal/streams/stream.js
@@ -0,0 +1 @@
+module.exports = require('stream');
diff --git a/node_modules/tar-stream/node_modules/readable-stream/package.json b/node_modules/tar-stream/node_modules/readable-stream/package.json
new file mode 100644
index 0000000..f2bf91f
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/package.json
@@ -0,0 +1,97 @@
+{
+  "_from": "readable-stream@^3.1.1",
+  "_id": "readable-stream@3.6.0",
+  "_inBundle": false,
+  "_integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+  "_location": "/tar-stream/readable-stream",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "readable-stream@^3.1.1",
+    "name": "readable-stream",
+    "escapedName": "readable-stream",
+    "rawSpec": "^3.1.1",
+    "saveSpec": null,
+    "fetchSpec": "^3.1.1"
+  },
+  "_requiredBy": [
+    "/tar-stream"
+  ],
+  "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+  "_shasum": "337bbda3adc0706bd3e024426a286d4b4b2c9198",
+  "_spec": "readable-stream@^3.1.1",
+  "_where": "F:\\vent-display\\node_modules\\tar-stream",
+  "browser": {
+    "util": false,
+    "worker_threads": false,
+    "./errors": "./errors-browser.js",
+    "./readable.js": "./readable-browser.js",
+    "./lib/internal/streams/from.js": "./lib/internal/streams/from-browser.js",
+    "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js"
+  },
+  "bugs": {
+    "url": "https://github.com/nodejs/readable-stream/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "inherits": "^2.0.3",
+    "string_decoder": "^1.1.1",
+    "util-deprecate": "^1.0.1"
+  },
+  "deprecated": false,
+  "description": "Streams3, a user-land copy of the stream library from Node.js",
+  "devDependencies": {
+    "@babel/cli": "^7.2.0",
+    "@babel/core": "^7.2.0",
+    "@babel/polyfill": "^7.0.0",
+    "@babel/preset-env": "^7.2.0",
+    "airtap": "0.0.9",
+    "assert": "^1.4.0",
+    "bl": "^2.0.0",
+    "deep-strict-equal": "^0.2.0",
+    "events.once": "^2.0.2",
+    "glob": "^7.1.2",
+    "gunzip-maybe": "^1.4.1",
+    "hyperquest": "^2.1.3",
+    "lolex": "^2.6.0",
+    "nyc": "^11.0.0",
+    "pump": "^3.0.0",
+    "rimraf": "^2.6.2",
+    "tap": "^12.0.0",
+    "tape": "^4.9.0",
+    "tar-fs": "^1.16.2",
+    "util-promisify": "^2.1.0"
+  },
+  "engines": {
+    "node": ">= 6"
+  },
+  "homepage": "https://github.com/nodejs/readable-stream#readme",
+  "keywords": [
+    "readable",
+    "stream",
+    "pipe"
+  ],
+  "license": "MIT",
+  "main": "readable.js",
+  "name": "readable-stream",
+  "nyc": {
+    "include": [
+      "lib/**.js"
+    ]
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/nodejs/readable-stream.git"
+  },
+  "scripts": {
+    "ci": "TAP=1 tap --no-esm test/parallel/*.js test/ours/*.js | tee test.tap",
+    "cover": "nyc npm test",
+    "report": "nyc report --reporter=lcov",
+    "test": "tap -J --no-esm test/parallel/*.js test/ours/*.js",
+    "test-browser-local": "airtap --open --local -- test/browser.js",
+    "test-browsers": "airtap --sauce-connect --loopback airtap.local -- test/browser.js",
+    "update-browser-errors": "babel -o errors-browser.js errors.js"
+  },
+  "version": "3.6.0"
+}
diff --git a/node_modules/tar-stream/node_modules/readable-stream/readable-browser.js b/node_modules/tar-stream/node_modules/readable-stream/readable-browser.js
new file mode 100644
index 0000000..adbf60d
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/readable-browser.js
@@ -0,0 +1,9 @@
+exports = module.exports = require('./lib/_stream_readable.js');
+exports.Stream = exports;
+exports.Readable = exports;
+exports.Writable = require('./lib/_stream_writable.js');
+exports.Duplex = require('./lib/_stream_duplex.js');
+exports.Transform = require('./lib/_stream_transform.js');
+exports.PassThrough = require('./lib/_stream_passthrough.js');
+exports.finished = require('./lib/internal/streams/end-of-stream.js');
+exports.pipeline = require('./lib/internal/streams/pipeline.js');
diff --git a/node_modules/tar-stream/node_modules/readable-stream/readable.js b/node_modules/tar-stream/node_modules/readable-stream/readable.js
new file mode 100644
index 0000000..9e0ca12
--- /dev/null
+++ b/node_modules/tar-stream/node_modules/readable-stream/readable.js
@@ -0,0 +1,16 @@
+var Stream = require('stream');
+if (process.env.READABLE_STREAM === 'disable' && Stream) {
+  module.exports = Stream.Readable;
+  Object.assign(module.exports, Stream);
+  module.exports.Stream = Stream;
+} else {
+  exports = module.exports = require('./lib/_stream_readable.js');
+  exports.Stream = Stream || exports;
+  exports.Readable = exports;
+  exports.Writable = require('./lib/_stream_writable.js');
+  exports.Duplex = require('./lib/_stream_duplex.js');
+  exports.Transform = require('./lib/_stream_transform.js');
+  exports.PassThrough = require('./lib/_stream_passthrough.js');
+  exports.finished = require('./lib/internal/streams/end-of-stream.js');
+  exports.pipeline = require('./lib/internal/streams/pipeline.js');
+}
diff --git a/node_modules/tar-stream/pack.js b/node_modules/tar-stream/pack.js
new file mode 100644
index 0000000..f1da3b7
--- /dev/null
+++ b/node_modules/tar-stream/pack.js
@@ -0,0 +1,255 @@
+var constants = require('fs-constants')
+var eos = require('end-of-stream')
+var inherits = require('inherits')
+var alloc = Buffer.alloc
+
+var Readable = require('readable-stream').Readable
+var Writable = require('readable-stream').Writable
+var StringDecoder = require('string_decoder').StringDecoder
+
+var headers = require('./headers')
+
+var DMODE = parseInt('755', 8)
+var FMODE = parseInt('644', 8)
+
+var END_OF_TAR = alloc(1024)
+
+var noop = function () {}
+
+var overflow = function (self, size) {
+  size &= 511
+  if (size) self.push(END_OF_TAR.slice(0, 512 - size))
+}
+
+function modeToType (mode) {
+  switch (mode & constants.S_IFMT) {
+    case constants.S_IFBLK: return 'block-device'
+    case constants.S_IFCHR: return 'character-device'
+    case constants.S_IFDIR: return 'directory'
+    case constants.S_IFIFO: return 'fifo'
+    case constants.S_IFLNK: return 'symlink'
+  }
+
+  return 'file'
+}
+
+var Sink = function (to) {
+  Writable.call(this)
+  this.written = 0
+  this._to = to
+  this._destroyed = false
+}
+
+inherits(Sink, Writable)
+
+Sink.prototype._write = function (data, enc, cb) {
+  this.written += data.length
+  if (this._to.push(data)) return cb()
+  this._to._drain = cb
+}
+
+Sink.prototype.destroy = function () {
+  if (this._destroyed) return
+  this._destroyed = true
+  this.emit('close')
+}
+
+var LinkSink = function () {
+  Writable.call(this)
+  this.linkname = ''
+  this._decoder = new StringDecoder('utf-8')
+  this._destroyed = false
+}
+
+inherits(LinkSink, Writable)
+
+LinkSink.prototype._write = function (data, enc, cb) {
+  this.linkname += this._decoder.write(data)
+  cb()
+}
+
+LinkSink.prototype.destroy = function () {
+  if (this._destroyed) return
+  this._destroyed = true
+  this.emit('close')
+}
+
+var Void = function () {
+  Writable.call(this)
+  this._destroyed = false
+}
+
+inherits(Void, Writable)
+
+Void.prototype._write = function (data, enc, cb) {
+  cb(new Error('No body allowed for this entry'))
+}
+
+Void.prototype.destroy = function () {
+  if (this._destroyed) return
+  this._destroyed = true
+  this.emit('close')
+}
+
+var Pack = function (opts) {
+  if (!(this instanceof Pack)) return new Pack(opts)
+  Readable.call(this, opts)
+
+  this._drain = noop
+  this._finalized = false
+  this._finalizing = false
+  this._destroyed = false
+  this._stream = null
+}
+
+inherits(Pack, Readable)
+
+Pack.prototype.entry = function (header, buffer, callback) {
+  if (this._stream) throw new Error('already piping an entry')
+  if (this._finalized || this._destroyed) return
+
+  if (typeof buffer === 'function') {
+    callback = buffer
+    buffer = null
+  }
+
+  if (!callback) callback = noop
+
+  var self = this
+
+  if (!header.size || header.type === 'symlink') header.size = 0
+  if (!header.type) header.type = modeToType(header.mode)
+  if (!header.mode) header.mode = header.type === 'directory' ? DMODE : FMODE
+  if (!header.uid) header.uid = 0
+  if (!header.gid) header.gid = 0
+  if (!header.mtime) header.mtime = new Date()
+
+  if (typeof buffer === 'string') buffer = Buffer.from(buffer)
+  if (Buffer.isBuffer(buffer)) {
+    header.size = buffer.length
+    this._encode(header)
+    var ok = this.push(buffer)
+    overflow(self, header.size)
+    if (ok) process.nextTick(callback)
+    else this._drain = callback
+    return new Void()
+  }
+
+  if (header.type === 'symlink' && !header.linkname) {
+    var linkSink = new LinkSink()
+    eos(linkSink, function (err) {
+      if (err) { // stream was closed
+        self.destroy()
+        return callback(err)
+      }
+
+      header.linkname = linkSink.linkname
+      self._encode(header)
+      callback()
+    })
+
+    return linkSink
+  }
+
+  this._encode(header)
+
+  if (header.type !== 'file' && header.type !== 'contiguous-file') {
+    process.nextTick(callback)
+    return new Void()
+  }
+
+  var sink = new Sink(this)
+
+  this._stream = sink
+
+  eos(sink, function (err) {
+    self._stream = null
+
+    if (err) { // stream was closed
+      self.destroy()
+      return callback(err)
+    }
+
+    if (sink.written !== header.size) { // corrupting tar
+      self.destroy()
+      return callback(new Error('size mismatch'))
+    }
+
+    overflow(self, header.size)
+    if (self._finalizing) self.finalize()
+    callback()
+  })
+
+  return sink
+}
+
+Pack.prototype.finalize = function () {
+  if (this._stream) {
+    this._finalizing = true
+    return
+  }
+
+  if (this._finalized) return
+  this._finalized = true
+  this.push(END_OF_TAR)
+  this.push(null)
+}
+
+Pack.prototype.destroy = function (err) {
+  if (this._destroyed) return
+  this._destroyed = true
+
+  if (err) this.emit('error', err)
+  this.emit('close')
+  if (this._stream && this._stream.destroy) this._stream.destroy()
+}
+
+Pack.prototype._encode = function (header) {
+  if (!header.pax) {
+    var buf = headers.encode(header)
+    if (buf) {
+      this.push(buf)
+      return
+    }
+  }
+  this._encodePax(header)
+}
+
+Pack.prototype._encodePax = function (header) {
+  var paxHeader = headers.encodePax({
+    name: header.name,
+    linkname: header.linkname,
+    pax: header.pax
+  })
+
+  var newHeader = {
+    name: 'PaxHeader',
+    mode: header.mode,
+    uid: header.uid,
+    gid: header.gid,
+    size: paxHeader.length,
+    mtime: header.mtime,
+    type: 'pax-header',
+    linkname: header.linkname && 'PaxHeader',
+    uname: header.uname,
+    gname: header.gname,
+    devmajor: header.devmajor,
+    devminor: header.devminor
+  }
+
+  this.push(headers.encode(newHeader))
+  this.push(paxHeader)
+  overflow(this, paxHeader.length)
+
+  newHeader.size = header.size
+  newHeader.type = header.type
+  this.push(headers.encode(newHeader))
+}
+
+Pack.prototype._read = function (n) {
+  var drain = this._drain
+  this._drain = noop
+  drain()
+}
+
+module.exports = Pack
diff --git a/node_modules/tar-stream/package.json b/node_modules/tar-stream/package.json
new file mode 100644
index 0000000..8f66881
--- /dev/null
+++ b/node_modules/tar-stream/package.json
@@ -0,0 +1,90 @@
+{
+  "_from": "tar-stream@^2.1.4",
+  "_id": "tar-stream@2.2.0",
+  "_inBundle": false,
+  "_integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+  "_location": "/tar-stream",
+  "_phantomChildren": {
+    "inherits": "2.0.4",
+    "string_decoder": "1.1.1",
+    "util-deprecate": "1.0.2"
+  },
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "tar-stream@^2.1.4",
+    "name": "tar-stream",
+    "escapedName": "tar-stream",
+    "rawSpec": "^2.1.4",
+    "saveSpec": null,
+    "fetchSpec": "^2.1.4"
+  },
+  "_requiredBy": [
+    "/tar-fs"
+  ],
+  "_resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+  "_shasum": "acad84c284136b060dc3faa64474aa9aebd77287",
+  "_spec": "tar-stream@^2.1.4",
+  "_where": "F:\\vent-display\\node_modules\\tar-fs",
+  "author": {
+    "name": "Mathias Buus",
+    "email": "mathiasbuus@gmail.com"
+  },
+  "bugs": {
+    "url": "https://github.com/mafintosh/tar-stream/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "bl": "^4.0.3",
+    "end-of-stream": "^1.4.1",
+    "fs-constants": "^1.0.0",
+    "inherits": "^2.0.3",
+    "readable-stream": "^3.1.1"
+  },
+  "deprecated": false,
+  "description": "tar-stream is a streaming tar parser and generator and nothing else. It is streams2 and operates purely using streams which means you can easily extract/parse tarballs without ever hitting the file system.",
+  "devDependencies": {
+    "concat-stream": "^2.0.0",
+    "standard": "^12.0.1",
+    "tape": "^4.9.2"
+  },
+  "directories": {
+    "test": "test"
+  },
+  "engines": {
+    "node": ">=6"
+  },
+  "files": [
+    "*.js",
+    "LICENSE"
+  ],
+  "homepage": "https://github.com/mafintosh/tar-stream",
+  "keywords": [
+    "tar",
+    "tarball",
+    "parse",
+    "parser",
+    "generate",
+    "generator",
+    "stream",
+    "stream2",
+    "streams",
+    "streams2",
+    "streaming",
+    "pack",
+    "extract",
+    "modify"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "tar-stream",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/mafintosh/tar-stream.git"
+  },
+  "scripts": {
+    "test": "standard && tape test/extract.js test/pack.js",
+    "test-all": "standard && tape test/*.js"
+  },
+  "version": "2.2.0"
+}
diff --git a/node_modules/tar-stream/sandbox.js b/node_modules/tar-stream/sandbox.js
new file mode 100644
index 0000000..9b82d40
--- /dev/null
+++ b/node_modules/tar-stream/sandbox.js
@@ -0,0 +1,11 @@
+const tar = require('tar-stream')
+const fs = require('fs')
+const path = require('path')
+const pipeline = require('pump') // eequire('stream').pipeline
+
+fs.createReadStream('test.tar')
+  .pipe(tar.extract())
+  .on('entry', function (header, stream, done) {
+    console.log(header.name)
+    pipeline(stream, fs.createWriteStream(path.join('/tmp', header.name)), done)
+  })
diff --git a/node_modules/tunnel-agent/LICENSE b/node_modules/tunnel-agent/LICENSE
new file mode 100644
index 0000000..a4a9aee
--- /dev/null
+++ b/node_modules/tunnel-agent/LICENSE
@@ -0,0 +1,55 @@
+Apache License
+
+Version 2.0, January 2004
+
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
+
+"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of this License; and
+
+You must cause any modified files to carry prominent notices stating that You changed the files; and
+
+You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
+
+If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
\ No newline at end of file
diff --git a/node_modules/tunnel-agent/README.md b/node_modules/tunnel-agent/README.md
new file mode 100644
index 0000000..bb533d5
--- /dev/null
+++ b/node_modules/tunnel-agent/README.md
@@ -0,0 +1,4 @@
+tunnel-agent
+============
+
+HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module.
diff --git a/node_modules/tunnel-agent/index.js b/node_modules/tunnel-agent/index.js
new file mode 100644
index 0000000..3ee9abc
--- /dev/null
+++ b/node_modules/tunnel-agent/index.js
@@ -0,0 +1,244 @@
+'use strict'
+
+var net = require('net')
+  , tls = require('tls')
+  , http = require('http')
+  , https = require('https')
+  , events = require('events')
+  , assert = require('assert')
+  , util = require('util')
+  , Buffer = require('safe-buffer').Buffer
+  ;
+
+exports.httpOverHttp = httpOverHttp
+exports.httpsOverHttp = httpsOverHttp
+exports.httpOverHttps = httpOverHttps
+exports.httpsOverHttps = httpsOverHttps
+
+
+function httpOverHttp(options) {
+  var agent = new TunnelingAgent(options)
+  agent.request = http.request
+  return agent
+}
+
+function httpsOverHttp(options) {
+  var agent = new TunnelingAgent(options)
+  agent.request = http.request
+  agent.createSocket = createSecureSocket
+  agent.defaultPort = 443
+  return agent
+}
+
+function httpOverHttps(options) {
+  var agent = new TunnelingAgent(options)
+  agent.request = https.request
+  return agent
+}
+
+function httpsOverHttps(options) {
+  var agent = new TunnelingAgent(options)
+  agent.request = https.request
+  agent.createSocket = createSecureSocket
+  agent.defaultPort = 443
+  return agent
+}
+
+
+function TunnelingAgent(options) {
+  var self = this
+  self.options = options || {}
+  self.proxyOptions = self.options.proxy || {}
+  self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets
+  self.requests = []
+  self.sockets = []
+
+  self.on('free', function onFree(socket, host, port) {
+    for (var i = 0, len = self.requests.length; i < len; ++i) {
+      var pending = self.requests[i]
+      if (pending.host === host && pending.port === port) {
+        // Detect the request to connect same origin server,
+        // reuse the connection.
+        self.requests.splice(i, 1)
+        pending.request.onSocket(socket)
+        return
+      }
+    }
+    socket.destroy()
+    self.removeSocket(socket)
+  })
+}
+util.inherits(TunnelingAgent, events.EventEmitter)
+
+TunnelingAgent.prototype.addRequest = function addRequest(req, options) {
+  var self = this
+
+   // Legacy API: addRequest(req, host, port, path)
+  if (typeof options === 'string') {
+    options = {
+      host: options,
+      port: arguments[2],
+      path: arguments[3]
+    };
+  }
+
+  if (self.sockets.length >= this.maxSockets) {
+    // We are over limit so we'll add it to the queue.
+    self.requests.push({host: options.host, port: options.port, request: req})
+    return
+  }
+
+  // If we are under maxSockets create a new one.
+  self.createConnection({host: options.host, port: options.port, request: req})
+}
+
+TunnelingAgent.prototype.createConnection = function createConnection(pending) {
+  var self = this
+
+  self.createSocket(pending, function(socket) {
+    socket.on('free', onFree)
+    socket.on('close', onCloseOrRemove)
+    socket.on('agentRemove', onCloseOrRemove)
+    pending.request.onSocket(socket)
+
+    function onFree() {
+      self.emit('free', socket, pending.host, pending.port)
+    }
+
+    function onCloseOrRemove(err) {
+      self.removeSocket(socket)
+      socket.removeListener('free', onFree)
+      socket.removeListener('close', onCloseOrRemove)
+      socket.removeListener('agentRemove', onCloseOrRemove)
+    }
+  })
+}
+
+TunnelingAgent.prototype.createSocket = function createSocket(options, cb) {
+  var self = this
+  var placeholder = {}
+  self.sockets.push(placeholder)
+
+  var connectOptions = mergeOptions({}, self.proxyOptions,
+    { method: 'CONNECT'
+    , path: options.host + ':' + options.port
+    , agent: false
+    }
+  )
+  if (connectOptions.proxyAuth) {
+    connectOptions.headers = connectOptions.headers || {}
+    connectOptions.headers['Proxy-Authorization'] = 'Basic ' +
+        Buffer.from(connectOptions.proxyAuth).toString('base64')
+  }
+
+  debug('making CONNECT request')
+  var connectReq = self.request(connectOptions)
+  connectReq.useChunkedEncodingByDefault = false // for v0.6
+  connectReq.once('response', onResponse) // for v0.6
+  connectReq.once('upgrade', onUpgrade)   // for v0.6
+  connectReq.once('connect', onConnect)   // for v0.7 or later
+  connectReq.once('error', onError)
+  connectReq.end()
+
+  function onResponse(res) {
+    // Very hacky. This is necessary to avoid http-parser leaks.
+    res.upgrade = true
+  }
+
+  function onUpgrade(res, socket, head) {
+    // Hacky.
+    process.nextTick(function() {
+      onConnect(res, socket, head)
+    })
+  }
+
+  function onConnect(res, socket, head) {
+    connectReq.removeAllListeners()
+    socket.removeAllListeners()
+
+    if (res.statusCode === 200) {
+      assert.equal(head.length, 0)
+      debug('tunneling connection has established')
+      self.sockets[self.sockets.indexOf(placeholder)] = socket
+      cb(socket)
+    } else {
+      debug('tunneling socket could not be established, statusCode=%d', res.statusCode)
+      var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode)
+      error.code = 'ECONNRESET'
+      options.request.emit('error', error)
+      self.removeSocket(placeholder)
+    }
+  }
+
+  function onError(cause) {
+    connectReq.removeAllListeners()
+
+    debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack)
+    var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message)
+    error.code = 'ECONNRESET'
+    options.request.emit('error', error)
+    self.removeSocket(placeholder)
+  }
+}
+
+TunnelingAgent.prototype.removeSocket = function removeSocket(socket) {
+  var pos = this.sockets.indexOf(socket)
+  if (pos === -1) return
+
+  this.sockets.splice(pos, 1)
+
+  var pending = this.requests.shift()
+  if (pending) {
+    // If we have pending requests and a socket gets closed a new one
+    // needs to be created to take over in the pool for the one that closed.
+    this.createConnection(pending)
+  }
+}
+
+function createSecureSocket(options, cb) {
+  var self = this
+  TunnelingAgent.prototype.createSocket.call(self, options, function(socket) {
+    // 0 is dummy port for v0.6
+    var secureSocket = tls.connect(0, mergeOptions({}, self.options,
+      { servername: options.host
+      , socket: socket
+      }
+    ))
+    self.sockets[self.sockets.indexOf(socket)] = secureSocket
+    cb(secureSocket)
+  })
+}
+
+
+function mergeOptions(target) {
+  for (var i = 1, len = arguments.length; i < len; ++i) {
+    var overrides = arguments[i]
+    if (typeof overrides === 'object') {
+      var keys = Object.keys(overrides)
+      for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {
+        var k = keys[j]
+        if (overrides[k] !== undefined) {
+          target[k] = overrides[k]
+        }
+      }
+    }
+  }
+  return target
+}
+
+
+var debug
+if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
+  debug = function() {
+    var args = Array.prototype.slice.call(arguments)
+    if (typeof args[0] === 'string') {
+      args[0] = 'TUNNEL: ' + args[0]
+    } else {
+      args.unshift('TUNNEL:')
+    }
+    console.error.apply(console, args)
+  }
+} else {
+  debug = function() {}
+}
+exports.debug = debug // for test
diff --git a/node_modules/tunnel-agent/package.json b/node_modules/tunnel-agent/package.json
new file mode 100644
index 0000000..3f67349
--- /dev/null
+++ b/node_modules/tunnel-agent/package.json
@@ -0,0 +1,55 @@
+{
+  "_from": "tunnel-agent@^0.6.0",
+  "_id": "tunnel-agent@0.6.0",
+  "_inBundle": false,
+  "_integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+  "_location": "/tunnel-agent",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "tunnel-agent@^0.6.0",
+    "name": "tunnel-agent",
+    "escapedName": "tunnel-agent",
+    "rawSpec": "^0.6.0",
+    "saveSpec": null,
+    "fetchSpec": "^0.6.0"
+  },
+  "_requiredBy": [
+    "/prebuild-install"
+  ],
+  "_resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+  "_shasum": "27a5dea06b36b04a0a9966774b290868f0fc40fd",
+  "_spec": "tunnel-agent@^0.6.0",
+  "_where": "F:\\vent-display\\node_modules\\prebuild-install",
+  "author": {
+    "name": "Mikeal Rogers",
+    "email": "mikeal.rogers@gmail.com",
+    "url": "http://www.futurealoof.com"
+  },
+  "bugs": {
+    "url": "https://github.com/mikeal/tunnel-agent/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "safe-buffer": "^5.0.1"
+  },
+  "deprecated": false,
+  "description": "HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module.",
+  "devDependencies": {},
+  "engines": {
+    "node": "*"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/mikeal/tunnel-agent#readme",
+  "license": "Apache-2.0",
+  "main": "index.js",
+  "name": "tunnel-agent",
+  "optionalDependencies": {},
+  "repository": {
+    "url": "git+https://github.com/mikeal/tunnel-agent.git"
+  },
+  "version": "0.6.0"
+}
diff --git a/node_modules/util-deprecate/History.md b/node_modules/util-deprecate/History.md
new file mode 100644
index 0000000..acc8675
--- /dev/null
+++ b/node_modules/util-deprecate/History.md
@@ -0,0 +1,16 @@
+
+1.0.2 / 2015-10-07
+==================
+
+  * use try/catch when checking `localStorage` (#3, @kumavis)
+
+1.0.1 / 2014-11-25
+==================
+
+  * browser: use `console.warn()` for deprecation calls
+  * browser: more jsdocs
+
+1.0.0 / 2014-04-30
+==================
+
+  * initial commit
diff --git a/node_modules/util-deprecate/LICENSE b/node_modules/util-deprecate/LICENSE
new file mode 100644
index 0000000..6a60e8c
--- /dev/null
+++ b/node_modules/util-deprecate/LICENSE
@@ -0,0 +1,24 @@
+(The MIT License)
+
+Copyright (c) 2014 Nathan Rajlich <nathan@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/util-deprecate/README.md b/node_modules/util-deprecate/README.md
new file mode 100644
index 0000000..75622fa
--- /dev/null
+++ b/node_modules/util-deprecate/README.md
@@ -0,0 +1,53 @@
+util-deprecate
+==============
+### The Node.js `util.deprecate()` function with browser support
+
+In Node.js, this module simply re-exports the `util.deprecate()` function.
+
+In the web browser (i.e. via browserify), a browser-specific implementation
+of the `util.deprecate()` function is used.
+
+
+## API
+
+A `deprecate()` function is the only thing exposed by this module.
+
+``` javascript
+// setup:
+exports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead');
+
+
+// users see:
+foo();
+// foo() is deprecated, use bar() instead
+foo();
+foo();
+```
+
+
+## License
+
+(The MIT License)
+
+Copyright (c) 2014 Nathan Rajlich <nathan@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/util-deprecate/browser.js b/node_modules/util-deprecate/browser.js
new file mode 100644
index 0000000..549ae2f
--- /dev/null
+++ b/node_modules/util-deprecate/browser.js
@@ -0,0 +1,67 @@
+
+/**
+ * Module exports.
+ */
+
+module.exports = deprecate;
+
+/**
+ * Mark that a method should not be used.
+ * Returns a modified function which warns once by default.
+ *
+ * If `localStorage.noDeprecation = true` is set, then it is a no-op.
+ *
+ * If `localStorage.throwDeprecation = true` is set, then deprecated functions
+ * will throw an Error when invoked.
+ *
+ * If `localStorage.traceDeprecation = true` is set, then deprecated functions
+ * will invoke `console.trace()` instead of `console.error()`.
+ *
+ * @param {Function} fn - the function to deprecate
+ * @param {String} msg - the string to print to the console when `fn` is invoked
+ * @returns {Function} a new "deprecated" version of `fn`
+ * @api public
+ */
+
+function deprecate (fn, msg) {
+  if (config('noDeprecation')) {
+    return fn;
+  }
+
+  var warned = false;
+  function deprecated() {
+    if (!warned) {
+      if (config('throwDeprecation')) {
+        throw new Error(msg);
+      } else if (config('traceDeprecation')) {
+        console.trace(msg);
+      } else {
+        console.warn(msg);
+      }
+      warned = true;
+    }
+    return fn.apply(this, arguments);
+  }
+
+  return deprecated;
+}
+
+/**
+ * Checks `localStorage` for boolean values for the given `name`.
+ *
+ * @param {String} name
+ * @returns {Boolean}
+ * @api private
+ */
+
+function config (name) {
+  // accessing global.localStorage can trigger a DOMException in sandboxed iframes
+  try {
+    if (!global.localStorage) return false;
+  } catch (_) {
+    return false;
+  }
+  var val = global.localStorage[name];
+  if (null == val) return false;
+  return String(val).toLowerCase() === 'true';
+}
diff --git a/node_modules/util-deprecate/node.js b/node_modules/util-deprecate/node.js
new file mode 100644
index 0000000..5e6fcff
--- /dev/null
+++ b/node_modules/util-deprecate/node.js
@@ -0,0 +1,6 @@
+
+/**
+ * For Node.js, simply re-export the core `util.deprecate` function.
+ */
+
+module.exports = require('util').deprecate;
diff --git a/node_modules/util-deprecate/package.json b/node_modules/util-deprecate/package.json
new file mode 100644
index 0000000..32548d0
--- /dev/null
+++ b/node_modules/util-deprecate/package.json
@@ -0,0 +1,58 @@
+{
+  "_from": "util-deprecate@~1.0.1",
+  "_id": "util-deprecate@1.0.2",
+  "_inBundle": false,
+  "_integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+  "_location": "/util-deprecate",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "util-deprecate@~1.0.1",
+    "name": "util-deprecate",
+    "escapedName": "util-deprecate",
+    "rawSpec": "~1.0.1",
+    "saveSpec": null,
+    "fetchSpec": "~1.0.1"
+  },
+  "_requiredBy": [
+    "/bl/readable-stream",
+    "/readable-stream",
+    "/tar-stream/readable-stream"
+  ],
+  "_resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+  "_shasum": "450d4dc9fa70de732762fbd2d4a28981419a0ccf",
+  "_spec": "util-deprecate@~1.0.1",
+  "_where": "F:\\vent-display\\node_modules\\readable-stream",
+  "author": {
+    "name": "Nathan Rajlich",
+    "email": "nathan@tootallnate.net",
+    "url": "http://n8.io/"
+  },
+  "browser": "browser.js",
+  "bugs": {
+    "url": "https://github.com/TooTallNate/util-deprecate/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "The Node.js `util.deprecate()` function with browser support",
+  "homepage": "https://github.com/TooTallNate/util-deprecate",
+  "keywords": [
+    "util",
+    "deprecate",
+    "browserify",
+    "browser",
+    "node"
+  ],
+  "license": "MIT",
+  "main": "node.js",
+  "name": "util-deprecate",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/TooTallNate/util-deprecate.git"
+  },
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "version": "1.0.2"
+}
diff --git a/node_modules/which-pm-runs/LICENSE b/node_modules/which-pm-runs/LICENSE
new file mode 100644
index 0000000..7413e1f
--- /dev/null
+++ b/node_modules/which-pm-runs/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2017 Zoltan Kochan
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/which-pm-runs/README.md b/node_modules/which-pm-runs/README.md
new file mode 100644
index 0000000..d1a2755
--- /dev/null
+++ b/node_modules/which-pm-runs/README.md
@@ -0,0 +1,29 @@
+# which-pm-runs
+
+> Detects what package manager executes the process
+
+[![npm version](https://img.shields.io/npm/v/which-pm-runs.svg)](https://www.npmjs.com/package/which-pm-runs) [![Build Status](https://img.shields.io/travis/zkochan/which-pm-runs/master.svg)](https://travis-ci.org/zkochan/which-pm-runs)
+
+## Installation
+
+```
+npm i which-pm-runs
+```
+
+## Usage
+
+```js
+'use strict'
+const whichPMRuns = require('which-pm-runs')
+
+whichPMRuns()
+//> {name: "pnpm", version: "0.64.2"}
+```
+
+## Related
+
+* [which-pm](https://github.com/zkochan/which-pm) - Detects what package manager was used for installation
+
+## License
+
+[MIT](LICENSE) © [Zoltan Kochan](http://kochan.io)
diff --git a/node_modules/which-pm-runs/index.js b/node_modules/which-pm-runs/index.js
new file mode 100644
index 0000000..6bc0b21
--- /dev/null
+++ b/node_modules/which-pm-runs/index.js
@@ -0,0 +1,17 @@
+'use strict'
+
+module.exports = function () {
+  if (!process.env.npm_config_user_agent) {
+    return undefined
+  }
+  return pmFromUserAgent(process.env.npm_config_user_agent)
+}
+
+function pmFromUserAgent (userAgent) {
+  const pmSpec = userAgent.split(' ')[0]
+  const separatorPos = pmSpec.lastIndexOf('/')
+  return {
+    name: pmSpec.substr(0, separatorPos),
+    version: pmSpec.substr(separatorPos + 1)
+  }
+}
diff --git a/node_modules/which-pm-runs/package.json b/node_modules/which-pm-runs/package.json
new file mode 100644
index 0000000..8e70c94
--- /dev/null
+++ b/node_modules/which-pm-runs/package.json
@@ -0,0 +1,61 @@
+{
+  "_from": "which-pm-runs@^1.0.0",
+  "_id": "which-pm-runs@1.0.0",
+  "_inBundle": false,
+  "_integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
+  "_location": "/which-pm-runs",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "which-pm-runs@^1.0.0",
+    "name": "which-pm-runs",
+    "escapedName": "which-pm-runs",
+    "rawSpec": "^1.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.0"
+  },
+  "_requiredBy": [
+    "/prebuild-install"
+  ],
+  "_resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
+  "_shasum": "670b3afbc552e0b55df6b7780ca74615f23ad1cb",
+  "_spec": "which-pm-runs@^1.0.0",
+  "_where": "F:\\vent-display\\node_modules\\prebuild-install",
+  "author": {
+    "name": "Zoltan Kochan"
+  },
+  "bugs": {
+    "url": "https://github.com/zkochan/which-pm-runs/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Detects what package manager executes the process",
+  "devDependencies": {
+    "execa": "^0.6.3",
+    "npm": "^4.4.4",
+    "pnpm": "^0.64.3",
+    "tape": "^4.6.3",
+    "yarn": "^0.22.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/zkochan/which-pm-runs#readme",
+  "keywords": [
+    "npm",
+    "pnpm",
+    "yarn"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "which-pm-runs",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/zkochan/which-pm-runs.git"
+  },
+  "scripts": {
+    "test": "tape test"
+  },
+  "version": "1.0.0"
+}
diff --git a/node_modules/wide-align/LICENSE b/node_modules/wide-align/LICENSE
new file mode 100644
index 0000000..f4be44d
--- /dev/null
+++ b/node_modules/wide-align/LICENSE
@@ -0,0 +1,14 @@
+Copyright (c) 2015, Rebecca Turner <me@re-becca.org>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
diff --git a/node_modules/wide-align/README.md b/node_modules/wide-align/README.md
new file mode 100644
index 0000000..32f1be0
--- /dev/null
+++ b/node_modules/wide-align/README.md
@@ -0,0 +1,47 @@
+wide-align
+----------
+
+A wide-character aware text alignment function for use in terminals / on the
+console.
+
+### Usage
+
+```
+var align = require('wide-align')
+
+// Note that if you view this on a unicode console, all of the slashes are
+// aligned. This is because on a console, all narrow characters are
+// an en wide and all wide characters are an em. In browsers, this isn't
+// held to and wide characters like "古" can be less than two narrow
+// characters even with a fixed width font.
+
+console.log(align.center('abc', 10))     // '   abc    '
+console.log(align.center('古古古', 10))  // '  古古古  '
+console.log(align.left('abc', 10))       // 'abc       '
+console.log(align.left('古古古', 10))    // '古古古    '
+console.log(align.right('abc', 10))      // '       abc'
+console.log(align.right('古古古', 10))   // '    古古古'
+```
+
+### Functions
+
+#### `align.center(str, length)` → `str`
+
+Returns *str* with spaces added to both sides such that that it is *length*
+chars long and centered in the spaces.
+
+#### `align.left(str, length)` → `str`
+
+Returns *str* with spaces to the right such that it is *length* chars long.
+
+### `align.right(str, length)` → `str`
+
+Returns *str* with spaces to the left such that it is *length* chars long.
+
+### Origins
+
+These functions were originally taken from 
+[cliui](https://npmjs.com/package/cliui). Changes include switching to the
+MUCH faster pad generation function from
+[lodash](https://npmjs.com/package/lodash), making center alignment pad
+both sides and adding left alignment.
diff --git a/node_modules/wide-align/align.js b/node_modules/wide-align/align.js
new file mode 100644
index 0000000..4f94ca4
--- /dev/null
+++ b/node_modules/wide-align/align.js
@@ -0,0 +1,65 @@
+'use strict'
+var stringWidth = require('string-width')
+
+exports.center = alignCenter
+exports.left = alignLeft
+exports.right = alignRight
+
+// lodash's way of generating pad characters.
+
+function createPadding (width) {
+  var result = ''
+  var string = ' '
+  var n = width
+  do {
+    if (n % 2) {
+      result += string;
+    }
+    n = Math.floor(n / 2);
+    string += string;
+  } while (n);
+
+  return result;
+}
+
+function alignLeft (str, width) {
+  var trimmed = str.trimRight()
+  if (trimmed.length === 0 && str.length >= width) return str
+  var padding = ''
+  var strWidth = stringWidth(trimmed)
+
+  if (strWidth < width) {
+    padding = createPadding(width - strWidth)
+  }
+
+  return trimmed + padding
+}
+
+function alignRight (str, width) {
+  var trimmed = str.trimLeft()
+  if (trimmed.length === 0 && str.length >= width) return str
+  var padding = ''
+  var strWidth = stringWidth(trimmed)
+
+  if (strWidth < width) {
+    padding = createPadding(width - strWidth)
+  }
+
+  return padding + trimmed
+}
+
+function alignCenter (str, width) {
+  var trimmed = str.trim()
+  if (trimmed.length === 0 && str.length >= width) return str
+  var padLeft = ''
+  var padRight = ''
+  var strWidth = stringWidth(trimmed)
+
+  if (strWidth < width) {
+    var padLeftBy = parseInt((width - strWidth) / 2, 10) 
+    padLeft = createPadding(padLeftBy)
+    padRight = createPadding(width - (strWidth + padLeftBy))
+  }
+
+  return padLeft + trimmed + padRight
+}
diff --git a/node_modules/wide-align/package.json b/node_modules/wide-align/package.json
new file mode 100644
index 0000000..a5fd625
--- /dev/null
+++ b/node_modules/wide-align/package.json
@@ -0,0 +1,66 @@
+{
+  "_from": "wide-align@^1.1.0",
+  "_id": "wide-align@1.1.3",
+  "_inBundle": false,
+  "_integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+  "_location": "/wide-align",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "wide-align@^1.1.0",
+    "name": "wide-align",
+    "escapedName": "wide-align",
+    "rawSpec": "^1.1.0",
+    "saveSpec": null,
+    "fetchSpec": "^1.1.0"
+  },
+  "_requiredBy": [
+    "/gauge"
+  ],
+  "_resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+  "_shasum": "ae074e6bdc0c14a431e804e624549c633b000457",
+  "_spec": "wide-align@^1.1.0",
+  "_where": "F:\\vent-display\\node_modules\\gauge",
+  "author": {
+    "name": "Rebecca Turner",
+    "email": "me@re-becca.org",
+    "url": "http://re-becca.org/"
+  },
+  "bugs": {
+    "url": "https://github.com/iarna/wide-align/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "string-width": "^1.0.2 || 2"
+  },
+  "deprecated": false,
+  "description": "A wide-character aware text alignment function for use on the console or with fixed width fonts.",
+  "devDependencies": {
+    "tap": "10 || 11 || 12"
+  },
+  "files": [
+    "align.js"
+  ],
+  "homepage": "https://github.com/iarna/wide-align#readme",
+  "keywords": [
+    "wide",
+    "double",
+    "unicode",
+    "cjkv",
+    "pad",
+    "align"
+  ],
+  "license": "ISC",
+  "main": "align.js",
+  "name": "wide-align",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/iarna/wide-align.git"
+  },
+  "scripts": {
+    "test": "tap --coverage test/*.js",
+    "version": "perl -pi -e 's/^(  \"version\": $ENV{npm_config_node_version}\").*?\",/$1abc\",/' package-lock.json ; git add package-lock.json"
+  },
+  "version": "1.1.3"
+}
diff --git a/node_modules/wrappy/LICENSE b/node_modules/wrappy/LICENSE
new file mode 100644
index 0000000..19129e3
--- /dev/null
+++ b/node_modules/wrappy/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/wrappy/README.md b/node_modules/wrappy/README.md
new file mode 100644
index 0000000..98eab25
--- /dev/null
+++ b/node_modules/wrappy/README.md
@@ -0,0 +1,36 @@
+# wrappy
+
+Callback wrapping utility
+
+## USAGE
+
+```javascript
+var wrappy = require("wrappy")
+
+// var wrapper = wrappy(wrapperFunction)
+
+// make sure a cb is called only once
+// See also: http://npm.im/once for this specific use case
+var once = wrappy(function (cb) {
+  var called = false
+  return function () {
+    if (called) return
+    called = true
+    return cb.apply(this, arguments)
+  }
+})
+
+function printBoo () {
+  console.log('boo')
+}
+// has some rando property
+printBoo.iAmBooPrinter = true
+
+var onlyPrintOnce = once(printBoo)
+
+onlyPrintOnce() // prints 'boo'
+onlyPrintOnce() // does nothing
+
+// random property is retained!
+assert.equal(onlyPrintOnce.iAmBooPrinter, true)
+```
diff --git a/node_modules/wrappy/package.json b/node_modules/wrappy/package.json
new file mode 100644
index 0000000..bc08878
--- /dev/null
+++ b/node_modules/wrappy/package.json
@@ -0,0 +1,58 @@
+{
+  "_from": "wrappy@1",
+  "_id": "wrappy@1.0.2",
+  "_inBundle": false,
+  "_integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+  "_location": "/wrappy",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "wrappy@1",
+    "name": "wrappy",
+    "escapedName": "wrappy",
+    "rawSpec": "1",
+    "saveSpec": null,
+    "fetchSpec": "1"
+  },
+  "_requiredBy": [
+    "/once"
+  ],
+  "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+  "_shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f",
+  "_spec": "wrappy@1",
+  "_where": "F:\\vent-display\\node_modules\\once",
+  "author": {
+    "name": "Isaac Z. Schlueter",
+    "email": "i@izs.me",
+    "url": "http://blog.izs.me/"
+  },
+  "bugs": {
+    "url": "https://github.com/npm/wrappy/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {},
+  "deprecated": false,
+  "description": "Callback wrapping utility",
+  "devDependencies": {
+    "tap": "^2.3.1"
+  },
+  "directories": {
+    "test": "test"
+  },
+  "files": [
+    "wrappy.js"
+  ],
+  "homepage": "https://github.com/npm/wrappy",
+  "license": "ISC",
+  "main": "wrappy.js",
+  "name": "wrappy",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/npm/wrappy.git"
+  },
+  "scripts": {
+    "test": "tap --coverage test/*.js"
+  },
+  "version": "1.0.2"
+}
diff --git a/node_modules/wrappy/wrappy.js b/node_modules/wrappy/wrappy.js
new file mode 100644
index 0000000..bb7e7d6
--- /dev/null
+++ b/node_modules/wrappy/wrappy.js
@@ -0,0 +1,33 @@
+// Returns a wrapper function that returns a wrapped callback
+// The wrapper function should do some stuff, and return a
+// presumably different callback function.
+// This makes sure that own properties are retained, so that
+// decorations and such are not lost along the way.
+module.exports = wrappy
+function wrappy (fn, cb) {
+  if (fn && cb) return wrappy(fn)(cb)
+
+  if (typeof fn !== 'function')
+    throw new TypeError('need wrapper function')
+
+  Object.keys(fn).forEach(function (k) {
+    wrapper[k] = fn[k]
+  })
+
+  return wrapper
+
+  function wrapper() {
+    var args = new Array(arguments.length)
+    for (var i = 0; i < args.length; i++) {
+      args[i] = arguments[i]
+    }
+    var ret = fn.apply(this, args)
+    var cb = args[args.length-1]
+    if (typeof ret === 'function' && ret !== cb) {
+      Object.keys(cb).forEach(function (k) {
+        ret[k] = cb[k]
+      })
+    }
+    return ret
+  }
+}
diff --git a/server.js b/server.js
new file mode 100644
index 0000000..14013c0
--- /dev/null
+++ b/server.js
@@ -0,0 +1,44 @@
+var http = require('http'); // Import Node.js core module
+const SerialPort = require('serialport'); //https://serialport.io/docs/guide-usage
+const Readline = require('@serialport/parser-readline');
+
+const port = new SerialPort('COM4', { baudRate: 9600 });
+const parser = port.pipe(new Readline());// Read the port data
+	
+port.on("open", () => {
+  console.log('serial port open');
+});
+
+// Open errors will be emitted as an error event
+port.on('error', function(err) {
+  console.log('Error: ', err.message)
+})
+
+parser.on('data', data =>{
+  console.log(data);
+});
+
+
+var server = http.createServer(function (req, res) {   //create web server
+    if (req.url == '/') { //check the URL of the current request
+        port.write('testing testing hello ben\n', (err) => {
+			if (err) {
+			  return console.log('Error on write: ', err.message);
+			}
+		});
+        // set response header
+        res.writeHead(200, { 'Content-Type': 'text/html' }); 
+        
+        // set response content    
+        res.write('<html><body><p>Sending message via serial!</p></body></html>');
+        res.end();
+    
+    }
+    else
+        res.end('Invalid Request!');
+
+});
+
+server.listen(5000); //6 - listen for any incoming requests
+
+console.log('Node.js web server at port 5000 is running..')
\ No newline at end of file
diff --git a/simple_serial/simple_serial.ino b/simple_serial/simple_serial.ino
new file mode 100644
index 0000000..1888185
--- /dev/null
+++ b/simple_serial/simple_serial.ino
@@ -0,0 +1,16 @@
+const byte DATA_MAX_SIZE = 32;
+char data[DATA_MAX_SIZE];
+static char endMarker = '\n'; // message separator
+char c;
+
+void setup() {
+  Serial.begin(9600);
+  memset(data, 33, sizeof(data)); 
+}
+
+void loop() {
+  if (Serial.available() > 0){
+    c = Serial.read();
+    Serial.print(c); 
+  }
+}
-- 
GitLab