Update Puppeteer to v3.0.3

DISABLE_THIRD_PARTY_CHECK=update Puppeteer

Also-By: tvanderlippe@chromium.org
Change-Id: I4ddb6a2b426bcde95f9b764790e88b560441225c
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2187209
Commit-Queue: Mathias Bynens <mathias@chromium.org>
Reviewed-by: Tim van der Lippe <tvanderlippe@chromium.org>
Reviewed-by: Paul Lewis <aerotwist@chromium.org>
diff --git a/node_modules/@types/mime-types/LICENSE b/node_modules/@types/mime-types/LICENSE
new file mode 100644
index 0000000..2107107
--- /dev/null
+++ b/node_modules/@types/mime-types/LICENSE
@@ -0,0 +1,21 @@
+    MIT License
+
+    Copyright (c) Microsoft Corporation. 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/@types/mime-types/README.md b/node_modules/@types/mime-types/README.md
new file mode 100644
index 0000000..faf9f5b
--- /dev/null
+++ b/node_modules/@types/mime-types/README.md
@@ -0,0 +1,16 @@
+# Installation
+> `npm install --save @types/mime-types`
+
+# Summary
+This package contains type definitions for mime-types (https://github.com/jshttp/mime-types#readme).
+
+# Details
+Files were exported from https://www.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/mime-types
+
+Additional Details
+ * Last updated: Tue, 18 Apr 2017 15:04:41 GMT
+ * Dependencies: none
+ * Global values: none
+
+# Credits
+These definitions were written by Gyusun Yeom <https://github.com/Perlmint>.
diff --git a/node_modules/@types/mime-types/index.d.ts b/node_modules/@types/mime-types/index.d.ts
new file mode 100644
index 0000000..7be0867
--- /dev/null
+++ b/node_modules/@types/mime-types/index.d.ts
@@ -0,0 +1,11 @@
+// Type definitions for mime-types 2.1
+// Project: https://github.com/jshttp/mime-types#readme
+// Definitions by: Gyusun Yeom <https://github.com/Perlmint>
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+export function lookup(filenameOrExt: string): string | false;
+export function contentType(filenameOrExt: string): string | false;
+export function extension(typeString: string): string | false;
+export function charset(typeString: string): string | false;
+export const types: {[key: string]: string};
+export const extensions: {[key: string]: string[]};
diff --git a/node_modules/@types/mime-types/package.json b/node_modules/@types/mime-types/package.json
new file mode 100644
index 0000000..b686436
--- /dev/null
+++ b/node_modules/@types/mime-types/package.json
@@ -0,0 +1,22 @@
+{
+  "contributors": [
+    {
+      "name": "Gyusun Yeom",
+      "url": "https://github.com/Perlmint"
+    }
+  ],
+  "dependencies": {},
+  "description": "TypeScript definitions for mime-types",
+  "license": "MIT",
+  "main": "",
+  "name": "@types/mime-types",
+  "peerDependencies": {},
+  "repository": {
+    "type": "git",
+    "url": "https://www.github.com/DefinitelyTyped/DefinitelyTyped.git"
+  },
+  "scripts": {},
+  "typeScriptVersion": "2.0",
+  "typesPublisherContentHash": "cd2abb8b2c08b67c17bc1759892e2bad498bcde36e48d21d5390cf46d6138bf9",
+  "version": "2.1.0"
+}
\ No newline at end of file
diff --git a/node_modules/@types/yauzl/LICENSE b/node_modules/@types/yauzl/LICENSE
new file mode 100644
index 0000000..2107107
--- /dev/null
+++ b/node_modules/@types/yauzl/LICENSE
@@ -0,0 +1,21 @@
+    MIT License
+
+    Copyright (c) Microsoft Corporation. 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/@types/yauzl/README.md b/node_modules/@types/yauzl/README.md
new file mode 100644
index 0000000..f38f9c0
--- /dev/null
+++ b/node_modules/@types/yauzl/README.md
@@ -0,0 +1,16 @@
+# Installation
+> `npm install --save @types/yauzl`
+
+# Summary
+This package contains type definitions for yauzl (https://github.com/thejoshwolfe/yauzl).
+
+# Details
+Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/yauzl
+
+Additional Details
+ * Last updated: Wed, 02 Jan 2019 20:27:45 GMT
+ * Dependencies: @types/node
+ * Global values: none
+
+# Credits
+These definitions were written by Florian Keller <https://github.com/ffflorian>.
diff --git a/node_modules/@types/yauzl/index.d.ts b/node_modules/@types/yauzl/index.d.ts
new file mode 100644
index 0000000..11c1849
--- /dev/null
+++ b/node_modules/@types/yauzl/index.d.ts
@@ -0,0 +1,98 @@
+// Type definitions for yauzl 2.9
+// Project: https://github.com/thejoshwolfe/yauzl
+// Definitions by: Florian Keller <https://github.com/ffflorian>
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+/// <reference types="node" />
+
+import { EventEmitter } from 'events';
+import { Readable } from 'stream';
+
+export abstract class RandomAccessReader extends EventEmitter {
+    _readStreamForRange(start: number, end: number): void;
+    createReadStream(options: { start: number; end: number }): void;
+    read(buffer: Buffer, offset: number, length: number, position: number, callback: (err?: Error) => void): void;
+    close(callback: (err?: Error) => void): void;
+}
+
+export class Entry {
+    comment: string;
+    compressedSize: number;
+    compressionMethod: number;
+    crc32: number;
+    externalFileAttributes: number;
+    extraFieldLength: number;
+    extraFields: Array<{ id: number; data: Buffer }>;
+    fileCommentLength: number;
+    fileName: string;
+    fileNameLength: number;
+    generalPurposeBitFlag: number;
+    internalFileAttributes: number;
+    lastModFileDate: number;
+    lastModFileTime: number;
+    relativeOffsetOfLocalHeader: number;
+    uncompressedSize: number;
+    versionMadeBy: number;
+    versionNeededToExtract: number;
+
+    getLastModDate(): Date;
+    isEncrypted(): boolean;
+    isCompressed(): boolean;
+}
+
+export interface ZipFileOptions {
+    decompress: boolean | null;
+    decrypt: boolean | null;
+    start: number | null;
+    end: number | null;
+}
+
+export class ZipFile extends EventEmitter {
+    autoClose: boolean;
+    comment: string;
+    decodeStrings: boolean;
+    emittedError: boolean;
+    entriesRead: number;
+    entryCount: number;
+    fileSize: number;
+    isOpen: boolean;
+    lazyEntries: boolean;
+    readEntryCursor: boolean;
+    validateEntrySizes: boolean;
+
+    constructor(
+        reader: RandomAccessReader,
+        centralDirectoryOffset: number,
+        fileSize: number,
+        entryCount: number,
+        comment: string,
+        autoClose: boolean,
+        lazyEntries: boolean,
+        decodeStrings: boolean,
+        validateEntrySizes: boolean,
+    );
+
+    openReadStream(entry: Entry, options: ZipFileOptions, callback: (err?: Error, stream?: Readable) => void): void;
+    openReadStream(entry: Entry, callback: (err?: Error, stream?: Readable) => void): void;
+    close(): void;
+    readEntry(): void;
+}
+
+export interface Options {
+    autoClose?: boolean;
+    lazyEntries?: boolean;
+    decodeStrings?: boolean;
+    validateEntrySizes?: boolean;
+    strictFileNames?: boolean;
+}
+
+export function open(path: string, options: Options, callback?: (err?: Error, zipfile?: ZipFile) => void): void;
+export function open(path: string, callback?: (err?: Error, zipfile?: ZipFile) => void): void;
+export function fromFd(fd: number, options: Options, callback?: (err?: Error, zipfile?: ZipFile) => void): void;
+export function fromFd(fd: number, callback?: (err?: Error, zipfile?: ZipFile) => void): void;
+export function fromBuffer(buffer: Buffer, options: Options, callback?: (err?: Error, zipfile?: ZipFile) => void): void;
+export function fromBuffer(buffer: Buffer, callback?: (err?: Error, zipfile?: ZipFile) => void): void;
+export function fromRandomAccessReader(reader: RandomAccessReader, totalSize: number, options: Options, callback: (err?: Error, zipfile?: ZipFile) => void): void;
+export function fromRandomAccessReader(reader: RandomAccessReader, totalSize: number, callback: (err?: Error, zipfile?: ZipFile) => void): void;
+export function dosDateTimeToDate(date: number, time: number): Date;
+export function validateFileName(fileName: string): string | null;
diff --git a/node_modules/@types/yauzl/package.json b/node_modules/@types/yauzl/package.json
new file mode 100644
index 0000000..9e34925
--- /dev/null
+++ b/node_modules/@types/yauzl/package.json
@@ -0,0 +1,25 @@
+{
+  "contributors": [
+    {
+      "githubUsername": "ffflorian",
+      "name": "Florian Keller",
+      "url": "https://github.com/ffflorian"
+    }
+  ],
+  "dependencies": {
+    "@types/node": "*"
+  },
+  "description": "TypeScript definitions for yauzl",
+  "license": "MIT",
+  "main": "",
+  "name": "@types/yauzl",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git"
+  },
+  "scripts": {},
+  "typeScriptVersion": "2.0",
+  "types": "index",
+  "typesPublisherContentHash": "78f765e4caa71766b61010d584b87ea4cf34e0bac10cac6b16d722d8a8456073",
+  "version": "2.9.1"
+}
\ No newline at end of file
diff --git a/node_modules/agent-base/.travis.yml b/node_modules/agent-base/.travis.yml
deleted file mode 100644
index 7620095..0000000
--- a/node_modules/agent-base/.travis.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-sudo: false
-
-language: node_js
-
-node_js:
-  - "4"
-  - "5"
-  - "6"
-  - "7"
-  - "8"
-  - "9"
-  - "10"
-
-install:
-  - PATH="`npm bin`:`npm bin -g`:$PATH"
-  # 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/agent-base/History.md b/node_modules/agent-base/History.md
deleted file mode 100644
index 80c88dc..0000000
--- a/node_modules/agent-base/History.md
+++ /dev/null
@@ -1,113 +0,0 @@
-
-4.2.0 / 2018-01-15
-==================
-
-  * Add support for returning an `http.Agent` instance
-  * Optimize promisifying logic
-  * Set `timeout` to null for proper cleanup
-  * Remove Node.js <= 0.11.3 special-casing from test case
-
-4.1.2 / 2017-11-20
-==================
-
-  * test Node 9 on Travis
-  * ensure that `https.get()` uses the patched `https.request()`
-
-4.1.1 / 2017-07-20
-==================
-
-  * Correct `https.request()` with a String (#9)
-
-4.1.0 / 2017-06-26
-==================
-
-  * mix in Agent options into Request options
-  * throw when nothing is returned from agent-base callback
-  * do not modify the options object for https requests
-
-4.0.1 / 2017-06-13
-==================
-
-  * add `this` context tests and fixes
-
-4.0.0 / 2017-06-06
-==================
-
-  * drop support for Node.js < 4
-  * drop old versions of Node.js from Travis-CI
-  * specify Node.js >= 4.0.0 in `engines.node`
-  * remove more old code
-  * remove "extend" dependency
-  * remove "semver" dependency
-  * make the Promise logic a bit cleaner
-  * add async function pseudo-example to README
-  * use direct return in README example
-
-3.0.0 / 2017-06-02
-==================
-
-  * drop support for Node.js v0.8 and v0.10
-  * add support for async, Promises, and direct return
-  * add a couple `options` test cases
-  * implement a `"timeout"` option
-  * rename main file to `index.js`
-  * test Node 8 on Travis
-
-2.1.1 / 2017-05-30
-==================
-
-  * Revert [`fe2162e`](https://github.com/TooTallNate/node-agent-base/commit/fe2162e0ba18123f5b301cba4de1e9dd74e437cd) and [`270bdc9`](https://github.com/TooTallNate/node-agent-base/commit/270bdc92eb8e3bd0444d1e5266e8e9390aeb3095) (fixes #7)
-
-2.1.0 / 2017-05-26
-==================
-
-  * unref is not supported for node < 0.9.1 (@pi0)
-  * add tests to dangling socket (@pi0)
-  * check unref() is supported (@pi0)
-  * fix dangling sockets problem (@pi0)
-  * add basic "ws" module tests
-  * make `Agent` be subclassable
-  * turn `addRequest()` into a named function
-  * test: Node.js v4 likes to call `cork` on the stream (#3, @tomhughes)
-  * travis: test node v4, v5, v6 and v7
-
-2.0.1 / 2015-09-10
-==================
-
-  * package: update "semver" to v5.0.1 for WebPack (#1, @vhpoet)
-
-2.0.0 / 2015-07-10
-==================
-
-  * refactor to patch Node.js core for more consistent `opts` values
-  * ensure that HTTP(s) default port numbers are always given
-  * test: use ssl-cert-snakeoil SSL certs
-  * test: add tests for arbitrary options
-  * README: add API section
-  * README: make the Agent HTTP/HTTPS generic in the example
-  * README: use SVG for Travis-CI badge
-
-1.0.2 / 2015-06-27
-==================
-
-  * agent: set `req._hadError` to true after emitting "error"
-  * package: update "mocha" to v2
-  * test: add artificial HTTP GET request test
-  * test: add artificial data events test
-  * test: fix artifical GET response test on node > v0.11.3
-  * test: use a real timeout for the async error test
-
-1.0.1 / 2013-09-09
-==================
-
-  * Fix passing an "error" object to the callback function on the first tick
-
-1.0.0 / 2013-09-09
-==================
-
-  * New API: now you pass a callback function directly
-
-0.0.1 / 2013-07-09
-==================
-
-  * Initial release
diff --git a/node_modules/agent-base/README.md b/node_modules/agent-base/README.md
index dbeceab..d791f00 100644
--- a/node_modules/agent-base/README.md
+++ b/node_modules/agent-base/README.md
@@ -1,7 +1,7 @@
 agent-base
 ==========
 ### Turn a function into an [`http.Agent`][http.Agent] instance
-[![Build Status](https://travis-ci.org/TooTallNate/node-agent-base.svg?branch=master)](https://travis-ci.org/TooTallNate/node-agent-base)
+[![Build Status](https://github.com/TooTallNate/node-agent-base/workflows/Node%20CI/badge.svg)](https://github.com/TooTallNate/node-agent-base/actions?workflow=Node+CI)
 
 This module provides an `http.Agent` generator. That is, you pass it an async
 callback function, and it returns a new `http.Agent` instance that will invoke the
diff --git a/node_modules/agent-base/dist/src/index.d.ts b/node_modules/agent-base/dist/src/index.d.ts
new file mode 100644
index 0000000..28fb567
--- /dev/null
+++ b/node_modules/agent-base/dist/src/index.d.ts
@@ -0,0 +1,63 @@
+/// <reference types="node" />
+import net from 'net';
+import http from 'http';
+import { EventEmitter } from 'events';
+declare function createAgent(opts?: createAgent.AgentOptions): createAgent.Agent;
+declare namespace createAgent {
+    var prototype: Agent;
+}
+declare function createAgent(callback: createAgent.AgentCallback, opts?: createAgent.AgentOptions): createAgent.Agent;
+declare namespace createAgent {
+    var prototype: Agent;
+}
+declare namespace createAgent {
+    type ClientRequest = http.ClientRequest & {
+        _last?: boolean;
+        _hadError?: boolean;
+        method: string;
+    };
+    type AgentCallbackReturn = net.Socket | createAgent.Agent | http.Agent;
+    type AgentCallbackCallback = (err: Error | null | undefined, socket: createAgent.AgentCallbackReturn) => void;
+    type AgentCallbackPromise = (req: createAgent.ClientRequest, opts: createAgent.RequestOptions) => createAgent.AgentCallbackReturn | Promise<createAgent.AgentCallbackReturn>;
+    type AgentCallback = typeof Agent.prototype.callback;
+    type AgentOptions = http.AgentOptions & {};
+    type RequestOptions = http.RequestOptions & {
+        port: number;
+        secureEndpoint: boolean;
+    };
+    /**
+     * Base `http.Agent` implementation.
+     * No pooling/keep-alive is implemented by default.
+     *
+     * @param {Function} callback
+     * @api public
+     */
+    class Agent extends EventEmitter {
+        timeout: number | null;
+        options?: createAgent.AgentOptions;
+        maxFreeSockets: number;
+        maxSockets: number;
+        sockets: net.Socket[];
+        requests: http.ClientRequest[];
+        private promisifiedCallback?;
+        private explicitDefaultPort?;
+        private explicitProtocol?;
+        constructor(callback?: createAgent.AgentCallback | createAgent.AgentOptions, _opts?: createAgent.AgentOptions);
+        get defaultPort(): number;
+        set defaultPort(v: number);
+        get protocol(): string;
+        set protocol(v: string);
+        callback(req: createAgent.ClientRequest, opts: createAgent.RequestOptions, fn: createAgent.AgentCallbackCallback): void;
+        callback(req: createAgent.ClientRequest, opts: createAgent.RequestOptions): createAgent.AgentCallbackReturn | Promise<createAgent.AgentCallbackReturn>;
+        /**
+         * Called by node-core's "_http_client.js" module when creating
+         * a new HTTP request with this Agent instance.
+         *
+         * @api public
+         */
+        addRequest(req: ClientRequest, _opts: RequestOptions): void;
+        freeSocket(socket: net.Socket, opts: AgentOptions): void;
+        destroy(): void;
+    }
+}
+export = createAgent;
diff --git a/node_modules/agent-base/dist/src/index.js b/node_modules/agent-base/dist/src/index.js
new file mode 100644
index 0000000..788deca
--- /dev/null
+++ b/node_modules/agent-base/dist/src/index.js
@@ -0,0 +1,206 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+const events_1 = require("events");
+const promisify_1 = __importDefault(require("./promisify"));
+function isAgentBase(v) {
+    return Boolean(v) && typeof v.addRequest === 'function';
+}
+function isHttpAgent(v) {
+    return Boolean(v) && typeof v.addRequest === 'function';
+}
+function isSecureEndpoint() {
+    const { stack } = new Error();
+    if (typeof stack !== 'string')
+        return false;
+    return stack.split('\n').some(l => l.indexOf('(https.js:') !== -1);
+}
+function createAgent(callback, opts) {
+    return new createAgent.Agent(callback, opts);
+}
+(function (createAgent) {
+    /**
+     * Base `http.Agent` implementation.
+     * No pooling/keep-alive is implemented by default.
+     *
+     * @param {Function} callback
+     * @api public
+     */
+    class Agent extends events_1.EventEmitter {
+        constructor(callback, _opts) {
+            super();
+            // The callback gets promisified lazily
+            this.promisifiedCallback = undefined;
+            let opts = _opts;
+            if (typeof callback === 'function') {
+                this.callback = callback;
+            }
+            else if (callback) {
+                opts = callback;
+            }
+            // timeout for the socket to be returned from the callback
+            this.timeout = null;
+            if (opts && typeof opts.timeout === 'number') {
+                this.timeout = opts.timeout;
+            }
+            this.options = opts || {};
+            this.maxFreeSockets = 1;
+            this.maxSockets = 1;
+            this.sockets = [];
+            this.requests = [];
+        }
+        get defaultPort() {
+            if (typeof this.explicitDefaultPort === 'number') {
+                return this.explicitDefaultPort;
+            }
+            else {
+                return isSecureEndpoint() ? 443 : 80;
+            }
+        }
+        set defaultPort(v) {
+            this.explicitDefaultPort = v;
+        }
+        get protocol() {
+            if (typeof this.explicitProtocol === 'string') {
+                return this.explicitProtocol;
+            }
+            else {
+                return isSecureEndpoint() ? 'https:' : 'http:';
+            }
+        }
+        set protocol(v) {
+            this.explicitProtocol = v;
+        }
+        callback(req, opts, fn) {
+            throw new Error('"agent-base" has no default implementation, you must subclass and override `callback()`');
+        }
+        /**
+         * Called by node-core's "_http_client.js" module when creating
+         * a new HTTP request with this Agent instance.
+         *
+         * @api public
+         */
+        addRequest(req, _opts) {
+            const ownOpts = Object.assign({}, _opts);
+            if (typeof ownOpts.secureEndpoint !== 'boolean') {
+                ownOpts.secureEndpoint = isSecureEndpoint();
+            }
+            // Set default `host` for HTTP to localhost
+            if (ownOpts.host == null) {
+                ownOpts.host = 'localhost';
+            }
+            // Set default `port` for HTTP if none was explicitly specified
+            if (ownOpts.port == null) {
+                ownOpts.port = ownOpts.secureEndpoint ? 443 : 80;
+            }
+            const opts = Object.assign(Object.assign({}, this.options), ownOpts);
+            if (opts.host && opts.path) {
+                // If both a `host` and `path` are specified then it's most likely the
+                // result of a `url.parse()` call... we need to remove the `path` portion so
+                // that `net.connect()` doesn't attempt to open that as a unix socket file.
+                delete opts.path;
+            }
+            delete opts.agent;
+            delete opts.hostname;
+            delete opts._defaultAgent;
+            delete opts.defaultPort;
+            delete opts.createConnection;
+            // Hint to use "Connection: close"
+            // XXX: non-documented `http` module API :(
+            req._last = true;
+            req.shouldKeepAlive = false;
+            // Create the `stream.Duplex` instance
+            let timedOut = false;
+            let timeout = null;
+            const timeoutMs = this.timeout;
+            const freeSocket = this.freeSocket;
+            function onerror(err) {
+                if (req._hadError)
+                    return;
+                req.emit('error', err);
+                // For Safety. Some additional errors might fire later on
+                // and we need to make sure we don't double-fire the error event.
+                req._hadError = true;
+            }
+            function ontimeout() {
+                timeout = null;
+                timedOut = true;
+                const err = new Error(`A "socket" was not created for HTTP request before ${timeoutMs}ms`);
+                err.code = 'ETIMEOUT';
+                onerror(err);
+            }
+            function callbackError(err) {
+                if (timedOut)
+                    return;
+                if (timeout !== null) {
+                    clearTimeout(timeout);
+                    timeout = null;
+                }
+                onerror(err);
+            }
+            function onsocket(socket) {
+                let sock;
+                function onfree() {
+                    freeSocket(sock, opts);
+                }
+                if (timedOut)
+                    return;
+                if (timeout != null) {
+                    clearTimeout(timeout);
+                    timeout = null;
+                }
+                if (isAgentBase(socket) || isHttpAgent(socket)) {
+                    // `socket` is actually an `http.Agent` instance, so
+                    // relinquish responsibility for this `req` to the Agent
+                    // from here on
+                    socket.addRequest(req, opts);
+                    return;
+                }
+                if (socket) {
+                    sock = socket;
+                    sock.on('free', onfree);
+                    req.onSocket(sock);
+                    return;
+                }
+                const err = new Error(`no Duplex stream was returned to agent-base for \`${req.method} ${req.path}\``);
+                onerror(err);
+            }
+            if (typeof this.callback !== 'function') {
+                onerror(new Error('`callback` is not defined'));
+                return;
+            }
+            if (!this.promisifiedCallback) {
+                if (this.callback.length >= 3) {
+                    // Legacy callback function - convert to a Promise
+                    this.promisifiedCallback = promisify_1.default(this.callback);
+                }
+                else {
+                    this.promisifiedCallback = this.callback;
+                }
+            }
+            if (typeof timeoutMs === 'number' && timeoutMs > 0) {
+                timeout = setTimeout(ontimeout, timeoutMs);
+            }
+            if ('port' in opts && typeof opts.port !== 'number') {
+                opts.port = Number(opts.port);
+            }
+            try {
+                Promise.resolve(this.promisifiedCallback(req, opts)).then(onsocket, callbackError);
+            }
+            catch (err) {
+                Promise.reject(err).catch(callbackError);
+            }
+        }
+        freeSocket(socket, opts) {
+            // TODO reuse sockets
+            socket.destroy();
+        }
+        destroy() { }
+    }
+    createAgent.Agent = Agent;
+})(createAgent || (createAgent = {}));
+// So that `instanceof` works correctly
+createAgent.prototype = createAgent.Agent.prototype;
+module.exports = createAgent;
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/agent-base/dist/src/index.js.map b/node_modules/agent-base/dist/src/index.js.map
new file mode 100644
index 0000000..64065f6
--- /dev/null
+++ b/node_modules/agent-base/dist/src/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;AAEA,mCAAsC;AACtC,4DAAoC;AAEpC,SAAS,WAAW,CAAC,CAAM;IAC1B,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC;AACzD,CAAC;AAED,SAAS,WAAW,CAAC,CAAM;IAC1B,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC;AACzD,CAAC;AAED,SAAS,gBAAgB;IACxB,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE,CAAC;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAOD,SAAS,WAAW,CACnB,QAA+D,EAC/D,IAA+B;IAE/B,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,WAAU,WAAW;IAmCpB;;;;;;OAMG;IACH,MAAa,KAAM,SAAQ,qBAAY;QAWtC,YACC,QAA+D,EAC/D,KAAgC;YAEhC,KAAK,EAAE,CAAC;YAER,uCAAuC;YACvC,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;YAErC,IAAI,IAAI,GAAG,KAAK,CAAC;YACjB,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;gBACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;aACzB;iBAAM,IAAI,QAAQ,EAAE;gBACpB,IAAI,GAAG,QAAQ,CAAC;aAChB;YAED,0DAA0D;YAC1D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE;gBAC7C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;aAC5B;YAED,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;YAE1B,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACpB,CAAC;QAED,IAAI,WAAW;YACd,IAAI,OAAO,IAAI,CAAC,mBAAmB,KAAK,QAAQ,EAAE;gBACjD,OAAO,IAAI,CAAC,mBAAmB,CAAC;aAChC;iBAAM;gBACN,OAAO,gBAAgB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;aACrC;QACF,CAAC;QAED,IAAI,WAAW,CAAC,CAAS;YACxB,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,QAAQ;YACX,IAAI,OAAO,IAAI,CAAC,gBAAgB,KAAK,QAAQ,EAAE;gBAC9C,OAAO,IAAI,CAAC,gBAAgB,CAAC;aAC7B;iBAAM;gBACN,OAAO,gBAAgB,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;aAC/C;QACF,CAAC;QAED,IAAI,QAAQ,CAAC,CAAS;YACrB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC3B,CAAC;QAaD,QAAQ,CACP,GAA8B,EAC9B,IAA8B,EAC9B,EAAsC;YAKtC,MAAM,IAAI,KAAK,CACd,yFAAyF,CACzF,CAAC;QACH,CAAC;QAED;;;;;WAKG;QACH,UAAU,CAAC,GAAkB,EAAE,KAAqB;YACnD,MAAM,OAAO,qBAAwB,KAAK,CAAE,CAAC;YAE7C,IAAI,OAAO,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE;gBAChD,OAAO,CAAC,cAAc,GAAG,gBAAgB,EAAE,CAAC;aAC5C;YAED,2CAA2C;YAC3C,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE;gBACzB,OAAO,CAAC,IAAI,GAAG,WAAW,CAAC;aAC3B;YAED,+DAA+D;YAC/D,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE;gBACzB,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;aACjD;YAED,MAAM,IAAI,mCAAQ,IAAI,CAAC,OAAO,GAAK,OAAO,CAAE,CAAC;YAE7C,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;gBAC3B,sEAAsE;gBACtE,4EAA4E;gBAC5E,2EAA2E;gBAC3E,OAAO,IAAI,CAAC,IAAI,CAAC;aACjB;YAED,OAAO,IAAI,CAAC,KAAK,CAAC;YAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;YACrB,OAAO,IAAI,CAAC,aAAa,CAAC;YAC1B,OAAO,IAAI,CAAC,WAAW,CAAC;YACxB,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAE7B,kCAAkC;YAClC,2CAA2C;YAC3C,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;YACjB,GAAG,CAAC,eAAe,GAAG,KAAK,CAAC;YAE5B,sCAAsC;YACtC,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,OAAO,GAAyC,IAAI,CAAC;YACzD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC;YAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAEnC,SAAS,OAAO,CAAC,GAA0B;gBAC1C,IAAI,GAAG,CAAC,SAAS;oBAAE,OAAO;gBAC1B,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACvB,yDAAyD;gBACzD,iEAAiE;gBACjE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,CAAC;YAED,SAAS,SAAS;gBACjB,OAAO,GAAG,IAAI,CAAC;gBACf,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM,GAAG,GAA0B,IAAI,KAAK,CAC3C,sDAAsD,SAAS,IAAI,CACnE,CAAC;gBACF,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;YAED,SAAS,aAAa,CAAC,GAA0B;gBAChD,IAAI,QAAQ;oBAAE,OAAO;gBACrB,IAAI,OAAO,KAAK,IAAI,EAAE;oBACrB,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,OAAO,GAAG,IAAI,CAAC;iBACf;gBACD,OAAO,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;YAED,SAAS,QAAQ,CAAC,MAA2B;gBAC5C,IAAI,IAAgB,CAAC;gBAErB,SAAS,MAAM;oBACd,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACxB,CAAC;gBAED,IAAI,QAAQ;oBAAE,OAAO;gBACrB,IAAI,OAAO,IAAI,IAAI,EAAE;oBACpB,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,OAAO,GAAG,IAAI,CAAC;iBACf;gBAED,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE;oBAC/C,oDAAoD;oBACpD,wDAAwD;oBACxD,eAAe;oBACd,MAA4B,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACpD,OAAO;iBACP;gBAED,IAAI,MAAM,EAAE;oBACX,IAAI,GAAG,MAAM,CAAC;oBACd,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;oBACxB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBACnB,OAAO;iBACP;gBAED,MAAM,GAAG,GAAG,IAAI,KAAK,CACpB,qDAAqD,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,CAC/E,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;YAED,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE;gBACxC,OAAO,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;gBAChD,OAAO;aACP;YAED,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE;oBAC9B,kDAAkD;oBAClD,IAAI,CAAC,mBAAmB,GAAG,mBAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACpD;qBAAM;oBACN,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC;iBACzC;aACD;YAED,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,GAAG,CAAC,EAAE;gBACnD,OAAO,GAAG,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aAC3C;YAED,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACpD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC9B;YAED,IAAI;gBACH,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CACxD,QAAQ,EACR,aAAa,CACb,CAAC;aACF;YAAC,OAAO,GAAG,EAAE;gBACb,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;aACzC;QACF,CAAC;QAED,UAAU,CAAC,MAAkB,EAAE,IAAkB;YAChD,qBAAqB;YACrB,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,CAAC;QAED,OAAO,KAAI,CAAC;KACZ;IA7OY,iBAAK,QA6OjB,CAAA;AACF,CAAC,EAxRS,WAAW,KAAX,WAAW,QAwRpB;AAED,uCAAuC;AACvC,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC;AAEpD,iBAAS,WAAW,CAAC"}
\ No newline at end of file
diff --git a/node_modules/agent-base/dist/src/promisify.d.ts b/node_modules/agent-base/dist/src/promisify.d.ts
new file mode 100644
index 0000000..0268869
--- /dev/null
+++ b/node_modules/agent-base/dist/src/promisify.d.ts
@@ -0,0 +1,4 @@
+import { ClientRequest, RequestOptions, AgentCallbackCallback, AgentCallbackPromise } from './index';
+declare type LegacyCallback = (req: ClientRequest, opts: RequestOptions, fn: AgentCallbackCallback) => void;
+export default function promisify(fn: LegacyCallback): AgentCallbackPromise;
+export {};
diff --git a/node_modules/agent-base/dist/src/promisify.js b/node_modules/agent-base/dist/src/promisify.js
new file mode 100644
index 0000000..b2f6132
--- /dev/null
+++ b/node_modules/agent-base/dist/src/promisify.js
@@ -0,0 +1,18 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function promisify(fn) {
+    return function (req, opts) {
+        return new Promise((resolve, reject) => {
+            fn.call(this, req, opts, (err, rtn) => {
+                if (err) {
+                    reject(err);
+                }
+                else {
+                    resolve(rtn);
+                }
+            });
+        });
+    };
+}
+exports.default = promisify;
+//# sourceMappingURL=promisify.js.map
\ No newline at end of file
diff --git a/node_modules/agent-base/dist/src/promisify.js.map b/node_modules/agent-base/dist/src/promisify.js.map
new file mode 100644
index 0000000..cff5289
--- /dev/null
+++ b/node_modules/agent-base/dist/src/promisify.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"promisify.js","sourceRoot":"","sources":["../../src/promisify.ts"],"names":[],"mappings":";;AAeA,SAAwB,SAAS,CAAC,EAAkB;IACnD,OAAO,UAAsB,GAAkB,EAAE,IAAoB;QACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,EAAE,CAAC,IAAI,CACN,IAAI,EACJ,GAAG,EACH,IAAI,EACJ,CAAC,GAA6B,EAAE,GAAwB,EAAE,EAAE;gBAC3D,IAAI,GAAG,EAAE;oBACR,MAAM,CAAC,GAAG,CAAC,CAAC;iBACZ;qBAAM;oBACN,OAAO,CAAC,GAAG,CAAC,CAAC;iBACb;YACF,CAAC,CACD,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC;AAjBD,4BAiBC"}
\ No newline at end of file
diff --git a/node_modules/agent-base/index.d.ts b/node_modules/agent-base/index.d.ts
deleted file mode 100644
index ff6788b..0000000
--- a/node_modules/agent-base/index.d.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-// Type definitions for agent-base 4.2.1
-// Project: https://github.com/TooTallNate/node-agent-base
-// Definitions by: Christopher Quadflieg <https://github.com/Shinigami92>
-
-/// <reference types="node" />
-import { EventEmitter } from 'events';
-
-declare namespace Agent {
-	export type AgentCallback = (
-		req?: any,
-		opts?: {
-			secureEndpoint: boolean;
-		}
-	) => void;
-
-	export interface AgentOptions {
-		timeout?: number;
-		host?: string;
-		port?: number;
-		[key: string]: any;
-	}
-
-	export interface Agent extends EventEmitter {
-		_promisifiedCallback: boolean;
-		timeout: number | null;
-		options?: AgentOptions;
-		callback: AgentCallback;
-		addRequest: (req?: any, opts?: any) => void;
-		freeSocket: (socket: any, opts: any) => void;
-	}
-}
-
-/**
- * Base `http.Agent` implementation.
- * No pooling/keep-alive is implemented by default.
- */
-declare function Agent(opts?: Agent.AgentOptions): Agent.Agent;
-declare function Agent(
-	callback: Agent.AgentCallback,
-	opts?: Agent.AgentOptions
-): Agent.Agent;
-
-export = Agent;
diff --git a/node_modules/agent-base/index.js b/node_modules/agent-base/index.js
deleted file mode 100644
index 0ee6b29..0000000
--- a/node_modules/agent-base/index.js
+++ /dev/null
@@ -1,170 +0,0 @@
-'use strict';
-require('./patch-core');
-const inherits = require('util').inherits;
-const promisify = require('es6-promisify');
-const EventEmitter = require('events').EventEmitter;
-
-module.exports = Agent;
-
-function isAgent(v) {
-  return v && typeof v.addRequest === 'function';
-}
-
-/**
- * Base `http.Agent` implementation.
- * No pooling/keep-alive is implemented by default.
- *
- * @param {Function} callback
- * @api public
- */
-function Agent(callback, _opts) {
-  if (!(this instanceof Agent)) {
-    return new Agent(callback, _opts);
-  }
-
-  EventEmitter.call(this);
-
-  // The callback gets promisified if it has 3 parameters
-  // (i.e. it has a callback function) lazily
-  this._promisifiedCallback = false;
-
-  let opts = _opts;
-  if ('function' === typeof callback) {
-    this.callback = callback;
-  } else if (callback) {
-    opts = callback;
-  }
-
-  // timeout for the socket to be returned from the callback
-  this.timeout = (opts && opts.timeout) || null;
-
-  this.options = opts;
-}
-inherits(Agent, EventEmitter);
-
-/**
- * Override this function in your subclass!
- */
-Agent.prototype.callback = function callback(req, opts) {
-  throw new Error(
-    '"agent-base" has no default implementation, you must subclass and override `callback()`'
-  );
-};
-
-/**
- * Called by node-core's "_http_client.js" module when creating
- * a new HTTP request with this Agent instance.
- *
- * @api public
- */
-Agent.prototype.addRequest = function addRequest(req, _opts) {
-  const ownOpts = Object.assign({}, _opts);
-
-  // Set default `host` for HTTP to localhost
-  if (null == ownOpts.host) {
-    ownOpts.host = 'localhost';
-  }
-
-  // Set default `port` for HTTP if none was explicitly specified
-  if (null == ownOpts.port) {
-    ownOpts.port = ownOpts.secureEndpoint ? 443 : 80;
-  }
-
-  const opts = Object.assign({}, this.options, ownOpts);
-
-  if (opts.host && opts.path) {
-    // If both a `host` and `path` are specified then it's most likely the
-    // result of a `url.parse()` call... we need to remove the `path` portion so
-    // that `net.connect()` doesn't attempt to open that as a unix socket file.
-    delete opts.path;
-  }
-
-  delete opts.agent;
-  delete opts.hostname;
-  delete opts._defaultAgent;
-  delete opts.defaultPort;
-  delete opts.createConnection;
-
-  // Hint to use "Connection: close"
-  // XXX: non-documented `http` module API :(
-  req._last = true;
-  req.shouldKeepAlive = false;
-
-  // Create the `stream.Duplex` instance
-  let timeout;
-  let timedOut = false;
-  const timeoutMs = this.timeout;
-  const freeSocket = this.freeSocket;
-
-  function onerror(err) {
-    if (req._hadError) return;
-    req.emit('error', err);
-    // For Safety. Some additional errors might fire later on
-    // and we need to make sure we don't double-fire the error event.
-    req._hadError = true;
-  }
-
-  function ontimeout() {
-    timeout = null;
-    timedOut = true;
-    const err = new Error(
-      'A "socket" was not created for HTTP request before ' + timeoutMs + 'ms'
-    );
-    err.code = 'ETIMEOUT';
-    onerror(err);
-  }
-
-  function callbackError(err) {
-    if (timedOut) return;
-    if (timeout != null) {
-      clearTimeout(timeout);
-      timeout = null;
-    }
-    onerror(err);
-  }
-
-  function onsocket(socket) {
-    if (timedOut) return;
-    if (timeout != null) {
-      clearTimeout(timeout);
-      timeout = null;
-    }
-    if (isAgent(socket)) {
-      // `socket` is actually an http.Agent instance, so relinquish
-      // responsibility for this `req` to the Agent from here on
-      socket.addRequest(req, opts);
-    } else if (socket) {
-      function onfree() {
-        freeSocket(socket, opts);
-      }
-      socket.on('free', onfree);
-      req.onSocket(socket);
-    } else {
-      const err = new Error(
-        'no Duplex stream was returned to agent-base for `' + req.method + ' ' + req.path + '`'
-      );
-      onerror(err);
-    }
-  }
-
-  if (!this._promisifiedCallback && this.callback.length >= 3) {
-    // Legacy callback function - convert to a Promise
-    this.callback = promisify(this.callback, this);
-    this._promisifiedCallback = true;
-  }
-
-  if (timeoutMs > 0) {
-    timeout = setTimeout(ontimeout, timeoutMs);
-  }
-
-  try {
-    Promise.resolve(this.callback(req, opts)).then(onsocket, callbackError);
-  } catch (err) {
-    Promise.reject(err).catch(callbackError);
-  }
-};
-
-Agent.prototype.freeSocket = function freeSocket(socket, opts) {
-  // TODO reuse sockets
-  socket.destroy();
-};
diff --git a/node_modules/agent-base/package.json b/node_modules/agent-base/package.json
index 4ecdde6..c222094 100644
--- a/node_modules/agent-base/package.json
+++ b/node_modules/agent-base/package.json
@@ -3,19 +3,33 @@
   "bugs": {
     "url": "https://github.com/TooTallNate/node-agent-base/issues"
   },
-  "dependencies": {
-    "es6-promisify": "^5.0.0"
-  },
   "description": "Turn a function into an `http.Agent` instance",
   "devDependencies": {
-    "@types/es6-promisify": "^5.0.0",
+    "@types/mocha": "^5.2.7",
     "@types/node": "^10.5.3",
-    "mocha": "^3.4.2",
+    "@types/ws": "^6.0.3",
+    "@typescript-eslint/eslint-plugin": "1.6.0",
+    "@typescript-eslint/parser": "1.1.0",
+    "async-listen": "^1.2.0",
+    "cpy-cli": "^2.0.0",
+    "eslint": "5.16.0",
+    "eslint-config-airbnb": "17.1.0",
+    "eslint-config-prettier": "4.1.0",
+    "eslint-import-resolver-typescript": "1.1.1",
+    "eslint-plugin-import": "2.16.0",
+    "eslint-plugin-jsx-a11y": "6.2.1",
+    "eslint-plugin-react": "7.12.4",
+    "mocha": "^6.2.0",
+    "rimraf": "^3.0.0",
+    "typescript": "^3.5.3",
     "ws": "^3.0.0"
   },
   "engines": {
-    "node": ">= 4.0.0"
+    "node": ">= 6.0.0"
   },
+  "files": [
+    "dist/src"
+  ],
   "keywords": [
     "http",
     "agent",
@@ -24,14 +38,20 @@
     "https"
   ],
   "license": "MIT",
-  "main": "./index.js",
+  "main": "dist/src/index",
   "name": "agent-base",
   "repository": {
     "type": "git",
     "url": "git://github.com/TooTallNate/node-agent-base.git"
   },
   "scripts": {
-    "test": "mocha --reporter spec"
+    "build": "tsc",
+    "postbuild": "cpy --parents src test '!**/*.ts' dist",
+    "prebuild": "rimraf dist",
+    "prepublishOnly": "npm run build",
+    "test": "mocha --reporter spec dist/test/*.js",
+    "test-lint": "eslint src --ext .js,.ts"
   },
-  "version": "4.3.0"
+  "typings": "dist/src/index",
+  "version": "5.1.1"
 }
\ No newline at end of file
diff --git a/node_modules/agent-base/patch-core.js b/node_modules/agent-base/patch-core.js
deleted file mode 100644
index 21cbbb6..0000000
--- a/node_modules/agent-base/patch-core.js
+++ /dev/null
@@ -1,51 +0,0 @@
-'use strict';
-const url = require('url');
-const https = require('https');
-
-/**
- * This currently needs to be applied to all Node.js versions
- * in order to determine if the `req` is an HTTP or HTTPS request.
- *
- * There is currently no PR attempting to move this property upstream.
- */
-const patchMarker = "__agent_base_https_request_patched__";
-if (!https.request[patchMarker]) {
-  https.request = (function(request) {
-    return function(_options, cb) {
-      let options;
-      if (typeof _options === 'string') {
-        options = url.parse(_options);
-      } else {
-        options = Object.assign({}, _options);
-      }
-      if (null == options.port) {
-        options.port = 443;
-      }
-      options.secureEndpoint = true;
-      return request.call(https, options, cb);
-    };
-  })(https.request);
-  https.request[patchMarker] = true;
-}
-
-/**
- * This is needed for Node.js >= 9.0.0 to make sure `https.get()` uses the
- * patched `https.request()`.
- *
- * Ref: https://github.com/nodejs/node/commit/5118f31
- */
-https.get = function (_url, _options, cb) {
-    let options;
-    if (typeof _url === 'string' && _options && typeof _options !== 'function') {
-      options = Object.assign({}, url.parse(_url), _options);
-    } else if (!_options && !cb) {
-      options = _url;
-    } else if (!cb) {
-      options = _url;
-      cb = _options;
-    }
-
-  const req = https.request(options, cb);
-  req.end();
-  return req;
-};
diff --git a/node_modules/agent-base/test/ssl-cert-snakeoil.key b/node_modules/agent-base/test/ssl-cert-snakeoil.key
deleted file mode 100644
index fd12501..0000000
--- a/node_modules/agent-base/test/ssl-cert-snakeoil.key
+++ /dev/null
@@ -1,15 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIICWwIBAAKBgQCzURxIqzer0ACAbX/lHdsn4Gd9PLKrf7EeDYfIdV0HZKPD8WDr
-bBx2/fBu0OW2sjnzv/SVZbJ0DAuPE/p0+eT0qb2qC10iz9iTD7ribd7gxhirVb8y
-b3fBjXsxc8V8p4Ny1LcvNSqCjwUbJqdRogfoJeTiqPM58z5sNzuv5iq7iwIDAQAB
-AoGAPMQy4olrP0UotlzlJ36bowLP70ffgHCwU+/f4NWs5fF78c3du0oSx1w820Dd
-Z7E0JF8bgnlJJTxjumPZz0RUCugrEHBKJmzEz3cxF5E3+7NvteZcjKn9D67RrM5x
-1/uSZ9cqKE9cYvY4fSuHx18diyZ4axR/wB1Pea2utjjDM+ECQQDb9ZbmmaWMiRpQ
-5Up+loxP7BZNPsEVsm+DVJmEFbaFgGfncWBqSIqnPNjMwTwj0OigTwCAEGPkfRVW
-T0pbYWCxAkEA0LK7SCTwzyDmhASUalk0x+3uCAA6ryFdwJf/wd8TRAvVOmkTEldX
-uJ7ldLvfrONYO3v56uKTU/SoNdZYzKtO+wJAX2KM4ctXYy5BXztPpr2acz4qHa1N
-Bh+vBAC34fOYhyQ76r3b1btHhWZ5jbFuZwm9F2erC94Ps5IaoqcX07DSwQJAPKGw
-h2U0EPkd/3zVIZCJJQya+vgWFIs9EZcXVtvYXQyTBkVApTN66MhBIYjzkub5205J
-bVQmOV37AKklY1DhwQJAA1wos0cYxro02edzatxd0DIR2r4qqOqLkw6BhYHhq6HJ
-ZvIcQkHqdSXzdETFc01I1znDGGIrJHcnvKWgBPoEUg==
------END RSA PRIVATE KEY-----
diff --git a/node_modules/agent-base/test/ssl-cert-snakeoil.pem b/node_modules/agent-base/test/ssl-cert-snakeoil.pem
deleted file mode 100644
index b115a5e..0000000
--- a/node_modules/agent-base/test/ssl-cert-snakeoil.pem
+++ /dev/null
@@ -1,12 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIB1TCCAT4CCQDV5mPlzm9+izANBgkqhkiG9w0BAQUFADAvMS0wKwYDVQQDEyQ3
-NTI3YmQ3Ny1hYjNlLTQ3NGItYWNlNy1lZWQ2MDUzOTMxZTcwHhcNMTUwNzA2MjI0
-NTA3WhcNMjUwNzAzMjI0NTA3WjAvMS0wKwYDVQQDEyQ3NTI3YmQ3Ny1hYjNlLTQ3
-NGItYWNlNy1lZWQ2MDUzOTMxZTcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB
-ALNRHEirN6vQAIBtf+Ud2yfgZ308sqt/sR4Nh8h1XQdko8PxYOtsHHb98G7Q5bay
-OfO/9JVlsnQMC48T+nT55PSpvaoLXSLP2JMPuuJt3uDGGKtVvzJvd8GNezFzxXyn
-g3LUty81KoKPBRsmp1GiB+gl5OKo8znzPmw3O6/mKruLAgMBAAEwDQYJKoZIhvcN
-AQEFBQADgYEACzoHUF8UV2Z6541Q2wKEA0UFUzmUjf/E1XwBO+1P15ZZ64uw34B4
-1RwMPtAo9RY/PmICTWtNxWGxkzwb2JtDWtnxVER/lF8k2XcXPE76fxTHJF/BKk9J
-QU8OTD1dd9gHCBviQB9TqntRZ5X7axjtuWjb2umY+owBYzAHZkp1HKI=
------END CERTIFICATE-----
diff --git a/node_modules/agent-base/test/test.js b/node_modules/agent-base/test/test.js
deleted file mode 100644
index 0f372c0..0000000
--- a/node_modules/agent-base/test/test.js
+++ /dev/null
@@ -1,728 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var fs = require('fs');
-var url = require('url');
-var net = require('net');
-var tls = require('tls');
-var http = require('http');
-var https = require('https');
-var WebSocket = require('ws');
-var assert = require('assert');
-var events = require('events');
-var inherits = require('util').inherits;
-var Agent = require('../');
-
-var PassthroughAgent = Agent(function(req, opts) {
-  return opts.secureEndpoint ? https.globalAgent : http.globalAgent;
-});
-
-describe('Agent', function() {
-  describe('subclass', function() {
-    it('should be subclassable', function(done) {
-      function MyAgent() {
-        Agent.call(this);
-      }
-      inherits(MyAgent, Agent);
-
-      MyAgent.prototype.callback = function(req, opts, fn) {
-        assert.equal(req.path, '/foo');
-        assert.equal(req.getHeader('host'), '127.0.0.1:1234');
-        assert.equal(opts.secureEndpoint, true);
-        done();
-      };
-
-      var info = url.parse('https://127.0.0.1:1234/foo');
-      info.agent = new MyAgent();
-      https.get(info);
-    });
-  });
-  describe('options', function() {
-    it('should support an options Object as first argument', function() {
-      var agent = new Agent({ timeout: 1000 });
-      assert.equal(1000, agent.timeout);
-    });
-    it('should support an options Object as second argument', function() {
-      var agent = new Agent(function() {}, { timeout: 1000 });
-      assert.equal(1000, agent.timeout);
-    });
-    it('should be mixed in with HTTP request options', function(done) {
-      var agent = new Agent({
-        host: 'my-proxy.com',
-        port: 3128,
-        foo: 'bar'
-      });
-      agent.callback = function(req, opts, fn) {
-        assert.equal('bar', opts.foo);
-        assert.equal('a', opts.b);
-
-        // `host` and `port` are special-cases, and should always be
-        // overwritten in the request `opts` inside the agent-base callback
-        assert.equal('localhost', opts.host);
-        assert.equal(80, opts.port);
-        done();
-      };
-      var opts = {
-        b: 'a',
-        agent: agent
-      };
-      http.get(opts);
-    });
-  });
-  describe('`this` context', function() {
-    it('should be the Agent instance', function(done) {
-      var called = false;
-      var agent = new Agent();
-      agent.callback = function() {
-        called = true;
-        assert.equal(this, agent);
-      };
-      var info = url.parse('http://127.0.0.1/foo');
-      info.agent = agent;
-      var req = http.get(info);
-      req.on('error', function(err) {
-        assert(/no Duplex stream was returned/.test(err.message));
-        done();
-      });
-    });
-    it('should be the Agent instance with callback signature', function(done) {
-      var called = false;
-      var agent = new Agent();
-      agent.callback = function(req, opts, fn) {
-        called = true;
-        assert.equal(this, agent);
-        fn();
-      };
-      var info = url.parse('http://127.0.0.1/foo');
-      info.agent = agent;
-      var req = http.get(info);
-      req.on('error', function(err) {
-        assert(/no Duplex stream was returned/.test(err.message));
-        done();
-      });
-    });
-  });
-  describe('"error" event', function() {
-    it('should be invoked on `http.ClientRequest` instance if `callback()` has not been defined', function(
-      done
-    ) {
-      var agent = new Agent();
-      var info = url.parse('http://127.0.0.1/foo');
-      info.agent = agent;
-      var req = http.get(info);
-      req.on('error', function(err) {
-        assert.equal(
-          '"agent-base" has no default implementation, you must subclass and override `callback()`',
-          err.message
-        );
-        done();
-      });
-    });
-    it('should be invoked on `http.ClientRequest` instance if Error passed to callback function on the first tick', function(
-      done
-    ) {
-      var agent = new Agent(function(req, opts, fn) {
-        fn(new Error('is this caught?'));
-      });
-      var info = url.parse('http://127.0.0.1/foo');
-      info.agent = agent;
-      var req = http.get(info);
-      req.on('error', function(err) {
-        assert.equal('is this caught?', err.message);
-        done();
-      });
-    });
-    it('should be invoked on `http.ClientRequest` instance if Error passed to callback function after the first tick', function(
-      done
-    ) {
-      var agent = new Agent(function(req, opts, fn) {
-        setTimeout(function() {
-          fn(new Error('is this caught?'));
-        }, 10);
-      });
-      var info = url.parse('http://127.0.0.1/foo');
-      info.agent = agent;
-      var req = http.get(info);
-      req.on('error', function(err) {
-        assert.equal('is this caught?', err.message);
-        done();
-      });
-    });
-  });
-  describe('artificial "streams"', function() {
-    it('should send a GET request', function(done) {
-      var stream = new events.EventEmitter();
-
-      // needed for the `http` module to call .write() on the stream
-      stream.writable = true;
-
-      stream.write = function(str) {
-        assert(0 == str.indexOf('GET / HTTP/1.1'));
-        done();
-      };
-
-      // needed for `http` module in Node.js 4
-      stream.cork = function() {};
-
-      var opts = {
-        method: 'GET',
-        host: '127.0.0.1',
-        path: '/',
-        port: 80,
-        agent: new Agent(function(req, opts, fn) {
-          fn(null, stream);
-        })
-      };
-      var req = http.request(opts);
-      req.end();
-    });
-    it('should receive a GET response', function(done) {
-      var stream = new events.EventEmitter();
-      var opts = {
-        method: 'GET',
-        host: '127.0.0.1',
-        path: '/',
-        port: 80,
-        agent: new Agent(function(req, opts, fn) {
-          fn(null, stream);
-        })
-      };
-      var req = http.request(opts, function(res) {
-        assert.equal('1.0', res.httpVersion);
-        assert.equal(200, res.statusCode);
-        assert.equal('bar', res.headers.foo);
-        assert.deepEqual(['1', '2'], res.headers['set-cookie']);
-        done();
-      });
-
-      // have to wait for the "socket" event since `http.ClientRequest`
-      // doesn't *actually* attach the listeners to the "stream" until
-      // this happens
-      req.once('socket', function() {
-        var buf = Buffer.from(
-          'HTTP/1.0 200\r\n' +
-            'Foo: bar\r\n' +
-            'Set-Cookie: 1\r\n' +
-            'Set-Cookie: 2\r\n\r\n'
-        );
-        stream.emit('data', buf);
-      });
-
-      req.end();
-    });
-  });
-});
-
-describe('"http" module', function() {
-  var server;
-  var port;
-
-  // setup test HTTP server
-  before(function(done) {
-    server = http.createServer();
-    server.listen(0, function() {
-      port = server.address().port;
-      done();
-    });
-  });
-
-  // shut down test HTTP server
-  after(function(done) {
-    server.once('close', function() {
-      done();
-    });
-    server.close();
-  });
-
-  it('should work for basic HTTP requests', function(done) {
-    var called = false;
-    var agent = new Agent(function(req, opts, fn) {
-      called = true;
-      var socket = net.connect(opts);
-      fn(null, socket);
-    });
-
-    // add HTTP server "request" listener
-    var gotReq = false;
-    server.once('request', function(req, res) {
-      gotReq = true;
-      res.setHeader('X-Foo', 'bar');
-      res.setHeader('X-Url', req.url);
-      res.end();
-    });
-
-    var info = url.parse('http://127.0.0.1:' + port + '/foo');
-    info.agent = agent;
-    http.get(info, function(res) {
-      assert.equal('bar', res.headers['x-foo']);
-      assert.equal('/foo', res.headers['x-url']);
-      assert(gotReq);
-      assert(called);
-      done();
-    });
-  });
-
-  it('should support direct return in `connect()`', function(done) {
-    var called = false;
-    var agent = new Agent(function(req, opts) {
-      called = true;
-      return net.connect(opts);
-    });
-
-    // add HTTP server "request" listener
-    var gotReq = false;
-    server.once('request', function(req, res) {
-      gotReq = true;
-      res.setHeader('X-Foo', 'bar');
-      res.setHeader('X-Url', req.url);
-      res.end();
-    });
-
-    var info = url.parse('http://127.0.0.1:' + port + '/foo');
-    info.agent = agent;
-    http.get(info, function(res) {
-      assert.equal('bar', res.headers['x-foo']);
-      assert.equal('/foo', res.headers['x-url']);
-      assert(gotReq);
-      assert(called);
-      done();
-    });
-  });
-
-  it('should support returning a Promise in `connect()`', function(done) {
-    var called = false;
-    var agent = new Agent(function(req, opts) {
-      return new Promise(function(resolve, reject) {
-        called = true;
-        resolve(net.connect(opts));
-      });
-    });
-
-    // add HTTP server "request" listener
-    var gotReq = false;
-    server.once('request', function(req, res) {
-      gotReq = true;
-      res.setHeader('X-Foo', 'bar');
-      res.setHeader('X-Url', req.url);
-      res.end();
-    });
-
-    var info = url.parse('http://127.0.0.1:' + port + '/foo');
-    info.agent = agent;
-    http.get(info, function(res) {
-      assert.equal('bar', res.headers['x-foo']);
-      assert.equal('/foo', res.headers['x-url']);
-      assert(gotReq);
-      assert(called);
-      done();
-    });
-  });
-
-  it('should set the `Connection: close` response header', function(done) {
-    var called = false;
-    var agent = new Agent(function(req, opts, fn) {
-      called = true;
-      var socket = net.connect(opts);
-      fn(null, socket);
-    });
-
-    // add HTTP server "request" listener
-    var gotReq = false;
-    server.once('request', function(req, res) {
-      gotReq = true;
-      res.setHeader('X-Url', req.url);
-      assert.equal('close', req.headers.connection);
-      res.end();
-    });
-
-    var info = url.parse('http://127.0.0.1:' + port + '/bar');
-    info.agent = agent;
-    http.get(info, function(res) {
-      assert.equal('/bar', res.headers['x-url']);
-      assert.equal('close', res.headers.connection);
-      assert(gotReq);
-      assert(called);
-      done();
-    });
-  });
-
-  it('should pass through options from `http.request()`', function(done) {
-    var agent = new Agent(function(req, opts, fn) {
-      assert.equal('google.com', opts.host);
-      assert.equal('bar', opts.foo);
-      done();
-    });
-
-    http.get({
-      host: 'google.com',
-      foo: 'bar',
-      agent: agent
-    });
-  });
-
-  it('should default to port 80', function(done) {
-    var agent = new Agent(function(req, opts, fn) {
-      assert.equal(80, opts.port);
-      done();
-    });
-
-    // (probably) not hitting a real HTTP server here,
-    // so no need to add a httpServer request listener
-    http.get({
-      host: '127.0.0.1',
-      path: '/foo',
-      agent: agent
-    });
-  });
-
-  it('should support the "timeout" option', function(done) {
-    // ensure we timeout after the "error" event had a chance to trigger
-    this.timeout(1000);
-    this.slow(800);
-
-    var agent = new Agent(
-      function(req, opts, fn) {
-        // this function will time out
-      },
-      { timeout: 100 }
-    );
-
-    var opts = url.parse('http://nodejs.org');
-    opts.agent = agent;
-
-    var req = http.get(opts);
-    req.once('error', function(err) {
-      assert.equal('ETIMEOUT', err.code);
-      req.abort();
-      done();
-    });
-  });
-
-  it('should free sockets after use', function(done) {
-    var agent = new Agent(function(req, opts, fn) {
-      var socket = net.connect(opts);
-      fn(null, socket);
-    });
-
-    // add HTTP server "request" listener
-    var gotReq = false;
-    server.once('request', function(req, res) {
-      gotReq = true;
-      res.end();
-    });
-
-    var info = url.parse('http://127.0.0.1:' + port + '/foo');
-    info.agent = agent;
-    http.get(info, function(res) {
-      res.socket.emit('free');
-      assert.equal(true, res.socket.destroyed);
-      assert(gotReq);
-      done();
-    });
-  });
-
-
-  describe('PassthroughAgent', function() {
-    it('should pass through to `http.globalAgent`', function(done) {
-      // add HTTP server "request" listener
-      var gotReq = false;
-      server.once('request', function(req, res) {
-        gotReq = true;
-        res.setHeader('X-Foo', 'bar');
-        res.setHeader('X-Url', req.url);
-        res.end();
-      });
-
-      var info = url.parse('http://127.0.0.1:' + port + '/foo');
-      info.agent = PassthroughAgent;
-      http.get(info, function(res) {
-        assert.equal('bar', res.headers['x-foo']);
-        assert.equal('/foo', res.headers['x-url']);
-        assert(gotReq);
-        done();
-      });
-    });
-  });
-});
-
-describe('"https" module', function() {
-  var server;
-  var port;
-
-  // setup test HTTPS server
-  before(function(done) {
-    var options = {
-      key: fs.readFileSync(__dirname + '/ssl-cert-snakeoil.key'),
-      cert: fs.readFileSync(__dirname + '/ssl-cert-snakeoil.pem')
-    };
-    server = https.createServer(options);
-    server.listen(0, function() {
-      port = server.address().port;
-      done();
-    });
-  });
-
-  // shut down test HTTP server
-  after(function(done) {
-    server.once('close', function() {
-      done();
-    });
-    server.close();
-  });
-
-  it('should not modify the passed in Options object', function(done) {
-    var called = false;
-    var agent = new Agent(function(req, opts, fn) {
-      called = true;
-      assert.equal(true, opts.secureEndpoint);
-      assert.equal(443, opts.port);
-      assert.equal('localhost', opts.host);
-    });
-    var opts = { agent: agent };
-    var req = https.request(opts);
-    assert.equal(true, called);
-    assert.equal(false, 'secureEndpoint' in opts);
-    assert.equal(false, 'port' in opts);
-    done();
-  });
-
-  it('should work with a String URL', function(done) {
-    var endpoint = 'https://127.0.0.1:' + port;
-    var req = https.get(endpoint);
-
-    // it's gonna error out since `rejectUnauthorized` is not being passed in
-    req.on('error', function(err) {
-      assert.equal(err.code, 'DEPTH_ZERO_SELF_SIGNED_CERT');
-      done();
-    });
-  });
-
-  it('should work for basic HTTPS requests', function(done) {
-    var called = false;
-    var agent = new Agent(function(req, opts, fn) {
-      called = true;
-      assert(opts.secureEndpoint);
-      var socket = tls.connect(opts);
-      fn(null, socket);
-    });
-
-    // add HTTPS server "request" listener
-    var gotReq = false;
-    server.once('request', function(req, res) {
-      gotReq = true;
-      res.setHeader('X-Foo', 'bar');
-      res.setHeader('X-Url', req.url);
-      res.end();
-    });
-
-    var info = url.parse('https://127.0.0.1:' + port + '/foo');
-    info.agent = agent;
-    info.rejectUnauthorized = false;
-    https.get(info, function(res) {
-      assert.equal('bar', res.headers['x-foo']);
-      assert.equal('/foo', res.headers['x-url']);
-      assert(gotReq);
-      assert(called);
-      done();
-    });
-  });
-
-  it('should pass through options from `https.request()`', function(done) {
-    var agent = new Agent(function(req, opts, fn) {
-      assert.equal('google.com', opts.host);
-      assert.equal('bar', opts.foo);
-      done();
-    });
-
-    https.get({
-      host: 'google.com',
-      foo: 'bar',
-      agent: agent
-    });
-  });
-
-  it('should support the 3-argument `https.get()`', function(done) {
-    var agent = new Agent(function(req, opts, fn) {
-      assert.equal('google.com', opts.host);
-      assert.equal('/q', opts.pathname || opts.path);
-      assert.equal('881', opts.port);
-      assert.equal('bar', opts.foo);
-      done();
-    });
-
-    https.get(
-      'https://google.com:881/q',
-      {
-        host: 'google.com',
-        foo: 'bar',
-        agent: agent
-      }
-    );
-  });
-
-  it('should default to port 443', function(done) {
-    var agent = new Agent(function(req, opts, fn) {
-      assert.equal(true, opts.secureEndpoint);
-      assert.equal(false, opts.rejectUnauthorized);
-      assert.equal(443, opts.port);
-      done();
-    });
-
-    // (probably) not hitting a real HTTPS server here,
-    // so no need to add a httpsServer request listener
-    https.get({
-      host: '127.0.0.1',
-      path: '/foo',
-      agent: agent,
-      rejectUnauthorized: false
-    });
-  });
-
-  it('should not re-patch https.request', () => {
-    var patchModulePath = "../patch-core";
-    var patchedRequest = https.request;
-
-    delete require.cache[require.resolve(patchModulePath)];
-    require(patchModulePath);
-
-    assert.equal(patchedRequest, https.request);
-    assert.equal(true, https.request.__agent_base_https_request_patched__);
-  });
-
-  describe('PassthroughAgent', function() {
-    it('should pass through to `https.globalAgent`', function(done) {
-      // add HTTP server "request" listener
-      var gotReq = false;
-      server.once('request', function(req, res) {
-        gotReq = true;
-        res.setHeader('X-Foo', 'bar');
-        res.setHeader('X-Url', req.url);
-        res.end();
-      });
-
-      var info = url.parse('https://127.0.0.1:' + port + '/foo');
-      info.agent = PassthroughAgent;
-      info.rejectUnauthorized = false;
-      https.get(info, function(res) {
-        assert.equal('bar', res.headers['x-foo']);
-        assert.equal('/foo', res.headers['x-url']);
-        assert(gotReq);
-        done();
-      });
-    });
-  });
-});
-
-describe('"ws" server', function() {
-  var wss;
-  var server;
-  var port;
-
-  // setup test HTTP server
-  before(function(done) {
-    server = http.createServer();
-    wss = new WebSocket.Server({ server: server });
-    server.listen(0, function() {
-      port = server.address().port;
-      done();
-    });
-  });
-
-  // shut down test HTTP server
-  after(function(done) {
-    server.once('close', function() {
-      done();
-    });
-    server.close();
-  });
-
-  it('should work for basic WebSocket connections', function(done) {
-    function onconnection(ws) {
-      ws.on('message', function(data) {
-        assert.equal('ping', data);
-        ws.send('pong');
-      });
-    }
-    wss.on('connection', onconnection);
-
-    var agent = new Agent(function(req, opts, fn) {
-      var socket = net.connect(opts);
-      fn(null, socket);
-    });
-
-    var client = new WebSocket('ws://127.0.0.1:' + port + '/', {
-      agent: agent
-    });
-
-    client.on('open', function() {
-      client.send('ping');
-    });
-
-    client.on('message', function(data) {
-      assert.equal('pong', data);
-      client.close();
-      wss.removeListener('connection', onconnection);
-      done();
-    });
-  });
-});
-
-describe('"wss" server', function() {
-  var wss;
-  var server;
-  var port;
-
-  // setup test HTTP server
-  before(function(done) {
-    var options = {
-      key: fs.readFileSync(__dirname + '/ssl-cert-snakeoil.key'),
-      cert: fs.readFileSync(__dirname + '/ssl-cert-snakeoil.pem')
-    };
-    server = https.createServer(options);
-    wss = new WebSocket.Server({ server: server });
-    server.listen(0, function() {
-      port = server.address().port;
-      done();
-    });
-  });
-
-  // shut down test HTTP server
-  after(function(done) {
-    server.once('close', function() {
-      done();
-    });
-    server.close();
-  });
-
-  it('should work for secure WebSocket connections', function(done) {
-    function onconnection(ws) {
-      ws.on('message', function(data) {
-        assert.equal('ping', data);
-        ws.send('pong');
-      });
-    }
-    wss.on('connection', onconnection);
-
-    var agent = new Agent(function(req, opts, fn) {
-      var socket = tls.connect(opts);
-      fn(null, socket);
-    });
-
-    var client = new WebSocket('wss://127.0.0.1:' + port + '/', {
-      agent: agent,
-      rejectUnauthorized: false
-    });
-
-    client.on('open', function() {
-      client.send('ping');
-    });
-
-    client.on('message', function(data) {
-      assert.equal('pong', data);
-      client.close();
-      wss.removeListener('connection', onconnection);
-      done();
-    });
-  });
-});
diff --git a/node_modules/bl/.travis.yml b/node_modules/bl/.travis.yml
new file mode 100644
index 0000000..b18f3d5
--- /dev/null
+++ b/node_modules/bl/.travis.yml
@@ -0,0 +1,16 @@
+sudo: false
+language: node_js
+node_js:
+  - '6'
+  - '8'
+  - '10'
+  - '12'
+  - lts/*
+  - current
+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..6dad448
--- /dev/null
+++ b/node_modules/bl/BufferList.js
@@ -0,0 +1,387 @@
+'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)
+    } else {
+      this._bufs[i].copy(dst, bufoff, start, start + bytes)
+      break
+    }
+
+    bufoff += l
+    bytes -= l
+
+    if (start) {
+      start = 0
+    }
+  }
+
+  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) {
+  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/package.json b/node_modules/bl/package.json
new file mode 100644
index 0000000..022987c
--- /dev/null
+++ b/node_modules/bl/package.json
@@ -0,0 +1,37 @@
+{
+  "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)"
+  ],
+  "dependencies": {
+    "buffer": "^5.5.0",
+    "inherits": "^2.0.4",
+    "readable-stream": "^3.4.0"
+  },
+  "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": "https://github.com/rvagg/bl.git"
+  },
+  "scripts": {
+    "lint": "standard *.js test/*.js",
+    "test": "npm run lint && node test/test.js | faucet"
+  },
+  "version": "4.0.2"
+}
\ No newline at end of file
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..cb1f257
--- /dev/null
+++ b/node_modules/bl/test/test.js
@@ -0,0 +1,835 @@
+'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()
+})
+
+!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-from/LICENSE b/node_modules/buffer-from/LICENSE
deleted file mode 100644
index e4bf1d6..0000000
--- a/node_modules/buffer-from/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2016, 2018 Linus Unnebäck
-
-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-from/index.js b/node_modules/buffer-from/index.js
deleted file mode 100644
index d92a83d..0000000
--- a/node_modules/buffer-from/index.js
+++ /dev/null
@@ -1,69 +0,0 @@
-var toString = Object.prototype.toString
-
-var isModern = (
-  typeof Buffer.alloc === 'function' &&
-  typeof Buffer.allocUnsafe === 'function' &&
-  typeof Buffer.from === 'function'
-)
-
-function isArrayBuffer (input) {
-  return toString.call(input).slice(8, -1) === 'ArrayBuffer'
-}
-
-function fromArrayBuffer (obj, byteOffset, length) {
-  byteOffset >>>= 0
-
-  var maxLength = obj.byteLength - byteOffset
-
-  if (maxLength < 0) {
-    throw new RangeError("'offset' is out of bounds")
-  }
-
-  if (length === undefined) {
-    length = maxLength
-  } else {
-    length >>>= 0
-
-    if (length > maxLength) {
-      throw new RangeError("'length' is out of bounds")
-    }
-  }
-
-  return isModern
-    ? Buffer.from(obj.slice(byteOffset, byteOffset + length))
-    : new Buffer(new Uint8Array(obj.slice(byteOffset, byteOffset + length)))
-}
-
-function fromString (string, encoding) {
-  if (typeof encoding !== 'string' || encoding === '') {
-    encoding = 'utf8'
-  }
-
-  if (!Buffer.isEncoding(encoding)) {
-    throw new TypeError('"encoding" must be a valid string encoding')
-  }
-
-  return isModern
-    ? Buffer.from(string, encoding)
-    : new Buffer(string, encoding)
-}
-
-function bufferFrom (value, encodingOrOffset, length) {
-  if (typeof value === 'number') {
-    throw new TypeError('"value" argument must not be a number')
-  }
-
-  if (isArrayBuffer(value)) {
-    return fromArrayBuffer(value, encodingOrOffset, length)
-  }
-
-  if (typeof value === 'string') {
-    return fromString(value, encodingOrOffset)
-  }
-
-  return isModern
-    ? Buffer.from(value)
-    : new Buffer(value)
-}
-
-module.exports = bufferFrom
diff --git a/node_modules/buffer-from/package.json b/node_modules/buffer-from/package.json
deleted file mode 100644
index 758fec1..0000000
--- a/node_modules/buffer-from/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "devDependencies": {
-    "standard": "^7.1.2"
-  },
-  "files": [
-    "index.js"
-  ],
-  "keywords": [
-    "buffer",
-    "buffer from"
-  ],
-  "license": "MIT",
-  "name": "buffer-from",
-  "repository": "LinusU/buffer-from",
-  "scripts": {
-    "test": "standard && node test"
-  },
-  "version": "1.1.1"
-}
\ No newline at end of file
diff --git a/node_modules/buffer-from/readme.md b/node_modules/buffer-from/readme.md
deleted file mode 100644
index 9880a55..0000000
--- a/node_modules/buffer-from/readme.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# Buffer From
-
-A [ponyfill](https://ponyfill.com) for `Buffer.from`, uses native implementation if available.
-
-## Installation
-
-```sh
-npm install --save buffer-from
-```
-
-## Usage
-
-```js
-const bufferFrom = require('buffer-from')
-
-console.log(bufferFrom([1, 2, 3, 4]))
-//=> <Buffer 01 02 03 04>
-
-const arr = new Uint8Array([1, 2, 3, 4])
-console.log(bufferFrom(arr.buffer, 1, 2))
-//=> <Buffer 02 03>
-
-console.log(bufferFrom('test', 'utf8'))
-//=> <Buffer 74 65 73 74>
-
-const buf = bufferFrom('test')
-console.log(bufferFrom(buf))
-//=> <Buffer 74 65 73 74>
-```
-
-## API
-
-### bufferFrom(array)
-
-- `array` &lt;Array&gt;
-
-Allocates a new `Buffer` using an `array` of octets.
-
-### bufferFrom(arrayBuffer[, byteOffset[, length]])
-
-- `arrayBuffer` &lt;ArrayBuffer&gt; The `.buffer` property of a TypedArray or ArrayBuffer
-- `byteOffset` &lt;Integer&gt; Where to start copying from `arrayBuffer`. **Default:** `0`
-- `length` &lt;Integer&gt; How many bytes to copy from `arrayBuffer`. **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.
-
-The optional `byteOffset` and `length` arguments specify a memory range within
-the `arrayBuffer` that will be shared by the `Buffer`.
-
-### bufferFrom(buffer)
-
-- `buffer` &lt;Buffer&gt; An existing `Buffer` to copy data from
-
-Copies the passed `buffer` data onto a new `Buffer` instance.
-
-### bufferFrom(string[, encoding])
-
-- `string` &lt;String&gt; A string to encode.
-- `encoding` &lt;String&gt; The encoding of `string`. **Default:** `'utf8'`
-
-Creates a new `Buffer` containing the given JavaScript string `string`. If
-provided, the `encoding` parameter identifies the character encoding of
-`string`.
-
-## See also
-
-- [buffer-alloc](https://github.com/LinusU/buffer-alloc) A ponyfill for `Buffer.alloc`
-- [buffer-alloc-unsafe](https://github.com/LinusU/buffer-alloc-unsafe) A ponyfill for `Buffer.allocUnsafe`
diff --git a/node_modules/puppeteer/node_modules/rimraf/LICENSE b/node_modules/chownr/LICENSE
similarity index 100%
rename from node_modules/puppeteer/node_modules/rimraf/LICENSE
rename to node_modules/chownr/LICENSE
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..5669e87
--- /dev/null
+++ b/node_modules/chownr/package.json
@@ -0,0 +1,29 @@
+{
+  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
+  "description": "like `chown -R`",
+  "devDependencies": {
+    "mkdirp": "0.3",
+    "rimraf": "^2.7.1",
+    "tap": "^14.10.6"
+  },
+  "files": [
+    "chownr.js"
+  ],
+  "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"
+}
\ No newline at end of file
diff --git a/node_modules/concat-stream/LICENSE b/node_modules/concat-stream/LICENSE
deleted file mode 100644
index 99c130e..0000000
--- a/node_modules/concat-stream/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-The MIT License
-
-Copyright (c) 2013 Max Ogden
-
-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/concat-stream/index.js b/node_modules/concat-stream/index.js
deleted file mode 100644
index dd672a7..0000000
--- a/node_modules/concat-stream/index.js
+++ /dev/null
@@ -1,144 +0,0 @@
-var Writable = require('readable-stream').Writable
-var inherits = require('inherits')
-var bufferFrom = require('buffer-from')
-
-if (typeof Uint8Array === 'undefined') {
-  var U8 = require('typedarray').Uint8Array
-} else {
-  var U8 = Uint8Array
-}
-
-function ConcatStream(opts, cb) {
-  if (!(this instanceof ConcatStream)) return new ConcatStream(opts, cb)
-
-  if (typeof opts === 'function') {
-    cb = opts
-    opts = {}
-  }
-  if (!opts) opts = {}
-
-  var encoding = opts.encoding
-  var shouldInferEncoding = false
-
-  if (!encoding) {
-    shouldInferEncoding = true
-  } else {
-    encoding =  String(encoding).toLowerCase()
-    if (encoding === 'u8' || encoding === 'uint8') {
-      encoding = 'uint8array'
-    }
-  }
-
-  Writable.call(this, { objectMode: true })
-
-  this.encoding = encoding
-  this.shouldInferEncoding = shouldInferEncoding
-
-  if (cb) this.on('finish', function () { cb(this.getBody()) })
-  this.body = []
-}
-
-module.exports = ConcatStream
-inherits(ConcatStream, Writable)
-
-ConcatStream.prototype._write = function(chunk, enc, next) {
-  this.body.push(chunk)
-  next()
-}
-
-ConcatStream.prototype.inferEncoding = function (buff) {
-  var firstBuffer = buff === undefined ? this.body[0] : buff;
-  if (Buffer.isBuffer(firstBuffer)) return 'buffer'
-  if (typeof Uint8Array !== 'undefined' && firstBuffer instanceof Uint8Array) return 'uint8array'
-  if (Array.isArray(firstBuffer)) return 'array'
-  if (typeof firstBuffer === 'string') return 'string'
-  if (Object.prototype.toString.call(firstBuffer) === "[object Object]") return 'object'
-  return 'buffer'
-}
-
-ConcatStream.prototype.getBody = function () {
-  if (!this.encoding && this.body.length === 0) return []
-  if (this.shouldInferEncoding) this.encoding = this.inferEncoding()
-  if (this.encoding === 'array') return arrayConcat(this.body)
-  if (this.encoding === 'string') return stringConcat(this.body)
-  if (this.encoding === 'buffer') return bufferConcat(this.body)
-  if (this.encoding === 'uint8array') return u8Concat(this.body)
-  return this.body
-}
-
-var isArray = Array.isArray || function (arr) {
-  return Object.prototype.toString.call(arr) == '[object Array]'
-}
-
-function isArrayish (arr) {
-  return /Array\]$/.test(Object.prototype.toString.call(arr))
-}
-
-function isBufferish (p) {
-  return typeof p === 'string' || isArrayish(p) || (p && typeof p.subarray === 'function')
-}
-
-function stringConcat (parts) {
-  var strings = []
-  var needsToString = false
-  for (var i = 0; i < parts.length; i++) {
-    var p = parts[i]
-    if (typeof p === 'string') {
-      strings.push(p)
-    } else if (Buffer.isBuffer(p)) {
-      strings.push(p)
-    } else if (isBufferish(p)) {
-      strings.push(bufferFrom(p))
-    } else {
-      strings.push(bufferFrom(String(p)))
-    }
-  }
-  if (Buffer.isBuffer(parts[0])) {
-    strings = Buffer.concat(strings)
-    strings = strings.toString('utf8')
-  } else {
-    strings = strings.join('')
-  }
-  return strings
-}
-
-function bufferConcat (parts) {
-  var bufs = []
-  for (var i = 0; i < parts.length; i++) {
-    var p = parts[i]
-    if (Buffer.isBuffer(p)) {
-      bufs.push(p)
-    } else if (isBufferish(p)) {
-      bufs.push(bufferFrom(p))
-    } else {
-      bufs.push(bufferFrom(String(p)))
-    }
-  }
-  return Buffer.concat(bufs)
-}
-
-function arrayConcat (parts) {
-  var res = []
-  for (var i = 0; i < parts.length; i++) {
-    res.push.apply(res, parts[i])
-  }
-  return res
-}
-
-function u8Concat (parts) {
-  var len = 0
-  for (var i = 0; i < parts.length; i++) {
-    if (typeof parts[i] === 'string') {
-      parts[i] = bufferFrom(parts[i])
-    }
-    len += parts[i].length
-  }
-  var u8 = new U8(len)
-  for (var i = 0, offset = 0; i < parts.length; i++) {
-    var part = parts[i]
-    for (var j = 0; j < part.length; j++) {
-      u8[offset++] = part[j]
-    }
-  }
-  return u8
-}
diff --git a/node_modules/concat-stream/node_modules/isarray/.npmignore b/node_modules/concat-stream/node_modules/isarray/.npmignore
deleted file mode 100644
index 3c3629e..0000000
--- a/node_modules/concat-stream/node_modules/isarray/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/node_modules/concat-stream/node_modules/isarray/Makefile b/node_modules/concat-stream/node_modules/isarray/Makefile
deleted file mode 100644
index 787d56e..0000000
--- a/node_modules/concat-stream/node_modules/isarray/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-
-test:
-	@node_modules/.bin/tape test.js
-
-.PHONY: test
-
diff --git a/node_modules/concat-stream/node_modules/isarray/README.md b/node_modules/concat-stream/node_modules/isarray/README.md
deleted file mode 100644
index 16d2c59..0000000
--- a/node_modules/concat-stream/node_modules/isarray/README.md
+++ /dev/null
@@ -1,60 +0,0 @@
-
-# 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/concat-stream/node_modules/isarray/component.json b/node_modules/concat-stream/node_modules/isarray/component.json
deleted file mode 100644
index 9e31b68..0000000
--- a/node_modules/concat-stream/node_modules/isarray/component.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "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/concat-stream/node_modules/isarray/index.js b/node_modules/concat-stream/node_modules/isarray/index.js
deleted file mode 100644
index a57f634..0000000
--- a/node_modules/concat-stream/node_modules/isarray/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var toString = {}.toString;
-
-module.exports = Array.isArray || function (arr) {
-  return toString.call(arr) == '[object Array]';
-};
diff --git a/node_modules/concat-stream/node_modules/isarray/package.json b/node_modules/concat-stream/node_modules/isarray/package.json
deleted file mode 100644
index 34bc99b..0000000
--- a/node_modules/concat-stream/node_modules/isarray/package.json
+++ /dev/null
@@ -1,45 +0,0 @@
-{
-  "author": {
-    "email": "mail@juliangruber.com",
-    "name": "Julian Gruber",
-    "url": "http://juliangruber.com"
-  },
-  "dependencies": {},
-  "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": {
-    "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"
-    ],
-    "files": "test.js"
-  },
-  "version": "1.0.0"
-}
\ No newline at end of file
diff --git a/node_modules/concat-stream/node_modules/isarray/test.js b/node_modules/concat-stream/node_modules/isarray/test.js
deleted file mode 100644
index e0c3444..0000000
--- a/node_modules/concat-stream/node_modules/isarray/test.js
+++ /dev/null
@@ -1,20 +0,0 @@
-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/concat-stream/node_modules/readable-stream/.travis.yml b/node_modules/concat-stream/node_modules/readable-stream/.travis.yml
deleted file mode 100644
index f62cdac..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/.travis.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-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/concat-stream/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/concat-stream/node_modules/readable-stream/CONTRIBUTING.md
deleted file mode 100644
index f478d58..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/CONTRIBUTING.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# 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/concat-stream/node_modules/readable-stream/GOVERNANCE.md b/node_modules/concat-stream/node_modules/readable-stream/GOVERNANCE.md
deleted file mode 100644
index 16ffb93..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/GOVERNANCE.md
+++ /dev/null
@@ -1,136 +0,0 @@
-### 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/concat-stream/node_modules/readable-stream/LICENSE b/node_modules/concat-stream/node_modules/readable-stream/LICENSE
deleted file mode 100644
index 2873b3b..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/LICENSE
+++ /dev/null
@@ -1,47 +0,0 @@
-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/concat-stream/node_modules/readable-stream/README.md b/node_modules/concat-stream/node_modules/readable-stream/README.md
deleted file mode 100644
index 23fe3f3..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/README.md
+++ /dev/null
@@ -1,58 +0,0 @@
-# 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/concat-stream/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/concat-stream/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md
deleted file mode 100644
index 83275f1..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# 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/concat-stream/node_modules/readable-stream/duplex-browser.js b/node_modules/concat-stream/node_modules/readable-stream/duplex-browser.js
deleted file mode 100644
index f8b2db8..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/duplex-browser.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib/_stream_duplex.js');
diff --git a/node_modules/concat-stream/node_modules/readable-stream/duplex.js b/node_modules/concat-stream/node_modules/readable-stream/duplex.js
deleted file mode 100644
index 46924cb..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/duplex.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./readable').Duplex
diff --git a/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_duplex.js
deleted file mode 100644
index 57003c3..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_duplex.js
+++ /dev/null
@@ -1,131 +0,0 @@
-// 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/concat-stream/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_passthrough.js
deleted file mode 100644
index 612edb4..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_passthrough.js
+++ /dev/null
@@ -1,47 +0,0 @@
-// 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/concat-stream/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_readable.js
deleted file mode 100644
index 0f80764..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_readable.js
+++ /dev/null
@@ -1,1019 +0,0 @@
-// 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/concat-stream/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_transform.js
deleted file mode 100644
index fcfc105..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_transform.js
+++ /dev/null
@@ -1,214 +0,0 @@
-// 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/concat-stream/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_writable.js
deleted file mode 100644
index b0b0220..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/lib/_stream_writable.js
+++ /dev/null
@@ -1,687 +0,0 @@
-// 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/concat-stream/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/BufferList.js
deleted file mode 100644
index aefc68b..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/BufferList.js
+++ /dev/null
@@ -1,79 +0,0 @@
-'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/concat-stream/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/destroy.js
deleted file mode 100644
index 5a0a0d8..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/destroy.js
+++ /dev/null
@@ -1,74 +0,0 @@
-'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/concat-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js
deleted file mode 100644
index 9332a3f..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/stream-browser.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('events').EventEmitter;
diff --git a/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/stream.js
deleted file mode 100644
index ce2ad5b..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/lib/internal/streams/stream.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('stream');
diff --git a/node_modules/concat-stream/node_modules/readable-stream/package.json b/node_modules/concat-stream/node_modules/readable-stream/package.json
deleted file mode 100644
index 9f45127..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/package.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
-  "browser": {
-    "./duplex.js": "./duplex-browser.js",
-    "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js",
-    "./readable.js": "./readable-browser.js",
-    "./writable.js": "./writable-browser.js",
-    "util": 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"
-  },
-  "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"
-  },
-  "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"
-  },
-  "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"
-}
\ No newline at end of file
diff --git a/node_modules/concat-stream/node_modules/readable-stream/passthrough.js b/node_modules/concat-stream/node_modules/readable-stream/passthrough.js
deleted file mode 100644
index ffd791d..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/passthrough.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./readable').PassThrough
diff --git a/node_modules/concat-stream/node_modules/readable-stream/readable-browser.js b/node_modules/concat-stream/node_modules/readable-stream/readable-browser.js
deleted file mode 100644
index e503725..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/readable-browser.js
+++ /dev/null
@@ -1,7 +0,0 @@
-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/concat-stream/node_modules/readable-stream/readable.js b/node_modules/concat-stream/node_modules/readable-stream/readable.js
deleted file mode 100644
index ec89ec5..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/readable.js
+++ /dev/null
@@ -1,19 +0,0 @@
-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/concat-stream/node_modules/readable-stream/transform.js b/node_modules/concat-stream/node_modules/readable-stream/transform.js
deleted file mode 100644
index b1baba2..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/transform.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./readable').Transform
diff --git a/node_modules/concat-stream/node_modules/readable-stream/writable-browser.js b/node_modules/concat-stream/node_modules/readable-stream/writable-browser.js
deleted file mode 100644
index ebdde6a..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/writable-browser.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib/_stream_writable.js');
diff --git a/node_modules/concat-stream/node_modules/readable-stream/writable.js b/node_modules/concat-stream/node_modules/readable-stream/writable.js
deleted file mode 100644
index 3211a6f..0000000
--- a/node_modules/concat-stream/node_modules/readable-stream/writable.js
+++ /dev/null
@@ -1,8 +0,0 @@
-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/concat-stream/node_modules/safe-buffer/README.md b/node_modules/concat-stream/node_modules/safe-buffer/README.md
deleted file mode 100644
index e9a81af..0000000
--- a/node_modules/concat-stream/node_modules/safe-buffer/README.md
+++ /dev/null
@@ -1,584 +0,0 @@
-# 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/concat-stream/node_modules/safe-buffer/index.d.ts b/node_modules/concat-stream/node_modules/safe-buffer/index.d.ts
deleted file mode 100644
index e9fed80..0000000
--- a/node_modules/concat-stream/node_modules/safe-buffer/index.d.ts
+++ /dev/null
@@ -1,187 +0,0 @@
-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/concat-stream/node_modules/safe-buffer/index.js b/node_modules/concat-stream/node_modules/safe-buffer/index.js
deleted file mode 100644
index 22438da..0000000
--- a/node_modules/concat-stream/node_modules/safe-buffer/index.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/* 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/concat-stream/node_modules/safe-buffer/package.json b/node_modules/concat-stream/node_modules/safe-buffer/package.json
deleted file mode 100644
index 0e96ff5..0000000
--- a/node_modules/concat-stream/node_modules/safe-buffer/package.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-  "author": {
-    "email": "feross@feross.org",
-    "name": "Feross Aboukhadijeh",
-    "url": "http://feross.org"
-  },
-  "bugs": {
-    "url": "https://github.com/feross/safe-buffer/issues"
-  },
-  "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"
-}
\ No newline at end of file
diff --git a/node_modules/concat-stream/node_modules/string_decoder/.travis.yml b/node_modules/concat-stream/node_modules/string_decoder/.travis.yml
deleted file mode 100644
index 3347a72..0000000
--- a/node_modules/concat-stream/node_modules/string_decoder/.travis.yml
+++ /dev/null
@@ -1,50 +0,0 @@
-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/concat-stream/node_modules/string_decoder/LICENSE b/node_modules/concat-stream/node_modules/string_decoder/LICENSE
deleted file mode 100644
index 778edb2..0000000
--- a/node_modules/concat-stream/node_modules/string_decoder/LICENSE
+++ /dev/null
@@ -1,48 +0,0 @@
-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/concat-stream/node_modules/string_decoder/README.md b/node_modules/concat-stream/node_modules/string_decoder/README.md
deleted file mode 100644
index 5fd5831..0000000
--- a/node_modules/concat-stream/node_modules/string_decoder/README.md
+++ /dev/null
@@ -1,47 +0,0 @@
-# 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/concat-stream/node_modules/string_decoder/lib/string_decoder.js b/node_modules/concat-stream/node_modules/string_decoder/lib/string_decoder.js
deleted file mode 100644
index 2e89e63..0000000
--- a/node_modules/concat-stream/node_modules/string_decoder/lib/string_decoder.js
+++ /dev/null
@@ -1,296 +0,0 @@
-// 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/concat-stream/node_modules/string_decoder/package.json b/node_modules/concat-stream/node_modules/string_decoder/package.json
deleted file mode 100644
index ffd908e..0000000
--- a/node_modules/concat-stream/node_modules/string_decoder/package.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "dependencies": {
-    "safe-buffer": "~5.1.0"
-  },
-  "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"
-}
\ No newline at end of file
diff --git a/node_modules/concat-stream/package.json b/node_modules/concat-stream/package.json
deleted file mode 100644
index a2e1aa1..0000000
--- a/node_modules/concat-stream/package.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
-  "author": "Max Ogden <max@maxogden.com>",
-  "bugs": {
-    "url": "http://github.com/maxogden/concat-stream/issues"
-  },
-  "dependencies": {
-    "buffer-from": "^1.0.0",
-    "inherits": "^2.0.3",
-    "readable-stream": "^2.2.2",
-    "typedarray": "^0.0.6"
-  },
-  "description": "writable stream that concatenates strings or binary data and calls a callback with the result",
-  "devDependencies": {
-    "tape": "^4.6.3"
-  },
-  "engines": [
-    "node >= 0.8"
-  ],
-  "files": [
-    "index.js"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "concat-stream",
-  "repository": {
-    "type": "git",
-    "url": "http://github.com/maxogden/concat-stream.git"
-  },
-  "scripts": {
-    "test": "tape test/*.js test/server/*.js"
-  },
-  "tags": [
-    "stream",
-    "simple",
-    "util",
-    "utility"
-  ],
-  "testling": {
-    "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"
-    ],
-    "files": "test/*.js"
-  },
-  "version": "1.6.2"
-}
\ No newline at end of file
diff --git a/node_modules/concat-stream/readme.md b/node_modules/concat-stream/readme.md
deleted file mode 100644
index 7aa19c4..0000000
--- a/node_modules/concat-stream/readme.md
+++ /dev/null
@@ -1,102 +0,0 @@
-# concat-stream
-
-Writable stream that concatenates all the data from a stream and calls a callback with the result. Use this when you want to collect all the data from a stream into a single buffer.
-
-[![Build Status](https://travis-ci.org/maxogden/concat-stream.svg?branch=master)](https://travis-ci.org/maxogden/concat-stream)
-
-[![NPM](https://nodei.co/npm/concat-stream.png)](https://nodei.co/npm/concat-stream/)
-
-### description
-
-Streams emit many buffers. If you want to collect all of the buffers, and when the stream ends concatenate all of the buffers together and receive a single buffer then this is the module for you.
-
-Only use this if you know you can fit all of the output of your stream into a single Buffer (e.g. in RAM).
-
-There are also `objectMode` streams that emit things other than Buffers, and you can concatenate these too. See below for details.
-
-## Related
-
-`concat-stream` is part of the [mississippi stream utility collection](https://github.com/maxogden/mississippi) which includes more useful stream modules similar to this one.
-
-### examples
-
-#### Buffers
-
-```js
-var fs = require('fs')
-var concat = require('concat-stream')
-
-var readStream = fs.createReadStream('cat.png')
-var concatStream = concat(gotPicture)
-
-readStream.on('error', handleError)
-readStream.pipe(concatStream)
-
-function gotPicture(imageBuffer) {
-  // imageBuffer is all of `cat.png` as a node.js Buffer
-}
-
-function handleError(err) {
-  // handle your error appropriately here, e.g.:
-  console.error(err) // print the error to STDERR
-  process.exit(1) // exit program with non-zero exit code
-}
-
-```
-
-#### Arrays
-
-```js
-var write = concat(function(data) {})
-write.write([1,2,3])
-write.write([4,5,6])
-write.end()
-// data will be [1,2,3,4,5,6] in the above callback
-```
-
-#### Uint8Arrays
-
-```js
-var write = concat(function(data) {})
-var a = new Uint8Array(3)
-a[0] = 97; a[1] = 98; a[2] = 99
-write.write(a)
-write.write('!')
-write.end(Buffer.from('!!1'))
-```
-
-See `test/` for more examples
-
-# methods
-
-```js
-var concat = require('concat-stream')
-```
-
-## var writable = concat(opts={}, cb)
-
-Return a `writable` stream that will fire `cb(data)` with all of the data that
-was written to the stream. Data can be written to `writable` as strings,
-Buffers, arrays of byte integers, and Uint8Arrays. 
-
-By default `concat-stream` will give you back the same data type as the type of the first buffer written to the stream. Use `opts.encoding` to set what format `data` should be returned as, e.g. if you if you don't want to rely on the built-in type checking or for some other reason.
-
-* `string` - get a string
-* `buffer` - get back a Buffer
-* `array` - get an array of byte integers
-* `uint8array`, `u8`, `uint8` - get back a Uint8Array
-* `object`, get back an array of Objects
-
-If you don't specify an encoding, and the types can't be inferred (e.g. you write things that aren't in the list above), it will try to convert concat them into a `Buffer`.
-
-If nothing is written to `writable` then `data` will be an empty array `[]`.
-
-# error handling
-
-`concat-stream` does not handle errors for you, so you must handle errors on whatever streams you pipe into `concat-stream`. This is a general rule when programming with node.js streams: always handle errors on each and every stream. Since `concat-stream` is not itself a stream it does not emit errors.
-
-We recommend using [`end-of-stream`](https://npmjs.org/end-of-stream) or [`pump`](https://npmjs.org/pump) for writing error tolerant stream code.
-
-# license
-
-MIT LICENSE
diff --git a/node_modules/concat-stream/node_modules/safe-buffer/LICENSE b/node_modules/end-of-stream/LICENSE
similarity index 96%
copy from node_modules/concat-stream/node_modules/safe-buffer/LICENSE
copy to node_modules/end-of-stream/LICENSE
index 0c068ce..757562e 100644
--- a/node_modules/concat-stream/node_modules/safe-buffer/LICENSE
+++ b/node_modules/end-of-stream/LICENSE
@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) Feross Aboukhadijeh
+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
@@ -18,4 +18,4 @@
 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.
+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..7ceb45f
--- /dev/null
+++ b/node_modules/end-of-stream/package.json
@@ -0,0 +1,37 @@
+{
+  "author": "Mathias Buus <mathiasbuus@gmail.com>",
+  "bugs": {
+    "url": "https://github.com/mafintosh/end-of-stream/issues"
+  },
+  "dependencies": {
+    "once": "^1.4.0"
+  },
+  "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"
+}
\ No newline at end of file
diff --git a/node_modules/es6-promise/CHANGELOG.md b/node_modules/es6-promise/CHANGELOG.md
deleted file mode 100644
index d630cc0..0000000
--- a/node_modules/es6-promise/CHANGELOG.md
+++ /dev/null
@@ -1,155 +0,0 @@
-# Master
-
-# 4.2.5
-
-* remove old try/catch performance hacks, modern runtimes do not require these tricks
-
-# 4.2.4
-
-* [Fixes #305] Confuse webpack
-
-# 4.2.3
-
-* Cleanup testem related build configuration
-* Use `prepublishOnly` instead of `prepublish` (thanks @rhysd)
-* Add Node.js 9, 8 to testing matrix
-* drop now unused s3 deployment files
-* internal cleanup (thanks to @bekzod, @mariusschulz)
-* Fixup Changelog
-
-# 4.2.2
-
-* Ensure PROMISE_ID works correctly
-* internal cleanup (thanks yo @mariusschulz)
-
-# 4.2.1
-
-* drop bower support
-
-# 4.2.0
-
-* drop `dist` from git repo
-* add `Promise.prototype.finally`
-* update various build related dependencies
-* add CDN links
-
-# 4.1.0
-
-* [BUGFIX] Fix memory leak [#269]
-* [BUGFIX] Auto Bundles within an AMD Environment [#263]
-
-# 4.0.5
-
-* fix require('es6-promise/auto') for Node < 4
-
-# 4.0.4
-
-* fix asap when using https://github.com/Kinvey/titanium-sdk
-
-# 4.0.3
-
-* fix Readme links
-
-# 4.0.2
-
-* fix require('es6-promise/auto');
-
-# 4.0.0
-
-* no longer polyfill automatically, if needed one can still invoke
-  `require('es6-promise/auto')` directly.
-
-# 3.3.1
-
-* fix links in readme
-
-# 3.3.0
-
-* support polyfil on WebMAF (playstation env)
-* fix tampering related bug global `constructor` was referenced by mistake.
-* provide TS Typings
-* increase compatibliity with sinon.useFakeTimers();
-* update build tools (use rollup)
-* directly export promise;
-
-# 3.2.2
-
-* IE8: use isArray
-* update build dependencies
-
-# 3.2.1
-
-* fix race tampering issue
-* use eslint
-* fix Promise.all tampering
-* remove unused code
-* fix issues with NWJS/electron
-
-# 3.2.0
-
-* improve tamper resistence of Promise.all Promise.race and
-  Promise.prototype.then (note, this isn't complete, but addresses an exception
-  when used \w core-js, follow up work will address entirely)
-* remove spec incompatible then chaining fast-path
-* add eslint
-* update build deps
-
-# 3.1.2
-
-* fix node detection issues with NWJS/electron
-
-# 3.1.0
-
-* improve performance of Promise.all when it encounters a non-promise input object input
-* then/resolve tamper protection
-* reduce AST size of promise constructor, to facilitate more inlining
-* Update README.md with details about PhantomJS requirement for running tests
-* Mangle and compress the minified version
-
-# 3.0.2
-
-* correctly bump both bower and package.json versions
-
-# 3.0.1
-
-* no longer include dist/test in npm releases
-
-# 3.0.0
-
-* use nextTick() instead of setImmediate() to schedule microtasks with node 0.10. Later versions of
-  nodes are not affected as they were already using nextTick(). Note that using nextTick() might
-  trigger a depreciation warning on 0.10 as described at https://github.com/cujojs/when/issues/410.
-  The reason why nextTick() is preferred is that is setImmediate() would schedule a macrotask
-  instead of a microtask and might result in a different scheduling.
-  If needed you can revert to the former behavior as follow:
-
-    var Promise = require('es6-promise').Promise;
-    Promise._setScheduler(setImmediate);
-
-# 2.3.0
-
-* #121: Ability to override the internal asap implementation
-* #120: Use an ascii character for an apostrophe, for source maps
-
-# 2.2.0
-
-* #116: Expose asap() and a way to override the scheduling mechanism on Promise
-* Lock to v0.2.3 of ember-cli
-
-# 2.1.1
-
-* Fix #100 via #105: tell browserify to ignore vertx require
-* Fix #101 via #102: "follow thenable state, not own state"
-
-# 2.1.0
-
-* #59: Automatic polyfill. No need to invoke `ES6Promise.polyfill()` anymore.
-* ... (see the commit log)
-
-# 2.0.0
-
-* re-sync with RSVP. Many large performance improvements and bugfixes.
-
-# 1.0.0
-
-* first subset of RSVP
diff --git a/node_modules/es6-promise/README.md b/node_modules/es6-promise/README.md
deleted file mode 100644
index 951db75..0000000
--- a/node_modules/es6-promise/README.md
+++ /dev/null
@@ -1,97 +0,0 @@
-# ES6-Promise (subset of [rsvp.js](https://github.com/tildeio/rsvp.js)) [![Build Status](https://travis-ci.org/stefanpenner/es6-promise.svg?branch=master)](https://travis-ci.org/stefanpenner/es6-promise)
-
-This is a polyfill of the [ES6 Promise](http://www.ecma-international.org/ecma-262/6.0/#sec-promise-constructor). The implementation is a subset of [rsvp.js](https://github.com/tildeio/rsvp.js) extracted by @jakearchibald, if you're wanting extra features and more debugging options, check out the [full library](https://github.com/tildeio/rsvp.js).
-
-For API details and how to use promises, see the <a href="http://www.html5rocks.com/en/tutorials/es6/promises/">JavaScript Promises HTML5Rocks article</a>.
-
-## Downloads
-
-* [es6-promise 27.86 KB (7.33 KB gzipped)](https://cdn.jsdelivr.net/npm/es6-promise/dist/es6-promise.js)
-* [es6-promise-auto 27.78 KB (7.3 KB gzipped)](https://cdn.jsdelivr.net/npm/es6-promise/dist/es6-promise.auto.js) - Automatically provides/replaces `Promise` if missing or broken.
-* [es6-promise-min 6.17 KB (2.4 KB gzipped)](https://cdn.jsdelivr.net/npm/es6-promise/dist/es6-promise.min.js)
-* [es6-promise-auto-min 6.19 KB (2.4 KB gzipped)](https://cdn.jsdelivr.net/npm/es6-promise/dist/es6-promise.auto.min.js) - Minified version of `es6-promise-auto` above.
-
-## CDN 
-
-To use via a CDN include this in your html:
-
-```html
-<!-- Automatically provides/replaces `Promise` if missing or broken. -->
-<script src="https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.js"></script>
-<script src="https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.js"></script> 
-
-<!-- Minified version of `es6-promise-auto` below. -->
-<script src="https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.min.js"></script>
-<script src="https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.min.js"></script> 
-
-```
-
-## Node.js
-
-To install:
-
-```sh
-yarn add es6-promise
-```
-
-or
-
-```sh
-npm install es6-promise
-```
-
-To use:
-
-```js
-var Promise = require('es6-promise').Promise;
-```
-
-
-## Usage in IE<9
-
-`catch` and `finally` are reserved keywords in IE<9, meaning
-`promise.catch(func)` or `promise.finally(func)` throw a syntax error. To work
-around this, you can use a string to access the property as shown in the
-following example.
-
-However most minifiers will automatically fix this for you, making the
-resulting code safe for old browsers and production:
-
-```js
-promise['catch'](function(err) {
-  // ...
-});
-```
-
-```js
-promise['finally'](function() {
-  // ...
-});
-```
-
-## Auto-polyfill
-
-To polyfill the global environment (either in Node or in the browser via CommonJS) use the following code snippet:
-
-```js
-require('es6-promise').polyfill();
-```
-
-Alternatively
-
-```js
-require('es6-promise/auto');
-```
-
-Notice that we don't assign the result of `polyfill()` to any variable. The `polyfill()` method will patch the global environment (in this case to the `Promise` name) when called.
-
-## Building & Testing
-
-You will need to have PhantomJS installed globally in order to run the tests.
-
-`npm install -g phantomjs`
-
-* `npm run build` to build
-* `npm test` to run tests
-* `npm start` to run a build watcher, and webserver to test
-* `npm run test:server` for a testem test runner and watching builder
diff --git a/node_modules/es6-promise/auto.js b/node_modules/es6-promise/auto.js
deleted file mode 100644
index 92bbf36..0000000
--- a/node_modules/es6-promise/auto.js
+++ /dev/null
@@ -1,4 +0,0 @@
-// This file can be required in Browserify and Node.js for automatic polyfill
-// To use it:  require('es6-promise/auto');
-'use strict';
-module.exports = require('./').polyfill();
diff --git a/node_modules/es6-promise/dist/es6-promise.auto.js b/node_modules/es6-promise/dist/es6-promise.auto.js
deleted file mode 100644
index 7ad1de5..0000000
--- a/node_modules/es6-promise/dist/es6-promise.auto.js
+++ /dev/null
@@ -1,1176 +0,0 @@
-/*!
- * @overview es6-promise - a tiny implementation of Promises/A+.
- * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
- * @license   Licensed under MIT license
- *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
- * @version   v4.2.8+1e68dce6
- */
-
-(function (global, factory) {
-	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-	typeof define === 'function' && define.amd ? define(factory) :
-	(global.ES6Promise = factory());
-}(this, (function () { 'use strict';
-
-function objectOrFunction(x) {
-  var type = typeof x;
-  return x !== null && (type === 'object' || type === 'function');
-}
-
-function isFunction(x) {
-  return typeof x === 'function';
-}
-
-
-
-var _isArray = void 0;
-if (Array.isArray) {
-  _isArray = Array.isArray;
-} else {
-  _isArray = function (x) {
-    return Object.prototype.toString.call(x) === '[object Array]';
-  };
-}
-
-var isArray = _isArray;
-
-var len = 0;
-var vertxNext = void 0;
-var customSchedulerFn = void 0;
-
-var asap = function asap(callback, arg) {
-  queue[len] = callback;
-  queue[len + 1] = arg;
-  len += 2;
-  if (len === 2) {
-    // If len is 2, that means that we need to schedule an async flush.
-    // If additional callbacks are queued before the queue is flushed, they
-    // will be processed by this flush that we are scheduling.
-    if (customSchedulerFn) {
-      customSchedulerFn(flush);
-    } else {
-      scheduleFlush();
-    }
-  }
-};
-
-function setScheduler(scheduleFn) {
-  customSchedulerFn = scheduleFn;
-}
-
-function setAsap(asapFn) {
-  asap = asapFn;
-}
-
-var browserWindow = typeof window !== 'undefined' ? window : undefined;
-var browserGlobal = browserWindow || {};
-var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
-var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
-
-// test for web worker but not in IE10
-var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';
-
-// node
-function useNextTick() {
-  // node version 0.10.x displays a deprecation warning when nextTick is used recursively
-  // see https://github.com/cujojs/when/issues/410 for details
-  return function () {
-    return process.nextTick(flush);
-  };
-}
-
-// vertx
-function useVertxTimer() {
-  if (typeof vertxNext !== 'undefined') {
-    return function () {
-      vertxNext(flush);
-    };
-  }
-
-  return useSetTimeout();
-}
-
-function useMutationObserver() {
-  var iterations = 0;
-  var observer = new BrowserMutationObserver(flush);
-  var node = document.createTextNode('');
-  observer.observe(node, { characterData: true });
-
-  return function () {
-    node.data = iterations = ++iterations % 2;
-  };
-}
-
-// web worker
-function useMessageChannel() {
-  var channel = new MessageChannel();
-  channel.port1.onmessage = flush;
-  return function () {
-    return channel.port2.postMessage(0);
-  };
-}
-
-function useSetTimeout() {
-  // Store setTimeout reference so es6-promise will be unaffected by
-  // other code modifying setTimeout (like sinon.useFakeTimers())
-  var globalSetTimeout = setTimeout;
-  return function () {
-    return globalSetTimeout(flush, 1);
-  };
-}
-
-var queue = new Array(1000);
-function flush() {
-  for (var i = 0; i < len; i += 2) {
-    var callback = queue[i];
-    var arg = queue[i + 1];
-
-    callback(arg);
-
-    queue[i] = undefined;
-    queue[i + 1] = undefined;
-  }
-
-  len = 0;
-}
-
-function attemptVertx() {
-  try {
-    var vertx = Function('return this')().require('vertx');
-    vertxNext = vertx.runOnLoop || vertx.runOnContext;
-    return useVertxTimer();
-  } catch (e) {
-    return useSetTimeout();
-  }
-}
-
-var scheduleFlush = void 0;
-// Decide what async method to use to triggering processing of queued callbacks:
-if (isNode) {
-  scheduleFlush = useNextTick();
-} else if (BrowserMutationObserver) {
-  scheduleFlush = useMutationObserver();
-} else if (isWorker) {
-  scheduleFlush = useMessageChannel();
-} else if (browserWindow === undefined && typeof require === 'function') {
-  scheduleFlush = attemptVertx();
-} else {
-  scheduleFlush = useSetTimeout();
-}
-
-function then(onFulfillment, onRejection) {
-  var parent = this;
-
-  var child = new this.constructor(noop);
-
-  if (child[PROMISE_ID] === undefined) {
-    makePromise(child);
-  }
-
-  var _state = parent._state;
-
-
-  if (_state) {
-    var callback = arguments[_state - 1];
-    asap(function () {
-      return invokeCallback(_state, child, callback, parent._result);
-    });
-  } else {
-    subscribe(parent, child, onFulfillment, onRejection);
-  }
-
-  return child;
-}
-
-/**
-  `Promise.resolve` returns a promise that will become resolved with the
-  passed `value`. It is shorthand for the following:
-
-  ```javascript
-  let promise = new Promise(function(resolve, reject){
-    resolve(1);
-  });
-
-  promise.then(function(value){
-    // value === 1
-  });
-  ```
-
-  Instead of writing the above, your code now simply becomes the following:
-
-  ```javascript
-  let promise = Promise.resolve(1);
-
-  promise.then(function(value){
-    // value === 1
-  });
-  ```
-
-  @method resolve
-  @static
-  @param {Any} value value that the returned promise will be resolved with
-  Useful for tooling.
-  @return {Promise} a promise that will become fulfilled with the given
-  `value`
-*/
-function resolve$1(object) {
-  /*jshint validthis:true */
-  var Constructor = this;
-
-  if (object && typeof object === 'object' && object.constructor === Constructor) {
-    return object;
-  }
-
-  var promise = new Constructor(noop);
-  resolve(promise, object);
-  return promise;
-}
-
-var PROMISE_ID = Math.random().toString(36).substring(2);
-
-function noop() {}
-
-var PENDING = void 0;
-var FULFILLED = 1;
-var REJECTED = 2;
-
-function selfFulfillment() {
-  return new TypeError("You cannot resolve a promise with itself");
-}
-
-function cannotReturnOwn() {
-  return new TypeError('A promises callback cannot return that same promise.');
-}
-
-function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {
-  try {
-    then$$1.call(value, fulfillmentHandler, rejectionHandler);
-  } catch (e) {
-    return e;
-  }
-}
-
-function handleForeignThenable(promise, thenable, then$$1) {
-  asap(function (promise) {
-    var sealed = false;
-    var error = tryThen(then$$1, thenable, function (value) {
-      if (sealed) {
-        return;
-      }
-      sealed = true;
-      if (thenable !== value) {
-        resolve(promise, value);
-      } else {
-        fulfill(promise, value);
-      }
-    }, function (reason) {
-      if (sealed) {
-        return;
-      }
-      sealed = true;
-
-      reject(promise, reason);
-    }, 'Settle: ' + (promise._label || ' unknown promise'));
-
-    if (!sealed && error) {
-      sealed = true;
-      reject(promise, error);
-    }
-  }, promise);
-}
-
-function handleOwnThenable(promise, thenable) {
-  if (thenable._state === FULFILLED) {
-    fulfill(promise, thenable._result);
-  } else if (thenable._state === REJECTED) {
-    reject(promise, thenable._result);
-  } else {
-    subscribe(thenable, undefined, function (value) {
-      return resolve(promise, value);
-    }, function (reason) {
-      return reject(promise, reason);
-    });
-  }
-}
-
-function handleMaybeThenable(promise, maybeThenable, then$$1) {
-  if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {
-    handleOwnThenable(promise, maybeThenable);
-  } else {
-    if (then$$1 === undefined) {
-      fulfill(promise, maybeThenable);
-    } else if (isFunction(then$$1)) {
-      handleForeignThenable(promise, maybeThenable, then$$1);
-    } else {
-      fulfill(promise, maybeThenable);
-    }
-  }
-}
-
-function resolve(promise, value) {
-  if (promise === value) {
-    reject(promise, selfFulfillment());
-  } else if (objectOrFunction(value)) {
-    var then$$1 = void 0;
-    try {
-      then$$1 = value.then;
-    } catch (error) {
-      reject(promise, error);
-      return;
-    }
-    handleMaybeThenable(promise, value, then$$1);
-  } else {
-    fulfill(promise, value);
-  }
-}
-
-function publishRejection(promise) {
-  if (promise._onerror) {
-    promise._onerror(promise._result);
-  }
-
-  publish(promise);
-}
-
-function fulfill(promise, value) {
-  if (promise._state !== PENDING) {
-    return;
-  }
-
-  promise._result = value;
-  promise._state = FULFILLED;
-
-  if (promise._subscribers.length !== 0) {
-    asap(publish, promise);
-  }
-}
-
-function reject(promise, reason) {
-  if (promise._state !== PENDING) {
-    return;
-  }
-  promise._state = REJECTED;
-  promise._result = reason;
-
-  asap(publishRejection, promise);
-}
-
-function subscribe(parent, child, onFulfillment, onRejection) {
-  var _subscribers = parent._subscribers;
-  var length = _subscribers.length;
-
-
-  parent._onerror = null;
-
-  _subscribers[length] = child;
-  _subscribers[length + FULFILLED] = onFulfillment;
-  _subscribers[length + REJECTED] = onRejection;
-
-  if (length === 0 && parent._state) {
-    asap(publish, parent);
-  }
-}
-
-function publish(promise) {
-  var subscribers = promise._subscribers;
-  var settled = promise._state;
-
-  if (subscribers.length === 0) {
-    return;
-  }
-
-  var child = void 0,
-      callback = void 0,
-      detail = promise._result;
-
-  for (var i = 0; i < subscribers.length; i += 3) {
-    child = subscribers[i];
-    callback = subscribers[i + settled];
-
-    if (child) {
-      invokeCallback(settled, child, callback, detail);
-    } else {
-      callback(detail);
-    }
-  }
-
-  promise._subscribers.length = 0;
-}
-
-function invokeCallback(settled, promise, callback, detail) {
-  var hasCallback = isFunction(callback),
-      value = void 0,
-      error = void 0,
-      succeeded = true;
-
-  if (hasCallback) {
-    try {
-      value = callback(detail);
-    } catch (e) {
-      succeeded = false;
-      error = e;
-    }
-
-    if (promise === value) {
-      reject(promise, cannotReturnOwn());
-      return;
-    }
-  } else {
-    value = detail;
-  }
-
-  if (promise._state !== PENDING) {
-    // noop
-  } else if (hasCallback && succeeded) {
-    resolve(promise, value);
-  } else if (succeeded === false) {
-    reject(promise, error);
-  } else if (settled === FULFILLED) {
-    fulfill(promise, value);
-  } else if (settled === REJECTED) {
-    reject(promise, value);
-  }
-}
-
-function initializePromise(promise, resolver) {
-  try {
-    resolver(function resolvePromise(value) {
-      resolve(promise, value);
-    }, function rejectPromise(reason) {
-      reject(promise, reason);
-    });
-  } catch (e) {
-    reject(promise, e);
-  }
-}
-
-var id = 0;
-function nextId() {
-  return id++;
-}
-
-function makePromise(promise) {
-  promise[PROMISE_ID] = id++;
-  promise._state = undefined;
-  promise._result = undefined;
-  promise._subscribers = [];
-}
-
-function validationError() {
-  return new Error('Array Methods must be provided an Array');
-}
-
-var Enumerator = function () {
-  function Enumerator(Constructor, input) {
-    this._instanceConstructor = Constructor;
-    this.promise = new Constructor(noop);
-
-    if (!this.promise[PROMISE_ID]) {
-      makePromise(this.promise);
-    }
-
-    if (isArray(input)) {
-      this.length = input.length;
-      this._remaining = input.length;
-
-      this._result = new Array(this.length);
-
-      if (this.length === 0) {
-        fulfill(this.promise, this._result);
-      } else {
-        this.length = this.length || 0;
-        this._enumerate(input);
-        if (this._remaining === 0) {
-          fulfill(this.promise, this._result);
-        }
-      }
-    } else {
-      reject(this.promise, validationError());
-    }
-  }
-
-  Enumerator.prototype._enumerate = function _enumerate(input) {
-    for (var i = 0; this._state === PENDING && i < input.length; i++) {
-      this._eachEntry(input[i], i);
-    }
-  };
-
-  Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {
-    var c = this._instanceConstructor;
-    var resolve$$1 = c.resolve;
-
-
-    if (resolve$$1 === resolve$1) {
-      var _then = void 0;
-      var error = void 0;
-      var didError = false;
-      try {
-        _then = entry.then;
-      } catch (e) {
-        didError = true;
-        error = e;
-      }
-
-      if (_then === then && entry._state !== PENDING) {
-        this._settledAt(entry._state, i, entry._result);
-      } else if (typeof _then !== 'function') {
-        this._remaining--;
-        this._result[i] = entry;
-      } else if (c === Promise$2) {
-        var promise = new c(noop);
-        if (didError) {
-          reject(promise, error);
-        } else {
-          handleMaybeThenable(promise, entry, _then);
-        }
-        this._willSettleAt(promise, i);
-      } else {
-        this._willSettleAt(new c(function (resolve$$1) {
-          return resolve$$1(entry);
-        }), i);
-      }
-    } else {
-      this._willSettleAt(resolve$$1(entry), i);
-    }
-  };
-
-  Enumerator.prototype._settledAt = function _settledAt(state, i, value) {
-    var promise = this.promise;
-
-
-    if (promise._state === PENDING) {
-      this._remaining--;
-
-      if (state === REJECTED) {
-        reject(promise, value);
-      } else {
-        this._result[i] = value;
-      }
-    }
-
-    if (this._remaining === 0) {
-      fulfill(promise, this._result);
-    }
-  };
-
-  Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {
-    var enumerator = this;
-
-    subscribe(promise, undefined, function (value) {
-      return enumerator._settledAt(FULFILLED, i, value);
-    }, function (reason) {
-      return enumerator._settledAt(REJECTED, i, reason);
-    });
-  };
-
-  return Enumerator;
-}();
-
-/**
-  `Promise.all` accepts an array of promises, and returns a new promise which
-  is fulfilled with an array of fulfillment values for the passed promises, or
-  rejected with the reason of the first passed promise to be rejected. It casts all
-  elements of the passed iterable to promises as it runs this algorithm.
-
-  Example:
-
-  ```javascript
-  let promise1 = resolve(1);
-  let promise2 = resolve(2);
-  let promise3 = resolve(3);
-  let promises = [ promise1, promise2, promise3 ];
-
-  Promise.all(promises).then(function(array){
-    // The array here would be [ 1, 2, 3 ];
-  });
-  ```
-
-  If any of the `promises` given to `all` are rejected, the first promise
-  that is rejected will be given as an argument to the returned promises's
-  rejection handler. For example:
-
-  Example:
-
-  ```javascript
-  let promise1 = resolve(1);
-  let promise2 = reject(new Error("2"));
-  let promise3 = reject(new Error("3"));
-  let promises = [ promise1, promise2, promise3 ];
-
-  Promise.all(promises).then(function(array){
-    // Code here never runs because there are rejected promises!
-  }, function(error) {
-    // error.message === "2"
-  });
-  ```
-
-  @method all
-  @static
-  @param {Array} entries array of promises
-  @param {String} label optional string for labeling the promise.
-  Useful for tooling.
-  @return {Promise} promise that is fulfilled when all `promises` have been
-  fulfilled, or rejected if any of them become rejected.
-  @static
-*/
-function all(entries) {
-  return new Enumerator(this, entries).promise;
-}
-
-/**
-  `Promise.race` returns a new promise which is settled in the same way as the
-  first passed promise to settle.
-
-  Example:
-
-  ```javascript
-  let promise1 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      resolve('promise 1');
-    }, 200);
-  });
-
-  let promise2 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      resolve('promise 2');
-    }, 100);
-  });
-
-  Promise.race([promise1, promise2]).then(function(result){
-    // result === 'promise 2' because it was resolved before promise1
-    // was resolved.
-  });
-  ```
-
-  `Promise.race` is deterministic in that only the state of the first
-  settled promise matters. For example, even if other promises given to the
-  `promises` array argument are resolved, but the first settled promise has
-  become rejected before the other promises became fulfilled, the returned
-  promise will become rejected:
-
-  ```javascript
-  let promise1 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      resolve('promise 1');
-    }, 200);
-  });
-
-  let promise2 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      reject(new Error('promise 2'));
-    }, 100);
-  });
-
-  Promise.race([promise1, promise2]).then(function(result){
-    // Code here never runs
-  }, function(reason){
-    // reason.message === 'promise 2' because promise 2 became rejected before
-    // promise 1 became fulfilled
-  });
-  ```
-
-  An example real-world use case is implementing timeouts:
-
-  ```javascript
-  Promise.race([ajax('foo.json'), timeout(5000)])
-  ```
-
-  @method race
-  @static
-  @param {Array} promises array of promises to observe
-  Useful for tooling.
-  @return {Promise} a promise which settles in the same way as the first passed
-  promise to settle.
-*/
-function race(entries) {
-  /*jshint validthis:true */
-  var Constructor = this;
-
-  if (!isArray(entries)) {
-    return new Constructor(function (_, reject) {
-      return reject(new TypeError('You must pass an array to race.'));
-    });
-  } else {
-    return new Constructor(function (resolve, reject) {
-      var length = entries.length;
-      for (var i = 0; i < length; i++) {
-        Constructor.resolve(entries[i]).then(resolve, reject);
-      }
-    });
-  }
-}
-
-/**
-  `Promise.reject` returns a promise rejected with the passed `reason`.
-  It is shorthand for the following:
-
-  ```javascript
-  let promise = new Promise(function(resolve, reject){
-    reject(new Error('WHOOPS'));
-  });
-
-  promise.then(function(value){
-    // Code here doesn't run because the promise is rejected!
-  }, function(reason){
-    // reason.message === 'WHOOPS'
-  });
-  ```
-
-  Instead of writing the above, your code now simply becomes the following:
-
-  ```javascript
-  let promise = Promise.reject(new Error('WHOOPS'));
-
-  promise.then(function(value){
-    // Code here doesn't run because the promise is rejected!
-  }, function(reason){
-    // reason.message === 'WHOOPS'
-  });
-  ```
-
-  @method reject
-  @static
-  @param {Any} reason value that the returned promise will be rejected with.
-  Useful for tooling.
-  @return {Promise} a promise rejected with the given `reason`.
-*/
-function reject$1(reason) {
-  /*jshint validthis:true */
-  var Constructor = this;
-  var promise = new Constructor(noop);
-  reject(promise, reason);
-  return promise;
-}
-
-function needsResolver() {
-  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
-}
-
-function needsNew() {
-  throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
-}
-
-/**
-  Promise objects represent the eventual result of an asynchronous operation. The
-  primary way of interacting with a promise is through its `then` method, which
-  registers callbacks to receive either a promise's eventual value or the reason
-  why the promise cannot be fulfilled.
-
-  Terminology
-  -----------
-
-  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
-  - `thenable` is an object or function that defines a `then` method.
-  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
-  - `exception` is a value that is thrown using the throw statement.
-  - `reason` is a value that indicates why a promise was rejected.
-  - `settled` the final resting state of a promise, fulfilled or rejected.
-
-  A promise can be in one of three states: pending, fulfilled, or rejected.
-
-  Promises that are fulfilled have a fulfillment value and are in the fulfilled
-  state.  Promises that are rejected have a rejection reason and are in the
-  rejected state.  A fulfillment value is never a thenable.
-
-  Promises can also be said to *resolve* a value.  If this value is also a
-  promise, then the original promise's settled state will match the value's
-  settled state.  So a promise that *resolves* a promise that rejects will
-  itself reject, and a promise that *resolves* a promise that fulfills will
-  itself fulfill.
-
-
-  Basic Usage:
-  ------------
-
-  ```js
-  let promise = new Promise(function(resolve, reject) {
-    // on success
-    resolve(value);
-
-    // on failure
-    reject(reason);
-  });
-
-  promise.then(function(value) {
-    // on fulfillment
-  }, function(reason) {
-    // on rejection
-  });
-  ```
-
-  Advanced Usage:
-  ---------------
-
-  Promises shine when abstracting away asynchronous interactions such as
-  `XMLHttpRequest`s.
-
-  ```js
-  function getJSON(url) {
-    return new Promise(function(resolve, reject){
-      let xhr = new XMLHttpRequest();
-
-      xhr.open('GET', url);
-      xhr.onreadystatechange = handler;
-      xhr.responseType = 'json';
-      xhr.setRequestHeader('Accept', 'application/json');
-      xhr.send();
-
-      function handler() {
-        if (this.readyState === this.DONE) {
-          if (this.status === 200) {
-            resolve(this.response);
-          } else {
-            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
-          }
-        }
-      };
-    });
-  }
-
-  getJSON('/posts.json').then(function(json) {
-    // on fulfillment
-  }, function(reason) {
-    // on rejection
-  });
-  ```
-
-  Unlike callbacks, promises are great composable primitives.
-
-  ```js
-  Promise.all([
-    getJSON('/posts'),
-    getJSON('/comments')
-  ]).then(function(values){
-    values[0] // => postsJSON
-    values[1] // => commentsJSON
-
-    return values;
-  });
-  ```
-
-  @class Promise
-  @param {Function} resolver
-  Useful for tooling.
-  @constructor
-*/
-
-var Promise$2 = function () {
-  function Promise(resolver) {
-    this[PROMISE_ID] = nextId();
-    this._result = this._state = undefined;
-    this._subscribers = [];
-
-    if (noop !== resolver) {
-      typeof resolver !== 'function' && needsResolver();
-      this instanceof Promise ? initializePromise(this, resolver) : needsNew();
-    }
-  }
-
-  /**
-  The primary way of interacting with a promise is through its `then` method,
-  which registers callbacks to receive either a promise's eventual value or the
-  reason why the promise cannot be fulfilled.
-   ```js
-  findUser().then(function(user){
-    // user is available
-  }, function(reason){
-    // user is unavailable, and you are given the reason why
-  });
-  ```
-   Chaining
-  --------
-   The return value of `then` is itself a promise.  This second, 'downstream'
-  promise is resolved with the return value of the first promise's fulfillment
-  or rejection handler, or rejected if the handler throws an exception.
-   ```js
-  findUser().then(function (user) {
-    return user.name;
-  }, function (reason) {
-    return 'default name';
-  }).then(function (userName) {
-    // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
-    // will be `'default name'`
-  });
-   findUser().then(function (user) {
-    throw new Error('Found user, but still unhappy');
-  }, function (reason) {
-    throw new Error('`findUser` rejected and we're unhappy');
-  }).then(function (value) {
-    // never reached
-  }, function (reason) {
-    // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
-    // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
-  });
-  ```
-  If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
-   ```js
-  findUser().then(function (user) {
-    throw new PedagogicalException('Upstream error');
-  }).then(function (value) {
-    // never reached
-  }).then(function (value) {
-    // never reached
-  }, function (reason) {
-    // The `PedgagocialException` is propagated all the way down to here
-  });
-  ```
-   Assimilation
-  ------------
-   Sometimes the value you want to propagate to a downstream promise can only be
-  retrieved asynchronously. This can be achieved by returning a promise in the
-  fulfillment or rejection handler. The downstream promise will then be pending
-  until the returned promise is settled. This is called *assimilation*.
-   ```js
-  findUser().then(function (user) {
-    return findCommentsByAuthor(user);
-  }).then(function (comments) {
-    // The user's comments are now available
-  });
-  ```
-   If the assimliated promise rejects, then the downstream promise will also reject.
-   ```js
-  findUser().then(function (user) {
-    return findCommentsByAuthor(user);
-  }).then(function (comments) {
-    // If `findCommentsByAuthor` fulfills, we'll have the value here
-  }, function (reason) {
-    // If `findCommentsByAuthor` rejects, we'll have the reason here
-  });
-  ```
-   Simple Example
-  --------------
-   Synchronous Example
-   ```javascript
-  let result;
-   try {
-    result = findResult();
-    // success
-  } catch(reason) {
-    // failure
-  }
-  ```
-   Errback Example
-   ```js
-  findResult(function(result, err){
-    if (err) {
-      // failure
-    } else {
-      // success
-    }
-  });
-  ```
-   Promise Example;
-   ```javascript
-  findResult().then(function(result){
-    // success
-  }, function(reason){
-    // failure
-  });
-  ```
-   Advanced Example
-  --------------
-   Synchronous Example
-   ```javascript
-  let author, books;
-   try {
-    author = findAuthor();
-    books  = findBooksByAuthor(author);
-    // success
-  } catch(reason) {
-    // failure
-  }
-  ```
-   Errback Example
-   ```js
-   function foundBooks(books) {
-   }
-   function failure(reason) {
-   }
-   findAuthor(function(author, err){
-    if (err) {
-      failure(err);
-      // failure
-    } else {
-      try {
-        findBoooksByAuthor(author, function(books, err) {
-          if (err) {
-            failure(err);
-          } else {
-            try {
-              foundBooks(books);
-            } catch(reason) {
-              failure(reason);
-            }
-          }
-        });
-      } catch(error) {
-        failure(err);
-      }
-      // success
-    }
-  });
-  ```
-   Promise Example;
-   ```javascript
-  findAuthor().
-    then(findBooksByAuthor).
-    then(function(books){
-      // found books
-  }).catch(function(reason){
-    // something went wrong
-  });
-  ```
-   @method then
-  @param {Function} onFulfilled
-  @param {Function} onRejected
-  Useful for tooling.
-  @return {Promise}
-  */
-
-  /**
-  `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
-  as the catch block of a try/catch statement.
-  ```js
-  function findAuthor(){
-  throw new Error('couldn't find that author');
-  }
-  // synchronous
-  try {
-  findAuthor();
-  } catch(reason) {
-  // something went wrong
-  }
-  // async with promises
-  findAuthor().catch(function(reason){
-  // something went wrong
-  });
-  ```
-  @method catch
-  @param {Function} onRejection
-  Useful for tooling.
-  @return {Promise}
-  */
-
-
-  Promise.prototype.catch = function _catch(onRejection) {
-    return this.then(null, onRejection);
-  };
-
-  /**
-    `finally` will be invoked regardless of the promise's fate just as native
-    try/catch/finally behaves
-  
-    Synchronous example:
-  
-    ```js
-    findAuthor() {
-      if (Math.random() > 0.5) {
-        throw new Error();
-      }
-      return new Author();
-    }
-  
-    try {
-      return findAuthor(); // succeed or fail
-    } catch(error) {
-      return findOtherAuther();
-    } finally {
-      // always runs
-      // doesn't affect the return value
-    }
-    ```
-  
-    Asynchronous example:
-  
-    ```js
-    findAuthor().catch(function(reason){
-      return findOtherAuther();
-    }).finally(function(){
-      // author was either found, or not
-    });
-    ```
-  
-    @method finally
-    @param {Function} callback
-    @return {Promise}
-  */
-
-
-  Promise.prototype.finally = function _finally(callback) {
-    var promise = this;
-    var constructor = promise.constructor;
-
-    if (isFunction(callback)) {
-      return promise.then(function (value) {
-        return constructor.resolve(callback()).then(function () {
-          return value;
-        });
-      }, function (reason) {
-        return constructor.resolve(callback()).then(function () {
-          throw reason;
-        });
-      });
-    }
-
-    return promise.then(callback, callback);
-  };
-
-  return Promise;
-}();
-
-Promise$2.prototype.then = then;
-Promise$2.all = all;
-Promise$2.race = race;
-Promise$2.resolve = resolve$1;
-Promise$2.reject = reject$1;
-Promise$2._setScheduler = setScheduler;
-Promise$2._setAsap = setAsap;
-Promise$2._asap = asap;
-
-/*global self*/
-function polyfill() {
-  var local = void 0;
-
-  if (typeof global !== 'undefined') {
-    local = global;
-  } else if (typeof self !== 'undefined') {
-    local = self;
-  } else {
-    try {
-      local = Function('return this')();
-    } catch (e) {
-      throw new Error('polyfill failed because global object is unavailable in this environment');
-    }
-  }
-
-  var P = local.Promise;
-
-  if (P) {
-    var promiseToString = null;
-    try {
-      promiseToString = Object.prototype.toString.call(P.resolve());
-    } catch (e) {
-      // silently ignored
-    }
-
-    if (promiseToString === '[object Promise]' && !P.cast) {
-      return;
-    }
-  }
-
-  local.Promise = Promise$2;
-}
-
-// Strange compat..
-Promise$2.polyfill = polyfill;
-Promise$2.Promise = Promise$2;
-
-Promise$2.polyfill();
-
-return Promise$2;
-
-})));
-
-
-
-//# sourceMappingURL=es6-promise.auto.map
diff --git a/node_modules/es6-promise/dist/es6-promise.auto.map b/node_modules/es6-promise/dist/es6-promise.auto.map
deleted file mode 100644
index a5abce9..0000000
--- a/node_modules/es6-promise/dist/es6-promise.auto.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["config/versionTemplate.txt","lib/es6-promise/utils.js","lib/es6-promise/asap.js","lib/es6-promise/then.js","lib/es6-promise/promise/resolve.js","lib/es6-promise/-internal.js","lib/es6-promise/enumerator.js","lib/es6-promise/promise/all.js","lib/es6-promise/promise/race.js","lib/es6-promise/promise/reject.js","lib/es6-promise/promise.js","lib/es6-promise/polyfill.js","lib/es6-promise.js","lib/es6-promise.auto.js"],"sourcesContent":["/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license   Licensed under MIT license\n *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version   v4.2.8+1e68dce6\n */\n","export function objectOrFunction(x) {\n  var type = typeof x;\n  return x !== null && (type === 'object' || type === 'function');\n}\n\nexport function isFunction(x) {\n  return typeof x === 'function';\n}\n\nexport function isMaybeThenable(x) {\n  return x !== null && typeof x === 'object';\n}\n\nvar _isArray = void 0;\nif (Array.isArray) {\n  _isArray = Array.isArray;\n} else {\n  _isArray = function (x) {\n    return Object.prototype.toString.call(x) === '[object Array]';\n  };\n}\n\nexport var isArray = _isArray;","var len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nexport var asap = function asap(callback, arg) {\n  queue[len] = callback;\n  queue[len + 1] = arg;\n  len += 2;\n  if (len === 2) {\n    // If len is 2, that means that we need to schedule an async flush.\n    // If additional callbacks are queued before the queue is flushed, they\n    // will be processed by this flush that we are scheduling.\n    if (customSchedulerFn) {\n      customSchedulerFn(flush);\n    } else {\n      scheduleFlush();\n    }\n  }\n};\n\nexport function setScheduler(scheduleFn) {\n  customSchedulerFn = scheduleFn;\n}\n\nexport function setAsap(asapFn) {\n  asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n  // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n  // see https://github.com/cujojs/when/issues/410 for details\n  return function () {\n    return process.nextTick(flush);\n  };\n}\n\n// vertx\nfunction useVertxTimer() {\n  if (typeof vertxNext !== 'undefined') {\n    return function () {\n      vertxNext(flush);\n    };\n  }\n\n  return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n  var iterations = 0;\n  var observer = new BrowserMutationObserver(flush);\n  var node = document.createTextNode('');\n  observer.observe(node, { characterData: true });\n\n  return function () {\n    node.data = iterations = ++iterations % 2;\n  };\n}\n\n// web worker\nfunction useMessageChannel() {\n  var channel = new MessageChannel();\n  channel.port1.onmessage = flush;\n  return function () {\n    return channel.port2.postMessage(0);\n  };\n}\n\nfunction useSetTimeout() {\n  // Store setTimeout reference so es6-promise will be unaffected by\n  // other code modifying setTimeout (like sinon.useFakeTimers())\n  var globalSetTimeout = setTimeout;\n  return function () {\n    return globalSetTimeout(flush, 1);\n  };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n  for (var i = 0; i < len; i += 2) {\n    var callback = queue[i];\n    var arg = queue[i + 1];\n\n    callback(arg);\n\n    queue[i] = undefined;\n    queue[i + 1] = undefined;\n  }\n\n  len = 0;\n}\n\nfunction attemptVertx() {\n  try {\n    var vertx = Function('return this')().require('vertx');\n    vertxNext = vertx.runOnLoop || vertx.runOnContext;\n    return useVertxTimer();\n  } catch (e) {\n    return useSetTimeout();\n  }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n  scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n  scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n  scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n  scheduleFlush = attemptVertx();\n} else {\n  scheduleFlush = useSetTimeout();\n}","import { invokeCallback, subscribe, FULFILLED, REJECTED, noop, makePromise, PROMISE_ID } from './-internal';\n\nimport { asap } from './asap';\n\nexport default function then(onFulfillment, onRejection) {\n  var parent = this;\n\n  var child = new this.constructor(noop);\n\n  if (child[PROMISE_ID] === undefined) {\n    makePromise(child);\n  }\n\n  var _state = parent._state;\n\n\n  if (_state) {\n    var callback = arguments[_state - 1];\n    asap(function () {\n      return invokeCallback(_state, child, callback, parent._result);\n    });\n  } else {\n    subscribe(parent, child, onFulfillment, onRejection);\n  }\n\n  return child;\n}","import { noop, resolve as _resolve } from '../-internal';\n\n/**\n  `Promise.resolve` returns a promise that will become resolved with the\n  passed `value`. It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    resolve(1);\n  });\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.resolve(1);\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  @method resolve\n  @static\n  @param {Any} value value that the returned promise will be resolved with\n  Useful for tooling.\n  @return {Promise} a promise that will become fulfilled with the given\n  `value`\n*/\nexport default function resolve(object) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (object && typeof object === 'object' && object.constructor === Constructor) {\n    return object;\n  }\n\n  var promise = new Constructor(noop);\n  _resolve(promise, object);\n  return promise;\n}","import { objectOrFunction, isFunction } from './utils';\n\nimport { asap } from './asap';\n\nimport originalThen from './then';\nimport originalResolve from './promise/resolve';\n\nexport var PROMISE_ID = Math.random().toString(36).substring(2);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nfunction selfFulfillment() {\n  return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n  return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n  try {\n    then.call(value, fulfillmentHandler, rejectionHandler);\n  } catch (e) {\n    return e;\n  }\n}\n\nfunction handleForeignThenable(promise, thenable, then) {\n  asap(function (promise) {\n    var sealed = false;\n    var error = tryThen(then, thenable, function (value) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n      if (thenable !== value) {\n        resolve(promise, value);\n      } else {\n        fulfill(promise, value);\n      }\n    }, function (reason) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n\n      reject(promise, reason);\n    }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n    if (!sealed && error) {\n      sealed = true;\n      reject(promise, error);\n    }\n  }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n  if (thenable._state === FULFILLED) {\n    fulfill(promise, thenable._result);\n  } else if (thenable._state === REJECTED) {\n    reject(promise, thenable._result);\n  } else {\n    subscribe(thenable, undefined, function (value) {\n      return resolve(promise, value);\n    }, function (reason) {\n      return reject(promise, reason);\n    });\n  }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then) {\n  if (maybeThenable.constructor === promise.constructor && then === originalThen && maybeThenable.constructor.resolve === originalResolve) {\n    handleOwnThenable(promise, maybeThenable);\n  } else {\n    if (then === undefined) {\n      fulfill(promise, maybeThenable);\n    } else if (isFunction(then)) {\n      handleForeignThenable(promise, maybeThenable, then);\n    } else {\n      fulfill(promise, maybeThenable);\n    }\n  }\n}\n\nfunction resolve(promise, value) {\n  if (promise === value) {\n    reject(promise, selfFulfillment());\n  } else if (objectOrFunction(value)) {\n    var then = void 0;\n    try {\n      then = value.then;\n    } catch (error) {\n      reject(promise, error);\n      return;\n    }\n    handleMaybeThenable(promise, value, then);\n  } else {\n    fulfill(promise, value);\n  }\n}\n\nfunction publishRejection(promise) {\n  if (promise._onerror) {\n    promise._onerror(promise._result);\n  }\n\n  publish(promise);\n}\n\nfunction fulfill(promise, value) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n\n  promise._result = value;\n  promise._state = FULFILLED;\n\n  if (promise._subscribers.length !== 0) {\n    asap(publish, promise);\n  }\n}\n\nfunction reject(promise, reason) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n  promise._state = REJECTED;\n  promise._result = reason;\n\n  asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n  var _subscribers = parent._subscribers;\n  var length = _subscribers.length;\n\n\n  parent._onerror = null;\n\n  _subscribers[length] = child;\n  _subscribers[length + FULFILLED] = onFulfillment;\n  _subscribers[length + REJECTED] = onRejection;\n\n  if (length === 0 && parent._state) {\n    asap(publish, parent);\n  }\n}\n\nfunction publish(promise) {\n  var subscribers = promise._subscribers;\n  var settled = promise._state;\n\n  if (subscribers.length === 0) {\n    return;\n  }\n\n  var child = void 0,\n      callback = void 0,\n      detail = promise._result;\n\n  for (var i = 0; i < subscribers.length; i += 3) {\n    child = subscribers[i];\n    callback = subscribers[i + settled];\n\n    if (child) {\n      invokeCallback(settled, child, callback, detail);\n    } else {\n      callback(detail);\n    }\n  }\n\n  promise._subscribers.length = 0;\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n  var hasCallback = isFunction(callback),\n      value = void 0,\n      error = void 0,\n      succeeded = true;\n\n  if (hasCallback) {\n    try {\n      value = callback(detail);\n    } catch (e) {\n      succeeded = false;\n      error = e;\n    }\n\n    if (promise === value) {\n      reject(promise, cannotReturnOwn());\n      return;\n    }\n  } else {\n    value = detail;\n  }\n\n  if (promise._state !== PENDING) {\n    // noop\n  } else if (hasCallback && succeeded) {\n    resolve(promise, value);\n  } else if (succeeded === false) {\n    reject(promise, error);\n  } else if (settled === FULFILLED) {\n    fulfill(promise, value);\n  } else if (settled === REJECTED) {\n    reject(promise, value);\n  }\n}\n\nfunction initializePromise(promise, resolver) {\n  try {\n    resolver(function resolvePromise(value) {\n      resolve(promise, value);\n    }, function rejectPromise(reason) {\n      reject(promise, reason);\n    });\n  } catch (e) {\n    reject(promise, e);\n  }\n}\n\nvar id = 0;\nfunction nextId() {\n  return id++;\n}\n\nfunction makePromise(promise) {\n  promise[PROMISE_ID] = id++;\n  promise._state = undefined;\n  promise._result = undefined;\n  promise._subscribers = [];\n}\n\nexport { nextId, makePromise, noop, resolve, reject, fulfill, subscribe, publish, publishRejection, initializePromise, invokeCallback, FULFILLED, REJECTED, PENDING, handleMaybeThenable };","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { isArray, isMaybeThenable } from './utils';\nimport { noop, reject, fulfill, subscribe, FULFILLED, REJECTED, PENDING, handleMaybeThenable } from './-internal';\n\nimport then from './then';\nimport Promise from './promise';\nimport originalResolve from './promise/resolve';\nimport originalThen from './then';\nimport { makePromise, PROMISE_ID } from './-internal';\n\nfunction validationError() {\n  return new Error('Array Methods must be provided an Array');\n};\n\nvar Enumerator = function () {\n  function Enumerator(Constructor, input) {\n    this._instanceConstructor = Constructor;\n    this.promise = new Constructor(noop);\n\n    if (!this.promise[PROMISE_ID]) {\n      makePromise(this.promise);\n    }\n\n    if (isArray(input)) {\n      this.length = input.length;\n      this._remaining = input.length;\n\n      this._result = new Array(this.length);\n\n      if (this.length === 0) {\n        fulfill(this.promise, this._result);\n      } else {\n        this.length = this.length || 0;\n        this._enumerate(input);\n        if (this._remaining === 0) {\n          fulfill(this.promise, this._result);\n        }\n      }\n    } else {\n      reject(this.promise, validationError());\n    }\n  }\n\n  Enumerator.prototype._enumerate = function _enumerate(input) {\n    for (var i = 0; this._state === PENDING && i < input.length; i++) {\n      this._eachEntry(input[i], i);\n    }\n  };\n\n  Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n    var c = this._instanceConstructor;\n    var resolve = c.resolve;\n\n\n    if (resolve === originalResolve) {\n      var _then = void 0;\n      var error = void 0;\n      var didError = false;\n      try {\n        _then = entry.then;\n      } catch (e) {\n        didError = true;\n        error = e;\n      }\n\n      if (_then === originalThen && entry._state !== PENDING) {\n        this._settledAt(entry._state, i, entry._result);\n      } else if (typeof _then !== 'function') {\n        this._remaining--;\n        this._result[i] = entry;\n      } else if (c === Promise) {\n        var promise = new c(noop);\n        if (didError) {\n          reject(promise, error);\n        } else {\n          handleMaybeThenable(promise, entry, _then);\n        }\n        this._willSettleAt(promise, i);\n      } else {\n        this._willSettleAt(new c(function (resolve) {\n          return resolve(entry);\n        }), i);\n      }\n    } else {\n      this._willSettleAt(resolve(entry), i);\n    }\n  };\n\n  Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n    var promise = this.promise;\n\n\n    if (promise._state === PENDING) {\n      this._remaining--;\n\n      if (state === REJECTED) {\n        reject(promise, value);\n      } else {\n        this._result[i] = value;\n      }\n    }\n\n    if (this._remaining === 0) {\n      fulfill(promise, this._result);\n    }\n  };\n\n  Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n    var enumerator = this;\n\n    subscribe(promise, undefined, function (value) {\n      return enumerator._settledAt(FULFILLED, i, value);\n    }, function (reason) {\n      return enumerator._settledAt(REJECTED, i, reason);\n    });\n  };\n\n  return Enumerator;\n}();\n\nexport default Enumerator;\n;","import Enumerator from '../enumerator';\n\n/**\n  `Promise.all` accepts an array of promises, and returns a new promise which\n  is fulfilled with an array of fulfillment values for the passed promises, or\n  rejected with the reason of the first passed promise to be rejected. It casts all\n  elements of the passed iterable to promises as it runs this algorithm.\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = resolve(2);\n  let promise3 = resolve(3);\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // The array here would be [ 1, 2, 3 ];\n  });\n  ```\n\n  If any of the `promises` given to `all` are rejected, the first promise\n  that is rejected will be given as an argument to the returned promises's\n  rejection handler. For example:\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = reject(new Error(\"2\"));\n  let promise3 = reject(new Error(\"3\"));\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // Code here never runs because there are rejected promises!\n  }, function(error) {\n    // error.message === \"2\"\n  });\n  ```\n\n  @method all\n  @static\n  @param {Array} entries array of promises\n  @param {String} label optional string for labeling the promise.\n  Useful for tooling.\n  @return {Promise} promise that is fulfilled when all `promises` have been\n  fulfilled, or rejected if any of them become rejected.\n  @static\n*/\nexport default function all(entries) {\n  return new Enumerator(this, entries).promise;\n}","import { isArray } from \"../utils\";\n\n/**\n  `Promise.race` returns a new promise which is settled in the same way as the\n  first passed promise to settle.\n\n  Example:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 2');\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // result === 'promise 2' because it was resolved before promise1\n    // was resolved.\n  });\n  ```\n\n  `Promise.race` is deterministic in that only the state of the first\n  settled promise matters. For example, even if other promises given to the\n  `promises` array argument are resolved, but the first settled promise has\n  become rejected before the other promises became fulfilled, the returned\n  promise will become rejected:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      reject(new Error('promise 2'));\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // Code here never runs\n  }, function(reason){\n    // reason.message === 'promise 2' because promise 2 became rejected before\n    // promise 1 became fulfilled\n  });\n  ```\n\n  An example real-world use case is implementing timeouts:\n\n  ```javascript\n  Promise.race([ajax('foo.json'), timeout(5000)])\n  ```\n\n  @method race\n  @static\n  @param {Array} promises array of promises to observe\n  Useful for tooling.\n  @return {Promise} a promise which settles in the same way as the first passed\n  promise to settle.\n*/\nexport default function race(entries) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (!isArray(entries)) {\n    return new Constructor(function (_, reject) {\n      return reject(new TypeError('You must pass an array to race.'));\n    });\n  } else {\n    return new Constructor(function (resolve, reject) {\n      var length = entries.length;\n      for (var i = 0; i < length; i++) {\n        Constructor.resolve(entries[i]).then(resolve, reject);\n      }\n    });\n  }\n}","import { noop, reject as _reject } from '../-internal';\n\n/**\n  `Promise.reject` returns a promise rejected with the passed `reason`.\n  It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    reject(new Error('WHOOPS'));\n  });\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.reject(new Error('WHOOPS'));\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  @method reject\n  @static\n  @param {Any} reason value that the returned promise will be rejected with.\n  Useful for tooling.\n  @return {Promise} a promise rejected with the given `reason`.\n*/\nexport default function reject(reason) {\n  /*jshint validthis:true */\n  var Constructor = this;\n  var promise = new Constructor(noop);\n  _reject(promise, reason);\n  return promise;\n}","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { isFunction } from './utils';\nimport { noop, nextId, PROMISE_ID, initializePromise } from './-internal';\nimport { asap, setAsap, setScheduler } from './asap';\n\nimport all from './promise/all';\nimport race from './promise/race';\nimport Resolve from './promise/resolve';\nimport Reject from './promise/reject';\nimport then from './then';\n\nfunction needsResolver() {\n  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n  throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n  Promise objects represent the eventual result of an asynchronous operation. The\n  primary way of interacting with a promise is through its `then` method, which\n  registers callbacks to receive either a promise's eventual value or the reason\n  why the promise cannot be fulfilled.\n\n  Terminology\n  -----------\n\n  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n  - `thenable` is an object or function that defines a `then` method.\n  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n  - `exception` is a value that is thrown using the throw statement.\n  - `reason` is a value that indicates why a promise was rejected.\n  - `settled` the final resting state of a promise, fulfilled or rejected.\n\n  A promise can be in one of three states: pending, fulfilled, or rejected.\n\n  Promises that are fulfilled have a fulfillment value and are in the fulfilled\n  state.  Promises that are rejected have a rejection reason and are in the\n  rejected state.  A fulfillment value is never a thenable.\n\n  Promises can also be said to *resolve* a value.  If this value is also a\n  promise, then the original promise's settled state will match the value's\n  settled state.  So a promise that *resolves* a promise that rejects will\n  itself reject, and a promise that *resolves* a promise that fulfills will\n  itself fulfill.\n\n\n  Basic Usage:\n  ------------\n\n  ```js\n  let promise = new Promise(function(resolve, reject) {\n    // on success\n    resolve(value);\n\n    // on failure\n    reject(reason);\n  });\n\n  promise.then(function(value) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Advanced Usage:\n  ---------------\n\n  Promises shine when abstracting away asynchronous interactions such as\n  `XMLHttpRequest`s.\n\n  ```js\n  function getJSON(url) {\n    return new Promise(function(resolve, reject){\n      let xhr = new XMLHttpRequest();\n\n      xhr.open('GET', url);\n      xhr.onreadystatechange = handler;\n      xhr.responseType = 'json';\n      xhr.setRequestHeader('Accept', 'application/json');\n      xhr.send();\n\n      function handler() {\n        if (this.readyState === this.DONE) {\n          if (this.status === 200) {\n            resolve(this.response);\n          } else {\n            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n          }\n        }\n      };\n    });\n  }\n\n  getJSON('/posts.json').then(function(json) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Unlike callbacks, promises are great composable primitives.\n\n  ```js\n  Promise.all([\n    getJSON('/posts'),\n    getJSON('/comments')\n  ]).then(function(values){\n    values[0] // => postsJSON\n    values[1] // => commentsJSON\n\n    return values;\n  });\n  ```\n\n  @class Promise\n  @param {Function} resolver\n  Useful for tooling.\n  @constructor\n*/\n\nvar Promise = function () {\n  function Promise(resolver) {\n    this[PROMISE_ID] = nextId();\n    this._result = this._state = undefined;\n    this._subscribers = [];\n\n    if (noop !== resolver) {\n      typeof resolver !== 'function' && needsResolver();\n      this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n    }\n  }\n\n  /**\n  The primary way of interacting with a promise is through its `then` method,\n  which registers callbacks to receive either a promise's eventual value or the\n  reason why the promise cannot be fulfilled.\n   ```js\n  findUser().then(function(user){\n    // user is available\n  }, function(reason){\n    // user is unavailable, and you are given the reason why\n  });\n  ```\n   Chaining\n  --------\n   The return value of `then` is itself a promise.  This second, 'downstream'\n  promise is resolved with the return value of the first promise's fulfillment\n  or rejection handler, or rejected if the handler throws an exception.\n   ```js\n  findUser().then(function (user) {\n    return user.name;\n  }, function (reason) {\n    return 'default name';\n  }).then(function (userName) {\n    // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n    // will be `'default name'`\n  });\n   findUser().then(function (user) {\n    throw new Error('Found user, but still unhappy');\n  }, function (reason) {\n    throw new Error('`findUser` rejected and we're unhappy');\n  }).then(function (value) {\n    // never reached\n  }, function (reason) {\n    // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n    // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n  });\n  ```\n  If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n   ```js\n  findUser().then(function (user) {\n    throw new PedagogicalException('Upstream error');\n  }).then(function (value) {\n    // never reached\n  }).then(function (value) {\n    // never reached\n  }, function (reason) {\n    // The `PedgagocialException` is propagated all the way down to here\n  });\n  ```\n   Assimilation\n  ------------\n   Sometimes the value you want to propagate to a downstream promise can only be\n  retrieved asynchronously. This can be achieved by returning a promise in the\n  fulfillment or rejection handler. The downstream promise will then be pending\n  until the returned promise is settled. This is called *assimilation*.\n   ```js\n  findUser().then(function (user) {\n    return findCommentsByAuthor(user);\n  }).then(function (comments) {\n    // The user's comments are now available\n  });\n  ```\n   If the assimliated promise rejects, then the downstream promise will also reject.\n   ```js\n  findUser().then(function (user) {\n    return findCommentsByAuthor(user);\n  }).then(function (comments) {\n    // If `findCommentsByAuthor` fulfills, we'll have the value here\n  }, function (reason) {\n    // If `findCommentsByAuthor` rejects, we'll have the reason here\n  });\n  ```\n   Simple Example\n  --------------\n   Synchronous Example\n   ```javascript\n  let result;\n   try {\n    result = findResult();\n    // success\n  } catch(reason) {\n    // failure\n  }\n  ```\n   Errback Example\n   ```js\n  findResult(function(result, err){\n    if (err) {\n      // failure\n    } else {\n      // success\n    }\n  });\n  ```\n   Promise Example;\n   ```javascript\n  findResult().then(function(result){\n    // success\n  }, function(reason){\n    // failure\n  });\n  ```\n   Advanced Example\n  --------------\n   Synchronous Example\n   ```javascript\n  let author, books;\n   try {\n    author = findAuthor();\n    books  = findBooksByAuthor(author);\n    // success\n  } catch(reason) {\n    // failure\n  }\n  ```\n   Errback Example\n   ```js\n   function foundBooks(books) {\n   }\n   function failure(reason) {\n   }\n   findAuthor(function(author, err){\n    if (err) {\n      failure(err);\n      // failure\n    } else {\n      try {\n        findBoooksByAuthor(author, function(books, err) {\n          if (err) {\n            failure(err);\n          } else {\n            try {\n              foundBooks(books);\n            } catch(reason) {\n              failure(reason);\n            }\n          }\n        });\n      } catch(error) {\n        failure(err);\n      }\n      // success\n    }\n  });\n  ```\n   Promise Example;\n   ```javascript\n  findAuthor().\n    then(findBooksByAuthor).\n    then(function(books){\n      // found books\n  }).catch(function(reason){\n    // something went wrong\n  });\n  ```\n   @method then\n  @param {Function} onFulfilled\n  @param {Function} onRejected\n  Useful for tooling.\n  @return {Promise}\n  */\n\n  /**\n  `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n  as the catch block of a try/catch statement.\n  ```js\n  function findAuthor(){\n  throw new Error('couldn't find that author');\n  }\n  // synchronous\n  try {\n  findAuthor();\n  } catch(reason) {\n  // something went wrong\n  }\n  // async with promises\n  findAuthor().catch(function(reason){\n  // something went wrong\n  });\n  ```\n  @method catch\n  @param {Function} onRejection\n  Useful for tooling.\n  @return {Promise}\n  */\n\n\n  Promise.prototype.catch = function _catch(onRejection) {\n    return this.then(null, onRejection);\n  };\n\n  /**\n    `finally` will be invoked regardless of the promise's fate just as native\n    try/catch/finally behaves\n  \n    Synchronous example:\n  \n    ```js\n    findAuthor() {\n      if (Math.random() > 0.5) {\n        throw new Error();\n      }\n      return new Author();\n    }\n  \n    try {\n      return findAuthor(); // succeed or fail\n    } catch(error) {\n      return findOtherAuther();\n    } finally {\n      // always runs\n      // doesn't affect the return value\n    }\n    ```\n  \n    Asynchronous example:\n  \n    ```js\n    findAuthor().catch(function(reason){\n      return findOtherAuther();\n    }).finally(function(){\n      // author was either found, or not\n    });\n    ```\n  \n    @method finally\n    @param {Function} callback\n    @return {Promise}\n  */\n\n\n  Promise.prototype.finally = function _finally(callback) {\n    var promise = this;\n    var constructor = promise.constructor;\n\n    if (isFunction(callback)) {\n      return promise.then(function (value) {\n        return constructor.resolve(callback()).then(function () {\n          return value;\n        });\n      }, function (reason) {\n        return constructor.resolve(callback()).then(function () {\n          throw reason;\n        });\n      });\n    }\n\n    return promise.then(callback, callback);\n  };\n\n  return Promise;\n}();\n\nPromise.prototype.then = then;\nexport default Promise;\nPromise.all = all;\nPromise.race = race;\nPromise.resolve = Resolve;\nPromise.reject = Reject;\nPromise._setScheduler = setScheduler;\nPromise._setAsap = setAsap;\nPromise._asap = asap;","/*global self*/\nimport Promise from './promise';\n\nexport default function polyfill() {\n  var local = void 0;\n\n  if (typeof global !== 'undefined') {\n    local = global;\n  } else if (typeof self !== 'undefined') {\n    local = self;\n  } else {\n    try {\n      local = Function('return this')();\n    } catch (e) {\n      throw new Error('polyfill failed because global object is unavailable in this environment');\n    }\n  }\n\n  var P = local.Promise;\n\n  if (P) {\n    var promiseToString = null;\n    try {\n      promiseToString = Object.prototype.toString.call(P.resolve());\n    } catch (e) {\n      // silently ignored\n    }\n\n    if (promiseToString === '[object Promise]' && !P.cast) {\n      return;\n    }\n  }\n\n  local.Promise = Promise;\n}","import Promise from './es6-promise/promise';\nimport polyfill from './es6-promise/polyfill';\n\n// Strange compat..\nPromise.polyfill = polyfill;\nPromise.Promise = Promise;\nexport default Promise;","import Promise from './es6-promise';\nPromise.polyfill();\nexport default Promise;"],"names":["resolve","_resolve","then","originalThen","originalResolve","Promise","reject","_reject","Resolve","Reject"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACNO,SAAS,gBAAgB,CAAC,CAAC,EAAE;EAClC,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC;EACpB,OAAO,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,UAAU,CAAC,CAAC;CACjE;;AAED,AAAO,SAAS,UAAU,CAAC,CAAC,EAAE;EAC5B,OAAO,OAAO,CAAC,KAAK,UAAU,CAAC;CAChC;;AAED,AAEC;;AAED,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC;AACtB,IAAI,KAAK,CAAC,OAAO,EAAE;EACjB,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;CAC1B,MAAM;EACL,QAAQ,GAAG,UAAU,CAAC,EAAE;IACtB,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC;GAC/D,CAAC;CACH;;AAED,AAAO,IAAI,OAAO,GAAG,QAAQ;;ACtB7B,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,IAAI,SAAS,GAAG,KAAK,CAAC,CAAC;AACvB,IAAI,iBAAiB,GAAG,KAAK,CAAC,CAAC;;AAE/B,AAAO,IAAI,IAAI,GAAG,SAAS,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;EAC7C,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;EACtB,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;EACrB,GAAG,IAAI,CAAC,CAAC;EACT,IAAI,GAAG,KAAK,CAAC,EAAE;;;;IAIb,IAAI,iBAAiB,EAAE;MACrB,iBAAiB,CAAC,KAAK,CAAC,CAAC;KAC1B,MAAM;MACL,aAAa,EAAE,CAAC;KACjB;GACF;CACF,CAAC;;AAEF,AAAO,SAAS,YAAY,CAAC,UAAU,EAAE;EACvC,iBAAiB,GAAG,UAAU,CAAC;CAChC;;AAED,AAAO,SAAS,OAAO,CAAC,MAAM,EAAE;EAC9B,IAAI,GAAG,MAAM,CAAC;CACf;;AAED,IAAI,aAAa,GAAG,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AACvE,IAAI,aAAa,GAAG,aAAa,IAAI,EAAE,CAAC;AACxC,IAAI,uBAAuB,GAAG,aAAa,CAAC,gBAAgB,IAAI,aAAa,CAAC,sBAAsB,CAAC;AACrG,IAAI,MAAM,GAAG,OAAO,IAAI,KAAK,WAAW,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,kBAAkB,CAAC;;;AAG/H,IAAI,QAAQ,GAAG,OAAO,iBAAiB,KAAK,WAAW,IAAI,OAAO,aAAa,KAAK,WAAW,IAAI,OAAO,cAAc,KAAK,WAAW,CAAC;;;AAGzI,SAAS,WAAW,GAAG;;;EAGrB,OAAO,YAAY;IACjB,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;GAChC,CAAC;CACH;;;AAGD,SAAS,aAAa,GAAG;EACvB,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE;IACpC,OAAO,YAAY;MACjB,SAAS,CAAC,KAAK,CAAC,CAAC;KAClB,CAAC;GACH;;EAED,OAAO,aAAa,EAAE,CAAC;CACxB;;AAED,SAAS,mBAAmB,GAAG;EAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;EACnB,IAAI,QAAQ,GAAG,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC;EAClD,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;EACvC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;;EAEhD,OAAO,YAAY;IACjB,IAAI,CAAC,IAAI,GAAG,UAAU,GAAG,EAAE,UAAU,GAAG,CAAC,CAAC;GAC3C,CAAC;CACH;;;AAGD,SAAS,iBAAiB,GAAG;EAC3B,IAAI,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;EACnC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;EAChC,OAAO,YAAY;IACjB,OAAO,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;GACrC,CAAC;CACH;;AAED,SAAS,aAAa,GAAG;;;EAGvB,IAAI,gBAAgB,GAAG,UAAU,CAAC;EAClC,OAAO,YAAY;IACjB,OAAO,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;GACnC,CAAC;CACH;;AAED,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,SAAS,KAAK,GAAG;EACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE;IAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;IAEvB,QAAQ,CAAC,GAAG,CAAC,CAAC;;IAEd,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACrB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;GAC1B;;EAED,GAAG,GAAG,CAAC,CAAC;CACT;;AAED,SAAS,YAAY,GAAG;EACtB,IAAI;IACF,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,YAAY,CAAC;IAClD,OAAO,aAAa,EAAE,CAAC;GACxB,CAAC,OAAO,CAAC,EAAE;IACV,OAAO,aAAa,EAAE,CAAC;GACxB;CACF;;AAED,IAAI,aAAa,GAAG,KAAK,CAAC,CAAC;;AAE3B,IAAI,MAAM,EAAE;EACV,aAAa,GAAG,WAAW,EAAE,CAAC;CAC/B,MAAM,IAAI,uBAAuB,EAAE;EAClC,aAAa,GAAG,mBAAmB,EAAE,CAAC;CACvC,MAAM,IAAI,QAAQ,EAAE;EACnB,aAAa,GAAG,iBAAiB,EAAE,CAAC;CACrC,MAAM,IAAI,aAAa,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;EACvE,aAAa,GAAG,YAAY,EAAE,CAAC;CAChC,MAAM;EACL,aAAa,GAAG,aAAa,EAAE,CAAC;;;CACjC,DCtHc,SAAS,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE;EACvD,IAAI,MAAM,GAAG,IAAI,CAAC;;EAElB,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;;EAEvC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE;IACnC,WAAW,CAAC,KAAK,CAAC,CAAC;GACpB;;EAED,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;;EAG3B,IAAI,MAAM,EAAE;IACV,IAAI,QAAQ,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,YAAY;MACf,OAAO,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;KAChE,CAAC,CAAC;GACJ,MAAM;IACL,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;GACtD;;EAED,OAAO,KAAK,CAAC;;;CACd,DCxBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,AAAe,SAASA,SAAO,CAAC,MAAM,EAAE;;EAEtC,IAAI,WAAW,GAAG,IAAI,CAAC;;EAEvB,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW,EAAE;IAC9E,OAAO,MAAM,CAAC;GACf;;EAED,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;EACpCC,OAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EAC1B,OAAO,OAAO,CAAC;;;CAChB,DCrCM,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;AAEhE,SAAS,IAAI,GAAG,EAAE;;AAElB,IAAI,OAAO,GAAG,KAAK,CAAC,CAAC;AACrB,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,IAAI,QAAQ,GAAG,CAAC,CAAC;;AAEjB,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;CAClE;;AAED,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;CAC9E;;AAED,SAAS,OAAO,CAACC,OAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE;EAClE,IAAI;IACFA,OAAI,CAAC,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;GACxD,CAAC,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,CAAC;GACV;CACF;;AAED,SAAS,qBAAqB,CAAC,OAAO,EAAE,QAAQ,EAAEA,OAAI,EAAE;EACtD,IAAI,CAAC,UAAU,OAAO,EAAE;IACtB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,KAAK,GAAG,OAAO,CAACA,OAAI,EAAE,QAAQ,EAAE,UAAU,KAAK,EAAE;MACnD,IAAI,MAAM,EAAE;QACV,OAAO;OACR;MACD,MAAM,GAAG,IAAI,CAAC;MACd,IAAI,QAAQ,KAAK,KAAK,EAAE;QACtB,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACzB,MAAM;QACL,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACzB;KACF,EAAE,UAAU,MAAM,EAAE;MACnB,IAAI,MAAM,EAAE;QACV,OAAO;OACR;MACD,MAAM,GAAG,IAAI,CAAC;;MAEd,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KACzB,EAAE,UAAU,IAAI,OAAO,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAC,CAAC;;IAExD,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE;MACpB,MAAM,GAAG,IAAI,CAAC;MACd,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACxB;GACF,EAAE,OAAO,CAAC,CAAC;CACb;;AAED,SAAS,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE;EAC5C,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE;IACjC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;GACpC,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE;IACvC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;GACnC,MAAM;IACL,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE;MAC9C,OAAO,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KAChC,EAAE,UAAU,MAAM,EAAE;MACnB,OAAO,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KAChC,CAAC,CAAC;GACJ;CACF;;AAED,SAAS,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAEA,OAAI,EAAE;EACzD,IAAI,aAAa,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,IAAIA,OAAI,KAAKC,IAAY,IAAI,aAAa,CAAC,WAAW,CAAC,OAAO,KAAKC,SAAe,EAAE;IACvI,iBAAiB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;GAC3C,MAAM;IACL,IAAIF,OAAI,KAAK,SAAS,EAAE;MACtB,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KACjC,MAAM,IAAI,UAAU,CAACA,OAAI,CAAC,EAAE;MAC3B,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAEA,OAAI,CAAC,CAAC;KACrD,MAAM;MACL,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KACjC;GACF;CACF;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE;EAC/B,IAAI,OAAO,KAAK,KAAK,EAAE;IACrB,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;GACpC,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;IAClC,IAAIA,OAAI,GAAG,KAAK,CAAC,CAAC;IAClB,IAAI;MACFA,OAAI,GAAG,KAAK,CAAC,IAAI,CAAC;KACnB,CAAC,OAAO,KAAK,EAAE;MACd,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;MACvB,OAAO;KACR;IACD,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAEA,OAAI,CAAC,CAAC;GAC3C,MAAM;IACL,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACzB;CACF;;AAED,SAAS,gBAAgB,CAAC,OAAO,EAAE;EACjC,IAAI,OAAO,CAAC,QAAQ,EAAE;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;GACnC;;EAED,OAAO,CAAC,OAAO,CAAC,CAAC;CAClB;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE;EAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;IAC9B,OAAO;GACR;;EAED,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;EACxB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;;EAE3B,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;IACrC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;GACxB;CACF;;AAED,SAAS,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE;EAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;IAC9B,OAAO;GACR;EACD,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;EAC1B,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;;EAEzB,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;CACjC;;AAED,SAAS,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE;EAC5D,IAAI,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;EACvC,IAAI,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;;;EAGjC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;;EAEvB,YAAY,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;EAC7B,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,aAAa,CAAC;EACjD,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,WAAW,CAAC;;EAE9C,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE;IACjC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;GACvB;CACF;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE;EACxB,IAAI,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;EACvC,IAAI,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;;EAE7B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;IAC5B,OAAO;GACR;;EAED,IAAI,KAAK,GAAG,KAAK,CAAC;MACd,QAAQ,GAAG,KAAK,CAAC;MACjB,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;;EAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;IAC9C,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,QAAQ,GAAG,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;;IAEpC,IAAI,KAAK,EAAE;MACT,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;KAClD,MAAM;MACL,QAAQ,CAAC,MAAM,CAAC,CAAC;KAClB;GACF;;EAED,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;CACjC;;AAED,SAAS,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;EAC1D,IAAI,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC;MAClC,KAAK,GAAG,KAAK,CAAC;MACd,KAAK,GAAG,KAAK,CAAC;MACd,SAAS,GAAG,IAAI,CAAC;;EAErB,IAAI,WAAW,EAAE;IACf,IAAI;MACF,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;KAC1B,CAAC,OAAO,CAAC,EAAE;MACV,SAAS,GAAG,KAAK,CAAC;MAClB,KAAK,GAAG,CAAC,CAAC;KACX;;IAED,IAAI,OAAO,KAAK,KAAK,EAAE;MACrB,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;MACnC,OAAO;KACR;GACF,MAAM;IACL,KAAK,GAAG,MAAM,CAAC;GAChB;;EAED,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;;GAE/B,MAAM,IAAI,WAAW,IAAI,SAAS,EAAE;IACnC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACzB,MAAM,IAAI,SAAS,KAAK,KAAK,EAAE;IAC9B,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACxB,MAAM,IAAI,OAAO,KAAK,SAAS,EAAE;IAChC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACzB,MAAM,IAAI,OAAO,KAAK,QAAQ,EAAE;IAC/B,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACxB;CACF;;AAED,SAAS,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE;EAC5C,IAAI;IACF,QAAQ,CAAC,SAAS,cAAc,CAAC,KAAK,EAAE;MACtC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACzB,EAAE,SAAS,aAAa,CAAC,MAAM,EAAE;MAChC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KACzB,CAAC,CAAC;GACJ,CAAC,OAAO,CAAC,EAAE;IACV,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;GACpB;CACF;;AAED,IAAI,EAAE,GAAG,CAAC,CAAC;AACX,SAAS,MAAM,GAAG;EAChB,OAAO,EAAE,EAAE,CAAC;CACb;;AAED,SAAS,WAAW,CAAC,OAAO,EAAE;EAC5B,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;EAC3B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;EAC3B,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;EAC5B,OAAO,CAAC,YAAY,GAAG,EAAE,CAAC;CAC3B;;AChOD,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;CAC7D,AAAC;;AAEF,IAAI,UAAU,GAAG,YAAY;EAC3B,SAAS,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE;IACtC,IAAI,CAAC,oBAAoB,GAAG,WAAW,CAAC;IACxC,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;;IAErC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;MAC7B,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KAC3B;;IAED,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;MAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;MAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;;MAE/B,IAAI,CAAC,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;MAEtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACrB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;OACrC,MAAM;QACL,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;UACzB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;SACrC;OACF;KACF,MAAM;MACL,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;KACzC;GACF;;EAED,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,UAAU,CAAC,KAAK,EAAE;IAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;MAChE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KAC9B;GACF,CAAC;;EAEF,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE;IAC9D,IAAI,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC;IAClC,IAAIF,UAAO,GAAG,CAAC,CAAC,OAAO,CAAC;;;IAGxB,IAAIA,UAAO,KAAKI,SAAe,EAAE;MAC/B,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;MACnB,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;MACnB,IAAI,QAAQ,GAAG,KAAK,CAAC;MACrB,IAAI;QACF,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;OACpB,CAAC,OAAO,CAAC,EAAE;QACV,QAAQ,GAAG,IAAI,CAAC;QAChB,KAAK,GAAG,CAAC,CAAC;OACX;;MAED,IAAI,KAAK,KAAKD,IAAY,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE;QACtD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;OACjD,MAAM,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;OACzB,MAAM,IAAI,CAAC,KAAKE,SAAO,EAAE;QACxB,IAAI,OAAO,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,QAAQ,EAAE;UACZ,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SACxB,MAAM;UACL,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC5C;QACD,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;OAChC,MAAM;QACL,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,UAAUL,UAAO,EAAE;UAC1C,OAAOA,UAAO,CAAC,KAAK,CAAC,CAAC;SACvB,CAAC,EAAE,CAAC,CAAC,CAAC;OACR;KACF,MAAM;MACL,IAAI,CAAC,aAAa,CAACA,UAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;KACvC;GACF,CAAC;;EAEF,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE;IACrE,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;;;IAG3B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;MAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;;MAElB,IAAI,KAAK,KAAK,QAAQ,EAAE;QACtB,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACxB,MAAM;QACL,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;OACzB;KACF;;IAED,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;MACzB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;KAChC;GACF,CAAC;;EAEF,UAAU,CAAC,SAAS,CAAC,aAAa,GAAG,SAAS,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE;IACtE,IAAI,UAAU,GAAG,IAAI,CAAC;;IAEtB,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE;MAC7C,OAAO,UAAU,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;KACnD,EAAE,UAAU,MAAM,EAAE;MACnB,OAAO,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;KACnD,CAAC,CAAC;GACJ,CAAC;;EAEF,OAAO,UAAU,CAAC;CACnB,EAAE;;ACrHH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,AAAe,SAAS,GAAG,CAAC,OAAO,EAAE;EACnC,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC;;;CAC9C,DCjDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA,AAAe,SAAS,IAAI,CAAC,OAAO,EAAE;;EAEpC,IAAI,WAAW,GAAG,IAAI,CAAC;;EAEvB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;IACrB,OAAO,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE;MAC1C,OAAO,MAAM,CAAC,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC,CAAC;KACjE,CAAC,CAAC;GACJ,MAAM;IACL,OAAO,IAAI,WAAW,CAAC,UAAU,OAAO,EAAE,MAAM,EAAE;MAChD,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;MAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;QAC/B,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;OACvD;KACF,CAAC,CAAC;GACJ;;;CACF,DCjFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,AAAe,SAASM,QAAM,CAAC,MAAM,EAAE;;EAErC,IAAI,WAAW,GAAG,IAAI,CAAC;EACvB,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;EACpCC,MAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACzB,OAAO,OAAO,CAAC;;;CAChB,DC9BD,SAAS,aAAa,GAAG;EACvB,MAAM,IAAI,SAAS,CAAC,oFAAoF,CAAC,CAAC;CAC3G;;AAED,SAAS,QAAQ,GAAG;EAClB,MAAM,IAAI,SAAS,CAAC,uHAAuH,CAAC,CAAC;CAC9I;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0GD,IAAIF,SAAO,GAAG,YAAY;EACxB,SAAS,OAAO,CAAC,QAAQ,EAAE;IACzB,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IACvC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;;IAEvB,IAAI,IAAI,KAAK,QAAQ,EAAE;MACrB,OAAO,QAAQ,KAAK,UAAU,IAAI,aAAa,EAAE,CAAC;MAClD,IAAI,YAAY,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAE,CAAC;KAC1E;GACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4LD,OAAO,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,MAAM,CAAC,WAAW,EAAE;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;GACrC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CF,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,QAAQ,CAAC,QAAQ,EAAE;IACtD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;;IAEtC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE;MACxB,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,KAAK,EAAE;QACnC,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY;UACtD,OAAO,KAAK,CAAC;SACd,CAAC,CAAC;OACJ,EAAE,UAAU,MAAM,EAAE;QACnB,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY;UACtD,MAAM,MAAM,CAAC;SACd,CAAC,CAAC;OACJ,CAAC,CAAC;KACJ;;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;GACzC,CAAC;;EAEF,OAAO,OAAO,CAAC;CAChB,EAAE,CAAC;;AAEJA,SAAO,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC;AAC9B,AACAA,SAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAClBA,SAAO,CAAC,IAAI,GAAG,IAAI,CAAC;AACpBA,SAAO,CAAC,OAAO,GAAGG,SAAO,CAAC;AAC1BH,SAAO,CAAC,MAAM,GAAGI,QAAM,CAAC;AACxBJ,SAAO,CAAC,aAAa,GAAG,YAAY,CAAC;AACrCA,SAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;AAC3BA,SAAO,CAAC,KAAK,GAAG,IAAI;;AC5YpB;AACA,AAEe,SAAS,QAAQ,GAAG;EACjC,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;;EAEnB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;IACjC,KAAK,GAAG,MAAM,CAAC;GAChB,MAAM,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;IACtC,KAAK,GAAG,IAAI,CAAC;GACd,MAAM;IACL,IAAI;MACF,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;KACnC,CAAC,OAAO,CAAC,EAAE;MACV,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;KAC7F;GACF;;EAED,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;;EAEtB,IAAI,CAAC,EAAE;IACL,IAAI,eAAe,GAAG,IAAI,CAAC;IAC3B,IAAI;MACF,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;KAC/D,CAAC,OAAO,CAAC,EAAE;;KAEX;;IAED,IAAI,eAAe,KAAK,kBAAkB,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;MACrD,OAAO;KACR;GACF;;EAED,KAAK,CAAC,OAAO,GAAGA,SAAO,CAAC;;;CACzB,DC/BD;AACAA,SAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC5BA,SAAO,CAAC,OAAO,GAAGA,SAAO,CAAC;;ACJ1BA,SAAO,CAAC,QAAQ,EAAE,CAAC;;;;;;;;","file":"es6-promise.auto.js"}
\ No newline at end of file
diff --git a/node_modules/es6-promise/dist/es6-promise.auto.min.js b/node_modules/es6-promise/dist/es6-promise.auto.min.js
deleted file mode 100644
index 5a44a3b..0000000
--- a/node_modules/es6-promise/dist/es6-promise.auto.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.ES6Promise=e()}(this,function(){"use strict";function t(t){var e=typeof t;return null!==t&&("object"===e||"function"===e)}function e(t){return"function"==typeof t}function n(t){W=t}function r(t){z=t}function o(){return function(){return process.nextTick(a)}}function i(){return"undefined"!=typeof U?function(){U(a)}:c()}function s(){var t=0,e=new H(a),n=document.createTextNode("");return e.observe(n,{characterData:!0}),function(){n.data=t=++t%2}}function u(){var t=new MessageChannel;return t.port1.onmessage=a,function(){return t.port2.postMessage(0)}}function c(){var t=setTimeout;return function(){return t(a,1)}}function a(){for(var t=0;t<N;t+=2){var e=Q[t],n=Q[t+1];e(n),Q[t]=void 0,Q[t+1]=void 0}N=0}function f(){try{var t=Function("return this")().require("vertx");return U=t.runOnLoop||t.runOnContext,i()}catch(e){return c()}}function l(t,e){var n=this,r=new this.constructor(p);void 0===r[V]&&x(r);var o=n._state;if(o){var i=arguments[o-1];z(function(){return T(o,r,i,n._result)})}else j(n,r,t,e);return r}function h(t){var e=this;if(t&&"object"==typeof t&&t.constructor===e)return t;var n=new e(p);return w(n,t),n}function p(){}function v(){return new TypeError("You cannot resolve a promise with itself")}function d(){return new TypeError("A promises callback cannot return that same promise.")}function _(t,e,n,r){try{t.call(e,n,r)}catch(o){return o}}function y(t,e,n){z(function(t){var r=!1,o=_(n,e,function(n){r||(r=!0,e!==n?w(t,n):A(t,n))},function(e){r||(r=!0,S(t,e))},"Settle: "+(t._label||" unknown promise"));!r&&o&&(r=!0,S(t,o))},t)}function m(t,e){e._state===Z?A(t,e._result):e._state===$?S(t,e._result):j(e,void 0,function(e){return w(t,e)},function(e){return S(t,e)})}function b(t,n,r){n.constructor===t.constructor&&r===l&&n.constructor.resolve===h?m(t,n):void 0===r?A(t,n):e(r)?y(t,n,r):A(t,n)}function w(e,n){if(e===n)S(e,v());else if(t(n)){var r=void 0;try{r=n.then}catch(o){return void S(e,o)}b(e,n,r)}else A(e,n)}function g(t){t._onerror&&t._onerror(t._result),E(t)}function A(t,e){t._state===X&&(t._result=e,t._state=Z,0!==t._subscribers.length&&z(E,t))}function S(t,e){t._state===X&&(t._state=$,t._result=e,z(g,t))}function j(t,e,n,r){var o=t._subscribers,i=o.length;t._onerror=null,o[i]=e,o[i+Z]=n,o[i+$]=r,0===i&&t._state&&z(E,t)}function E(t){var e=t._subscribers,n=t._state;if(0!==e.length){for(var r=void 0,o=void 0,i=t._result,s=0;s<e.length;s+=3)r=e[s],o=e[s+n],r?T(n,r,o,i):o(i);t._subscribers.length=0}}function T(t,n,r,o){var i=e(r),s=void 0,u=void 0,c=!0;if(i){try{s=r(o)}catch(a){c=!1,u=a}if(n===s)return void S(n,d())}else s=o;n._state!==X||(i&&c?w(n,s):c===!1?S(n,u):t===Z?A(n,s):t===$&&S(n,s))}function M(t,e){try{e(function(e){w(t,e)},function(e){S(t,e)})}catch(n){S(t,n)}}function P(){return tt++}function x(t){t[V]=tt++,t._state=void 0,t._result=void 0,t._subscribers=[]}function C(){return new Error("Array Methods must be provided an Array")}function O(t){return new et(this,t).promise}function k(t){var e=this;return new e(L(t)?function(n,r){for(var o=t.length,i=0;i<o;i++)e.resolve(t[i]).then(n,r)}:function(t,e){return e(new TypeError("You must pass an array to race."))})}function F(t){var e=this,n=new e(p);return S(n,t),n}function Y(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function q(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function D(){var t=void 0;if("undefined"!=typeof global)t=global;else if("undefined"!=typeof self)t=self;else try{t=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var n=t.Promise;if(n){var r=null;try{r=Object.prototype.toString.call(n.resolve())}catch(e){}if("[object Promise]"===r&&!n.cast)return}t.Promise=nt}var K=void 0;K=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};var L=K,N=0,U=void 0,W=void 0,z=function(t,e){Q[N]=t,Q[N+1]=e,N+=2,2===N&&(W?W(a):R())},B="undefined"!=typeof window?window:void 0,G=B||{},H=G.MutationObserver||G.WebKitMutationObserver,I="undefined"==typeof self&&"undefined"!=typeof process&&"[object process]"==={}.toString.call(process),J="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,Q=new Array(1e3),R=void 0;R=I?o():H?s():J?u():void 0===B&&"function"==typeof require?f():c();var V=Math.random().toString(36).substring(2),X=void 0,Z=1,$=2,tt=0,et=function(){function t(t,e){this._instanceConstructor=t,this.promise=new t(p),this.promise[V]||x(this.promise),L(e)?(this.length=e.length,this._remaining=e.length,this._result=new Array(this.length),0===this.length?A(this.promise,this._result):(this.length=this.length||0,this._enumerate(e),0===this._remaining&&A(this.promise,this._result))):S(this.promise,C())}return t.prototype._enumerate=function(t){for(var e=0;this._state===X&&e<t.length;e++)this._eachEntry(t[e],e)},t.prototype._eachEntry=function(t,e){var n=this._instanceConstructor,r=n.resolve;if(r===h){var o=void 0,i=void 0,s=!1;try{o=t.then}catch(u){s=!0,i=u}if(o===l&&t._state!==X)this._settledAt(t._state,e,t._result);else if("function"!=typeof o)this._remaining--,this._result[e]=t;else if(n===nt){var c=new n(p);s?S(c,i):b(c,t,o),this._willSettleAt(c,e)}else this._willSettleAt(new n(function(e){return e(t)}),e)}else this._willSettleAt(r(t),e)},t.prototype._settledAt=function(t,e,n){var r=this.promise;r._state===X&&(this._remaining--,t===$?S(r,n):this._result[e]=n),0===this._remaining&&A(r,this._result)},t.prototype._willSettleAt=function(t,e){var n=this;j(t,void 0,function(t){return n._settledAt(Z,e,t)},function(t){return n._settledAt($,e,t)})},t}(),nt=function(){function t(e){this[V]=P(),this._result=this._state=void 0,this._subscribers=[],p!==e&&("function"!=typeof e&&Y(),this instanceof t?M(this,e):q())}return t.prototype["catch"]=function(t){return this.then(null,t)},t.prototype["finally"]=function(t){var n=this,r=n.constructor;return e(t)?n.then(function(e){return r.resolve(t()).then(function(){return e})},function(e){return r.resolve(t()).then(function(){throw e})}):n.then(t,t)},t}();return nt.prototype.then=l,nt.all=O,nt.race=k,nt.resolve=h,nt.reject=F,nt._setScheduler=n,nt._setAsap=r,nt._asap=z,nt.polyfill=D,nt.Promise=nt,nt.polyfill(),nt});
\ No newline at end of file
diff --git a/node_modules/es6-promise/dist/es6-promise.auto.min.map b/node_modules/es6-promise/dist/es6-promise.auto.min.map
deleted file mode 100644
index 1d2a119..0000000
--- a/node_modules/es6-promise/dist/es6-promise.auto.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["config/versionTemplate.txt","lib/es6-promise/utils.js","lib/es6-promise/asap.js","lib/es6-promise/then.js","lib/es6-promise/promise/resolve.js","lib/es6-promise/-internal.js","lib/es6-promise/enumerator.js","lib/es6-promise/promise/all.js","lib/es6-promise/promise/race.js","lib/es6-promise/promise/reject.js","lib/es6-promise/promise.js","lib/es6-promise/polyfill.js","lib/es6-promise.js","lib/es6-promise.auto.js"],"sourcesContent":["/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license   Licensed under MIT license\n *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version   v4.2.8+1e68dce6\n */\n","export function objectOrFunction(x) {\n  var type = typeof x;\n  return x !== null && (type === 'object' || type === 'function');\n}\n\nexport function isFunction(x) {\n  return typeof x === 'function';\n}\n\nexport function isMaybeThenable(x) {\n  return x !== null && typeof x === 'object';\n}\n\nvar _isArray = void 0;\nif (Array.isArray) {\n  _isArray = Array.isArray;\n} else {\n  _isArray = function (x) {\n    return Object.prototype.toString.call(x) === '[object Array]';\n  };\n}\n\nexport var isArray = _isArray;","var len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nexport var asap = function asap(callback, arg) {\n  queue[len] = callback;\n  queue[len + 1] = arg;\n  len += 2;\n  if (len === 2) {\n    // If len is 2, that means that we need to schedule an async flush.\n    // If additional callbacks are queued before the queue is flushed, they\n    // will be processed by this flush that we are scheduling.\n    if (customSchedulerFn) {\n      customSchedulerFn(flush);\n    } else {\n      scheduleFlush();\n    }\n  }\n};\n\nexport function setScheduler(scheduleFn) {\n  customSchedulerFn = scheduleFn;\n}\n\nexport function setAsap(asapFn) {\n  asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n  // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n  // see https://github.com/cujojs/when/issues/410 for details\n  return function () {\n    return process.nextTick(flush);\n  };\n}\n\n// vertx\nfunction useVertxTimer() {\n  if (typeof vertxNext !== 'undefined') {\n    return function () {\n      vertxNext(flush);\n    };\n  }\n\n  return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n  var iterations = 0;\n  var observer = new BrowserMutationObserver(flush);\n  var node = document.createTextNode('');\n  observer.observe(node, { characterData: true });\n\n  return function () {\n    node.data = iterations = ++iterations % 2;\n  };\n}\n\n// web worker\nfunction useMessageChannel() {\n  var channel = new MessageChannel();\n  channel.port1.onmessage = flush;\n  return function () {\n    return channel.port2.postMessage(0);\n  };\n}\n\nfunction useSetTimeout() {\n  // Store setTimeout reference so es6-promise will be unaffected by\n  // other code modifying setTimeout (like sinon.useFakeTimers())\n  var globalSetTimeout = setTimeout;\n  return function () {\n    return globalSetTimeout(flush, 1);\n  };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n  for (var i = 0; i < len; i += 2) {\n    var callback = queue[i];\n    var arg = queue[i + 1];\n\n    callback(arg);\n\n    queue[i] = undefined;\n    queue[i + 1] = undefined;\n  }\n\n  len = 0;\n}\n\nfunction attemptVertx() {\n  try {\n    var vertx = Function('return this')().require('vertx');\n    vertxNext = vertx.runOnLoop || vertx.runOnContext;\n    return useVertxTimer();\n  } catch (e) {\n    return useSetTimeout();\n  }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n  scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n  scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n  scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n  scheduleFlush = attemptVertx();\n} else {\n  scheduleFlush = useSetTimeout();\n}","import { invokeCallback, subscribe, FULFILLED, REJECTED, noop, makePromise, PROMISE_ID } from './-internal';\n\nimport { asap } from './asap';\n\nexport default function then(onFulfillment, onRejection) {\n  var parent = this;\n\n  var child = new this.constructor(noop);\n\n  if (child[PROMISE_ID] === undefined) {\n    makePromise(child);\n  }\n\n  var _state = parent._state;\n\n\n  if (_state) {\n    var callback = arguments[_state - 1];\n    asap(function () {\n      return invokeCallback(_state, child, callback, parent._result);\n    });\n  } else {\n    subscribe(parent, child, onFulfillment, onRejection);\n  }\n\n  return child;\n}","import { noop, resolve as _resolve } from '../-internal';\n\n/**\n  `Promise.resolve` returns a promise that will become resolved with the\n  passed `value`. It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    resolve(1);\n  });\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.resolve(1);\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  @method resolve\n  @static\n  @param {Any} value value that the returned promise will be resolved with\n  Useful for tooling.\n  @return {Promise} a promise that will become fulfilled with the given\n  `value`\n*/\nexport default function resolve(object) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (object && typeof object === 'object' && object.constructor === Constructor) {\n    return object;\n  }\n\n  var promise = new Constructor(noop);\n  _resolve(promise, object);\n  return promise;\n}","import { objectOrFunction, isFunction } from './utils';\n\nimport { asap } from './asap';\n\nimport originalThen from './then';\nimport originalResolve from './promise/resolve';\n\nexport var PROMISE_ID = Math.random().toString(36).substring(2);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nfunction selfFulfillment() {\n  return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n  return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n  try {\n    then.call(value, fulfillmentHandler, rejectionHandler);\n  } catch (e) {\n    return e;\n  }\n}\n\nfunction handleForeignThenable(promise, thenable, then) {\n  asap(function (promise) {\n    var sealed = false;\n    var error = tryThen(then, thenable, function (value) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n      if (thenable !== value) {\n        resolve(promise, value);\n      } else {\n        fulfill(promise, value);\n      }\n    }, function (reason) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n\n      reject(promise, reason);\n    }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n    if (!sealed && error) {\n      sealed = true;\n      reject(promise, error);\n    }\n  }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n  if (thenable._state === FULFILLED) {\n    fulfill(promise, thenable._result);\n  } else if (thenable._state === REJECTED) {\n    reject(promise, thenable._result);\n  } else {\n    subscribe(thenable, undefined, function (value) {\n      return resolve(promise, value);\n    }, function (reason) {\n      return reject(promise, reason);\n    });\n  }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then) {\n  if (maybeThenable.constructor === promise.constructor && then === originalThen && maybeThenable.constructor.resolve === originalResolve) {\n    handleOwnThenable(promise, maybeThenable);\n  } else {\n    if (then === undefined) {\n      fulfill(promise, maybeThenable);\n    } else if (isFunction(then)) {\n      handleForeignThenable(promise, maybeThenable, then);\n    } else {\n      fulfill(promise, maybeThenable);\n    }\n  }\n}\n\nfunction resolve(promise, value) {\n  if (promise === value) {\n    reject(promise, selfFulfillment());\n  } else if (objectOrFunction(value)) {\n    var then = void 0;\n    try {\n      then = value.then;\n    } catch (error) {\n      reject(promise, error);\n      return;\n    }\n    handleMaybeThenable(promise, value, then);\n  } else {\n    fulfill(promise, value);\n  }\n}\n\nfunction publishRejection(promise) {\n  if (promise._onerror) {\n    promise._onerror(promise._result);\n  }\n\n  publish(promise);\n}\n\nfunction fulfill(promise, value) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n\n  promise._result = value;\n  promise._state = FULFILLED;\n\n  if (promise._subscribers.length !== 0) {\n    asap(publish, promise);\n  }\n}\n\nfunction reject(promise, reason) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n  promise._state = REJECTED;\n  promise._result = reason;\n\n  asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n  var _subscribers = parent._subscribers;\n  var length = _subscribers.length;\n\n\n  parent._onerror = null;\n\n  _subscribers[length] = child;\n  _subscribers[length + FULFILLED] = onFulfillment;\n  _subscribers[length + REJECTED] = onRejection;\n\n  if (length === 0 && parent._state) {\n    asap(publish, parent);\n  }\n}\n\nfunction publish(promise) {\n  var subscribers = promise._subscribers;\n  var settled = promise._state;\n\n  if (subscribers.length === 0) {\n    return;\n  }\n\n  var child = void 0,\n      callback = void 0,\n      detail = promise._result;\n\n  for (var i = 0; i < subscribers.length; i += 3) {\n    child = subscribers[i];\n    callback = subscribers[i + settled];\n\n    if (child) {\n      invokeCallback(settled, child, callback, detail);\n    } else {\n      callback(detail);\n    }\n  }\n\n  promise._subscribers.length = 0;\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n  var hasCallback = isFunction(callback),\n      value = void 0,\n      error = void 0,\n      succeeded = true;\n\n  if (hasCallback) {\n    try {\n      value = callback(detail);\n    } catch (e) {\n      succeeded = false;\n      error = e;\n    }\n\n    if (promise === value) {\n      reject(promise, cannotReturnOwn());\n      return;\n    }\n  } else {\n    value = detail;\n  }\n\n  if (promise._state !== PENDING) {\n    // noop\n  } else if (hasCallback && succeeded) {\n    resolve(promise, value);\n  } else if (succeeded === false) {\n    reject(promise, error);\n  } else if (settled === FULFILLED) {\n    fulfill(promise, value);\n  } else if (settled === REJECTED) {\n    reject(promise, value);\n  }\n}\n\nfunction initializePromise(promise, resolver) {\n  try {\n    resolver(function resolvePromise(value) {\n      resolve(promise, value);\n    }, function rejectPromise(reason) {\n      reject(promise, reason);\n    });\n  } catch (e) {\n    reject(promise, e);\n  }\n}\n\nvar id = 0;\nfunction nextId() {\n  return id++;\n}\n\nfunction makePromise(promise) {\n  promise[PROMISE_ID] = id++;\n  promise._state = undefined;\n  promise._result = undefined;\n  promise._subscribers = [];\n}\n\nexport { nextId, makePromise, noop, resolve, reject, fulfill, subscribe, publish, publishRejection, initializePromise, invokeCallback, FULFILLED, REJECTED, PENDING, handleMaybeThenable };","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { isArray, isMaybeThenable } from './utils';\nimport { noop, reject, fulfill, subscribe, FULFILLED, REJECTED, PENDING, handleMaybeThenable } from './-internal';\n\nimport then from './then';\nimport Promise from './promise';\nimport originalResolve from './promise/resolve';\nimport originalThen from './then';\nimport { makePromise, PROMISE_ID } from './-internal';\n\nfunction validationError() {\n  return new Error('Array Methods must be provided an Array');\n};\n\nvar Enumerator = function () {\n  function Enumerator(Constructor, input) {\n    this._instanceConstructor = Constructor;\n    this.promise = new Constructor(noop);\n\n    if (!this.promise[PROMISE_ID]) {\n      makePromise(this.promise);\n    }\n\n    if (isArray(input)) {\n      this.length = input.length;\n      this._remaining = input.length;\n\n      this._result = new Array(this.length);\n\n      if (this.length === 0) {\n        fulfill(this.promise, this._result);\n      } else {\n        this.length = this.length || 0;\n        this._enumerate(input);\n        if (this._remaining === 0) {\n          fulfill(this.promise, this._result);\n        }\n      }\n    } else {\n      reject(this.promise, validationError());\n    }\n  }\n\n  Enumerator.prototype._enumerate = function _enumerate(input) {\n    for (var i = 0; this._state === PENDING && i < input.length; i++) {\n      this._eachEntry(input[i], i);\n    }\n  };\n\n  Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n    var c = this._instanceConstructor;\n    var resolve = c.resolve;\n\n\n    if (resolve === originalResolve) {\n      var _then = void 0;\n      var error = void 0;\n      var didError = false;\n      try {\n        _then = entry.then;\n      } catch (e) {\n        didError = true;\n        error = e;\n      }\n\n      if (_then === originalThen && entry._state !== PENDING) {\n        this._settledAt(entry._state, i, entry._result);\n      } else if (typeof _then !== 'function') {\n        this._remaining--;\n        this._result[i] = entry;\n      } else if (c === Promise) {\n        var promise = new c(noop);\n        if (didError) {\n          reject(promise, error);\n        } else {\n          handleMaybeThenable(promise, entry, _then);\n        }\n        this._willSettleAt(promise, i);\n      } else {\n        this._willSettleAt(new c(function (resolve) {\n          return resolve(entry);\n        }), i);\n      }\n    } else {\n      this._willSettleAt(resolve(entry), i);\n    }\n  };\n\n  Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n    var promise = this.promise;\n\n\n    if (promise._state === PENDING) {\n      this._remaining--;\n\n      if (state === REJECTED) {\n        reject(promise, value);\n      } else {\n        this._result[i] = value;\n      }\n    }\n\n    if (this._remaining === 0) {\n      fulfill(promise, this._result);\n    }\n  };\n\n  Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n    var enumerator = this;\n\n    subscribe(promise, undefined, function (value) {\n      return enumerator._settledAt(FULFILLED, i, value);\n    }, function (reason) {\n      return enumerator._settledAt(REJECTED, i, reason);\n    });\n  };\n\n  return Enumerator;\n}();\n\nexport default Enumerator;\n;","import Enumerator from '../enumerator';\n\n/**\n  `Promise.all` accepts an array of promises, and returns a new promise which\n  is fulfilled with an array of fulfillment values for the passed promises, or\n  rejected with the reason of the first passed promise to be rejected. It casts all\n  elements of the passed iterable to promises as it runs this algorithm.\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = resolve(2);\n  let promise3 = resolve(3);\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // The array here would be [ 1, 2, 3 ];\n  });\n  ```\n\n  If any of the `promises` given to `all` are rejected, the first promise\n  that is rejected will be given as an argument to the returned promises's\n  rejection handler. For example:\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = reject(new Error(\"2\"));\n  let promise3 = reject(new Error(\"3\"));\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // Code here never runs because there are rejected promises!\n  }, function(error) {\n    // error.message === \"2\"\n  });\n  ```\n\n  @method all\n  @static\n  @param {Array} entries array of promises\n  @param {String} label optional string for labeling the promise.\n  Useful for tooling.\n  @return {Promise} promise that is fulfilled when all `promises` have been\n  fulfilled, or rejected if any of them become rejected.\n  @static\n*/\nexport default function all(entries) {\n  return new Enumerator(this, entries).promise;\n}","import { isArray } from \"../utils\";\n\n/**\n  `Promise.race` returns a new promise which is settled in the same way as the\n  first passed promise to settle.\n\n  Example:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 2');\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // result === 'promise 2' because it was resolved before promise1\n    // was resolved.\n  });\n  ```\n\n  `Promise.race` is deterministic in that only the state of the first\n  settled promise matters. For example, even if other promises given to the\n  `promises` array argument are resolved, but the first settled promise has\n  become rejected before the other promises became fulfilled, the returned\n  promise will become rejected:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      reject(new Error('promise 2'));\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // Code here never runs\n  }, function(reason){\n    // reason.message === 'promise 2' because promise 2 became rejected before\n    // promise 1 became fulfilled\n  });\n  ```\n\n  An example real-world use case is implementing timeouts:\n\n  ```javascript\n  Promise.race([ajax('foo.json'), timeout(5000)])\n  ```\n\n  @method race\n  @static\n  @param {Array} promises array of promises to observe\n  Useful for tooling.\n  @return {Promise} a promise which settles in the same way as the first passed\n  promise to settle.\n*/\nexport default function race(entries) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (!isArray(entries)) {\n    return new Constructor(function (_, reject) {\n      return reject(new TypeError('You must pass an array to race.'));\n    });\n  } else {\n    return new Constructor(function (resolve, reject) {\n      var length = entries.length;\n      for (var i = 0; i < length; i++) {\n        Constructor.resolve(entries[i]).then(resolve, reject);\n      }\n    });\n  }\n}","import { noop, reject as _reject } from '../-internal';\n\n/**\n  `Promise.reject` returns a promise rejected with the passed `reason`.\n  It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    reject(new Error('WHOOPS'));\n  });\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.reject(new Error('WHOOPS'));\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  @method reject\n  @static\n  @param {Any} reason value that the returned promise will be rejected with.\n  Useful for tooling.\n  @return {Promise} a promise rejected with the given `reason`.\n*/\nexport default function reject(reason) {\n  /*jshint validthis:true */\n  var Constructor = this;\n  var promise = new Constructor(noop);\n  _reject(promise, reason);\n  return promise;\n}","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { isFunction } from './utils';\nimport { noop, nextId, PROMISE_ID, initializePromise } from './-internal';\nimport { asap, setAsap, setScheduler } from './asap';\n\nimport all from './promise/all';\nimport race from './promise/race';\nimport Resolve from './promise/resolve';\nimport Reject from './promise/reject';\nimport then from './then';\n\nfunction needsResolver() {\n  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n  throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n  Promise objects represent the eventual result of an asynchronous operation. The\n  primary way of interacting with a promise is through its `then` method, which\n  registers callbacks to receive either a promise's eventual value or the reason\n  why the promise cannot be fulfilled.\n\n  Terminology\n  -----------\n\n  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n  - `thenable` is an object or function that defines a `then` method.\n  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n  - `exception` is a value that is thrown using the throw statement.\n  - `reason` is a value that indicates why a promise was rejected.\n  - `settled` the final resting state of a promise, fulfilled or rejected.\n\n  A promise can be in one of three states: pending, fulfilled, or rejected.\n\n  Promises that are fulfilled have a fulfillment value and are in the fulfilled\n  state.  Promises that are rejected have a rejection reason and are in the\n  rejected state.  A fulfillment value is never a thenable.\n\n  Promises can also be said to *resolve* a value.  If this value is also a\n  promise, then the original promise's settled state will match the value's\n  settled state.  So a promise that *resolves* a promise that rejects will\n  itself reject, and a promise that *resolves* a promise that fulfills will\n  itself fulfill.\n\n\n  Basic Usage:\n  ------------\n\n  ```js\n  let promise = new Promise(function(resolve, reject) {\n    // on success\n    resolve(value);\n\n    // on failure\n    reject(reason);\n  });\n\n  promise.then(function(value) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Advanced Usage:\n  ---------------\n\n  Promises shine when abstracting away asynchronous interactions such as\n  `XMLHttpRequest`s.\n\n  ```js\n  function getJSON(url) {\n    return new Promise(function(resolve, reject){\n      let xhr = new XMLHttpRequest();\n\n      xhr.open('GET', url);\n      xhr.onreadystatechange = handler;\n      xhr.responseType = 'json';\n      xhr.setRequestHeader('Accept', 'application/json');\n      xhr.send();\n\n      function handler() {\n        if (this.readyState === this.DONE) {\n          if (this.status === 200) {\n            resolve(this.response);\n          } else {\n            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n          }\n        }\n      };\n    });\n  }\n\n  getJSON('/posts.json').then(function(json) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Unlike callbacks, promises are great composable primitives.\n\n  ```js\n  Promise.all([\n    getJSON('/posts'),\n    getJSON('/comments')\n  ]).then(function(values){\n    values[0] // => postsJSON\n    values[1] // => commentsJSON\n\n    return values;\n  });\n  ```\n\n  @class Promise\n  @param {Function} resolver\n  Useful for tooling.\n  @constructor\n*/\n\nvar Promise = function () {\n  function Promise(resolver) {\n    this[PROMISE_ID] = nextId();\n    this._result = this._state = undefined;\n    this._subscribers = [];\n\n    if (noop !== resolver) {\n      typeof resolver !== 'function' && needsResolver();\n      this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n    }\n  }\n\n  /**\n  The primary way of interacting with a promise is through its `then` method,\n  which registers callbacks to receive either a promise's eventual value or the\n  reason why the promise cannot be fulfilled.\n   ```js\n  findUser().then(function(user){\n    // user is available\n  }, function(reason){\n    // user is unavailable, and you are given the reason why\n  });\n  ```\n   Chaining\n  --------\n   The return value of `then` is itself a promise.  This second, 'downstream'\n  promise is resolved with the return value of the first promise's fulfillment\n  or rejection handler, or rejected if the handler throws an exception.\n   ```js\n  findUser().then(function (user) {\n    return user.name;\n  }, function (reason) {\n    return 'default name';\n  }).then(function (userName) {\n    // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n    // will be `'default name'`\n  });\n   findUser().then(function (user) {\n    throw new Error('Found user, but still unhappy');\n  }, function (reason) {\n    throw new Error('`findUser` rejected and we're unhappy');\n  }).then(function (value) {\n    // never reached\n  }, function (reason) {\n    // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n    // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n  });\n  ```\n  If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n   ```js\n  findUser().then(function (user) {\n    throw new PedagogicalException('Upstream error');\n  }).then(function (value) {\n    // never reached\n  }).then(function (value) {\n    // never reached\n  }, function (reason) {\n    // The `PedgagocialException` is propagated all the way down to here\n  });\n  ```\n   Assimilation\n  ------------\n   Sometimes the value you want to propagate to a downstream promise can only be\n  retrieved asynchronously. This can be achieved by returning a promise in the\n  fulfillment or rejection handler. The downstream promise will then be pending\n  until the returned promise is settled. This is called *assimilation*.\n   ```js\n  findUser().then(function (user) {\n    return findCommentsByAuthor(user);\n  }).then(function (comments) {\n    // The user's comments are now available\n  });\n  ```\n   If the assimliated promise rejects, then the downstream promise will also reject.\n   ```js\n  findUser().then(function (user) {\n    return findCommentsByAuthor(user);\n  }).then(function (comments) {\n    // If `findCommentsByAuthor` fulfills, we'll have the value here\n  }, function (reason) {\n    // If `findCommentsByAuthor` rejects, we'll have the reason here\n  });\n  ```\n   Simple Example\n  --------------\n   Synchronous Example\n   ```javascript\n  let result;\n   try {\n    result = findResult();\n    // success\n  } catch(reason) {\n    // failure\n  }\n  ```\n   Errback Example\n   ```js\n  findResult(function(result, err){\n    if (err) {\n      // failure\n    } else {\n      // success\n    }\n  });\n  ```\n   Promise Example;\n   ```javascript\n  findResult().then(function(result){\n    // success\n  }, function(reason){\n    // failure\n  });\n  ```\n   Advanced Example\n  --------------\n   Synchronous Example\n   ```javascript\n  let author, books;\n   try {\n    author = findAuthor();\n    books  = findBooksByAuthor(author);\n    // success\n  } catch(reason) {\n    // failure\n  }\n  ```\n   Errback Example\n   ```js\n   function foundBooks(books) {\n   }\n   function failure(reason) {\n   }\n   findAuthor(function(author, err){\n    if (err) {\n      failure(err);\n      // failure\n    } else {\n      try {\n        findBoooksByAuthor(author, function(books, err) {\n          if (err) {\n            failure(err);\n          } else {\n            try {\n              foundBooks(books);\n            } catch(reason) {\n              failure(reason);\n            }\n          }\n        });\n      } catch(error) {\n        failure(err);\n      }\n      // success\n    }\n  });\n  ```\n   Promise Example;\n   ```javascript\n  findAuthor().\n    then(findBooksByAuthor).\n    then(function(books){\n      // found books\n  }).catch(function(reason){\n    // something went wrong\n  });\n  ```\n   @method then\n  @param {Function} onFulfilled\n  @param {Function} onRejected\n  Useful for tooling.\n  @return {Promise}\n  */\n\n  /**\n  `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n  as the catch block of a try/catch statement.\n  ```js\n  function findAuthor(){\n  throw new Error('couldn't find that author');\n  }\n  // synchronous\n  try {\n  findAuthor();\n  } catch(reason) {\n  // something went wrong\n  }\n  // async with promises\n  findAuthor().catch(function(reason){\n  // something went wrong\n  });\n  ```\n  @method catch\n  @param {Function} onRejection\n  Useful for tooling.\n  @return {Promise}\n  */\n\n\n  Promise.prototype.catch = function _catch(onRejection) {\n    return this.then(null, onRejection);\n  };\n\n  /**\n    `finally` will be invoked regardless of the promise's fate just as native\n    try/catch/finally behaves\n  \n    Synchronous example:\n  \n    ```js\n    findAuthor() {\n      if (Math.random() > 0.5) {\n        throw new Error();\n      }\n      return new Author();\n    }\n  \n    try {\n      return findAuthor(); // succeed or fail\n    } catch(error) {\n      return findOtherAuther();\n    } finally {\n      // always runs\n      // doesn't affect the return value\n    }\n    ```\n  \n    Asynchronous example:\n  \n    ```js\n    findAuthor().catch(function(reason){\n      return findOtherAuther();\n    }).finally(function(){\n      // author was either found, or not\n    });\n    ```\n  \n    @method finally\n    @param {Function} callback\n    @return {Promise}\n  */\n\n\n  Promise.prototype.finally = function _finally(callback) {\n    var promise = this;\n    var constructor = promise.constructor;\n\n    if (isFunction(callback)) {\n      return promise.then(function (value) {\n        return constructor.resolve(callback()).then(function () {\n          return value;\n        });\n      }, function (reason) {\n        return constructor.resolve(callback()).then(function () {\n          throw reason;\n        });\n      });\n    }\n\n    return promise.then(callback, callback);\n  };\n\n  return Promise;\n}();\n\nPromise.prototype.then = then;\nexport default Promise;\nPromise.all = all;\nPromise.race = race;\nPromise.resolve = Resolve;\nPromise.reject = Reject;\nPromise._setScheduler = setScheduler;\nPromise._setAsap = setAsap;\nPromise._asap = asap;","/*global self*/\nimport Promise from './promise';\n\nexport default function polyfill() {\n  var local = void 0;\n\n  if (typeof global !== 'undefined') {\n    local = global;\n  } else if (typeof self !== 'undefined') {\n    local = self;\n  } else {\n    try {\n      local = Function('return this')();\n    } catch (e) {\n      throw new Error('polyfill failed because global object is unavailable in this environment');\n    }\n  }\n\n  var P = local.Promise;\n\n  if (P) {\n    var promiseToString = null;\n    try {\n      promiseToString = Object.prototype.toString.call(P.resolve());\n    } catch (e) {\n      // silently ignored\n    }\n\n    if (promiseToString === '[object Promise]' && !P.cast) {\n      return;\n    }\n  }\n\n  local.Promise = Promise;\n}","import Promise from './es6-promise/promise';\nimport polyfill from './es6-promise/polyfill';\n\n// Strange compat..\nPromise.polyfill = polyfill;\nPromise.Promise = Promise;\nexport default Promise;","import Promise from './es6-promise';\nPromise.polyfill();\nexport default Promise;"],"names":["resolve","_resolve","then","originalThen","originalResolve","Promise","reject","_reject","Resolve","Reject"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACNO,SAAS,gBAAgB,CAAC,CAAC,EAAE;EAClC,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC;EACpB,OAAO,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,UAAU,CAAC,CAAC;CACjE;;AAED,AAAO,SAAS,UAAU,CAAC,CAAC,EAAE;EAC5B,OAAO,OAAO,CAAC,KAAK,UAAU,CAAC;CAChC;;AAED,AAEC;;AAED,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC;AACtB,IAAI,KAAK,CAAC,OAAO,EAAE;EACjB,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;CAC1B,MAAM;EACL,QAAQ,GAAG,UAAU,CAAC,EAAE;IACtB,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC;GAC/D,CAAC;CACH;;AAED,AAAO,IAAI,OAAO,GAAG,QAAQ;;ACtB7B,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,IAAI,SAAS,GAAG,KAAK,CAAC,CAAC;AACvB,IAAI,iBAAiB,GAAG,KAAK,CAAC,CAAC;;AAE/B,AAAO,IAAI,IAAI,GAAG,SAAS,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;EAC7C,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;EACtB,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;EACrB,GAAG,IAAI,CAAC,CAAC;EACT,IAAI,GAAG,KAAK,CAAC,EAAE;;;;IAIb,IAAI,iBAAiB,EAAE;MACrB,iBAAiB,CAAC,KAAK,CAAC,CAAC;KAC1B,MAAM;MACL,aAAa,EAAE,CAAC;KACjB;GACF;CACF,CAAC;;AAEF,AAAO,SAAS,YAAY,CAAC,UAAU,EAAE;EACvC,iBAAiB,GAAG,UAAU,CAAC;CAChC;;AAED,AAAO,SAAS,OAAO,CAAC,MAAM,EAAE;EAC9B,IAAI,GAAG,MAAM,CAAC;CACf;;AAED,IAAI,aAAa,GAAG,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AACvE,IAAI,aAAa,GAAG,aAAa,IAAI,EAAE,CAAC;AACxC,IAAI,uBAAuB,GAAG,aAAa,CAAC,gBAAgB,IAAI,aAAa,CAAC,sBAAsB,CAAC;AACrG,IAAI,MAAM,GAAG,OAAO,IAAI,KAAK,WAAW,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,kBAAkB,CAAC;;;AAG/H,IAAI,QAAQ,GAAG,OAAO,iBAAiB,KAAK,WAAW,IAAI,OAAO,aAAa,KAAK,WAAW,IAAI,OAAO,cAAc,KAAK,WAAW,CAAC;;;AAGzI,SAAS,WAAW,GAAG;;;EAGrB,OAAO,YAAY;IACjB,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;GAChC,CAAC;CACH;;;AAGD,SAAS,aAAa,GAAG;EACvB,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE;IACpC,OAAO,YAAY;MACjB,SAAS,CAAC,KAAK,CAAC,CAAC;KAClB,CAAC;GACH;;EAED,OAAO,aAAa,EAAE,CAAC;CACxB;;AAED,SAAS,mBAAmB,GAAG;EAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;EACnB,IAAI,QAAQ,GAAG,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC;EAClD,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;EACvC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;;EAEhD,OAAO,YAAY;IACjB,IAAI,CAAC,IAAI,GAAG,UAAU,GAAG,EAAE,UAAU,GAAG,CAAC,CAAC;GAC3C,CAAC;CACH;;;AAGD,SAAS,iBAAiB,GAAG;EAC3B,IAAI,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;EACnC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;EAChC,OAAO,YAAY;IACjB,OAAO,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;GACrC,CAAC;CACH;;AAED,SAAS,aAAa,GAAG;;;EAGvB,IAAI,gBAAgB,GAAG,UAAU,CAAC;EAClC,OAAO,YAAY;IACjB,OAAO,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;GACnC,CAAC;CACH;;AAED,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,SAAS,KAAK,GAAG;EACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE;IAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;IAEvB,QAAQ,CAAC,GAAG,CAAC,CAAC;;IAEd,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACrB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;GAC1B;;EAED,GAAG,GAAG,CAAC,CAAC;CACT;;AAED,SAAS,YAAY,GAAG;EACtB,IAAI;IACF,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,YAAY,CAAC;IAClD,OAAO,aAAa,EAAE,CAAC;GACxB,CAAC,OAAO,CAAC,EAAE;IACV,OAAO,aAAa,EAAE,CAAC;GACxB;CACF;;AAED,IAAI,aAAa,GAAG,KAAK,CAAC,CAAC;;AAE3B,IAAI,MAAM,EAAE;EACV,aAAa,GAAG,WAAW,EAAE,CAAC;CAC/B,MAAM,IAAI,uBAAuB,EAAE;EAClC,aAAa,GAAG,mBAAmB,EAAE,CAAC;CACvC,MAAM,IAAI,QAAQ,EAAE;EACnB,aAAa,GAAG,iBAAiB,EAAE,CAAC;CACrC,MAAM,IAAI,aAAa,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;EACvE,aAAa,GAAG,YAAY,EAAE,CAAC;CAChC,MAAM;EACL,aAAa,GAAG,aAAa,EAAE,CAAC;;;CACjC,DCtHc,SAAS,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE;EACvD,IAAI,MAAM,GAAG,IAAI,CAAC;;EAElB,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;;EAEvC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE;IACnC,WAAW,CAAC,KAAK,CAAC,CAAC;GACpB;;EAED,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;;EAG3B,IAAI,MAAM,EAAE;IACV,IAAI,QAAQ,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,YAAY;MACf,OAAO,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;KAChE,CAAC,CAAC;GACJ,MAAM;IACL,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;GACtD;;EAED,OAAO,KAAK,CAAC;;;CACd,DCxBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,AAAe,SAASA,SAAO,CAAC,MAAM,EAAE;;EAEtC,IAAI,WAAW,GAAG,IAAI,CAAC;;EAEvB,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW,EAAE;IAC9E,OAAO,MAAM,CAAC;GACf;;EAED,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;EACpCC,OAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EAC1B,OAAO,OAAO,CAAC;;;CAChB,DCrCM,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;AAEhE,SAAS,IAAI,GAAG,EAAE;;AAElB,IAAI,OAAO,GAAG,KAAK,CAAC,CAAC;AACrB,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,IAAI,QAAQ,GAAG,CAAC,CAAC;;AAEjB,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;CAClE;;AAED,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;CAC9E;;AAED,SAAS,OAAO,CAACC,OAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE;EAClE,IAAI;IACFA,OAAI,CAAC,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;GACxD,CAAC,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,CAAC;GACV;CACF;;AAED,SAAS,qBAAqB,CAAC,OAAO,EAAE,QAAQ,EAAEA,OAAI,EAAE;EACtD,IAAI,CAAC,UAAU,OAAO,EAAE;IACtB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,KAAK,GAAG,OAAO,CAACA,OAAI,EAAE,QAAQ,EAAE,UAAU,KAAK,EAAE;MACnD,IAAI,MAAM,EAAE;QACV,OAAO;OACR;MACD,MAAM,GAAG,IAAI,CAAC;MACd,IAAI,QAAQ,KAAK,KAAK,EAAE;QACtB,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACzB,MAAM;QACL,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACzB;KACF,EAAE,UAAU,MAAM,EAAE;MACnB,IAAI,MAAM,EAAE;QACV,OAAO;OACR;MACD,MAAM,GAAG,IAAI,CAAC;;MAEd,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KACzB,EAAE,UAAU,IAAI,OAAO,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAC,CAAC;;IAExD,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE;MACpB,MAAM,GAAG,IAAI,CAAC;MACd,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACxB;GACF,EAAE,OAAO,CAAC,CAAC;CACb;;AAED,SAAS,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE;EAC5C,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE;IACjC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;GACpC,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE;IACvC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;GACnC,MAAM;IACL,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE;MAC9C,OAAO,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KAChC,EAAE,UAAU,MAAM,EAAE;MACnB,OAAO,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KAChC,CAAC,CAAC;GACJ;CACF;;AAED,SAAS,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAEA,OAAI,EAAE;EACzD,IAAI,aAAa,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,IAAIA,OAAI,KAAKC,IAAY,IAAI,aAAa,CAAC,WAAW,CAAC,OAAO,KAAKC,SAAe,EAAE;IACvI,iBAAiB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;GAC3C,MAAM;IACL,IAAIF,OAAI,KAAK,SAAS,EAAE;MACtB,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KACjC,MAAM,IAAI,UAAU,CAACA,OAAI,CAAC,EAAE;MAC3B,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAEA,OAAI,CAAC,CAAC;KACrD,MAAM;MACL,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KACjC;GACF;CACF;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE;EAC/B,IAAI,OAAO,KAAK,KAAK,EAAE;IACrB,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;GACpC,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;IAClC,IAAIA,OAAI,GAAG,KAAK,CAAC,CAAC;IAClB,IAAI;MACFA,OAAI,GAAG,KAAK,CAAC,IAAI,CAAC;KACnB,CAAC,OAAO,KAAK,EAAE;MACd,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;MACvB,OAAO;KACR;IACD,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAEA,OAAI,CAAC,CAAC;GAC3C,MAAM;IACL,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACzB;CACF;;AAED,SAAS,gBAAgB,CAAC,OAAO,EAAE;EACjC,IAAI,OAAO,CAAC,QAAQ,EAAE;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;GACnC;;EAED,OAAO,CAAC,OAAO,CAAC,CAAC;CAClB;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE;EAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;IAC9B,OAAO;GACR;;EAED,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;EACxB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;;EAE3B,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;IACrC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;GACxB;CACF;;AAED,SAAS,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE;EAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;IAC9B,OAAO;GACR;EACD,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;EAC1B,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;;EAEzB,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;CACjC;;AAED,SAAS,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE;EAC5D,IAAI,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;EACvC,IAAI,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;;;EAGjC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;;EAEvB,YAAY,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;EAC7B,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,aAAa,CAAC;EACjD,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,WAAW,CAAC;;EAE9C,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE;IACjC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;GACvB;CACF;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE;EACxB,IAAI,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;EACvC,IAAI,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;;EAE7B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;IAC5B,OAAO;GACR;;EAED,IAAI,KAAK,GAAG,KAAK,CAAC;MACd,QAAQ,GAAG,KAAK,CAAC;MACjB,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;;EAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;IAC9C,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,QAAQ,GAAG,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;;IAEpC,IAAI,KAAK,EAAE;MACT,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;KAClD,MAAM;MACL,QAAQ,CAAC,MAAM,CAAC,CAAC;KAClB;GACF;;EAED,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;CACjC;;AAED,SAAS,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;EAC1D,IAAI,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC;MAClC,KAAK,GAAG,KAAK,CAAC;MACd,KAAK,GAAG,KAAK,CAAC;MACd,SAAS,GAAG,IAAI,CAAC;;EAErB,IAAI,WAAW,EAAE;IACf,IAAI;MACF,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;KAC1B,CAAC,OAAO,CAAC,EAAE;MACV,SAAS,GAAG,KAAK,CAAC;MAClB,KAAK,GAAG,CAAC,CAAC;KACX;;IAED,IAAI,OAAO,KAAK,KAAK,EAAE;MACrB,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;MACnC,OAAO;KACR;GACF,MAAM;IACL,KAAK,GAAG,MAAM,CAAC;GAChB;;EAED,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;;GAE/B,MAAM,IAAI,WAAW,IAAI,SAAS,EAAE;IACnC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACzB,MAAM,IAAI,SAAS,KAAK,KAAK,EAAE;IAC9B,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACxB,MAAM,IAAI,OAAO,KAAK,SAAS,EAAE;IAChC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACzB,MAAM,IAAI,OAAO,KAAK,QAAQ,EAAE;IAC/B,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACxB;CACF;;AAED,SAAS,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE;EAC5C,IAAI;IACF,QAAQ,CAAC,SAAS,cAAc,CAAC,KAAK,EAAE;MACtC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACzB,EAAE,SAAS,aAAa,CAAC,MAAM,EAAE;MAChC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KACzB,CAAC,CAAC;GACJ,CAAC,OAAO,CAAC,EAAE;IACV,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;GACpB;CACF;;AAED,IAAI,EAAE,GAAG,CAAC,CAAC;AACX,SAAS,MAAM,GAAG;EAChB,OAAO,EAAE,EAAE,CAAC;CACb;;AAED,SAAS,WAAW,CAAC,OAAO,EAAE;EAC5B,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;EAC3B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;EAC3B,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;EAC5B,OAAO,CAAC,YAAY,GAAG,EAAE,CAAC;CAC3B;;AChOD,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;CAC7D,AAAC;;AAEF,IAAI,UAAU,GAAG,YAAY;EAC3B,SAAS,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE;IACtC,IAAI,CAAC,oBAAoB,GAAG,WAAW,CAAC;IACxC,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;;IAErC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;MAC7B,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KAC3B;;IAED,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;MAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;MAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;;MAE/B,IAAI,CAAC,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;MAEtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACrB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;OACrC,MAAM;QACL,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;UACzB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;SACrC;OACF;KACF,MAAM;MACL,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;KACzC;GACF;;EAED,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,UAAU,CAAC,KAAK,EAAE;IAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;MAChE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KAC9B;GACF,CAAC;;EAEF,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE;IAC9D,IAAI,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC;IAClC,IAAIF,UAAO,GAAG,CAAC,CAAC,OAAO,CAAC;;;IAGxB,IAAIA,UAAO,KAAKI,SAAe,EAAE;MAC/B,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;MACnB,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;MACnB,IAAI,QAAQ,GAAG,KAAK,CAAC;MACrB,IAAI;QACF,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;OACpB,CAAC,OAAO,CAAC,EAAE;QACV,QAAQ,GAAG,IAAI,CAAC;QAChB,KAAK,GAAG,CAAC,CAAC;OACX;;MAED,IAAI,KAAK,KAAKD,IAAY,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE;QACtD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;OACjD,MAAM,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;OACzB,MAAM,IAAI,CAAC,KAAKE,SAAO,EAAE;QACxB,IAAI,OAAO,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,QAAQ,EAAE;UACZ,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SACxB,MAAM;UACL,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC5C;QACD,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;OAChC,MAAM;QACL,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,UAAUL,UAAO,EAAE;UAC1C,OAAOA,UAAO,CAAC,KAAK,CAAC,CAAC;SACvB,CAAC,EAAE,CAAC,CAAC,CAAC;OACR;KACF,MAAM;MACL,IAAI,CAAC,aAAa,CAACA,UAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;KACvC;GACF,CAAC;;EAEF,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE;IACrE,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;;;IAG3B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;MAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;;MAElB,IAAI,KAAK,KAAK,QAAQ,EAAE;QACtB,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACxB,MAAM;QACL,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;OACzB;KACF;;IAED,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;MACzB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;KAChC;GACF,CAAC;;EAEF,UAAU,CAAC,SAAS,CAAC,aAAa,GAAG,SAAS,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE;IACtE,IAAI,UAAU,GAAG,IAAI,CAAC;;IAEtB,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE;MAC7C,OAAO,UAAU,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;KACnD,EAAE,UAAU,MAAM,EAAE;MACnB,OAAO,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;KACnD,CAAC,CAAC;GACJ,CAAC;;EAEF,OAAO,UAAU,CAAC;CACnB,EAAE;;ACrHH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,AAAe,SAAS,GAAG,CAAC,OAAO,EAAE;EACnC,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC;;;CAC9C,DCjDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA,AAAe,SAAS,IAAI,CAAC,OAAO,EAAE;;EAEpC,IAAI,WAAW,GAAG,IAAI,CAAC;;EAEvB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;IACrB,OAAO,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE;MAC1C,OAAO,MAAM,CAAC,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC,CAAC;KACjE,CAAC,CAAC;GACJ,MAAM;IACL,OAAO,IAAI,WAAW,CAAC,UAAU,OAAO,EAAE,MAAM,EAAE;MAChD,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;MAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;QAC/B,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;OACvD;KACF,CAAC,CAAC;GACJ;;;CACF,DCjFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,AAAe,SAASM,QAAM,CAAC,MAAM,EAAE;;EAErC,IAAI,WAAW,GAAG,IAAI,CAAC;EACvB,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;EACpCC,MAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACzB,OAAO,OAAO,CAAC;;;CAChB,DC9BD,SAAS,aAAa,GAAG;EACvB,MAAM,IAAI,SAAS,CAAC,oFAAoF,CAAC,CAAC;CAC3G;;AAED,SAAS,QAAQ,GAAG;EAClB,MAAM,IAAI,SAAS,CAAC,uHAAuH,CAAC,CAAC;CAC9I;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0GD,IAAIF,SAAO,GAAG,YAAY;EACxB,SAAS,OAAO,CAAC,QAAQ,EAAE;IACzB,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IACvC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;;IAEvB,IAAI,IAAI,KAAK,QAAQ,EAAE;MACrB,OAAO,QAAQ,KAAK,UAAU,IAAI,aAAa,EAAE,CAAC;MAClD,IAAI,YAAY,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAE,CAAC;KAC1E;GACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4LD,OAAO,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,MAAM,CAAC,WAAW,EAAE;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;GACrC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CF,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,QAAQ,CAAC,QAAQ,EAAE;IACtD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;;IAEtC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE;MACxB,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,KAAK,EAAE;QACnC,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY;UACtD,OAAO,KAAK,CAAC;SACd,CAAC,CAAC;OACJ,EAAE,UAAU,MAAM,EAAE;QACnB,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY;UACtD,MAAM,MAAM,CAAC;SACd,CAAC,CAAC;OACJ,CAAC,CAAC;KACJ;;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;GACzC,CAAC;;EAEF,OAAO,OAAO,CAAC;CAChB,EAAE,CAAC;;AAEJA,SAAO,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC;AAC9B,AACAA,SAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAClBA,SAAO,CAAC,IAAI,GAAG,IAAI,CAAC;AACpBA,SAAO,CAAC,OAAO,GAAGG,SAAO,CAAC;AAC1BH,SAAO,CAAC,MAAM,GAAGI,QAAM,CAAC;AACxBJ,SAAO,CAAC,aAAa,GAAG,YAAY,CAAC;AACrCA,SAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;AAC3BA,SAAO,CAAC,KAAK,GAAG,IAAI;;AC5YpB;AACA,AAEe,SAAS,QAAQ,GAAG;EACjC,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;;EAEnB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;IACjC,KAAK,GAAG,MAAM,CAAC;GAChB,MAAM,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;IACtC,KAAK,GAAG,IAAI,CAAC;GACd,MAAM;IACL,IAAI;MACF,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;KACnC,CAAC,OAAO,CAAC,EAAE;MACV,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;KAC7F;GACF;;EAED,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;;EAEtB,IAAI,CAAC,EAAE;IACL,IAAI,eAAe,GAAG,IAAI,CAAC;IAC3B,IAAI;MACF,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;KAC/D,CAAC,OAAO,CAAC,EAAE;;KAEX;;IAED,IAAI,eAAe,KAAK,kBAAkB,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;MACrD,OAAO;KACR;GACF;;EAED,KAAK,CAAC,OAAO,GAAGA,SAAO,CAAC;;;CACzB,DC/BD;AACAA,SAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC5BA,SAAO,CAAC,OAAO,GAAGA,SAAO,CAAC;;ACJ1BA,SAAO,CAAC,QAAQ,EAAE,CAAC;;;;;;;;","file":"es6-promise.auto.min.js"}
\ No newline at end of file
diff --git a/node_modules/es6-promise/dist/es6-promise.js b/node_modules/es6-promise/dist/es6-promise.js
deleted file mode 100644
index 72fa0da..0000000
--- a/node_modules/es6-promise/dist/es6-promise.js
+++ /dev/null
@@ -1,1174 +0,0 @@
-/*!
- * @overview es6-promise - a tiny implementation of Promises/A+.
- * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
- * @license   Licensed under MIT license
- *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
- * @version   v4.2.8+1e68dce6
- */
-
-(function (global, factory) {
-	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-	typeof define === 'function' && define.amd ? define(factory) :
-	(global.ES6Promise = factory());
-}(this, (function () { 'use strict';
-
-function objectOrFunction(x) {
-  var type = typeof x;
-  return x !== null && (type === 'object' || type === 'function');
-}
-
-function isFunction(x) {
-  return typeof x === 'function';
-}
-
-
-
-var _isArray = void 0;
-if (Array.isArray) {
-  _isArray = Array.isArray;
-} else {
-  _isArray = function (x) {
-    return Object.prototype.toString.call(x) === '[object Array]';
-  };
-}
-
-var isArray = _isArray;
-
-var len = 0;
-var vertxNext = void 0;
-var customSchedulerFn = void 0;
-
-var asap = function asap(callback, arg) {
-  queue[len] = callback;
-  queue[len + 1] = arg;
-  len += 2;
-  if (len === 2) {
-    // If len is 2, that means that we need to schedule an async flush.
-    // If additional callbacks are queued before the queue is flushed, they
-    // will be processed by this flush that we are scheduling.
-    if (customSchedulerFn) {
-      customSchedulerFn(flush);
-    } else {
-      scheduleFlush();
-    }
-  }
-};
-
-function setScheduler(scheduleFn) {
-  customSchedulerFn = scheduleFn;
-}
-
-function setAsap(asapFn) {
-  asap = asapFn;
-}
-
-var browserWindow = typeof window !== 'undefined' ? window : undefined;
-var browserGlobal = browserWindow || {};
-var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
-var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
-
-// test for web worker but not in IE10
-var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';
-
-// node
-function useNextTick() {
-  // node version 0.10.x displays a deprecation warning when nextTick is used recursively
-  // see https://github.com/cujojs/when/issues/410 for details
-  return function () {
-    return process.nextTick(flush);
-  };
-}
-
-// vertx
-function useVertxTimer() {
-  if (typeof vertxNext !== 'undefined') {
-    return function () {
-      vertxNext(flush);
-    };
-  }
-
-  return useSetTimeout();
-}
-
-function useMutationObserver() {
-  var iterations = 0;
-  var observer = new BrowserMutationObserver(flush);
-  var node = document.createTextNode('');
-  observer.observe(node, { characterData: true });
-
-  return function () {
-    node.data = iterations = ++iterations % 2;
-  };
-}
-
-// web worker
-function useMessageChannel() {
-  var channel = new MessageChannel();
-  channel.port1.onmessage = flush;
-  return function () {
-    return channel.port2.postMessage(0);
-  };
-}
-
-function useSetTimeout() {
-  // Store setTimeout reference so es6-promise will be unaffected by
-  // other code modifying setTimeout (like sinon.useFakeTimers())
-  var globalSetTimeout = setTimeout;
-  return function () {
-    return globalSetTimeout(flush, 1);
-  };
-}
-
-var queue = new Array(1000);
-function flush() {
-  for (var i = 0; i < len; i += 2) {
-    var callback = queue[i];
-    var arg = queue[i + 1];
-
-    callback(arg);
-
-    queue[i] = undefined;
-    queue[i + 1] = undefined;
-  }
-
-  len = 0;
-}
-
-function attemptVertx() {
-  try {
-    var vertx = Function('return this')().require('vertx');
-    vertxNext = vertx.runOnLoop || vertx.runOnContext;
-    return useVertxTimer();
-  } catch (e) {
-    return useSetTimeout();
-  }
-}
-
-var scheduleFlush = void 0;
-// Decide what async method to use to triggering processing of queued callbacks:
-if (isNode) {
-  scheduleFlush = useNextTick();
-} else if (BrowserMutationObserver) {
-  scheduleFlush = useMutationObserver();
-} else if (isWorker) {
-  scheduleFlush = useMessageChannel();
-} else if (browserWindow === undefined && typeof require === 'function') {
-  scheduleFlush = attemptVertx();
-} else {
-  scheduleFlush = useSetTimeout();
-}
-
-function then(onFulfillment, onRejection) {
-  var parent = this;
-
-  var child = new this.constructor(noop);
-
-  if (child[PROMISE_ID] === undefined) {
-    makePromise(child);
-  }
-
-  var _state = parent._state;
-
-
-  if (_state) {
-    var callback = arguments[_state - 1];
-    asap(function () {
-      return invokeCallback(_state, child, callback, parent._result);
-    });
-  } else {
-    subscribe(parent, child, onFulfillment, onRejection);
-  }
-
-  return child;
-}
-
-/**
-  `Promise.resolve` returns a promise that will become resolved with the
-  passed `value`. It is shorthand for the following:
-
-  ```javascript
-  let promise = new Promise(function(resolve, reject){
-    resolve(1);
-  });
-
-  promise.then(function(value){
-    // value === 1
-  });
-  ```
-
-  Instead of writing the above, your code now simply becomes the following:
-
-  ```javascript
-  let promise = Promise.resolve(1);
-
-  promise.then(function(value){
-    // value === 1
-  });
-  ```
-
-  @method resolve
-  @static
-  @param {Any} value value that the returned promise will be resolved with
-  Useful for tooling.
-  @return {Promise} a promise that will become fulfilled with the given
-  `value`
-*/
-function resolve$1(object) {
-  /*jshint validthis:true */
-  var Constructor = this;
-
-  if (object && typeof object === 'object' && object.constructor === Constructor) {
-    return object;
-  }
-
-  var promise = new Constructor(noop);
-  resolve(promise, object);
-  return promise;
-}
-
-var PROMISE_ID = Math.random().toString(36).substring(2);
-
-function noop() {}
-
-var PENDING = void 0;
-var FULFILLED = 1;
-var REJECTED = 2;
-
-function selfFulfillment() {
-  return new TypeError("You cannot resolve a promise with itself");
-}
-
-function cannotReturnOwn() {
-  return new TypeError('A promises callback cannot return that same promise.');
-}
-
-function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {
-  try {
-    then$$1.call(value, fulfillmentHandler, rejectionHandler);
-  } catch (e) {
-    return e;
-  }
-}
-
-function handleForeignThenable(promise, thenable, then$$1) {
-  asap(function (promise) {
-    var sealed = false;
-    var error = tryThen(then$$1, thenable, function (value) {
-      if (sealed) {
-        return;
-      }
-      sealed = true;
-      if (thenable !== value) {
-        resolve(promise, value);
-      } else {
-        fulfill(promise, value);
-      }
-    }, function (reason) {
-      if (sealed) {
-        return;
-      }
-      sealed = true;
-
-      reject(promise, reason);
-    }, 'Settle: ' + (promise._label || ' unknown promise'));
-
-    if (!sealed && error) {
-      sealed = true;
-      reject(promise, error);
-    }
-  }, promise);
-}
-
-function handleOwnThenable(promise, thenable) {
-  if (thenable._state === FULFILLED) {
-    fulfill(promise, thenable._result);
-  } else if (thenable._state === REJECTED) {
-    reject(promise, thenable._result);
-  } else {
-    subscribe(thenable, undefined, function (value) {
-      return resolve(promise, value);
-    }, function (reason) {
-      return reject(promise, reason);
-    });
-  }
-}
-
-function handleMaybeThenable(promise, maybeThenable, then$$1) {
-  if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {
-    handleOwnThenable(promise, maybeThenable);
-  } else {
-    if (then$$1 === undefined) {
-      fulfill(promise, maybeThenable);
-    } else if (isFunction(then$$1)) {
-      handleForeignThenable(promise, maybeThenable, then$$1);
-    } else {
-      fulfill(promise, maybeThenable);
-    }
-  }
-}
-
-function resolve(promise, value) {
-  if (promise === value) {
-    reject(promise, selfFulfillment());
-  } else if (objectOrFunction(value)) {
-    var then$$1 = void 0;
-    try {
-      then$$1 = value.then;
-    } catch (error) {
-      reject(promise, error);
-      return;
-    }
-    handleMaybeThenable(promise, value, then$$1);
-  } else {
-    fulfill(promise, value);
-  }
-}
-
-function publishRejection(promise) {
-  if (promise._onerror) {
-    promise._onerror(promise._result);
-  }
-
-  publish(promise);
-}
-
-function fulfill(promise, value) {
-  if (promise._state !== PENDING) {
-    return;
-  }
-
-  promise._result = value;
-  promise._state = FULFILLED;
-
-  if (promise._subscribers.length !== 0) {
-    asap(publish, promise);
-  }
-}
-
-function reject(promise, reason) {
-  if (promise._state !== PENDING) {
-    return;
-  }
-  promise._state = REJECTED;
-  promise._result = reason;
-
-  asap(publishRejection, promise);
-}
-
-function subscribe(parent, child, onFulfillment, onRejection) {
-  var _subscribers = parent._subscribers;
-  var length = _subscribers.length;
-
-
-  parent._onerror = null;
-
-  _subscribers[length] = child;
-  _subscribers[length + FULFILLED] = onFulfillment;
-  _subscribers[length + REJECTED] = onRejection;
-
-  if (length === 0 && parent._state) {
-    asap(publish, parent);
-  }
-}
-
-function publish(promise) {
-  var subscribers = promise._subscribers;
-  var settled = promise._state;
-
-  if (subscribers.length === 0) {
-    return;
-  }
-
-  var child = void 0,
-      callback = void 0,
-      detail = promise._result;
-
-  for (var i = 0; i < subscribers.length; i += 3) {
-    child = subscribers[i];
-    callback = subscribers[i + settled];
-
-    if (child) {
-      invokeCallback(settled, child, callback, detail);
-    } else {
-      callback(detail);
-    }
-  }
-
-  promise._subscribers.length = 0;
-}
-
-function invokeCallback(settled, promise, callback, detail) {
-  var hasCallback = isFunction(callback),
-      value = void 0,
-      error = void 0,
-      succeeded = true;
-
-  if (hasCallback) {
-    try {
-      value = callback(detail);
-    } catch (e) {
-      succeeded = false;
-      error = e;
-    }
-
-    if (promise === value) {
-      reject(promise, cannotReturnOwn());
-      return;
-    }
-  } else {
-    value = detail;
-  }
-
-  if (promise._state !== PENDING) {
-    // noop
-  } else if (hasCallback && succeeded) {
-    resolve(promise, value);
-  } else if (succeeded === false) {
-    reject(promise, error);
-  } else if (settled === FULFILLED) {
-    fulfill(promise, value);
-  } else if (settled === REJECTED) {
-    reject(promise, value);
-  }
-}
-
-function initializePromise(promise, resolver) {
-  try {
-    resolver(function resolvePromise(value) {
-      resolve(promise, value);
-    }, function rejectPromise(reason) {
-      reject(promise, reason);
-    });
-  } catch (e) {
-    reject(promise, e);
-  }
-}
-
-var id = 0;
-function nextId() {
-  return id++;
-}
-
-function makePromise(promise) {
-  promise[PROMISE_ID] = id++;
-  promise._state = undefined;
-  promise._result = undefined;
-  promise._subscribers = [];
-}
-
-function validationError() {
-  return new Error('Array Methods must be provided an Array');
-}
-
-var Enumerator = function () {
-  function Enumerator(Constructor, input) {
-    this._instanceConstructor = Constructor;
-    this.promise = new Constructor(noop);
-
-    if (!this.promise[PROMISE_ID]) {
-      makePromise(this.promise);
-    }
-
-    if (isArray(input)) {
-      this.length = input.length;
-      this._remaining = input.length;
-
-      this._result = new Array(this.length);
-
-      if (this.length === 0) {
-        fulfill(this.promise, this._result);
-      } else {
-        this.length = this.length || 0;
-        this._enumerate(input);
-        if (this._remaining === 0) {
-          fulfill(this.promise, this._result);
-        }
-      }
-    } else {
-      reject(this.promise, validationError());
-    }
-  }
-
-  Enumerator.prototype._enumerate = function _enumerate(input) {
-    for (var i = 0; this._state === PENDING && i < input.length; i++) {
-      this._eachEntry(input[i], i);
-    }
-  };
-
-  Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {
-    var c = this._instanceConstructor;
-    var resolve$$1 = c.resolve;
-
-
-    if (resolve$$1 === resolve$1) {
-      var _then = void 0;
-      var error = void 0;
-      var didError = false;
-      try {
-        _then = entry.then;
-      } catch (e) {
-        didError = true;
-        error = e;
-      }
-
-      if (_then === then && entry._state !== PENDING) {
-        this._settledAt(entry._state, i, entry._result);
-      } else if (typeof _then !== 'function') {
-        this._remaining--;
-        this._result[i] = entry;
-      } else if (c === Promise$1) {
-        var promise = new c(noop);
-        if (didError) {
-          reject(promise, error);
-        } else {
-          handleMaybeThenable(promise, entry, _then);
-        }
-        this._willSettleAt(promise, i);
-      } else {
-        this._willSettleAt(new c(function (resolve$$1) {
-          return resolve$$1(entry);
-        }), i);
-      }
-    } else {
-      this._willSettleAt(resolve$$1(entry), i);
-    }
-  };
-
-  Enumerator.prototype._settledAt = function _settledAt(state, i, value) {
-    var promise = this.promise;
-
-
-    if (promise._state === PENDING) {
-      this._remaining--;
-
-      if (state === REJECTED) {
-        reject(promise, value);
-      } else {
-        this._result[i] = value;
-      }
-    }
-
-    if (this._remaining === 0) {
-      fulfill(promise, this._result);
-    }
-  };
-
-  Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {
-    var enumerator = this;
-
-    subscribe(promise, undefined, function (value) {
-      return enumerator._settledAt(FULFILLED, i, value);
-    }, function (reason) {
-      return enumerator._settledAt(REJECTED, i, reason);
-    });
-  };
-
-  return Enumerator;
-}();
-
-/**
-  `Promise.all` accepts an array of promises, and returns a new promise which
-  is fulfilled with an array of fulfillment values for the passed promises, or
-  rejected with the reason of the first passed promise to be rejected. It casts all
-  elements of the passed iterable to promises as it runs this algorithm.
-
-  Example:
-
-  ```javascript
-  let promise1 = resolve(1);
-  let promise2 = resolve(2);
-  let promise3 = resolve(3);
-  let promises = [ promise1, promise2, promise3 ];
-
-  Promise.all(promises).then(function(array){
-    // The array here would be [ 1, 2, 3 ];
-  });
-  ```
-
-  If any of the `promises` given to `all` are rejected, the first promise
-  that is rejected will be given as an argument to the returned promises's
-  rejection handler. For example:
-
-  Example:
-
-  ```javascript
-  let promise1 = resolve(1);
-  let promise2 = reject(new Error("2"));
-  let promise3 = reject(new Error("3"));
-  let promises = [ promise1, promise2, promise3 ];
-
-  Promise.all(promises).then(function(array){
-    // Code here never runs because there are rejected promises!
-  }, function(error) {
-    // error.message === "2"
-  });
-  ```
-
-  @method all
-  @static
-  @param {Array} entries array of promises
-  @param {String} label optional string for labeling the promise.
-  Useful for tooling.
-  @return {Promise} promise that is fulfilled when all `promises` have been
-  fulfilled, or rejected if any of them become rejected.
-  @static
-*/
-function all(entries) {
-  return new Enumerator(this, entries).promise;
-}
-
-/**
-  `Promise.race` returns a new promise which is settled in the same way as the
-  first passed promise to settle.
-
-  Example:
-
-  ```javascript
-  let promise1 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      resolve('promise 1');
-    }, 200);
-  });
-
-  let promise2 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      resolve('promise 2');
-    }, 100);
-  });
-
-  Promise.race([promise1, promise2]).then(function(result){
-    // result === 'promise 2' because it was resolved before promise1
-    // was resolved.
-  });
-  ```
-
-  `Promise.race` is deterministic in that only the state of the first
-  settled promise matters. For example, even if other promises given to the
-  `promises` array argument are resolved, but the first settled promise has
-  become rejected before the other promises became fulfilled, the returned
-  promise will become rejected:
-
-  ```javascript
-  let promise1 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      resolve('promise 1');
-    }, 200);
-  });
-
-  let promise2 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      reject(new Error('promise 2'));
-    }, 100);
-  });
-
-  Promise.race([promise1, promise2]).then(function(result){
-    // Code here never runs
-  }, function(reason){
-    // reason.message === 'promise 2' because promise 2 became rejected before
-    // promise 1 became fulfilled
-  });
-  ```
-
-  An example real-world use case is implementing timeouts:
-
-  ```javascript
-  Promise.race([ajax('foo.json'), timeout(5000)])
-  ```
-
-  @method race
-  @static
-  @param {Array} promises array of promises to observe
-  Useful for tooling.
-  @return {Promise} a promise which settles in the same way as the first passed
-  promise to settle.
-*/
-function race(entries) {
-  /*jshint validthis:true */
-  var Constructor = this;
-
-  if (!isArray(entries)) {
-    return new Constructor(function (_, reject) {
-      return reject(new TypeError('You must pass an array to race.'));
-    });
-  } else {
-    return new Constructor(function (resolve, reject) {
-      var length = entries.length;
-      for (var i = 0; i < length; i++) {
-        Constructor.resolve(entries[i]).then(resolve, reject);
-      }
-    });
-  }
-}
-
-/**
-  `Promise.reject` returns a promise rejected with the passed `reason`.
-  It is shorthand for the following:
-
-  ```javascript
-  let promise = new Promise(function(resolve, reject){
-    reject(new Error('WHOOPS'));
-  });
-
-  promise.then(function(value){
-    // Code here doesn't run because the promise is rejected!
-  }, function(reason){
-    // reason.message === 'WHOOPS'
-  });
-  ```
-
-  Instead of writing the above, your code now simply becomes the following:
-
-  ```javascript
-  let promise = Promise.reject(new Error('WHOOPS'));
-
-  promise.then(function(value){
-    // Code here doesn't run because the promise is rejected!
-  }, function(reason){
-    // reason.message === 'WHOOPS'
-  });
-  ```
-
-  @method reject
-  @static
-  @param {Any} reason value that the returned promise will be rejected with.
-  Useful for tooling.
-  @return {Promise} a promise rejected with the given `reason`.
-*/
-function reject$1(reason) {
-  /*jshint validthis:true */
-  var Constructor = this;
-  var promise = new Constructor(noop);
-  reject(promise, reason);
-  return promise;
-}
-
-function needsResolver() {
-  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
-}
-
-function needsNew() {
-  throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
-}
-
-/**
-  Promise objects represent the eventual result of an asynchronous operation. The
-  primary way of interacting with a promise is through its `then` method, which
-  registers callbacks to receive either a promise's eventual value or the reason
-  why the promise cannot be fulfilled.
-
-  Terminology
-  -----------
-
-  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
-  - `thenable` is an object or function that defines a `then` method.
-  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
-  - `exception` is a value that is thrown using the throw statement.
-  - `reason` is a value that indicates why a promise was rejected.
-  - `settled` the final resting state of a promise, fulfilled or rejected.
-
-  A promise can be in one of three states: pending, fulfilled, or rejected.
-
-  Promises that are fulfilled have a fulfillment value and are in the fulfilled
-  state.  Promises that are rejected have a rejection reason and are in the
-  rejected state.  A fulfillment value is never a thenable.
-
-  Promises can also be said to *resolve* a value.  If this value is also a
-  promise, then the original promise's settled state will match the value's
-  settled state.  So a promise that *resolves* a promise that rejects will
-  itself reject, and a promise that *resolves* a promise that fulfills will
-  itself fulfill.
-
-
-  Basic Usage:
-  ------------
-
-  ```js
-  let promise = new Promise(function(resolve, reject) {
-    // on success
-    resolve(value);
-
-    // on failure
-    reject(reason);
-  });
-
-  promise.then(function(value) {
-    // on fulfillment
-  }, function(reason) {
-    // on rejection
-  });
-  ```
-
-  Advanced Usage:
-  ---------------
-
-  Promises shine when abstracting away asynchronous interactions such as
-  `XMLHttpRequest`s.
-
-  ```js
-  function getJSON(url) {
-    return new Promise(function(resolve, reject){
-      let xhr = new XMLHttpRequest();
-
-      xhr.open('GET', url);
-      xhr.onreadystatechange = handler;
-      xhr.responseType = 'json';
-      xhr.setRequestHeader('Accept', 'application/json');
-      xhr.send();
-
-      function handler() {
-        if (this.readyState === this.DONE) {
-          if (this.status === 200) {
-            resolve(this.response);
-          } else {
-            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
-          }
-        }
-      };
-    });
-  }
-
-  getJSON('/posts.json').then(function(json) {
-    // on fulfillment
-  }, function(reason) {
-    // on rejection
-  });
-  ```
-
-  Unlike callbacks, promises are great composable primitives.
-
-  ```js
-  Promise.all([
-    getJSON('/posts'),
-    getJSON('/comments')
-  ]).then(function(values){
-    values[0] // => postsJSON
-    values[1] // => commentsJSON
-
-    return values;
-  });
-  ```
-
-  @class Promise
-  @param {Function} resolver
-  Useful for tooling.
-  @constructor
-*/
-
-var Promise$1 = function () {
-  function Promise(resolver) {
-    this[PROMISE_ID] = nextId();
-    this._result = this._state = undefined;
-    this._subscribers = [];
-
-    if (noop !== resolver) {
-      typeof resolver !== 'function' && needsResolver();
-      this instanceof Promise ? initializePromise(this, resolver) : needsNew();
-    }
-  }
-
-  /**
-  The primary way of interacting with a promise is through its `then` method,
-  which registers callbacks to receive either a promise's eventual value or the
-  reason why the promise cannot be fulfilled.
-   ```js
-  findUser().then(function(user){
-    // user is available
-  }, function(reason){
-    // user is unavailable, and you are given the reason why
-  });
-  ```
-   Chaining
-  --------
-   The return value of `then` is itself a promise.  This second, 'downstream'
-  promise is resolved with the return value of the first promise's fulfillment
-  or rejection handler, or rejected if the handler throws an exception.
-   ```js
-  findUser().then(function (user) {
-    return user.name;
-  }, function (reason) {
-    return 'default name';
-  }).then(function (userName) {
-    // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
-    // will be `'default name'`
-  });
-   findUser().then(function (user) {
-    throw new Error('Found user, but still unhappy');
-  }, function (reason) {
-    throw new Error('`findUser` rejected and we're unhappy');
-  }).then(function (value) {
-    // never reached
-  }, function (reason) {
-    // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
-    // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
-  });
-  ```
-  If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
-   ```js
-  findUser().then(function (user) {
-    throw new PedagogicalException('Upstream error');
-  }).then(function (value) {
-    // never reached
-  }).then(function (value) {
-    // never reached
-  }, function (reason) {
-    // The `PedgagocialException` is propagated all the way down to here
-  });
-  ```
-   Assimilation
-  ------------
-   Sometimes the value you want to propagate to a downstream promise can only be
-  retrieved asynchronously. This can be achieved by returning a promise in the
-  fulfillment or rejection handler. The downstream promise will then be pending
-  until the returned promise is settled. This is called *assimilation*.
-   ```js
-  findUser().then(function (user) {
-    return findCommentsByAuthor(user);
-  }).then(function (comments) {
-    // The user's comments are now available
-  });
-  ```
-   If the assimliated promise rejects, then the downstream promise will also reject.
-   ```js
-  findUser().then(function (user) {
-    return findCommentsByAuthor(user);
-  }).then(function (comments) {
-    // If `findCommentsByAuthor` fulfills, we'll have the value here
-  }, function (reason) {
-    // If `findCommentsByAuthor` rejects, we'll have the reason here
-  });
-  ```
-   Simple Example
-  --------------
-   Synchronous Example
-   ```javascript
-  let result;
-   try {
-    result = findResult();
-    // success
-  } catch(reason) {
-    // failure
-  }
-  ```
-   Errback Example
-   ```js
-  findResult(function(result, err){
-    if (err) {
-      // failure
-    } else {
-      // success
-    }
-  });
-  ```
-   Promise Example;
-   ```javascript
-  findResult().then(function(result){
-    // success
-  }, function(reason){
-    // failure
-  });
-  ```
-   Advanced Example
-  --------------
-   Synchronous Example
-   ```javascript
-  let author, books;
-   try {
-    author = findAuthor();
-    books  = findBooksByAuthor(author);
-    // success
-  } catch(reason) {
-    // failure
-  }
-  ```
-   Errback Example
-   ```js
-   function foundBooks(books) {
-   }
-   function failure(reason) {
-   }
-   findAuthor(function(author, err){
-    if (err) {
-      failure(err);
-      // failure
-    } else {
-      try {
-        findBoooksByAuthor(author, function(books, err) {
-          if (err) {
-            failure(err);
-          } else {
-            try {
-              foundBooks(books);
-            } catch(reason) {
-              failure(reason);
-            }
-          }
-        });
-      } catch(error) {
-        failure(err);
-      }
-      // success
-    }
-  });
-  ```
-   Promise Example;
-   ```javascript
-  findAuthor().
-    then(findBooksByAuthor).
-    then(function(books){
-      // found books
-  }).catch(function(reason){
-    // something went wrong
-  });
-  ```
-   @method then
-  @param {Function} onFulfilled
-  @param {Function} onRejected
-  Useful for tooling.
-  @return {Promise}
-  */
-
-  /**
-  `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
-  as the catch block of a try/catch statement.
-  ```js
-  function findAuthor(){
-  throw new Error('couldn't find that author');
-  }
-  // synchronous
-  try {
-  findAuthor();
-  } catch(reason) {
-  // something went wrong
-  }
-  // async with promises
-  findAuthor().catch(function(reason){
-  // something went wrong
-  });
-  ```
-  @method catch
-  @param {Function} onRejection
-  Useful for tooling.
-  @return {Promise}
-  */
-
-
-  Promise.prototype.catch = function _catch(onRejection) {
-    return this.then(null, onRejection);
-  };
-
-  /**
-    `finally` will be invoked regardless of the promise's fate just as native
-    try/catch/finally behaves
-  
-    Synchronous example:
-  
-    ```js
-    findAuthor() {
-      if (Math.random() > 0.5) {
-        throw new Error();
-      }
-      return new Author();
-    }
-  
-    try {
-      return findAuthor(); // succeed or fail
-    } catch(error) {
-      return findOtherAuther();
-    } finally {
-      // always runs
-      // doesn't affect the return value
-    }
-    ```
-  
-    Asynchronous example:
-  
-    ```js
-    findAuthor().catch(function(reason){
-      return findOtherAuther();
-    }).finally(function(){
-      // author was either found, or not
-    });
-    ```
-  
-    @method finally
-    @param {Function} callback
-    @return {Promise}
-  */
-
-
-  Promise.prototype.finally = function _finally(callback) {
-    var promise = this;
-    var constructor = promise.constructor;
-
-    if (isFunction(callback)) {
-      return promise.then(function (value) {
-        return constructor.resolve(callback()).then(function () {
-          return value;
-        });
-      }, function (reason) {
-        return constructor.resolve(callback()).then(function () {
-          throw reason;
-        });
-      });
-    }
-
-    return promise.then(callback, callback);
-  };
-
-  return Promise;
-}();
-
-Promise$1.prototype.then = then;
-Promise$1.all = all;
-Promise$1.race = race;
-Promise$1.resolve = resolve$1;
-Promise$1.reject = reject$1;
-Promise$1._setScheduler = setScheduler;
-Promise$1._setAsap = setAsap;
-Promise$1._asap = asap;
-
-/*global self*/
-function polyfill() {
-  var local = void 0;
-
-  if (typeof global !== 'undefined') {
-    local = global;
-  } else if (typeof self !== 'undefined') {
-    local = self;
-  } else {
-    try {
-      local = Function('return this')();
-    } catch (e) {
-      throw new Error('polyfill failed because global object is unavailable in this environment');
-    }
-  }
-
-  var P = local.Promise;
-
-  if (P) {
-    var promiseToString = null;
-    try {
-      promiseToString = Object.prototype.toString.call(P.resolve());
-    } catch (e) {
-      // silently ignored
-    }
-
-    if (promiseToString === '[object Promise]' && !P.cast) {
-      return;
-    }
-  }
-
-  local.Promise = Promise$1;
-}
-
-// Strange compat..
-Promise$1.polyfill = polyfill;
-Promise$1.Promise = Promise$1;
-
-return Promise$1;
-
-})));
-
-
-
-//# sourceMappingURL=es6-promise.map
diff --git a/node_modules/es6-promise/dist/es6-promise.map b/node_modules/es6-promise/dist/es6-promise.map
deleted file mode 100644
index 27db414..0000000
--- a/node_modules/es6-promise/dist/es6-promise.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["config/versionTemplate.txt","lib/es6-promise/utils.js","lib/es6-promise/asap.js","lib/es6-promise/then.js","lib/es6-promise/promise/resolve.js","lib/es6-promise/-internal.js","lib/es6-promise/enumerator.js","lib/es6-promise/promise/all.js","lib/es6-promise/promise/race.js","lib/es6-promise/promise/reject.js","lib/es6-promise/promise.js","lib/es6-promise/polyfill.js","lib/es6-promise.js"],"sourcesContent":["/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license   Licensed under MIT license\n *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version   v4.2.8+1e68dce6\n */\n","export function objectOrFunction(x) {\n  var type = typeof x;\n  return x !== null && (type === 'object' || type === 'function');\n}\n\nexport function isFunction(x) {\n  return typeof x === 'function';\n}\n\nexport function isMaybeThenable(x) {\n  return x !== null && typeof x === 'object';\n}\n\nvar _isArray = void 0;\nif (Array.isArray) {\n  _isArray = Array.isArray;\n} else {\n  _isArray = function (x) {\n    return Object.prototype.toString.call(x) === '[object Array]';\n  };\n}\n\nexport var isArray = _isArray;","var len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nexport var asap = function asap(callback, arg) {\n  queue[len] = callback;\n  queue[len + 1] = arg;\n  len += 2;\n  if (len === 2) {\n    // If len is 2, that means that we need to schedule an async flush.\n    // If additional callbacks are queued before the queue is flushed, they\n    // will be processed by this flush that we are scheduling.\n    if (customSchedulerFn) {\n      customSchedulerFn(flush);\n    } else {\n      scheduleFlush();\n    }\n  }\n};\n\nexport function setScheduler(scheduleFn) {\n  customSchedulerFn = scheduleFn;\n}\n\nexport function setAsap(asapFn) {\n  asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n  // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n  // see https://github.com/cujojs/when/issues/410 for details\n  return function () {\n    return process.nextTick(flush);\n  };\n}\n\n// vertx\nfunction useVertxTimer() {\n  if (typeof vertxNext !== 'undefined') {\n    return function () {\n      vertxNext(flush);\n    };\n  }\n\n  return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n  var iterations = 0;\n  var observer = new BrowserMutationObserver(flush);\n  var node = document.createTextNode('');\n  observer.observe(node, { characterData: true });\n\n  return function () {\n    node.data = iterations = ++iterations % 2;\n  };\n}\n\n// web worker\nfunction useMessageChannel() {\n  var channel = new MessageChannel();\n  channel.port1.onmessage = flush;\n  return function () {\n    return channel.port2.postMessage(0);\n  };\n}\n\nfunction useSetTimeout() {\n  // Store setTimeout reference so es6-promise will be unaffected by\n  // other code modifying setTimeout (like sinon.useFakeTimers())\n  var globalSetTimeout = setTimeout;\n  return function () {\n    return globalSetTimeout(flush, 1);\n  };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n  for (var i = 0; i < len; i += 2) {\n    var callback = queue[i];\n    var arg = queue[i + 1];\n\n    callback(arg);\n\n    queue[i] = undefined;\n    queue[i + 1] = undefined;\n  }\n\n  len = 0;\n}\n\nfunction attemptVertx() {\n  try {\n    var vertx = Function('return this')().require('vertx');\n    vertxNext = vertx.runOnLoop || vertx.runOnContext;\n    return useVertxTimer();\n  } catch (e) {\n    return useSetTimeout();\n  }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n  scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n  scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n  scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n  scheduleFlush = attemptVertx();\n} else {\n  scheduleFlush = useSetTimeout();\n}","import { invokeCallback, subscribe, FULFILLED, REJECTED, noop, makePromise, PROMISE_ID } from './-internal';\n\nimport { asap } from './asap';\n\nexport default function then(onFulfillment, onRejection) {\n  var parent = this;\n\n  var child = new this.constructor(noop);\n\n  if (child[PROMISE_ID] === undefined) {\n    makePromise(child);\n  }\n\n  var _state = parent._state;\n\n\n  if (_state) {\n    var callback = arguments[_state - 1];\n    asap(function () {\n      return invokeCallback(_state, child, callback, parent._result);\n    });\n  } else {\n    subscribe(parent, child, onFulfillment, onRejection);\n  }\n\n  return child;\n}","import { noop, resolve as _resolve } from '../-internal';\n\n/**\n  `Promise.resolve` returns a promise that will become resolved with the\n  passed `value`. It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    resolve(1);\n  });\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.resolve(1);\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  @method resolve\n  @static\n  @param {Any} value value that the returned promise will be resolved with\n  Useful for tooling.\n  @return {Promise} a promise that will become fulfilled with the given\n  `value`\n*/\nexport default function resolve(object) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (object && typeof object === 'object' && object.constructor === Constructor) {\n    return object;\n  }\n\n  var promise = new Constructor(noop);\n  _resolve(promise, object);\n  return promise;\n}","import { objectOrFunction, isFunction } from './utils';\n\nimport { asap } from './asap';\n\nimport originalThen from './then';\nimport originalResolve from './promise/resolve';\n\nexport var PROMISE_ID = Math.random().toString(36).substring(2);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nfunction selfFulfillment() {\n  return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n  return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n  try {\n    then.call(value, fulfillmentHandler, rejectionHandler);\n  } catch (e) {\n    return e;\n  }\n}\n\nfunction handleForeignThenable(promise, thenable, then) {\n  asap(function (promise) {\n    var sealed = false;\n    var error = tryThen(then, thenable, function (value) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n      if (thenable !== value) {\n        resolve(promise, value);\n      } else {\n        fulfill(promise, value);\n      }\n    }, function (reason) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n\n      reject(promise, reason);\n    }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n    if (!sealed && error) {\n      sealed = true;\n      reject(promise, error);\n    }\n  }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n  if (thenable._state === FULFILLED) {\n    fulfill(promise, thenable._result);\n  } else if (thenable._state === REJECTED) {\n    reject(promise, thenable._result);\n  } else {\n    subscribe(thenable, undefined, function (value) {\n      return resolve(promise, value);\n    }, function (reason) {\n      return reject(promise, reason);\n    });\n  }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then) {\n  if (maybeThenable.constructor === promise.constructor && then === originalThen && maybeThenable.constructor.resolve === originalResolve) {\n    handleOwnThenable(promise, maybeThenable);\n  } else {\n    if (then === undefined) {\n      fulfill(promise, maybeThenable);\n    } else if (isFunction(then)) {\n      handleForeignThenable(promise, maybeThenable, then);\n    } else {\n      fulfill(promise, maybeThenable);\n    }\n  }\n}\n\nfunction resolve(promise, value) {\n  if (promise === value) {\n    reject(promise, selfFulfillment());\n  } else if (objectOrFunction(value)) {\n    var then = void 0;\n    try {\n      then = value.then;\n    } catch (error) {\n      reject(promise, error);\n      return;\n    }\n    handleMaybeThenable(promise, value, then);\n  } else {\n    fulfill(promise, value);\n  }\n}\n\nfunction publishRejection(promise) {\n  if (promise._onerror) {\n    promise._onerror(promise._result);\n  }\n\n  publish(promise);\n}\n\nfunction fulfill(promise, value) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n\n  promise._result = value;\n  promise._state = FULFILLED;\n\n  if (promise._subscribers.length !== 0) {\n    asap(publish, promise);\n  }\n}\n\nfunction reject(promise, reason) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n  promise._state = REJECTED;\n  promise._result = reason;\n\n  asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n  var _subscribers = parent._subscribers;\n  var length = _subscribers.length;\n\n\n  parent._onerror = null;\n\n  _subscribers[length] = child;\n  _subscribers[length + FULFILLED] = onFulfillment;\n  _subscribers[length + REJECTED] = onRejection;\n\n  if (length === 0 && parent._state) {\n    asap(publish, parent);\n  }\n}\n\nfunction publish(promise) {\n  var subscribers = promise._subscribers;\n  var settled = promise._state;\n\n  if (subscribers.length === 0) {\n    return;\n  }\n\n  var child = void 0,\n      callback = void 0,\n      detail = promise._result;\n\n  for (var i = 0; i < subscribers.length; i += 3) {\n    child = subscribers[i];\n    callback = subscribers[i + settled];\n\n    if (child) {\n      invokeCallback(settled, child, callback, detail);\n    } else {\n      callback(detail);\n    }\n  }\n\n  promise._subscribers.length = 0;\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n  var hasCallback = isFunction(callback),\n      value = void 0,\n      error = void 0,\n      succeeded = true;\n\n  if (hasCallback) {\n    try {\n      value = callback(detail);\n    } catch (e) {\n      succeeded = false;\n      error = e;\n    }\n\n    if (promise === value) {\n      reject(promise, cannotReturnOwn());\n      return;\n    }\n  } else {\n    value = detail;\n  }\n\n  if (promise._state !== PENDING) {\n    // noop\n  } else if (hasCallback && succeeded) {\n    resolve(promise, value);\n  } else if (succeeded === false) {\n    reject(promise, error);\n  } else if (settled === FULFILLED) {\n    fulfill(promise, value);\n  } else if (settled === REJECTED) {\n    reject(promise, value);\n  }\n}\n\nfunction initializePromise(promise, resolver) {\n  try {\n    resolver(function resolvePromise(value) {\n      resolve(promise, value);\n    }, function rejectPromise(reason) {\n      reject(promise, reason);\n    });\n  } catch (e) {\n    reject(promise, e);\n  }\n}\n\nvar id = 0;\nfunction nextId() {\n  return id++;\n}\n\nfunction makePromise(promise) {\n  promise[PROMISE_ID] = id++;\n  promise._state = undefined;\n  promise._result = undefined;\n  promise._subscribers = [];\n}\n\nexport { nextId, makePromise, noop, resolve, reject, fulfill, subscribe, publish, publishRejection, initializePromise, invokeCallback, FULFILLED, REJECTED, PENDING, handleMaybeThenable };","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { isArray, isMaybeThenable } from './utils';\nimport { noop, reject, fulfill, subscribe, FULFILLED, REJECTED, PENDING, handleMaybeThenable } from './-internal';\n\nimport then from './then';\nimport Promise from './promise';\nimport originalResolve from './promise/resolve';\nimport originalThen from './then';\nimport { makePromise, PROMISE_ID } from './-internal';\n\nfunction validationError() {\n  return new Error('Array Methods must be provided an Array');\n};\n\nvar Enumerator = function () {\n  function Enumerator(Constructor, input) {\n    this._instanceConstructor = Constructor;\n    this.promise = new Constructor(noop);\n\n    if (!this.promise[PROMISE_ID]) {\n      makePromise(this.promise);\n    }\n\n    if (isArray(input)) {\n      this.length = input.length;\n      this._remaining = input.length;\n\n      this._result = new Array(this.length);\n\n      if (this.length === 0) {\n        fulfill(this.promise, this._result);\n      } else {\n        this.length = this.length || 0;\n        this._enumerate(input);\n        if (this._remaining === 0) {\n          fulfill(this.promise, this._result);\n        }\n      }\n    } else {\n      reject(this.promise, validationError());\n    }\n  }\n\n  Enumerator.prototype._enumerate = function _enumerate(input) {\n    for (var i = 0; this._state === PENDING && i < input.length; i++) {\n      this._eachEntry(input[i], i);\n    }\n  };\n\n  Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n    var c = this._instanceConstructor;\n    var resolve = c.resolve;\n\n\n    if (resolve === originalResolve) {\n      var _then = void 0;\n      var error = void 0;\n      var didError = false;\n      try {\n        _then = entry.then;\n      } catch (e) {\n        didError = true;\n        error = e;\n      }\n\n      if (_then === originalThen && entry._state !== PENDING) {\n        this._settledAt(entry._state, i, entry._result);\n      } else if (typeof _then !== 'function') {\n        this._remaining--;\n        this._result[i] = entry;\n      } else if (c === Promise) {\n        var promise = new c(noop);\n        if (didError) {\n          reject(promise, error);\n        } else {\n          handleMaybeThenable(promise, entry, _then);\n        }\n        this._willSettleAt(promise, i);\n      } else {\n        this._willSettleAt(new c(function (resolve) {\n          return resolve(entry);\n        }), i);\n      }\n    } else {\n      this._willSettleAt(resolve(entry), i);\n    }\n  };\n\n  Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n    var promise = this.promise;\n\n\n    if (promise._state === PENDING) {\n      this._remaining--;\n\n      if (state === REJECTED) {\n        reject(promise, value);\n      } else {\n        this._result[i] = value;\n      }\n    }\n\n    if (this._remaining === 0) {\n      fulfill(promise, this._result);\n    }\n  };\n\n  Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n    var enumerator = this;\n\n    subscribe(promise, undefined, function (value) {\n      return enumerator._settledAt(FULFILLED, i, value);\n    }, function (reason) {\n      return enumerator._settledAt(REJECTED, i, reason);\n    });\n  };\n\n  return Enumerator;\n}();\n\nexport default Enumerator;\n;","import Enumerator from '../enumerator';\n\n/**\n  `Promise.all` accepts an array of promises, and returns a new promise which\n  is fulfilled with an array of fulfillment values for the passed promises, or\n  rejected with the reason of the first passed promise to be rejected. It casts all\n  elements of the passed iterable to promises as it runs this algorithm.\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = resolve(2);\n  let promise3 = resolve(3);\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // The array here would be [ 1, 2, 3 ];\n  });\n  ```\n\n  If any of the `promises` given to `all` are rejected, the first promise\n  that is rejected will be given as an argument to the returned promises's\n  rejection handler. For example:\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = reject(new Error(\"2\"));\n  let promise3 = reject(new Error(\"3\"));\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // Code here never runs because there are rejected promises!\n  }, function(error) {\n    // error.message === \"2\"\n  });\n  ```\n\n  @method all\n  @static\n  @param {Array} entries array of promises\n  @param {String} label optional string for labeling the promise.\n  Useful for tooling.\n  @return {Promise} promise that is fulfilled when all `promises` have been\n  fulfilled, or rejected if any of them become rejected.\n  @static\n*/\nexport default function all(entries) {\n  return new Enumerator(this, entries).promise;\n}","import { isArray } from \"../utils\";\n\n/**\n  `Promise.race` returns a new promise which is settled in the same way as the\n  first passed promise to settle.\n\n  Example:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 2');\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // result === 'promise 2' because it was resolved before promise1\n    // was resolved.\n  });\n  ```\n\n  `Promise.race` is deterministic in that only the state of the first\n  settled promise matters. For example, even if other promises given to the\n  `promises` array argument are resolved, but the first settled promise has\n  become rejected before the other promises became fulfilled, the returned\n  promise will become rejected:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      reject(new Error('promise 2'));\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // Code here never runs\n  }, function(reason){\n    // reason.message === 'promise 2' because promise 2 became rejected before\n    // promise 1 became fulfilled\n  });\n  ```\n\n  An example real-world use case is implementing timeouts:\n\n  ```javascript\n  Promise.race([ajax('foo.json'), timeout(5000)])\n  ```\n\n  @method race\n  @static\n  @param {Array} promises array of promises to observe\n  Useful for tooling.\n  @return {Promise} a promise which settles in the same way as the first passed\n  promise to settle.\n*/\nexport default function race(entries) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (!isArray(entries)) {\n    return new Constructor(function (_, reject) {\n      return reject(new TypeError('You must pass an array to race.'));\n    });\n  } else {\n    return new Constructor(function (resolve, reject) {\n      var length = entries.length;\n      for (var i = 0; i < length; i++) {\n        Constructor.resolve(entries[i]).then(resolve, reject);\n      }\n    });\n  }\n}","import { noop, reject as _reject } from '../-internal';\n\n/**\n  `Promise.reject` returns a promise rejected with the passed `reason`.\n  It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    reject(new Error('WHOOPS'));\n  });\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.reject(new Error('WHOOPS'));\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  @method reject\n  @static\n  @param {Any} reason value that the returned promise will be rejected with.\n  Useful for tooling.\n  @return {Promise} a promise rejected with the given `reason`.\n*/\nexport default function reject(reason) {\n  /*jshint validthis:true */\n  var Constructor = this;\n  var promise = new Constructor(noop);\n  _reject(promise, reason);\n  return promise;\n}","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { isFunction } from './utils';\nimport { noop, nextId, PROMISE_ID, initializePromise } from './-internal';\nimport { asap, setAsap, setScheduler } from './asap';\n\nimport all from './promise/all';\nimport race from './promise/race';\nimport Resolve from './promise/resolve';\nimport Reject from './promise/reject';\nimport then from './then';\n\nfunction needsResolver() {\n  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n  throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n  Promise objects represent the eventual result of an asynchronous operation. The\n  primary way of interacting with a promise is through its `then` method, which\n  registers callbacks to receive either a promise's eventual value or the reason\n  why the promise cannot be fulfilled.\n\n  Terminology\n  -----------\n\n  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n  - `thenable` is an object or function that defines a `then` method.\n  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n  - `exception` is a value that is thrown using the throw statement.\n  - `reason` is a value that indicates why a promise was rejected.\n  - `settled` the final resting state of a promise, fulfilled or rejected.\n\n  A promise can be in one of three states: pending, fulfilled, or rejected.\n\n  Promises that are fulfilled have a fulfillment value and are in the fulfilled\n  state.  Promises that are rejected have a rejection reason and are in the\n  rejected state.  A fulfillment value is never a thenable.\n\n  Promises can also be said to *resolve* a value.  If this value is also a\n  promise, then the original promise's settled state will match the value's\n  settled state.  So a promise that *resolves* a promise that rejects will\n  itself reject, and a promise that *resolves* a promise that fulfills will\n  itself fulfill.\n\n\n  Basic Usage:\n  ------------\n\n  ```js\n  let promise = new Promise(function(resolve, reject) {\n    // on success\n    resolve(value);\n\n    // on failure\n    reject(reason);\n  });\n\n  promise.then(function(value) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Advanced Usage:\n  ---------------\n\n  Promises shine when abstracting away asynchronous interactions such as\n  `XMLHttpRequest`s.\n\n  ```js\n  function getJSON(url) {\n    return new Promise(function(resolve, reject){\n      let xhr = new XMLHttpRequest();\n\n      xhr.open('GET', url);\n      xhr.onreadystatechange = handler;\n      xhr.responseType = 'json';\n      xhr.setRequestHeader('Accept', 'application/json');\n      xhr.send();\n\n      function handler() {\n        if (this.readyState === this.DONE) {\n          if (this.status === 200) {\n            resolve(this.response);\n          } else {\n            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n          }\n        }\n      };\n    });\n  }\n\n  getJSON('/posts.json').then(function(json) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Unlike callbacks, promises are great composable primitives.\n\n  ```js\n  Promise.all([\n    getJSON('/posts'),\n    getJSON('/comments')\n  ]).then(function(values){\n    values[0] // => postsJSON\n    values[1] // => commentsJSON\n\n    return values;\n  });\n  ```\n\n  @class Promise\n  @param {Function} resolver\n  Useful for tooling.\n  @constructor\n*/\n\nvar Promise = function () {\n  function Promise(resolver) {\n    this[PROMISE_ID] = nextId();\n    this._result = this._state = undefined;\n    this._subscribers = [];\n\n    if (noop !== resolver) {\n      typeof resolver !== 'function' && needsResolver();\n      this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n    }\n  }\n\n  /**\n  The primary way of interacting with a promise is through its `then` method,\n  which registers callbacks to receive either a promise's eventual value or the\n  reason why the promise cannot be fulfilled.\n   ```js\n  findUser().then(function(user){\n    // user is available\n  }, function(reason){\n    // user is unavailable, and you are given the reason why\n  });\n  ```\n   Chaining\n  --------\n   The return value of `then` is itself a promise.  This second, 'downstream'\n  promise is resolved with the return value of the first promise's fulfillment\n  or rejection handler, or rejected if the handler throws an exception.\n   ```js\n  findUser().then(function (user) {\n    return user.name;\n  }, function (reason) {\n    return 'default name';\n  }).then(function (userName) {\n    // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n    // will be `'default name'`\n  });\n   findUser().then(function (user) {\n    throw new Error('Found user, but still unhappy');\n  }, function (reason) {\n    throw new Error('`findUser` rejected and we're unhappy');\n  }).then(function (value) {\n    // never reached\n  }, function (reason) {\n    // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n    // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n  });\n  ```\n  If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n   ```js\n  findUser().then(function (user) {\n    throw new PedagogicalException('Upstream error');\n  }).then(function (value) {\n    // never reached\n  }).then(function (value) {\n    // never reached\n  }, function (reason) {\n    // The `PedgagocialException` is propagated all the way down to here\n  });\n  ```\n   Assimilation\n  ------------\n   Sometimes the value you want to propagate to a downstream promise can only be\n  retrieved asynchronously. This can be achieved by returning a promise in the\n  fulfillment or rejection handler. The downstream promise will then be pending\n  until the returned promise is settled. This is called *assimilation*.\n   ```js\n  findUser().then(function (user) {\n    return findCommentsByAuthor(user);\n  }).then(function (comments) {\n    // The user's comments are now available\n  });\n  ```\n   If the assimliated promise rejects, then the downstream promise will also reject.\n   ```js\n  findUser().then(function (user) {\n    return findCommentsByAuthor(user);\n  }).then(function (comments) {\n    // If `findCommentsByAuthor` fulfills, we'll have the value here\n  }, function (reason) {\n    // If `findCommentsByAuthor` rejects, we'll have the reason here\n  });\n  ```\n   Simple Example\n  --------------\n   Synchronous Example\n   ```javascript\n  let result;\n   try {\n    result = findResult();\n    // success\n  } catch(reason) {\n    // failure\n  }\n  ```\n   Errback Example\n   ```js\n  findResult(function(result, err){\n    if (err) {\n      // failure\n    } else {\n      // success\n    }\n  });\n  ```\n   Promise Example;\n   ```javascript\n  findResult().then(function(result){\n    // success\n  }, function(reason){\n    // failure\n  });\n  ```\n   Advanced Example\n  --------------\n   Synchronous Example\n   ```javascript\n  let author, books;\n   try {\n    author = findAuthor();\n    books  = findBooksByAuthor(author);\n    // success\n  } catch(reason) {\n    // failure\n  }\n  ```\n   Errback Example\n   ```js\n   function foundBooks(books) {\n   }\n   function failure(reason) {\n   }\n   findAuthor(function(author, err){\n    if (err) {\n      failure(err);\n      // failure\n    } else {\n      try {\n        findBoooksByAuthor(author, function(books, err) {\n          if (err) {\n            failure(err);\n          } else {\n            try {\n              foundBooks(books);\n            } catch(reason) {\n              failure(reason);\n            }\n          }\n        });\n      } catch(error) {\n        failure(err);\n      }\n      // success\n    }\n  });\n  ```\n   Promise Example;\n   ```javascript\n  findAuthor().\n    then(findBooksByAuthor).\n    then(function(books){\n      // found books\n  }).catch(function(reason){\n    // something went wrong\n  });\n  ```\n   @method then\n  @param {Function} onFulfilled\n  @param {Function} onRejected\n  Useful for tooling.\n  @return {Promise}\n  */\n\n  /**\n  `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n  as the catch block of a try/catch statement.\n  ```js\n  function findAuthor(){\n  throw new Error('couldn't find that author');\n  }\n  // synchronous\n  try {\n  findAuthor();\n  } catch(reason) {\n  // something went wrong\n  }\n  // async with promises\n  findAuthor().catch(function(reason){\n  // something went wrong\n  });\n  ```\n  @method catch\n  @param {Function} onRejection\n  Useful for tooling.\n  @return {Promise}\n  */\n\n\n  Promise.prototype.catch = function _catch(onRejection) {\n    return this.then(null, onRejection);\n  };\n\n  /**\n    `finally` will be invoked regardless of the promise's fate just as native\n    try/catch/finally behaves\n  \n    Synchronous example:\n  \n    ```js\n    findAuthor() {\n      if (Math.random() > 0.5) {\n        throw new Error();\n      }\n      return new Author();\n    }\n  \n    try {\n      return findAuthor(); // succeed or fail\n    } catch(error) {\n      return findOtherAuther();\n    } finally {\n      // always runs\n      // doesn't affect the return value\n    }\n    ```\n  \n    Asynchronous example:\n  \n    ```js\n    findAuthor().catch(function(reason){\n      return findOtherAuther();\n    }).finally(function(){\n      // author was either found, or not\n    });\n    ```\n  \n    @method finally\n    @param {Function} callback\n    @return {Promise}\n  */\n\n\n  Promise.prototype.finally = function _finally(callback) {\n    var promise = this;\n    var constructor = promise.constructor;\n\n    if (isFunction(callback)) {\n      return promise.then(function (value) {\n        return constructor.resolve(callback()).then(function () {\n          return value;\n        });\n      }, function (reason) {\n        return constructor.resolve(callback()).then(function () {\n          throw reason;\n        });\n      });\n    }\n\n    return promise.then(callback, callback);\n  };\n\n  return Promise;\n}();\n\nPromise.prototype.then = then;\nexport default Promise;\nPromise.all = all;\nPromise.race = race;\nPromise.resolve = Resolve;\nPromise.reject = Reject;\nPromise._setScheduler = setScheduler;\nPromise._setAsap = setAsap;\nPromise._asap = asap;","/*global self*/\nimport Promise from './promise';\n\nexport default function polyfill() {\n  var local = void 0;\n\n  if (typeof global !== 'undefined') {\n    local = global;\n  } else if (typeof self !== 'undefined') {\n    local = self;\n  } else {\n    try {\n      local = Function('return this')();\n    } catch (e) {\n      throw new Error('polyfill failed because global object is unavailable in this environment');\n    }\n  }\n\n  var P = local.Promise;\n\n  if (P) {\n    var promiseToString = null;\n    try {\n      promiseToString = Object.prototype.toString.call(P.resolve());\n    } catch (e) {\n      // silently ignored\n    }\n\n    if (promiseToString === '[object Promise]' && !P.cast) {\n      return;\n    }\n  }\n\n  local.Promise = Promise;\n}","import Promise from './es6-promise/promise';\nimport polyfill from './es6-promise/polyfill';\n\n// Strange compat..\nPromise.polyfill = polyfill;\nPromise.Promise = Promise;\nexport default Promise;"],"names":["resolve","_resolve","then","originalThen","originalResolve","Promise","reject","_reject","Resolve","Reject"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACNO,SAAS,gBAAgB,CAAC,CAAC,EAAE;EAClC,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC;EACpB,OAAO,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,UAAU,CAAC,CAAC;CACjE;;AAED,AAAO,SAAS,UAAU,CAAC,CAAC,EAAE;EAC5B,OAAO,OAAO,CAAC,KAAK,UAAU,CAAC;CAChC;;AAED,AAEC;;AAED,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC;AACtB,IAAI,KAAK,CAAC,OAAO,EAAE;EACjB,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;CAC1B,MAAM;EACL,QAAQ,GAAG,UAAU,CAAC,EAAE;IACtB,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC;GAC/D,CAAC;CACH;;AAED,AAAO,IAAI,OAAO,GAAG,QAAQ;;ACtB7B,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,IAAI,SAAS,GAAG,KAAK,CAAC,CAAC;AACvB,IAAI,iBAAiB,GAAG,KAAK,CAAC,CAAC;;AAE/B,AAAO,IAAI,IAAI,GAAG,SAAS,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;EAC7C,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;EACtB,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;EACrB,GAAG,IAAI,CAAC,CAAC;EACT,IAAI,GAAG,KAAK,CAAC,EAAE;;;;IAIb,IAAI,iBAAiB,EAAE;MACrB,iBAAiB,CAAC,KAAK,CAAC,CAAC;KAC1B,MAAM;MACL,aAAa,EAAE,CAAC;KACjB;GACF;CACF,CAAC;;AAEF,AAAO,SAAS,YAAY,CAAC,UAAU,EAAE;EACvC,iBAAiB,GAAG,UAAU,CAAC;CAChC;;AAED,AAAO,SAAS,OAAO,CAAC,MAAM,EAAE;EAC9B,IAAI,GAAG,MAAM,CAAC;CACf;;AAED,IAAI,aAAa,GAAG,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AACvE,IAAI,aAAa,GAAG,aAAa,IAAI,EAAE,CAAC;AACxC,IAAI,uBAAuB,GAAG,aAAa,CAAC,gBAAgB,IAAI,aAAa,CAAC,sBAAsB,CAAC;AACrG,IAAI,MAAM,GAAG,OAAO,IAAI,KAAK,WAAW,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,kBAAkB,CAAC;;;AAG/H,IAAI,QAAQ,GAAG,OAAO,iBAAiB,KAAK,WAAW,IAAI,OAAO,aAAa,KAAK,WAAW,IAAI,OAAO,cAAc,KAAK,WAAW,CAAC;;;AAGzI,SAAS,WAAW,GAAG;;;EAGrB,OAAO,YAAY;IACjB,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;GAChC,CAAC;CACH;;;AAGD,SAAS,aAAa,GAAG;EACvB,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE;IACpC,OAAO,YAAY;MACjB,SAAS,CAAC,KAAK,CAAC,CAAC;KAClB,CAAC;GACH;;EAED,OAAO,aAAa,EAAE,CAAC;CACxB;;AAED,SAAS,mBAAmB,GAAG;EAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;EACnB,IAAI,QAAQ,GAAG,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC;EAClD,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;EACvC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;;EAEhD,OAAO,YAAY;IACjB,IAAI,CAAC,IAAI,GAAG,UAAU,GAAG,EAAE,UAAU,GAAG,CAAC,CAAC;GAC3C,CAAC;CACH;;;AAGD,SAAS,iBAAiB,GAAG;EAC3B,IAAI,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;EACnC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;EAChC,OAAO,YAAY;IACjB,OAAO,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;GACrC,CAAC;CACH;;AAED,SAAS,aAAa,GAAG;;;EAGvB,IAAI,gBAAgB,GAAG,UAAU,CAAC;EAClC,OAAO,YAAY;IACjB,OAAO,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;GACnC,CAAC;CACH;;AAED,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,SAAS,KAAK,GAAG;EACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE;IAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;IAEvB,QAAQ,CAAC,GAAG,CAAC,CAAC;;IAEd,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACrB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;GAC1B;;EAED,GAAG,GAAG,CAAC,CAAC;CACT;;AAED,SAAS,YAAY,GAAG;EACtB,IAAI;IACF,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,YAAY,CAAC;IAClD,OAAO,aAAa,EAAE,CAAC;GACxB,CAAC,OAAO,CAAC,EAAE;IACV,OAAO,aAAa,EAAE,CAAC;GACxB;CACF;;AAED,IAAI,aAAa,GAAG,KAAK,CAAC,CAAC;;AAE3B,IAAI,MAAM,EAAE;EACV,aAAa,GAAG,WAAW,EAAE,CAAC;CAC/B,MAAM,IAAI,uBAAuB,EAAE;EAClC,aAAa,GAAG,mBAAmB,EAAE,CAAC;CACvC,MAAM,IAAI,QAAQ,EAAE;EACnB,aAAa,GAAG,iBAAiB,EAAE,CAAC;CACrC,MAAM,IAAI,aAAa,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;EACvE,aAAa,GAAG,YAAY,EAAE,CAAC;CAChC,MAAM;EACL,aAAa,GAAG,aAAa,EAAE,CAAC;;;CACjC,DCtHc,SAAS,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE;EACvD,IAAI,MAAM,GAAG,IAAI,CAAC;;EAElB,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;;EAEvC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE;IACnC,WAAW,CAAC,KAAK,CAAC,CAAC;GACpB;;EAED,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;;EAG3B,IAAI,MAAM,EAAE;IACV,IAAI,QAAQ,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,YAAY;MACf,OAAO,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;KAChE,CAAC,CAAC;GACJ,MAAM;IACL,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;GACtD;;EAED,OAAO,KAAK,CAAC;;;CACd,DCxBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,AAAe,SAASA,SAAO,CAAC,MAAM,EAAE;;EAEtC,IAAI,WAAW,GAAG,IAAI,CAAC;;EAEvB,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW,EAAE;IAC9E,OAAO,MAAM,CAAC;GACf;;EAED,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;EACpCC,OAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EAC1B,OAAO,OAAO,CAAC;;;CAChB,DCrCM,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;AAEhE,SAAS,IAAI,GAAG,EAAE;;AAElB,IAAI,OAAO,GAAG,KAAK,CAAC,CAAC;AACrB,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,IAAI,QAAQ,GAAG,CAAC,CAAC;;AAEjB,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;CAClE;;AAED,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;CAC9E;;AAED,SAAS,OAAO,CAACC,OAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE;EAClE,IAAI;IACFA,OAAI,CAAC,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;GACxD,CAAC,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,CAAC;GACV;CACF;;AAED,SAAS,qBAAqB,CAAC,OAAO,EAAE,QAAQ,EAAEA,OAAI,EAAE;EACtD,IAAI,CAAC,UAAU,OAAO,EAAE;IACtB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,KAAK,GAAG,OAAO,CAACA,OAAI,EAAE,QAAQ,EAAE,UAAU,KAAK,EAAE;MACnD,IAAI,MAAM,EAAE;QACV,OAAO;OACR;MACD,MAAM,GAAG,IAAI,CAAC;MACd,IAAI,QAAQ,KAAK,KAAK,EAAE;QACtB,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACzB,MAAM;QACL,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACzB;KACF,EAAE,UAAU,MAAM,EAAE;MACnB,IAAI,MAAM,EAAE;QACV,OAAO;OACR;MACD,MAAM,GAAG,IAAI,CAAC;;MAEd,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KACzB,EAAE,UAAU,IAAI,OAAO,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAC,CAAC;;IAExD,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE;MACpB,MAAM,GAAG,IAAI,CAAC;MACd,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACxB;GACF,EAAE,OAAO,CAAC,CAAC;CACb;;AAED,SAAS,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE;EAC5C,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE;IACjC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;GACpC,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE;IACvC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;GACnC,MAAM;IACL,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE;MAC9C,OAAO,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KAChC,EAAE,UAAU,MAAM,EAAE;MACnB,OAAO,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KAChC,CAAC,CAAC;GACJ;CACF;;AAED,SAAS,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAEA,OAAI,EAAE;EACzD,IAAI,aAAa,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,IAAIA,OAAI,KAAKC,IAAY,IAAI,aAAa,CAAC,WAAW,CAAC,OAAO,KAAKC,SAAe,EAAE;IACvI,iBAAiB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;GAC3C,MAAM;IACL,IAAIF,OAAI,KAAK,SAAS,EAAE;MACtB,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KACjC,MAAM,IAAI,UAAU,CAACA,OAAI,CAAC,EAAE;MAC3B,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAEA,OAAI,CAAC,CAAC;KACrD,MAAM;MACL,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KACjC;GACF;CACF;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE;EAC/B,IAAI,OAAO,KAAK,KAAK,EAAE;IACrB,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;GACpC,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;IAClC,IAAIA,OAAI,GAAG,KAAK,CAAC,CAAC;IAClB,IAAI;MACFA,OAAI,GAAG,KAAK,CAAC,IAAI,CAAC;KACnB,CAAC,OAAO,KAAK,EAAE;MACd,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;MACvB,OAAO;KACR;IACD,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAEA,OAAI,CAAC,CAAC;GAC3C,MAAM;IACL,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACzB;CACF;;AAED,SAAS,gBAAgB,CAAC,OAAO,EAAE;EACjC,IAAI,OAAO,CAAC,QAAQ,EAAE;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;GACnC;;EAED,OAAO,CAAC,OAAO,CAAC,CAAC;CAClB;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE;EAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;IAC9B,OAAO;GACR;;EAED,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;EACxB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;;EAE3B,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;IACrC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;GACxB;CACF;;AAED,SAAS,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE;EAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;IAC9B,OAAO;GACR;EACD,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;EAC1B,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;;EAEzB,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;CACjC;;AAED,SAAS,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE;EAC5D,IAAI,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;EACvC,IAAI,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;;;EAGjC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;;EAEvB,YAAY,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;EAC7B,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,aAAa,CAAC;EACjD,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,WAAW,CAAC;;EAE9C,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE;IACjC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;GACvB;CACF;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE;EACxB,IAAI,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;EACvC,IAAI,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;;EAE7B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;IAC5B,OAAO;GACR;;EAED,IAAI,KAAK,GAAG,KAAK,CAAC;MACd,QAAQ,GAAG,KAAK,CAAC;MACjB,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;;EAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;IAC9C,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,QAAQ,GAAG,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;;IAEpC,IAAI,KAAK,EAAE;MACT,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;KAClD,MAAM;MACL,QAAQ,CAAC,MAAM,CAAC,CAAC;KAClB;GACF;;EAED,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;CACjC;;AAED,SAAS,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;EAC1D,IAAI,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC;MAClC,KAAK,GAAG,KAAK,CAAC;MACd,KAAK,GAAG,KAAK,CAAC;MACd,SAAS,GAAG,IAAI,CAAC;;EAErB,IAAI,WAAW,EAAE;IACf,IAAI;MACF,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;KAC1B,CAAC,OAAO,CAAC,EAAE;MACV,SAAS,GAAG,KAAK,CAAC;MAClB,KAAK,GAAG,CAAC,CAAC;KACX;;IAED,IAAI,OAAO,KAAK,KAAK,EAAE;MACrB,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;MACnC,OAAO;KACR;GACF,MAAM;IACL,KAAK,GAAG,MAAM,CAAC;GAChB;;EAED,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;;GAE/B,MAAM,IAAI,WAAW,IAAI,SAAS,EAAE;IACnC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACzB,MAAM,IAAI,SAAS,KAAK,KAAK,EAAE;IAC9B,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACxB,MAAM,IAAI,OAAO,KAAK,SAAS,EAAE;IAChC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACzB,MAAM,IAAI,OAAO,KAAK,QAAQ,EAAE;IAC/B,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACxB;CACF;;AAED,SAAS,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE;EAC5C,IAAI;IACF,QAAQ,CAAC,SAAS,cAAc,CAAC,KAAK,EAAE;MACtC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACzB,EAAE,SAAS,aAAa,CAAC,MAAM,EAAE;MAChC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KACzB,CAAC,CAAC;GACJ,CAAC,OAAO,CAAC,EAAE;IACV,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;GACpB;CACF;;AAED,IAAI,EAAE,GAAG,CAAC,CAAC;AACX,SAAS,MAAM,GAAG;EAChB,OAAO,EAAE,EAAE,CAAC;CACb;;AAED,SAAS,WAAW,CAAC,OAAO,EAAE;EAC5B,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;EAC3B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;EAC3B,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;EAC5B,OAAO,CAAC,YAAY,GAAG,EAAE,CAAC;CAC3B;;AChOD,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;CAC7D,AAAC;;AAEF,IAAI,UAAU,GAAG,YAAY;EAC3B,SAAS,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE;IACtC,IAAI,CAAC,oBAAoB,GAAG,WAAW,CAAC;IACxC,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;;IAErC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;MAC7B,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KAC3B;;IAED,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;MAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;MAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;;MAE/B,IAAI,CAAC,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;MAEtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACrB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;OACrC,MAAM;QACL,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;UACzB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;SACrC;OACF;KACF,MAAM;MACL,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;KACzC;GACF;;EAED,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,UAAU,CAAC,KAAK,EAAE;IAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;MAChE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KAC9B;GACF,CAAC;;EAEF,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE;IAC9D,IAAI,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC;IAClC,IAAIF,UAAO,GAAG,CAAC,CAAC,OAAO,CAAC;;;IAGxB,IAAIA,UAAO,KAAKI,SAAe,EAAE;MAC/B,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;MACnB,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;MACnB,IAAI,QAAQ,GAAG,KAAK,CAAC;MACrB,IAAI;QACF,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;OACpB,CAAC,OAAO,CAAC,EAAE;QACV,QAAQ,GAAG,IAAI,CAAC;QAChB,KAAK,GAAG,CAAC,CAAC;OACX;;MAED,IAAI,KAAK,KAAKD,IAAY,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE;QACtD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;OACjD,MAAM,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;OACzB,MAAM,IAAI,CAAC,KAAKE,SAAO,EAAE;QACxB,IAAI,OAAO,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,QAAQ,EAAE;UACZ,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SACxB,MAAM;UACL,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC5C;QACD,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;OAChC,MAAM;QACL,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,UAAUL,UAAO,EAAE;UAC1C,OAAOA,UAAO,CAAC,KAAK,CAAC,CAAC;SACvB,CAAC,EAAE,CAAC,CAAC,CAAC;OACR;KACF,MAAM;MACL,IAAI,CAAC,aAAa,CAACA,UAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;KACvC;GACF,CAAC;;EAEF,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE;IACrE,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;;;IAG3B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;MAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;;MAElB,IAAI,KAAK,KAAK,QAAQ,EAAE;QACtB,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACxB,MAAM;QACL,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;OACzB;KACF;;IAED,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;MACzB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;KAChC;GACF,CAAC;;EAEF,UAAU,CAAC,SAAS,CAAC,aAAa,GAAG,SAAS,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE;IACtE,IAAI,UAAU,GAAG,IAAI,CAAC;;IAEtB,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE;MAC7C,OAAO,UAAU,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;KACnD,EAAE,UAAU,MAAM,EAAE;MACnB,OAAO,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;KACnD,CAAC,CAAC;GACJ,CAAC;;EAEF,OAAO,UAAU,CAAC;CACnB,EAAE;;ACrHH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,AAAe,SAAS,GAAG,CAAC,OAAO,EAAE;EACnC,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC;;;CAC9C,DCjDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA,AAAe,SAAS,IAAI,CAAC,OAAO,EAAE;;EAEpC,IAAI,WAAW,GAAG,IAAI,CAAC;;EAEvB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;IACrB,OAAO,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE;MAC1C,OAAO,MAAM,CAAC,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC,CAAC;KACjE,CAAC,CAAC;GACJ,MAAM;IACL,OAAO,IAAI,WAAW,CAAC,UAAU,OAAO,EAAE,MAAM,EAAE;MAChD,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;MAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;QAC/B,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;OACvD;KACF,CAAC,CAAC;GACJ;;;CACF,DCjFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,AAAe,SAASM,QAAM,CAAC,MAAM,EAAE;;EAErC,IAAI,WAAW,GAAG,IAAI,CAAC;EACvB,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;EACpCC,MAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACzB,OAAO,OAAO,CAAC;;;CAChB,DC9BD,SAAS,aAAa,GAAG;EACvB,MAAM,IAAI,SAAS,CAAC,oFAAoF,CAAC,CAAC;CAC3G;;AAED,SAAS,QAAQ,GAAG;EAClB,MAAM,IAAI,SAAS,CAAC,uHAAuH,CAAC,CAAC;CAC9I;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0GD,IAAIF,SAAO,GAAG,YAAY;EACxB,SAAS,OAAO,CAAC,QAAQ,EAAE;IACzB,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IACvC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;;IAEvB,IAAI,IAAI,KAAK,QAAQ,EAAE;MACrB,OAAO,QAAQ,KAAK,UAAU,IAAI,aAAa,EAAE,CAAC;MAClD,IAAI,YAAY,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAE,CAAC;KAC1E;GACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4LD,OAAO,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,MAAM,CAAC,WAAW,EAAE;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;GACrC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CF,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,QAAQ,CAAC,QAAQ,EAAE;IACtD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;;IAEtC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE;MACxB,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,KAAK,EAAE;QACnC,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY;UACtD,OAAO,KAAK,CAAC;SACd,CAAC,CAAC;OACJ,EAAE,UAAU,MAAM,EAAE;QACnB,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY;UACtD,MAAM,MAAM,CAAC;SACd,CAAC,CAAC;OACJ,CAAC,CAAC;KACJ;;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;GACzC,CAAC;;EAEF,OAAO,OAAO,CAAC;CAChB,EAAE,CAAC;;AAEJA,SAAO,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC;AAC9B,AACAA,SAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAClBA,SAAO,CAAC,IAAI,GAAG,IAAI,CAAC;AACpBA,SAAO,CAAC,OAAO,GAAGG,SAAO,CAAC;AAC1BH,SAAO,CAAC,MAAM,GAAGI,QAAM,CAAC;AACxBJ,SAAO,CAAC,aAAa,GAAG,YAAY,CAAC;AACrCA,SAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;AAC3BA,SAAO,CAAC,KAAK,GAAG,IAAI;;AC5YpB;AACA,AAEe,SAAS,QAAQ,GAAG;EACjC,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;;EAEnB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;IACjC,KAAK,GAAG,MAAM,CAAC;GAChB,MAAM,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;IACtC,KAAK,GAAG,IAAI,CAAC;GACd,MAAM;IACL,IAAI;MACF,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;KACnC,CAAC,OAAO,CAAC,EAAE;MACV,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;KAC7F;GACF;;EAED,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;;EAEtB,IAAI,CAAC,EAAE;IACL,IAAI,eAAe,GAAG,IAAI,CAAC;IAC3B,IAAI;MACF,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;KAC/D,CAAC,OAAO,CAAC,EAAE;;KAEX;;IAED,IAAI,eAAe,KAAK,kBAAkB,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;MACrD,OAAO;KACR;GACF;;EAED,KAAK,CAAC,OAAO,GAAGA,SAAO,CAAC;;;CACzB,DC/BD;AACAA,SAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC5BA,SAAO,CAAC,OAAO,GAAGA,SAAO,CAAC;;;;;;;;","file":"es6-promise.js"}
\ No newline at end of file
diff --git a/node_modules/es6-promise/dist/es6-promise.min.js b/node_modules/es6-promise/dist/es6-promise.min.js
deleted file mode 100644
index 6af5903..0000000
--- a/node_modules/es6-promise/dist/es6-promise.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.ES6Promise=e()}(this,function(){"use strict";function t(t){var e=typeof t;return null!==t&&("object"===e||"function"===e)}function e(t){return"function"==typeof t}function n(t){W=t}function r(t){z=t}function o(){return function(){return process.nextTick(a)}}function i(){return"undefined"!=typeof U?function(){U(a)}:c()}function s(){var t=0,e=new H(a),n=document.createTextNode("");return e.observe(n,{characterData:!0}),function(){n.data=t=++t%2}}function u(){var t=new MessageChannel;return t.port1.onmessage=a,function(){return t.port2.postMessage(0)}}function c(){var t=setTimeout;return function(){return t(a,1)}}function a(){for(var t=0;t<N;t+=2){var e=Q[t],n=Q[t+1];e(n),Q[t]=void 0,Q[t+1]=void 0}N=0}function f(){try{var t=Function("return this")().require("vertx");return U=t.runOnLoop||t.runOnContext,i()}catch(e){return c()}}function l(t,e){var n=this,r=new this.constructor(v);void 0===r[V]&&x(r);var o=n._state;if(o){var i=arguments[o-1];z(function(){return T(o,r,i,n._result)})}else j(n,r,t,e);return r}function h(t){var e=this;if(t&&"object"==typeof t&&t.constructor===e)return t;var n=new e(v);return w(n,t),n}function v(){}function p(){return new TypeError("You cannot resolve a promise with itself")}function d(){return new TypeError("A promises callback cannot return that same promise.")}function _(t,e,n,r){try{t.call(e,n,r)}catch(o){return o}}function y(t,e,n){z(function(t){var r=!1,o=_(n,e,function(n){r||(r=!0,e!==n?w(t,n):A(t,n))},function(e){r||(r=!0,S(t,e))},"Settle: "+(t._label||" unknown promise"));!r&&o&&(r=!0,S(t,o))},t)}function m(t,e){e._state===Z?A(t,e._result):e._state===$?S(t,e._result):j(e,void 0,function(e){return w(t,e)},function(e){return S(t,e)})}function b(t,n,r){n.constructor===t.constructor&&r===l&&n.constructor.resolve===h?m(t,n):void 0===r?A(t,n):e(r)?y(t,n,r):A(t,n)}function w(e,n){if(e===n)S(e,p());else if(t(n)){var r=void 0;try{r=n.then}catch(o){return void S(e,o)}b(e,n,r)}else A(e,n)}function g(t){t._onerror&&t._onerror(t._result),E(t)}function A(t,e){t._state===X&&(t._result=e,t._state=Z,0!==t._subscribers.length&&z(E,t))}function S(t,e){t._state===X&&(t._state=$,t._result=e,z(g,t))}function j(t,e,n,r){var o=t._subscribers,i=o.length;t._onerror=null,o[i]=e,o[i+Z]=n,o[i+$]=r,0===i&&t._state&&z(E,t)}function E(t){var e=t._subscribers,n=t._state;if(0!==e.length){for(var r=void 0,o=void 0,i=t._result,s=0;s<e.length;s+=3)r=e[s],o=e[s+n],r?T(n,r,o,i):o(i);t._subscribers.length=0}}function T(t,n,r,o){var i=e(r),s=void 0,u=void 0,c=!0;if(i){try{s=r(o)}catch(a){c=!1,u=a}if(n===s)return void S(n,d())}else s=o;n._state!==X||(i&&c?w(n,s):c===!1?S(n,u):t===Z?A(n,s):t===$&&S(n,s))}function M(t,e){try{e(function(e){w(t,e)},function(e){S(t,e)})}catch(n){S(t,n)}}function P(){return tt++}function x(t){t[V]=tt++,t._state=void 0,t._result=void 0,t._subscribers=[]}function C(){return new Error("Array Methods must be provided an Array")}function O(t){return new et(this,t).promise}function k(t){var e=this;return new e(L(t)?function(n,r){for(var o=t.length,i=0;i<o;i++)e.resolve(t[i]).then(n,r)}:function(t,e){return e(new TypeError("You must pass an array to race."))})}function F(t){var e=this,n=new e(v);return S(n,t),n}function Y(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function q(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function D(){var t=void 0;if("undefined"!=typeof global)t=global;else if("undefined"!=typeof self)t=self;else try{t=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var n=t.Promise;if(n){var r=null;try{r=Object.prototype.toString.call(n.resolve())}catch(e){}if("[object Promise]"===r&&!n.cast)return}t.Promise=nt}var K=void 0;K=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};var L=K,N=0,U=void 0,W=void 0,z=function(t,e){Q[N]=t,Q[N+1]=e,N+=2,2===N&&(W?W(a):R())},B="undefined"!=typeof window?window:void 0,G=B||{},H=G.MutationObserver||G.WebKitMutationObserver,I="undefined"==typeof self&&"undefined"!=typeof process&&"[object process]"==={}.toString.call(process),J="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,Q=new Array(1e3),R=void 0;R=I?o():H?s():J?u():void 0===B&&"function"==typeof require?f():c();var V=Math.random().toString(36).substring(2),X=void 0,Z=1,$=2,tt=0,et=function(){function t(t,e){this._instanceConstructor=t,this.promise=new t(v),this.promise[V]||x(this.promise),L(e)?(this.length=e.length,this._remaining=e.length,this._result=new Array(this.length),0===this.length?A(this.promise,this._result):(this.length=this.length||0,this._enumerate(e),0===this._remaining&&A(this.promise,this._result))):S(this.promise,C())}return t.prototype._enumerate=function(t){for(var e=0;this._state===X&&e<t.length;e++)this._eachEntry(t[e],e)},t.prototype._eachEntry=function(t,e){var n=this._instanceConstructor,r=n.resolve;if(r===h){var o=void 0,i=void 0,s=!1;try{o=t.then}catch(u){s=!0,i=u}if(o===l&&t._state!==X)this._settledAt(t._state,e,t._result);else if("function"!=typeof o)this._remaining--,this._result[e]=t;else if(n===nt){var c=new n(v);s?S(c,i):b(c,t,o),this._willSettleAt(c,e)}else this._willSettleAt(new n(function(e){return e(t)}),e)}else this._willSettleAt(r(t),e)},t.prototype._settledAt=function(t,e,n){var r=this.promise;r._state===X&&(this._remaining--,t===$?S(r,n):this._result[e]=n),0===this._remaining&&A(r,this._result)},t.prototype._willSettleAt=function(t,e){var n=this;j(t,void 0,function(t){return n._settledAt(Z,e,t)},function(t){return n._settledAt($,e,t)})},t}(),nt=function(){function t(e){this[V]=P(),this._result=this._state=void 0,this._subscribers=[],v!==e&&("function"!=typeof e&&Y(),this instanceof t?M(this,e):q())}return t.prototype["catch"]=function(t){return this.then(null,t)},t.prototype["finally"]=function(t){var n=this,r=n.constructor;return e(t)?n.then(function(e){return r.resolve(t()).then(function(){return e})},function(e){return r.resolve(t()).then(function(){throw e})}):n.then(t,t)},t}();return nt.prototype.then=l,nt.all=O,nt.race=k,nt.resolve=h,nt.reject=F,nt._setScheduler=n,nt._setAsap=r,nt._asap=z,nt.polyfill=D,nt.Promise=nt,nt});
\ No newline at end of file
diff --git a/node_modules/es6-promise/dist/es6-promise.min.map b/node_modules/es6-promise/dist/es6-promise.min.map
deleted file mode 100644
index d510815..0000000
--- a/node_modules/es6-promise/dist/es6-promise.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["config/versionTemplate.txt","lib/es6-promise/utils.js","lib/es6-promise/asap.js","lib/es6-promise/then.js","lib/es6-promise/promise/resolve.js","lib/es6-promise/-internal.js","lib/es6-promise/enumerator.js","lib/es6-promise/promise/all.js","lib/es6-promise/promise/race.js","lib/es6-promise/promise/reject.js","lib/es6-promise/promise.js","lib/es6-promise/polyfill.js","lib/es6-promise.js"],"sourcesContent":["/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license   Licensed under MIT license\n *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version   v4.2.8+1e68dce6\n */\n","export function objectOrFunction(x) {\n  var type = typeof x;\n  return x !== null && (type === 'object' || type === 'function');\n}\n\nexport function isFunction(x) {\n  return typeof x === 'function';\n}\n\nexport function isMaybeThenable(x) {\n  return x !== null && typeof x === 'object';\n}\n\nvar _isArray = void 0;\nif (Array.isArray) {\n  _isArray = Array.isArray;\n} else {\n  _isArray = function (x) {\n    return Object.prototype.toString.call(x) === '[object Array]';\n  };\n}\n\nexport var isArray = _isArray;","var len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nexport var asap = function asap(callback, arg) {\n  queue[len] = callback;\n  queue[len + 1] = arg;\n  len += 2;\n  if (len === 2) {\n    // If len is 2, that means that we need to schedule an async flush.\n    // If additional callbacks are queued before the queue is flushed, they\n    // will be processed by this flush that we are scheduling.\n    if (customSchedulerFn) {\n      customSchedulerFn(flush);\n    } else {\n      scheduleFlush();\n    }\n  }\n};\n\nexport function setScheduler(scheduleFn) {\n  customSchedulerFn = scheduleFn;\n}\n\nexport function setAsap(asapFn) {\n  asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n  // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n  // see https://github.com/cujojs/when/issues/410 for details\n  return function () {\n    return process.nextTick(flush);\n  };\n}\n\n// vertx\nfunction useVertxTimer() {\n  if (typeof vertxNext !== 'undefined') {\n    return function () {\n      vertxNext(flush);\n    };\n  }\n\n  return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n  var iterations = 0;\n  var observer = new BrowserMutationObserver(flush);\n  var node = document.createTextNode('');\n  observer.observe(node, { characterData: true });\n\n  return function () {\n    node.data = iterations = ++iterations % 2;\n  };\n}\n\n// web worker\nfunction useMessageChannel() {\n  var channel = new MessageChannel();\n  channel.port1.onmessage = flush;\n  return function () {\n    return channel.port2.postMessage(0);\n  };\n}\n\nfunction useSetTimeout() {\n  // Store setTimeout reference so es6-promise will be unaffected by\n  // other code modifying setTimeout (like sinon.useFakeTimers())\n  var globalSetTimeout = setTimeout;\n  return function () {\n    return globalSetTimeout(flush, 1);\n  };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n  for (var i = 0; i < len; i += 2) {\n    var callback = queue[i];\n    var arg = queue[i + 1];\n\n    callback(arg);\n\n    queue[i] = undefined;\n    queue[i + 1] = undefined;\n  }\n\n  len = 0;\n}\n\nfunction attemptVertx() {\n  try {\n    var vertx = Function('return this')().require('vertx');\n    vertxNext = vertx.runOnLoop || vertx.runOnContext;\n    return useVertxTimer();\n  } catch (e) {\n    return useSetTimeout();\n  }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n  scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n  scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n  scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n  scheduleFlush = attemptVertx();\n} else {\n  scheduleFlush = useSetTimeout();\n}","import { invokeCallback, subscribe, FULFILLED, REJECTED, noop, makePromise, PROMISE_ID } from './-internal';\n\nimport { asap } from './asap';\n\nexport default function then(onFulfillment, onRejection) {\n  var parent = this;\n\n  var child = new this.constructor(noop);\n\n  if (child[PROMISE_ID] === undefined) {\n    makePromise(child);\n  }\n\n  var _state = parent._state;\n\n\n  if (_state) {\n    var callback = arguments[_state - 1];\n    asap(function () {\n      return invokeCallback(_state, child, callback, parent._result);\n    });\n  } else {\n    subscribe(parent, child, onFulfillment, onRejection);\n  }\n\n  return child;\n}","import { noop, resolve as _resolve } from '../-internal';\n\n/**\n  `Promise.resolve` returns a promise that will become resolved with the\n  passed `value`. It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    resolve(1);\n  });\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.resolve(1);\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  @method resolve\n  @static\n  @param {Any} value value that the returned promise will be resolved with\n  Useful for tooling.\n  @return {Promise} a promise that will become fulfilled with the given\n  `value`\n*/\nexport default function resolve(object) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (object && typeof object === 'object' && object.constructor === Constructor) {\n    return object;\n  }\n\n  var promise = new Constructor(noop);\n  _resolve(promise, object);\n  return promise;\n}","import { objectOrFunction, isFunction } from './utils';\n\nimport { asap } from './asap';\n\nimport originalThen from './then';\nimport originalResolve from './promise/resolve';\n\nexport var PROMISE_ID = Math.random().toString(36).substring(2);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nfunction selfFulfillment() {\n  return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n  return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n  try {\n    then.call(value, fulfillmentHandler, rejectionHandler);\n  } catch (e) {\n    return e;\n  }\n}\n\nfunction handleForeignThenable(promise, thenable, then) {\n  asap(function (promise) {\n    var sealed = false;\n    var error = tryThen(then, thenable, function (value) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n      if (thenable !== value) {\n        resolve(promise, value);\n      } else {\n        fulfill(promise, value);\n      }\n    }, function (reason) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n\n      reject(promise, reason);\n    }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n    if (!sealed && error) {\n      sealed = true;\n      reject(promise, error);\n    }\n  }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n  if (thenable._state === FULFILLED) {\n    fulfill(promise, thenable._result);\n  } else if (thenable._state === REJECTED) {\n    reject(promise, thenable._result);\n  } else {\n    subscribe(thenable, undefined, function (value) {\n      return resolve(promise, value);\n    }, function (reason) {\n      return reject(promise, reason);\n    });\n  }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then) {\n  if (maybeThenable.constructor === promise.constructor && then === originalThen && maybeThenable.constructor.resolve === originalResolve) {\n    handleOwnThenable(promise, maybeThenable);\n  } else {\n    if (then === undefined) {\n      fulfill(promise, maybeThenable);\n    } else if (isFunction(then)) {\n      handleForeignThenable(promise, maybeThenable, then);\n    } else {\n      fulfill(promise, maybeThenable);\n    }\n  }\n}\n\nfunction resolve(promise, value) {\n  if (promise === value) {\n    reject(promise, selfFulfillment());\n  } else if (objectOrFunction(value)) {\n    var then = void 0;\n    try {\n      then = value.then;\n    } catch (error) {\n      reject(promise, error);\n      return;\n    }\n    handleMaybeThenable(promise, value, then);\n  } else {\n    fulfill(promise, value);\n  }\n}\n\nfunction publishRejection(promise) {\n  if (promise._onerror) {\n    promise._onerror(promise._result);\n  }\n\n  publish(promise);\n}\n\nfunction fulfill(promise, value) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n\n  promise._result = value;\n  promise._state = FULFILLED;\n\n  if (promise._subscribers.length !== 0) {\n    asap(publish, promise);\n  }\n}\n\nfunction reject(promise, reason) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n  promise._state = REJECTED;\n  promise._result = reason;\n\n  asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n  var _subscribers = parent._subscribers;\n  var length = _subscribers.length;\n\n\n  parent._onerror = null;\n\n  _subscribers[length] = child;\n  _subscribers[length + FULFILLED] = onFulfillment;\n  _subscribers[length + REJECTED] = onRejection;\n\n  if (length === 0 && parent._state) {\n    asap(publish, parent);\n  }\n}\n\nfunction publish(promise) {\n  var subscribers = promise._subscribers;\n  var settled = promise._state;\n\n  if (subscribers.length === 0) {\n    return;\n  }\n\n  var child = void 0,\n      callback = void 0,\n      detail = promise._result;\n\n  for (var i = 0; i < subscribers.length; i += 3) {\n    child = subscribers[i];\n    callback = subscribers[i + settled];\n\n    if (child) {\n      invokeCallback(settled, child, callback, detail);\n    } else {\n      callback(detail);\n    }\n  }\n\n  promise._subscribers.length = 0;\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n  var hasCallback = isFunction(callback),\n      value = void 0,\n      error = void 0,\n      succeeded = true;\n\n  if (hasCallback) {\n    try {\n      value = callback(detail);\n    } catch (e) {\n      succeeded = false;\n      error = e;\n    }\n\n    if (promise === value) {\n      reject(promise, cannotReturnOwn());\n      return;\n    }\n  } else {\n    value = detail;\n  }\n\n  if (promise._state !== PENDING) {\n    // noop\n  } else if (hasCallback && succeeded) {\n    resolve(promise, value);\n  } else if (succeeded === false) {\n    reject(promise, error);\n  } else if (settled === FULFILLED) {\n    fulfill(promise, value);\n  } else if (settled === REJECTED) {\n    reject(promise, value);\n  }\n}\n\nfunction initializePromise(promise, resolver) {\n  try {\n    resolver(function resolvePromise(value) {\n      resolve(promise, value);\n    }, function rejectPromise(reason) {\n      reject(promise, reason);\n    });\n  } catch (e) {\n    reject(promise, e);\n  }\n}\n\nvar id = 0;\nfunction nextId() {\n  return id++;\n}\n\nfunction makePromise(promise) {\n  promise[PROMISE_ID] = id++;\n  promise._state = undefined;\n  promise._result = undefined;\n  promise._subscribers = [];\n}\n\nexport { nextId, makePromise, noop, resolve, reject, fulfill, subscribe, publish, publishRejection, initializePromise, invokeCallback, FULFILLED, REJECTED, PENDING, handleMaybeThenable };","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { isArray, isMaybeThenable } from './utils';\nimport { noop, reject, fulfill, subscribe, FULFILLED, REJECTED, PENDING, handleMaybeThenable } from './-internal';\n\nimport then from './then';\nimport Promise from './promise';\nimport originalResolve from './promise/resolve';\nimport originalThen from './then';\nimport { makePromise, PROMISE_ID } from './-internal';\n\nfunction validationError() {\n  return new Error('Array Methods must be provided an Array');\n};\n\nvar Enumerator = function () {\n  function Enumerator(Constructor, input) {\n    this._instanceConstructor = Constructor;\n    this.promise = new Constructor(noop);\n\n    if (!this.promise[PROMISE_ID]) {\n      makePromise(this.promise);\n    }\n\n    if (isArray(input)) {\n      this.length = input.length;\n      this._remaining = input.length;\n\n      this._result = new Array(this.length);\n\n      if (this.length === 0) {\n        fulfill(this.promise, this._result);\n      } else {\n        this.length = this.length || 0;\n        this._enumerate(input);\n        if (this._remaining === 0) {\n          fulfill(this.promise, this._result);\n        }\n      }\n    } else {\n      reject(this.promise, validationError());\n    }\n  }\n\n  Enumerator.prototype._enumerate = function _enumerate(input) {\n    for (var i = 0; this._state === PENDING && i < input.length; i++) {\n      this._eachEntry(input[i], i);\n    }\n  };\n\n  Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n    var c = this._instanceConstructor;\n    var resolve = c.resolve;\n\n\n    if (resolve === originalResolve) {\n      var _then = void 0;\n      var error = void 0;\n      var didError = false;\n      try {\n        _then = entry.then;\n      } catch (e) {\n        didError = true;\n        error = e;\n      }\n\n      if (_then === originalThen && entry._state !== PENDING) {\n        this._settledAt(entry._state, i, entry._result);\n      } else if (typeof _then !== 'function') {\n        this._remaining--;\n        this._result[i] = entry;\n      } else if (c === Promise) {\n        var promise = new c(noop);\n        if (didError) {\n          reject(promise, error);\n        } else {\n          handleMaybeThenable(promise, entry, _then);\n        }\n        this._willSettleAt(promise, i);\n      } else {\n        this._willSettleAt(new c(function (resolve) {\n          return resolve(entry);\n        }), i);\n      }\n    } else {\n      this._willSettleAt(resolve(entry), i);\n    }\n  };\n\n  Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n    var promise = this.promise;\n\n\n    if (promise._state === PENDING) {\n      this._remaining--;\n\n      if (state === REJECTED) {\n        reject(promise, value);\n      } else {\n        this._result[i] = value;\n      }\n    }\n\n    if (this._remaining === 0) {\n      fulfill(promise, this._result);\n    }\n  };\n\n  Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n    var enumerator = this;\n\n    subscribe(promise, undefined, function (value) {\n      return enumerator._settledAt(FULFILLED, i, value);\n    }, function (reason) {\n      return enumerator._settledAt(REJECTED, i, reason);\n    });\n  };\n\n  return Enumerator;\n}();\n\nexport default Enumerator;\n;","import Enumerator from '../enumerator';\n\n/**\n  `Promise.all` accepts an array of promises, and returns a new promise which\n  is fulfilled with an array of fulfillment values for the passed promises, or\n  rejected with the reason of the first passed promise to be rejected. It casts all\n  elements of the passed iterable to promises as it runs this algorithm.\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = resolve(2);\n  let promise3 = resolve(3);\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // The array here would be [ 1, 2, 3 ];\n  });\n  ```\n\n  If any of the `promises` given to `all` are rejected, the first promise\n  that is rejected will be given as an argument to the returned promises's\n  rejection handler. For example:\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = reject(new Error(\"2\"));\n  let promise3 = reject(new Error(\"3\"));\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // Code here never runs because there are rejected promises!\n  }, function(error) {\n    // error.message === \"2\"\n  });\n  ```\n\n  @method all\n  @static\n  @param {Array} entries array of promises\n  @param {String} label optional string for labeling the promise.\n  Useful for tooling.\n  @return {Promise} promise that is fulfilled when all `promises` have been\n  fulfilled, or rejected if any of them become rejected.\n  @static\n*/\nexport default function all(entries) {\n  return new Enumerator(this, entries).promise;\n}","import { isArray } from \"../utils\";\n\n/**\n  `Promise.race` returns a new promise which is settled in the same way as the\n  first passed promise to settle.\n\n  Example:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 2');\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // result === 'promise 2' because it was resolved before promise1\n    // was resolved.\n  });\n  ```\n\n  `Promise.race` is deterministic in that only the state of the first\n  settled promise matters. For example, even if other promises given to the\n  `promises` array argument are resolved, but the first settled promise has\n  become rejected before the other promises became fulfilled, the returned\n  promise will become rejected:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      reject(new Error('promise 2'));\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // Code here never runs\n  }, function(reason){\n    // reason.message === 'promise 2' because promise 2 became rejected before\n    // promise 1 became fulfilled\n  });\n  ```\n\n  An example real-world use case is implementing timeouts:\n\n  ```javascript\n  Promise.race([ajax('foo.json'), timeout(5000)])\n  ```\n\n  @method race\n  @static\n  @param {Array} promises array of promises to observe\n  Useful for tooling.\n  @return {Promise} a promise which settles in the same way as the first passed\n  promise to settle.\n*/\nexport default function race(entries) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (!isArray(entries)) {\n    return new Constructor(function (_, reject) {\n      return reject(new TypeError('You must pass an array to race.'));\n    });\n  } else {\n    return new Constructor(function (resolve, reject) {\n      var length = entries.length;\n      for (var i = 0; i < length; i++) {\n        Constructor.resolve(entries[i]).then(resolve, reject);\n      }\n    });\n  }\n}","import { noop, reject as _reject } from '../-internal';\n\n/**\n  `Promise.reject` returns a promise rejected with the passed `reason`.\n  It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    reject(new Error('WHOOPS'));\n  });\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.reject(new Error('WHOOPS'));\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  @method reject\n  @static\n  @param {Any} reason value that the returned promise will be rejected with.\n  Useful for tooling.\n  @return {Promise} a promise rejected with the given `reason`.\n*/\nexport default function reject(reason) {\n  /*jshint validthis:true */\n  var Constructor = this;\n  var promise = new Constructor(noop);\n  _reject(promise, reason);\n  return promise;\n}","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nimport { isFunction } from './utils';\nimport { noop, nextId, PROMISE_ID, initializePromise } from './-internal';\nimport { asap, setAsap, setScheduler } from './asap';\n\nimport all from './promise/all';\nimport race from './promise/race';\nimport Resolve from './promise/resolve';\nimport Reject from './promise/reject';\nimport then from './then';\n\nfunction needsResolver() {\n  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n  throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n  Promise objects represent the eventual result of an asynchronous operation. The\n  primary way of interacting with a promise is through its `then` method, which\n  registers callbacks to receive either a promise's eventual value or the reason\n  why the promise cannot be fulfilled.\n\n  Terminology\n  -----------\n\n  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n  - `thenable` is an object or function that defines a `then` method.\n  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n  - `exception` is a value that is thrown using the throw statement.\n  - `reason` is a value that indicates why a promise was rejected.\n  - `settled` the final resting state of a promise, fulfilled or rejected.\n\n  A promise can be in one of three states: pending, fulfilled, or rejected.\n\n  Promises that are fulfilled have a fulfillment value and are in the fulfilled\n  state.  Promises that are rejected have a rejection reason and are in the\n  rejected state.  A fulfillment value is never a thenable.\n\n  Promises can also be said to *resolve* a value.  If this value is also a\n  promise, then the original promise's settled state will match the value's\n  settled state.  So a promise that *resolves* a promise that rejects will\n  itself reject, and a promise that *resolves* a promise that fulfills will\n  itself fulfill.\n\n\n  Basic Usage:\n  ------------\n\n  ```js\n  let promise = new Promise(function(resolve, reject) {\n    // on success\n    resolve(value);\n\n    // on failure\n    reject(reason);\n  });\n\n  promise.then(function(value) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Advanced Usage:\n  ---------------\n\n  Promises shine when abstracting away asynchronous interactions such as\n  `XMLHttpRequest`s.\n\n  ```js\n  function getJSON(url) {\n    return new Promise(function(resolve, reject){\n      let xhr = new XMLHttpRequest();\n\n      xhr.open('GET', url);\n      xhr.onreadystatechange = handler;\n      xhr.responseType = 'json';\n      xhr.setRequestHeader('Accept', 'application/json');\n      xhr.send();\n\n      function handler() {\n        if (this.readyState === this.DONE) {\n          if (this.status === 200) {\n            resolve(this.response);\n          } else {\n            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n          }\n        }\n      };\n    });\n  }\n\n  getJSON('/posts.json').then(function(json) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Unlike callbacks, promises are great composable primitives.\n\n  ```js\n  Promise.all([\n    getJSON('/posts'),\n    getJSON('/comments')\n  ]).then(function(values){\n    values[0] // => postsJSON\n    values[1] // => commentsJSON\n\n    return values;\n  });\n  ```\n\n  @class Promise\n  @param {Function} resolver\n  Useful for tooling.\n  @constructor\n*/\n\nvar Promise = function () {\n  function Promise(resolver) {\n    this[PROMISE_ID] = nextId();\n    this._result = this._state = undefined;\n    this._subscribers = [];\n\n    if (noop !== resolver) {\n      typeof resolver !== 'function' && needsResolver();\n      this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n    }\n  }\n\n  /**\n  The primary way of interacting with a promise is through its `then` method,\n  which registers callbacks to receive either a promise's eventual value or the\n  reason why the promise cannot be fulfilled.\n   ```js\n  findUser().then(function(user){\n    // user is available\n  }, function(reason){\n    // user is unavailable, and you are given the reason why\n  });\n  ```\n   Chaining\n  --------\n   The return value of `then` is itself a promise.  This second, 'downstream'\n  promise is resolved with the return value of the first promise's fulfillment\n  or rejection handler, or rejected if the handler throws an exception.\n   ```js\n  findUser().then(function (user) {\n    return user.name;\n  }, function (reason) {\n    return 'default name';\n  }).then(function (userName) {\n    // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n    // will be `'default name'`\n  });\n   findUser().then(function (user) {\n    throw new Error('Found user, but still unhappy');\n  }, function (reason) {\n    throw new Error('`findUser` rejected and we're unhappy');\n  }).then(function (value) {\n    // never reached\n  }, function (reason) {\n    // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n    // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n  });\n  ```\n  If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n   ```js\n  findUser().then(function (user) {\n    throw new PedagogicalException('Upstream error');\n  }).then(function (value) {\n    // never reached\n  }).then(function (value) {\n    // never reached\n  }, function (reason) {\n    // The `PedgagocialException` is propagated all the way down to here\n  });\n  ```\n   Assimilation\n  ------------\n   Sometimes the value you want to propagate to a downstream promise can only be\n  retrieved asynchronously. This can be achieved by returning a promise in the\n  fulfillment or rejection handler. The downstream promise will then be pending\n  until the returned promise is settled. This is called *assimilation*.\n   ```js\n  findUser().then(function (user) {\n    return findCommentsByAuthor(user);\n  }).then(function (comments) {\n    // The user's comments are now available\n  });\n  ```\n   If the assimliated promise rejects, then the downstream promise will also reject.\n   ```js\n  findUser().then(function (user) {\n    return findCommentsByAuthor(user);\n  }).then(function (comments) {\n    // If `findCommentsByAuthor` fulfills, we'll have the value here\n  }, function (reason) {\n    // If `findCommentsByAuthor` rejects, we'll have the reason here\n  });\n  ```\n   Simple Example\n  --------------\n   Synchronous Example\n   ```javascript\n  let result;\n   try {\n    result = findResult();\n    // success\n  } catch(reason) {\n    // failure\n  }\n  ```\n   Errback Example\n   ```js\n  findResult(function(result, err){\n    if (err) {\n      // failure\n    } else {\n      // success\n    }\n  });\n  ```\n   Promise Example;\n   ```javascript\n  findResult().then(function(result){\n    // success\n  }, function(reason){\n    // failure\n  });\n  ```\n   Advanced Example\n  --------------\n   Synchronous Example\n   ```javascript\n  let author, books;\n   try {\n    author = findAuthor();\n    books  = findBooksByAuthor(author);\n    // success\n  } catch(reason) {\n    // failure\n  }\n  ```\n   Errback Example\n   ```js\n   function foundBooks(books) {\n   }\n   function failure(reason) {\n   }\n   findAuthor(function(author, err){\n    if (err) {\n      failure(err);\n      // failure\n    } else {\n      try {\n        findBoooksByAuthor(author, function(books, err) {\n          if (err) {\n            failure(err);\n          } else {\n            try {\n              foundBooks(books);\n            } catch(reason) {\n              failure(reason);\n            }\n          }\n        });\n      } catch(error) {\n        failure(err);\n      }\n      // success\n    }\n  });\n  ```\n   Promise Example;\n   ```javascript\n  findAuthor().\n    then(findBooksByAuthor).\n    then(function(books){\n      // found books\n  }).catch(function(reason){\n    // something went wrong\n  });\n  ```\n   @method then\n  @param {Function} onFulfilled\n  @param {Function} onRejected\n  Useful for tooling.\n  @return {Promise}\n  */\n\n  /**\n  `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n  as the catch block of a try/catch statement.\n  ```js\n  function findAuthor(){\n  throw new Error('couldn't find that author');\n  }\n  // synchronous\n  try {\n  findAuthor();\n  } catch(reason) {\n  // something went wrong\n  }\n  // async with promises\n  findAuthor().catch(function(reason){\n  // something went wrong\n  });\n  ```\n  @method catch\n  @param {Function} onRejection\n  Useful for tooling.\n  @return {Promise}\n  */\n\n\n  Promise.prototype.catch = function _catch(onRejection) {\n    return this.then(null, onRejection);\n  };\n\n  /**\n    `finally` will be invoked regardless of the promise's fate just as native\n    try/catch/finally behaves\n  \n    Synchronous example:\n  \n    ```js\n    findAuthor() {\n      if (Math.random() > 0.5) {\n        throw new Error();\n      }\n      return new Author();\n    }\n  \n    try {\n      return findAuthor(); // succeed or fail\n    } catch(error) {\n      return findOtherAuther();\n    } finally {\n      // always runs\n      // doesn't affect the return value\n    }\n    ```\n  \n    Asynchronous example:\n  \n    ```js\n    findAuthor().catch(function(reason){\n      return findOtherAuther();\n    }).finally(function(){\n      // author was either found, or not\n    });\n    ```\n  \n    @method finally\n    @param {Function} callback\n    @return {Promise}\n  */\n\n\n  Promise.prototype.finally = function _finally(callback) {\n    var promise = this;\n    var constructor = promise.constructor;\n\n    if (isFunction(callback)) {\n      return promise.then(function (value) {\n        return constructor.resolve(callback()).then(function () {\n          return value;\n        });\n      }, function (reason) {\n        return constructor.resolve(callback()).then(function () {\n          throw reason;\n        });\n      });\n    }\n\n    return promise.then(callback, callback);\n  };\n\n  return Promise;\n}();\n\nPromise.prototype.then = then;\nexport default Promise;\nPromise.all = all;\nPromise.race = race;\nPromise.resolve = Resolve;\nPromise.reject = Reject;\nPromise._setScheduler = setScheduler;\nPromise._setAsap = setAsap;\nPromise._asap = asap;","/*global self*/\nimport Promise from './promise';\n\nexport default function polyfill() {\n  var local = void 0;\n\n  if (typeof global !== 'undefined') {\n    local = global;\n  } else if (typeof self !== 'undefined') {\n    local = self;\n  } else {\n    try {\n      local = Function('return this')();\n    } catch (e) {\n      throw new Error('polyfill failed because global object is unavailable in this environment');\n    }\n  }\n\n  var P = local.Promise;\n\n  if (P) {\n    var promiseToString = null;\n    try {\n      promiseToString = Object.prototype.toString.call(P.resolve());\n    } catch (e) {\n      // silently ignored\n    }\n\n    if (promiseToString === '[object Promise]' && !P.cast) {\n      return;\n    }\n  }\n\n  local.Promise = Promise;\n}","import Promise from './es6-promise/promise';\nimport polyfill from './es6-promise/polyfill';\n\n// Strange compat..\nPromise.polyfill = polyfill;\nPromise.Promise = Promise;\nexport default Promise;"],"names":["resolve","_resolve","then","originalThen","originalResolve","Promise","reject","_reject","Resolve","Reject"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACNO,SAAS,gBAAgB,CAAC,CAAC,EAAE;EAClC,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC;EACpB,OAAO,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,UAAU,CAAC,CAAC;CACjE;;AAED,AAAO,SAAS,UAAU,CAAC,CAAC,EAAE;EAC5B,OAAO,OAAO,CAAC,KAAK,UAAU,CAAC;CAChC;;AAED,AAEC;;AAED,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC;AACtB,IAAI,KAAK,CAAC,OAAO,EAAE;EACjB,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;CAC1B,MAAM;EACL,QAAQ,GAAG,UAAU,CAAC,EAAE;IACtB,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC;GAC/D,CAAC;CACH;;AAED,AAAO,IAAI,OAAO,GAAG,QAAQ;;ACtB7B,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,IAAI,SAAS,GAAG,KAAK,CAAC,CAAC;AACvB,IAAI,iBAAiB,GAAG,KAAK,CAAC,CAAC;;AAE/B,AAAO,IAAI,IAAI,GAAG,SAAS,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;EAC7C,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;EACtB,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;EACrB,GAAG,IAAI,CAAC,CAAC;EACT,IAAI,GAAG,KAAK,CAAC,EAAE;;;;IAIb,IAAI,iBAAiB,EAAE;MACrB,iBAAiB,CAAC,KAAK,CAAC,CAAC;KAC1B,MAAM;MACL,aAAa,EAAE,CAAC;KACjB;GACF;CACF,CAAC;;AAEF,AAAO,SAAS,YAAY,CAAC,UAAU,EAAE;EACvC,iBAAiB,GAAG,UAAU,CAAC;CAChC;;AAED,AAAO,SAAS,OAAO,CAAC,MAAM,EAAE;EAC9B,IAAI,GAAG,MAAM,CAAC;CACf;;AAED,IAAI,aAAa,GAAG,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AACvE,IAAI,aAAa,GAAG,aAAa,IAAI,EAAE,CAAC;AACxC,IAAI,uBAAuB,GAAG,aAAa,CAAC,gBAAgB,IAAI,aAAa,CAAC,sBAAsB,CAAC;AACrG,IAAI,MAAM,GAAG,OAAO,IAAI,KAAK,WAAW,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,kBAAkB,CAAC;;;AAG/H,IAAI,QAAQ,GAAG,OAAO,iBAAiB,KAAK,WAAW,IAAI,OAAO,aAAa,KAAK,WAAW,IAAI,OAAO,cAAc,KAAK,WAAW,CAAC;;;AAGzI,SAAS,WAAW,GAAG;;;EAGrB,OAAO,YAAY;IACjB,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;GAChC,CAAC;CACH;;;AAGD,SAAS,aAAa,GAAG;EACvB,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE;IACpC,OAAO,YAAY;MACjB,SAAS,CAAC,KAAK,CAAC,CAAC;KAClB,CAAC;GACH;;EAED,OAAO,aAAa,EAAE,CAAC;CACxB;;AAED,SAAS,mBAAmB,GAAG;EAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;EACnB,IAAI,QAAQ,GAAG,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC;EAClD,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;EACvC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;;EAEhD,OAAO,YAAY;IACjB,IAAI,CAAC,IAAI,GAAG,UAAU,GAAG,EAAE,UAAU,GAAG,CAAC,CAAC;GAC3C,CAAC;CACH;;;AAGD,SAAS,iBAAiB,GAAG;EAC3B,IAAI,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;EACnC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;EAChC,OAAO,YAAY;IACjB,OAAO,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;GACrC,CAAC;CACH;;AAED,SAAS,aAAa,GAAG;;;EAGvB,IAAI,gBAAgB,GAAG,UAAU,CAAC;EAClC,OAAO,YAAY;IACjB,OAAO,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;GACnC,CAAC;CACH;;AAED,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,SAAS,KAAK,GAAG;EACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE;IAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;IAEvB,QAAQ,CAAC,GAAG,CAAC,CAAC;;IAEd,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACrB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;GAC1B;;EAED,GAAG,GAAG,CAAC,CAAC;CACT;;AAED,SAAS,YAAY,GAAG;EACtB,IAAI;IACF,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,YAAY,CAAC;IAClD,OAAO,aAAa,EAAE,CAAC;GACxB,CAAC,OAAO,CAAC,EAAE;IACV,OAAO,aAAa,EAAE,CAAC;GACxB;CACF;;AAED,IAAI,aAAa,GAAG,KAAK,CAAC,CAAC;;AAE3B,IAAI,MAAM,EAAE;EACV,aAAa,GAAG,WAAW,EAAE,CAAC;CAC/B,MAAM,IAAI,uBAAuB,EAAE;EAClC,aAAa,GAAG,mBAAmB,EAAE,CAAC;CACvC,MAAM,IAAI,QAAQ,EAAE;EACnB,aAAa,GAAG,iBAAiB,EAAE,CAAC;CACrC,MAAM,IAAI,aAAa,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;EACvE,aAAa,GAAG,YAAY,EAAE,CAAC;CAChC,MAAM;EACL,aAAa,GAAG,aAAa,EAAE,CAAC;;;CACjC,DCtHc,SAAS,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE;EACvD,IAAI,MAAM,GAAG,IAAI,CAAC;;EAElB,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;;EAEvC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE;IACnC,WAAW,CAAC,KAAK,CAAC,CAAC;GACpB;;EAED,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;;EAG3B,IAAI,MAAM,EAAE;IACV,IAAI,QAAQ,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,YAAY;MACf,OAAO,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;KAChE,CAAC,CAAC;GACJ,MAAM;IACL,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;GACtD;;EAED,OAAO,KAAK,CAAC;;;CACd,DCxBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,AAAe,SAASA,SAAO,CAAC,MAAM,EAAE;;EAEtC,IAAI,WAAW,GAAG,IAAI,CAAC;;EAEvB,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW,EAAE;IAC9E,OAAO,MAAM,CAAC;GACf;;EAED,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;EACpCC,OAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EAC1B,OAAO,OAAO,CAAC;;;CAChB,DCrCM,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;AAEhE,SAAS,IAAI,GAAG,EAAE;;AAElB,IAAI,OAAO,GAAG,KAAK,CAAC,CAAC;AACrB,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,IAAI,QAAQ,GAAG,CAAC,CAAC;;AAEjB,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;CAClE;;AAED,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;CAC9E;;AAED,SAAS,OAAO,CAACC,OAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE;EAClE,IAAI;IACFA,OAAI,CAAC,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;GACxD,CAAC,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,CAAC;GACV;CACF;;AAED,SAAS,qBAAqB,CAAC,OAAO,EAAE,QAAQ,EAAEA,OAAI,EAAE;EACtD,IAAI,CAAC,UAAU,OAAO,EAAE;IACtB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,KAAK,GAAG,OAAO,CAACA,OAAI,EAAE,QAAQ,EAAE,UAAU,KAAK,EAAE;MACnD,IAAI,MAAM,EAAE;QACV,OAAO;OACR;MACD,MAAM,GAAG,IAAI,CAAC;MACd,IAAI,QAAQ,KAAK,KAAK,EAAE;QACtB,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACzB,MAAM;QACL,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACzB;KACF,EAAE,UAAU,MAAM,EAAE;MACnB,IAAI,MAAM,EAAE;QACV,OAAO;OACR;MACD,MAAM,GAAG,IAAI,CAAC;;MAEd,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KACzB,EAAE,UAAU,IAAI,OAAO,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAC,CAAC;;IAExD,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE;MACpB,MAAM,GAAG,IAAI,CAAC;MACd,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACxB;GACF,EAAE,OAAO,CAAC,CAAC;CACb;;AAED,SAAS,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE;EAC5C,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE;IACjC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;GACpC,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE;IACvC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;GACnC,MAAM;IACL,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE;MAC9C,OAAO,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KAChC,EAAE,UAAU,MAAM,EAAE;MACnB,OAAO,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KAChC,CAAC,CAAC;GACJ;CACF;;AAED,SAAS,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAEA,OAAI,EAAE;EACzD,IAAI,aAAa,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,IAAIA,OAAI,KAAKC,IAAY,IAAI,aAAa,CAAC,WAAW,CAAC,OAAO,KAAKC,SAAe,EAAE;IACvI,iBAAiB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;GAC3C,MAAM;IACL,IAAIF,OAAI,KAAK,SAAS,EAAE;MACtB,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KACjC,MAAM,IAAI,UAAU,CAACA,OAAI,CAAC,EAAE;MAC3B,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAEA,OAAI,CAAC,CAAC;KACrD,MAAM;MACL,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KACjC;GACF;CACF;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE;EAC/B,IAAI,OAAO,KAAK,KAAK,EAAE;IACrB,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;GACpC,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;IAClC,IAAIA,OAAI,GAAG,KAAK,CAAC,CAAC;IAClB,IAAI;MACFA,OAAI,GAAG,KAAK,CAAC,IAAI,CAAC;KACnB,CAAC,OAAO,KAAK,EAAE;MACd,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;MACvB,OAAO;KACR;IACD,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAEA,OAAI,CAAC,CAAC;GAC3C,MAAM;IACL,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACzB;CACF;;AAED,SAAS,gBAAgB,CAAC,OAAO,EAAE;EACjC,IAAI,OAAO,CAAC,QAAQ,EAAE;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;GACnC;;EAED,OAAO,CAAC,OAAO,CAAC,CAAC;CAClB;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE;EAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;IAC9B,OAAO;GACR;;EAED,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;EACxB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;;EAE3B,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;IACrC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;GACxB;CACF;;AAED,SAAS,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE;EAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;IAC9B,OAAO;GACR;EACD,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;EAC1B,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;;EAEzB,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;CACjC;;AAED,SAAS,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE;EAC5D,IAAI,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;EACvC,IAAI,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;;;EAGjC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;;EAEvB,YAAY,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;EAC7B,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,aAAa,CAAC;EACjD,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,WAAW,CAAC;;EAE9C,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE;IACjC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;GACvB;CACF;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE;EACxB,IAAI,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;EACvC,IAAI,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;;EAE7B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;IAC5B,OAAO;GACR;;EAED,IAAI,KAAK,GAAG,KAAK,CAAC;MACd,QAAQ,GAAG,KAAK,CAAC;MACjB,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;;EAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;IAC9C,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,QAAQ,GAAG,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;;IAEpC,IAAI,KAAK,EAAE;MACT,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;KAClD,MAAM;MACL,QAAQ,CAAC,MAAM,CAAC,CAAC;KAClB;GACF;;EAED,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;CACjC;;AAED,SAAS,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;EAC1D,IAAI,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC;MAClC,KAAK,GAAG,KAAK,CAAC;MACd,KAAK,GAAG,KAAK,CAAC;MACd,SAAS,GAAG,IAAI,CAAC;;EAErB,IAAI,WAAW,EAAE;IACf,IAAI;MACF,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;KAC1B,CAAC,OAAO,CAAC,EAAE;MACV,SAAS,GAAG,KAAK,CAAC;MAClB,KAAK,GAAG,CAAC,CAAC;KACX;;IAED,IAAI,OAAO,KAAK,KAAK,EAAE;MACrB,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;MACnC,OAAO;KACR;GACF,MAAM;IACL,KAAK,GAAG,MAAM,CAAC;GAChB;;EAED,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;;GAE/B,MAAM,IAAI,WAAW,IAAI,SAAS,EAAE;IACnC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACzB,MAAM,IAAI,SAAS,KAAK,KAAK,EAAE;IAC9B,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACxB,MAAM,IAAI,OAAO,KAAK,SAAS,EAAE;IAChC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACzB,MAAM,IAAI,OAAO,KAAK,QAAQ,EAAE;IAC/B,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACxB;CACF;;AAED,SAAS,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE;EAC5C,IAAI;IACF,QAAQ,CAAC,SAAS,cAAc,CAAC,KAAK,EAAE;MACtC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACzB,EAAE,SAAS,aAAa,CAAC,MAAM,EAAE;MAChC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KACzB,CAAC,CAAC;GACJ,CAAC,OAAO,CAAC,EAAE;IACV,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;GACpB;CACF;;AAED,IAAI,EAAE,GAAG,CAAC,CAAC;AACX,SAAS,MAAM,GAAG;EAChB,OAAO,EAAE,EAAE,CAAC;CACb;;AAED,SAAS,WAAW,CAAC,OAAO,EAAE;EAC5B,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;EAC3B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;EAC3B,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;EAC5B,OAAO,CAAC,YAAY,GAAG,EAAE,CAAC;CAC3B;;AChOD,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;CAC7D,AAAC;;AAEF,IAAI,UAAU,GAAG,YAAY;EAC3B,SAAS,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE;IACtC,IAAI,CAAC,oBAAoB,GAAG,WAAW,CAAC;IACxC,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;;IAErC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;MAC7B,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KAC3B;;IAED,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;MAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;MAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;;MAE/B,IAAI,CAAC,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;MAEtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACrB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;OACrC,MAAM;QACL,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;UACzB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;SACrC;OACF;KACF,MAAM;MACL,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;KACzC;GACF;;EAED,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,UAAU,CAAC,KAAK,EAAE;IAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;MAChE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KAC9B;GACF,CAAC;;EAEF,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE;IAC9D,IAAI,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC;IAClC,IAAIF,UAAO,GAAG,CAAC,CAAC,OAAO,CAAC;;;IAGxB,IAAIA,UAAO,KAAKI,SAAe,EAAE;MAC/B,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;MACnB,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;MACnB,IAAI,QAAQ,GAAG,KAAK,CAAC;MACrB,IAAI;QACF,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;OACpB,CAAC,OAAO,CAAC,EAAE;QACV,QAAQ,GAAG,IAAI,CAAC;QAChB,KAAK,GAAG,CAAC,CAAC;OACX;;MAED,IAAI,KAAK,KAAKD,IAAY,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE;QACtD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;OACjD,MAAM,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;OACzB,MAAM,IAAI,CAAC,KAAKE,SAAO,EAAE;QACxB,IAAI,OAAO,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,QAAQ,EAAE;UACZ,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SACxB,MAAM;UACL,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC5C;QACD,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;OAChC,MAAM;QACL,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,UAAUL,UAAO,EAAE;UAC1C,OAAOA,UAAO,CAAC,KAAK,CAAC,CAAC;SACvB,CAAC,EAAE,CAAC,CAAC,CAAC;OACR;KACF,MAAM;MACL,IAAI,CAAC,aAAa,CAACA,UAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;KACvC;GACF,CAAC;;EAEF,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE;IACrE,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;;;IAG3B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;MAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;;MAElB,IAAI,KAAK,KAAK,QAAQ,EAAE;QACtB,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACxB,MAAM;QACL,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;OACzB;KACF;;IAED,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;MACzB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;KAChC;GACF,CAAC;;EAEF,UAAU,CAAC,SAAS,CAAC,aAAa,GAAG,SAAS,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE;IACtE,IAAI,UAAU,GAAG,IAAI,CAAC;;IAEtB,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE;MAC7C,OAAO,UAAU,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;KACnD,EAAE,UAAU,MAAM,EAAE;MACnB,OAAO,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;KACnD,CAAC,CAAC;GACJ,CAAC;;EAEF,OAAO,UAAU,CAAC;CACnB,EAAE;;ACrHH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,AAAe,SAAS,GAAG,CAAC,OAAO,EAAE;EACnC,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC;;;CAC9C,DCjDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA,AAAe,SAAS,IAAI,CAAC,OAAO,EAAE;;EAEpC,IAAI,WAAW,GAAG,IAAI,CAAC;;EAEvB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;IACrB,OAAO,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE;MAC1C,OAAO,MAAM,CAAC,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC,CAAC;KACjE,CAAC,CAAC;GACJ,MAAM;IACL,OAAO,IAAI,WAAW,CAAC,UAAU,OAAO,EAAE,MAAM,EAAE;MAChD,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;MAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;QAC/B,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;OACvD;KACF,CAAC,CAAC;GACJ;;;CACF,DCjFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,AAAe,SAASM,QAAM,CAAC,MAAM,EAAE;;EAErC,IAAI,WAAW,GAAG,IAAI,CAAC;EACvB,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;EACpCC,MAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACzB,OAAO,OAAO,CAAC;;;CAChB,DC9BD,SAAS,aAAa,GAAG;EACvB,MAAM,IAAI,SAAS,CAAC,oFAAoF,CAAC,CAAC;CAC3G;;AAED,SAAS,QAAQ,GAAG;EAClB,MAAM,IAAI,SAAS,CAAC,uHAAuH,CAAC,CAAC;CAC9I;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0GD,IAAIF,SAAO,GAAG,YAAY;EACxB,SAAS,OAAO,CAAC,QAAQ,EAAE;IACzB,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IACvC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;;IAEvB,IAAI,IAAI,KAAK,QAAQ,EAAE;MACrB,OAAO,QAAQ,KAAK,UAAU,IAAI,aAAa,EAAE,CAAC;MAClD,IAAI,YAAY,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAE,CAAC;KAC1E;GACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4LD,OAAO,CAAC,SAAS,CAAC,KAAK,GAAG,SAAS,MAAM,CAAC,WAAW,EAAE;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;GACrC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CF,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,QAAQ,CAAC,QAAQ,EAAE;IACtD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;;IAEtC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE;MACxB,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,KAAK,EAAE;QACnC,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY;UACtD,OAAO,KAAK,CAAC;SACd,CAAC,CAAC;OACJ,EAAE,UAAU,MAAM,EAAE;QACnB,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY;UACtD,MAAM,MAAM,CAAC;SACd,CAAC,CAAC;OACJ,CAAC,CAAC;KACJ;;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;GACzC,CAAC;;EAEF,OAAO,OAAO,CAAC;CAChB,EAAE,CAAC;;AAEJA,SAAO,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC;AAC9B,AACAA,SAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAClBA,SAAO,CAAC,IAAI,GAAG,IAAI,CAAC;AACpBA,SAAO,CAAC,OAAO,GAAGG,SAAO,CAAC;AAC1BH,SAAO,CAAC,MAAM,GAAGI,QAAM,CAAC;AACxBJ,SAAO,CAAC,aAAa,GAAG,YAAY,CAAC;AACrCA,SAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;AAC3BA,SAAO,CAAC,KAAK,GAAG,IAAI;;AC5YpB;AACA,AAEe,SAAS,QAAQ,GAAG;EACjC,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC;;EAEnB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;IACjC,KAAK,GAAG,MAAM,CAAC;GAChB,MAAM,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;IACtC,KAAK,GAAG,IAAI,CAAC;GACd,MAAM;IACL,IAAI;MACF,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;KACnC,CAAC,OAAO,CAAC,EAAE;MACV,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;KAC7F;GACF;;EAED,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;;EAEtB,IAAI,CAAC,EAAE;IACL,IAAI,eAAe,GAAG,IAAI,CAAC;IAC3B,IAAI;MACF,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;KAC/D,CAAC,OAAO,CAAC,EAAE;;KAEX;;IAED,IAAI,eAAe,KAAK,kBAAkB,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;MACrD,OAAO;KACR;GACF;;EAED,KAAK,CAAC,OAAO,GAAGA,SAAO,CAAC;;;CACzB,DC/BD;AACAA,SAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC5BA,SAAO,CAAC,OAAO,GAAGA,SAAO,CAAC;;;;;;;;","file":"es6-promise.min.js"}
\ No newline at end of file
diff --git a/node_modules/es6-promise/es6-promise.d.ts b/node_modules/es6-promise/es6-promise.d.ts
deleted file mode 100644
index e4200df..0000000
--- a/node_modules/es6-promise/es6-promise.d.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-export interface Thenable <R> {
-  then <U> (onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => U | Thenable<U>): Thenable<U>;
-  then <U> (onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => void): Thenable<U>;
-}
-
-export class Promise <R> implements Thenable <R> {
-  /**
-   * If you call resolve in the body of the callback passed to the constructor,
-   * your promise is fulfilled with result object passed to resolve.
-   * If you call reject your promise is rejected with the object passed to resolve.
-   * For consistency and debugging (eg stack traces), obj should be an instanceof Error.
-   * Any errors thrown in the constructor callback will be implicitly passed to reject().
-   */
-  constructor (callback: (resolve : (value?: R | Thenable<R>) => void, reject: (error?: any) => void) => void);
-
-  /**
-   * onFulfilled is called when/if "promise" resolves. onRejected is called when/if "promise" rejects.
-   * Both are optional, if either/both are omitted the next onFulfilled/onRejected in the chain is called.
-   * Both callbacks have a single parameter , the fulfillment value or rejection reason.
-   * "then" returns a new promise equivalent to the value you return from onFulfilled/onRejected after being passed through Promise.resolve.
-   * If an error is thrown in the callback, the returned promise rejects with that error.
-   *
-   * @param onFulfilled called when/if "promise" resolves
-   * @param onRejected called when/if "promise" rejects
-   */
-  then <U> (onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => U | Thenable<U>): Promise<U>;
-  then <U> (onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => void): Promise<U>;
-
-  /**
-   * Sugar for promise.then(undefined, onRejected)
-   *
-   * @param onRejected called when/if "promise" rejects
-   */
-  catch <U> (onRejected?: (error: any) => U | Thenable<U>): Promise<U>;
-
-  /**
-   * onSettled is invoked when/if the "promise" settles (either rejects or fulfills).
-   * The returned promise is settled when the `Thenable` returned by `onFinally` settles;
-   * it is rejected if `onFinally` throws or rejects; otherwise it assumes the state of the
-   * original Promise.
-   *
-   * @param onFinally called when/if "promise" settles
-
-   */
-  finally (onFinally?: () => any | Thenable<any>): Promise<R>;
-
-  /**
-   * Make a new promise from the thenable.
-   * A thenable is promise-like in as far as it has a "then" method.
-   */
-  static resolve (): Promise<void>;
-  static resolve <R> (value: R | Thenable<R>): Promise<R>;
-
-  /**
-   * Make a promise that rejects to obj. For consistency and debugging (eg stack traces), obj should be an instanceof Error
-   */
-  static reject <R> (error: any): Promise<R>;
-
-  /**
-   * Make a promise that fulfills when every item in the array fulfills, and rejects if (and when) any item rejects.
-   * the array passed to all can be a mixture of promise-like objects and other objects.
-   * The fulfillment value is an array (in order) of fulfillment values. The rejection value is the first rejection value.
-   */
-  static all<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>, T6 | Thenable<T6>, T7 | Thenable<T7>, T8 | Thenable<T8>, T9 | Thenable<T9>, T10 | Thenable<T10>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>;
-  static all<T1, T2, T3, T4, T5, T6, T7, T8, T9>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>, T6 | Thenable<T6>, T7 | Thenable<T7>, T8 | Thenable<T8>, T9 | Thenable<T9>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>;
-  static all<T1, T2, T3, T4, T5, T6, T7, T8>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>, T6 | Thenable<T6>, T7 | Thenable<T7>, T8 | Thenable<T8>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8]>;
-  static all<T1, T2, T3, T4, T5, T6, T7>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>, T6 | Thenable<T6>, T7 | Thenable<T7>]): Promise<[T1, T2, T3, T4, T5, T6, T7]>;
-  static all<T1, T2, T3, T4, T5, T6>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>, T6 | Thenable<T6>]): Promise<[T1, T2, T3, T4, T5, T6]>;
-  static all<T1, T2, T3, T4, T5>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>]): Promise<[T1, T2, T3, T4, T5]>;
-  static all<T1, T2, T3, T4>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>]): Promise<[T1, T2, T3, T4]>;
-  static all<T1, T2, T3>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>]): Promise<[T1, T2, T3]>;
-  static all<T1, T2>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>]): Promise<[T1, T2]>;
-  static all<T1>(values: [T1 | Thenable<T1>]): Promise<[T1]>;
-  static all<TAll>(values: Array<TAll | Thenable<TAll>>): Promise<TAll[]>;
-
-  /**
-   * Make a Promise that fulfills when any item fulfills, and rejects if any item rejects.
-   */
-  static race <R> (promises: (R | Thenable<R>)[]): Promise<R>;
-}
-
-/**
- * The polyfill method will patch the global environment (in this case to the Promise name) when called.
- */
-export function polyfill (): void;
diff --git a/node_modules/es6-promise/lib/es6-promise.auto.js b/node_modules/es6-promise/lib/es6-promise.auto.js
deleted file mode 100644
index 7799786..0000000
--- a/node_modules/es6-promise/lib/es6-promise.auto.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import Promise from './es6-promise';
-Promise.polyfill();
-export default Promise;
diff --git a/node_modules/es6-promise/lib/es6-promise.js b/node_modules/es6-promise/lib/es6-promise.js
deleted file mode 100644
index 4f4d840..0000000
--- a/node_modules/es6-promise/lib/es6-promise.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import Promise from './es6-promise/promise';
-import polyfill from './es6-promise/polyfill';
-
-// Strange compat..
-Promise.polyfill = polyfill;
-Promise.Promise = Promise;
-export default Promise;
diff --git a/node_modules/es6-promise/lib/es6-promise/-internal.js b/node_modules/es6-promise/lib/es6-promise/-internal.js
deleted file mode 100644
index 6bd75a8..0000000
--- a/node_modules/es6-promise/lib/es6-promise/-internal.js
+++ /dev/null
@@ -1,243 +0,0 @@
-import {
-  objectOrFunction,
-  isFunction
-} from './utils';
-
-import {
-  asap
-} from './asap';
-
-import originalThen from './then';
-import originalResolve from './promise/resolve';
-
-export const PROMISE_ID = Math.random().toString(36).substring(2);
-
-function noop() {}
-
-const PENDING   = void 0;
-const FULFILLED = 1;
-const REJECTED  = 2;
-
-function selfFulfillment() {
-  return new TypeError("You cannot resolve a promise with itself");
-}
-
-function cannotReturnOwn() {
-  return new TypeError('A promises callback cannot return that same promise.');
-}
-
-function tryThen(then, value, fulfillmentHandler, rejectionHandler) {
-  try {
-    then.call(value, fulfillmentHandler, rejectionHandler);
-  } catch(e) {
-    return e;
-  }
-}
-
-function handleForeignThenable(promise, thenable, then) {
-   asap(promise => {
-    let sealed = false;
-    let error = tryThen(then, thenable, value => {
-      if (sealed) { return; }
-      sealed = true;
-      if (thenable !== value) {
-        resolve(promise, value);
-      } else {
-        fulfill(promise, value);
-      }
-    }, reason => {
-      if (sealed) { return; }
-      sealed = true;
-
-      reject(promise, reason);
-    }, 'Settle: ' + (promise._label || ' unknown promise'));
-
-    if (!sealed && error) {
-      sealed = true;
-      reject(promise, error);
-    }
-  }, promise);
-}
-
-function handleOwnThenable(promise, thenable) {
-  if (thenable._state === FULFILLED) {
-    fulfill(promise, thenable._result);
-  } else if (thenable._state === REJECTED) {
-    reject(promise, thenable._result);
-  } else {
-    subscribe(thenable, undefined, value  => resolve(promise, value),
-                                   reason => reject(promise, reason))
-  }
-}
-
-function handleMaybeThenable(promise, maybeThenable, then) {
-  if (maybeThenable.constructor === promise.constructor &&
-      then === originalThen &&
-      maybeThenable.constructor.resolve === originalResolve) {
-    handleOwnThenable(promise, maybeThenable);
-  } else {
-    if (then === undefined) {
-      fulfill(promise, maybeThenable);
-    } else if (isFunction(then)) {
-      handleForeignThenable(promise, maybeThenable, then);
-    } else {
-      fulfill(promise, maybeThenable);
-    }
-  }
-}
-
-function resolve(promise, value) {
-  if (promise === value) {
-    reject(promise, selfFulfillment());
-  } else if (objectOrFunction(value)) {
-    let then;
-    try {
-      then = value.then;
-    } catch (error) {
-      reject(promise, error);
-      return;
-    }
-    handleMaybeThenable(promise, value, then);
-  } else {
-    fulfill(promise, value);
-  }
-}
-
-function publishRejection(promise) {
-  if (promise._onerror) {
-    promise._onerror(promise._result);
-  }
-
-  publish(promise);
-}
-
-function fulfill(promise, value) {
-  if (promise._state !== PENDING) { return; }
-
-  promise._result = value;
-  promise._state = FULFILLED;
-
-  if (promise._subscribers.length !== 0) {
-    asap(publish, promise);
-  }
-}
-
-function reject(promise, reason) {
-  if (promise._state !== PENDING) { return; }
-  promise._state = REJECTED;
-  promise._result = reason;
-
-  asap(publishRejection, promise);
-}
-
-function subscribe(parent, child, onFulfillment, onRejection) {
-  let { _subscribers } = parent;
-  let { length } = _subscribers;
-
-  parent._onerror = null;
-
-  _subscribers[length] = child;
-  _subscribers[length + FULFILLED] = onFulfillment;
-  _subscribers[length + REJECTED]  = onRejection;
-
-  if (length === 0 && parent._state) {
-    asap(publish, parent);
-  }
-}
-
-function publish(promise) {
-  let subscribers = promise._subscribers;
-  let settled = promise._state;
-
-  if (subscribers.length === 0) { return; }
-
-  let child, callback, detail = promise._result;
-
-  for (let i = 0; i < subscribers.length; i += 3) {
-    child = subscribers[i];
-    callback = subscribers[i + settled];
-
-    if (child) {
-      invokeCallback(settled, child, callback, detail);
-    } else {
-      callback(detail);
-    }
-  }
-
-  promise._subscribers.length = 0;
-}
-
-function invokeCallback(settled, promise, callback, detail) {
-  let hasCallback = isFunction(callback),
-      value, error, succeeded = true;
-
-  if (hasCallback) {
-    try {
-      value = callback(detail);
-    } catch (e) {
-      succeeded = false;
-      error = e;
-    }
-
-    if (promise === value) {
-      reject(promise, cannotReturnOwn());
-      return;
-    }
-  } else {
-    value = detail;
-  }
-
-  if (promise._state !== PENDING) {
-    // noop
-  } else if (hasCallback && succeeded) {
-    resolve(promise, value);
-  } else if (succeeded === false) {
-    reject(promise, error);
-  } else if (settled === FULFILLED) {
-    fulfill(promise, value);
-  } else if (settled === REJECTED) {
-    reject(promise, value);
-  }
-}
-
-function initializePromise(promise, resolver) {
-  try {
-    resolver(function resolvePromise(value){
-      resolve(promise, value);
-    }, function rejectPromise(reason) {
-      reject(promise, reason);
-    });
-  } catch(e) {
-    reject(promise, e);
-  }
-}
-
-let id = 0;
-function nextId() {
-  return id++;
-}
-
-function makePromise(promise) {
-  promise[PROMISE_ID] = id++;
-  promise._state = undefined;
-  promise._result = undefined;
-  promise._subscribers = [];
-}
-
-export {
-  nextId,
-  makePromise,
-  noop,
-  resolve,
-  reject,
-  fulfill,
-  subscribe,
-  publish,
-  publishRejection,
-  initializePromise,
-  invokeCallback,
-  FULFILLED,
-  REJECTED,
-  PENDING,
-  handleMaybeThenable
-};
diff --git a/node_modules/es6-promise/lib/es6-promise/asap.js b/node_modules/es6-promise/lib/es6-promise/asap.js
deleted file mode 100644
index 0483201..0000000
--- a/node_modules/es6-promise/lib/es6-promise/asap.js
+++ /dev/null
@@ -1,119 +0,0 @@
-let len = 0;
-let vertxNext;
-let customSchedulerFn;
-
-export var asap = function asap(callback, arg) {
-  queue[len] = callback;
-  queue[len + 1] = arg;
-  len += 2;
-  if (len === 2) {
-    // If len is 2, that means that we need to schedule an async flush.
-    // If additional callbacks are queued before the queue is flushed, they
-    // will be processed by this flush that we are scheduling.
-    if (customSchedulerFn) {
-      customSchedulerFn(flush);
-    } else {
-      scheduleFlush();
-    }
-  }
-}
-
-export function setScheduler(scheduleFn) {
-  customSchedulerFn = scheduleFn;
-}
-
-export function setAsap(asapFn) {
-  asap = asapFn;
-}
-
-const browserWindow = (typeof window !== 'undefined') ? window : undefined;
-const browserGlobal = browserWindow || {};
-const BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
-const isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
-
-// test for web worker but not in IE10
-const isWorker = typeof Uint8ClampedArray !== 'undefined' &&
-  typeof importScripts !== 'undefined' &&
-  typeof MessageChannel !== 'undefined';
-
-// node
-function useNextTick() {
-  // node version 0.10.x displays a deprecation warning when nextTick is used recursively
-  // see https://github.com/cujojs/when/issues/410 for details
-  return () => process.nextTick(flush);
-}
-
-// vertx
-function useVertxTimer() {
-  if (typeof vertxNext !== 'undefined') {
-    return function() {
-      vertxNext(flush);
-    };
-  }
-
-  return useSetTimeout();
-}
-
-function useMutationObserver() {
-  let iterations = 0;
-  const observer = new BrowserMutationObserver(flush);
-  const node = document.createTextNode('');
-  observer.observe(node, { characterData: true });
-
-  return () => {
-    node.data = (iterations = ++iterations % 2);
-  };
-}
-
-// web worker
-function useMessageChannel() {
-  const channel = new MessageChannel();
-  channel.port1.onmessage = flush;
-  return () => channel.port2.postMessage(0);
-}
-
-function useSetTimeout() {
-  // Store setTimeout reference so es6-promise will be unaffected by
-  // other code modifying setTimeout (like sinon.useFakeTimers())
-  const globalSetTimeout = setTimeout;
-  return () => globalSetTimeout(flush, 1);
-}
-
-const queue = new Array(1000);
-function flush() {
-  for (let i = 0; i < len; i+=2) {
-    let callback = queue[i];
-    let arg = queue[i+1];
-
-    callback(arg);
-
-    queue[i] = undefined;
-    queue[i+1] = undefined;
-  }
-
-  len = 0;
-}
-
-function attemptVertx() {
-  try {
-    const vertx = Function('return this')().require('vertx');
-    vertxNext = vertx.runOnLoop || vertx.runOnContext;
-    return useVertxTimer();
-  } catch(e) {
-    return useSetTimeout();
-  }
-}
-
-let scheduleFlush;
-// Decide what async method to use to triggering processing of queued callbacks:
-if (isNode) {
-  scheduleFlush = useNextTick();
-} else if (BrowserMutationObserver) {
-  scheduleFlush = useMutationObserver();
-} else if (isWorker) {
-  scheduleFlush = useMessageChannel();
-} else if (browserWindow === undefined && typeof require === 'function') {
-  scheduleFlush = attemptVertx();
-} else {
-  scheduleFlush = useSetTimeout();
-}
diff --git a/node_modules/es6-promise/lib/es6-promise/enumerator.js b/node_modules/es6-promise/lib/es6-promise/enumerator.js
deleted file mode 100644
index be2e093..0000000
--- a/node_modules/es6-promise/lib/es6-promise/enumerator.js
+++ /dev/null
@@ -1,124 +0,0 @@
-import {
-  isArray,
-  isMaybeThenable
-} from './utils';
-import {
-  noop,
-  reject,
-  fulfill,
-  subscribe,
-  FULFILLED,
-  REJECTED,
-  PENDING,
-  handleMaybeThenable
-} from './-internal';
-
-import then from './then';
-import Promise from './promise';
-import originalResolve from './promise/resolve';
-import originalThen from './then';
-import { makePromise, PROMISE_ID } from './-internal';
-
-function validationError() {
-  return new Error('Array Methods must be provided an Array');
-};
-
-export default class Enumerator {
-  constructor(Constructor, input) {
-    this._instanceConstructor = Constructor;
-    this.promise = new Constructor(noop);
-
-    if (!this.promise[PROMISE_ID]) {
-      makePromise(this.promise);
-    }
-
-    if (isArray(input)) {
-      this.length     = input.length;
-      this._remaining = input.length;
-
-      this._result = new Array(this.length);
-
-      if (this.length === 0) {
-        fulfill(this.promise, this._result);
-      } else {
-        this.length = this.length || 0;
-        this._enumerate(input);
-        if (this._remaining === 0) {
-          fulfill(this.promise, this._result);
-        }
-      }
-    } else {
-      reject(this.promise, validationError());
-    }
-  }
-  _enumerate(input) {
-    for (let i = 0; this._state === PENDING && i < input.length; i++) {
-      this._eachEntry(input[i], i);
-    }
-  }
-
-  _eachEntry(entry, i) {
-    let c = this._instanceConstructor;
-    let { resolve } = c;
-
-    if (resolve === originalResolve) {
-      let then;
-      let error;
-      let didError = false;
-      try {
-        then = entry.then;
-      } catch (e) {
-        didError = true;
-        error = e;
-      }
-
-      if (then === originalThen &&
-        entry._state !== PENDING) {
-        this._settledAt(entry._state, i, entry._result);
-      } else if (typeof then !== 'function') {
-        this._remaining--;
-        this._result[i] = entry;
-      } else if (c === Promise) {
-        let promise = new c(noop);
-        if (didError) {
-          reject(promise, error);
-        } else {
-          handleMaybeThenable(promise, entry, then);
-        }
-        this._willSettleAt(promise, i);
-      } else {
-        this._willSettleAt(new c(resolve => resolve(entry)), i);
-      }
-    } else {
-      this._willSettleAt(resolve(entry), i);
-    }
-  }
-
-  _settledAt(state, i, value) {
-    let { promise } = this;
-
-    if (promise._state === PENDING) {
-      this._remaining--;
-
-      if (state === REJECTED) {
-        reject(promise, value);
-      } else {
-        this._result[i] = value;
-      }
-    }
-
-    if (this._remaining === 0) {
-      fulfill(promise, this._result);
-    }
-  }
-
-  _willSettleAt(promise, i) {
-    let enumerator = this;
-
-    subscribe(
-      promise, undefined,
-      value => enumerator._settledAt(FULFILLED, i, value),
-      reason => enumerator._settledAt(REJECTED, i, reason)
-    );
-  }
-};
diff --git a/node_modules/es6-promise/lib/es6-promise/polyfill.js b/node_modules/es6-promise/lib/es6-promise/polyfill.js
deleted file mode 100644
index 30db73c..0000000
--- a/node_modules/es6-promise/lib/es6-promise/polyfill.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*global self*/
-import Promise from './promise';
-
-export default function polyfill() {
-  let local;
-
-  if (typeof global !== 'undefined') {
-    local = global;
-  } else if (typeof self !== 'undefined') {
-    local = self;
-  } else {
-    try {
-      local = Function('return this')();
-    } catch (e) {
-      throw new Error('polyfill failed because global object is unavailable in this environment');
-    }
-  }
-
-  let P = local.Promise;
-
-  if (P) {
-    var promiseToString = null;
-    try {
-      promiseToString = Object.prototype.toString.call(P.resolve());
-    } catch(e) {
-      // silently ignored
-    }
-
-    if (promiseToString === '[object Promise]' && !P.cast){
-      return;
-    }
-  }
-
-  local.Promise = Promise;
-}
diff --git a/node_modules/es6-promise/lib/es6-promise/promise.js b/node_modules/es6-promise/lib/es6-promise/promise.js
deleted file mode 100644
index ae17036..0000000
--- a/node_modules/es6-promise/lib/es6-promise/promise.js
+++ /dev/null
@@ -1,431 +0,0 @@
-import {
-  isFunction
-} from './utils';
-import {
-  noop,
-  nextId,
-  PROMISE_ID,
-  initializePromise
-} from './-internal';
-import {
-  asap,
-  setAsap,
-  setScheduler
-} from './asap';
-
-import all from './promise/all';
-import race from './promise/race';
-import Resolve from './promise/resolve';
-import Reject from './promise/reject';
-import then from './then';
-
-function needsResolver() {
-  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
-}
-
-function needsNew() {
-  throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
-}
-
-/**
-  Promise objects represent the eventual result of an asynchronous operation. The
-  primary way of interacting with a promise is through its `then` method, which
-  registers callbacks to receive either a promise's eventual value or the reason
-  why the promise cannot be fulfilled.
-
-  Terminology
-  -----------
-
-  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
-  - `thenable` is an object or function that defines a `then` method.
-  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
-  - `exception` is a value that is thrown using the throw statement.
-  - `reason` is a value that indicates why a promise was rejected.
-  - `settled` the final resting state of a promise, fulfilled or rejected.
-
-  A promise can be in one of three states: pending, fulfilled, or rejected.
-
-  Promises that are fulfilled have a fulfillment value and are in the fulfilled
-  state.  Promises that are rejected have a rejection reason and are in the
-  rejected state.  A fulfillment value is never a thenable.
-
-  Promises can also be said to *resolve* a value.  If this value is also a
-  promise, then the original promise's settled state will match the value's
-  settled state.  So a promise that *resolves* a promise that rejects will
-  itself reject, and a promise that *resolves* a promise that fulfills will
-  itself fulfill.
-
-
-  Basic Usage:
-  ------------
-
-  ```js
-  let promise = new Promise(function(resolve, reject) {
-    // on success
-    resolve(value);
-
-    // on failure
-    reject(reason);
-  });
-
-  promise.then(function(value) {
-    // on fulfillment
-  }, function(reason) {
-    // on rejection
-  });
-  ```
-
-  Advanced Usage:
-  ---------------
-
-  Promises shine when abstracting away asynchronous interactions such as
-  `XMLHttpRequest`s.
-
-  ```js
-  function getJSON(url) {
-    return new Promise(function(resolve, reject){
-      let xhr = new XMLHttpRequest();
-
-      xhr.open('GET', url);
-      xhr.onreadystatechange = handler;
-      xhr.responseType = 'json';
-      xhr.setRequestHeader('Accept', 'application/json');
-      xhr.send();
-
-      function handler() {
-        if (this.readyState === this.DONE) {
-          if (this.status === 200) {
-            resolve(this.response);
-          } else {
-            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
-          }
-        }
-      };
-    });
-  }
-
-  getJSON('/posts.json').then(function(json) {
-    // on fulfillment
-  }, function(reason) {
-    // on rejection
-  });
-  ```
-
-  Unlike callbacks, promises are great composable primitives.
-
-  ```js
-  Promise.all([
-    getJSON('/posts'),
-    getJSON('/comments')
-  ]).then(function(values){
-    values[0] // => postsJSON
-    values[1] // => commentsJSON
-
-    return values;
-  });
-  ```
-
-  @class Promise
-  @param {Function} resolver
-  Useful for tooling.
-  @constructor
-*/
-
-class Promise {
-  constructor(resolver) {
-    this[PROMISE_ID] = nextId();
-    this._result = this._state = undefined;
-    this._subscribers = [];
-
-    if (noop !== resolver) {
-      typeof resolver !== 'function' && needsResolver();
-      this instanceof Promise ? initializePromise(this, resolver) : needsNew();
-    }
-  }
-
-  /**
-  The primary way of interacting with a promise is through its `then` method,
-  which registers callbacks to receive either a promise's eventual value or the
-  reason why the promise cannot be fulfilled.
-
-  ```js
-  findUser().then(function(user){
-    // user is available
-  }, function(reason){
-    // user is unavailable, and you are given the reason why
-  });
-  ```
-
-  Chaining
-  --------
-
-  The return value of `then` is itself a promise.  This second, 'downstream'
-  promise is resolved with the return value of the first promise's fulfillment
-  or rejection handler, or rejected if the handler throws an exception.
-
-  ```js
-  findUser().then(function (user) {
-    return user.name;
-  }, function (reason) {
-    return 'default name';
-  }).then(function (userName) {
-    // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
-    // will be `'default name'`
-  });
-
-  findUser().then(function (user) {
-    throw new Error('Found user, but still unhappy');
-  }, function (reason) {
-    throw new Error('`findUser` rejected and we're unhappy');
-  }).then(function (value) {
-    // never reached
-  }, function (reason) {
-    // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
-    // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
-  });
-  ```
-  If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
-
-  ```js
-  findUser().then(function (user) {
-    throw new PedagogicalException('Upstream error');
-  }).then(function (value) {
-    // never reached
-  }).then(function (value) {
-    // never reached
-  }, function (reason) {
-    // The `PedgagocialException` is propagated all the way down to here
-  });
-  ```
-
-  Assimilation
-  ------------
-
-  Sometimes the value you want to propagate to a downstream promise can only be
-  retrieved asynchronously. This can be achieved by returning a promise in the
-  fulfillment or rejection handler. The downstream promise will then be pending
-  until the returned promise is settled. This is called *assimilation*.
-
-  ```js
-  findUser().then(function (user) {
-    return findCommentsByAuthor(user);
-  }).then(function (comments) {
-    // The user's comments are now available
-  });
-  ```
-
-  If the assimliated promise rejects, then the downstream promise will also reject.
-
-  ```js
-  findUser().then(function (user) {
-    return findCommentsByAuthor(user);
-  }).then(function (comments) {
-    // If `findCommentsByAuthor` fulfills, we'll have the value here
-  }, function (reason) {
-    // If `findCommentsByAuthor` rejects, we'll have the reason here
-  });
-  ```
-
-  Simple Example
-  --------------
-
-  Synchronous Example
-
-  ```javascript
-  let result;
-
-  try {
-    result = findResult();
-    // success
-  } catch(reason) {
-    // failure
-  }
-  ```
-
-  Errback Example
-
-  ```js
-  findResult(function(result, err){
-    if (err) {
-      // failure
-    } else {
-      // success
-    }
-  });
-  ```
-
-  Promise Example;
-
-  ```javascript
-  findResult().then(function(result){
-    // success
-  }, function(reason){
-    // failure
-  });
-  ```
-
-  Advanced Example
-  --------------
-
-  Synchronous Example
-
-  ```javascript
-  let author, books;
-
-  try {
-    author = findAuthor();
-    books  = findBooksByAuthor(author);
-    // success
-  } catch(reason) {
-    // failure
-  }
-  ```
-
-  Errback Example
-
-  ```js
-
-  function foundBooks(books) {
-
-  }
-
-  function failure(reason) {
-
-  }
-
-  findAuthor(function(author, err){
-    if (err) {
-      failure(err);
-      // failure
-    } else {
-      try {
-        findBoooksByAuthor(author, function(books, err) {
-          if (err) {
-            failure(err);
-          } else {
-            try {
-              foundBooks(books);
-            } catch(reason) {
-              failure(reason);
-            }
-          }
-        });
-      } catch(error) {
-        failure(err);
-      }
-      // success
-    }
-  });
-  ```
-
-  Promise Example;
-
-  ```javascript
-  findAuthor().
-    then(findBooksByAuthor).
-    then(function(books){
-      // found books
-  }).catch(function(reason){
-    // something went wrong
-  });
-  ```
-
-  @method then
-  @param {Function} onFulfilled
-  @param {Function} onRejected
-  Useful for tooling.
-  @return {Promise}
-  */
-
-    /**
-  `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
-  as the catch block of a try/catch statement.
-
-  ```js
-  function findAuthor(){
-    throw new Error('couldn't find that author');
-  }
-
-  // synchronous
-  try {
-    findAuthor();
-  } catch(reason) {
-    // something went wrong
-  }
-
-  // async with promises
-  findAuthor().catch(function(reason){
-    // something went wrong
-  });
-  ```
-
-  @method catch
-  @param {Function} onRejection
-  Useful for tooling.
-  @return {Promise}
-  */
-  catch(onRejection) {
-    return this.then(null, onRejection);
-  }
-
-/**
-  `finally` will be invoked regardless of the promise's fate just as native
-  try/catch/finally behaves
-
-  Synchronous example:
-
-  ```js
-  findAuthor() {
-    if (Math.random() > 0.5) {
-      throw new Error();
-    }
-    return new Author();
-  }
-
-  try {
-    return findAuthor(); // succeed or fail
-  } catch(error) {
-    return findOtherAuther();
-  } finally {
-    // always runs
-    // doesn't affect the return value
-  }
-  ```
-
-  Asynchronous example:
-
-  ```js
-  findAuthor().catch(function(reason){
-    return findOtherAuther();
-  }).finally(function(){
-    // author was either found, or not
-  });
-  ```
-
-  @method finally
-  @param {Function} callback
-  @return {Promise}
-*/
-  finally(callback) {
-    let promise = this;
-    let constructor = promise.constructor;
-
-    if ( isFunction(callback) ) {
-      return promise.then(value => constructor.resolve(callback()).then(() => value),
-                         reason => constructor.resolve(callback()).then(() => { throw reason; }));
-    }
-
-    return promise.then(callback, callback);
-  }
-}
-
-Promise.prototype.then = then;
-export default Promise;
-Promise.all = all;
-Promise.race = race;
-Promise.resolve = Resolve;
-Promise.reject = Reject;
-Promise._setScheduler = setScheduler;
-Promise._setAsap = setAsap;
-Promise._asap = asap;
-
diff --git a/node_modules/es6-promise/lib/es6-promise/promise/all.js b/node_modules/es6-promise/lib/es6-promise/promise/all.js
deleted file mode 100644
index 9ca3c06..0000000
--- a/node_modules/es6-promise/lib/es6-promise/promise/all.js
+++ /dev/null
@@ -1,52 +0,0 @@
-import Enumerator from '../enumerator';
-
-/**
-  `Promise.all` accepts an array of promises, and returns a new promise which
-  is fulfilled with an array of fulfillment values for the passed promises, or
-  rejected with the reason of the first passed promise to be rejected. It casts all
-  elements of the passed iterable to promises as it runs this algorithm.
-
-  Example:
-
-  ```javascript
-  let promise1 = resolve(1);
-  let promise2 = resolve(2);
-  let promise3 = resolve(3);
-  let promises = [ promise1, promise2, promise3 ];
-
-  Promise.all(promises).then(function(array){
-    // The array here would be [ 1, 2, 3 ];
-  });
-  ```
-
-  If any of the `promises` given to `all` are rejected, the first promise
-  that is rejected will be given as an argument to the returned promises's
-  rejection handler. For example:
-
-  Example:
-
-  ```javascript
-  let promise1 = resolve(1);
-  let promise2 = reject(new Error("2"));
-  let promise3 = reject(new Error("3"));
-  let promises = [ promise1, promise2, promise3 ];
-
-  Promise.all(promises).then(function(array){
-    // Code here never runs because there are rejected promises!
-  }, function(error) {
-    // error.message === "2"
-  });
-  ```
-
-  @method all
-  @static
-  @param {Array} entries array of promises
-  @param {String} label optional string for labeling the promise.
-  Useful for tooling.
-  @return {Promise} promise that is fulfilled when all `promises` have been
-  fulfilled, or rejected if any of them become rejected.
-  @static
-*/
-export default function all(entries) {
-  return new Enumerator(this, entries).promise;
-}
diff --git a/node_modules/es6-promise/lib/es6-promise/promise/race.js b/node_modules/es6-promise/lib/es6-promise/promise/race.js
deleted file mode 100644
index 166dc82..0000000
--- a/node_modules/es6-promise/lib/es6-promise/promise/race.js
+++ /dev/null
@@ -1,84 +0,0 @@
-import {
-  isArray
-} from "../utils";
-
-/**
-  `Promise.race` returns a new promise which is settled in the same way as the
-  first passed promise to settle.
-
-  Example:
-
-  ```javascript
-  let promise1 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      resolve('promise 1');
-    }, 200);
-  });
-
-  let promise2 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      resolve('promise 2');
-    }, 100);
-  });
-
-  Promise.race([promise1, promise2]).then(function(result){
-    // result === 'promise 2' because it was resolved before promise1
-    // was resolved.
-  });
-  ```
-
-  `Promise.race` is deterministic in that only the state of the first
-  settled promise matters. For example, even if other promises given to the
-  `promises` array argument are resolved, but the first settled promise has
-  become rejected before the other promises became fulfilled, the returned
-  promise will become rejected:
-
-  ```javascript
-  let promise1 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      resolve('promise 1');
-    }, 200);
-  });
-
-  let promise2 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      reject(new Error('promise 2'));
-    }, 100);
-  });
-
-  Promise.race([promise1, promise2]).then(function(result){
-    // Code here never runs
-  }, function(reason){
-    // reason.message === 'promise 2' because promise 2 became rejected before
-    // promise 1 became fulfilled
-  });
-  ```
-
-  An example real-world use case is implementing timeouts:
-
-  ```javascript
-  Promise.race([ajax('foo.json'), timeout(5000)])
-  ```
-
-  @method race
-  @static
-  @param {Array} promises array of promises to observe
-  Useful for tooling.
-  @return {Promise} a promise which settles in the same way as the first passed
-  promise to settle.
-*/
-export default function race(entries) {
-  /*jshint validthis:true */
-  let Constructor = this;
-
-  if (!isArray(entries)) {
-    return new Constructor((_, reject) => reject(new TypeError('You must pass an array to race.')));
-  } else {
-    return new Constructor((resolve, reject) => {
-      let length = entries.length;
-      for (let i = 0; i < length; i++) {
-        Constructor.resolve(entries[i]).then(resolve, reject);
-      }
-    });
-  }
-}
diff --git a/node_modules/es6-promise/lib/es6-promise/promise/reject.js b/node_modules/es6-promise/lib/es6-promise/promise/reject.js
deleted file mode 100644
index cd55faa..0000000
--- a/node_modules/es6-promise/lib/es6-promise/promise/reject.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import {
-  noop,
-  reject as _reject
-} from '../-internal';
-
-/**
-  `Promise.reject` returns a promise rejected with the passed `reason`.
-  It is shorthand for the following:
-
-  ```javascript
-  let promise = new Promise(function(resolve, reject){
-    reject(new Error('WHOOPS'));
-  });
-
-  promise.then(function(value){
-    // Code here doesn't run because the promise is rejected!
-  }, function(reason){
-    // reason.message === 'WHOOPS'
-  });
-  ```
-
-  Instead of writing the above, your code now simply becomes the following:
-
-  ```javascript
-  let promise = Promise.reject(new Error('WHOOPS'));
-
-  promise.then(function(value){
-    // Code here doesn't run because the promise is rejected!
-  }, function(reason){
-    // reason.message === 'WHOOPS'
-  });
-  ```
-
-  @method reject
-  @static
-  @param {Any} reason value that the returned promise will be rejected with.
-  Useful for tooling.
-  @return {Promise} a promise rejected with the given `reason`.
-*/
-export default function reject(reason) {
-  /*jshint validthis:true */
-  let Constructor = this;
-  let promise = new Constructor(noop);
-  _reject(promise, reason);
-  return promise;
-}
diff --git a/node_modules/es6-promise/lib/es6-promise/promise/resolve.js b/node_modules/es6-promise/lib/es6-promise/promise/resolve.js
deleted file mode 100644
index f4642b6..0000000
--- a/node_modules/es6-promise/lib/es6-promise/promise/resolve.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import {
-  noop,
-  resolve as _resolve
-} from '../-internal';
-
-/**
-  `Promise.resolve` returns a promise that will become resolved with the
-  passed `value`. It is shorthand for the following:
-
-  ```javascript
-  let promise = new Promise(function(resolve, reject){
-    resolve(1);
-  });
-
-  promise.then(function(value){
-    // value === 1
-  });
-  ```
-
-  Instead of writing the above, your code now simply becomes the following:
-
-  ```javascript
-  let promise = Promise.resolve(1);
-
-  promise.then(function(value){
-    // value === 1
-  });
-  ```
-
-  @method resolve
-  @static
-  @param {Any} value value that the returned promise will be resolved with
-  Useful for tooling.
-  @return {Promise} a promise that will become fulfilled with the given
-  `value`
-*/
-export default function resolve(object) {
-  /*jshint validthis:true */
-  let Constructor = this;
-
-  if (object && typeof object === 'object' && object.constructor === Constructor) {
-    return object;
-  }
-
-  let promise = new Constructor(noop);
-  _resolve(promise, object);
-  return promise;
-}
diff --git a/node_modules/es6-promise/lib/es6-promise/then.js b/node_modules/es6-promise/lib/es6-promise/then.js
deleted file mode 100644
index b2b79f0..0000000
--- a/node_modules/es6-promise/lib/es6-promise/then.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import {
-  invokeCallback,
-  subscribe,
-  FULFILLED,
-  REJECTED,
-  noop,
-  makePromise,
-  PROMISE_ID
-} from './-internal';
-
-import { asap } from './asap';
-
-export default function then(onFulfillment, onRejection) {
-  const parent = this;
-
-  const child = new this.constructor(noop);
-
-  if (child[PROMISE_ID] === undefined) {
-    makePromise(child);
-  }
-
-  const { _state } = parent;
-
-  if (_state) {
-    const callback = arguments[_state - 1];
-    asap(() => invokeCallback(_state, child, callback, parent._result));
-  } else {
-    subscribe(parent, child, onFulfillment, onRejection);
-  }
-
-  return child;
-}
diff --git a/node_modules/es6-promise/lib/es6-promise/utils.js b/node_modules/es6-promise/lib/es6-promise/utils.js
deleted file mode 100644
index 72545c5..0000000
--- a/node_modules/es6-promise/lib/es6-promise/utils.js
+++ /dev/null
@@ -1,21 +0,0 @@
-export function objectOrFunction(x) {
-  let type = typeof x;
-  return x !== null && (type === 'object' || type === 'function');
-}
-
-export function isFunction(x) {
-  return typeof x === 'function';
-}
-
-export function isMaybeThenable(x) {
-  return x !== null && typeof x === 'object';
-}
-
-let _isArray;
-if (Array.isArray) {
-  _isArray = Array.isArray;
-} else {
-  _isArray = x => Object.prototype.toString.call(x) === '[object Array]';
-}
-
-export const isArray = _isArray;
diff --git a/node_modules/es6-promise/package.json b/node_modules/es6-promise/package.json
deleted file mode 100644
index 7a28702..0000000
--- a/node_modules/es6-promise/package.json
+++ /dev/null
@@ -1,78 +0,0 @@
-{
-  "author": "Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)",
-  "browser": {
-    "vertx": false
-  },
-  "bugs": {
-    "url": "https://github.com/stefanpenner/es6-promise/issues"
-  },
-  "dependencies": {},
-  "description": "A lightweight library that provides tools for organizing asynchronous code",
-  "devDependencies": {
-    "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
-    "babel-plugin-transform-es2015-block-scoping": "^6.24.1",
-    "babel-plugin-transform-es2015-classes": "^6.24.1",
-    "babel-plugin-transform-es2015-computed-properties": "^6.24.1",
-    "babel-plugin-transform-es2015-constants": "^6.1.4",
-    "babel-plugin-transform-es2015-destructuring": "^6.23.0",
-    "babel-plugin-transform-es2015-parameters": "^6.24.1",
-    "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1",
-    "babel-plugin-transform-es2015-spread": "^6.22.0",
-    "babel-plugin-transform-es2015-template-literals": "^6.22.0",
-    "babel6-plugin-strip-class-callcheck": "^6.0.0",
-    "broccoli-babel-transpiler": "^6.0.0",
-    "broccoli-concat": "^3.1.0",
-    "broccoli-merge-trees": "^2.0.0",
-    "broccoli-rollup": "^2.0.0",
-    "broccoli-stew": "^1.5.0",
-    "broccoli-uglify-js": "^0.2.0",
-    "broccoli-watchify": "^1.0.1",
-    "ember-cli": "2.18.0-beta.2",
-    "ember-cli-dependency-checker": "^2.1.0",
-    "git-repo-version": "1.0.1",
-    "json3": "^3.3.2",
-    "mocha": "^4.0.1",
-    "promises-aplus-tests-phantom": "^2.1.0-revise"
-  },
-  "directories": {
-    "lib": "lib"
-  },
-  "files": [
-    "dist",
-    "lib",
-    "es6-promise.d.ts",
-    "auto.js",
-    "!dist/test"
-  ],
-  "homepage": "https://github.com/stefanpenner/es6-promise",
-  "jsdelivr": "dist/es6-promise.auto.min.js",
-  "keywords": [
-    "futures",
-    "polyfill",
-    "promise",
-    "promises"
-  ],
-  "license": "MIT",
-  "main": "dist/es6-promise.js",
-  "name": "es6-promise",
-  "namespace": "es6-promise",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/stefanpenner/es6-promise.git"
-  },
-  "scripts": {
-    "build": "ember build --environment production",
-    "prepublishOnly": "ember build --environment production",
-    "start": "ember s",
-    "test": "ember test",
-    "test:browser": "ember test --launch PhantomJS",
-    "test:node": "ember test --launch Mocha",
-    "test:server": "ember test --server"
-  },
-  "spm": {
-    "main": "dist/es6-promise.js"
-  },
-  "typings": "es6-promise.d.ts",
-  "unpkg": "dist/es6-promise.auto.min.js",
-  "version": "4.2.8"
-}
\ No newline at end of file
diff --git a/node_modules/es6-promisify/README.md b/node_modules/es6-promisify/README.md
deleted file mode 100644
index 4141cc8..0000000
--- a/node_modules/es6-promisify/README.md
+++ /dev/null
@@ -1,89 +0,0 @@
-[![Travis CI](https://travis-ci.org/digitaldesignlabs/es6-promisify.svg)](https://travis-ci.org/digitaldesignlabs/es6-promisify)
-
-# es6-promisify
-
-Converts callback-based functions to Promise-based functions.
-
-## Install
-
-Install with [npm](https://npmjs.org/package/es6-promisify)
-
-```bash
-npm install --save es6-promisify
-```
-
-## Example
-
-```js
-"use strict";
-
-// Declare variables
-const promisify = require("es6-promisify");
-const fs = require("fs");
-
-// Convert the stat function
-const stat = promisify(fs.stat);
-
-// Now usable as a promise!
-stat("example.txt").then(function (stats) {
-    console.log("Got stats", stats);
-}).catch(function (err) {
-    console.error("Yikes!", err);
-});
-```
-
-## Promisify methods
-```js
-"use strict";
-
-// Declare variables
-const promisify = require("es6-promisify");
-const redis = require("redis").createClient(6379, "localhost");
-
-// Create a promise-based version of send_command
-const client = promisify(redis.send_command, redis);
-
-// Send commands to redis and get a promise back
-client("ping").then(function (pong) {
-    console.log("Got", pong);
-}).catch(function (err) {
-    console.error("Unexpected error", err);
-}).then(function () {
-    redis.quit();
-});
-```
-
-## Handle callback multiple arguments
-```js
-"use strict";
-
-// Declare functions
-function test(cb) {
-    return cb(undefined, 1, 2, 3);
-}
-
-// Declare variables
-const promisify = require("es6-promisify");
-
-// Create promise-based version of test
-const single = promisify(test);
-const multi = promisify(test, {multiArgs: true});
-
-// Discards additional arguments
-single().then(function (result) {
-    console.log(result); // 1
-});
-
-// Returns all arguments as an array
-multi().then(function (result) {
-    console.log(result); // [1, 2, 3]
-});
-```
-
-### Tests
-Test with nodeunit
-```bash
-$ npm test
-```
-
-Published under the [MIT License](http://opensource.org/licenses/MIT).
diff --git a/node_modules/es6-promisify/dist/promise.js b/node_modules/es6-promisify/dist/promise.js
deleted file mode 100644
index 2fe5c61..0000000
--- a/node_modules/es6-promisify/dist/promise.js
+++ /dev/null
@@ -1,73 +0,0 @@
-"use strict";
-
-/* global self, window, module, global, require */
-module.exports = function () {
-
-    "use strict";
-
-    var globalObject = void 0;
-
-    function isFunction(x) {
-        return typeof x === "function";
-    }
-
-    // Seek the global object
-    if (global !== undefined) {
-        globalObject = global;
-    } else if (window !== undefined && window.document) {
-        globalObject = window;
-    } else {
-        globalObject = self;
-    }
-
-    // Test for any native promise implementation, and if that
-    // implementation appears to conform to the specificaton.
-    // This code mostly nicked from the es6-promise module polyfill
-    // and then fooled with.
-    var hasPromiseSupport = function () {
-
-        // No promise object at all, and it's a non-starter
-        if (!globalObject.hasOwnProperty("Promise")) {
-            return false;
-        }
-
-        // There is a Promise object. Does it conform to the spec?
-        var P = globalObject.Promise;
-
-        // Some of these methods are missing from
-        // Firefox/Chrome experimental implementations
-        if (!P.hasOwnProperty("resolve") || !P.hasOwnProperty("reject")) {
-            return false;
-        }
-
-        if (!P.hasOwnProperty("all") || !P.hasOwnProperty("race")) {
-            return false;
-        }
-
-        // Older version of the spec had a resolver object
-        // as the arg rather than a function
-        return function () {
-
-            var resolve = void 0;
-
-            var p = new globalObject.Promise(function (r) {
-                resolve = r;
-            });
-
-            if (p) {
-                return isFunction(resolve);
-            }
-
-            return false;
-        }();
-    }();
-
-    // Export the native Promise implementation if it
-    // looks like it matches the spec
-    if (hasPromiseSupport) {
-        return globalObject.Promise;
-    }
-
-    //  Otherwise, return the es6-promise polyfill by @jaffathecake.
-    return require("es6-promise").Promise;
-}();
\ No newline at end of file
diff --git a/node_modules/es6-promisify/dist/promisify.js b/node_modules/es6-promisify/dist/promisify.js
deleted file mode 100644
index ce38041..0000000
--- a/node_modules/es6-promisify/dist/promisify.js
+++ /dev/null
@@ -1,85 +0,0 @@
-"use strict";
-
-/* global module, require */
-module.exports = function () {
-
-    "use strict";
-
-    // Get a promise object. This may be native, or it may be polyfilled
-
-    var ES6Promise = require("./promise.js");
-
-    /**
-     * thatLooksLikeAPromiseToMe()
-     *
-     * Duck-types a promise.
-     *
-     * @param {object} o
-     * @return {bool} True if this resembles a promise
-     */
-    function thatLooksLikeAPromiseToMe(o) {
-        return o && typeof o.then === "function" && typeof o.catch === "function";
-    }
-
-    /**
-     * promisify()
-     *
-     * Transforms callback-based function -- func(arg1, arg2 .. argN, callback) -- into
-     * an ES6-compatible Promise. Promisify provides a default callback of the form (error, result)
-     * and rejects when `error` is truthy. You can also supply settings object as the second argument.
-     *
-     * @param {function} original - The function to promisify
-     * @param {object} settings - Settings object
-     * @param {object} settings.thisArg - A `this` context to use. If not set, assume `settings` _is_ `thisArg`
-     * @param {bool} settings.multiArgs - Should multiple arguments be returned as an array?
-     * @return {function} A promisified version of `original`
-     */
-    return function promisify(original, settings) {
-
-        return function () {
-            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
-                args[_key] = arguments[_key];
-            }
-
-            var returnMultipleArguments = settings && settings.multiArgs;
-
-            var target = void 0;
-            if (settings && settings.thisArg) {
-                target = settings.thisArg;
-            } else if (settings) {
-                target = settings;
-            }
-
-            // Return the promisified function
-            return new ES6Promise(function (resolve, reject) {
-
-                // Append the callback bound to the context
-                args.push(function callback(err) {
-
-                    if (err) {
-                        return reject(err);
-                    }
-
-                    for (var _len2 = arguments.length, values = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
-                        values[_key2 - 1] = arguments[_key2];
-                    }
-
-                    if (false === !!returnMultipleArguments) {
-                        return resolve(values[0]);
-                    }
-
-                    resolve(values);
-                });
-
-                // Call the function
-                var response = original.apply(target, args);
-
-                // If it looks like original already returns a promise,
-                // then just resolve with that promise. Hopefully, the callback function we added will just be ignored.
-                if (thatLooksLikeAPromiseToMe(response)) {
-                    resolve(response);
-                }
-            });
-        };
-    };
-}();
\ No newline at end of file
diff --git a/node_modules/es6-promisify/package.json b/node_modules/es6-promisify/package.json
deleted file mode 100644
index 60111be..0000000
--- a/node_modules/es6-promisify/package.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-  "author": "Mike Hall <mikehall314@gmail.com>",
-  "bugs": "http://github.com/digitaldesignlabs/es6-promisify/issues",
-  "dependencies": {
-    "es6-promise": "^4.0.3"
-  },
-  "description": "Converts callback-based functions to ES6 Promises",
-  "devDependencies": {
-    "babel-preset-es2015": "^6.9.0",
-    "eslint": "^2.13.1",
-    "gulp": "^3.9.1",
-    "gulp-babel": "^6.1.2",
-    "nodeunit": "^0.10.0"
-  },
-  "files": [
-    "dist/promisify.js",
-    "dist/promise.js"
-  ],
-  "greenkeeper": {
-    "ignore": [
-      "eslint"
-    ]
-  },
-  "keywords": [
-    "promises",
-    "es6",
-    "promisify"
-  ],
-  "license": "MIT",
-  "main": "dist/promisify.js",
-  "name": "es6-promisify",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/digitaldesignlabs/es6-promisify.git"
-  },
-  "scripts": {
-    "pretest": "./node_modules/eslint/bin/eslint.js ./lib/*.js ./tests/*.js",
-    "test": "gulp && nodeunit tests"
-  },
-  "version": "5.0.0"
-}
\ No newline at end of file
diff --git a/node_modules/extract-zip/.eslintrc.typescript.js b/node_modules/extract-zip/.eslintrc.typescript.js
new file mode 100644
index 0000000..702934e
--- /dev/null
+++ b/node_modules/extract-zip/.eslintrc.typescript.js
@@ -0,0 +1,16 @@
+const { eslintConfig } = require('./package.json')
+
+eslintConfig.parser = '@typescript-eslint/parser'
+eslintConfig.extends.push(
+  'plugin:@typescript-eslint/eslint-recommended',
+  'plugin:@typescript-eslint/recommended'
+)
+
+eslintConfig.rules = {
+  'node/no-unsupported-features/es-syntax': 'off',
+  'comma-dangle': ['error', 'only-multiline'],
+  semi: ['error', 'always'],
+  'space-before-function-paren': ['error', 'never']
+}
+
+module.exports = eslintConfig
diff --git a/node_modules/extract-zip/.travis.yml b/node_modules/extract-zip/.travis.yml
deleted file mode 100644
index 2e470e0..0000000
--- a/node_modules/extract-zip/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-sudo: false
-language: node_js
-node_js:
-  - '0.12'
-  - 'iojs'
-  - '4'
-  - '6'
-  - '8'
-  - '10'
diff --git a/node_modules/extract-zip/CONTRIBUTING.md b/node_modules/extract-zip/CONTRIBUTING.md
deleted file mode 100644
index eea6b39..0000000
--- a/node_modules/extract-zip/CONTRIBUTING.md
+++ /dev/null
@@ -1 +0,0 @@
-Before potentially wasting your time by making major, opinionated changes to this codebase please feel free to open a discussion repos in the Issues section of the repository. Outline your proposed idea and seek feedback from the maintainer first before implementing major features.
\ No newline at end of file
diff --git a/node_modules/extract-zip/cli.js b/node_modules/extract-zip/cli.js
index 76c337d..b594016 100755
--- a/node_modules/extract-zip/cli.js
+++ b/node_modules/extract-zip/cli.js
@@ -1,5 +1,7 @@
 #!/usr/bin/env node
 
+/* eslint-disable no-process-exit */
+
 var extract = require('./')
 
 var args = process.argv.slice(2)
@@ -10,11 +12,8 @@
   process.exit(1)
 }
 
-extract(source, {dir: dest}, function (err, results) {
-  if (err) {
+extract(source, { dir: dest })
+  .catch(function (err) {
     console.error('error!', err)
     process.exit(1)
-  } else {
-    process.exit(0)
-  }
-})
+  })
diff --git a/node_modules/extract-zip/index.d.ts b/node_modules/extract-zip/index.d.ts
new file mode 100644
index 0000000..6dbcc80
--- /dev/null
+++ b/node_modules/extract-zip/index.d.ts
@@ -0,0 +1,21 @@
+// Based on the type definitions for extract-zip 1.6
+// Definitions by: Mizunashi Mana <https://github.com/mizunashi-mana>
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/e69b58e/types/extract-zip/index.d.ts
+
+import { Entry, ZipFile } from 'yauzl';
+
+declare namespace extract {
+    interface Options {
+        dir: string;
+        defaultDirMode?: number;
+        defaultFileMode?: number;
+        onEntry?: (entry: Entry, zipfile: ZipFile) => void;
+    }
+}
+
+declare function extract(
+  zipPath: string,
+  opts: extract.Options,
+): Promise<void>;
+
+export = extract;
diff --git a/node_modules/extract-zip/index.js b/node_modules/extract-zip/index.js
index 682d401..f38d5a1 100644
--- a/node_modules/extract-zip/index.js
+++ b/node_modules/extract-zip/index.js
@@ -1,211 +1,176 @@
-var fs = require('fs')
-var path = require('path')
-var yauzl = require('yauzl')
-var mkdirp = require('mkdirp')
-var concat = require('concat-stream')
-var debug = require('debug')('extract-zip')
+const debug = require('debug')('extract-zip')
+// eslint-disable-next-line node/no-unsupported-features/node-builtins
+const { createWriteStream, promises: fs } = require('fs')
+const getStream = require('get-stream')
+const path = require('path')
+const { promisify } = require('util')
+const stream = require('stream')
+const yauzl = require('yauzl')
 
-module.exports = function (zipPath, opts, cb) {
-  debug('creating target directory', opts.dir)
+const openZip = promisify(yauzl.open)
+const pipeline = promisify(stream.pipeline)
 
-  if (path.isAbsolute(opts.dir) === false) {
-    return cb(new Error('Target directory is expected to be absolute'))
+class Extractor {
+  constructor (zipPath, opts) {
+    this.zipPath = zipPath
+    this.opts = opts
   }
 
-  mkdirp(opts.dir, function (err) {
-    if (err) return cb(err)
+  async extract () {
+    debug('opening', this.zipPath, 'with opts', this.opts)
 
-    fs.realpath(opts.dir, function (err, canonicalDir) {
-      if (err) return cb(err)
+    this.zipfile = await openZip(this.zipPath, { lazyEntries: true })
+    this.canceled = false
 
-      opts.dir = canonicalDir
-
-      openZip(opts)
-    })
-  })
-
-  function openZip () {
-    debug('opening', zipPath, 'with opts', opts)
-
-    yauzl.open(zipPath, {lazyEntries: true}, function (err, zipfile) {
-      if (err) return cb(err)
-
-      var cancelled = false
-
-      zipfile.on('error', function (err) {
-        if (err) {
-          cancelled = true
-          return cb(err)
-        }
+    return new Promise((resolve, reject) => {
+      this.zipfile.on('error', err => {
+        this.canceled = true
+        reject(err)
       })
-      zipfile.readEntry()
+      this.zipfile.readEntry()
 
-      zipfile.on('close', function () {
-        if (!cancelled) {
+      this.zipfile.on('close', () => {
+        if (!this.canceled) {
           debug('zip extraction complete')
-          cb()
+          resolve()
         }
       })
 
-      zipfile.on('entry', function (entry) {
-        if (cancelled) {
-          debug('skipping entry', entry.fileName, {cancelled: cancelled})
+      this.zipfile.on('entry', async entry => {
+        /* istanbul ignore if */
+        if (this.canceled) {
+          debug('skipping entry', entry.fileName, { cancelled: this.canceled })
           return
         }
 
         debug('zipfile entry', entry.fileName)
 
-        if (/^__MACOSX\//.test(entry.fileName)) {
-          // dir name starts with __MACOSX/
-          zipfile.readEntry()
+        if (entry.fileName.startsWith('__MACOSX/')) {
+          this.zipfile.readEntry()
           return
         }
 
-        var destDir = path.dirname(path.join(opts.dir, entry.fileName))
+        const destDir = path.dirname(path.join(this.opts.dir, entry.fileName))
 
-        mkdirp(destDir, function (err) {
-          if (err) {
-            cancelled = true
-            zipfile.close()
-            return cb(err)
+        try {
+          await fs.mkdir(destDir, { recursive: true })
+
+          const canonicalDestDir = await fs.realpath(destDir)
+          const relativeDestDir = path.relative(this.opts.dir, canonicalDestDir)
+
+          if (relativeDestDir.split(path.sep).includes('..')) {
+            throw new Error(`Out of bound path "${canonicalDestDir}" found while processing file ${entry.fileName}`)
           }
 
-          fs.realpath(destDir, function (err, canonicalDestDir) {
-            if (err) {
-              cancelled = true
-              zipfile.close()
-              return cb(err)
-            }
-
-            var relativeDestDir = path.relative(opts.dir, canonicalDestDir)
-
-            if (relativeDestDir.split(path.sep).indexOf('..') !== -1) {
-              cancelled = true
-              zipfile.close()
-              return cb(new Error('Out of bound path "' + canonicalDestDir + '" found while processing file ' + entry.fileName))
-            }
-
-            extractEntry(entry, function (err) {
-              // if any extraction fails then abort everything
-              if (err) {
-                cancelled = true
-                zipfile.close()
-                return cb(err)
-              }
-              debug('finished processing', entry.fileName)
-              zipfile.readEntry()
-            })
-          })
-        })
+          await this.extractEntry(entry)
+          debug('finished processing', entry.fileName)
+          this.zipfile.readEntry()
+        } catch (err) {
+          this.canceled = true
+          this.zipfile.close()
+          reject(err)
+        }
       })
-
-      function extractEntry (entry, done) {
-        if (cancelled) {
-          debug('skipping entry extraction', entry.fileName, {cancelled: cancelled})
-          return setImmediate(done)
-        }
-
-        if (opts.onEntry) {
-          opts.onEntry(entry, zipfile)
-        }
-
-        var dest = path.join(opts.dir, entry.fileName)
-
-        // convert external file attr int into a fs stat mode int
-        var mode = (entry.externalFileAttributes >> 16) & 0xFFFF
-        // check if it's a symlink or dir (using stat mode constants)
-        var IFMT = 61440
-        var IFDIR = 16384
-        var IFLNK = 40960
-        var symlink = (mode & IFMT) === IFLNK
-        var isDir = (mode & IFMT) === IFDIR
-
-        // Failsafe, borrowed from jsZip
-        if (!isDir && entry.fileName.slice(-1) === '/') {
-          isDir = true
-        }
-
-        // check for windows weird way of specifying a directory
-        // https://github.com/maxogden/extract-zip/issues/13#issuecomment-154494566
-        var madeBy = entry.versionMadeBy >> 8
-        if (!isDir) isDir = (madeBy === 0 && entry.externalFileAttributes === 16)
-
-        // if no mode then default to default modes
-        if (mode === 0) {
-          if (isDir) {
-            if (opts.defaultDirMode) mode = parseInt(opts.defaultDirMode, 10)
-            if (!mode) mode = 493 // Default to 0755
-          } else {
-            if (opts.defaultFileMode) mode = parseInt(opts.defaultFileMode, 10)
-            if (!mode) mode = 420 // Default to 0644
-          }
-        }
-
-        debug('extracting entry', { filename: entry.fileName, isDir: isDir, isSymlink: symlink })
-
-        // reverse umask first (~)
-        var umask = ~process.umask()
-        // & with processes umask to override invalid perms
-        var procMode = mode & umask
-
-        // always ensure folders are created
-        var destDir = dest
-        if (!isDir) destDir = path.dirname(dest)
-
-        debug('mkdirp', {dir: destDir})
-        mkdirp(destDir, function (err) {
-          if (err) {
-            debug('mkdirp error', destDir, {error: err})
-            cancelled = true
-            return done(err)
-          }
-
-          if (isDir) return done()
-
-          debug('opening read stream', dest)
-          zipfile.openReadStream(entry, function (err, readStream) {
-            if (err) {
-              debug('openReadStream error', err)
-              cancelled = true
-              return done(err)
-            }
-
-            readStream.on('error', function (err) {
-              console.log('read err', err)
-            })
-
-            if (symlink) writeSymlink()
-            else writeStream()
-
-            function writeStream () {
-              var writeStream = fs.createWriteStream(dest, {mode: procMode})
-              readStream.pipe(writeStream)
-
-              writeStream.on('finish', function () {
-                done()
-              })
-
-              writeStream.on('error', function (err) {
-                debug('write error', {error: err})
-                cancelled = true
-                return done(err)
-              })
-            }
-
-            // AFAICT the content of the symlink file itself is the symlink target filename string
-            function writeSymlink () {
-              readStream.pipe(concat(function (data) {
-                var link = data.toString()
-                debug('creating symlink', link, dest)
-                fs.symlink(link, dest, function (err) {
-                  if (err) cancelled = true
-                  done(err)
-                })
-              }))
-            }
-          })
-        })
-      }
     })
   }
+
+  async extractEntry (entry) {
+    /* istanbul ignore if */
+    if (this.canceled) {
+      debug('skipping entry extraction', entry.fileName, { cancelled: this.canceled })
+      return
+    }
+
+    if (this.opts.onEntry) {
+      this.opts.onEntry(entry, this.zipfile)
+    }
+
+    const dest = path.join(this.opts.dir, entry.fileName)
+
+    // convert external file attr int into a fs stat mode int
+    const mode = (entry.externalFileAttributes >> 16) & 0xFFFF
+    // check if it's a symlink or dir (using stat mode constants)
+    const IFMT = 61440
+    const IFDIR = 16384
+    const IFLNK = 40960
+    const symlink = (mode & IFMT) === IFLNK
+    let isDir = (mode & IFMT) === IFDIR
+
+    // Failsafe, borrowed from jsZip
+    if (!isDir && entry.fileName.endsWith('/')) {
+      isDir = true
+    }
+
+    // check for windows weird way of specifying a directory
+    // https://github.com/maxogden/extract-zip/issues/13#issuecomment-154494566
+    const madeBy = entry.versionMadeBy >> 8
+    if (!isDir) isDir = (madeBy === 0 && entry.externalFileAttributes === 16)
+
+    debug('extracting entry', { filename: entry.fileName, isDir: isDir, isSymlink: symlink })
+
+    // reverse umask first (~)
+    const umask = ~process.umask()
+    // & with processes umask to override invalid perms
+    const procMode = this.getExtractedMode(mode, isDir) & umask
+
+    // always ensure folders are created
+    const destDir = isDir ? dest : path.dirname(dest)
+
+    const mkdirOptions = { recursive: true }
+    if (isDir) {
+      mkdirOptions.mode = procMode
+    }
+    debug('mkdir', { dir: destDir, ...mkdirOptions })
+    await fs.mkdir(destDir, mkdirOptions)
+    if (isDir) return
+
+    debug('opening read stream', dest)
+    const readStream = await promisify(this.zipfile.openReadStream.bind(this.zipfile))(entry)
+
+    if (symlink) {
+      const link = await getStream(readStream)
+      debug('creating symlink', link, dest)
+      await fs.symlink(link, dest)
+    } else {
+      await pipeline(readStream, createWriteStream(dest, { mode: procMode }))
+    }
+  }
+
+  getExtractedMode (entryMode, isDir) {
+    let mode = entryMode
+    // Set defaults, if necessary
+    if (mode === 0) {
+      if (isDir) {
+        if (this.opts.defaultDirMode) {
+          mode = parseInt(this.opts.defaultDirMode, 10)
+        }
+
+        if (!mode) {
+          mode = 0o755
+        }
+      } else {
+        if (this.opts.defaultFileMode) {
+          mode = parseInt(this.opts.defaultFileMode, 10)
+        }
+
+        if (!mode) {
+          mode = 0o644
+        }
+      }
+    }
+
+    return mode
+  }
+}
+
+module.exports = async function (zipPath, opts) {
+  debug('creating target directory', opts.dir)
+
+  if (!path.isAbsolute(opts.dir)) {
+    throw new Error('Target directory is expected to be absolute')
+  }
+
+  await fs.mkdir(opts.dir, { recursive: true })
+  opts.dir = await fs.realpath(opts.dir)
+  return new Extractor(zipPath, opts).extract()
 }
diff --git a/node_modules/extract-zip/node_modules/debug/.coveralls.yml b/node_modules/extract-zip/node_modules/debug/.coveralls.yml
deleted file mode 100644
index 20a7068..0000000
--- a/node_modules/extract-zip/node_modules/debug/.coveralls.yml
+++ /dev/null
@@ -1 +0,0 @@
-repo_token: SIAeZjKYlHK74rbcFvNHMUzjRiMpflxve
diff --git a/node_modules/extract-zip/node_modules/debug/.eslintrc b/node_modules/extract-zip/node_modules/debug/.eslintrc
deleted file mode 100644
index 8a37ae2..0000000
--- a/node_modules/extract-zip/node_modules/debug/.eslintrc
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "env": {
-    "browser": true,
-    "node": true
-  },
-  "rules": {
-    "no-console": 0,
-    "no-empty": [1, { "allowEmptyCatch": true }]
-  },
-  "extends": "eslint:recommended"
-}
diff --git a/node_modules/extract-zip/node_modules/debug/.npmignore b/node_modules/extract-zip/node_modules/debug/.npmignore
deleted file mode 100644
index 5f60eec..0000000
--- a/node_modules/extract-zip/node_modules/debug/.npmignore
+++ /dev/null
@@ -1,9 +0,0 @@
-support
-test
-examples
-example
-*.sock
-dist
-yarn.lock
-coverage
-bower.json
diff --git a/node_modules/extract-zip/node_modules/debug/.travis.yml b/node_modules/extract-zip/node_modules/debug/.travis.yml
deleted file mode 100644
index 6c6090c..0000000
--- a/node_modules/extract-zip/node_modules/debug/.travis.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-language: node_js
-node_js:
-  - "6"
-  - "5"
-  - "4"
-
-install:
-  - make node_modules
-
-script:
-  - make lint
-  - make test
-  - make coveralls
diff --git a/node_modules/extract-zip/node_modules/debug/CHANGELOG.md b/node_modules/extract-zip/node_modules/debug/CHANGELOG.md
deleted file mode 100644
index eadaa18..0000000
--- a/node_modules/extract-zip/node_modules/debug/CHANGELOG.md
+++ /dev/null
@@ -1,362 +0,0 @@
-
-2.6.9 / 2017-09-22
-==================
-
-  * remove ReDoS regexp in %o formatter (#504)
-
-2.6.8 / 2017-05-18
-==================
-
-  * Fix: Check for undefined on browser globals (#462, @marbemac)
-
-2.6.7 / 2017-05-16
-==================
-
-  * Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom)
-  * Fix: Inline extend function in node implementation (#452, @dougwilson)
-  * Docs: Fix typo (#455, @msasad)
-
-2.6.5 / 2017-04-27
-==================
-  
-  * Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek)
-  * Misc: clean up browser reference checks (#447, @thebigredgeek)
-  * Misc: add npm-debug.log to .gitignore (@thebigredgeek)
-
-
-2.6.4 / 2017-04-20
-==================
-
-  * Fix: bug that would occure if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo)
-  * Chore: ignore bower.json in npm installations. (#437, @joaovieira)
-  * Misc: update "ms" to v0.7.3 (@tootallnate)
-
-2.6.3 / 2017-03-13
-==================
-
-  * Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts)
-  * Docs: Changelog fix (@thebigredgeek)
-
-2.6.2 / 2017-03-10
-==================
-
-  * Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin)
-  * Docs: Add backers and sponsors from Open Collective (#422, @piamancini)
-  * Docs: Add Slackin invite badge (@tootallnate)
-
-2.6.1 / 2017-02-10
-==================
-
-  * Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error
-  * Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0)
-  * Fix: IE8 "Expected identifier" error (#414, @vgoma)
-  * Fix: Namespaces would not disable once enabled (#409, @musikov)
-
-2.6.0 / 2016-12-28
-==================
-
-  * Fix: added better null pointer checks for browser useColors (@thebigredgeek)
-  * Improvement: removed explicit `window.debug` export (#404, @tootallnate)
-  * Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate)
-
-2.5.2 / 2016-12-25
-==================
-
-  * Fix: reference error on window within webworkers (#393, @KlausTrainer)
-  * Docs: fixed README typo (#391, @lurch)
-  * Docs: added notice about v3 api discussion (@thebigredgeek)
-
-2.5.1 / 2016-12-20
-==================
-
-  * Fix: babel-core compatibility
-
-2.5.0 / 2016-12-20
-==================
-
-  * Fix: wrong reference in bower file (@thebigredgeek)
-  * Fix: webworker compatibility (@thebigredgeek)
-  * Fix: output formatting issue (#388, @kribblo)
-  * Fix: babel-loader compatibility (#383, @escwald)
-  * Misc: removed built asset from repo and publications (@thebigredgeek)
-  * Misc: moved source files to /src (#378, @yamikuronue)
-  * Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue)
-  * Test: coveralls integration (#378, @yamikuronue)
-  * Docs: simplified language in the opening paragraph (#373, @yamikuronue)
-
-2.4.5 / 2016-12-17
-==================
-
-  * Fix: `navigator` undefined in Rhino (#376, @jochenberger)
-  * Fix: custom log function (#379, @hsiliev)
-  * Improvement: bit of cleanup + linting fixes (@thebigredgeek)
-  * Improvement: rm non-maintainted `dist/` dir (#375, @freewil)
-  * Docs: simplified language in the opening paragraph. (#373, @yamikuronue)
-
-2.4.4 / 2016-12-14
-==================
-
-  * Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts)
-
-2.4.3 / 2016-12-14
-==================
-
-  * Fix: navigation.userAgent error for react native (#364, @escwald)
-
-2.4.2 / 2016-12-14
-==================
-
-  * Fix: browser colors (#367, @tootallnate)
-  * Misc: travis ci integration (@thebigredgeek)
-  * Misc: added linting and testing boilerplate with sanity check (@thebigredgeek)
-
-2.4.1 / 2016-12-13
-==================
-
-  * Fix: typo that broke the package (#356)
-
-2.4.0 / 2016-12-13
-==================
-
-  * Fix: bower.json references unbuilt src entry point (#342, @justmatt)
-  * Fix: revert "handle regex special characters" (@tootallnate)
-  * Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate)
-  * Feature: %O`(big O) pretty-prints objects (#322, @tootallnate)
-  * Improvement: allow colors in workers (#335, @botverse)
-  * Improvement: use same color for same namespace. (#338, @lchenay)
-
-2.3.3 / 2016-11-09
-==================
-
-  * Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne)
-  * Fix: Returning `localStorage` saved values (#331, Levi Thomason)
-  * Improvement: Don't create an empty object when no `process` (Nathan Rajlich)
-
-2.3.2 / 2016-11-09
-==================
-
-  * Fix: be super-safe in index.js as well (@TooTallNate)
-  * Fix: should check whether process exists (Tom Newby)
-
-2.3.1 / 2016-11-09
-==================
-
-  * Fix: Added electron compatibility (#324, @paulcbetts)
-  * Improvement: Added performance optimizations (@tootallnate)
-  * Readme: Corrected PowerShell environment variable example (#252, @gimre)
-  * Misc: Removed yarn lock file from source control (#321, @fengmk2)
-
-2.3.0 / 2016-11-07
-==================
-
-  * Fix: Consistent placement of ms diff at end of output (#215, @gorangajic)
-  * Fix: Escaping of regex special characters in namespace strings (#250, @zacronos)
-  * Fix: Fixed bug causing crash on react-native (#282, @vkarpov15)
-  * Feature: Enabled ES6+ compatible import via default export (#212 @bucaran)
-  * Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom)
-  * Package: Update "ms" to 0.7.2 (#315, @DevSide)
-  * Package: removed superfluous version property from bower.json (#207 @kkirsche)
-  * Readme: fix USE_COLORS to DEBUG_COLORS
-  * Readme: Doc fixes for format string sugar (#269, @mlucool)
-  * Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0)
-  * Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable)
-  * Readme: better docs for browser support (#224, @matthewmueller)
-  * Tooling: Added yarn integration for development (#317, @thebigredgeek)
-  * Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek)
-  * Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman)
-  * Misc: Updated contributors (@thebigredgeek)
-
-2.2.0 / 2015-05-09
-==================
-
-  * package: update "ms" to v0.7.1 (#202, @dougwilson)
-  * README: add logging to file example (#193, @DanielOchoa)
-  * README: fixed a typo (#191, @amir-s)
-  * browser: expose `storage` (#190, @stephenmathieson)
-  * Makefile: add a `distclean` target (#189, @stephenmathieson)
-
-2.1.3 / 2015-03-13
-==================
-
-  * Updated stdout/stderr example (#186)
-  * Updated example/stdout.js to match debug current behaviour
-  * Renamed example/stderr.js to stdout.js
-  * Update Readme.md (#184)
-  * replace high intensity foreground color for bold (#182, #183)
-
-2.1.2 / 2015-03-01
-==================
-
-  * dist: recompile
-  * update "ms" to v0.7.0
-  * package: update "browserify" to v9.0.3
-  * component: fix "ms.js" repo location
-  * changed bower package name
-  * updated documentation about using debug in a browser
-  * fix: security error on safari (#167, #168, @yields)
-
-2.1.1 / 2014-12-29
-==================
-
-  * browser: use `typeof` to check for `console` existence
-  * browser: check for `console.log` truthiness (fix IE 8/9)
-  * browser: add support for Chrome apps
-  * Readme: added Windows usage remarks
-  * Add `bower.json` to properly support bower install
-
-2.1.0 / 2014-10-15
-==================
-
-  * node: implement `DEBUG_FD` env variable support
-  * package: update "browserify" to v6.1.0
-  * package: add "license" field to package.json (#135, @panuhorsmalahti)
-
-2.0.0 / 2014-09-01
-==================
-
-  * package: update "browserify" to v5.11.0
-  * node: use stderr rather than stdout for logging (#29, @stephenmathieson)
-
-1.0.4 / 2014-07-15
-==================
-
-  * dist: recompile
-  * example: remove `console.info()` log usage
-  * example: add "Content-Type" UTF-8 header to browser example
-  * browser: place %c marker after the space character
-  * browser: reset the "content" color via `color: inherit`
-  * browser: add colors support for Firefox >= v31
-  * debug: prefer an instance `log()` function over the global one (#119)
-  * Readme: update documentation about styled console logs for FF v31 (#116, @wryk)
-
-1.0.3 / 2014-07-09
-==================
-
-  * Add support for multiple wildcards in namespaces (#122, @seegno)
-  * browser: fix lint
-
-1.0.2 / 2014-06-10
-==================
-
-  * browser: update color palette (#113, @gscottolson)
-  * common: make console logging function configurable (#108, @timoxley)
-  * node: fix %o colors on old node <= 0.8.x
-  * Makefile: find node path using shell/which (#109, @timoxley)
-
-1.0.1 / 2014-06-06
-==================
-
-  * browser: use `removeItem()` to clear localStorage
-  * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777)
-  * package: add "contributors" section
-  * node: fix comment typo
-  * README: list authors
-
-1.0.0 / 2014-06-04
-==================
-
-  * make ms diff be global, not be scope
-  * debug: ignore empty strings in enable()
-  * node: make DEBUG_COLORS able to disable coloring
-  * *: export the `colors` array
-  * npmignore: don't publish the `dist` dir
-  * Makefile: refactor to use browserify
-  * package: add "browserify" as a dev dependency
-  * Readme: add Web Inspector Colors section
-  * node: reset terminal color for the debug content
-  * node: map "%o" to `util.inspect()`
-  * browser: map "%j" to `JSON.stringify()`
-  * debug: add custom "formatters"
-  * debug: use "ms" module for humanizing the diff
-  * Readme: add "bash" syntax highlighting
-  * browser: add Firebug color support
-  * browser: add colors for WebKit browsers
-  * node: apply log to `console`
-  * rewrite: abstract common logic for Node & browsers
-  * add .jshintrc file
-
-0.8.1 / 2014-04-14
-==================
-
-  * package: re-add the "component" section
-
-0.8.0 / 2014-03-30
-==================
-
-  * add `enable()` method for nodejs. Closes #27
-  * change from stderr to stdout
-  * remove unnecessary index.js file
-
-0.7.4 / 2013-11-13
-==================
-
-  * remove "browserify" key from package.json (fixes something in browserify)
-
-0.7.3 / 2013-10-30
-==================
-
-  * fix: catch localStorage security error when cookies are blocked (Chrome)
-  * add debug(err) support. Closes #46
-  * add .browser prop to package.json. Closes #42
-
-0.7.2 / 2013-02-06
-==================
-
-  * fix package.json
-  * fix: Mobile Safari (private mode) is broken with debug
-  * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript
-
-0.7.1 / 2013-02-05
-==================
-
-  * add repository URL to package.json
-  * add DEBUG_COLORED to force colored output
-  * add browserify support
-  * fix component. Closes #24
-
-0.7.0 / 2012-05-04
-==================
-
-  * Added .component to package.json
-  * Added debug.component.js build
-
-0.6.0 / 2012-03-16
-==================
-
-  * Added support for "-" prefix in DEBUG [Vinay Pulim]
-  * Added `.enabled` flag to the node version [TooTallNate]
-
-0.5.0 / 2012-02-02
-==================
-
-  * Added: humanize diffs. Closes #8
-  * Added `debug.disable()` to the CS variant
-  * Removed padding. Closes #10
-  * Fixed: persist client-side variant again. Closes #9
-
-0.4.0 / 2012-02-01
-==================
-
-  * Added browser variant support for older browsers [TooTallNate]
-  * Added `debug.enable('project:*')` to browser variant [TooTallNate]
-  * Added padding to diff (moved it to the right)
-
-0.3.0 / 2012-01-26
-==================
-
-  * Added millisecond diff when isatty, otherwise UTC string
-
-0.2.0 / 2012-01-22
-==================
-
-  * Added wildcard support
-
-0.1.0 / 2011-12-02
-==================
-
-  * Added: remove colors unless stderr isatty [TooTallNate]
-
-0.0.1 / 2010-01-03
-==================
-
-  * Initial release
diff --git a/node_modules/extract-zip/node_modules/debug/LICENSE b/node_modules/extract-zip/node_modules/debug/LICENSE
deleted file mode 100644
index 658c933..0000000
--- a/node_modules/extract-zip/node_modules/debug/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-(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/extract-zip/node_modules/debug/Makefile b/node_modules/extract-zip/node_modules/debug/Makefile
deleted file mode 100644
index 584da8b..0000000
--- a/node_modules/extract-zip/node_modules/debug/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
-THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
-THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)
-
-# BIN directory
-BIN := $(THIS_DIR)/node_modules/.bin
-
-# Path
-PATH := node_modules/.bin:$(PATH)
-SHELL := /bin/bash
-
-# applications
-NODE ?= $(shell which node)
-YARN ?= $(shell which yarn)
-PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm))
-BROWSERIFY ?= $(NODE) $(BIN)/browserify
-
-.FORCE:
-
-install: node_modules
-
-node_modules: package.json
-	@NODE_ENV= $(PKG) install
-	@touch node_modules
-
-lint: .FORCE
-	eslint browser.js debug.js index.js node.js
-
-test-node: .FORCE
-	istanbul cover node_modules/mocha/bin/_mocha -- test/**.js
-
-test-browser: .FORCE
-	mkdir -p dist
-
-	@$(BROWSERIFY) \
-		--standalone debug \
-		. > dist/debug.js
-
-	karma start --single-run
-	rimraf dist
-
-test: .FORCE
-	concurrently \
-		"make test-node" \
-		"make test-browser"
-
-coveralls:
-	cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js
-
-.PHONY: all install clean distclean
diff --git a/node_modules/extract-zip/node_modules/debug/README.md b/node_modules/extract-zip/node_modules/debug/README.md
deleted file mode 100644
index f67be6b..0000000
--- a/node_modules/extract-zip/node_modules/debug/README.md
+++ /dev/null
@@ -1,312 +0,0 @@
-# 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)
-
-
-
-A tiny node.js debugging utility modelled after node core's debugging technique.
-
-**Discussion around the V3 API is under way [here](https://github.com/visionmedia/debug/issues/370)**
-
-## 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_:
-
-```js
-var debug = require('debug')('http')
-  , http = require('http')
-  , name = 'My App';
-
-// fake app
-
-debug('booting %s', name);
-
-http.createServer(function(req, res){
-  debug(req.method + ' ' + req.url);
-  res.end('hello\n');
-}).listen(3000, function(){
-  debug('listening');
-});
-
-// fake worker of some kind
-
-require('./worker');
-```
-
-Example _worker.js_:
-
-```js
-var debug = require('debug')('worker');
-
-setInterval(function(){
-  debug('doing some work');
-}, 1000);
-```
-
- The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:
-
-  ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)
-
-  ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)
-
-#### Windows note
-
- On Windows the environment variable is set using the `set` command.
-
- ```cmd
- set DEBUG=*,-not_this
- ```
-
- Note that PowerShell uses different syntax to set environment variables.
-
- ```cmd
- $env:DEBUG = "*,-not_this"
-  ```
-
-Then, run the program to be debugged as usual.
-
-## Millisecond diff
-
-  When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.
-
-  ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)
-
-  When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:
-
-  ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)
-
-## Conventions
-
-  If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser".
-
-## Wildcards
-
-  The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.
-
-  You can also exclude specific debuggers by prefixing them with a "-" character.  For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:".
-
-## 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_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);
-```
-
-#### Web Inspector Colors
-
-  Colors are also enabled on "Web Inspectors" that understand the `%c` formatting
-  option. These are WebKit web inspectors, Firefox ([since version
-  31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))
-  and the Firebug plugin for Firefox (any version).
-
-  Colored output looks something like:
-
-  ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png)
-
-
-## Output streams
-
-  By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method:
-
-Example _stdout.js_:
-
-```js
-var debug = require('debug');
-var error = debug('app:error');
-
-// by default stderr is used
-error('goes to stderr!');
-
-var log = debug('app:log');
-// set this namespace to log via console.log
-log.log = console.log.bind(console); // don't forget to bind to console!
-log('goes to stdout');
-error('still goes to stderr!');
-
-// set all output to go via console.info
-// overrides all per-namespace log settings
-debug.log = console.info.bind(console);
-error('now goes to stdout via console.info');
-log('still goes to stdout, but via console.info now');
-```
-
-
-## 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-2016 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/extract-zip/node_modules/debug/component.json b/node_modules/extract-zip/node_modules/debug/component.json
deleted file mode 100644
index 9de2641..0000000
--- a/node_modules/extract-zip/node_modules/debug/component.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "debug",
-  "repo": "visionmedia/debug",
-  "description": "small debugging utility",
-  "version": "2.6.9",
-  "keywords": [
-    "debug",
-    "log",
-    "debugger"
-  ],
-  "main": "src/browser.js",
-  "scripts": [
-    "src/browser.js",
-    "src/debug.js"
-  ],
-  "dependencies": {
-    "rauchg/ms.js": "0.7.1"
-  }
-}
diff --git a/node_modules/extract-zip/node_modules/debug/karma.conf.js b/node_modules/extract-zip/node_modules/debug/karma.conf.js
deleted file mode 100644
index 103a82d..0000000
--- a/node_modules/extract-zip/node_modules/debug/karma.conf.js
+++ /dev/null
@@ -1,70 +0,0 @@
-// Karma configuration
-// Generated on Fri Dec 16 2016 13:09:51 GMT+0000 (UTC)
-
-module.exports = function(config) {
-  config.set({
-
-    // base path that will be used to resolve all patterns (eg. files, exclude)
-    basePath: '',
-
-
-    // frameworks to use
-    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
-    frameworks: ['mocha', 'chai', 'sinon'],
-
-
-    // list of files / patterns to load in the browser
-    files: [
-      'dist/debug.js',
-      'test/*spec.js'
-    ],
-
-
-    // list of files to exclude
-    exclude: [
-      'src/node.js'
-    ],
-
-
-    // preprocess matching files before serving them to the browser
-    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
-    preprocessors: {
-    },
-
-    // test results reporter to use
-    // possible values: 'dots', 'progress'
-    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
-    reporters: ['progress'],
-
-
-    // web server port
-    port: 9876,
-
-
-    // enable / disable colors in the output (reporters and logs)
-    colors: true,
-
-
-    // level of logging
-    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
-    logLevel: config.LOG_INFO,
-
-
-    // enable / disable watching file and executing tests whenever any file changes
-    autoWatch: true,
-
-
-    // start these browsers
-    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
-    browsers: ['PhantomJS'],
-
-
-    // Continuous Integration mode
-    // if true, Karma captures browsers, runs the tests and exits
-    singleRun: false,
-
-    // Concurrency level
-    // how many browser should be started simultaneous
-    concurrency: Infinity
-  })
-}
diff --git a/node_modules/extract-zip/node_modules/debug/node.js b/node_modules/extract-zip/node_modules/debug/node.js
deleted file mode 100644
index 7fc36fe..0000000
--- a/node_modules/extract-zip/node_modules/debug/node.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./src/node');
diff --git a/node_modules/extract-zip/node_modules/debug/package.json b/node_modules/extract-zip/node_modules/debug/package.json
deleted file mode 100644
index a4e8776..0000000
--- a/node_modules/extract-zip/node_modules/debug/package.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
-  "author": "TJ Holowaychuk <tj@vision-media.ca>",
-  "browser": "./src/browser.js",
-  "component": {
-    "scripts": {
-      "debug/debug.js": "debug.js",
-      "debug/index.js": "browser.js"
-    }
-  },
-  "contributors": [
-    "Nathan Rajlich <nathan@tootallnate.net> (http://n8.io)",
-    "Andrew Rhyne <rhyneandrew@gmail.com>"
-  ],
-  "dependencies": {
-    "ms": "2.0.0"
-  },
-  "description": "small debugging utility",
-  "devDependencies": {
-    "browserify": "9.0.3",
-    "chai": "^3.5.0",
-    "concurrently": "^3.1.0",
-    "coveralls": "^2.11.15",
-    "eslint": "^3.12.1",
-    "istanbul": "^0.4.5",
-    "karma": "^1.3.0",
-    "karma-chai": "^0.1.0",
-    "karma-mocha": "^1.3.0",
-    "karma-phantomjs-launcher": "^1.0.2",
-    "karma-sinon": "^1.0.5",
-    "mocha": "^3.2.0",
-    "mocha-lcov-reporter": "^1.2.0",
-    "rimraf": "^2.5.4",
-    "sinon": "^1.17.6",
-    "sinon-chai": "^2.8.0"
-  },
-  "keywords": [
-    "debug",
-    "log",
-    "debugger"
-  ],
-  "license": "MIT",
-  "main": "./src/index.js",
-  "name": "debug",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/visionmedia/debug.git"
-  },
-  "version": "2.6.9"
-}
\ No newline at end of file
diff --git a/node_modules/extract-zip/node_modules/debug/src/browser.js b/node_modules/extract-zip/node_modules/debug/src/browser.js
deleted file mode 100644
index 7106924..0000000
--- a/node_modules/extract-zip/node_modules/debug/src/browser.js
+++ /dev/null
@@ -1,185 +0,0 @@
-/**
- * This is the web browser implementation of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = require('./debug');
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-exports.storage = 'undefined' != typeof chrome
-               && 'undefined' != typeof chrome.storage
-                  ? chrome.storage.local
-                  : localstorage();
-
-/**
- * Colors.
- */
-
-exports.colors = [
-  'lightseagreen',
-  'forestgreen',
-  'goldenrod',
-  'dodgerblue',
-  'darkorchid',
-  'crimson'
-];
-
-/**
- * Currently only WebKit-based Web Inspectors, Firefox >= v31,
- * and the Firebug extension (any Firefox version) are known
- * to support "%c" CSS customizations.
- *
- * TODO: add a `localStorage` variable to explicitly enable/disable colors
- */
-
-function useColors() {
-  // 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') {
-    return true;
-  }
-
-  // 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+)/));
-}
-
-/**
- * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
- */
-
-exports.formatters.j = function(v) {
-  try {
-    return JSON.stringify(v);
-  } catch (err) {
-    return '[UnexpectedJSONParseError]: ' + err.message;
-  }
-};
-
-
-/**
- * Colorize log arguments if enabled.
- *
- * @api public
- */
-
-function formatArgs(args) {
-  var useColors = this.useColors;
-
-  args[0] = (useColors ? '%c' : '')
-    + this.namespace
-    + (useColors ? ' %c' : ' ')
-    + args[0]
-    + (useColors ? '%c ' : ' ')
-    + '+' + exports.humanize(this.diff);
-
-  if (!useColors) return;
-
-  var 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
-  var index = 0;
-  var lastC = 0;
-  args[0].replace(/%[a-zA-Z%]/g, function(match) {
-    if ('%%' === match) return;
-    index++;
-    if ('%c' === match) {
-      // we only are interested in the *last* %c
-      // (the user may have provided their own)
-      lastC = index;
-    }
-  });
-
-  args.splice(lastC, 0, c);
-}
-
-/**
- * Invokes `console.log()` when available.
- * No-op when `console.log` is not a "function".
- *
- * @api public
- */
-
-function log() {
-  // this hackery is required for IE8/9, where
-  // the `console.log` function doesn't have 'apply'
-  return 'object' === typeof console
-    && console.log
-    && Function.prototype.apply.call(console.log, console, arguments);
-}
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-
-function save(namespaces) {
-  try {
-    if (null == namespaces) {
-      exports.storage.removeItem('debug');
-    } else {
-      exports.storage.debug = namespaces;
-    }
-  } catch(e) {}
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-
-function load() {
-  var r;
-  try {
-    r = exports.storage.debug;
-  } catch(e) {}
-
-  // 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;
-}
-
-/**
- * Enable namespaces listed in `localStorage.debug` initially.
- */
-
-exports.enable(load());
-
-/**
- * Localstorage attempts to return the localstorage.
- *
- * This is necessary because safari throws
- * when a user disables cookies/localstorage
- * and you attempt to access it.
- *
- * @return {LocalStorage}
- * @api private
- */
-
-function localstorage() {
-  try {
-    return window.localStorage;
-  } catch (e) {}
-}
diff --git a/node_modules/extract-zip/node_modules/debug/src/debug.js b/node_modules/extract-zip/node_modules/debug/src/debug.js
deleted file mode 100644
index 6a5e3fc..0000000
--- a/node_modules/extract-zip/node_modules/debug/src/debug.js
+++ /dev/null
@@ -1,202 +0,0 @@
-
-/**
- * This is the common logic for both the Node.js and web browser
- * implementations of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
-exports.coerce = coerce;
-exports.disable = disable;
-exports.enable = enable;
-exports.enabled = enabled;
-exports.humanize = require('ms');
-
-/**
- * The currently active debug mode names, and names to skip.
- */
-
-exports.names = [];
-exports.skips = [];
-
-/**
- * Map of special "%n" handling functions, for the debug "format" argument.
- *
- * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
- */
-
-exports.formatters = {};
-
-/**
- * Previous log timestamp.
- */
-
-var prevTime;
-
-/**
- * Select a color.
- * @param {String} namespace
- * @return {Number}
- * @api private
- */
-
-function selectColor(namespace) {
-  var hash = 0, i;
-
-  for (i in namespace) {
-    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);
-    hash |= 0; // Convert to 32bit integer
-  }
-
-  return exports.colors[Math.abs(hash) % exports.colors.length];
-}
-
-/**
- * Create a debugger with the given `namespace`.
- *
- * @param {String} namespace
- * @return {Function}
- * @api public
- */
-
-function createDebug(namespace) {
-
-  function debug() {
-    // disabled?
-    if (!debug.enabled) return;
-
-    var self = debug;
-
-    // set `diff` timestamp
-    var curr = +new Date();
-    var ms = curr - (prevTime || curr);
-    self.diff = ms;
-    self.prev = prevTime;
-    self.curr = curr;
-    prevTime = curr;
-
-    // turn the `arguments` into a proper Array
-    var args = new Array(arguments.length);
-    for (var i = 0; i < args.length; i++) {
-      args[i] = arguments[i];
-    }
-
-    args[0] = exports.coerce(args[0]);
-
-    if ('string' !== typeof args[0]) {
-      // anything else let's inspect with %O
-      args.unshift('%O');
-    }
-
-    // apply any `formatters` transformations
-    var index = 0;
-    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
-      // if we encounter an escaped % then don't increase the array index
-      if (match === '%%') return match;
-      index++;
-      var formatter = exports.formatters[format];
-      if ('function' === typeof formatter) {
-        var val = args[index];
-        match = formatter.call(self, val);
-
-        // now we need to remove `args[index]` since it's inlined in the `format`
-        args.splice(index, 1);
-        index--;
-      }
-      return match;
-    });
-
-    // apply env-specific formatting (colors, etc.)
-    exports.formatArgs.call(self, args);
-
-    var logFn = debug.log || exports.log || console.log.bind(console);
-    logFn.apply(self, args);
-  }
-
-  debug.namespace = namespace;
-  debug.enabled = exports.enabled(namespace);
-  debug.useColors = exports.useColors();
-  debug.color = selectColor(namespace);
-
-  // env-specific initialization logic for debug instances
-  if ('function' === typeof exports.init) {
-    exports.init(debug);
-  }
-
-  return debug;
-}
-
-/**
- * Enables a debug mode by namespaces. This can include modes
- * separated by a colon and wildcards.
- *
- * @param {String} namespaces
- * @api public
- */
-
-function enable(namespaces) {
-  exports.save(namespaces);
-
-  exports.names = [];
-  exports.skips = [];
-
-  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
-  var len = split.length;
-
-  for (var i = 0; i < len; i++) {
-    if (!split[i]) continue; // ignore empty strings
-    namespaces = split[i].replace(/\*/g, '.*?');
-    if (namespaces[0] === '-') {
-      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
-    } else {
-      exports.names.push(new RegExp('^' + namespaces + '$'));
-    }
-  }
-}
-
-/**
- * Disable debug output.
- *
- * @api public
- */
-
-function disable() {
-  exports.enable('');
-}
-
-/**
- * Returns true if the given mode name is enabled, false otherwise.
- *
- * @param {String} name
- * @return {Boolean}
- * @api public
- */
-
-function enabled(name) {
-  var i, len;
-  for (i = 0, len = exports.skips.length; i < len; i++) {
-    if (exports.skips[i].test(name)) {
-      return false;
-    }
-  }
-  for (i = 0, len = exports.names.length; i < len; i++) {
-    if (exports.names[i].test(name)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-/**
- * Coerce `val`.
- *
- * @param {Mixed} val
- * @return {Mixed}
- * @api private
- */
-
-function coerce(val) {
-  if (val instanceof Error) return val.stack || val.message;
-  return val;
-}
diff --git a/node_modules/extract-zip/node_modules/debug/src/index.js b/node_modules/extract-zip/node_modules/debug/src/index.js
deleted file mode 100644
index e12cf4d..0000000
--- a/node_modules/extract-zip/node_modules/debug/src/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * Detect Electron renderer process, which is node, but we should
- * treat as a browser.
- */
-
-if (typeof process !== 'undefined' && process.type === 'renderer') {
-  module.exports = require('./browser.js');
-} else {
-  module.exports = require('./node.js');
-}
diff --git a/node_modules/extract-zip/node_modules/debug/src/inspector-log.js b/node_modules/extract-zip/node_modules/debug/src/inspector-log.js
deleted file mode 100644
index 60ea6c0..0000000
--- a/node_modules/extract-zip/node_modules/debug/src/inspector-log.js
+++ /dev/null
@@ -1,15 +0,0 @@
-module.exports = inspectorLog;
-
-// black hole
-const nullStream = new (require('stream').Writable)();
-nullStream._write = () => {};
-
-/**
- * Outputs a `console.log()` to the Node.js Inspector console *only*.
- */
-function inspectorLog() {
-  const stdout = console._stdout;
-  console._stdout = nullStream;
-  console.log.apply(console, arguments);
-  console._stdout = stdout;
-}
diff --git a/node_modules/extract-zip/node_modules/debug/src/node.js b/node_modules/extract-zip/node_modules/debug/src/node.js
deleted file mode 100644
index b15109c..0000000
--- a/node_modules/extract-zip/node_modules/debug/src/node.js
+++ /dev/null
@@ -1,248 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var tty = require('tty');
-var util = require('util');
-
-/**
- * This is the Node.js implementation of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = require('./debug');
-exports.init = init;
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-
-/**
- * Colors.
- */
-
-exports.colors = [6, 2, 3, 4, 5, 1];
-
-/**
- * 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(function (key) {
-  return /^debug_/i.test(key);
-}).reduce(function (obj, key) {
-  // camel-case
-  var prop = key
-    .substring(6)
-    .toLowerCase()
-    .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });
-
-  // coerce string value into JS value
-  var 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;
-}, {});
-
-/**
- * The file descriptor to write the `debug()` calls to.
- * Set the `DEBUG_FD` env variable to override with another value. i.e.:
- *
- *   $ DEBUG_FD=3 node script.js 3>debug.log
- */
-
-var fd = parseInt(process.env.DEBUG_FD, 10) || 2;
-
-if (1 !== fd && 2 !== fd) {
-  util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
-}
-
-var stream = 1 === fd ? process.stdout :
-             2 === fd ? process.stderr :
-             createWritableStdioStream(fd);
-
-/**
- * Is stdout a TTY? Colored output is enabled when `true`.
- */
-
-function useColors() {
-  return 'colors' in exports.inspectOpts
-    ? Boolean(exports.inspectOpts.colors)
-    : tty.isatty(fd);
-}
-
-/**
- * Map %o to `util.inspect()`, all on a single line.
- */
-
-exports.formatters.o = function(v) {
-  this.inspectOpts.colors = this.useColors;
-  return util.inspect(v, this.inspectOpts)
-    .split('\n').map(function(str) {
-      return str.trim()
-    }).join(' ');
-};
-
-/**
- * Map %o to `util.inspect()`, allowing multiple lines if needed.
- */
-
-exports.formatters.O = function(v) {
-  this.inspectOpts.colors = this.useColors;
-  return util.inspect(v, this.inspectOpts);
-};
-
-/**
- * Adds ANSI color escape codes if enabled.
- *
- * @api public
- */
-
-function formatArgs(args) {
-  var name = this.namespace;
-  var useColors = this.useColors;
-
-  if (useColors) {
-    var c = this.color;
-    var prefix = '  \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';
-
-    args[0] = prefix + args[0].split('\n').join('\n' + prefix);
-    args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
-  } else {
-    args[0] = new Date().toUTCString()
-      + ' ' + name + ' ' + args[0];
-  }
-}
-
-/**
- * Invokes `util.format()` with the specified arguments and writes to `stream`.
- */
-
-function log() {
-  return stream.write(util.format.apply(util, arguments) + '\n');
-}
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-
-function save(namespaces) {
-  if (null == namespaces) {
-    // If you set a process.env field to null or undefined, it gets cast to the
-    // string 'null' or 'undefined'. Just delete instead.
-    delete process.env.DEBUG;
-  } else {
-    process.env.DEBUG = namespaces;
-  }
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-
-function load() {
-  return process.env.DEBUG;
-}
-
-/**
- * Copied from `node/src/node.js`.
- *
- * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
- * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
- */
-
-function createWritableStdioStream (fd) {
-  var stream;
-  var tty_wrap = process.binding('tty_wrap');
-
-  // Note stream._type is used for test-module-load-list.js
-
-  switch (tty_wrap.guessHandleType(fd)) {
-    case 'TTY':
-      stream = new tty.WriteStream(fd);
-      stream._type = 'tty';
-
-      // Hack to have stream not keep the event loop alive.
-      // See https://github.com/joyent/node/issues/1726
-      if (stream._handle && stream._handle.unref) {
-        stream._handle.unref();
-      }
-      break;
-
-    case 'FILE':
-      var fs = require('fs');
-      stream = new fs.SyncWriteStream(fd, { autoClose: false });
-      stream._type = 'fs';
-      break;
-
-    case 'PIPE':
-    case 'TCP':
-      var net = require('net');
-      stream = new net.Socket({
-        fd: fd,
-        readable: false,
-        writable: true
-      });
-
-      // FIXME Should probably have an option in net.Socket to create a
-      // stream from an existing fd which is writable only. But for now
-      // we'll just add this hack and set the `readable` member to false.
-      // Test: ./node test/fixtures/echo.js < /etc/passwd
-      stream.readable = false;
-      stream.read = null;
-      stream._type = 'pipe';
-
-      // FIXME Hack to have stream not keep the event loop alive.
-      // See https://github.com/joyent/node/issues/1726
-      if (stream._handle && stream._handle.unref) {
-        stream._handle.unref();
-      }
-      break;
-
-    default:
-      // Probably an error on in uv_guess_handle()
-      throw new Error('Implement me. Unknown stream file type!');
-  }
-
-  // For supporting legacy API we put the FD here.
-  stream.fd = fd;
-
-  stream._isStdio = true;
-
-  return stream;
-}
-
-/**
- * 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 = {};
-
-  var keys = Object.keys(exports.inspectOpts);
-  for (var i = 0; i < keys.length; i++) {
-    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
-  }
-}
-
-/**
- * Enable namespaces listed in `process.env.DEBUG` initially.
- */
-
-exports.enable(load());
diff --git a/node_modules/extract-zip/node_modules/ms/index.js b/node_modules/extract-zip/node_modules/ms/index.js
deleted file mode 100644
index 6a522b1..0000000
--- a/node_modules/extract-zip/node_modules/ms/index.js
+++ /dev/null
@@ -1,152 +0,0 @@
-/**
- * Helpers.
- */
-
-var s = 1000;
-var m = s * 60;
-var h = m * 60;
-var d = h * 24;
-var y = d * 365.25;
-
-/**
- * Parse or format the given `val`.
- *
- * Options:
- *
- *  - `long` verbose formatting [false]
- *
- * @param {String|Number} val
- * @param {Object} [options]
- * @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' && isNaN(val) === false) {
-    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|years?|yrs?|y)?$/i.exec(
-    str
-  );
-  if (!match) {
-    return;
-  }
-  var n = parseFloat(match[1]);
-  var type = (match[2] || 'ms').toLowerCase();
-  switch (type) {
-    case 'years':
-    case 'year':
-    case 'yrs':
-    case 'yr':
-    case 'y':
-      return n * y;
-    case 'days':
-    case 'day':
-    case 'd':
-      return n * d;
-    case 'hours':
-    case 'hour':
-    case 'hrs':
-    case 'hr':
-    case 'h':
-      return n * h;
-    case 'minutes':
-    case 'minute':
-    case 'mins':
-    case 'min':
-    case 'm':
-      return n * m;
-    case 'seconds':
-    case 'second':
-    case 'secs':
-    case 'sec':
-    case 's':
-      return n * s;
-    case 'milliseconds':
-    case 'millisecond':
-    case 'msecs':
-    case 'msec':
-    case 'ms':
-      return n;
-    default:
-      return undefined;
-  }
-}
-
-/**
- * Short format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function fmtShort(ms) {
-  if (ms >= d) {
-    return Math.round(ms / d) + 'd';
-  }
-  if (ms >= h) {
-    return Math.round(ms / h) + 'h';
-  }
-  if (ms >= m) {
-    return Math.round(ms / m) + 'm';
-  }
-  if (ms >= s) {
-    return Math.round(ms / s) + 's';
-  }
-  return ms + 'ms';
-}
-
-/**
- * Long format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function fmtLong(ms) {
-  return plural(ms, d, 'day') ||
-    plural(ms, h, 'hour') ||
-    plural(ms, m, 'minute') ||
-    plural(ms, s, 'second') ||
-    ms + ' ms';
-}
-
-/**
- * Pluralization helper.
- */
-
-function plural(ms, n, name) {
-  if (ms < n) {
-    return;
-  }
-  if (ms < n * 1.5) {
-    return Math.floor(ms / n) + ' ' + name;
-  }
-  return Math.ceil(ms / n) + ' ' + name + 's';
-}
diff --git a/node_modules/extract-zip/node_modules/ms/license.md b/node_modules/extract-zip/node_modules/ms/license.md
deleted file mode 100644
index 69b6125..0000000
--- a/node_modules/extract-zip/node_modules/ms/license.md
+++ /dev/null
@@ -1,21 +0,0 @@
-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/extract-zip/node_modules/ms/package.json b/node_modules/extract-zip/node_modules/ms/package.json
deleted file mode 100644
index cf67ee2..0000000
--- a/node_modules/extract-zip/node_modules/ms/package.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-  "description": "Tiny milisecond conversion utility",
-  "devDependencies": {
-    "eslint": "3.19.0",
-    "expect.js": "0.3.1",
-    "husky": "0.13.3",
-    "lint-staged": "3.4.1",
-    "mocha": "3.4.1"
-  },
-  "eslintConfig": {
-    "env": {
-      "es6": true,
-      "node": true
-    },
-    "extends": "eslint:recommended"
-  },
-  "files": [
-    "index.js"
-  ],
-  "license": "MIT",
-  "lint-staged": {
-    "*.js": [
-      "npm run lint",
-      "prettier --single-quote --write",
-      "git add"
-    ]
-  },
-  "main": "./index",
-  "name": "ms",
-  "repository": "zeit/ms",
-  "scripts": {
-    "lint": "eslint lib/* bin/*",
-    "precommit": "lint-staged",
-    "test": "mocha tests.js"
-  },
-  "version": "2.0.0"
-}
\ No newline at end of file
diff --git a/node_modules/extract-zip/node_modules/ms/readme.md b/node_modules/extract-zip/node_modules/ms/readme.md
deleted file mode 100644
index 84a9974..0000000
--- a/node_modules/extract-zip/node_modules/ms/readme.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# ms
-
-[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms)
-[![Slack Channel](http://zeit-slackin.now.sh/badge.svg)](https://zeit.chat/)
-
-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
-```
-
-### Convert from milliseconds
-
-```js
-ms(60000)             // "1m"
-ms(2 * 60000)         // "2m"
-ms(ms('10 hours'))    // "10h"
-```
-
-### Time format written-out
-
-```js
-ms(60000, { long: true })             // "1 minute"
-ms(2 * 60000, { long: true })         // "2 minutes"
-ms(ms('10 hours'), { long: true })    // "10 hours"
-```
-
-## Features
-
-- Works both in [node](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 ms is returned.
-
-## 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 will now use your clone of ms!
-
-As always, you can run the tests using: `npm test`
diff --git a/node_modules/extract-zip/package.json b/node_modules/extract-zip/package.json
index 4175bef..03bb2cc 100644
--- a/node_modules/extract-zip/package.json
+++ b/node_modules/extract-zip/package.json
@@ -4,20 +4,51 @@
     "extract-zip": "cli.js"
   },
   "dependencies": {
-    "concat-stream": "^1.6.2",
-    "debug": "^2.6.9",
-    "mkdirp": "^0.5.4",
+    "debug": "^4.1.1",
+    "get-stream": "^5.1.0",
     "yauzl": "^2.10.0"
   },
   "description": "unzip a zip file into a directory using 100% javascript",
   "devDependencies": {
-    "rimraf": "^2.2.8",
-    "standard": "^5.2.2",
-    "tape": "^4.2.0",
-    "temp": "^0.8.3"
+    "@typescript-eslint/eslint-plugin": "^2.25.0",
+    "@typescript-eslint/parser": "^2.25.0",
+    "ava": "^3.5.1",
+    "eslint": "^6.8.0",
+    "eslint-config-standard": "^14.1.1",
+    "eslint-plugin-ava": "^10.2.0",
+    "eslint-plugin-import": "^2.20.1",
+    "eslint-plugin-node": "^11.0.0",
+    "eslint-plugin-promise": "^4.2.1",
+    "eslint-plugin-standard": "^4.0.1",
+    "fs-extra": "^9.0.0",
+    "husky": "^4.2.3",
+    "lint-staged": "^10.0.9",
+    "nyc": "^15.0.0",
+    "tsd": "^0.11.0",
+    "typescript": "^3.8.3"
   },
-  "directories": {
-    "test": "test"
+  "engines": {
+    "node": ">= 10.12.0"
+  },
+  "eslintConfig": {
+    "extends": [
+      "eslint:recommended",
+      "plugin:ava/recommended",
+      "plugin:import/errors",
+      "plugin:import/warnings",
+      "plugin:node/recommended",
+      "plugin:promise/recommended",
+      "standard"
+    ]
+  },
+  "files": [
+    "*.js",
+    "index.d.ts"
+  ],
+  "husky": {
+    "hooks": {
+      "pre-commit": "lint-staged"
+    }
   },
   "keywords": [
     "unzip",
@@ -25,11 +56,25 @@
     "extract"
   ],
   "license": "BSD-2-Clause",
+  "lint-staged": {
+    "*.js": "yarn lint:js --fix",
+    "*.ts": "yarn lint:ts --fix"
+  },
   "main": "index.js",
   "name": "extract-zip",
+  "optionalDependencies": {
+    "@types/yauzl": "^2.9.1"
+  },
   "repository": "maxogden/extract-zip",
   "scripts": {
-    "test": "standard && node test/test.js"
+    "ava": "ava",
+    "coverage": "nyc ava",
+    "lint": "yarn lint:js && yarn lint:ts && yarn tsd",
+    "lint:js": "eslint .",
+    "lint:ts": "eslint --config .eslintrc.typescript.js --ext .ts .",
+    "test": "yarn lint && ava",
+    "tsd": "tsd"
   },
-  "version": "1.7.0"
+  "types": "index.d.ts",
+  "version": "2.0.0"
 }
\ No newline at end of file
diff --git a/node_modules/extract-zip/readme.md b/node_modules/extract-zip/readme.md
index af17885..acc0375 100644
--- a/node_modules/extract-zip/readme.md
+++ b/node_modules/extract-zip/readme.md
@@ -4,12 +4,14 @@
 
 Uses the [`yauzl`](http://npmjs.org/yauzl) ZIP parser.
 
-[![NPM](https://nodei.co/npm/extract-zip.png?global=true)](https://nodei.co/npm/extract-zip/)
-[![js-standard-style](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/feross/standard)
-[![Build Status](https://travis-ci.org/maxogden/extract-zip.svg?branch=master)](https://travis-ci.org/maxogden/extract-zip)
+[![NPM](https://nodei.co/npm/extract-zip.png?global=true)](https://npm.im/extract-zip)
+[![Uses JS Standard Style](https://cdn.jsdelivr.net/gh/standard/standard/badge.svg)](https://github.com/standard/standard)
+[![Build Status](https://github.com/maxogden/extract-zip/workflows/CI/badge.svg)](https://github.com/maxogden/extract-zip/actions?query=workflow%3ACI)
 
 ## Installation
 
+Make sure you have Node 10 or greater installed.
+
 Get the library:
 
 ```
@@ -24,18 +26,24 @@
 
 ## JS API
 
-```js
-var extract = require('extract-zip')
-extract(source, {dir: target}, function (err) {
- // extraction is complete. make sure to handle the err
-})
+```javascript
+const extract = require('extract-zip')
+
+async main () {
+  try {
+    await extract(source, { dir: target })
+    console.log('Extraction complete')
+  } catch (err) {
+    // handle any errors
+  }
+}
 ```
 
 ### Options
 
-- `dir` - defaults to `process.cwd()`
-- `defaultDirMode` - integer - Directory Mode (permissions) will default to `493` (octal `0755` in integer)
-- `defaultFileMode` - integer - File Mode (permissions) will default to `420` (octal `0644` in integer)
+- `dir` (required) - the path to the directory where the extracted files are written
+- `defaultDirMode` - integer - Directory Mode (permissions), defaults to `0o755`
+- `defaultFileMode` - integer - File Mode (permissions), defaults to `0o644`
 - `onEntry` - function - if present, will be called with `(entry, zipfile)`, entry is every entry from the zip file forwarded from the `entry` event from yauzl. `zipfile` is the `yauzl` instance
 
 Default modes are only used if no permissions are set in the zip file.
diff --git a/node_modules/concat-stream/node_modules/safe-buffer/LICENSE b/node_modules/fs-constants/LICENSE
similarity index 96%
rename from node_modules/concat-stream/node_modules/safe-buffer/LICENSE
rename to node_modules/fs-constants/LICENSE
index 0c068ce..cb757e5 100644
--- a/node_modules/concat-stream/node_modules/safe-buffer/LICENSE
+++ b/node_modules/fs-constants/LICENSE
@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) Feross Aboukhadijeh
+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
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..07ec346
--- /dev/null
+++ b/node_modules/fs-constants/package.json
@@ -0,0 +1,19 @@
+{
+  "author": "Mathias Buus (@mafintosh)",
+  "browser": "browser.js",
+  "bugs": {
+    "url": "https://github.com/mafintosh/fs-constants/issues"
+  },
+  "dependencies": {},
+  "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": "https://github.com/mafintosh/fs-constants.git"
+  },
+  "version": "1.0.0"
+}
\ No newline at end of file
diff --git a/node_modules/get-stream/buffer-stream.js b/node_modules/get-stream/buffer-stream.js
new file mode 100644
index 0000000..2dd7574
--- /dev/null
+++ b/node_modules/get-stream/buffer-stream.js
@@ -0,0 +1,52 @@
+'use strict';
+const {PassThrough: PassThroughStream} = require('stream');
+
+module.exports = options => {
+	options = {...options};
+
+	const {array} = options;
+	let {encoding} = options;
+	const isBuffer = encoding === 'buffer';
+	let objectMode = false;
+
+	if (array) {
+		objectMode = !(encoding || isBuffer);
+	} else {
+		encoding = encoding || 'utf8';
+	}
+
+	if (isBuffer) {
+		encoding = null;
+	}
+
+	const stream = new PassThroughStream({objectMode});
+
+	if (encoding) {
+		stream.setEncoding(encoding);
+	}
+
+	let length = 0;
+	const chunks = [];
+
+	stream.on('data', chunk => {
+		chunks.push(chunk);
+
+		if (objectMode) {
+			length = chunks.length;
+		} else {
+			length += chunk.length;
+		}
+	});
+
+	stream.getBufferedValue = () => {
+		if (array) {
+			return chunks;
+		}
+
+		return isBuffer ? Buffer.concat(chunks, length) : chunks.join('');
+	};
+
+	stream.getBufferedLength = () => length;
+
+	return stream;
+};
diff --git a/node_modules/get-stream/index.d.ts b/node_modules/get-stream/index.d.ts
new file mode 100644
index 0000000..8961df3
--- /dev/null
+++ b/node_modules/get-stream/index.d.ts
@@ -0,0 +1,108 @@
+/// <reference types="node"/>
+import {Stream} from 'stream';
+
+declare class MaxBufferErrorClass extends Error {
+	readonly name: 'MaxBufferError';
+	constructor();
+}
+
+declare namespace getStream {
+	interface Options {
+		/**
+		Maximum length of the returned string. If it exceeds this value before the stream ends, the promise will be rejected with a `MaxBufferError` error.
+
+		@default Infinity
+		*/
+		readonly maxBuffer?: number;
+	}
+
+	interface OptionsWithEncoding<EncodingType = BufferEncoding> extends Options {
+		/**
+		[Encoding](https://nodejs.org/api/buffer.html#buffer_buffer) of the incoming stream.
+
+		@default 'utf8'
+		*/
+		readonly encoding?: EncodingType;
+	}
+
+	type MaxBufferError = MaxBufferErrorClass;
+}
+
+declare const getStream: {
+	/**
+	Get the `stream` as a string.
+
+	@returns A promise that resolves when the end event fires on the stream, indicating that there is no more data to be read. The stream is switched to flowing mode.
+
+	@example
+	```
+	import * as fs from 'fs';
+	import getStream = require('get-stream');
+
+	(async () => {
+		const stream = fs.createReadStream('unicorn.txt');
+
+		console.log(await getStream(stream));
+		//               ,,))))))));,
+		//            __)))))))))))))),
+		// \|/       -\(((((''''((((((((.
+		// -*-==//////((''  .     `)))))),
+		// /|\      ))| o    ;-.    '(((((                                  ,(,
+		//          ( `|    /  )    ;))))'                               ,_))^;(~
+		//             |   |   |   ,))((((_     _____------~~~-.        %,;(;(>';'~
+		//             o_);   ;    )))(((` ~---~  `::           \      %%~~)(v;(`('~
+		//                   ;    ''''````         `:       `:::|\,__,%%    );`'; ~
+		//                  |   _                )     /      `:|`----'     `-'
+		//            ______/\/~    |                 /        /
+		//          /~;;.____/;;'  /          ___--,-(   `;;;/
+		//         / //  _;______;'------~~~~~    /;;/\    /
+		//        //  | |                        / ;   \;;,\
+		//       (<_  | ;                      /',/-----'  _>
+		//        \_| ||_                     //~;~~~~~~~~~
+		//            `\_|                   (,~~
+		//                                    \~\
+		//                                     ~~
+	})();
+	```
+	*/
+	(stream: Stream, options?: getStream.OptionsWithEncoding): Promise<string>;
+
+	/**
+	Get the `stream` as a buffer.
+
+	It honors the `maxBuffer` option as above, but it refers to byte length rather than string length.
+	*/
+	buffer(
+		stream: Stream,
+		options?: getStream.OptionsWithEncoding
+	): Promise<Buffer>;
+
+	/**
+	Get the `stream` as an array of values.
+
+	It honors both the `maxBuffer` and `encoding` options. The behavior changes slightly based on the encoding chosen:
+
+	- When `encoding` is unset, it assumes an [object mode stream](https://nodesource.com/blog/understanding-object-streams/) and collects values emitted from `stream` unmodified. In this case `maxBuffer` refers to the number of items in the array (not the sum of their sizes).
+	- When `encoding` is set to `buffer`, it collects an array of buffers. `maxBuffer` refers to the summed byte lengths of every buffer in the array.
+	- When `encoding` is set to anything else, it collects an array of strings. `maxBuffer` refers to the summed character lengths of every string in the array.
+	*/
+	array<StreamObjectModeType = unknown>(
+		stream: Stream,
+		options?: getStream.Options
+	): Promise<StreamObjectModeType[]>;
+	array(
+		stream: Stream,
+		options: getStream.OptionsWithEncoding<'buffer'>
+	): Promise<Buffer[]>;
+	array(
+		stream: Stream,
+		options: getStream.OptionsWithEncoding<BufferEncoding>
+	): Promise<string[]>;
+
+	MaxBufferError: typeof MaxBufferErrorClass;
+
+	// TODO: Remove this for the next major release
+	default: typeof getStream;
+};
+
+export = getStream;
diff --git a/node_modules/get-stream/index.js b/node_modules/get-stream/index.js
new file mode 100644
index 0000000..340ea7d
--- /dev/null
+++ b/node_modules/get-stream/index.js
@@ -0,0 +1,58 @@
+'use strict';
+const pump = require('pump');
+const bufferStream = require('./buffer-stream');
+
+class MaxBufferError extends Error {
+	constructor() {
+		super('maxBuffer exceeded');
+		this.name = 'MaxBufferError';
+	}
+}
+
+async function getStream(inputStream, options) {
+	if (!inputStream) {
+		return Promise.reject(new Error('Expected a stream'));
+	}
+
+	options = {
+		maxBuffer: Infinity,
+		...options
+	};
+
+	const {maxBuffer} = options;
+
+	let stream;
+	await new Promise((resolve, reject) => {
+		const rejectPromise = error => {
+			if (error) { // A null check
+				error.bufferedData = stream.getBufferedValue();
+			}
+
+			reject(error);
+		};
+
+		stream = pump(inputStream, bufferStream(options), error => {
+			if (error) {
+				rejectPromise(error);
+				return;
+			}
+
+			resolve();
+		});
+
+		stream.on('data', () => {
+			if (stream.getBufferedLength() > maxBuffer) {
+				rejectPromise(new MaxBufferError());
+			}
+		});
+	});
+
+	return stream.getBufferedValue();
+}
+
+module.exports = getStream;
+// TODO: Remove this for the next major release
+module.exports.default = getStream;
+module.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'});
+module.exports.array = (stream, options) => getStream(stream, {...options, array: true});
+module.exports.MaxBufferError = MaxBufferError;
diff --git a/node_modules/get-stream/license b/node_modules/get-stream/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/node_modules/get-stream/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/get-stream/package.json b/node_modules/get-stream/package.json
new file mode 100644
index 0000000..a92b2f9
--- /dev/null
+++ b/node_modules/get-stream/package.json
@@ -0,0 +1,49 @@
+{
+  "author": {
+    "email": "sindresorhus@gmail.com",
+    "name": "Sindre Sorhus",
+    "url": "sindresorhus.com"
+  },
+  "dependencies": {
+    "pump": "^3.0.0"
+  },
+  "description": "Get a stream as a string, buffer, or array",
+  "devDependencies": {
+    "@types/node": "^11.13.0",
+    "ava": "^1.4.1",
+    "into-stream": "^5.0.0",
+    "tsd": "^0.7.2",
+    "xo": "^0.24.0"
+  },
+  "engines": {
+    "node": ">=8"
+  },
+  "files": [
+    "index.js",
+    "index.d.ts",
+    "buffer-stream.js"
+  ],
+  "keywords": [
+    "get",
+    "stream",
+    "promise",
+    "concat",
+    "string",
+    "text",
+    "buffer",
+    "read",
+    "data",
+    "consume",
+    "readable",
+    "readablestream",
+    "array",
+    "object"
+  ],
+  "license": "MIT",
+  "name": "get-stream",
+  "repository": "sindresorhus/get-stream",
+  "scripts": {
+    "test": "xo && ava && tsd"
+  },
+  "version": "5.1.0"
+}
\ No newline at end of file
diff --git a/node_modules/get-stream/readme.md b/node_modules/get-stream/readme.md
new file mode 100644
index 0000000..b87a4d3
--- /dev/null
+++ b/node_modules/get-stream/readme.md
@@ -0,0 +1,123 @@
+# get-stream [![Build Status](https://travis-ci.org/sindresorhus/get-stream.svg?branch=master)](https://travis-ci.org/sindresorhus/get-stream)
+
+> Get a stream as a string, buffer, or array
+
+
+## Install
+
+```
+$ npm install get-stream
+```
+
+
+## Usage
+
+```js
+const fs = require('fs');
+const getStream = require('get-stream');
+
+(async () => {
+	const stream = fs.createReadStream('unicorn.txt');
+
+	console.log(await getStream(stream));
+	/*
+	              ,,))))))));,
+	           __)))))))))))))),
+	\|/       -\(((((''''((((((((.
+	-*-==//////((''  .     `)))))),
+	/|\      ))| o    ;-.    '(((((                                  ,(,
+	         ( `|    /  )    ;))))'                               ,_))^;(~
+	            |   |   |   ,))((((_     _____------~~~-.        %,;(;(>';'~
+	            o_);   ;    )))(((` ~---~  `::           \      %%~~)(v;(`('~
+	                  ;    ''''````         `:       `:::|\,__,%%    );`'; ~
+	                 |   _                )     /      `:|`----'     `-'
+	           ______/\/~    |                 /        /
+	         /~;;.____/;;'  /          ___--,-(   `;;;/
+	        / //  _;______;'------~~~~~    /;;/\    /
+	       //  | |                        / ;   \;;,\
+	      (<_  | ;                      /',/-----'  _>
+	       \_| ||_                     //~;~~~~~~~~~
+	           `\_|                   (,~~
+	                                   \~\
+	                                    ~~
+	*/
+})();
+```
+
+
+## API
+
+The methods returns a promise that resolves when the `end` event fires on the stream, indicating that there is no more data to be read. The stream is switched to flowing mode.
+
+### getStream(stream, [options])
+
+Get the `stream` as a string.
+
+#### options
+
+Type: `Object`
+
+##### encoding
+
+Type: `string`<br>
+Default: `utf8`
+
+[Encoding](https://nodejs.org/api/buffer.html#buffer_buffer) of the incoming stream.
+
+##### maxBuffer
+
+Type: `number`<br>
+Default: `Infinity`
+
+Maximum length of the returned string. If it exceeds this value before the stream ends, the promise will be rejected with a `getStream.MaxBufferError` error.
+
+### getStream.buffer(stream, [options])
+
+Get the `stream` as a buffer.
+
+It honors the `maxBuffer` option as above, but it refers to byte length rather than string length.
+
+### getStream.array(stream, [options])
+
+Get the `stream` as an array of values.
+
+It honors both the `maxBuffer` and `encoding` options. The behavior changes slightly based on the encoding chosen:
+
+- When `encoding` is unset, it assumes an [object mode stream](https://nodesource.com/blog/understanding-object-streams/) and collects values emitted from `stream` unmodified. In this case `maxBuffer` refers to the number of items in the array (not the sum of their sizes).
+
+- When `encoding` is set to `buffer`, it collects an array of buffers. `maxBuffer` refers to the summed byte lengths of every buffer in the array.
+
+- When `encoding` is set to anything else, it collects an array of strings. `maxBuffer` refers to the summed character lengths of every string in the array.
+
+
+## Errors
+
+If the input stream emits an `error` event, the promise will be rejected with the error. The buffered data will be attached to the `bufferedData` property of the error.
+
+```js
+(async () => {
+	try {
+		await getStream(streamThatErrorsAtTheEnd('unicorn'));
+	} catch (error) {
+		console.log(error.bufferedData);
+		//=> 'unicorn'
+	}
+})()
+```
+
+
+## FAQ
+
+### How is this different from [`concat-stream`](https://github.com/maxogden/concat-stream)?
+
+This module accepts a stream instead of being one and returns a promise instead of using a callback. The API is simpler and it only supports returning a string, buffer, or array. It doesn't have a fragile type inference. You explicitly choose what you want. And it doesn't depend on the huge `readable-stream` package.
+
+
+## Related
+
+- [get-stdin](https://github.com/sindresorhus/get-stdin) - Get stdin as a string or buffer
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/https-proxy-agent/index.js b/node_modules/https-proxy-agent/index.js
index 817a0a9..aa3021e 100644
--- a/node_modules/https-proxy-agent/index.js
+++ b/node_modules/https-proxy-agent/index.js
@@ -59,7 +59,6 @@
 	}
 
 	this.proxy = proxy;
-	this.defaultPort = 443;
 }
 inherits(HttpsProxyAgent, Agent);
 
@@ -171,7 +170,6 @@
 			socket = new net.Socket();
 			socket.readable = true;
 
-
 			// save a reference to the concat'd Buffer for the `onsocket` callback
 			buffers = buffered;
 
diff --git a/node_modules/https-proxy-agent/node_modules/debug/CHANGELOG.md b/node_modules/https-proxy-agent/node_modules/debug/CHANGELOG.md
deleted file mode 100644
index 820d21e..0000000
--- a/node_modules/https-proxy-agent/node_modules/debug/CHANGELOG.md
+++ /dev/null
@@ -1,395 +0,0 @@
-
-3.1.0 / 2017-09-26
-==================
-
-  * Add `DEBUG_HIDE_DATE` env var (#486)
-  * Remove ReDoS regexp in %o formatter (#504)
-  * Remove "component" from package.json
-  * Remove `component.json`
-  * Ignore package-lock.json
-  * Examples: fix colors printout
-  * Fix: browser detection
-  * Fix: spelling mistake (#496, @EdwardBetts)
-
-3.0.1 / 2017-08-24
-==================
-
-  * Fix: Disable colors in Edge and Internet Explorer (#489)
-
-3.0.0 / 2017-08-08
-==================
-
-  * Breaking: Remove DEBUG_FD (#406)
-  * Breaking: Use `Date#toISOString()` instead to `Date#toUTCString()` when output is not a TTY (#418)
-  * Breaking: Make millisecond timer namespace specific and allow 'always enabled' output (#408)
-  * Addition: document `enabled` flag (#465)
-  * Addition: add 256 colors mode (#481)
-  * Addition: `enabled()` updates existing debug instances, add `destroy()` function (#440)
-  * Update: component: update "ms" to v2.0.0
-  * Update: separate the Node and Browser tests in Travis-CI
-  * Update: refactor Readme, fixed documentation, added "Namespace Colors" section, redid screenshots
-  * Update: separate Node.js and web browser examples for organization
-  * Update: update "browserify" to v14.4.0
-  * Fix: fix Readme typo (#473)
-
-2.6.9 / 2017-09-22
-==================
-
-  * remove ReDoS regexp in %o formatter (#504)
-
-2.6.8 / 2017-05-18
-==================
-
-  * Fix: Check for undefined on browser globals (#462, @marbemac)
-
-2.6.7 / 2017-05-16
-==================
-
-  * Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom)
-  * Fix: Inline extend function in node implementation (#452, @dougwilson)
-  * Docs: Fix typo (#455, @msasad)
-
-2.6.5 / 2017-04-27
-==================
-  
-  * Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek)
-  * Misc: clean up browser reference checks (#447, @thebigredgeek)
-  * Misc: add npm-debug.log to .gitignore (@thebigredgeek)
-
-
-2.6.4 / 2017-04-20
-==================
-
-  * Fix: bug that would occur if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo)
-  * Chore: ignore bower.json in npm installations. (#437, @joaovieira)
-  * Misc: update "ms" to v0.7.3 (@tootallnate)
-
-2.6.3 / 2017-03-13
-==================
-
-  * Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts)
-  * Docs: Changelog fix (@thebigredgeek)
-
-2.6.2 / 2017-03-10
-==================
-
-  * Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin)
-  * Docs: Add backers and sponsors from Open Collective (#422, @piamancini)
-  * Docs: Add Slackin invite badge (@tootallnate)
-
-2.6.1 / 2017-02-10
-==================
-
-  * Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error
-  * Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0)
-  * Fix: IE8 "Expected identifier" error (#414, @vgoma)
-  * Fix: Namespaces would not disable once enabled (#409, @musikov)
-
-2.6.0 / 2016-12-28
-==================
-
-  * Fix: added better null pointer checks for browser useColors (@thebigredgeek)
-  * Improvement: removed explicit `window.debug` export (#404, @tootallnate)
-  * Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate)
-
-2.5.2 / 2016-12-25
-==================
-
-  * Fix: reference error on window within webworkers (#393, @KlausTrainer)
-  * Docs: fixed README typo (#391, @lurch)
-  * Docs: added notice about v3 api discussion (@thebigredgeek)
-
-2.5.1 / 2016-12-20
-==================
-
-  * Fix: babel-core compatibility
-
-2.5.0 / 2016-12-20
-==================
-
-  * Fix: wrong reference in bower file (@thebigredgeek)
-  * Fix: webworker compatibility (@thebigredgeek)
-  * Fix: output formatting issue (#388, @kribblo)
-  * Fix: babel-loader compatibility (#383, @escwald)
-  * Misc: removed built asset from repo and publications (@thebigredgeek)
-  * Misc: moved source files to /src (#378, @yamikuronue)
-  * Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue)
-  * Test: coveralls integration (#378, @yamikuronue)
-  * Docs: simplified language in the opening paragraph (#373, @yamikuronue)
-
-2.4.5 / 2016-12-17
-==================
-
-  * Fix: `navigator` undefined in Rhino (#376, @jochenberger)
-  * Fix: custom log function (#379, @hsiliev)
-  * Improvement: bit of cleanup + linting fixes (@thebigredgeek)
-  * Improvement: rm non-maintainted `dist/` dir (#375, @freewil)
-  * Docs: simplified language in the opening paragraph. (#373, @yamikuronue)
-
-2.4.4 / 2016-12-14
-==================
-
-  * Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts)
-
-2.4.3 / 2016-12-14
-==================
-
-  * Fix: navigation.userAgent error for react native (#364, @escwald)
-
-2.4.2 / 2016-12-14
-==================
-
-  * Fix: browser colors (#367, @tootallnate)
-  * Misc: travis ci integration (@thebigredgeek)
-  * Misc: added linting and testing boilerplate with sanity check (@thebigredgeek)
-
-2.4.1 / 2016-12-13
-==================
-
-  * Fix: typo that broke the package (#356)
-
-2.4.0 / 2016-12-13
-==================
-
-  * Fix: bower.json references unbuilt src entry point (#342, @justmatt)
-  * Fix: revert "handle regex special characters" (@tootallnate)
-  * Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate)
-  * Feature: %O`(big O) pretty-prints objects (#322, @tootallnate)
-  * Improvement: allow colors in workers (#335, @botverse)
-  * Improvement: use same color for same namespace. (#338, @lchenay)
-
-2.3.3 / 2016-11-09
-==================
-
-  * Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne)
-  * Fix: Returning `localStorage` saved values (#331, Levi Thomason)
-  * Improvement: Don't create an empty object when no `process` (Nathan Rajlich)
-
-2.3.2 / 2016-11-09
-==================
-
-  * Fix: be super-safe in index.js as well (@TooTallNate)
-  * Fix: should check whether process exists (Tom Newby)
-
-2.3.1 / 2016-11-09
-==================
-
-  * Fix: Added electron compatibility (#324, @paulcbetts)
-  * Improvement: Added performance optimizations (@tootallnate)
-  * Readme: Corrected PowerShell environment variable example (#252, @gimre)
-  * Misc: Removed yarn lock file from source control (#321, @fengmk2)
-
-2.3.0 / 2016-11-07
-==================
-
-  * Fix: Consistent placement of ms diff at end of output (#215, @gorangajic)
-  * Fix: Escaping of regex special characters in namespace strings (#250, @zacronos)
-  * Fix: Fixed bug causing crash on react-native (#282, @vkarpov15)
-  * Feature: Enabled ES6+ compatible import via default export (#212 @bucaran)
-  * Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom)
-  * Package: Update "ms" to 0.7.2 (#315, @DevSide)
-  * Package: removed superfluous version property from bower.json (#207 @kkirsche)
-  * Readme: fix USE_COLORS to DEBUG_COLORS
-  * Readme: Doc fixes for format string sugar (#269, @mlucool)
-  * Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0)
-  * Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable)
-  * Readme: better docs for browser support (#224, @matthewmueller)
-  * Tooling: Added yarn integration for development (#317, @thebigredgeek)
-  * Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek)
-  * Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman)
-  * Misc: Updated contributors (@thebigredgeek)
-
-2.2.0 / 2015-05-09
-==================
-
-  * package: update "ms" to v0.7.1 (#202, @dougwilson)
-  * README: add logging to file example (#193, @DanielOchoa)
-  * README: fixed a typo (#191, @amir-s)
-  * browser: expose `storage` (#190, @stephenmathieson)
-  * Makefile: add a `distclean` target (#189, @stephenmathieson)
-
-2.1.3 / 2015-03-13
-==================
-
-  * Updated stdout/stderr example (#186)
-  * Updated example/stdout.js to match debug current behaviour
-  * Renamed example/stderr.js to stdout.js
-  * Update Readme.md (#184)
-  * replace high intensity foreground color for bold (#182, #183)
-
-2.1.2 / 2015-03-01
-==================
-
-  * dist: recompile
-  * update "ms" to v0.7.0
-  * package: update "browserify" to v9.0.3
-  * component: fix "ms.js" repo location
-  * changed bower package name
-  * updated documentation about using debug in a browser
-  * fix: security error on safari (#167, #168, @yields)
-
-2.1.1 / 2014-12-29
-==================
-
-  * browser: use `typeof` to check for `console` existence
-  * browser: check for `console.log` truthiness (fix IE 8/9)
-  * browser: add support for Chrome apps
-  * Readme: added Windows usage remarks
-  * Add `bower.json` to properly support bower install
-
-2.1.0 / 2014-10-15
-==================
-
-  * node: implement `DEBUG_FD` env variable support
-  * package: update "browserify" to v6.1.0
-  * package: add "license" field to package.json (#135, @panuhorsmalahti)
-
-2.0.0 / 2014-09-01
-==================
-
-  * package: update "browserify" to v5.11.0
-  * node: use stderr rather than stdout for logging (#29, @stephenmathieson)
-
-1.0.4 / 2014-07-15
-==================
-
-  * dist: recompile
-  * example: remove `console.info()` log usage
-  * example: add "Content-Type" UTF-8 header to browser example
-  * browser: place %c marker after the space character
-  * browser: reset the "content" color via `color: inherit`
-  * browser: add colors support for Firefox >= v31
-  * debug: prefer an instance `log()` function over the global one (#119)
-  * Readme: update documentation about styled console logs for FF v31 (#116, @wryk)
-
-1.0.3 / 2014-07-09
-==================
-
-  * Add support for multiple wildcards in namespaces (#122, @seegno)
-  * browser: fix lint
-
-1.0.2 / 2014-06-10
-==================
-
-  * browser: update color palette (#113, @gscottolson)
-  * common: make console logging function configurable (#108, @timoxley)
-  * node: fix %o colors on old node <= 0.8.x
-  * Makefile: find node path using shell/which (#109, @timoxley)
-
-1.0.1 / 2014-06-06
-==================
-
-  * browser: use `removeItem()` to clear localStorage
-  * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777)
-  * package: add "contributors" section
-  * node: fix comment typo
-  * README: list authors
-
-1.0.0 / 2014-06-04
-==================
-
-  * make ms diff be global, not be scope
-  * debug: ignore empty strings in enable()
-  * node: make DEBUG_COLORS able to disable coloring
-  * *: export the `colors` array
-  * npmignore: don't publish the `dist` dir
-  * Makefile: refactor to use browserify
-  * package: add "browserify" as a dev dependency
-  * Readme: add Web Inspector Colors section
-  * node: reset terminal color for the debug content
-  * node: map "%o" to `util.inspect()`
-  * browser: map "%j" to `JSON.stringify()`
-  * debug: add custom "formatters"
-  * debug: use "ms" module for humanizing the diff
-  * Readme: add "bash" syntax highlighting
-  * browser: add Firebug color support
-  * browser: add colors for WebKit browsers
-  * node: apply log to `console`
-  * rewrite: abstract common logic for Node & browsers
-  * add .jshintrc file
-
-0.8.1 / 2014-04-14
-==================
-
-  * package: re-add the "component" section
-
-0.8.0 / 2014-03-30
-==================
-
-  * add `enable()` method for nodejs. Closes #27
-  * change from stderr to stdout
-  * remove unnecessary index.js file
-
-0.7.4 / 2013-11-13
-==================
-
-  * remove "browserify" key from package.json (fixes something in browserify)
-
-0.7.3 / 2013-10-30
-==================
-
-  * fix: catch localStorage security error when cookies are blocked (Chrome)
-  * add debug(err) support. Closes #46
-  * add .browser prop to package.json. Closes #42
-
-0.7.2 / 2013-02-06
-==================
-
-  * fix package.json
-  * fix: Mobile Safari (private mode) is broken with debug
-  * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript
-
-0.7.1 / 2013-02-05
-==================
-
-  * add repository URL to package.json
-  * add DEBUG_COLORED to force colored output
-  * add browserify support
-  * fix component. Closes #24
-
-0.7.0 / 2012-05-04
-==================
-
-  * Added .component to package.json
-  * Added debug.component.js build
-
-0.6.0 / 2012-03-16
-==================
-
-  * Added support for "-" prefix in DEBUG [Vinay Pulim]
-  * Added `.enabled` flag to the node version [TooTallNate]
-
-0.5.0 / 2012-02-02
-==================
-
-  * Added: humanize diffs. Closes #8
-  * Added `debug.disable()` to the CS variant
-  * Removed padding. Closes #10
-  * Fixed: persist client-side variant again. Closes #9
-
-0.4.0 / 2012-02-01
-==================
-
-  * Added browser variant support for older browsers [TooTallNate]
-  * Added `debug.enable('project:*')` to browser variant [TooTallNate]
-  * Added padding to diff (moved it to the right)
-
-0.3.0 / 2012-01-26
-==================
-
-  * Added millisecond diff when isatty, otherwise UTC string
-
-0.2.0 / 2012-01-22
-==================
-
-  * Added wildcard support
-
-0.1.0 / 2011-12-02
-==================
-
-  * Added: remove colors unless stderr isatty [TooTallNate]
-
-0.0.1 / 2010-01-03
-==================
-
-  * Initial release
diff --git a/node_modules/https-proxy-agent/node_modules/debug/LICENSE b/node_modules/https-proxy-agent/node_modules/debug/LICENSE
deleted file mode 100644
index 658c933..0000000
--- a/node_modules/https-proxy-agent/node_modules/debug/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-(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/https-proxy-agent/node_modules/debug/README.md b/node_modules/https-proxy-agent/node_modules/debug/README.md
deleted file mode 100644
index 0ee7634..0000000
--- a/node_modules/https-proxy-agent/node_modules/debug/README.md
+++ /dev/null
@@ -1,437 +0,0 @@
-# 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
-```
-
-## 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/https-proxy-agent/node_modules/debug/dist/debug.js b/node_modules/https-proxy-agent/node_modules/debug/dist/debug.js
deleted file mode 100644
index f271e01..0000000
--- a/node_modules/https-proxy-agent/node_modules/debug/dist/debug.js
+++ /dev/null
@@ -1,886 +0,0 @@
-"use strict";
-
-function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
-
-(function (f) {
-  if ((typeof exports === "undefined" ? "undefined" : _typeof(exports)) === "object" && typeof module !== "undefined") {
-    module.exports = f();
-  } else if (typeof define === "function" && define.amd) {
-    define([], f);
-  } else {
-    var g;
-
-    if (typeof window !== "undefined") {
-      g = window;
-    } else if (typeof global !== "undefined") {
-      g = global;
-    } else if (typeof self !== "undefined") {
-      g = self;
-    } else {
-      g = this;
-    }
-
-    g.debug = f();
-  }
-})(function () {
-  var define, module, exports;
-  return function () {
-    function r(e, n, t) {
-      function o(i, f) {
-        if (!n[i]) {
-          if (!e[i]) {
-            var c = "function" == typeof require && require;
-            if (!f && c) return c(i, !0);
-            if (u) return u(i, !0);
-            var a = new Error("Cannot find module '" + i + "'");
-            throw a.code = "MODULE_NOT_FOUND", a;
-          }
-
-          var p = n[i] = {
-            exports: {}
-          };
-          e[i][0].call(p.exports, function (r) {
-            var n = e[i][1][r];
-            return o(n || r);
-          }, p, p.exports, r, e, n, t);
-        }
-
-        return n[i].exports;
-      }
-
-      for (var u = "function" == typeof require && require, i = 0; i < t.length; i++) {
-        o(t[i]);
-      }
-
-      return o;
-    }
-
-    return r;
-  }()({
-    1: [function (require, module, exports) {
-      /**
-       * 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' && isNaN(val) === false) {
-          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?\.?\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' : '');
-      }
-    }, {}],
-    2: [function (require, module, exports) {
-      // shim for using process in browser
-      var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it
-      // don't break things.  But we need to wrap it in a try catch in case it is
-      // wrapped in strict mode code which doesn't define any globals.  It's inside a
-      // function because try/catches deoptimize in certain engines.
-
-      var cachedSetTimeout;
-      var cachedClearTimeout;
-
-      function defaultSetTimout() {
-        throw new Error('setTimeout has not been defined');
-      }
-
-      function defaultClearTimeout() {
-        throw new Error('clearTimeout has not been defined');
-      }
-
-      (function () {
-        try {
-          if (typeof setTimeout === 'function') {
-            cachedSetTimeout = setTimeout;
-          } else {
-            cachedSetTimeout = defaultSetTimout;
-          }
-        } catch (e) {
-          cachedSetTimeout = defaultSetTimout;
-        }
-
-        try {
-          if (typeof clearTimeout === 'function') {
-            cachedClearTimeout = clearTimeout;
-          } else {
-            cachedClearTimeout = defaultClearTimeout;
-          }
-        } catch (e) {
-          cachedClearTimeout = defaultClearTimeout;
-        }
-      })();
-
-      function runTimeout(fun) {
-        if (cachedSetTimeout === setTimeout) {
-          //normal enviroments in sane situations
-          return setTimeout(fun, 0);
-        } // if setTimeout wasn't available but was latter defined
-
-
-        if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
-          cachedSetTimeout = setTimeout;
-          return setTimeout(fun, 0);
-        }
-
-        try {
-          // when when somebody has screwed with setTimeout but no I.E. maddness
-          return cachedSetTimeout(fun, 0);
-        } catch (e) {
-          try {
-            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
-            return cachedSetTimeout.call(null, fun, 0);
-          } catch (e) {
-            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
-            return cachedSetTimeout.call(this, fun, 0);
-          }
-        }
-      }
-
-      function runClearTimeout(marker) {
-        if (cachedClearTimeout === clearTimeout) {
-          //normal enviroments in sane situations
-          return clearTimeout(marker);
-        } // if clearTimeout wasn't available but was latter defined
-
-
-        if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
-          cachedClearTimeout = clearTimeout;
-          return clearTimeout(marker);
-        }
-
-        try {
-          // when when somebody has screwed with setTimeout but no I.E. maddness
-          return cachedClearTimeout(marker);
-        } catch (e) {
-          try {
-            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
-            return cachedClearTimeout.call(null, marker);
-          } catch (e) {
-            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
-            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
-            return cachedClearTimeout.call(this, marker);
-          }
-        }
-      }
-
-      var queue = [];
-      var draining = false;
-      var currentQueue;
-      var queueIndex = -1;
-
-      function cleanUpNextTick() {
-        if (!draining || !currentQueue) {
-          return;
-        }
-
-        draining = false;
-
-        if (currentQueue.length) {
-          queue = currentQueue.concat(queue);
-        } else {
-          queueIndex = -1;
-        }
-
-        if (queue.length) {
-          drainQueue();
-        }
-      }
-
-      function drainQueue() {
-        if (draining) {
-          return;
-        }
-
-        var timeout = runTimeout(cleanUpNextTick);
-        draining = true;
-        var len = queue.length;
-
-        while (len) {
-          currentQueue = queue;
-          queue = [];
-
-          while (++queueIndex < len) {
-            if (currentQueue) {
-              currentQueue[queueIndex].run();
-            }
-          }
-
-          queueIndex = -1;
-          len = queue.length;
-        }
-
-        currentQueue = null;
-        draining = false;
-        runClearTimeout(timeout);
-      }
-
-      process.nextTick = function (fun) {
-        var args = new Array(arguments.length - 1);
-
-        if (arguments.length > 1) {
-          for (var i = 1; i < arguments.length; i++) {
-            args[i - 1] = arguments[i];
-          }
-        }
-
-        queue.push(new Item(fun, args));
-
-        if (queue.length === 1 && !draining) {
-          runTimeout(drainQueue);
-        }
-      }; // v8 likes predictible objects
-
-
-      function Item(fun, array) {
-        this.fun = fun;
-        this.array = array;
-      }
-
-      Item.prototype.run = function () {
-        this.fun.apply(null, this.array);
-      };
-
-      process.title = 'browser';
-      process.browser = true;
-      process.env = {};
-      process.argv = [];
-      process.version = ''; // empty string to avoid regexp issues
-
-      process.versions = {};
-
-      function noop() {}
-
-      process.on = noop;
-      process.addListener = noop;
-      process.once = noop;
-      process.off = noop;
-      process.removeListener = noop;
-      process.removeAllListeners = noop;
-      process.emit = noop;
-      process.prependListener = noop;
-      process.prependOnceListener = noop;
-
-      process.listeners = function (name) {
-        return [];
-      };
-
-      process.binding = function (name) {
-        throw new Error('process.binding is not supported');
-      };
-
-      process.cwd = function () {
-        return '/';
-      };
-
-      process.chdir = function (dir) {
-        throw new Error('process.chdir is not supported');
-      };
-
-      process.umask = function () {
-        return 0;
-      };
-    }, {}],
-    3: [function (require, module, exports) {
-      /**
-       * 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');
-        Object.keys(env).forEach(function (key) {
-          createDebug[key] = env[key];
-        });
-        /**
-        * Active `debug` instances.
-        */
-
-        createDebug.instances = [];
-        /**
-        * 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) {
-          var hash = 0;
-
-          for (var 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) {
-          var prevTime;
-
-          function debug() {
-            for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
-              args[_key] = arguments[_key];
-            }
-
-            // Disabled?
-            if (!debug.enabled) {
-              return;
-            }
-
-            var self = debug; // Set `diff` timestamp
-
-            var curr = Number(new Date());
-            var 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
-
-
-            var index = 0;
-            args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) {
-              // If we encounter an escaped % then don't increase the array index
-              if (match === '%%') {
-                return match;
-              }
-
-              index++;
-              var formatter = createDebug.formatters[format];
-
-              if (typeof formatter === 'function') {
-                var val = args[index];
-                match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format`
-
-                args.splice(index, 1);
-                index--;
-              }
-
-              return match;
-            }); // Apply env-specific formatting (colors, etc.)
-
-            createDebug.formatArgs.call(self, args);
-            var logFn = self.log || createDebug.log;
-            logFn.apply(self, args);
-          }
-
-          debug.namespace = namespace;
-          debug.enabled = createDebug.enabled(namespace);
-          debug.useColors = createDebug.useColors();
-          debug.color = selectColor(namespace);
-          debug.destroy = destroy;
-          debug.extend = extend; // Debug.formatArgs = formatArgs;
-          // debug.rawLog = rawLog;
-          // env-specific initialization logic for debug instances
-
-          if (typeof createDebug.init === 'function') {
-            createDebug.init(debug);
-          }
-
-          createDebug.instances.push(debug);
-          return debug;
-        }
-
-        function destroy() {
-          var index = createDebug.instances.indexOf(this);
-
-          if (index !== -1) {
-            createDebug.instances.splice(index, 1);
-            return true;
-          }
-
-          return false;
-        }
-
-        function extend(namespace, delimiter) {
-          return createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
-        }
-        /**
-        * 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 = [];
-          var i;
-          var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
-          var 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 + '$'));
-            }
-          }
-
-          for (i = 0; i < createDebug.instances.length; i++) {
-            var instance = createDebug.instances[i];
-            instance.enabled = createDebug.enabled(instance.namespace);
-          }
-        }
-        /**
-        * Disable debug output.
-        *
-        * @api public
-        */
-
-
-        function disable() {
-          createDebug.enable('');
-        }
-        /**
-        * 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;
-          }
-
-          var i;
-          var 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;
-        }
-        /**
-        * Coerce `val`.
-        *
-        * @param {Mixed} val
-        * @return {Mixed}
-        * @api private
-        */
-
-
-        function coerce(val) {
-          if (val instanceof Error) {
-            return val.stack || val.message;
-          }
-
-          return val;
-        }
-
-        createDebug.enable(createDebug.load());
-        return createDebug;
-      }
-
-      module.exports = setup;
-    }, {
-      "ms": 1
-    }],
-    4: [function (require, module, exports) {
-      (function (process) {
-        /* eslint-env browser */
-
-        /**
-         * This is the web browser implementation of `debug()`.
-         */
-        exports.log = log;
-        exports.formatArgs = formatArgs;
-        exports.save = save;
-        exports.load = load;
-        exports.useColors = useColors;
-        exports.storage = localstorage();
-        /**
-         * 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;
-          }
-
-          var 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
-
-          var index = 0;
-          var lastC = 0;
-          args[0].replace(/%[a-zA-Z%]/g, function (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.log()` when available.
-         * No-op when `console.log` is not a "function".
-         *
-         * @api public
-         */
-
-
-        function log() {
-          var _console;
-
-          // This hackery is required for IE8/9, where
-          // the `console.log` function doesn't have 'apply'
-          return (typeof console === "undefined" ? "undefined" : _typeof(console)) === 'object' && console.log && (_console = console).log.apply(_console, arguments);
-        }
-        /**
-         * 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() {
-          var 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);
-        var formatters = module.exports.formatters;
-        /**
-         * 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;
-          }
-        };
-      }).call(this, require('_process'));
-    }, {
-      "./common": 3,
-      "_process": 2
-    }]
-  }, {}, [4])(4);
-});
-
diff --git a/node_modules/https-proxy-agent/node_modules/debug/node.js b/node_modules/https-proxy-agent/node_modules/debug/node.js
deleted file mode 100644
index 7fc36fe..0000000
--- a/node_modules/https-proxy-agent/node_modules/debug/node.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./src/node');
diff --git a/node_modules/https-proxy-agent/node_modules/debug/package.json b/node_modules/https-proxy-agent/node_modules/debug/package.json
deleted file mode 100644
index 37429d1..0000000
--- a/node_modules/https-proxy-agent/node_modules/debug/package.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
-  "author": "TJ Holowaychuk <tj@vision-media.ca>",
-  "browser": "./src/browser.js",
-  "contributors": [
-    "Nathan Rajlich <nathan@tootallnate.net> (http://n8.io)",
-    "Andrew Rhyne <rhyneandrew@gmail.com>"
-  ],
-  "dependencies": {
-    "ms": "^2.1.1"
-  },
-  "description": "small debugging utility",
-  "devDependencies": {
-    "@babel/cli": "^7.0.0",
-    "@babel/core": "^7.0.0",
-    "@babel/preset-env": "^7.0.0",
-    "browserify": "14.4.0",
-    "chai": "^3.5.0",
-    "concurrently": "^3.1.0",
-    "coveralls": "^3.0.2",
-    "istanbul": "^0.4.5",
-    "karma": "^3.0.0",
-    "karma-chai": "^0.1.0",
-    "karma-mocha": "^1.3.0",
-    "karma-phantomjs-launcher": "^1.0.2",
-    "mocha": "^5.2.0",
-    "mocha-lcov-reporter": "^1.2.0",
-    "rimraf": "^2.5.4",
-    "xo": "^0.23.0"
-  },
-  "files": [
-    "src",
-    "node.js",
-    "dist/debug.js",
-    "LICENSE",
-    "README.md"
-  ],
-  "keywords": [
-    "debug",
-    "log",
-    "debugger"
-  ],
-  "license": "MIT",
-  "main": "./src/index.js",
-  "name": "debug",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/visionmedia/debug.git"
-  },
-  "unpkg": "./dist/debug.js",
-  "version": "3.2.6"
-}
\ No newline at end of file
diff --git a/node_modules/https-proxy-agent/node_modules/debug/src/browser.js b/node_modules/https-proxy-agent/node_modules/debug/src/browser.js
deleted file mode 100644
index c924b0a..0000000
--- a/node_modules/https-proxy-agent/node_modules/debug/src/browser.js
+++ /dev/null
@@ -1,180 +0,0 @@
-"use strict";
-
-function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
-
-/* eslint-env browser */
-
-/**
- * This is the web browser implementation of `debug()`.
- */
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-exports.storage = localstorage();
-/**
- * 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;
-  }
-
-  var 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
-
-  var index = 0;
-  var lastC = 0;
-  args[0].replace(/%[a-zA-Z%]/g, function (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.log()` when available.
- * No-op when `console.log` is not a "function".
- *
- * @api public
- */
-
-
-function log() {
-  var _console;
-
-  // This hackery is required for IE8/9, where
-  // the `console.log` function doesn't have 'apply'
-  return (typeof console === "undefined" ? "undefined" : _typeof(console)) === 'object' && console.log && (_console = console).log.apply(_console, arguments);
-}
-/**
- * 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() {
-  var 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);
-var formatters = module.exports.formatters;
-/**
- * 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/https-proxy-agent/node_modules/debug/src/common.js b/node_modules/https-proxy-agent/node_modules/debug/src/common.js
deleted file mode 100644
index e0de3fb..0000000
--- a/node_modules/https-proxy-agent/node_modules/debug/src/common.js
+++ /dev/null
@@ -1,249 +0,0 @@
-"use strict";
-
-/**
- * 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');
-  Object.keys(env).forEach(function (key) {
-    createDebug[key] = env[key];
-  });
-  /**
-  * Active `debug` instances.
-  */
-
-  createDebug.instances = [];
-  /**
-  * 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) {
-    var hash = 0;
-
-    for (var 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) {
-    var prevTime;
-
-    function debug() {
-      // Disabled?
-      if (!debug.enabled) {
-        return;
-      }
-
-      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
-        args[_key] = arguments[_key];
-      }
-
-      var self = debug; // Set `diff` timestamp
-
-      var curr = Number(new Date());
-      var 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
-
-
-      var index = 0;
-      args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) {
-        // If we encounter an escaped % then don't increase the array index
-        if (match === '%%') {
-          return match;
-        }
-
-        index++;
-        var formatter = createDebug.formatters[format];
-
-        if (typeof formatter === 'function') {
-          var val = args[index];
-          match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format`
-
-          args.splice(index, 1);
-          index--;
-        }
-
-        return match;
-      }); // Apply env-specific formatting (colors, etc.)
-
-      createDebug.formatArgs.call(self, args);
-      var logFn = self.log || createDebug.log;
-      logFn.apply(self, args);
-    }
-
-    debug.namespace = namespace;
-    debug.enabled = createDebug.enabled(namespace);
-    debug.useColors = createDebug.useColors();
-    debug.color = selectColor(namespace);
-    debug.destroy = destroy;
-    debug.extend = extend; // Debug.formatArgs = formatArgs;
-    // debug.rawLog = rawLog;
-    // env-specific initialization logic for debug instances
-
-    if (typeof createDebug.init === 'function') {
-      createDebug.init(debug);
-    }
-
-    createDebug.instances.push(debug);
-    return debug;
-  }
-
-  function destroy() {
-    var index = createDebug.instances.indexOf(this);
-
-    if (index !== -1) {
-      createDebug.instances.splice(index, 1);
-      return true;
-    }
-
-    return false;
-  }
-
-  function extend(namespace, delimiter) {
-    return createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
-  }
-  /**
-  * 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 = [];
-    var i;
-    var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
-    var 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 + '$'));
-      }
-    }
-
-    for (i = 0; i < createDebug.instances.length; i++) {
-      var instance = createDebug.instances[i];
-      instance.enabled = createDebug.enabled(instance.namespace);
-    }
-  }
-  /**
-  * Disable debug output.
-  *
-  * @api public
-  */
-
-
-  function disable() {
-    createDebug.enable('');
-  }
-  /**
-  * 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;
-    }
-
-    var i;
-    var 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;
-  }
-  /**
-  * Coerce `val`.
-  *
-  * @param {Mixed} val
-  * @return {Mixed}
-  * @api private
-  */
-
-
-  function coerce(val) {
-    if (val instanceof Error) {
-      return val.stack || val.message;
-    }
-
-    return val;
-  }
-
-  createDebug.enable(createDebug.load());
-  return createDebug;
-}
-
-module.exports = setup;
-
diff --git a/node_modules/https-proxy-agent/node_modules/debug/src/index.js b/node_modules/https-proxy-agent/node_modules/debug/src/index.js
deleted file mode 100644
index 0217315..0000000
--- a/node_modules/https-proxy-agent/node_modules/debug/src/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-
-/**
- * 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/https-proxy-agent/node_modules/debug/src/node.js b/node_modules/https-proxy-agent/node_modules/debug/src/node.js
deleted file mode 100644
index dbbb5f1..0000000
--- a/node_modules/https-proxy-agent/node_modules/debug/src/node.js
+++ /dev/null
@@ -1,174 +0,0 @@
-"use strict";
-
-/**
- * Module dependencies.
- */
-var tty = require('tty');
-
-var 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;
-/**
- * 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
-  var 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(function (key) {
-  return /^debug_/i.test(key);
-}).reduce(function (obj, key) {
-  // Camel-case
-  var prop = key.substring(6).toLowerCase().replace(/_([a-z])/g, function (_, k) {
-    return k.toUpperCase();
-  }); // Coerce string value into JS value
-
-  var 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) {
-  var name = this.namespace,
-      useColors = this.useColors;
-
-  if (useColors) {
-    var c = this.color;
-    var colorCode = "\x1B[3" + (c < 8 ? c : '8;5;' + c);
-    var prefix = "  ".concat(colorCode, ";1m").concat(name, " \x1B[0m");
-    args[0] = prefix + args[0].split('\n').join('\n' + prefix);
-    args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + "\x1B[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() {
-  return process.stderr.write(util.format.apply(util, arguments) + '\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 = {};
-  var keys = Object.keys(exports.inspectOpts);
-
-  for (var i = 0; i < keys.length; i++) {
-    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
-  }
-}
-
-module.exports = require('./common')(exports);
-var formatters = module.exports.formatters;
-/**
- * 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).replace(/\s*\n\s*/g, ' ');
-};
-/**
- * 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/https-proxy-agent/package.json b/node_modules/https-proxy-agent/package.json
index f7e6c65..f805e12 100644
--- a/node_modules/https-proxy-agent/package.json
+++ b/node_modules/https-proxy-agent/package.json
@@ -4,16 +4,16 @@
     "url": "https://github.com/TooTallNate/node-https-proxy-agent/issues"
   },
   "dependencies": {
-    "agent-base": "^4.3.0",
-    "debug": "^3.1.0"
+    "agent-base": "5",
+    "debug": "4"
   },
   "description": "An HTTP(s) proxy `http.Agent` implementation for HTTPS",
   "devDependencies": {
-    "mocha": "^6.2.0",
-    "proxy": "1.0.1"
+    "mocha": "6",
+    "proxy": "1"
   },
   "engines": {
-    "node": ">= 4.5.0"
+    "node": ">= 6.0.0"
   },
   "keywords": [
     "https",
@@ -32,5 +32,5 @@
     "test": "mocha --reporter spec"
   },
   "types": "./index.d.ts",
-  "version": "3.0.1"
+  "version": "4.0.0"
 }
\ No newline at end of file
diff --git a/node_modules/concat-stream/node_modules/safe-buffer/LICENSE b/node_modules/mkdirp-classic/LICENSE
similarity index 93%
copy from node_modules/concat-stream/node_modules/safe-buffer/LICENSE
copy to node_modules/mkdirp-classic/LICENSE
index 0c068ce..f6b3a0d 100644
--- a/node_modules/concat-stream/node_modules/safe-buffer/LICENSE
+++ b/node_modules/mkdirp-classic/LICENSE
@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) Feross Aboukhadijeh
+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
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..0e7b161
--- /dev/null
+++ b/node_modules/mkdirp-classic/package.json
@@ -0,0 +1,18 @@
+{
+  "author": "Mathias Buus (@mafintosh)",
+  "bugs": {
+    "url": "https://github.com/mafintosh/mkdirp-classic/issues"
+  },
+  "dependencies": {},
+  "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": "https://github.com/mafintosh/mkdirp-classic.git"
+  },
+  "version": "0.5.3"
+}
\ No newline at end of file
diff --git a/node_modules/proxy-from-env/.eslintrc b/node_modules/proxy-from-env/.eslintrc
new file mode 100644
index 0000000..a51449b
--- /dev/null
+++ b/node_modules/proxy-from-env/.eslintrc
@@ -0,0 +1,29 @@
+{
+  "env": {
+    "node": true
+  },
+  "rules": {
+    "array-bracket-spacing": [2, "never"],
+    "block-scoped-var": 2,
+    "brace-style": [2, "1tbs"],
+    "camelcase": 1,
+    "computed-property-spacing": [2, "never"],
+    "curly": 2,
+    "eol-last": 2,
+    "eqeqeq": [2, "smart"],
+    "max-depth": [1, 3],
+    "max-len": [1, 80],
+    "max-statements": [1, 15],
+    "new-cap": 1,
+    "no-extend-native": 2,
+    "no-mixed-spaces-and-tabs": 2,
+    "no-trailing-spaces": 2,
+    "no-unused-vars": 1,
+    "no-use-before-define": [2, "nofunc"],
+    "object-curly-spacing": [2, "never"],
+    "quotes": [2, "single", "avoid-escape"],
+    "semi": [2, "always"],
+    "keyword-spacing": [2, {"before": true, "after": true}],
+    "space-unary-ops": 2
+  }
+}
diff --git a/node_modules/proxy-from-env/.jscsrc b/node_modules/proxy-from-env/.jscsrc
deleted file mode 100644
index 1f636de..0000000
--- a/node_modules/proxy-from-env/.jscsrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "preset": "node-style-guide"
-}
diff --git a/node_modules/proxy-from-env/.jshintrc b/node_modules/proxy-from-env/.jshintrc
deleted file mode 100644
index 29a1cf2..0000000
--- a/node_modules/proxy-from-env/.jshintrc
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "curly": true,
-  "eqeqeq": true,
-  "freeze": true,
-  "indent": 2,
-  "newcap": true,
-  "quotmark": "single",
-  "maxdepth": 3,
-  "maxlen": 80,
-  "eqnull": true,
-  "funcscope": true,
-  "node": true,
-  "undef": true,
-  "unused": "vars"
-}
diff --git a/node_modules/proxy-from-env/.npmignore b/node_modules/proxy-from-env/.npmignore
deleted file mode 100644
index 68e7bda..0000000
--- a/node_modules/proxy-from-env/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-*.swp
-coverage/
-node_modules/
diff --git a/node_modules/proxy-from-env/.travis.yml b/node_modules/proxy-from-env/.travis.yml
index 5bf285a..64a05f9 100644
--- a/node_modules/proxy-from-env/.travis.yml
+++ b/node_modules/proxy-from-env/.travis.yml
@@ -1,7 +1,7 @@
 language: node_js
 node_js:
   - node
-  - 0.10
+  - lts/*
 script:
   - npm run lint
   # test-coverage will also run the tests, but does not print helpful output upon test failure.
diff --git a/node_modules/es6-promise/LICENSE b/node_modules/proxy-from-env/LICENSE
similarity index 63%
rename from node_modules/es6-promise/LICENSE
rename to node_modules/proxy-from-env/LICENSE
index 954ec59..8f25097 100644
--- a/node_modules/es6-promise/LICENSE
+++ b/node_modules/proxy-from-env/LICENSE
@@ -1,4 +1,6 @@
-Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors
+The MIT License
+
+Copyright (C) 2016-2018 Rob Wu <rob@robwu.nl>
 
 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
@@ -11,9 +13,8 @@
 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.
+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/proxy-from-env/index.js b/node_modules/proxy-from-env/index.js
index 5d49fba..df75004 100644
--- a/node_modules/proxy-from-env/index.js
+++ b/node_modules/proxy-from-env/index.js
@@ -39,7 +39,11 @@
     return '';  // Don't proxy URLs that match NO_PROXY.
   }
 
-  var proxy = getEnv(proto + '_proxy') || getEnv('all_proxy');
+  var proxy =
+    getEnv('npm_config_' + proto + '_proxy') ||
+    getEnv(proto + '_proxy') ||
+    getEnv('npm_config_proxy') ||
+    getEnv('all_proxy');
   if (proxy && proxy.indexOf('://') === -1) {
     // Missing scheme in proxy, default to the requested URL's scheme.
     proxy = proto + '://' + proxy;
@@ -56,7 +60,8 @@
  * @private
  */
 function shouldProxy(hostname, port) {
-  var NO_PROXY = getEnv('no_proxy').toLowerCase();
+  var NO_PROXY =
+    (getEnv('npm_config_no_proxy') || getEnv('no_proxy')).toLowerCase();
   if (!NO_PROXY) {
     return true;  // Always proxy if NO_PROXY is not set.
   }
diff --git a/node_modules/proxy-from-env/package.json b/node_modules/proxy-from-env/package.json
index 55bed43..54fbe8e 100644
--- a/node_modules/proxy-from-env/package.json
+++ b/node_modules/proxy-from-env/package.json
@@ -5,11 +5,10 @@
   },
   "description": "Offers getProxyForUrl to get the proxy URL for a URL, respecting the *_PROXY (e.g. HTTP_PROXY) and NO_PROXY environment variables.",
   "devDependencies": {
-    "coveralls": "^2.11.6",
-    "istanbul": "^0.4.2",
-    "jscs": "^2.10.1",
-    "jshint": "^2.9.1",
-    "mocha": "^2.4.5"
+    "coveralls": "^3.0.9",
+    "eslint": "^6.8.0",
+    "istanbul": "^0.4.5",
+    "mocha": "^7.1.0"
   },
   "homepage": "https://github.com/Rob--W/proxy-from-env#readme",
   "keywords": [
@@ -27,9 +26,9 @@
     "url": "https://github.com/Rob--W/proxy-from-env.git"
   },
   "scripts": {
-    "lint": "jscs *.js && jshint *.js",
+    "lint": "eslint *.js",
     "test": "mocha ./test.js --reporter spec",
     "test-coverage": "istanbul cover ./node_modules/.bin/_mocha -- --reporter spec"
   },
-  "version": "1.0.0"
+  "version": "1.1.0"
 }
\ No newline at end of file
diff --git a/node_modules/proxy-from-env/test.js b/node_modules/proxy-from-env/test.js
index 124559d..abf6542 100644
--- a/node_modules/proxy-from-env/test.js
+++ b/node_modules/proxy-from-env/test.js
@@ -1,4 +1,4 @@
-/* jshint mocha:true */
+/* eslint max-statements:0 */
 'use strict';
 
 var assert = require('assert');
@@ -93,9 +93,8 @@
     testProxyUrl(env, 'http://http-proxy', 'http://example');
     testProxyUrl(env, 'http://http-proxy', parseUrl('http://example'));
 
-    // jscs:disable requireCamelCaseOrUpperCaseIdentifiers
+    // eslint-disable-next-line camelcase
     env.http_proxy = 'http://priority';
-    // jscs:enable requireCamelCaseOrUpperCaseIdentifiers
     testProxyUrl(env, 'http://priority', 'http://example');
   });
 
@@ -123,9 +122,8 @@
     env.HTTPS_PROXY = 'http://https-proxy';
     testProxyUrl(env, 'http://https-proxy', 'https://example');
 
-    // jscs:disable requireCamelCaseOrUpperCaseIdentifiers
+    // eslint-disable-next-line camelcase
     env.https_proxy = 'http://priority';
-    // jscs:enable requireCamelCaseOrUpperCaseIdentifiers
     testProxyUrl(env, 'http://priority', 'https://example');
   });
 
@@ -143,9 +141,8 @@
     env.ALL_PROXY = 'http://catch-all';
     testProxyUrl(env, 'http://catch-all', 'https://example');
 
-    // jscs:disable requireCamelCaseOrUpperCaseIdentifiers
+    // eslint-disable-next-line camelcase
     env.all_proxy = 'http://priority';
-    // jscs:enable requireCamelCaseOrUpperCaseIdentifiers
     testProxyUrl(env, 'http://priority', 'https://example');
   });
 
@@ -390,4 +387,97 @@
     testProxyUrl(env, '', 'http://ZzZ');
     testProxyUrl(env, '', 'http://zZz');
   });
+
+  describe('NPM proxy configuration', function() {
+    describe('npm_config_http_proxy should work', function() {
+      var env = {};
+      // eslint-disable-next-line camelcase
+      env.npm_config_http_proxy = 'http://http-proxy';
+
+      testProxyUrl(env, '', 'https://example');
+      testProxyUrl(env, 'http://http-proxy', 'http://example');
+
+      // eslint-disable-next-line camelcase
+      env.npm_config_http_proxy = 'http://priority';
+      testProxyUrl(env, 'http://priority', 'http://example');
+    });
+    // eslint-disable-next-line max-len
+    describe('npm_config_http_proxy should take precedence over HTTP_PROXY and npm_config_proxy', function() {
+      var env = {};
+      // eslint-disable-next-line camelcase
+      env.npm_config_http_proxy = 'http://http-proxy';
+      // eslint-disable-next-line camelcase
+      env.npm_config_proxy = 'http://unexpected-proxy';
+      env.HTTP_PROXY = 'http://unexpected-proxy';
+
+      testProxyUrl(env, 'http://http-proxy', 'http://example');
+    });
+    describe('npm_config_https_proxy should work', function() {
+      var env = {};
+      // eslint-disable-next-line camelcase
+      env.npm_config_http_proxy = 'http://unexpected.proxy';
+      testProxyUrl(env, '', 'https://example');
+
+      // eslint-disable-next-line camelcase
+      env.npm_config_https_proxy = 'http://https-proxy';
+      testProxyUrl(env, 'http://https-proxy', 'https://example');
+
+      // eslint-disable-next-line camelcase
+      env.npm_config_https_proxy = 'http://priority';
+      testProxyUrl(env, 'http://priority', 'https://example');
+    });
+    // eslint-disable-next-line max-len
+    describe('npm_config_https_proxy should take precedence over HTTPS_PROXY and npm_config_proxy', function() {
+      var env = {};
+      // eslint-disable-next-line camelcase
+      env.npm_config_https_proxy = 'http://https-proxy';
+      // eslint-disable-next-line camelcase
+      env.npm_config_proxy = 'http://unexpected-proxy';
+      env.HTTPS_PROXY = 'http://unexpected-proxy';
+
+      testProxyUrl(env, 'http://https-proxy', 'https://example');
+    });
+    describe('npm_config_proxy should work', function() {
+      var env = {};
+      // eslint-disable-next-line camelcase
+      env.npm_config_proxy = 'http://http-proxy';
+      testProxyUrl(env, 'http://http-proxy', 'http://example');
+      testProxyUrl(env, 'http://http-proxy', 'https://example');
+
+      // eslint-disable-next-line camelcase
+      env.npm_config_proxy = 'http://priority';
+      testProxyUrl(env, 'http://priority', 'http://example');
+      testProxyUrl(env, 'http://priority', 'https://example');
+    });
+    // eslint-disable-next-line max-len
+    describe('HTTP_PROXY and HTTPS_PROXY should take precedence over npm_config_proxy', function() {
+      var env = {};
+      env.HTTP_PROXY = 'http://http-proxy';
+      env.HTTPS_PROXY = 'http://https-proxy';
+      // eslint-disable-next-line camelcase
+      env.npm_config_proxy = 'http://unexpected-proxy';
+      testProxyUrl(env, 'http://http-proxy', 'http://example');
+      testProxyUrl(env, 'http://https-proxy', 'https://example');
+    });
+    describe('npm_config_no_proxy should work', function() {
+      var env = {};
+      env.HTTP_PROXY = 'http://proxy';
+      // eslint-disable-next-line camelcase
+      env.npm_config_no_proxy = 'example';
+
+      testProxyUrl(env, '', 'http://example');
+      testProxyUrl(env, 'http://proxy', 'http://otherwebsite');
+    });
+    // eslint-disable-next-line max-len
+    describe('npm_config_no_proxy should take precedence over NO_PROXY', function() {
+      var env = {};
+      env.HTTP_PROXY = 'http://proxy';
+      env.NO_PROXY = 'otherwebsite';
+      // eslint-disable-next-line camelcase
+      env.npm_config_no_proxy = 'example';
+
+      testProxyUrl(env, '', 'http://example');
+      testProxyUrl(env, 'http://proxy', 'http://otherwebsite');
+    });
+  });
 });
diff --git a/node_modules/concat-stream/node_modules/isarray/.travis.yml b/node_modules/pump/.travis.yml
similarity index 65%
rename from node_modules/concat-stream/node_modules/isarray/.travis.yml
rename to node_modules/pump/.travis.yml
index cc4dba2..17f9433 100644
--- a/node_modules/concat-stream/node_modules/isarray/.travis.yml
+++ b/node_modules/pump/.travis.yml
@@ -1,4 +1,5 @@
 language: node_js
 node_js:
-  - "0.8"
   - "0.10"
+
+script: "npm test"
diff --git a/node_modules/concat-stream/node_modules/safe-buffer/LICENSE b/node_modules/pump/LICENSE
similarity index 96%
copy from node_modules/concat-stream/node_modules/safe-buffer/LICENSE
copy to node_modules/pump/LICENSE
index 0c068ce..757562e 100644
--- a/node_modules/concat-stream/node_modules/safe-buffer/LICENSE
+++ b/node_modules/pump/LICENSE
@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) Feross Aboukhadijeh
+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
@@ -18,4 +18,4 @@
 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.
+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..afc357d
--- /dev/null
+++ b/node_modules/pump/package.json
@@ -0,0 +1,24 @@
+{
+  "author": "Mathias Buus Madsen <mathiasbuus@gmail.com>",
+  "browser": {
+    "fs": false
+  },
+  "dependencies": {
+    "end-of-stream": "^1.1.0",
+    "once": "^1.3.1"
+  },
+  "description": "pipe streams together and close all of them if one of them closes",
+  "keywords": [
+    "streams",
+    "pipe",
+    "destroy",
+    "callback"
+  ],
+  "license": "MIT",
+  "name": "pump",
+  "repository": "git://github.com/mafintosh/pump.git",
+  "scripts": {
+    "test": "node test-browser.js && node test-node.js"
+  },
+  "version": "3.0.0"
+}
\ No newline at end of file
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/puppeteer/CONTRIBUTING.md b/node_modules/puppeteer/CONTRIBUTING.md
deleted file mode 100644
index f3c1065..0000000
--- a/node_modules/puppeteer/CONTRIBUTING.md
+++ /dev/null
@@ -1,284 +0,0 @@
-<!-- gen:toc -->
-- [How to Contribute](#how-to-contribute)
-  * [Contributor License Agreement](#contributor-license-agreement)
-  * [Getting Code](#getting-code)
-  * [Code reviews](#code-reviews)
-  * [Code Style](#code-style)
-  * [API guidelines](#api-guidelines)
-  * [Commit Messages](#commit-messages)
-  * [Writing Documentation](#writing-documentation)
-  * [Adding New Dependencies](#adding-new-dependencies)
-  * [Running & Writing Tests](#running--writing-tests)
-  * [Public API Coverage](#public-api-coverage)
-  * [Debugging Puppeteer](#debugging-puppeteer)
-- [For Project Maintainers](#for-project-maintainers)
-  * [Releasing to npm](#releasing-to-npm)
-  * [Updating npm dist tags](#updating-npm-dist-tags)
-<!-- gen:stop -->
-
-# How to Contribute
-
-First of all, thank you for your interest in Puppeteer!
-We'd love to accept your patches and contributions!
-
-## Contributor License Agreement
-
-Contributions to this project must be accompanied by a Contributor License
-Agreement. You (or your employer) retain the copyright to your contribution,
-this simply gives us permission to use and redistribute your contributions as
-part of the project. Head over to <https://cla.developers.google.com/> to see
-your current agreements on file or to sign a new one.
-
-You generally only need to submit a CLA once, so if you've already submitted one
-(even if it was for a different project), you probably don't need to do it
-again.
-
-## Getting Code
-
-1. Clone this repository
-
-```bash
-git clone https://github.com/GoogleChrome/puppeteer
-cd puppeteer
-```
-
-2. Install dependencies
-
-```bash
-npm install
-```
-
-3. Run Puppeteer tests locally. For more information about tests, read [Running & Writing Tests](#running--writing-tests).
-
-```bash
-npm run unit
-```
-
-## Code reviews
-
-All submissions, including submissions by project members, require review. We
-use GitHub pull requests for this purpose. Consult
-[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
-information on using pull requests.
-
-## Code Style
-
-- Coding style is fully defined in [.eslintrc](https://github.com/GoogleChrome/puppeteer/blob/master/.eslintrc.js)
-- Code should be annotated with [closure annotations](https://github.com/google/closure-compiler/wiki/Annotating-JavaScript-for-the-Closure-Compiler).
-- Comments should be generally avoided. If the code would not be understood without comments, consider re-writing the code to make it self-explanatory.
-
-To run code linter, use:
-
-```bash
-npm run lint
-```
-
-## API guidelines
-
-When authoring new API methods, consider the following:
-
-- Expose as little information as needed. When in doubt, don’t expose new information.
-- Methods are used in favor of getters/setters.
-  - The only exception is namespaces, e.g. `page.keyboard` and `page.coverage`
-- All string literals must be small case. This includes event names and option values.
-- Avoid adding "sugar" API (API that is trivially implementable in user-space) unless they're **very** demanded.
-
-## Commit Messages
-
-Commit messages should follow the Semantic Commit Messages format:
-
-```
-label(namespace): title
-
-description
-
-footer
-```
-
-1. *label* is one of the following:
-    - `fix` - puppeteer bug fixes.
-    - `feat` - puppeteer features.
-    - `docs` - changes to docs, e.g. `docs(api.md): ..` to change documentation.
-    - `test` - changes to puppeteer tests infrastructure.
-    - `style` - puppeteer code style: spaces/alignment/wrapping etc.
-    - `chore` - build-related work, e.g. doclint changes / travis / appveyor.
-2. *namespace* is put in parenthesis after label and is optional. Must be lowercase.
-3. *title* is a brief summary of changes.
-4. *description* is **optional**, new-line separated from title and is in present tense.
-5. *footer* is **optional**, new-line separated from *description* and contains "fixes" / "references" attribution to github issues.
-6. *footer* should also include "BREAKING CHANGE" if current API clients will break due to this change. It should explain what changed and how to get the old behavior.
-
-Example:
-
-```
-fix(page): fix page.pizza method
-
-This patch fixes page.pizza so that it works with iframes.
-
-Fixes #123, Fixes #234
-
-BREAKING CHANGE: page.pizza now delivers pizza at home by default.
-To deliver to a different location, use "deliver" option:
-  `page.pizza({deliver: 'work'})`.
-```
-
-## Writing Documentation
-
-All public API should have a descriptive entry in [`docs/api.md`](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md). There's a [documentation linter](https://github.com/GoogleChrome/puppeteer/tree/master/utils/doclint) which makes sure documentation is aligned with the codebase.
-
-To run the documentation linter, use:
-
-```bash
-npm run doc
-```
-
-## Adding New Dependencies
-
-For all dependencies (both installation and development):
-- **Do not add** a dependency if the desired functionality is easily implementable.
-- If adding a dependency, it should be well-maintained and trustworthy.
-
-A barrier for introducing new installation dependencies is especially high:
-- **Do not add** installation dependency unless it's critical to project success.
-
-## Running & Writing Tests
-
-- Every feature should be accompanied by a test.
-- Every public api event/method should be accompanied by a test.
-- Tests should be *hermetic*. Tests should not depend on external services.
-- Tests should work on all three platforms: Mac, Linux and Win. This is especially important for screenshot tests.
-
-Puppeteer tests are located in [`test/test.js`](https://github.com/GoogleChrome/puppeteer/blob/master/test/test.js)
-and are written with a [TestRunner](https://github.com/GoogleChrome/puppeteer/tree/master/utils/testrunner) framework.
-Despite being named 'unit', these are integration tests, making sure public API methods and events work as expected.
-
-- To run all tests:
-
-```bash
-npm run unit
-```
-
-- To run tests in parallel, use `-j` flag:
-
-```bash
-npm run unit -- -j 4
-```
-
-- To run tests in "verbose" mode or to stop testrunner on first failure:
-
-```bash
-npm run unit -- --verbose
-npm run unit -- --break-on-failure
-```
-
-- To run a specific test, substitute the `it` with `fit` (mnemonic rule: '*focus it*'):
-
-```js
-  ...
-  // Using "fit" to run specific test
-  fit('should work', async function({server, page}) {
-    const response = await page.goto(server.EMPTY_PAGE);
-    expect(response.ok).toBe(true);
-  });
-```
-
-- To disable a specific test, substitute the `it` with `xit` (mnemonic rule: '*cross it*'):
-
-```js
-  ...
-  // Using "xit" to skip specific test
-  xit('should work', async function({server, page}) {
-    const response = await page.goto(server.EMPTY_PAGE);
-    expect(response.ok).toBe(true);
-  });
-```
-
-- To run tests in non-headless mode:
-
-```bash
-HEADLESS=false npm run unit
-```
-
-- To run tests with custom Chromium executable:
-
-```bash
-CHROME=<path-to-executable> npm run unit
-```
-
-- To run tests in slow-mode:
-
-```bash
-HEADLESS=false SLOW_MO=500 npm run unit
-```
-
-- To debug a test, "focus" a test first and then run:
-
-```bash
-node --inspect-brk test/test.js
-```
-
-## Public API Coverage
-
-Every public API method or event should be called at least once in tests. To ensure this, there's a `coverage` command which tracks calls to public API and reports back if some methods/events were not called.
-
-Run coverage:
-
-```bash
-npm run coverage
-```
-
-## Debugging Puppeteer
-
-See [Debugging Tips](README.md#debugging-tips) in the readme.
-
-# For Project Maintainers
-
-## Releasing to npm
-
-Releasing to npm consists of the following phases:
-
-1. Source Code: mark a release.
-    1. Bump `package.json` version following the SEMVER rules, run `npm run doc` to update the docs accordingly, and send a PR titled `'chore: mark version vXXX.YYY.ZZZ'` ([example](https://github.com/GoogleChrome/puppeteer/commit/808bf8e5582482a1d849ff22a51e52024810905c)).
-    2. Make sure the PR passes **all checks**.
-        - **WHY**: there are linters in place that help to avoid unnecessary errors, e.g. [like this](https://github.com/GoogleChrome/puppeteer/pull/2446)
-    3. Merge the PR.
-    4. Once merged, publish the release notes using [GitHub's "draft new release tag" option](https://github.com/GoogleChrome/puppeteer/releases/new).
-        - **NOTE**: tag names are prefixed with `'v'`, e.g. for version `1.4.0` the tag is `v1.4.0`.
-        - For the "raw notes" section, use `git log --pretty="%h - %s" v1.19.0..HEAD`.
-    5. Update the “Releases per Chromium Version” list in [`docs/api.md`](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md) to include the new version.
-2. Publish `puppeteer` to npm.
-    1. On your local machine, pull from [upstream](https://github.com/GoogleChrome/puppeteer) and make sure the last commit is the one just merged.
-    2. Run `git status` and make sure there are no untracked files.
-        - **WHY**: this is to avoid adding unnecessary files to the npm package.
-    3. Run [`npx pkgfiles`](https://www.npmjs.com/package/pkgfiles) to make sure you don't publish anything unnecessary.
-    4. Run `npm publish`. This publishes the `puppeteer` package.
-3. Publish `puppeteer-core` to npm.
-    1. Run `./utils/prepare_puppeteer_core.js`. The script changes the name inside `package.json` to `puppeteer-core`.
-    2. Run `npm publish`. This publishes the `puppeteer-core` package.
-    3. Run `git reset --hard` to reset the changes to `package.json`.
-4. Source Code: mark post-release.
-    1. Bump `package.json` version to `-post` version and send a PR titled `'chore: bump version to vXXX.YYY.ZZZ-post'` ([example](https://github.com/GoogleChrome/puppeteer/commit/d02440d1eac98028e29f4e1cf55413062a259156))
-        - **NOTE**: make sure to update the "released APIs" section in the top of `docs/api.md` by running `npm run doc`.
-        - **NOTE**: no other commits should be landed in-between release commit and bump commit.
-
-## Updating npm dist tags
-
-For both `puppeteer` and `puppeteer-core` we maintain the following npm tags:
-
-- `chrome-*` tags, e.g. `chrome-75` and so on. These tags match the Puppeteer version that corresponds to the `chrome-*` release.
-- `chrome-stable` tag. This tag points to the Puppeteer version that works with the current Chrome stable release.
-
-These tags are updated on every Puppeteer release.
-
-> **NOTE**: due to Chrome's rolling release, we take [omahaproxy's linux stable version](https://omahaproxy.appspot.com/) as *stable*.
-
-Managing tags 101:
-
-```bash
-# list tags
-$ npm dist-tag ls puppeteer
-# Removing a tag
-$ npm dist-tag rm puppeteer-core chrome-stable
-# Adding a tag
-$ npm dist-tag add puppeteer-core@1.13.0 chrome-stable
-```
diff --git a/node_modules/puppeteer/README.md b/node_modules/puppeteer/README.md
index 7163f06..a0aaa2f 100644
--- a/node_modules/puppeteer/README.md
+++ b/node_modules/puppeteer/README.md
@@ -1,12 +1,12 @@
 # Puppeteer
 
 <!-- [START badges] -->
-[![Linux Build Status](https://img.shields.io/travis/com/GoogleChrome/puppeteer/master.svg)](https://travis-ci.com/GoogleChrome/puppeteer) [![Windows Build Status](https://img.shields.io/appveyor/ci/aslushnikov/puppeteer/master.svg?logo=appveyor)](https://ci.appveyor.com/project/aslushnikov/puppeteer/branch/master) [![Build Status](https://api.cirrus-ci.com/github/GoogleChrome/puppeteer.svg)](https://cirrus-ci.com/github/GoogleChrome/puppeteer) [![NPM puppeteer package](https://img.shields.io/npm/v/puppeteer.svg)](https://npmjs.org/package/puppeteer) [![Issue resolution status](https://isitmaintained.com/badge/resolution/GoogleChrome/puppeteer.svg)](https://github.com/GoogleChrome/puppeteer/issues)
+[![Build status](https://img.shields.io/travis/com/puppeteer/puppeteer/master.svg)](https://travis-ci.com/puppeteer/puppeteer) [![npm puppeteer package](https://img.shields.io/npm/v/puppeteer.svg)](https://npmjs.org/package/puppeteer) [![Issue resolution status](https://isitmaintained.com/badge/resolution/puppeteer/puppeteer.svg)](https://github.com/puppeteer/puppeteer/issues)
 <!-- [END badges] -->
 
 <img src="https://user-images.githubusercontent.com/10379601/29446482-04f7036a-841f-11e7-9872-91d1fc2ea683.png" height="200" align="right">
 
-###### [API](https://github.com/GoogleChrome/puppeteer/blob/v2.0.0/docs/api.md) | [FAQ](#faq) | [Contributing](https://github.com/GoogleChrome/puppeteer/blob/master/CONTRIBUTING.md) | [Troubleshooting](https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md)
+###### [API](https://github.com/puppeteer/puppeteer/blob/v3.0.3/docs/api.md) | [FAQ](#faq) | [Contributing](https://github.com/puppeteer/puppeteer/blob/master/CONTRIBUTING.md) | [Troubleshooting](https://github.com/puppeteer/puppeteer/blob/master/docs/troubleshooting.md)
 
 > Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the [DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/). Puppeteer runs [headless](https://developers.google.com/web/updates/2017/04/headless-chrome) by default, but can be configured to run full (non-headless) Chrome or Chromium.
 
@@ -37,13 +37,13 @@
 # or "yarn add puppeteer"
 ```
 
-Note: When you install Puppeteer, it downloads a recent version of Chromium (~170MB Mac, ~282MB Linux, ~280MB Win) that is guaranteed to work with the API. To skip the download, see [Environment variables](https://github.com/GoogleChrome/puppeteer/blob/v2.0.0/docs/api.md#environment-variables).
+Note: When you install Puppeteer, it downloads a recent version of Chromium (~170MB Mac, ~282MB Linux, ~280MB Win) that is guaranteed to work with the API. To skip the download, or to download a different browser, see [Environment variables](https://github.com/puppeteer/puppeteer/blob/v3.0.3/docs/api.md#environment-variables).
 
 
 ### puppeteer-core
 
 Since version 1.7.0 we publish the [`puppeteer-core`](https://www.npmjs.com/package/puppeteer-core) package,
-a version of Puppeteer that doesn't download Chromium by default.
+a version of Puppeteer that doesn't download any browser by default.
 
 ```bash
 npm i puppeteer-core
@@ -53,17 +53,17 @@
 `puppeteer-core` is intended to be a lightweight version of Puppeteer for launching an existing browser installation or for connecting to a remote one. Be sure that the version of puppeteer-core you install is compatible with the
 browser you intend to connect to.
 
-See [puppeteer vs puppeteer-core](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#puppeteer-vs-puppeteer-core).
+See [puppeteer vs puppeteer-core](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteer-vs-puppeteer-core).
 
 ### Usage
 
 Puppeteer follows the latest [maintenance LTS](https://github.com/nodejs/Release#release-schedule) version of Node.
 
-Note: Prior to v1.18.1, Puppeteer required at least Node v6.4.0. All subsequent versions rely on
-Node 8.9.0+. All examples below use async/await which is only supported in Node v7.6.0 or greater.
+Note: Prior to v1.18.1, Puppeteer required at least Node v6.4.0. Versions from v1.18.1 to v2.1.0 rely on
+Node 8.9.0+. Starting from v3.0.0 Puppeteer starts to rely on Node 10.18.1+. All examples below use async/await which is only supported in Node v7.6.0 or greater.
 
 Puppeteer will be familiar to people using other browser testing frameworks. You create an instance
-of `Browser`, open pages, and then manipulate them with [Puppeteer's API](https://github.com/GoogleChrome/puppeteer/blob/v2.0.0/docs/api.md#).
+of `Browser`, open pages, and then manipulate them with [Puppeteer's API](https://github.com/puppeteer/puppeteer/blob/v3.0.3/docs/api.md#).
 
 **Example** - navigating to https://example.com and saving a screenshot as *example.png*:
 
@@ -88,7 +88,7 @@
 node example.js
 ```
 
-Puppeteer sets an initial page size to 800×600px, which defines the screenshot size. The page size can be customized  with [`Page.setViewport()`](https://github.com/GoogleChrome/puppeteer/blob/v2.0.0/docs/api.md#pagesetviewportviewport).
+Puppeteer sets an initial page size to 800×600px, which defines the screenshot size. The page size can be customized  with [`Page.setViewport()`](https://github.com/puppeteer/puppeteer/blob/v3.0.3/docs/api.md#pagesetviewportviewport).
 
 **Example** - create a PDF.
 
@@ -113,7 +113,7 @@
 node hn.js
 ```
 
-See [`Page.pdf()`](https://github.com/GoogleChrome/puppeteer/blob/v2.0.0/docs/api.md#pagepdfoptions) for more information about creating pdfs.
+See [`Page.pdf()`](https://github.com/puppeteer/puppeteer/blob/v3.0.3/docs/api.md#pagepdfoptions) for more information about creating pdfs.
 
 **Example** - evaluate script in the context of the page
 
@@ -148,7 +148,7 @@
 node get-dimensions.js
 ```
 
-See [`Page.evaluate()`](https://github.com/GoogleChrome/puppeteer/blob/v2.0.0/docs/api.md#pageevaluatepagefunction-args) for more information on `evaluate` and related methods like `evaluateOnNewDocument` and `exposeFunction`.
+See [`Page.evaluate()`](https://github.com/puppeteer/puppeteer/blob/v3.0.3/docs/api.md#pageevaluatepagefunction-args) for more information on `evaluate` and related methods like `evaluateOnNewDocument` and `exposeFunction`.
 
 <!-- [END getstarted] -->
 
@@ -157,7 +157,7 @@
 
 **1. Uses Headless mode**
 
-Puppeteer launches Chromium in [headless mode](https://developers.google.com/web/updates/2017/04/headless-chrome). To launch a full version of Chromium, set the [`headless` option](https://github.com/GoogleChrome/puppeteer/blob/v2.0.0/docs/api.md#puppeteerlaunchoptions) when launching a browser:
+Puppeteer launches Chromium in [headless mode](https://developers.google.com/web/updates/2017/04/headless-chrome). To launch a full version of Chromium, set the [`headless` option](https://github.com/puppeteer/puppeteer/blob/v3.0.3/docs/api.md#puppeteerlaunchoptions) when launching a browser:
 
 ```js
 const browser = await puppeteer.launch({headless: false}); // default is true
@@ -173,20 +173,20 @@
 const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'});
 ```
 
-See [`Puppeteer.launch()`](https://github.com/GoogleChrome/puppeteer/blob/v2.0.0/docs/api.md#puppeteerlaunchoptions) for more information.
+You can also use Puppeteer with Firefox Nightly (experimental support). See [`Puppeteer.launch()`](https://github.com/puppeteer/puppeteer/blob/v3.0.3/docs/api.md#puppeteerlaunchoptions) for more information.
 
 See [`this article`](https://www.howtogeek.com/202825/what%E2%80%99s-the-difference-between-chromium-and-chrome/) for a description of the differences between Chromium and Chrome. [`This article`](https://chromium.googlesource.com/chromium/src/+/master/docs/chromium_browser_vs_google_chrome.md) describes some differences for Linux users.
 
 **3. Creates a fresh user profile**
 
-Puppeteer creates its own Chromium user profile which it **cleans up on every run**.
+Puppeteer creates its own browser user profile which it **cleans up on every run**.
 
 <!-- [END runtimesettings] -->
 
 ## Resources
 
-- [API Documentation](https://github.com/GoogleChrome/puppeteer/blob/v2.0.0/docs/api.md)
-- [Examples](https://github.com/GoogleChrome/puppeteer/tree/master/examples/)
+- [API Documentation](https://github.com/puppeteer/puppeteer/blob/v3.0.3/docs/api.md)
+- [Examples](https://github.com/puppeteer/puppeteer/tree/master/examples/)
 - [Community list of Puppeteer resources](https://github.com/transitive-bullshit/awesome-puppeteer)
 
 
@@ -198,22 +198,28 @@
    displaying. Instead of launching in headless mode, launch a full version of
    the browser using  `headless: false`:
 
-        const browser = await puppeteer.launch({headless: false});
+    ```js
+    const browser = await puppeteer.launch({headless: false});
+    ```
 
 2. Slow it down - the `slowMo` option slows down Puppeteer operations by the
    specified amount of milliseconds. It's another way to help see what's going on.
 
-        const browser = await puppeteer.launch({
-          headless: false,
-          slowMo: 250 // slow down by 250ms
-        });
+    ```js
+    const browser = await puppeteer.launch({
+      headless: false,
+      slowMo: 250 // slow down by 250ms
+    });
+    ```
 
 3. Capture console output - You can listen for the `console` event.
    This is also handy when debugging code in `page.evaluate()`:
 
-        page.on('console', msg => console.log('PAGE LOG:', msg.text()));
+    ```js
+    page.on('console', msg => console.log('PAGE LOG:', msg.text()));
 
-        await page.evaluate(() => console.log(`url is ${location.href}`));
+    await page.evaluate(() => console.log(`url is ${location.href}`));
+    ```
 
 4. Use debugger in application code browser
 
@@ -223,7 +229,9 @@
 
     - Use `{devtools: true}` when launching Puppeteer:
 
-        `const browser = await puppeteer.launch({devtools: true});`
+      ```js
+      const browser = await puppeteer.launch({devtools: true});
+      ```
 
     - Change default test timeout:
 
@@ -235,7 +243,9 @@
 
     - Add an evaluate statement with `debugger` inside / add  `debugger` to an existing evaluate statement:
 
-      `await page.evaluate(() => {debugger;});`
+      ```js
+      await page.evaluate(() => {debugger;});
+      ```
 
        The test will now stop executing in the above evaluate statement, and chromium will stop in debug mode.
 
@@ -248,10 +258,12 @@
     you want to try something out, you have to add it to your test file.
 
     - Add `debugger;` to your test, eg:
-      ```
+
+      ```js
       debugger;
       await page.click('a[target=_blank]');
       ```
+
     - Set `headless` to `false`
     - Run `node --inspect-brk`, eg `node --inspect-brk node_modules/.bin/jest tests`
     - In Chrome open `chrome://inspect/#devices` and click `inspect`
@@ -285,7 +297,7 @@
 
 ## Contributing to Puppeteer
 
-Check out [contributing guide](https://github.com/GoogleChrome/puppeteer/blob/master/CONTRIBUTING.md) to get an overview of Puppeteer development.
+Check out [contributing guide](https://github.com/puppeteer/puppeteer/blob/master/CONTRIBUTING.md) to get an overview of Puppeteer development.
 
 <!-- [START faq] -->
 
@@ -294,7 +306,16 @@
 #### Q: Who maintains Puppeteer?
 
 The Chrome DevTools team maintains the library, but we'd love your help and expertise on the project!
-See [Contributing](https://github.com/GoogleChrome/puppeteer/blob/master/CONTRIBUTING.md).
+See [Contributing](https://github.com/puppeteer/puppeteer/blob/master/CONTRIBUTING.md).
+
+#### Q: What is the status of cross-browser support?
+
+Official Firefox support is currently experimental. The ongoing collaboration with Mozilla aims to support common end-to-end testing use cases, for which developers expect cross-browser coverage. The Puppeteer team needs input from users to stabilize Firefox support and to bring missing APIs to our attention.
+
+From Puppeteer v2.1.0 onwards you can specify [`puppeteer.launch({product: 'firefox'})`](https://github.com/puppeteer/puppeteer/blob/v3.0.3/docs/api.md#puppeteerlaunchoptions) to run your Puppeteer scripts in Firefox Nightly, without any additional custom patches. While [an older experiment](https://www.npmjs.com/package/puppeteer-firefox) required a patched version of Firefox, [the current approach](https://wiki.mozilla.org/Remote) works with “stock” Firefox.
+
+We will continue to collaborate with other browser vendors to bring Puppeteer support to browsers such as Safari.
+This effort includes exploration of a standard for executing cross-browser commands (instead of relying on the non-standard DevTools Protocol used by Chrome).
 
 #### Q: What are Puppeteer’s goals and principles?
 
@@ -320,7 +341,7 @@
 
 That said, you **can** use Puppeteer to run tests against Chromium, e.g. using the community-driven [jest-puppeteer](https://github.com/smooth-code/jest-puppeteer). While this probably shouldn’t be your only testing solution, it does have a few good points compared to WebDriver:
 
-- Puppeteer requires zero setup and comes bundled with the Chromium version it works best with, making it [very easy to start with](https://github.com/GoogleChrome/puppeteer/#getting-started). At the end of the day, it’s better to have a few tests running chromium-only, than no tests at all.
+- Puppeteer requires zero setup and comes bundled with the Chromium version it works best with, making it [very easy to start with](https://github.com/puppeteer/puppeteer/#getting-started). At the end of the day, it’s better to have a few tests running chromium-only, than no tests at all.
 - Puppeteer has event-driven architecture, which removes a lot of potential flakiness. There’s no need for evil “sleep(1000)” calls in puppeteer scripts.
 - Puppeteer runs headless by default, which makes it fast to run. Puppeteer v1.5.0 also exposes browser contexts, making it possible to efficiently parallelize test execution.
 - Puppeteer shines when it comes to debugging: flip the “headless” bit to false, add “slowMo”, and you’ll see what the browser is doing. You can even open Chrome DevTools to inspect the test environment.
@@ -330,9 +351,9 @@
 We see Puppeteer as an **indivisible entity** with Chromium. Each version of Puppeteer bundles a specific version of Chromium – **the only** version it is guaranteed to work with.
 
 This is not an artificial constraint: A lot of work on Puppeteer is actually taking place in the Chromium repository. Here’s a typical story:
-- A Puppeteer bug is reported: https://github.com/GoogleChrome/puppeteer/issues/2709
+- A Puppeteer bug is reported: https://github.com/puppeteer/puppeteer/issues/2709
 - It turned out this is an issue with the DevTools protocol, so we’re fixing it in Chromium: https://chromium-review.googlesource.com/c/chromium/src/+/1102154
-- Once the upstream fix is landed, we roll updated Chromium into Puppeteer: https://github.com/GoogleChrome/puppeteer/pull/2769
+- Once the upstream fix is landed, we roll updated Chromium into Puppeteer: https://github.com/puppeteer/puppeteer/pull/2769
 
 However, oftentimes it is desirable to use Puppeteer with the official Google Chrome rather than Chromium. For this to work, you should install a `puppeteer-core` version that corresponds to the Chrome version.
 
@@ -343,7 +364,19 @@
 
 #### Q: Which Chromium version does Puppeteer use?
 
-Look for `chromium_revision` in [package.json](https://github.com/GoogleChrome/puppeteer/blob/master/package.json). To find the corresponding Chromium commit and version number, search for the revision prefixed by an `r` in [OmahaProxy](https://omahaproxy.appspot.com/)'s "Find Releases" section.
+Look for `chromium_revision` in [package.json](https://github.com/puppeteer/puppeteer/blob/master/package.json). To find the corresponding Chromium commit and version number, search for the revision prefixed by an `r` in [OmahaProxy](https://omahaproxy.appspot.com/)'s "Find Releases" section.
+
+
+#### Q: Which Firefox version does Puppeteer use?
+
+Since Firefox support is experimental, Puppeteer downloads the latest [Firefox Nightly](https://wiki.mozilla.org/Nightly) when the `PUPPETEER_PRODUCT` environment variable is set to `firefox`. That's also why the value of `firefox_revision` in [package.json](https://github.com/puppeteer/puppeteer/blob/master/package.json) is `latest` -- Puppeteer isn't tied to a particular Firefox version.
+
+To fetch Firefox Nightly as part of Puppeteer installation:
+
+```bash
+PUPPETEER_PRODUCT=firefox npm i puppeteer
+# or "yarn add puppeteer"
+```
 
 #### Q: What’s considered a “Navigation”?
 
@@ -373,13 +406,13 @@
 
 #### Q: What features does Puppeteer not support?
 
-You may find that Puppeteer does not behave as expected when controlling pages that incorporate audio and video. (For example, [video playback/screenshots is likely to fail](https://github.com/GoogleChrome/puppeteer/issues/291).) There are two reasons for this:
+You may find that Puppeteer does not behave as expected when controlling pages that incorporate audio and video. (For example, [video playback/screenshots is likely to fail](https://github.com/puppeteer/puppeteer/issues/291).) There are two reasons for this:
 
-* Puppeteer is bundled with Chromium — not Chrome — and so by default, it inherits all of [Chromium's media-related limitations](https://www.chromium.org/audio-video). This means that Puppeteer does not support licensed formats such as AAC or H.264. (However, it is possible to force Puppeteer to use a separately-installed version Chrome instead of Chromium via the [`executablePath` option to `puppeteer.launch`](https://github.com/GoogleChrome/puppeteer/blob/v2.0.0/docs/api.md#puppeteerlaunchoptions). You should only use this configuration if you need an official release of Chrome that supports these media formats.)
+* Puppeteer is bundled with Chromium — not Chrome — and so by default, it inherits all of [Chromium's media-related limitations](https://www.chromium.org/audio-video). This means that Puppeteer does not support licensed formats such as AAC or H.264. (However, it is possible to force Puppeteer to use a separately-installed version Chrome instead of Chromium via the [`executablePath` option to `puppeteer.launch`](https://github.com/puppeteer/puppeteer/blob/v3.0.3/docs/api.md#puppeteerlaunchoptions). You should only use this configuration if you need an official release of Chrome that supports these media formats.)
 * Since Puppeteer (in all configurations) controls a desktop version of Chromium/Chrome, features that are only supported by the mobile version of Chrome are not supported. This means that Puppeteer [does not support HTTP Live Streaming (HLS)](https://caniuse.com/#feat=http-live-streaming).
 
 #### Q: I am having trouble installing / running Puppeteer in my test environment. Where should I look for help?
-We have a [troubleshooting](https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md) guide for various operating systems that lists the required dependencies.
+We have a [troubleshooting](https://github.com/puppeteer/puppeteer/blob/master/docs/troubleshooting.md) guide for various operating systems that lists the required dependencies.
 
 #### Q: How do I try/test a prerelease version of Puppeteer?
 
@@ -394,7 +427,7 @@
 #### Q: I have more questions! Where do I ask?
 
 There are many ways to get help on Puppeteer:
-- [bugtracker](https://github.com/GoogleChrome/puppeteer/issues)
+- [bugtracker](https://github.com/puppeteer/puppeteer/issues)
 - [Stack Overflow](https://stackoverflow.com/questions/tagged/puppeteer)
 - [slack channel](https://join.slack.com/t/puppeteer/shared_invite/enQtMzU4MjIyMDA5NTM4LWI0YTE0MjM0NWQzYmE2MTRmNjM1ZTBkN2MxNmJmNTIwNTJjMmFhOWFjMGExMDViYjk2YjU2ZmYzMmE1NmExYzc)
 
diff --git a/node_modules/puppeteer/index.js b/node_modules/puppeteer/index.js
index a73d4d2..fe2c26a 100644
--- a/node_modules/puppeteer/index.js
+++ b/node_modules/puppeteer/index.js
@@ -16,16 +16,29 @@
 
 const {helper} = require('./lib/helper');
 const api = require('./lib/api');
+const {Page} = require('./lib/Page');
 for (const className in api) {
-  // Puppeteer-web excludes certain classes from bundle, e.g. BrowserFetcher.
   if (typeof api[className] === 'function')
     helper.installAsyncStackHooks(api[className]);
 }
 
-// If node does not support async await, use the compiled version.
-const Puppeteer = require('./lib/Puppeteer');
-const packageJson = require('./package.json');
-const preferredRevision = packageJson.puppeteer.chromium_revision;
-const isPuppeteerCore = packageJson.name === 'puppeteer-core';
+// Expose alias for deprecated method.
+Page.prototype.emulateMedia = Page.prototype.emulateMediaType;
 
-module.exports = new Puppeteer(__dirname, preferredRevision, isPuppeteerCore);
+const {Puppeteer} = require('./lib/Puppeteer');
+const packageJson = require('./package.json');
+let preferredRevision = packageJson.puppeteer.chromium_revision;
+const isPuppeteerCore = packageJson.name === 'puppeteer-core';
+// puppeteer-core ignores environment variables
+const product = isPuppeteerCore ? undefined : process.env.PUPPETEER_PRODUCT || process.env.npm_config_puppeteer_product || process.env.npm_package_config_puppeteer_product;
+if (!isPuppeteerCore && product === 'firefox')
+  preferredRevision = packageJson.puppeteer.firefox_revision;
+
+const puppeteer = new Puppeteer(__dirname, preferredRevision, isPuppeteerCore, product);
+
+// The introspection in `Helper.installAsyncStackHooks` references `Puppeteer._launcher`
+// before the Puppeteer ctor is called, such that an invalid Launcher is selected at import,
+// so we reset it.
+puppeteer._lazyLauncher = undefined;
+
+module.exports = puppeteer;
diff --git a/node_modules/puppeteer/install.js b/node_modules/puppeteer/install.js
index 1e9faf5..5bc0a7b 100644
--- a/node_modules/puppeteer/install.js
+++ b/node_modules/puppeteer/install.js
@@ -14,107 +14,144 @@
  * limitations under the License.
  */
 
-// puppeteer-core should not install anything.
-if (require('./package.json').name === 'puppeteer-core')
-  return;
-
-if (process.env.PUPPETEER_SKIP_CHROMIUM_DOWNLOAD) {
-  logPolitely('**INFO** Skipping Chromium download. "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" environment variable was found.');
-  return;
-}
-if (process.env.NPM_CONFIG_PUPPETEER_SKIP_CHROMIUM_DOWNLOAD || process.env.npm_config_puppeteer_skip_chromium_download) {
-  logPolitely('**INFO** Skipping Chromium download. "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" was set in npm config.');
-  return;
-}
-if (process.env.NPM_PACKAGE_CONFIG_PUPPETEER_SKIP_CHROMIUM_DOWNLOAD || process.env.npm_package_config_puppeteer_skip_chromium_download) {
-  logPolitely('**INFO** Skipping Chromium download. "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" was set in project config.');
-  return;
-}
-
-const downloadHost = process.env.PUPPETEER_DOWNLOAD_HOST || process.env.npm_config_puppeteer_download_host || process.env.npm_package_config_puppeteer_download_host;
-
-const puppeteer = require('./index');
-const browserFetcher = puppeteer.createBrowserFetcher({ host: downloadHost });
-
-const revision = process.env.PUPPETEER_CHROMIUM_REVISION || process.env.npm_config_puppeteer_chromium_revision || process.env.npm_package_config_puppeteer_chromium_revision
-  || require('./package.json').puppeteer.chromium_revision;
-
-const revisionInfo = browserFetcher.revisionInfo(revision);
-
-// Do nothing if the revision is already downloaded.
-if (revisionInfo.local) {
-  generateProtocolTypesIfNecessary(false /* updated */);
-  return;
-}
-
-// Override current environment proxy settings with npm configuration, if any.
-const NPM_HTTPS_PROXY = process.env.npm_config_https_proxy || process.env.npm_config_proxy;
-const NPM_HTTP_PROXY = process.env.npm_config_http_proxy || process.env.npm_config_proxy;
-const NPM_NO_PROXY = process.env.npm_config_no_proxy;
-
-if (NPM_HTTPS_PROXY)
-  process.env.HTTPS_PROXY = NPM_HTTPS_PROXY;
-if (NPM_HTTP_PROXY)
-  process.env.HTTP_PROXY = NPM_HTTP_PROXY;
-if (NPM_NO_PROXY)
-  process.env.NO_PROXY = NPM_NO_PROXY;
-
-browserFetcher.download(revisionInfo.revision, onProgress)
-    .then(() => browserFetcher.localRevisions())
-    .then(onSuccess)
-    .catch(onError);
-
 /**
- * @param {!Array<string>}
- * @return {!Promise}
+ * This file is part of public API.
+ *
+ * By default, the `puppeteer` package runs this script during the installation
+ * process unless one of the env flags is provided.
+ * `puppeteer-core` package doesn't include this step at all. However, it's
+ * still possible to install a supported browser using this script when
+ * necessary.
  */
-function onSuccess(localRevisions) {
-  logPolitely('Chromium downloaded to ' + revisionInfo.folderPath);
-  localRevisions = localRevisions.filter(revision => revision !== revisionInfo.revision);
-  // Remove previous chromium revisions.
-  const cleanupOldVersions = localRevisions.map(revision => browserFetcher.remove(revision));
-  return Promise.all([...cleanupOldVersions, generateProtocolTypesIfNecessary(true /* updated */)]);
-}
 
-/**
- * @param {!Error} error
- */
-function onError(error) {
-  console.error(`ERROR: Failed to download Chromium r${revision}! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.`);
-  console.error(error);
-  process.exit(1);
-}
+const compileTypeScriptIfRequired = require('./typescript-if-required');
 
-let progressBar = null;
-let lastDownloadedBytes = 0;
-function onProgress(downloadedBytes, totalBytes) {
-  if (!progressBar) {
-    const ProgressBar = require('progress');
-    progressBar = new ProgressBar(`Downloading Chromium r${revision} - ${toMegabytes(totalBytes)} [:bar] :percent :etas `, {
-      complete: '=',
-      incomplete: ' ',
-      width: 20,
-      total: totalBytes,
-    });
+const supportedProducts = {
+  'chrome': 'Chromium',
+  'firefox': 'Firefox Nightly'
+};
+
+async function download() {
+  await compileTypeScriptIfRequired();
+
+  const downloadHost = process.env.PUPPETEER_DOWNLOAD_HOST || process.env.npm_config_puppeteer_download_host || process.env.npm_package_config_puppeteer_download_host;
+  const puppeteer = require('./index');
+  const product = process.env.PUPPETEER_PRODUCT || process.env.npm_config_puppeteer_product || process.env.npm_package_config_puppeteer_product || 'chrome';
+  const browserFetcher = puppeteer.createBrowserFetcher({product, host: downloadHost});
+  const revision = await getRevision();
+  await fetchBinary(revision);
+
+  function getRevision() {
+    if (product === 'chrome') {
+      return process.env.PUPPETEER_CHROMIUM_REVISION || process.env.npm_config_puppeteer_chromium_revision || process.env.npm_package_config_puppeteer_chromium_revision
+        || require('./package.json').puppeteer.chromium_revision;
+    } else if (product === 'firefox') {
+      puppeteer._preferredRevision = require('./package.json').puppeteer.firefox_revision;
+      return getFirefoxNightlyVersion(browserFetcher.host()).catch(error => { console.error(error); process.exit(1); });
+    } else {
+      throw new Error(`Unsupported product ${product}`);
+    }
   }
-  const delta = downloadedBytes - lastDownloadedBytes;
-  lastDownloadedBytes = downloadedBytes;
-  progressBar.tick(delta);
-}
 
-function toMegabytes(bytes) {
-  const mb = bytes / 1024 / 1024;
-  return `${Math.round(mb * 10) / 10} Mb`;
-}
+  function fetchBinary(revision) {
+    const revisionInfo = browserFetcher.revisionInfo(revision);
 
-function generateProtocolTypesIfNecessary(updated) {
-  const fs = require('fs');
-  const path = require('path');
-  if (!fs.existsSync(path.join(__dirname, 'utils', 'protocol-types-generator')))
-    return;
-  if (!updated && fs.existsSync(path.join(__dirname, 'lib', 'protocol.d.ts')))
-    return;
-  return require('./utils/protocol-types-generator');
+    // Do nothing if the revision is already downloaded.
+    if (revisionInfo.local) {
+      logPolitely(`${supportedProducts[product]} is already in ${revisionInfo.folderPath}; skipping download.`);
+      return;
+    }
+
+    // Override current environment proxy settings with npm configuration, if any.
+    const NPM_HTTPS_PROXY = process.env.npm_config_https_proxy || process.env.npm_config_proxy;
+    const NPM_HTTP_PROXY = process.env.npm_config_http_proxy || process.env.npm_config_proxy;
+    const NPM_NO_PROXY = process.env.npm_config_no_proxy;
+
+    if (NPM_HTTPS_PROXY)
+      process.env.HTTPS_PROXY = NPM_HTTPS_PROXY;
+    if (NPM_HTTP_PROXY)
+      process.env.HTTP_PROXY = NPM_HTTP_PROXY;
+    if (NPM_NO_PROXY)
+      process.env.NO_PROXY = NPM_NO_PROXY;
+
+    /**
+     * @param {!Array<string>}
+     * @return {!Promise}
+     */
+    function onSuccess(localRevisions) {
+      logPolitely(`${supportedProducts[product]} (${revisionInfo.revision}) downloaded to ${revisionInfo.folderPath}`);
+      localRevisions = localRevisions.filter(revision => revision !== revisionInfo.revision);
+      const cleanupOldVersions = localRevisions.map(revision => browserFetcher.remove(revision));
+      Promise.all([...cleanupOldVersions]);
+    }
+
+    /**
+     * @param {!Error} error
+     */
+    function onError(error) {
+      console.error(`ERROR: Failed to set up ${supportedProducts[product]} r${revision}! Set "PUPPETEER_SKIP_DOWNLOAD" env variable to skip download.`);
+      console.error(error);
+      process.exit(1);
+    }
+
+    let progressBar = null;
+    let lastDownloadedBytes = 0;
+    function onProgress(downloadedBytes, totalBytes) {
+      if (!progressBar) {
+        const ProgressBar = require('progress');
+        progressBar = new ProgressBar(`Downloading ${supportedProducts[product]} r${revision} - ${toMegabytes(totalBytes)} [:bar] :percent :etas `, {
+          complete: '=',
+          incomplete: ' ',
+          width: 20,
+          total: totalBytes,
+        });
+      }
+      const delta = downloadedBytes - lastDownloadedBytes;
+      lastDownloadedBytes = downloadedBytes;
+      progressBar.tick(delta);
+    }
+
+    return browserFetcher.download(revisionInfo.revision, onProgress)
+        .then(() => browserFetcher.localRevisions())
+        .then(onSuccess)
+        .catch(onError);
+  }
+
+  function toMegabytes(bytes) {
+    const mb = bytes / 1024 / 1024;
+    return `${Math.round(mb * 10) / 10} Mb`;
+  }
+
+  function getFirefoxNightlyVersion(host) {
+    const https = require('https');
+    const promise = new Promise((resolve, reject) => {
+      let data = '';
+      logPolitely(`Requesting latest Firefox Nightly version from ${host}`);
+      https.get(host + '/', r => {
+        if (r.statusCode >= 400)
+          return reject(new Error(`Got status code ${r.statusCode}`));
+        r.on('data', chunk => {
+          data += chunk;
+        });
+        r.on('end', parseVersion);
+      }).on('error', reject);
+
+      function parseVersion() {
+        const regex = /firefox\-(?<version>\d\d)\..*/gm;
+        let result = 0;
+        let match;
+        while ((match = regex.exec(data)) !== null) {
+          const version = parseInt(match.groups.version, 10);
+          if (version > result)
+            result = version;
+        }
+        if (result)
+          resolve(result.toString());
+        else reject(new Error('Firefox version not found'));
+      }
+    });
+    return promise;
+  }
 }
 
 function logPolitely(toBeLogged) {
@@ -125,3 +162,30 @@
     console.log(toBeLogged);
 }
 
+if (process.env.PUPPETEER_SKIP_DOWNLOAD) {
+  logPolitely('**INFO** Skipping browser download. "PUPPETEER_SKIP_DOWNLOAD" environment variable was found.');
+  return;
+}
+if (process.env.NPM_CONFIG_PUPPETEER_SKIP_DOWNLOAD || process.env.npm_config_puppeteer_skip_download) {
+  logPolitely('**INFO** Skipping browser download. "PUPPETEER_SKIP_DOWNLOAD" was set in npm config.');
+  return;
+}
+if (process.env.NPM_PACKAGE_CONFIG_PUPPETEER_SKIP_DOWNLOAD || process.env.npm_package_config_puppeteer_skip_download) {
+  logPolitely('**INFO** Skipping browser download. "PUPPETEER_SKIP_DOWNLOAD" was set in project config.');
+  return;
+}
+if (process.env.PUPPETEER_SKIP_CHROMIUM_DOWNLOAD) {
+  logPolitely('**INFO** Skipping browser download. "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" environment variable was found.');
+  return;
+}
+if (process.env.NPM_CONFIG_PUPPETEER_SKIP_CHROMIUM_DOWNLOAD || process.env.npm_config_puppeteer_skip_chromium_download) {
+  logPolitely('**INFO** Skipping browser download. "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" was set in npm config.');
+  return;
+}
+if (process.env.NPM_PACKAGE_CONFIG_PUPPETEER_SKIP_CHROMIUM_DOWNLOAD || process.env.npm_package_config_puppeteer_skip_chromium_download) {
+  logPolitely('**INFO** Skipping browser download. "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" was set in project config.');
+  return;
+}
+
+download();
+
diff --git a/node_modules/puppeteer/lib/Accessibility.js b/node_modules/puppeteer/lib/Accessibility.js
index 9f005a0..46c65ed 100644
--- a/node_modules/puppeteer/lib/Accessibility.js
+++ b/node_modules/puppeteer/lib/Accessibility.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2018 Google Inc. All rights reserved.
  *
@@ -13,413 +14,293 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-/**
- * @typedef {Object} SerializedAXNode
- * @property {string} role
- *
- * @property {string=} name
- * @property {string|number=} value
- * @property {string=} description
- *
- * @property {string=} keyshortcuts
- * @property {string=} roledescription
- * @property {string=} valuetext
- *
- * @property {boolean=} disabled
- * @property {boolean=} expanded
- * @property {boolean=} focused
- * @property {boolean=} modal
- * @property {boolean=} multiline
- * @property {boolean=} multiselectable
- * @property {boolean=} readonly
- * @property {boolean=} required
- * @property {boolean=} selected
- *
- * @property {boolean|"mixed"=} checked
- * @property {boolean|"mixed"=} pressed
- *
- * @property {number=} level
- * @property {number=} valuemin
- * @property {number=} valuemax
- *
- * @property {string=} autocomplete
- * @property {string=} haspopup
- * @property {string=} invalid
- * @property {string=} orientation
- *
- * @property {Array<SerializedAXNode>=} children
- */
-
+Object.defineProperty(exports, "__esModule", { value: true });
 class Accessibility {
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   */
-  constructor(client) {
-    this._client = client;
-  }
-
-  /**
-   * @param {{interestingOnly?: boolean, root?: ?Puppeteer.ElementHandle}=} options
-   * @return {!Promise<!SerializedAXNode>}
-   */
-  async snapshot(options = {}) {
-    const {
-      interestingOnly = true,
-      root = null,
-    } = options;
-    const {nodes} = await this._client.send('Accessibility.getFullAXTree');
-    let backendNodeId = null;
-    if (root) {
-      const {node} = await this._client.send('DOM.describeNode', {objectId: root._remoteObject.objectId});
-      backendNodeId = node.backendNodeId;
+    constructor(client) {
+        this._client = client;
     }
-    const defaultRoot = AXNode.createTree(nodes);
-    let needle = defaultRoot;
-    if (backendNodeId) {
-      needle = defaultRoot.find(node => node._payload.backendDOMNodeId === backendNodeId);
-      if (!needle)
-        return null;
+    async snapshot(options = {}) {
+        const { interestingOnly = true, root = null, } = options;
+        const { nodes } = await this._client.send('Accessibility.getFullAXTree');
+        let backendNodeId = null;
+        if (root) {
+            const { node } = await this._client.send('DOM.describeNode', { objectId: root._remoteObject.objectId });
+            backendNodeId = node.backendNodeId;
+        }
+        const defaultRoot = AXNode.createTree(nodes);
+        let needle = defaultRoot;
+        if (backendNodeId) {
+            needle = defaultRoot.find(node => node._payload.backendDOMNodeId === backendNodeId);
+            if (!needle)
+                return null;
+        }
+        if (!interestingOnly)
+            return serializeTree(needle)[0];
+        const interestingNodes = new Set();
+        collectInterestingNodes(interestingNodes, defaultRoot, false);
+        if (!interestingNodes.has(needle))
+            return null;
+        return serializeTree(needle, interestingNodes)[0];
     }
-    if (!interestingOnly)
-      return serializeTree(needle)[0];
-
-    /** @type {!Set<!AXNode>} */
-    const interestingNodes = new Set();
-    collectInterestingNodes(interestingNodes, defaultRoot, false);
-    if (!interestingNodes.has(needle))
-      return null;
-    return serializeTree(needle, interestingNodes)[0];
-  }
 }
-
+exports.Accessibility = Accessibility;
 /**
  * @param {!Set<!AXNode>} collection
  * @param {!AXNode} node
  * @param {boolean} insideControl
  */
 function collectInterestingNodes(collection, node, insideControl) {
-  if (node.isInteresting(insideControl))
-    collection.add(node);
-  if (node.isLeafNode())
-    return;
-  insideControl = insideControl || node.isControl();
-  for (const child of node._children)
-    collectInterestingNodes(collection, child, insideControl);
+    if (node.isInteresting(insideControl))
+        collection.add(node);
+    if (node.isLeafNode())
+        return;
+    insideControl = insideControl || node.isControl();
+    for (const child of node._children)
+        collectInterestingNodes(collection, child, insideControl);
 }
-
-/**
- * @param {!AXNode} node
- * @param {!Set<!AXNode>=} whitelistedNodes
- * @return {!Array<!SerializedAXNode>}
- */
 function serializeTree(node, whitelistedNodes) {
-  /** @type {!Array<!SerializedAXNode>} */
-  const children = [];
-  for (const child of node._children)
-    children.push(...serializeTree(child, whitelistedNodes));
-
-  if (whitelistedNodes && !whitelistedNodes.has(node))
-    return children;
-
-  const serializedNode = node.serialize();
-  if (children.length)
-    serializedNode.children = children;
-  return [serializedNode];
+    const children = [];
+    for (const child of node._children)
+        children.push(...serializeTree(child, whitelistedNodes));
+    if (whitelistedNodes && !whitelistedNodes.has(node))
+        return children;
+    const serializedNode = node.serialize();
+    if (children.length)
+        serializedNode.children = children;
+    return [serializedNode];
 }
-
-
 class AXNode {
-  /**
-   * @param {!Protocol.Accessibility.AXNode} payload
-   */
-  constructor(payload) {
-    this._payload = payload;
-
-    /** @type {!Array<!AXNode>} */
-    this._children = [];
-
-    this._richlyEditable = false;
-    this._editable = false;
-    this._focusable = false;
-    this._expanded = false;
-    this._hidden = false;
-    this._name = this._payload.name ? this._payload.name.value : '';
-    this._role = this._payload.role ? this._payload.role.value : 'Unknown';
-    this._cachedHasFocusableChild;
-
-    for (const property of this._payload.properties || []) {
-      if (property.name === 'editable') {
-        this._richlyEditable = property.value.value === 'richtext';
-        this._editable = true;
-      }
-      if (property.name === 'focusable')
-        this._focusable = property.value.value;
-      if (property.name === 'expanded')
-        this._expanded = property.value.value;
-      if (property.name === 'hidden')
-        this._hidden = property.value.value;
-    }
-  }
-
-  /**
-   * @return {boolean}
-   */
-  _isPlainTextField() {
-    if (this._richlyEditable)
-      return false;
-    if (this._editable)
-      return true;
-    return this._role === 'textbox' || this._role === 'ComboBox' || this._role === 'searchbox';
-  }
-
-  /**
-   * @return {boolean}
-   */
-  _isTextOnlyObject() {
-    const role = this._role;
-    return (role === 'LineBreak' || role === 'text' ||
-            role === 'InlineTextBox');
-  }
-
-  /**
-   * @return {boolean}
-   */
-  _hasFocusableChild() {
-    if (this._cachedHasFocusableChild === undefined) {
-      this._cachedHasFocusableChild = false;
-      for (const child of this._children) {
-        if (child._focusable || child._hasFocusableChild()) {
-          this._cachedHasFocusableChild = true;
-          break;
+    constructor(payload) {
+        this._children = [];
+        this._richlyEditable = false;
+        this._editable = false;
+        this._focusable = false;
+        this._expanded = false;
+        this._hidden = false;
+        this._payload = payload;
+        this._name = this._payload.name ? this._payload.name.value : '';
+        this._role = this._payload.role ? this._payload.role.value : 'Unknown';
+        for (const property of this._payload.properties || []) {
+            if (property.name === 'editable') {
+                this._richlyEditable = property.value.value === 'richtext';
+                this._editable = true;
+            }
+            if (property.name === 'focusable')
+                this._focusable = property.value.value;
+            if (property.name === 'expanded')
+                this._expanded = property.value.value;
+            if (property.name === 'hidden')
+                this._hidden = property.value.value;
         }
-      }
     }
-    return this._cachedHasFocusableChild;
-  }
-
-  /**
-   * @param {function(AXNode):boolean} predicate
-   * @return {?AXNode}
-   */
-  find(predicate) {
-    if (predicate(this))
-      return this;
-    for (const child of this._children) {
-      const result = child.find(predicate);
-      if (result)
-        return result;
+    _isPlainTextField() {
+        if (this._richlyEditable)
+            return false;
+        if (this._editable)
+            return true;
+        return this._role === 'textbox' || this._role === 'ComboBox' || this._role === 'searchbox';
     }
-    return null;
-  }
-
-  /**
-   * @return {boolean}
-   */
-  isLeafNode() {
-    if (!this._children.length)
-      return true;
-
-    // These types of objects may have children that we use as internal
-    // implementation details, but we want to expose them as leaves to platform
-    // accessibility APIs because screen readers might be confused if they find
-    // any children.
-    if (this._isPlainTextField() || this._isTextOnlyObject())
-      return true;
-
-    // Roles whose children are only presentational according to the ARIA and
-    // HTML5 Specs should be hidden from screen readers.
-    // (Note that whilst ARIA buttons can have only presentational children, HTML5
-    // buttons are allowed to have content.)
-    switch (this._role) {
-      case 'doc-cover':
-      case 'graphics-symbol':
-      case 'img':
-      case 'Meter':
-      case 'scrollbar':
-      case 'slider':
-      case 'separator':
-      case 'progressbar':
-        return true;
-      default:
-        break;
+    _isTextOnlyObject() {
+        const role = this._role;
+        return (role === 'LineBreak' || role === 'text' ||
+            role === 'InlineTextBox');
     }
-
-    // Here and below: Android heuristics
-    if (this._hasFocusableChild())
-      return false;
-    if (this._focusable && this._name)
-      return true;
-    if (this._role === 'heading' && this._name)
-      return true;
-    return false;
-  }
-
-  /**
-   * @return {boolean}
-   */
-  isControl() {
-    switch (this._role) {
-      case 'button':
-      case 'checkbox':
-      case 'ColorWell':
-      case 'combobox':
-      case 'DisclosureTriangle':
-      case 'listbox':
-      case 'menu':
-      case 'menubar':
-      case 'menuitem':
-      case 'menuitemcheckbox':
-      case 'menuitemradio':
-      case 'radio':
-      case 'scrollbar':
-      case 'searchbox':
-      case 'slider':
-      case 'spinbutton':
-      case 'switch':
-      case 'tab':
-      case 'textbox':
-      case 'tree':
-        return true;
-      default:
+    _hasFocusableChild() {
+        if (this._cachedHasFocusableChild === undefined) {
+            this._cachedHasFocusableChild = false;
+            for (const child of this._children) {
+                if (child._focusable || child._hasFocusableChild()) {
+                    this._cachedHasFocusableChild = true;
+                    break;
+                }
+            }
+        }
+        return this._cachedHasFocusableChild;
+    }
+    find(predicate) {
+        if (predicate(this))
+            return this;
+        for (const child of this._children) {
+            const result = child.find(predicate);
+            if (result)
+                return result;
+        }
+        return null;
+    }
+    isLeafNode() {
+        if (!this._children.length)
+            return true;
+        // These types of objects may have children that we use as internal
+        // implementation details, but we want to expose them as leaves to platform
+        // accessibility APIs because screen readers might be confused if they find
+        // any children.
+        if (this._isPlainTextField() || this._isTextOnlyObject())
+            return true;
+        // Roles whose children are only presentational according to the ARIA and
+        // HTML5 Specs should be hidden from screen readers.
+        // (Note that whilst ARIA buttons can have only presentational children, HTML5
+        // buttons are allowed to have content.)
+        switch (this._role) {
+            case 'doc-cover':
+            case 'graphics-symbol':
+            case 'img':
+            case 'Meter':
+            case 'scrollbar':
+            case 'slider':
+            case 'separator':
+            case 'progressbar':
+                return true;
+            default:
+                break;
+        }
+        // Here and below: Android heuristics
+        if (this._hasFocusableChild())
+            return false;
+        if (this._focusable && this._name)
+            return true;
+        if (this._role === 'heading' && this._name)
+            return true;
         return false;
     }
-  }
-
-  /**
-   * @param {boolean} insideControl
-   * @return {boolean}
-   */
-  isInteresting(insideControl) {
-    const role = this._role;
-    if (role === 'Ignored' || this._hidden)
-      return false;
-
-    if (this._focusable || this._richlyEditable)
-      return true;
-
-    // If it's not focusable but has a control role, then it's interesting.
-    if (this.isControl())
-      return true;
-
-    // A non focusable child of a control is not interesting
-    if (insideControl)
-      return false;
-
-    return this.isLeafNode() && !!this._name;
-  }
-
-  /**
-   * @return {!SerializedAXNode}
-   */
-  serialize() {
-    /** @type {!Map<string, number|string|boolean>} */
-    const properties = new Map();
-    for (const property of this._payload.properties || [])
-      properties.set(property.name.toLowerCase(), property.value.value);
-    if (this._payload.name)
-      properties.set('name', this._payload.name.value);
-    if (this._payload.value)
-      properties.set('value', this._payload.value.value);
-    if (this._payload.description)
-      properties.set('description', this._payload.description.value);
-
-    /** @type {SerializedAXNode} */
-    const node = {
-      role: this._role
-    };
-
-    /** @type {!Array<keyof SerializedAXNode>} */
-    const userStringProperties = [
-      'name',
-      'value',
-      'description',
-      'keyshortcuts',
-      'roledescription',
-      'valuetext',
-    ];
-    for (const userStringProperty of userStringProperties) {
-      if (!properties.has(userStringProperty))
-        continue;
-      node[userStringProperty] = properties.get(userStringProperty);
+    isControl() {
+        switch (this._role) {
+            case 'button':
+            case 'checkbox':
+            case 'ColorWell':
+            case 'combobox':
+            case 'DisclosureTriangle':
+            case 'listbox':
+            case 'menu':
+            case 'menubar':
+            case 'menuitem':
+            case 'menuitemcheckbox':
+            case 'menuitemradio':
+            case 'radio':
+            case 'scrollbar':
+            case 'searchbox':
+            case 'slider':
+            case 'spinbutton':
+            case 'switch':
+            case 'tab':
+            case 'textbox':
+            case 'tree':
+                return true;
+            default:
+                return false;
+        }
     }
-
-    /** @type {!Array<keyof SerializedAXNode>} */
-    const booleanProperties = [
-      'disabled',
-      'expanded',
-      'focused',
-      'modal',
-      'multiline',
-      'multiselectable',
-      'readonly',
-      'required',
-      'selected',
-    ];
-    for (const booleanProperty of booleanProperties) {
-      // WebArea's treat focus differently than other nodes. They report whether their frame  has focus,
-      // not whether focus is specifically on the root node.
-      if (booleanProperty === 'focused' && this._role === 'WebArea')
-        continue;
-      const value = properties.get(booleanProperty);
-      if (!value)
-        continue;
-      node[booleanProperty] = value;
+    /**
+     * @param {boolean} insideControl
+     * @return {boolean}
+     */
+    isInteresting(insideControl) {
+        const role = this._role;
+        if (role === 'Ignored' || this._hidden)
+            return false;
+        if (this._focusable || this._richlyEditable)
+            return true;
+        // If it's not focusable but has a control role, then it's interesting.
+        if (this.isControl())
+            return true;
+        // A non focusable child of a control is not interesting
+        if (insideControl)
+            return false;
+        return this.isLeafNode() && !!this._name;
     }
-
-    /** @type {!Array<keyof SerializedAXNode>} */
-    const tristateProperties = [
-      'checked',
-      'pressed',
-    ];
-    for (const tristateProperty of tristateProperties) {
-      if (!properties.has(tristateProperty))
-        continue;
-      const value = properties.get(tristateProperty);
-      node[tristateProperty] = value === 'mixed' ? 'mixed' : value === 'true' ? true : false;
+    serialize() {
+        const properties = new Map();
+        for (const property of this._payload.properties || [])
+            properties.set(property.name.toLowerCase(), property.value.value);
+        if (this._payload.name)
+            properties.set('name', this._payload.name.value);
+        if (this._payload.value)
+            properties.set('value', this._payload.value.value);
+        if (this._payload.description)
+            properties.set('description', this._payload.description.value);
+        const node = {
+            role: this._role
+        };
+        const userStringProperties = [
+            'name',
+            'value',
+            'description',
+            'keyshortcuts',
+            'roledescription',
+            'valuetext',
+        ];
+        const getUserStringPropertyValue = (key) => properties.get(key);
+        for (const userStringProperty of userStringProperties) {
+            if (!properties.has(userStringProperty))
+                continue;
+            node[userStringProperty] = getUserStringPropertyValue(userStringProperty);
+        }
+        const booleanProperties = [
+            'disabled',
+            'expanded',
+            'focused',
+            'modal',
+            'multiline',
+            'multiselectable',
+            'readonly',
+            'required',
+            'selected',
+        ];
+        const getBooleanPropertyValue = (key) => properties.get(key);
+        for (const booleanProperty of booleanProperties) {
+            // WebArea's treat focus differently than other nodes. They report whether their frame  has focus,
+            // not whether focus is specifically on the root node.
+            if (booleanProperty === 'focused' && this._role === 'WebArea')
+                continue;
+            const value = getBooleanPropertyValue(booleanProperty);
+            if (!value)
+                continue;
+            node[booleanProperty] = getBooleanPropertyValue(booleanProperty);
+        }
+        const tristateProperties = [
+            'checked',
+            'pressed',
+        ];
+        for (const tristateProperty of tristateProperties) {
+            if (!properties.has(tristateProperty))
+                continue;
+            const value = properties.get(tristateProperty);
+            node[tristateProperty] = value === 'mixed' ? 'mixed' : value === 'true' ? true : false;
+        }
+        const numericalProperties = [
+            'level',
+            'valuemax',
+            'valuemin',
+        ];
+        const getNumericalPropertyValue = (key) => properties.get(key);
+        for (const numericalProperty of numericalProperties) {
+            if (!properties.has(numericalProperty))
+                continue;
+            node[numericalProperty] = getNumericalPropertyValue(numericalProperty);
+        }
+        const tokenProperties = [
+            'autocomplete',
+            'haspopup',
+            'invalid',
+            'orientation',
+        ];
+        const getTokenPropertyValue = (key) => properties.get(key);
+        for (const tokenProperty of tokenProperties) {
+            const value = getTokenPropertyValue(tokenProperty);
+            if (!value || value === 'false')
+                continue;
+            node[tokenProperty] = getTokenPropertyValue(tokenProperty);
+        }
+        return node;
     }
-    /** @type {!Array<keyof SerializedAXNode>} */
-    const numericalProperties = [
-      'level',
-      'valuemax',
-      'valuemin',
-    ];
-    for (const numericalProperty of numericalProperties) {
-      if (!properties.has(numericalProperty))
-        continue;
-      node[numericalProperty] = properties.get(numericalProperty);
+    static createTree(payloads) {
+        /** @type {!Map<string, !AXNode>} */
+        const nodeById = new Map();
+        for (const payload of payloads)
+            nodeById.set(payload.nodeId, new AXNode(payload));
+        for (const node of nodeById.values()) {
+            for (const childId of node._payload.childIds || [])
+                node._children.push(nodeById.get(childId));
+        }
+        return nodeById.values().next().value;
     }
-    /** @type {!Array<keyof SerializedAXNode>} */
-    const tokenProperties = [
-      'autocomplete',
-      'haspopup',
-      'invalid',
-      'orientation',
-    ];
-    for (const tokenProperty of tokenProperties) {
-      const value = properties.get(tokenProperty);
-      if (!value || value === 'false')
-        continue;
-      node[tokenProperty] = value;
-    }
-    return node;
-  }
-
-  /**
-   * @param {!Array<!Protocol.Accessibility.AXNode>} payloads
-   * @return {!AXNode}
-   */
-  static createTree(payloads) {
-    /** @type {!Map<string, !AXNode>} */
-    const nodeById = new Map();
-    for (const payload of payloads)
-      nodeById.set(payload.nodeId, new AXNode(payload));
-    for (const node of nodeById.values()) {
-      for (const childId of node._payload.childIds || [])
-        node._children.push(nodeById.get(childId));
-    }
-    return nodeById.values().next().value;
-  }
 }
-
-module.exports = {Accessibility};
diff --git a/node_modules/puppeteer/lib/Browser.js b/node_modules/puppeteer/lib/Browser.js
index 1b6d600..6219cfd 100644
--- a/node_modules/puppeteer/lib/Browser.js
+++ b/node_modules/puppeteer/lib/Browser.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,371 +14,236 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-const { helper, assert } = require('./helper');
-const {Target} = require('./Target');
-const EventEmitter = require('events');
-const {TaskQueue} = require('./TaskQueue');
-const {Events} = require('./Events');
-
+Object.defineProperty(exports, "__esModule", { value: true });
+const helper_1 = require("./helper");
+const Target_1 = require("./Target");
+const EventEmitter = require("events");
+const TaskQueue_1 = require("./TaskQueue");
+const Events_1 = require("./Events");
 class Browser extends EventEmitter {
-  /**
-   * @param {!Puppeteer.Connection} connection
-   * @param {!Array<string>} contextIds
-   * @param {boolean} ignoreHTTPSErrors
-   * @param {?Puppeteer.Viewport} defaultViewport
-   * @param {?Puppeteer.ChildProcess} process
-   * @param {function()=} closeCallback
-   */
-  static async create(connection, contextIds, ignoreHTTPSErrors, defaultViewport, process, closeCallback) {
-    const browser = new Browser(connection, contextIds, ignoreHTTPSErrors, defaultViewport, process, closeCallback);
-    await connection.send('Target.setDiscoverTargets', {discover: true});
-    return browser;
-  }
-
-  /**
-   * @param {!Puppeteer.Connection} connection
-   * @param {!Array<string>} contextIds
-   * @param {boolean} ignoreHTTPSErrors
-   * @param {?Puppeteer.Viewport} defaultViewport
-   * @param {?Puppeteer.ChildProcess} process
-   * @param {(function():Promise)=} closeCallback
-   */
-  constructor(connection, contextIds, ignoreHTTPSErrors, defaultViewport, process, closeCallback) {
-    super();
-    this._ignoreHTTPSErrors = ignoreHTTPSErrors;
-    this._defaultViewport = defaultViewport;
-    this._process = process;
-    this._screenshotTaskQueue = new TaskQueue();
-    this._connection = connection;
-    this._closeCallback = closeCallback || new Function();
-
-    this._defaultContext = new BrowserContext(this._connection, this, null);
-    /** @type {Map<string, BrowserContext>} */
-    this._contexts = new Map();
-    for (const contextId of contextIds)
-      this._contexts.set(contextId, new BrowserContext(this._connection, this, contextId));
-
-    /** @type {Map<string, Target>} */
-    this._targets = new Map();
-    this._connection.on(Events.Connection.Disconnected, () => this.emit(Events.Browser.Disconnected));
-    this._connection.on('Target.targetCreated', this._targetCreated.bind(this));
-    this._connection.on('Target.targetDestroyed', this._targetDestroyed.bind(this));
-    this._connection.on('Target.targetInfoChanged', this._targetInfoChanged.bind(this));
-  }
-
-  /**
-   * @return {?Puppeteer.ChildProcess}
-   */
-  process() {
-    return this._process;
-  }
-
-  /**
-   * @return {!Promise<!BrowserContext>}
-   */
-  async createIncognitoBrowserContext() {
-    const {browserContextId} = await this._connection.send('Target.createBrowserContext');
-    const context = new BrowserContext(this._connection, this, browserContextId);
-    this._contexts.set(browserContextId, context);
-    return context;
-  }
-
-  /**
-   * @return {!Array<!BrowserContext>}
-   */
-  browserContexts() {
-    return [this._defaultContext, ...Array.from(this._contexts.values())];
-  }
-
-  /**
-   * @return {!BrowserContext}
-   */
-  defaultBrowserContext() {
-    return this._defaultContext;
-  }
-
-  /**
-   * @param {?string} contextId
-   */
-  async _disposeContext(contextId) {
-    await this._connection.send('Target.disposeBrowserContext', {browserContextId: contextId || undefined});
-    this._contexts.delete(contextId);
-  }
-
-  /**
-   * @param {!Protocol.Target.targetCreatedPayload} event
-   */
-  async _targetCreated(event) {
-    const targetInfo = event.targetInfo;
-    const {browserContextId} = targetInfo;
-    const context = (browserContextId && this._contexts.has(browserContextId)) ? this._contexts.get(browserContextId) : this._defaultContext;
-
-    const target = new Target(targetInfo, context, () => this._connection.createSession(targetInfo), this._ignoreHTTPSErrors, this._defaultViewport, this._screenshotTaskQueue);
-    assert(!this._targets.has(event.targetInfo.targetId), 'Target should not exist before targetCreated');
-    this._targets.set(event.targetInfo.targetId, target);
-
-    if (await target._initializedPromise) {
-      this.emit(Events.Browser.TargetCreated, target);
-      context.emit(Events.BrowserContext.TargetCreated, target);
+    constructor(connection, contextIds, ignoreHTTPSErrors, defaultViewport, process, closeCallback) {
+        super();
+        this._screenshotTaskQueue = new TaskQueue_1.TaskQueue();
+        this._ignoreHTTPSErrors = ignoreHTTPSErrors;
+        this._defaultViewport = defaultViewport;
+        this._process = process;
+        this._screenshotTaskQueue = new TaskQueue_1.TaskQueue();
+        this._connection = connection;
+        this._closeCallback = closeCallback || function () { };
+        this._defaultContext = new BrowserContext(this._connection, this, null);
+        this._contexts = new Map();
+        for (const contextId of contextIds)
+            this._contexts.set(contextId, new BrowserContext(this._connection, this, contextId));
+        this._targets = new Map();
+        this._connection.on(Events_1.Events.Connection.Disconnected, () => this.emit(Events_1.Events.Browser.Disconnected));
+        this._connection.on('Target.targetCreated', this._targetCreated.bind(this));
+        this._connection.on('Target.targetDestroyed', this._targetDestroyed.bind(this));
+        this._connection.on('Target.targetInfoChanged', this._targetInfoChanged.bind(this));
     }
-  }
-
-  /**
-   * @param {{targetId: string}} event
-   */
-  async _targetDestroyed(event) {
-    const target = this._targets.get(event.targetId);
-    target._initializedCallback(false);
-    this._targets.delete(event.targetId);
-    target._closedCallback();
-    if (await target._initializedPromise) {
-      this.emit(Events.Browser.TargetDestroyed, target);
-      target.browserContext().emit(Events.BrowserContext.TargetDestroyed, target);
+    static async create(connection, contextIds, ignoreHTTPSErrors, defaultViewport, process, closeCallback) {
+        const browser = new Browser(connection, contextIds, ignoreHTTPSErrors, defaultViewport, process, closeCallback);
+        await connection.send('Target.setDiscoverTargets', { discover: true });
+        return browser;
     }
-  }
-
-  /**
-   * @param {!Protocol.Target.targetInfoChangedPayload} event
-   */
-  _targetInfoChanged(event) {
-    const target = this._targets.get(event.targetInfo.targetId);
-    assert(target, 'target should exist before targetInfoChanged');
-    const previousURL = target.url();
-    const wasInitialized = target._isInitialized;
-    target._targetInfoChanged(event.targetInfo);
-    if (wasInitialized && previousURL !== target.url()) {
-      this.emit(Events.Browser.TargetChanged, target);
-      target.browserContext().emit(Events.BrowserContext.TargetChanged, target);
+    process() {
+        return this._process;
     }
-  }
-
-  /**
-   * @return {string}
-   */
-  wsEndpoint() {
-    return this._connection.url();
-  }
-
-  /**
-   * @return {!Promise<!Puppeteer.Page>}
-   */
-  async newPage() {
-    return this._defaultContext.newPage();
-  }
-
-  /**
-   * @param {?string} contextId
-   * @return {!Promise<!Puppeteer.Page>}
-   */
-  async _createPageInContext(contextId) {
-    const {targetId} = await this._connection.send('Target.createTarget', {url: 'about:blank', browserContextId: contextId || undefined});
-    const target = await this._targets.get(targetId);
-    assert(await target._initializedPromise, 'Failed to create target for page');
-    const page = await target.page();
-    return page;
-  }
-
-  /**
-   * @return {!Array<!Target>}
-   */
-  targets() {
-    return Array.from(this._targets.values()).filter(target => target._isInitialized);
-  }
-
-  /**
-   * @return {!Target}
-   */
-  target() {
-    return this.targets().find(target => target.type() === 'browser');
-  }
-
-  /**
-   * @param {function(!Target):boolean} predicate
-   * @param {{timeout?: number}=} options
-   * @return {!Promise<!Target>}
-   */
-  async waitForTarget(predicate, options = {}) {
-    const {
-      timeout = 30000
-    } = options;
-    const existingTarget = this.targets().find(predicate);
-    if (existingTarget)
-      return existingTarget;
-    let resolve;
-    const targetPromise = new Promise(x => resolve = x);
-    this.on(Events.Browser.TargetCreated, check);
-    this.on(Events.Browser.TargetChanged, check);
-    try {
-      if (!timeout)
-        return await targetPromise;
-      return await helper.waitWithTimeout(targetPromise, 'target', timeout);
-    } finally {
-      this.removeListener(Events.Browser.TargetCreated, check);
-      this.removeListener(Events.Browser.TargetChanged, check);
+    async createIncognitoBrowserContext() {
+        const { browserContextId } = await this._connection.send('Target.createBrowserContext');
+        const context = new BrowserContext(this._connection, this, browserContextId);
+        this._contexts.set(browserContextId, context);
+        return context;
     }
-
+    browserContexts() {
+        return [this._defaultContext, ...Array.from(this._contexts.values())];
+    }
+    defaultBrowserContext() {
+        return this._defaultContext;
+    }
     /**
-     * @param {!Target} target
-     */
-    function check(target) {
-      if (predicate(target))
-        resolve(target);
+    * @param {?string} contextId
+    */
+    async _disposeContext(contextId) {
+        await this._connection.send('Target.disposeBrowserContext', { browserContextId: contextId || undefined });
+        this._contexts.delete(contextId);
     }
-  }
-
-  /**
-   * @return {!Promise<!Array<!Puppeteer.Page>>}
-   */
-  async pages() {
-    const contextPages = await Promise.all(this.browserContexts().map(context => context.pages()));
-    // Flatten array.
-    return contextPages.reduce((acc, x) => acc.concat(x), []);
-  }
-
-  /**
-   * @return {!Promise<string>}
-   */
-  async version() {
-    const version = await this._getVersion();
-    return version.product;
-  }
-
-  /**
-   * @return {!Promise<string>}
-   */
-  async userAgent() {
-    const version = await this._getVersion();
-    return version.userAgent;
-  }
-
-  async close() {
-    await this._closeCallback.call(null);
-    this.disconnect();
-  }
-
-  disconnect() {
-    this._connection.dispose();
-  }
-
-  /**
-   * @return {boolean}
-   */
-  isConnected() {
-    return !this._connection._closed;
-  }
-
-  /**
-   * @return {!Promise<!Object>}
-   */
-  _getVersion() {
-    return this._connection.send('Browser.getVersion');
-  }
+    async _targetCreated(event) {
+        const targetInfo = event.targetInfo;
+        const { browserContextId } = targetInfo;
+        const context = (browserContextId && this._contexts.has(browserContextId)) ? this._contexts.get(browserContextId) : this._defaultContext;
+        const target = new Target_1.Target(targetInfo, context, () => this._connection.createSession(targetInfo), this._ignoreHTTPSErrors, this._defaultViewport, this._screenshotTaskQueue);
+        helper_1.assert(!this._targets.has(event.targetInfo.targetId), 'Target should not exist before targetCreated');
+        this._targets.set(event.targetInfo.targetId, target);
+        if (await target._initializedPromise) {
+            this.emit(Events_1.Events.Browser.TargetCreated, target);
+            context.emit(Events_1.Events.BrowserContext.TargetCreated, target);
+        }
+    }
+    /**
+    * @param {{targetId: string}} event
+    */
+    async _targetDestroyed(event) {
+        const target = this._targets.get(event.targetId);
+        target._initializedCallback(false);
+        this._targets.delete(event.targetId);
+        target._closedCallback();
+        if (await target._initializedPromise) {
+            this.emit(Events_1.Events.Browser.TargetDestroyed, target);
+            target.browserContext().emit(Events_1.Events.BrowserContext.TargetDestroyed, target);
+        }
+    }
+    /**
+    * @param {!Protocol.Target.targetInfoChangedPayload} event
+    */
+    _targetInfoChanged(event) {
+        const target = this._targets.get(event.targetInfo.targetId);
+        helper_1.assert(target, 'target should exist before targetInfoChanged');
+        const previousURL = target.url();
+        const wasInitialized = target._isInitialized;
+        target._targetInfoChanged(event.targetInfo);
+        if (wasInitialized && previousURL !== target.url()) {
+            this.emit(Events_1.Events.Browser.TargetChanged, target);
+            target.browserContext().emit(Events_1.Events.BrowserContext.TargetChanged, target);
+        }
+    }
+    wsEndpoint() {
+        return this._connection.url();
+    }
+    async newPage() {
+        return this._defaultContext.newPage();
+    }
+    async _createPageInContext(contextId) {
+        const { targetId } = await this._connection.send('Target.createTarget', { url: 'about:blank', browserContextId: contextId || undefined });
+        const target = await this._targets.get(targetId);
+        helper_1.assert(await target._initializedPromise, 'Failed to create target for page');
+        const page = await target.page();
+        return page;
+    }
+    targets() {
+        return Array.from(this._targets.values()).filter(target => target._isInitialized);
+    }
+    target() {
+        return this.targets().find(target => target.type() === 'browser');
+    }
+    /**
+    * @param {function(!Target):boolean} predicate
+    * @param {{timeout?: number}=} options
+    * @return {!Promise<!Target>}
+    */
+    async waitForTarget(predicate, options = {}) {
+        const { timeout = 30000 } = options;
+        const existingTarget = this.targets().find(predicate);
+        if (existingTarget)
+            return existingTarget;
+        let resolve;
+        const targetPromise = new Promise(x => resolve = x);
+        this.on(Events_1.Events.Browser.TargetCreated, check);
+        this.on(Events_1.Events.Browser.TargetChanged, check);
+        try {
+            if (!timeout)
+                return await targetPromise;
+            return await helper_1.helper.waitWithTimeout(targetPromise, 'target', timeout);
+        }
+        finally {
+            this.removeListener(Events_1.Events.Browser.TargetCreated, check);
+            this.removeListener(Events_1.Events.Browser.TargetChanged, check);
+        }
+        function check(target) {
+            if (predicate(target))
+                resolve(target);
+        }
+    }
+    async pages() {
+        const contextPages = await Promise.all(this.browserContexts().map(context => context.pages()));
+        // Flatten array.
+        return contextPages.reduce((acc, x) => acc.concat(x), []);
+    }
+    async version() {
+        const version = await this._getVersion();
+        return version.product;
+    }
+    async userAgent() {
+        const version = await this._getVersion();
+        return version.userAgent;
+    }
+    async close() {
+        await this._closeCallback.call(null);
+        this.disconnect();
+    }
+    disconnect() {
+        this._connection.dispose();
+    }
+    isConnected() {
+        return !this._connection._closed;
+    }
+    _getVersion() {
+        return this._connection.send('Browser.getVersion');
+    }
 }
-
+exports.Browser = Browser;
 class BrowserContext extends EventEmitter {
-  /**
-   * @param {!Puppeteer.Connection} connection
-   * @param {!Browser} browser
-   * @param {?string} contextId
-   */
-  constructor(connection, browser, contextId) {
-    super();
-    this._connection = connection;
-    this._browser = browser;
-    this._id = contextId;
-  }
-
-  /**
-   * @return {!Array<!Target>} target
-   */
-  targets() {
-    return this._browser.targets().filter(target => target.browserContext() === this);
-  }
-
-  /**
-   * @param {function(!Target):boolean} predicate
-   * @param {{timeout?: number}=} options
-   * @return {!Promise<!Target>}
-   */
-  waitForTarget(predicate, options) {
-    return this._browser.waitForTarget(target => target.browserContext() === this && predicate(target), options);
-  }
-
-  /**
-   * @return {!Promise<!Array<!Puppeteer.Page>>}
-   */
-  async pages() {
-    const pages = await Promise.all(
-        this.targets()
+    constructor(connection, browser, contextId) {
+        super();
+        this._connection = connection;
+        this._browser = browser;
+        this._id = contextId;
+    }
+    targets() {
+        return this._browser.targets().filter(target => target.browserContext() === this);
+    }
+    waitForTarget(predicate, options) {
+        return this._browser.waitForTarget(target => target.browserContext() === this && predicate(target), options);
+    }
+    async pages() {
+        const pages = await Promise.all(this.targets()
             .filter(target => target.type() === 'page')
-            .map(target => target.page())
-    );
-    return pages.filter(page => !!page);
-  }
-
-  /**
-   * @return {boolean}
-   */
-  isIncognito() {
-    return !!this._id;
-  }
-
-  /**
-   * @param {string} origin
-   * @param {!Array<string>} permissions
-   */
-  async overridePermissions(origin, permissions) {
-    const webPermissionToProtocol = new Map([
-      ['geolocation', 'geolocation'],
-      ['midi', 'midi'],
-      ['notifications', 'notifications'],
-      ['push', 'push'],
-      ['camera', 'videoCapture'],
-      ['microphone', 'audioCapture'],
-      ['background-sync', 'backgroundSync'],
-      ['ambient-light-sensor', 'sensors'],
-      ['accelerometer', 'sensors'],
-      ['gyroscope', 'sensors'],
-      ['magnetometer', 'sensors'],
-      ['accessibility-events', 'accessibilityEvents'],
-      ['clipboard-read', 'clipboardRead'],
-      ['clipboard-write', 'clipboardWrite'],
-      ['payment-handler', 'paymentHandler'],
-      // chrome-specific permissions we have.
-      ['midi-sysex', 'midiSysex'],
-    ]);
-    permissions = permissions.map(permission => {
-      const protocolPermission = webPermissionToProtocol.get(permission);
-      if (!protocolPermission)
-        throw new Error('Unknown permission: ' + permission);
-      return protocolPermission;
-    });
-    await this._connection.send('Browser.grantPermissions', {origin, browserContextId: this._id || undefined, permissions});
-  }
-
-  async clearPermissionOverrides() {
-    await this._connection.send('Browser.resetPermissions', {browserContextId: this._id || undefined});
-  }
-
-  /**
-   * @return {!Promise<!Puppeteer.Page>}
-   */
-  newPage() {
-    return this._browser._createPageInContext(this._id);
-  }
-
-  /**
-   * @return {!Browser}
-   */
-  browser() {
-    return this._browser;
-  }
-
-  async close() {
-    assert(this._id, 'Non-incognito profiles cannot be closed!');
-    await this._browser._disposeContext(this._id);
-  }
+            .map(target => target.page()));
+        return pages.filter(page => !!page);
+    }
+    isIncognito() {
+        return !!this._id;
+    }
+    async overridePermissions(origin, permissions) {
+        const webPermissionToProtocol = new Map([
+            ['geolocation', 'geolocation'],
+            ['midi', 'midi'],
+            ['notifications', 'notifications'],
+            // TODO: push isn't a valid type?
+            // ['push', 'push'],
+            ['camera', 'videoCapture'],
+            ['microphone', 'audioCapture'],
+            ['background-sync', 'backgroundSync'],
+            ['ambient-light-sensor', 'sensors'],
+            ['accelerometer', 'sensors'],
+            ['gyroscope', 'sensors'],
+            ['magnetometer', 'sensors'],
+            ['accessibility-events', 'accessibilityEvents'],
+            ['clipboard-read', 'clipboardReadWrite'],
+            ['clipboard-write', 'clipboardReadWrite'],
+            ['payment-handler', 'paymentHandler'],
+            // chrome-specific permissions we have.
+            ['midi-sysex', 'midiSysex'],
+        ]);
+        permissions = permissions.map(permission => {
+            const protocolPermission = webPermissionToProtocol.get(permission);
+            if (!protocolPermission)
+                throw new Error('Unknown permission: ' + permission);
+            return protocolPermission;
+        });
+        await this._connection.send('Browser.grantPermissions', { origin, browserContextId: this._id || undefined, permissions });
+    }
+    async clearPermissionOverrides() {
+        await this._connection.send('Browser.resetPermissions', { browserContextId: this._id || undefined });
+    }
+    newPage() {
+        return this._browser._createPageInContext(this._id);
+    }
+    browser() {
+        return this._browser;
+    }
+    async close() {
+        helper_1.assert(this._id, 'Non-incognito profiles cannot be closed!');
+        await this._browser._disposeContext(this._id);
+    }
 }
-
-module.exports = {Browser, BrowserContext};
+exports.BrowserContext = BrowserContext;
diff --git a/node_modules/puppeteer/lib/BrowserFetcher.js b/node_modules/puppeteer/lib/BrowserFetcher.js
index aace922..3e5d91f 100644
--- a/node_modules/puppeteer/lib/BrowserFetcher.js
+++ b/node_modules/puppeteer/lib/BrowserFetcher.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,207 +14,216 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-const os = require('os');
-const fs = require('fs');
-const path = require('path');
-const util = require('util');
-const extract = require('extract-zip');
-const URL = require('url');
-const {helper, assert} = require('./helper');
-const removeRecursive = require('rimraf');
-// @ts-ignore
-const ProxyAgent = require('https-proxy-agent');
-// @ts-ignore
-const getProxyForUrl = require('proxy-from-env').getProxyForUrl;
-
-const DEFAULT_DOWNLOAD_HOST = 'https://storage.googleapis.com';
-
-const supportedPlatforms = ['mac', 'linux', 'win32', 'win64'];
+Object.defineProperty(exports, "__esModule", { value: true });
+const os = require("os");
+const fs = require("fs");
+const path = require("path");
+const util = require("util");
+const childProcess = require("child_process");
+const https = require("https");
+const http = require("http");
+const extract = require("extract-zip");
+const debug = require("debug");
+const removeRecursive = require("rimraf");
+const URL = require("url");
+const ProxyAgent = require("https-proxy-agent");
+const proxy_from_env_1 = require("proxy-from-env");
+const helper_1 = require("./helper");
+const debugFetcher = debug(`puppeteer:fetcher`);
 const downloadURLs = {
-  linux: '%s/chromium-browser-snapshots/Linux_x64/%d/%s.zip',
-  mac: '%s/chromium-browser-snapshots/Mac/%d/%s.zip',
-  win32: '%s/chromium-browser-snapshots/Win/%d/%s.zip',
-  win64: '%s/chromium-browser-snapshots/Win_x64/%d/%s.zip',
+    chrome: {
+        linux: '%s/chromium-browser-snapshots/Linux_x64/%d/%s.zip',
+        mac: '%s/chromium-browser-snapshots/Mac/%d/%s.zip',
+        win32: '%s/chromium-browser-snapshots/Win/%d/%s.zip',
+        win64: '%s/chromium-browser-snapshots/Win_x64/%d/%s.zip',
+    },
+    firefox: {
+        linux: '%s/firefox-%s.0a1.en-US.%s-x86_64.tar.bz2',
+        mac: '%s/firefox-%s.0a1.en-US.%s.dmg',
+        win32: '%s/firefox-%s.0a1.en-US.%s.zip',
+        win64: '%s/firefox-%s.0a1.en-US.%s.zip',
+    },
 };
-
-/**
- * @param {string} platform
- * @param {string} revision
- * @return {string}
- */
-function archiveName(platform, revision) {
-  if (platform === 'linux')
-    return 'chrome-linux';
-  if (platform === 'mac')
-    return 'chrome-mac';
-  if (platform === 'win32' || platform === 'win64') {
-    // Windows archive name changed at r591479.
-    return parseInt(revision, 10) > 591479 ? 'chrome-win' : 'chrome-win32';
-  }
-  return null;
+const browserConfig = {
+    chrome: {
+        host: 'https://storage.googleapis.com',
+        destination: '.local-chromium',
+    },
+    firefox: {
+        host: 'https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central',
+        destination: '.local-firefox',
+    }
+};
+function archiveName(product, platform, revision) {
+    if (product === 'chrome') {
+        if (platform === 'linux')
+            return 'chrome-linux';
+        if (platform === 'mac')
+            return 'chrome-mac';
+        if (platform === 'win32' || platform === 'win64') {
+            // Windows archive name changed at r591479.
+            return parseInt(revision, 10) > 591479 ? 'chrome-win' : 'chrome-win32';
+        }
+    }
+    else if (product === 'firefox') {
+        return platform;
+    }
 }
-
 /**
+ * @param {string} product
  * @param {string} platform
  * @param {string} host
  * @param {string} revision
  * @return {string}
  */
-function downloadURL(platform, host, revision) {
-  return util.format(downloadURLs[platform], host, revision, archiveName(platform, revision));
+function downloadURL(product, platform, host, revision) {
+    const url = util.format(downloadURLs[product][platform], host, revision, archiveName(product, platform, revision));
+    return url;
 }
-
-const readdirAsync = helper.promisify(fs.readdir.bind(fs));
-const mkdirAsync = helper.promisify(fs.mkdir.bind(fs));
-const unlinkAsync = helper.promisify(fs.unlink.bind(fs));
-const chmodAsync = helper.promisify(fs.chmod.bind(fs));
-
+const readdirAsync = helper_1.helper.promisify(fs.readdir.bind(fs));
+const mkdirAsync = helper_1.helper.promisify(fs.mkdir.bind(fs));
+const unlinkAsync = helper_1.helper.promisify(fs.unlink.bind(fs));
+const chmodAsync = helper_1.helper.promisify(fs.chmod.bind(fs));
 function existsAsync(filePath) {
-  let fulfill = null;
-  const promise = new Promise(x => fulfill = x);
-  fs.access(filePath, err => fulfill(!err));
-  return promise;
-}
-
-class BrowserFetcher {
-  /**
-   * @param {string} projectRoot
-   * @param {!BrowserFetcher.Options=} options
-   */
-  constructor(projectRoot, options = {}) {
-    this._downloadsFolder = options.path || path.join(projectRoot, '.local-chromium');
-    this._downloadHost = options.host || DEFAULT_DOWNLOAD_HOST;
-    this._platform = options.platform || '';
-    if (!this._platform) {
-      const platform = os.platform();
-      if (platform === 'darwin')
-        this._platform = 'mac';
-      else if (platform === 'linux')
-        this._platform = 'linux';
-      else if (platform === 'win32')
-        this._platform = os.arch() === 'x64' ? 'win64' : 'win32';
-      assert(this._platform, 'Unsupported platform: ' + os.platform());
-    }
-    assert(supportedPlatforms.includes(this._platform), 'Unsupported platform: ' + this._platform);
-  }
-
-  /**
-   * @return {string}
-   */
-  platform() {
-    return this._platform;
-  }
-
-  /**
-   * @param {string} revision
-   * @return {!Promise<boolean>}
-   */
-  canDownload(revision) {
-    const url = downloadURL(this._platform, this._downloadHost, revision);
-    let resolve;
-    const promise = new Promise(x => resolve = x);
-    const request = httpRequest(url, 'HEAD', response => {
-      resolve(response.statusCode === 200);
+    return new Promise(resolve => {
+        fs.access(filePath, err => resolve(!err));
     });
-    request.on('error', error => {
-      console.error(error);
-      resolve(false);
-    });
-    return promise;
-  }
-
-  /**
-   * @param {string} revision
-   * @param {?function(number, number):void} progressCallback
-   * @return {!Promise<!BrowserFetcher.RevisionInfo>}
-   */
-  async download(revision, progressCallback) {
-    const url = downloadURL(this._platform, this._downloadHost, revision);
-    const zipPath = path.join(this._downloadsFolder, `download-${this._platform}-${revision}.zip`);
-    const folderPath = this._getFolderPath(revision);
-    if (await existsAsync(folderPath))
-      return this.revisionInfo(revision);
-    if (!(await existsAsync(this._downloadsFolder)))
-      await mkdirAsync(this._downloadsFolder);
-    try {
-      await downloadFile(url, zipPath, progressCallback);
-      await extractZip(zipPath, folderPath);
-    } finally {
-      if (await existsAsync(zipPath))
-        await unlinkAsync(zipPath);
-    }
-    const revisionInfo = this.revisionInfo(revision);
-    if (revisionInfo)
-      await chmodAsync(revisionInfo.executablePath, 0o755);
-    return revisionInfo;
-  }
-
-  /**
-   * @return {!Promise<!Array<string>>}
-   */
-  async localRevisions() {
-    if (!await existsAsync(this._downloadsFolder))
-      return [];
-    const fileNames = await readdirAsync(this._downloadsFolder);
-    return fileNames.map(fileName => parseFolderPath(fileName)).filter(entry => entry && entry.platform === this._platform).map(entry => entry.revision);
-  }
-
-  /**
-   * @param {string} revision
-   */
-  async remove(revision) {
-    const folderPath = this._getFolderPath(revision);
-    assert(await existsAsync(folderPath), `Failed to remove: revision ${revision} is not downloaded`);
-    await new Promise(fulfill => removeRecursive(folderPath, fulfill));
-  }
-
-  /**
-   * @param {string} revision
-   * @return {!BrowserFetcher.RevisionInfo}
-   */
-  revisionInfo(revision) {
-    const folderPath = this._getFolderPath(revision);
-    let executablePath = '';
-    if (this._platform === 'mac')
-      executablePath = path.join(folderPath, archiveName(this._platform, revision), 'Chromium.app', 'Contents', 'MacOS', 'Chromium');
-    else if (this._platform === 'linux')
-      executablePath = path.join(folderPath, archiveName(this._platform, revision), 'chrome');
-    else if (this._platform === 'win32' || this._platform === 'win64')
-      executablePath = path.join(folderPath, archiveName(this._platform, revision), 'chrome.exe');
-    else
-      throw new Error('Unsupported platform: ' + this._platform);
-    const url = downloadURL(this._platform, this._downloadHost, revision);
-    const local = fs.existsSync(folderPath);
-    return {revision, executablePath, folderPath, local, url};
-  }
-
-  /**
-   * @param {string} revision
-   * @return {string}
-   */
-  _getFolderPath(revision) {
-    return path.join(this._downloadsFolder, this._platform + '-' + revision);
-  }
 }
-
-module.exports = BrowserFetcher;
-
 /**
- * @param {string} folderPath
- * @return {?{platform: string, revision: string}}
  */
-function parseFolderPath(folderPath) {
-  const name = path.basename(folderPath);
-  const splits = name.split('-');
-  if (splits.length !== 2)
-    return null;
-  const [platform, revision] = splits;
-  if (!supportedPlatforms.includes(platform))
-    return null;
-  return {platform, revision};
+class BrowserFetcher {
+    constructor(projectRoot, options = {}) {
+        this._product = (options.product || 'chrome').toLowerCase();
+        helper_1.assert(this._product === 'chrome' || this._product === 'firefox', `Unknown product: "${options.product}"`);
+        this._downloadsFolder = options.path || path.join(projectRoot, browserConfig[this._product].destination);
+        this._downloadHost = options.host || browserConfig[this._product].host;
+        this.setPlatform(options.platform);
+        helper_1.assert(downloadURLs[this._product][this._platform], 'Unsupported platform: ' + this._platform);
+    }
+    setPlatform(platformFromOptions) {
+        if (platformFromOptions) {
+            this._platform = platformFromOptions;
+            return;
+        }
+        const platform = os.platform();
+        if (platform === 'darwin')
+            this._platform = 'mac';
+        else if (platform === 'linux')
+            this._platform = 'linux';
+        else if (platform === 'win32')
+            this._platform = os.arch() === 'x64' ? 'win64' : 'win32';
+        else
+            helper_1.assert(this._platform, 'Unsupported platform: ' + os.platform());
+    }
+    platform() {
+        return this._platform;
+    }
+    product() {
+        return this._product;
+    }
+    host() {
+        return this._downloadHost;
+    }
+    canDownload(revision) {
+        const url = downloadURL(this._product, this._platform, this._downloadHost, revision);
+        return new Promise(resolve => {
+            const request = httpRequest(url, 'HEAD', response => {
+                resolve(response.statusCode === 200);
+            });
+            request.on('error', error => {
+                console.error(error);
+                resolve(false);
+            });
+        });
+    }
+    /**
+     * @param {string} revision
+     * @param {?function(number, number):void} progressCallback
+     * @return {!Promise<!BrowserFetcher.RevisionInfo>}
+     */
+    async download(revision, progressCallback) {
+        const url = downloadURL(this._product, this._platform, this._downloadHost, revision);
+        const fileName = url.split('/').pop();
+        const archivePath = path.join(this._downloadsFolder, fileName);
+        const outputPath = this._getFolderPath(revision);
+        if (await existsAsync(outputPath))
+            return this.revisionInfo(revision);
+        if (!(await existsAsync(this._downloadsFolder)))
+            await mkdirAsync(this._downloadsFolder);
+        try {
+            await downloadFile(url, archivePath, progressCallback);
+            await install(archivePath, outputPath);
+        }
+        finally {
+            if (await existsAsync(archivePath))
+                await unlinkAsync(archivePath);
+        }
+        const revisionInfo = this.revisionInfo(revision);
+        if (revisionInfo)
+            await chmodAsync(revisionInfo.executablePath, 0o755);
+        return revisionInfo;
+    }
+    async localRevisions() {
+        if (!await existsAsync(this._downloadsFolder))
+            return [];
+        const fileNames = await readdirAsync(this._downloadsFolder);
+        return fileNames.map(fileName => parseFolderPath(this._product, fileName)).filter(entry => entry && entry.platform === this._platform).map(entry => entry.revision);
+    }
+    async remove(revision) {
+        const folderPath = this._getFolderPath(revision);
+        helper_1.assert(await existsAsync(folderPath), `Failed to remove: revision ${revision} is not downloaded`);
+        await new Promise(fulfill => removeRecursive(folderPath, fulfill));
+    }
+    revisionInfo(revision) {
+        const folderPath = this._getFolderPath(revision);
+        let executablePath = '';
+        if (this._product === 'chrome') {
+            if (this._platform === 'mac')
+                executablePath = path.join(folderPath, archiveName(this._product, this._platform, revision), 'Chromium.app', 'Contents', 'MacOS', 'Chromium');
+            else if (this._platform === 'linux')
+                executablePath = path.join(folderPath, archiveName(this._product, this._platform, revision), 'chrome');
+            else if (this._platform === 'win32' || this._platform === 'win64')
+                executablePath = path.join(folderPath, archiveName(this._product, this._platform, revision), 'chrome.exe');
+            else
+                throw new Error('Unsupported platform: ' + this._platform);
+        }
+        else if (this._product === 'firefox') {
+            if (this._platform === 'mac')
+                executablePath = path.join(folderPath, 'Firefox Nightly.app', 'Contents', 'MacOS', 'firefox');
+            else if (this._platform === 'linux')
+                executablePath = path.join(folderPath, 'firefox', 'firefox');
+            else if (this._platform === 'win32' || this._platform === 'win64')
+                executablePath = path.join(folderPath, 'firefox', 'firefox.exe');
+            else
+                throw new Error('Unsupported platform: ' + this._platform);
+        }
+        else {
+            throw new Error('Unsupported product: ' + this._product);
+        }
+        const url = downloadURL(this._product, this._platform, this._downloadHost, revision);
+        const local = fs.existsSync(folderPath);
+        debugFetcher({ revision, executablePath, folderPath, local, url, product: this._product });
+        return { revision, executablePath, folderPath, local, url, product: this._product };
+    }
+    /**
+     * @param {string} revision
+     * @return {string}
+     */
+    _getFolderPath(revision) {
+        return path.join(this._downloadsFolder, this._platform + '-' + revision);
+    }
 }
-
+exports.BrowserFetcher = BrowserFetcher;
+function parseFolderPath(product, folderPath) {
+    const name = path.basename(folderPath);
+    const splits = name.split('-');
+    if (splits.length !== 2)
+        return null;
+    const [platform, revision] = splits;
+    if (!downloadURLs[product][platform])
+        return null;
+    return { product, platform, revision };
+}
 /**
  * @param {string} url
  * @param {string} destinationPath
@@ -221,100 +231,184 @@
  * @return {!Promise}
  */
 function downloadFile(url, destinationPath, progressCallback) {
-  let fulfill, reject;
-  let downloadedBytes = 0;
-  let totalBytes = 0;
-
-  const promise = new Promise((x, y) => { fulfill = x; reject = y; });
-
-  const request = httpRequest(url, 'GET', response => {
-    if (response.statusCode !== 200) {
-      const error = new Error(`Download failed: server returned code ${response.statusCode}. URL: ${url}`);
-      // consume response data to free up memory
-      response.resume();
-      reject(error);
-      return;
+    debugFetcher(`Downloading binary from ${url}`);
+    let fulfill, reject;
+    let downloadedBytes = 0;
+    let totalBytes = 0;
+    const promise = new Promise((x, y) => { fulfill = x; reject = y; });
+    const request = httpRequest(url, 'GET', response => {
+        if (response.statusCode !== 200) {
+            const error = new Error(`Download failed: server returned code ${response.statusCode}. URL: ${url}`);
+            // consume response data to free up memory
+            response.resume();
+            reject(error);
+            return;
+        }
+        const file = fs.createWriteStream(destinationPath);
+        file.on('finish', () => fulfill());
+        file.on('error', error => reject(error));
+        response.pipe(file);
+        totalBytes = parseInt(/** @type {string} */ (response.headers['content-length']), 10);
+        if (progressCallback)
+            response.on('data', onData);
+    });
+    request.on('error', error => reject(error));
+    return promise;
+    function onData(chunk) {
+        downloadedBytes += chunk.length;
+        progressCallback(downloadedBytes, totalBytes);
     }
-    const file = fs.createWriteStream(destinationPath);
-    file.on('finish', () => fulfill());
-    file.on('error', error => reject(error));
-    response.pipe(file);
-    totalBytes = parseInt(/** @type {string} */ (response.headers['content-length']), 10);
-    if (progressCallback)
-      response.on('data', onData);
-  });
-  request.on('error', error => reject(error));
-  return promise;
-
-  function onData(chunk) {
-    downloadedBytes += chunk.length;
-    progressCallback(downloadedBytes, totalBytes);
-  }
 }
-
+function install(archivePath, folderPath) {
+    debugFetcher(`Installing ${archivePath} to ${folderPath}`);
+    if (archivePath.endsWith('.zip'))
+        return extractZip(archivePath, folderPath);
+    else if (archivePath.endsWith('.tar.bz2'))
+        return extractTar(archivePath, folderPath);
+    else if (archivePath.endsWith('.dmg'))
+        return mkdirAsync(folderPath).then(() => installDMG(archivePath, folderPath));
+    else
+        throw new Error(`Unsupported archive format: ${archivePath}`);
+}
+async function extractZip(zipPath, folderPath) {
+    const nodeVersion = process.version;
+    /* There is currently a bug with extract-zip and Node v14.0.0 that
+     * causes extractZip to silently fail:
+     * https://github.com/puppeteer/puppeteer/issues/5719
+     *
+     * Rather than silenty fail if the user is on Node 14 we instead
+     * detect that and throw an error directing the user to that bug. The
+     * rejection message below is surfaced to the user in the command
+     * line.
+     *
+     * The issue seems to be in streams never resolving so we wrap the
+     * call in a timeout and give it 10s to resolve before deciding on
+     * an error.
+     *
+     * If the user is on Node < 14 we maintain the behaviour we had before
+     * this patch.
+     */
+    if (nodeVersion.startsWith('v14.')) {
+        let timeoutReject;
+        const timeoutPromise = new Promise((resolve, reject) => { timeoutReject = reject; });
+        const timeoutToken = setTimeout(() => {
+            const error = new Error(`Puppeteer currently does not work on Node v14 due to an upstream bug. Please see: https://github.com/puppeteer/puppeteer/issues/5719 for details.`);
+            timeoutReject(error);
+        }, 10 * 1000);
+        await Promise.race([
+            extract(zipPath, { dir: folderPath }),
+            timeoutPromise
+        ]);
+        clearTimeout(timeoutToken);
+    }
+    else {
+        try {
+            await extract(zipPath, { dir: folderPath });
+        }
+        catch (error) {
+            return error;
+        }
+    }
+}
 /**
- * @param {string} zipPath
+ * @param {string} tarPath
  * @param {string} folderPath
  * @return {!Promise<?Error>}
  */
-function extractZip(zipPath, folderPath) {
-  return new Promise((fulfill, reject) => extract(zipPath, {dir: folderPath}, err => {
-    if (err)
-      reject(err);
-    else
-      fulfill();
-  }));
+function extractTar(tarPath, folderPath) {
+    // eslint-disable-next-line @typescript-eslint/no-var-requires
+    const tar = require('tar-fs');
+    // eslint-disable-next-line @typescript-eslint/no-var-requires
+    const bzip = require('unbzip2-stream');
+    return new Promise((fulfill, reject) => {
+        const tarStream = tar.extract(folderPath);
+        tarStream.on('error', reject);
+        tarStream.on('finish', fulfill);
+        const readStream = fs.createReadStream(tarPath);
+        readStream.on('data', () => { process.stdout.write('\rExtracting...'); });
+        readStream.pipe(bzip()).pipe(tarStream);
+    });
 }
-
-function httpRequest(url, method, response) {
-  /** @type {Object} */
-  let options = URL.parse(url);
-  options.method = method;
-
-  const proxyURL = getProxyForUrl(url);
-  if (proxyURL) {
-    if (url.startsWith('http:')) {
-      const proxy = URL.parse(proxyURL);
-      options = {
-        path: options.href,
-        host: proxy.hostname,
-        port: proxy.port,
-      };
-    } else {
-      /** @type {Object} */
-      const parsedProxyURL = URL.parse(proxyURL);
-      parsedProxyURL.secureProxy = parsedProxyURL.protocol === 'https:';
-
-      options.agent = new ProxyAgent(parsedProxyURL);
-      options.rejectUnauthorized = false;
+/**
+ * Install *.app directory from dmg file
+ *
+ * @param {string} dmgPath
+ * @param {string} folderPath
+ * @return {!Promise<?Error>}
+ */
+function installDMG(dmgPath, folderPath) {
+    let mountPath;
+    function mountAndCopy(fulfill, reject) {
+        const mountCommand = `hdiutil attach -nobrowse -noautoopen "${dmgPath}"`;
+        childProcess.exec(mountCommand, (err, stdout) => {
+            if (err)
+                return reject(err);
+            const volumes = stdout.match(/\/Volumes\/(.*)/m);
+            if (!volumes)
+                return reject(new Error(`Could not find volume path in ${stdout}`));
+            mountPath = volumes[0];
+            readdirAsync(mountPath).then(fileNames => {
+                const appName = fileNames.filter(item => typeof item === 'string' && item.endsWith('.app'))[0];
+                if (!appName)
+                    return reject(new Error(`Cannot find app in ${mountPath}`));
+                const copyPath = path.join(mountPath, appName);
+                debugFetcher(`Copying ${copyPath} to ${folderPath}`);
+                childProcess.exec(`cp -R "${copyPath}" "${folderPath}"`, err => {
+                    if (err)
+                        reject(err);
+                    else
+                        fulfill();
+                });
+            }).catch(reject);
+        });
     }
-  }
-
-  const requestCallback = res => {
-    if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location)
-      httpRequest(res.headers.location, method, response);
-    else
-      response(res);
-  };
-  const request = options.protocol === 'https:' ?
-    require('https').request(options, requestCallback) :
-    require('http').request(options, requestCallback);
-  request.end();
-  return request;
+    function unmount() {
+        if (!mountPath)
+            return;
+        const unmountCommand = `hdiutil detach "${mountPath}" -quiet`;
+        debugFetcher(`Unmounting ${mountPath}`);
+        childProcess.exec(unmountCommand, err => {
+            if (err)
+                console.error(`Error unmounting dmg: ${err}`);
+        });
+    }
+    return new Promise(mountAndCopy).catch(error => { console.error(error); }).finally(unmount);
 }
-
-/**
- * @typedef {Object} BrowserFetcher.Options
- * @property {string=} platform
- * @property {string=} path
- * @property {string=} host
- */
-
-/**
- * @typedef {Object} BrowserFetcher.RevisionInfo
- * @property {string} folderPath
- * @property {string} executablePath
- * @property {string} url
- * @property {boolean} local
- * @property {string} revision
- */
+function httpRequest(url, method, response) {
+    const urlParsed = URL.parse(url);
+    let options = {
+        ...urlParsed,
+        method,
+    };
+    const proxyURL = proxy_from_env_1.getProxyForUrl(url);
+    if (proxyURL) {
+        if (url.startsWith('http:')) {
+            const proxy = URL.parse(proxyURL);
+            options = {
+                path: options.href,
+                host: proxy.hostname,
+                port: proxy.port,
+            };
+        }
+        else {
+            const parsedProxyURL = URL.parse(proxyURL);
+            const proxyOptions = {
+                ...parsedProxyURL,
+                secureProxy: parsedProxyURL.protocol === 'https:',
+            };
+            options.agent = new ProxyAgent(proxyOptions);
+            options.rejectUnauthorized = false;
+        }
+    }
+    const requestCallback = (res) => {
+        if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location)
+            httpRequest(res.headers.location, method, response);
+        else
+            response(res);
+    };
+    const request = options.protocol === 'https:' ?
+        https.request(options, requestCallback) :
+        http.request(options, requestCallback);
+    request.end();
+    return request;
+}
diff --git a/node_modules/puppeteer/lib/Connection.js b/node_modules/puppeteer/lib/Connection.js
index bd9be3d..467c7b1 100644
--- a/node_modules/puppeteer/lib/Connection.js
+++ b/node_modules/puppeteer/lib/Connection.js
@@ -1,3 +1,5 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,209 +15,167 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-const {assert} = require('./helper');
-const {Events} = require('./Events');
-const debugProtocol = require('debug')('puppeteer:protocol');
-const EventEmitter = require('events');
-
+const helper_1 = require("./helper");
+const Events_1 = require("./Events");
+const debug = require("debug");
+const debugProtocol = debug('puppeteer:protocol');
+const EventEmitter = require("events");
 class Connection extends EventEmitter {
-  /**
-   * @param {string} url
-   * @param {!Puppeteer.ConnectionTransport} transport
-   * @param {number=} delay
-   */
-  constructor(url, transport, delay = 0) {
-    super();
-    this._url = url;
-    this._lastId = 0;
-    /** @type {!Map<number, {resolve: function, reject: function, error: !Error, method: string}>}*/
-    this._callbacks = new Map();
-    this._delay = delay;
-
-    this._transport = transport;
-    this._transport.onmessage = this._onMessage.bind(this);
-    this._transport.onclose = this._onClose.bind(this);
-    /** @type {!Map<string, !CDPSession>}*/
-    this._sessions = new Map();
-    this._closed = false;
-  }
-
-  /**
-   * @param {!CDPSession} session
-   * @return {!Connection}
-   */
-  static fromSession(session) {
-    return session._connection;
-  }
-
-  /**
-   * @param {string} sessionId
-   * @return {?CDPSession}
-   */
-  session(sessionId) {
-    return this._sessions.get(sessionId) || null;
-  }
-
-  /**
-   * @return {string}
-   */
-  url() {
-    return this._url;
-  }
-
-  /**
-   * @param {string} method
-   * @param {!Object=} params
-   * @return {!Promise<?Object>}
-   */
-  send(method, params = {}) {
-    const id = this._rawSend({method, params});
-    return new Promise((resolve, reject) => {
-      this._callbacks.set(id, {resolve, reject, error: new Error(), method});
-    });
-  }
-
-  /**
-   * @param {*} message
-   * @return {number}
-   */
-  _rawSend(message) {
-    const id = ++this._lastId;
-    message = JSON.stringify(Object.assign({}, message, {id}));
-    debugProtocol('SEND â–º ' + message);
-    this._transport.send(message);
-    return id;
-  }
-
-  /**
-   * @param {string} message
-   */
-  async _onMessage(message) {
-    if (this._delay)
-      await new Promise(f => setTimeout(f, this._delay));
-    debugProtocol('â—€ RECV ' + message);
-    const object = JSON.parse(message);
-    if (object.method === 'Target.attachedToTarget') {
-      const sessionId = object.params.sessionId;
-      const session = new CDPSession(this, object.params.targetInfo.type, sessionId);
-      this._sessions.set(sessionId, session);
-    } else if (object.method === 'Target.detachedFromTarget') {
-      const session = this._sessions.get(object.params.sessionId);
-      if (session) {
-        session._onClosed();
-        this._sessions.delete(object.params.sessionId);
-      }
+    constructor(url, transport, delay = 0) {
+        super();
+        this._lastId = 0;
+        this._sessions = new Map();
+        this._closed = false;
+        this._callbacks = new Map();
+        this._url = url;
+        this._delay = delay;
+        this._transport = transport;
+        this._transport.onmessage = this._onMessage.bind(this);
+        this._transport.onclose = this._onClose.bind(this);
     }
-    if (object.sessionId) {
-      const session = this._sessions.get(object.sessionId);
-      if (session)
-        session._onMessage(object);
-    } else if (object.id) {
-      const callback = this._callbacks.get(object.id);
-      // Callbacks could be all rejected if someone has called `.dispose()`.
-      if (callback) {
-        this._callbacks.delete(object.id);
-        if (object.error)
-          callback.reject(createProtocolError(callback.error, callback.method, object));
-        else
-          callback.resolve(object.result);
-      }
-    } else {
-      this.emit(object.method, object.params);
+    static fromSession(session) {
+        return session._connection;
     }
-  }
-
-  _onClose() {
-    if (this._closed)
-      return;
-    this._closed = true;
-    this._transport.onmessage = null;
-    this._transport.onclose = null;
-    for (const callback of this._callbacks.values())
-      callback.reject(rewriteError(callback.error, `Protocol error (${callback.method}): Target closed.`));
-    this._callbacks.clear();
-    for (const session of this._sessions.values())
-      session._onClosed();
-    this._sessions.clear();
-    this.emit(Events.Connection.Disconnected);
-  }
-
-  dispose() {
-    this._onClose();
-    this._transport.close();
-  }
-
-  /**
-   * @param {Protocol.Target.TargetInfo} targetInfo
-   * @return {!Promise<!CDPSession>}
-   */
-  async createSession(targetInfo) {
-    const {sessionId} = await this.send('Target.attachToTarget', {targetId: targetInfo.targetId, flatten: true});
-    return this._sessions.get(sessionId);
-  }
+    /**
+     * @param {string} sessionId
+     * @return {?CDPSession}
+     */
+    session(sessionId) {
+        return this._sessions.get(sessionId) || null;
+    }
+    url() {
+        return this._url;
+    }
+    send(method, params) {
+        const id = this._rawSend({ method, params });
+        return new Promise((resolve, reject) => {
+            this._callbacks.set(id, { resolve, reject, error: new Error(), method });
+        });
+    }
+    _rawSend(message) {
+        const id = ++this._lastId;
+        message = JSON.stringify(Object.assign({}, message, { id }));
+        debugProtocol('SEND â–º ' + message);
+        this._transport.send(message);
+        return id;
+    }
+    async _onMessage(message) {
+        if (this._delay)
+            await new Promise(f => setTimeout(f, this._delay));
+        debugProtocol('â—€ RECV ' + message);
+        const object = JSON.parse(message);
+        if (object.method === 'Target.attachedToTarget') {
+            const sessionId = object.params.sessionId;
+            const session = new CDPSession(this, object.params.targetInfo.type, sessionId);
+            this._sessions.set(sessionId, session);
+        }
+        else if (object.method === 'Target.detachedFromTarget') {
+            const session = this._sessions.get(object.params.sessionId);
+            if (session) {
+                session._onClosed();
+                this._sessions.delete(object.params.sessionId);
+            }
+        }
+        if (object.sessionId) {
+            const session = this._sessions.get(object.sessionId);
+            if (session)
+                session._onMessage(object);
+        }
+        else if (object.id) {
+            const callback = this._callbacks.get(object.id);
+            // Callbacks could be all rejected if someone has called `.dispose()`.
+            if (callback) {
+                this._callbacks.delete(object.id);
+                if (object.error)
+                    callback.reject(createProtocolError(callback.error, callback.method, object));
+                else
+                    callback.resolve(object.result);
+            }
+        }
+        else {
+            this.emit(object.method, object.params);
+        }
+    }
+    _onClose() {
+        if (this._closed)
+            return;
+        this._closed = true;
+        this._transport.onmessage = null;
+        this._transport.onclose = null;
+        for (const callback of this._callbacks.values())
+            callback.reject(rewriteError(callback.error, `Protocol error (${callback.method}): Target closed.`));
+        this._callbacks.clear();
+        for (const session of this._sessions.values())
+            session._onClosed();
+        this._sessions.clear();
+        this.emit(Events_1.Events.Connection.Disconnected);
+    }
+    dispose() {
+        this._onClose();
+        this._transport.close();
+    }
+    /**
+     * @param {Protocol.Target.TargetInfo} targetInfo
+     * @return {!Promise<!CDPSession>}
+     */
+    async createSession(targetInfo) {
+        const { sessionId } = await this.send('Target.attachToTarget', { targetId: targetInfo.targetId, flatten: true });
+        return this._sessions.get(sessionId);
+    }
 }
-
+exports.Connection = Connection;
 class CDPSession extends EventEmitter {
-  /**
-   * @param {!Connection} connection
-   * @param {string} targetType
-   * @param {string} sessionId
-   */
-  constructor(connection, targetType, sessionId) {
-    super();
-    /** @type {!Map<number, {resolve: function, reject: function, error: !Error, method: string}>}*/
-    this._callbacks = new Map();
-    this._connection = connection;
-    this._targetType = targetType;
-    this._sessionId = sessionId;
-  }
-
-  /**
-   * @param {string} method
-   * @param {!Object=} params
-   * @return {!Promise<?Object>}
-   */
-  send(method, params = {}) {
-    if (!this._connection)
-      return Promise.reject(new Error(`Protocol error (${method}): Session closed. Most likely the ${this._targetType} has been closed.`));
-    const id = this._connection._rawSend({sessionId: this._sessionId, method, params});
-    return new Promise((resolve, reject) => {
-      this._callbacks.set(id, {resolve, reject, error: new Error(), method});
-    });
-  }
-
-  /**
-   * @param {{id?: number, method: string, params: Object, error: {message: string, data: any}, result?: *}} object
-   */
-  _onMessage(object) {
-    if (object.id && this._callbacks.has(object.id)) {
-      const callback = this._callbacks.get(object.id);
-      this._callbacks.delete(object.id);
-      if (object.error)
-        callback.reject(createProtocolError(callback.error, callback.method, object));
-      else
-        callback.resolve(object.result);
-    } else {
-      assert(!object.id);
-      this.emit(object.method, object.params);
+    constructor(connection, targetType, sessionId) {
+        super();
+        this._callbacks = new Map();
+        this._connection = connection;
+        this._targetType = targetType;
+        this._sessionId = sessionId;
     }
-  }
-
-  async detach() {
-    if (!this._connection)
-      throw new Error(`Session already detached. Most likely the ${this._targetType} has been closed.`);
-    await this._connection.send('Target.detachFromTarget',  {sessionId: this._sessionId});
-  }
-
-  _onClosed() {
-    for (const callback of this._callbacks.values())
-      callback.reject(rewriteError(callback.error, `Protocol error (${callback.method}): Target closed.`));
-    this._callbacks.clear();
-    this._connection = null;
-    this.emit(Events.CDPSession.Disconnected);
-  }
+    send(method, params) {
+        if (!this._connection)
+            return Promise.reject(new Error(`Protocol error (${method}): Session closed. Most likely the ${this._targetType} has been closed.`));
+        const id = this._connection._rawSend({
+            sessionId: this._sessionId,
+            method,
+            /* TODO(jacktfranklin@): once this Firefox bug is solved
+             * we no longer need the `|| {}` check
+             * https://bugzilla.mozilla.org/show_bug.cgi?id=1631570
+             */
+            params: params || {}
+        });
+        return new Promise((resolve, reject) => {
+            this._callbacks.set(id, { resolve, reject, error: new Error(), method });
+        });
+    }
+    _onMessage(object) {
+        if (object.id && this._callbacks.has(object.id)) {
+            const callback = this._callbacks.get(object.id);
+            this._callbacks.delete(object.id);
+            if (object.error)
+                callback.reject(createProtocolError(callback.error, callback.method, object));
+            else
+                callback.resolve(object.result);
+        }
+        else {
+            helper_1.assert(!object.id);
+            this.emit(object.method, object.params);
+        }
+    }
+    async detach() {
+        if (!this._connection)
+            throw new Error(`Session already detached. Most likely the ${this._targetType} has been closed.`);
+        await this._connection.send('Target.detachFromTarget', { sessionId: this._sessionId });
+    }
+    _onClosed() {
+        for (const callback of this._callbacks.values())
+            callback.reject(rewriteError(callback.error, `Protocol error (${callback.method}): Target closed.`));
+        this._callbacks.clear();
+        this._connection = null;
+        this.emit(Events_1.Events.CDPSession.Disconnected);
+    }
 }
-
+exports.CDPSession = CDPSession;
 /**
  * @param {!Error} error
  * @param {string} method
@@ -223,20 +183,17 @@
  * @return {!Error}
  */
 function createProtocolError(error, method, object) {
-  let message = `Protocol error (${method}): ${object.error.message}`;
-  if ('data' in object.error)
-    message += ` ${object.error.data}`;
-  return rewriteError(error, message);
+    let message = `Protocol error (${method}): ${object.error.message}`;
+    if ('data' in object.error)
+        message += ` ${object.error.data}`;
+    return rewriteError(error, message);
 }
-
 /**
  * @param {!Error} error
  * @param {string} message
  * @return {!Error}
  */
 function rewriteError(error, message) {
-  error.message = message;
-  return error;
+    error.message = message;
+    return error;
 }
-
-module.exports = {Connection, CDPSession};
diff --git a/node_modules/puppeteer/lib/ConnectionTransport.js b/node_modules/puppeteer/lib/ConnectionTransport.js
new file mode 100644
index 0000000..9f20b2d
--- /dev/null
+++ b/node_modules/puppeteer/lib/ConnectionTransport.js
@@ -0,0 +1,17 @@
+"use strict";
+/**
+ * Copyright 2020 Google Inc. All rights reserved.
+ *
+ * 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.
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/node_modules/puppeteer/lib/Coverage.js b/node_modules/puppeteer/lib/Coverage.js
index 5f88c10..f498a55 100644
--- a/node_modules/puppeteer/lib/Coverage.js
+++ b/node_modules/puppeteer/lib/Coverage.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,301 +14,229 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-const {helper, debugError, assert} = require('./helper');
-
-const {EVALUATION_SCRIPT_URL} = require('./ExecutionContext');
-
-/**
- * @typedef {Object} CoverageEntry
- * @property {string} url
- * @property {string} text
- * @property {!Array<!{start: number, end: number}>} ranges
- */
-
+Object.defineProperty(exports, "__esModule", { value: true });
+const helper_1 = require("./helper");
+const ExecutionContext_1 = require("./ExecutionContext");
 class Coverage {
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   */
-  constructor(client) {
-    this._jsCoverage = new JSCoverage(client);
-    this._cssCoverage = new CSSCoverage(client);
-  }
-
-  /**
-   * @param {!{resetOnNavigation?: boolean, reportAnonymousScripts?: boolean}} options
-   */
-  async startJSCoverage(options) {
-    return await this._jsCoverage.start(options);
-  }
-
-  /**
-   * @return {!Promise<!Array<!CoverageEntry>>}
-   */
-  async stopJSCoverage() {
-    return await this._jsCoverage.stop();
-  }
-
-  /**
-   * @param {{resetOnNavigation?: boolean}=} options
-   */
-  async startCSSCoverage(options) {
-    return await this._cssCoverage.start(options);
-  }
-
-  /**
-   * @return {!Promise<!Array<!CoverageEntry>>}
-   */
-  async stopCSSCoverage() {
-    return await this._cssCoverage.stop();
-  }
+    constructor(client) {
+        this._jsCoverage = new JSCoverage(client);
+        this._cssCoverage = new CSSCoverage(client);
+    }
+    async startJSCoverage(options) {
+        return await this._jsCoverage.start(options);
+    }
+    async stopJSCoverage() {
+        return await this._jsCoverage.stop();
+    }
+    async startCSSCoverage(options) {
+        return await this._cssCoverage.start(options);
+    }
+    async stopCSSCoverage() {
+        return await this._cssCoverage.stop();
+    }
 }
-
-module.exports = {Coverage};
-
+exports.Coverage = Coverage;
 class JSCoverage {
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   */
-  constructor(client) {
-    this._client = client;
-    this._enabled = false;
-    this._scriptURLs = new Map();
-    this._scriptSources = new Map();
-    this._eventListeners = [];
-    this._resetOnNavigation = false;
-  }
-
-  /**
-   * @param {!{resetOnNavigation?: boolean, reportAnonymousScripts?: boolean}} options
-   */
-  async start(options = {}) {
-    assert(!this._enabled, 'JSCoverage is already enabled');
-    const {
-      resetOnNavigation = true,
-      reportAnonymousScripts = false
-    } = options;
-    this._resetOnNavigation = resetOnNavigation;
-    this._reportAnonymousScripts = reportAnonymousScripts;
-    this._enabled = true;
-    this._scriptURLs.clear();
-    this._scriptSources.clear();
-    this._eventListeners = [
-      helper.addEventListener(this._client, 'Debugger.scriptParsed', this._onScriptParsed.bind(this)),
-      helper.addEventListener(this._client, 'Runtime.executionContextsCleared', this._onExecutionContextsCleared.bind(this)),
-    ];
-    await Promise.all([
-      this._client.send('Profiler.enable'),
-      this._client.send('Profiler.startPreciseCoverage', {callCount: false, detailed: true}),
-      this._client.send('Debugger.enable'),
-      this._client.send('Debugger.setSkipAllPauses', {skip: true})
-    ]);
-  }
-
-  _onExecutionContextsCleared() {
-    if (!this._resetOnNavigation)
-      return;
-    this._scriptURLs.clear();
-    this._scriptSources.clear();
-  }
-
-  /**
-   * @param {!Protocol.Debugger.scriptParsedPayload} event
-   */
-  async _onScriptParsed(event) {
-    // Ignore puppeteer-injected scripts
-    if (event.url === EVALUATION_SCRIPT_URL)
-      return;
-    // Ignore other anonymous scripts unless the reportAnonymousScripts option is true.
-    if (!event.url && !this._reportAnonymousScripts)
-      return;
-    try {
-      const response = await this._client.send('Debugger.getScriptSource', {scriptId: event.scriptId});
-      this._scriptURLs.set(event.scriptId, event.url);
-      this._scriptSources.set(event.scriptId, response.scriptSource);
-    } catch (e) {
-      // This might happen if the page has already navigated away.
-      debugError(e);
+    constructor(client) {
+        this._enabled = false;
+        this._scriptURLs = new Map();
+        this._scriptSources = new Map();
+        this._eventListeners = [];
+        this._resetOnNavigation = false;
+        this._reportAnonymousScripts = false;
+        this._client = client;
     }
-  }
-
-  /**
-   * @return {!Promise<!Array<!CoverageEntry>>}
-   */
-  async stop() {
-    assert(this._enabled, 'JSCoverage is not enabled');
-    this._enabled = false;
-    const [profileResponse] = await Promise.all([
-      this._client.send('Profiler.takePreciseCoverage'),
-      this._client.send('Profiler.stopPreciseCoverage'),
-      this._client.send('Profiler.disable'),
-      this._client.send('Debugger.disable'),
-    ]);
-    helper.removeEventListeners(this._eventListeners);
-
-    const coverage = [];
-    for (const entry of profileResponse.result) {
-      let url = this._scriptURLs.get(entry.scriptId);
-      if (!url && this._reportAnonymousScripts)
-        url = 'debugger://VM' + entry.scriptId;
-      const text = this._scriptSources.get(entry.scriptId);
-      if (text === undefined || url === undefined)
-        continue;
-      const flattenRanges = [];
-      for (const func of entry.functions)
-        flattenRanges.push(...func.ranges);
-      const ranges = convertToDisjointRanges(flattenRanges);
-      coverage.push({url, ranges, text});
+    async start(options = {}) {
+        helper_1.assert(!this._enabled, 'JSCoverage is already enabled');
+        const { resetOnNavigation = true, reportAnonymousScripts = false } = options;
+        this._resetOnNavigation = resetOnNavigation;
+        this._reportAnonymousScripts = reportAnonymousScripts;
+        this._enabled = true;
+        this._scriptURLs.clear();
+        this._scriptSources.clear();
+        this._eventListeners = [
+            helper_1.helper.addEventListener(this._client, 'Debugger.scriptParsed', this._onScriptParsed.bind(this)),
+            helper_1.helper.addEventListener(this._client, 'Runtime.executionContextsCleared', this._onExecutionContextsCleared.bind(this)),
+        ];
+        await Promise.all([
+            this._client.send('Profiler.enable'),
+            this._client.send('Profiler.startPreciseCoverage', { callCount: false, detailed: true }),
+            this._client.send('Debugger.enable'),
+            this._client.send('Debugger.setSkipAllPauses', { skip: true })
+        ]);
     }
-    return coverage;
-  }
+    _onExecutionContextsCleared() {
+        if (!this._resetOnNavigation)
+            return;
+        this._scriptURLs.clear();
+        this._scriptSources.clear();
+    }
+    async _onScriptParsed(event) {
+        // Ignore puppeteer-injected scripts
+        if (event.url === ExecutionContext_1.EVALUATION_SCRIPT_URL)
+            return;
+        // Ignore other anonymous scripts unless the reportAnonymousScripts option is true.
+        if (!event.url && !this._reportAnonymousScripts)
+            return;
+        try {
+            const response = await this._client.send('Debugger.getScriptSource', { scriptId: event.scriptId });
+            this._scriptURLs.set(event.scriptId, event.url);
+            this._scriptSources.set(event.scriptId, response.scriptSource);
+        }
+        catch (error) {
+            // This might happen if the page has already navigated away.
+            helper_1.debugError(error);
+        }
+    }
+    async stop() {
+        helper_1.assert(this._enabled, 'JSCoverage is not enabled');
+        this._enabled = false;
+        const result = await Promise.all([
+            this._client.send('Profiler.takePreciseCoverage'),
+            this._client.send('Profiler.stopPreciseCoverage'),
+            this._client.send('Profiler.disable'),
+            this._client.send('Debugger.disable'),
+        ]);
+        helper_1.helper.removeEventListeners(this._eventListeners);
+        const coverage = [];
+        const profileResponse = result[0];
+        for (const entry of profileResponse.result) {
+            let url = this._scriptURLs.get(entry.scriptId);
+            if (!url && this._reportAnonymousScripts)
+                url = 'debugger://VM' + entry.scriptId;
+            const text = this._scriptSources.get(entry.scriptId);
+            if (text === undefined || url === undefined)
+                continue;
+            const flattenRanges = [];
+            for (const func of entry.functions)
+                flattenRanges.push(...func.ranges);
+            const ranges = convertToDisjointRanges(flattenRanges);
+            coverage.push({ url, ranges, text });
+        }
+        return coverage;
+    }
 }
-
 class CSSCoverage {
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   */
-  constructor(client) {
-    this._client = client;
-    this._enabled = false;
-    this._stylesheetURLs = new Map();
-    this._stylesheetSources = new Map();
-    this._eventListeners = [];
-    this._resetOnNavigation = false;
-  }
-
-  /**
-   * @param {{resetOnNavigation?: boolean}=} options
-   */
-  async start(options = {}) {
-    assert(!this._enabled, 'CSSCoverage is already enabled');
-    const {resetOnNavigation = true} = options;
-    this._resetOnNavigation = resetOnNavigation;
-    this._enabled = true;
-    this._stylesheetURLs.clear();
-    this._stylesheetSources.clear();
-    this._eventListeners = [
-      helper.addEventListener(this._client, 'CSS.styleSheetAdded', this._onStyleSheet.bind(this)),
-      helper.addEventListener(this._client, 'Runtime.executionContextsCleared', this._onExecutionContextsCleared.bind(this)),
-    ];
-    await Promise.all([
-      this._client.send('DOM.enable'),
-      this._client.send('CSS.enable'),
-      this._client.send('CSS.startRuleUsageTracking'),
-    ]);
-  }
-
-  _onExecutionContextsCleared() {
-    if (!this._resetOnNavigation)
-      return;
-    this._stylesheetURLs.clear();
-    this._stylesheetSources.clear();
-  }
-
-  /**
-   * @param {!Protocol.CSS.styleSheetAddedPayload} event
-   */
-  async _onStyleSheet(event) {
-    const header = event.header;
-    // Ignore anonymous scripts
-    if (!header.sourceURL)
-      return;
-    try {
-      const response = await this._client.send('CSS.getStyleSheetText', {styleSheetId: header.styleSheetId});
-      this._stylesheetURLs.set(header.styleSheetId, header.sourceURL);
-      this._stylesheetSources.set(header.styleSheetId, response.text);
-    } catch (e) {
-      // This might happen if the page has already navigated away.
-      debugError(e);
+    constructor(client) {
+        this._enabled = false;
+        this._stylesheetURLs = new Map();
+        this._stylesheetSources = new Map();
+        this._eventListeners = [];
+        this._resetOnNavigation = false;
+        this._reportAnonymousScripts = false;
+        this._client = client;
     }
-  }
-
-  /**
-   * @return {!Promise<!Array<!CoverageEntry>>}
-   */
-  async stop() {
-    assert(this._enabled, 'CSSCoverage is not enabled');
-    this._enabled = false;
-    const ruleTrackingResponse = await this._client.send('CSS.stopRuleUsageTracking');
-    await Promise.all([
-      this._client.send('CSS.disable'),
-      this._client.send('DOM.disable'),
-    ]);
-    helper.removeEventListeners(this._eventListeners);
-
-    // aggregate by styleSheetId
-    const styleSheetIdToCoverage = new Map();
-    for (const entry of ruleTrackingResponse.ruleUsage) {
-      let ranges = styleSheetIdToCoverage.get(entry.styleSheetId);
-      if (!ranges) {
-        ranges = [];
-        styleSheetIdToCoverage.set(entry.styleSheetId, ranges);
-      }
-      ranges.push({
-        startOffset: entry.startOffset,
-        endOffset: entry.endOffset,
-        count: entry.used ? 1 : 0,
-      });
+    async start(options = {}) {
+        helper_1.assert(!this._enabled, 'CSSCoverage is already enabled');
+        const { resetOnNavigation = true } = options;
+        this._resetOnNavigation = resetOnNavigation;
+        this._enabled = true;
+        this._stylesheetURLs.clear();
+        this._stylesheetSources.clear();
+        this._eventListeners = [
+            helper_1.helper.addEventListener(this._client, 'CSS.styleSheetAdded', this._onStyleSheet.bind(this)),
+            helper_1.helper.addEventListener(this._client, 'Runtime.executionContextsCleared', this._onExecutionContextsCleared.bind(this)),
+        ];
+        await Promise.all([
+            this._client.send('DOM.enable'),
+            this._client.send('CSS.enable'),
+            this._client.send('CSS.startRuleUsageTracking'),
+        ]);
     }
-
-    const coverage = [];
-    for (const styleSheetId of this._stylesheetURLs.keys()) {
-      const url = this._stylesheetURLs.get(styleSheetId);
-      const text = this._stylesheetSources.get(styleSheetId);
-      const ranges = convertToDisjointRanges(styleSheetIdToCoverage.get(styleSheetId) || []);
-      coverage.push({url, ranges, text});
+    _onExecutionContextsCleared() {
+        if (!this._resetOnNavigation)
+            return;
+        this._stylesheetURLs.clear();
+        this._stylesheetSources.clear();
     }
-
-    return coverage;
-  }
+    async _onStyleSheet(event) {
+        const header = event.header;
+        // Ignore anonymous scripts
+        if (!header.sourceURL)
+            return;
+        try {
+            const response = await this._client.send('CSS.getStyleSheetText', { styleSheetId: header.styleSheetId });
+            this._stylesheetURLs.set(header.styleSheetId, header.sourceURL);
+            this._stylesheetSources.set(header.styleSheetId, response.text);
+        }
+        catch (error) {
+            // This might happen if the page has already navigated away.
+            helper_1.debugError(error);
+        }
+    }
+    async stop() {
+        helper_1.assert(this._enabled, 'CSSCoverage is not enabled');
+        this._enabled = false;
+        const ruleTrackingResponse = await this._client.send('CSS.stopRuleUsageTracking');
+        await Promise.all([
+            this._client.send('CSS.disable'),
+            this._client.send('DOM.disable'),
+        ]);
+        helper_1.helper.removeEventListeners(this._eventListeners);
+        // aggregate by styleSheetId
+        const styleSheetIdToCoverage = new Map();
+        for (const entry of ruleTrackingResponse.ruleUsage) {
+            let ranges = styleSheetIdToCoverage.get(entry.styleSheetId);
+            if (!ranges) {
+                ranges = [];
+                styleSheetIdToCoverage.set(entry.styleSheetId, ranges);
+            }
+            ranges.push({
+                startOffset: entry.startOffset,
+                endOffset: entry.endOffset,
+                count: entry.used ? 1 : 0,
+            });
+        }
+        const coverage = [];
+        for (const styleSheetId of this._stylesheetURLs.keys()) {
+            const url = this._stylesheetURLs.get(styleSheetId);
+            const text = this._stylesheetSources.get(styleSheetId);
+            const ranges = convertToDisjointRanges(styleSheetIdToCoverage.get(styleSheetId) || []);
+            coverage.push({ url, ranges, text });
+        }
+        return coverage;
+    }
 }
-
-/**
- * @param {!Array<!{startOffset:number, endOffset:number, count:number}>} nestedRanges
- * @return {!Array<!{start:number, end:number}>}
- */
 function convertToDisjointRanges(nestedRanges) {
-  const points = [];
-  for (const range of nestedRanges) {
-    points.push({ offset: range.startOffset, type: 0, range });
-    points.push({ offset: range.endOffset, type: 1, range });
-  }
-  // Sort points to form a valid parenthesis sequence.
-  points.sort((a, b) => {
-    // Sort with increasing offsets.
-    if (a.offset !== b.offset)
-      return a.offset - b.offset;
-    // All "end" points should go before "start" points.
-    if (a.type !== b.type)
-      return b.type - a.type;
-    const aLength = a.range.endOffset - a.range.startOffset;
-    const bLength = b.range.endOffset - b.range.startOffset;
-    // For two "start" points, the one with longer range goes first.
-    if (a.type === 0)
-      return bLength - aLength;
-    // For two "end" points, the one with shorter range goes first.
-    return aLength - bLength;
-  });
-
-  const hitCountStack = [];
-  const results = [];
-  let lastOffset = 0;
-  // Run scanning line to intersect all ranges.
-  for (const point of points) {
-    if (hitCountStack.length && lastOffset < point.offset && hitCountStack[hitCountStack.length - 1] > 0) {
-      const lastResult = results.length ? results[results.length - 1] : null;
-      if (lastResult && lastResult.end === lastOffset)
-        lastResult.end = point.offset;
-      else
-        results.push({start: lastOffset, end: point.offset});
+    const points = [];
+    for (const range of nestedRanges) {
+        points.push({ offset: range.startOffset, type: 0, range });
+        points.push({ offset: range.endOffset, type: 1, range });
     }
-    lastOffset = point.offset;
-    if (point.type === 0)
-      hitCountStack.push(point.range.count);
-    else
-      hitCountStack.pop();
-  }
-  // Filter out empty ranges.
-  return results.filter(range => range.end - range.start > 1);
+    // Sort points to form a valid parenthesis sequence.
+    points.sort((a, b) => {
+        // Sort with increasing offsets.
+        if (a.offset !== b.offset)
+            return a.offset - b.offset;
+        // All "end" points should go before "start" points.
+        if (a.type !== b.type)
+            return b.type - a.type;
+        const aLength = a.range.endOffset - a.range.startOffset;
+        const bLength = b.range.endOffset - b.range.startOffset;
+        // For two "start" points, the one with longer range goes first.
+        if (a.type === 0)
+            return bLength - aLength;
+        // For two "end" points, the one with shorter range goes first.
+        return aLength - bLength;
+    });
+    const hitCountStack = [];
+    const results = [];
+    let lastOffset = 0;
+    // Run scanning line to intersect all ranges.
+    for (const point of points) {
+        if (hitCountStack.length && lastOffset < point.offset && hitCountStack[hitCountStack.length - 1] > 0) {
+            const lastResult = results.length ? results[results.length - 1] : null;
+            if (lastResult && lastResult.end === lastOffset)
+                lastResult.end = point.offset;
+            else
+                results.push({ start: lastOffset, end: point.offset });
+        }
+        lastOffset = point.offset;
+        if (point.type === 0)
+            hitCountStack.push(point.range.count);
+        else
+            hitCountStack.pop();
+    }
+    // Filter out empty ranges.
+    return results.filter(range => range.end - range.start > 1);
 }
-
diff --git a/node_modules/puppeteer/lib/DOMWorld.js b/node_modules/puppeteer/lib/DOMWorld.js
index c5852ca..31932fc 100644
--- a/node_modules/puppeteer/lib/DOMWorld.js
+++ b/node_modules/puppeteer/lib/DOMWorld.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2019 Google Inc. All rights reserved.
  *
@@ -13,695 +14,494 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-const fs = require('fs');
-const {helper, assert} = require('./helper');
-const {LifecycleWatcher} = require('./LifecycleWatcher');
-const {TimeoutError} = require('./Errors');
-const readFileAsync = helper.promisify(fs.readFile);
-
-/**
- * @unrestricted
- */
+Object.defineProperty(exports, "__esModule", { value: true });
+const fs = require("fs");
+const helper_1 = require("./helper");
+const LifecycleWatcher_1 = require("./LifecycleWatcher");
+const Errors_1 = require("./Errors");
+const QueryHandler_1 = require("./QueryHandler");
+const readFileAsync = helper_1.helper.promisify(fs.readFile);
 class DOMWorld {
-  /**
-   * @param {!Puppeteer.FrameManager} frameManager
-   * @param {!Puppeteer.Frame} frame
-   * @param {!Puppeteer.TimeoutSettings} timeoutSettings
-   */
-  constructor(frameManager, frame, timeoutSettings) {
-    this._frameManager = frameManager;
-    this._frame = frame;
-    this._timeoutSettings = timeoutSettings;
-
-    /** @type {?Promise<!Puppeteer.ElementHandle>} */
-    this._documentPromise = null;
-    /** @type {!Promise<!Puppeteer.ExecutionContext>} */
-    this._contextPromise;
-    this._contextResolveCallback = null;
-    this._setContext(null);
-
-    /** @type {!Set<!WaitTask>} */
-    this._waitTasks = new Set();
-    this._detached = false;
-  }
-
-  /**
-   * @return {!Puppeteer.Frame}
-   */
-  frame() {
-    return this._frame;
-  }
-
-  /**
-   * @param {?Puppeteer.ExecutionContext} context
-   */
-  _setContext(context) {
-    if (context) {
-      this._contextResolveCallback.call(null, context);
-      this._contextResolveCallback = null;
-      for (const waitTask of this._waitTasks)
-        waitTask.rerun();
-    } else {
-      this._documentPromise = null;
-      this._contextPromise = new Promise(fulfill => {
-        this._contextResolveCallback = fulfill;
-      });
+    constructor(frameManager, frame, timeoutSettings) {
+        this._documentPromise = null;
+        this._contextPromise = null;
+        this._contextResolveCallback = null;
+        this._detached = false;
+        this._waitTasks = new Set();
+        this._frameManager = frameManager;
+        this._frame = frame;
+        this._timeoutSettings = timeoutSettings;
+        this._setContext(null);
     }
-  }
-
-  /**
-   * @return {boolean}
-   */
-  _hasContext() {
-    return !this._contextResolveCallback;
-  }
-
-  _detach() {
-    this._detached = true;
-    for (const waitTask of this._waitTasks)
-      waitTask.terminate(new Error('waitForFunction failed: frame got detached.'));
-  }
-
-  /**
-   * @return {!Promise<!Puppeteer.ExecutionContext>}
-   */
-  executionContext() {
-    if (this._detached)
-      throw new Error(`Execution Context is not available in detached frame "${this._frame.url()}" (are you trying to evaluate?)`);
-    return this._contextPromise;
-  }
-
-  /**
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<!Puppeteer.JSHandle>}
-   */
-  async evaluateHandle(pageFunction, ...args) {
-    const context = await this.executionContext();
-    return context.evaluateHandle(pageFunction, ...args);
-  }
-
-  /**
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<*>}
-   */
-  async evaluate(pageFunction, ...args) {
-    const context = await this.executionContext();
-    return context.evaluate(pageFunction, ...args);
-  }
-
-  /**
-   * @param {string} selector
-   * @return {!Promise<?Puppeteer.ElementHandle>}
-   */
-  async $(selector) {
-    const document = await this._document();
-    const value = await document.$(selector);
-    return value;
-  }
-
-  /**
-   * @return {!Promise<!Puppeteer.ElementHandle>}
-   */
-  async _document() {
-    if (this._documentPromise)
-      return this._documentPromise;
-    this._documentPromise = this.executionContext().then(async context => {
-      const document = await context.evaluateHandle('document');
-      return document.asElement();
-    });
-    return this._documentPromise;
-  }
-
-  /**
-   * @param {string} expression
-   * @return {!Promise<!Array<!Puppeteer.ElementHandle>>}
-   */
-  async $x(expression) {
-    const document = await this._document();
-    const value = await document.$x(expression);
-    return value;
-  }
-
-  /**
-   * @param {string} selector
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<(!Object|undefined)>}
-   */
-  async $eval(selector, pageFunction, ...args) {
-    const document = await this._document();
-    return document.$eval(selector, pageFunction, ...args);
-  }
-
-  /**
-   * @param {string} selector
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<(!Object|undefined)>}
-   */
-  async $$eval(selector, pageFunction, ...args) {
-    const document = await this._document();
-    const value = await document.$$eval(selector, pageFunction, ...args);
-    return value;
-  }
-
-  /**
-   * @param {string} selector
-   * @return {!Promise<!Array<!Puppeteer.ElementHandle>>}
-   */
-  async $$(selector) {
-    const document = await this._document();
-    const value = await document.$$(selector);
-    return value;
-  }
-
-  /**
-   * @return {!Promise<String>}
-   */
-  async content() {
-    return await this.evaluate(() => {
-      let retVal = '';
-      if (document.doctype)
-        retVal = new XMLSerializer().serializeToString(document.doctype);
-      if (document.documentElement)
-        retVal += document.documentElement.outerHTML;
-      return retVal;
-    });
-  }
-
-  /**
-   * @param {string} html
-   * @param {!{timeout?: number, waitUntil?: string|!Array<string>}=} options
-   */
-  async setContent(html, options = {}) {
-    const {
-      waitUntil = ['load'],
-      timeout = this._timeoutSettings.navigationTimeout(),
-    } = options;
-    // We rely upon the fact that document.open() will reset frame lifecycle with "init"
-    // lifecycle event. @see https://crrev.com/608658
-    await this.evaluate(html => {
-      document.open();
-      document.write(html);
-      document.close();
-    }, html);
-    const watcher = new LifecycleWatcher(this._frameManager, this._frame, waitUntil, timeout);
-    const error = await Promise.race([
-      watcher.timeoutOrTerminationPromise(),
-      watcher.lifecyclePromise(),
-    ]);
-    watcher.dispose();
-    if (error)
-      throw error;
-  }
-
-  /**
-   * @param {!{url?: string, path?: string, content?: string, type?: string}} options
-   * @return {!Promise<!Puppeteer.ElementHandle>}
-   */
-  async addScriptTag(options) {
-    const {
-      url = null,
-      path = null,
-      content = null,
-      type = ''
-    } = options;
-    if (url !== null) {
-      try {
+    frame() {
+        return this._frame;
+    }
+    /**
+     * @param {?ExecutionContext} context
+     */
+    _setContext(context) {
+        if (context) {
+            this._contextResolveCallback.call(null, context);
+            this._contextResolveCallback = null;
+            for (const waitTask of this._waitTasks)
+                waitTask.rerun();
+        }
+        else {
+            this._documentPromise = null;
+            this._contextPromise = new Promise(fulfill => {
+                this._contextResolveCallback = fulfill;
+            });
+        }
+    }
+    _hasContext() {
+        return !this._contextResolveCallback;
+    }
+    _detach() {
+        this._detached = true;
+        for (const waitTask of this._waitTasks)
+            waitTask.terminate(new Error('waitForFunction failed: frame got detached.'));
+    }
+    /**
+     * @return {!Promise<!ExecutionContext>}
+     */
+    executionContext() {
+        if (this._detached)
+            throw new Error(`Execution Context is not available in detached frame "${this._frame.url()}" (are you trying to evaluate?)`);
+        return this._contextPromise;
+    }
+    /**
+     * @param {Function|string} pageFunction
+     * @param {!Array<*>} args
+     * @return {!Promise<!JSHandle>}
+     */
+    async evaluateHandle(pageFunction, ...args) {
         const context = await this.executionContext();
-        return (await context.evaluateHandle(addScriptUrl, url, type)).asElement();
-      } catch (error) {
-        throw new Error(`Loading script from ${url} failed`);
-      }
+        return context.evaluateHandle(pageFunction, ...args);
     }
-
-    if (path !== null) {
-      let contents = await readFileAsync(path, 'utf8');
-      contents += '//# sourceURL=' + path.replace(/\n/g, '');
-      const context = await this.executionContext();
-      return (await context.evaluateHandle(addScriptContent, contents, type)).asElement();
-    }
-
-    if (content !== null) {
-      const context = await this.executionContext();
-      return (await context.evaluateHandle(addScriptContent, content, type)).asElement();
-    }
-
-    throw new Error('Provide an object with a `url`, `path` or `content` property');
-
     /**
-     * @param {string} url
-     * @param {string} type
-     * @return {!Promise<!HTMLElement>}
+     * @param {Function|string} pageFunction
+     * @param {!Array<*>} args
+     * @return {!Promise<*>}
      */
-    async function addScriptUrl(url, type) {
-      const script = document.createElement('script');
-      script.src = url;
-      if (type)
-        script.type = type;
-      const promise = new Promise((res, rej) => {
-        script.onload = res;
-        script.onerror = rej;
-      });
-      document.head.appendChild(script);
-      await promise;
-      return script;
-    }
-
-    /**
-     * @param {string} content
-     * @param {string} type
-     * @return {!HTMLElement}
-     */
-    function addScriptContent(content, type = 'text/javascript') {
-      const script = document.createElement('script');
-      script.type = type;
-      script.text = content;
-      let error = null;
-      script.onerror = e => error = e;
-      document.head.appendChild(script);
-      if (error)
-        throw error;
-      return script;
-    }
-  }
-
-  /**
-   * @param {!{url?: string, path?: string, content?: string}} options
-   * @return {!Promise<!Puppeteer.ElementHandle>}
-   */
-  async addStyleTag(options) {
-    const {
-      url = null,
-      path = null,
-      content = null
-    } = options;
-    if (url !== null) {
-      try {
+    async evaluate(pageFunction, ...args) {
         const context = await this.executionContext();
-        return (await context.evaluateHandle(addStyleUrl, url)).asElement();
-      } catch (error) {
-        throw new Error(`Loading style from ${url} failed`);
-      }
+        return context.evaluate(pageFunction, ...args);
     }
-
-    if (path !== null) {
-      let contents = await readFileAsync(path, 'utf8');
-      contents += '/*# sourceURL=' + path.replace(/\n/g, '') + '*/';
-      const context = await this.executionContext();
-      return (await context.evaluateHandle(addStyleContent, contents)).asElement();
-    }
-
-    if (content !== null) {
-      const context = await this.executionContext();
-      return (await context.evaluateHandle(addStyleContent, content)).asElement();
-    }
-
-    throw new Error('Provide an object with a `url`, `path` or `content` property');
-
     /**
-     * @param {string} url
-     * @return {!Promise<!HTMLElement>}
+     * @param {string} selector
+     * @return {!Promise<?ElementHandle>}
      */
-    async function addStyleUrl(url) {
-      const link = document.createElement('link');
-      link.rel = 'stylesheet';
-      link.href = url;
-      const promise = new Promise((res, rej) => {
-        link.onload = res;
-        link.onerror = rej;
-      });
-      document.head.appendChild(link);
-      await promise;
-      return link;
+    async $(selector) {
+        const document = await this._document();
+        const value = await document.$(selector);
+        return value;
     }
-
+    async _document() {
+        if (this._documentPromise)
+            return this._documentPromise;
+        this._documentPromise = this.executionContext().then(async (context) => {
+            const document = await context.evaluateHandle('document');
+            return document.asElement();
+        });
+        return this._documentPromise;
+    }
+    async $x(expression) {
+        const document = await this._document();
+        const value = await document.$x(expression);
+        return value;
+    }
+    async $eval(selector, pageFunction, ...args) {
+        const document = await this._document();
+        return document.$eval(selector, pageFunction, ...args);
+    }
+    async $$eval(selector, pageFunction, ...args) {
+        const document = await this._document();
+        const value = await document.$$eval(selector, pageFunction, ...args);
+        return value;
+    }
     /**
-     * @param {string} content
-     * @return {!Promise<!HTMLElement>}
+     * @param {string} selector
+     * @return {!Promise<!Array<!ElementHandle>>}
      */
-    async function addStyleContent(content) {
-      const style = document.createElement('style');
-      style.type = 'text/css';
-      style.appendChild(document.createTextNode(content));
-      const promise = new Promise((res, rej) => {
-        style.onload = res;
-        style.onerror = rej;
-      });
-      document.head.appendChild(style);
-      await promise;
-      return style;
+    async $$(selector) {
+        const document = await this._document();
+        const value = await document.$$(selector);
+        return value;
     }
-  }
-
-  /**
-   * @param {string} selector
-   * @param {!{delay?: number, button?: "left"|"right"|"middle", clickCount?: number}=} options
-   */
-  async click(selector, options) {
-    const handle = await this.$(selector);
-    assert(handle, 'No node found for selector: ' + selector);
-    await handle.click(options);
-    await handle.dispose();
-  }
-
-  /**
-   * @param {string} selector
-   */
-  async focus(selector) {
-    const handle = await this.$(selector);
-    assert(handle, 'No node found for selector: ' + selector);
-    await handle.focus();
-    await handle.dispose();
-  }
-
-  /**
-   * @param {string} selector
-   */
-  async hover(selector) {
-    const handle = await this.$(selector);
-    assert(handle, 'No node found for selector: ' + selector);
-    await handle.hover();
-    await handle.dispose();
-  }
-
-  /**
-   * @param {string} selector
-   * @param {!Array<string>} values
-   * @return {!Promise<!Array<string>>}
-   */
-  async select(selector, ...values) {
-    const handle = await this.$(selector);
-    assert(handle, 'No node found for selector: ' + selector);
-    const result = await handle.select(...values);
-    await handle.dispose();
-    return result;
-  }
-
-  /**
-   * @param {string} selector
-   */
-  async tap(selector) {
-    const handle = await this.$(selector);
-    assert(handle, 'No node found for selector: ' + selector);
-    await handle.tap();
-    await handle.dispose();
-  }
-
-  /**
-   * @param {string} selector
-   * @param {string} text
-   * @param {{delay: (number|undefined)}=} options
-   */
-  async type(selector, text, options) {
-    const handle = await this.$(selector);
-    assert(handle, 'No node found for selector: ' + selector);
-    await handle.type(text, options);
-    await handle.dispose();
-  }
-
-  /**
-   * @param {string} selector
-   * @param {!{visible?: boolean, hidden?: boolean, timeout?: number}=} options
-   * @return {!Promise<?Puppeteer.ElementHandle>}
-   */
-  waitForSelector(selector, options) {
-    return this._waitForSelectorOrXPath(selector, false, options);
-  }
-
-  /**
-   * @param {string} xpath
-   * @param {!{visible?: boolean, hidden?: boolean, timeout?: number}=} options
-   * @return {!Promise<?Puppeteer.ElementHandle>}
-   */
-  waitForXPath(xpath, options) {
-    return this._waitForSelectorOrXPath(xpath, true, options);
-  }
-
-  /**
-   * @param {Function|string} pageFunction
-   * @param {!{polling?: string|number, timeout?: number}=} options
-   * @return {!Promise<!Puppeteer.JSHandle>}
-   */
-  waitForFunction(pageFunction, options = {}, ...args) {
-    const {
-      polling = 'raf',
-      timeout = this._timeoutSettings.timeout(),
-    } = options;
-    return new WaitTask(this, pageFunction, 'function', polling, timeout, ...args).promise;
-  }
-
-  /**
-   * @return {!Promise<string>}
-   */
-  async title() {
-    return this.evaluate(() => document.title);
-  }
-
-  /**
-   * @param {string} selectorOrXPath
-   * @param {boolean} isXPath
-   * @param {!{visible?: boolean, hidden?: boolean, timeout?: number}=} options
-   * @return {!Promise<?Puppeteer.ElementHandle>}
-   */
-  async _waitForSelectorOrXPath(selectorOrXPath, isXPath, options = {}) {
-    const {
-      visible: waitForVisible = false,
-      hidden: waitForHidden = false,
-      timeout = this._timeoutSettings.timeout(),
-    } = options;
-    const polling = waitForVisible || waitForHidden ? 'raf' : 'mutation';
-    const title = `${isXPath ? 'XPath' : 'selector'} "${selectorOrXPath}"${waitForHidden ? ' to be hidden' : ''}`;
-    const waitTask = new WaitTask(this, predicate, title, polling, timeout, selectorOrXPath, isXPath, waitForVisible, waitForHidden);
-    const handle = await waitTask.promise;
-    if (!handle.asElement()) {
-      await handle.dispose();
-      return null;
+    async content() {
+        return await this.evaluate(() => {
+            let retVal = '';
+            if (document.doctype)
+                retVal = new XMLSerializer().serializeToString(document.doctype);
+            if (document.documentElement)
+                retVal += document.documentElement.outerHTML;
+            return retVal;
+        });
     }
-    return handle.asElement();
-
+    async setContent(html, options = {}) {
+        const { waitUntil = ['load'], timeout = this._timeoutSettings.navigationTimeout(), } = options;
+        // We rely upon the fact that document.open() will reset frame lifecycle with "init"
+        // lifecycle event. @see https://crrev.com/608658
+        await this.evaluate(html => {
+            document.open();
+            document.write(html);
+            document.close();
+        }, html);
+        const watcher = new LifecycleWatcher_1.LifecycleWatcher(this._frameManager, this._frame, waitUntil, timeout);
+        const error = await Promise.race([
+            watcher.timeoutOrTerminationPromise(),
+            watcher.lifecyclePromise(),
+        ]);
+        watcher.dispose();
+        if (error)
+            throw error;
+    }
     /**
-     * @param {string} selectorOrXPath
-     * @param {boolean} isXPath
-     * @param {boolean} waitForVisible
-     * @param {boolean} waitForHidden
-     * @return {?Node|boolean}
+     * @param {!{url?: string, path?: string, content?: string, type?: string}} options
+     * @return {!Promise<!ElementHandle>}
      */
-    function predicate(selectorOrXPath, isXPath, waitForVisible, waitForHidden) {
-      const node = isXPath
-        ? document.evaluate(selectorOrXPath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue
-        : document.querySelector(selectorOrXPath);
-      if (!node)
-        return waitForHidden;
-      if (!waitForVisible && !waitForHidden)
-        return node;
-      const element = /** @type {Element} */ (node.nodeType === Node.TEXT_NODE ? node.parentElement : node);
-
-      const style = window.getComputedStyle(element);
-      const isVisible = style && style.visibility !== 'hidden' && hasVisibleBoundingBox();
-      const success = (waitForVisible === isVisible || waitForHidden === !isVisible);
-      return success ? node : null;
-
-      /**
-       * @return {boolean}
-       */
-      function hasVisibleBoundingBox() {
-        const rect = element.getBoundingClientRect();
-        return !!(rect.top || rect.bottom || rect.width || rect.height);
-      }
+    async addScriptTag(options) {
+        const { url = null, path = null, content = null, type = '' } = options;
+        if (url !== null) {
+            try {
+                const context = await this.executionContext();
+                return (await context.evaluateHandle(addScriptUrl, url, type)).asElement();
+            }
+            catch (error) {
+                throw new Error(`Loading script from ${url} failed`);
+            }
+        }
+        if (path !== null) {
+            let contents = await readFileAsync(path, 'utf8');
+            contents += '//# sourceURL=' + path.replace(/\n/g, '');
+            const context = await this.executionContext();
+            return (await context.evaluateHandle(addScriptContent, contents, type)).asElement();
+        }
+        if (content !== null) {
+            const context = await this.executionContext();
+            return (await context.evaluateHandle(addScriptContent, content, type)).asElement();
+        }
+        throw new Error('Provide an object with a `url`, `path` or `content` property');
+        async function addScriptUrl(url, type) {
+            const script = document.createElement('script');
+            script.src = url;
+            if (type)
+                script.type = type;
+            const promise = new Promise((res, rej) => {
+                script.onload = res;
+                script.onerror = rej;
+            });
+            document.head.appendChild(script);
+            await promise;
+            return script;
+        }
+        function addScriptContent(content, type = 'text/javascript') {
+            const script = document.createElement('script');
+            script.type = type;
+            script.text = content;
+            let error = null;
+            script.onerror = e => error = e;
+            document.head.appendChild(script);
+            if (error)
+                throw error;
+            return script;
+        }
     }
-  }
+    async addStyleTag(options) {
+        const { url = null, path = null, content = null } = options;
+        if (url !== null) {
+            try {
+                const context = await this.executionContext();
+                return (await context.evaluateHandle(addStyleUrl, url)).asElement();
+            }
+            catch (error) {
+                throw new Error(`Loading style from ${url} failed`);
+            }
+        }
+        if (path !== null) {
+            let contents = await readFileAsync(path, 'utf8');
+            contents += '/*# sourceURL=' + path.replace(/\n/g, '') + '*/';
+            const context = await this.executionContext();
+            return (await context.evaluateHandle(addStyleContent, contents)).asElement();
+        }
+        if (content !== null) {
+            const context = await this.executionContext();
+            return (await context.evaluateHandle(addStyleContent, content)).asElement();
+        }
+        throw new Error('Provide an object with a `url`, `path` or `content` property');
+        async function addStyleUrl(url) {
+            const link = document.createElement('link');
+            link.rel = 'stylesheet';
+            link.href = url;
+            const promise = new Promise((res, rej) => {
+                link.onload = res;
+                link.onerror = rej;
+            });
+            document.head.appendChild(link);
+            await promise;
+            return link;
+        }
+        async function addStyleContent(content) {
+            const style = document.createElement('style');
+            style.type = 'text/css';
+            style.appendChild(document.createTextNode(content));
+            const promise = new Promise((res, rej) => {
+                style.onload = res;
+                style.onerror = rej;
+            });
+            document.head.appendChild(style);
+            await promise;
+            return style;
+        }
+    }
+    async click(selector, options) {
+        const handle = await this.$(selector);
+        helper_1.assert(handle, 'No node found for selector: ' + selector);
+        await handle.click(options);
+        await handle.dispose();
+    }
+    async focus(selector) {
+        const handle = await this.$(selector);
+        helper_1.assert(handle, 'No node found for selector: ' + selector);
+        await handle.focus();
+        await handle.dispose();
+    }
+    async hover(selector) {
+        const handle = await this.$(selector);
+        helper_1.assert(handle, 'No node found for selector: ' + selector);
+        await handle.hover();
+        await handle.dispose();
+    }
+    async select(selector, ...values) {
+        const handle = await this.$(selector);
+        helper_1.assert(handle, 'No node found for selector: ' + selector);
+        const result = await handle.select(...values);
+        await handle.dispose();
+        return result;
+    }
+    async tap(selector) {
+        const handle = await this.$(selector);
+        helper_1.assert(handle, 'No node found for selector: ' + selector);
+        await handle.tap();
+        await handle.dispose();
+    }
+    async type(selector, text, options) {
+        const handle = await this.$(selector);
+        helper_1.assert(handle, 'No node found for selector: ' + selector);
+        await handle.type(text, options);
+        await handle.dispose();
+    }
+    waitForSelector(selector, options) {
+        return this._waitForSelectorOrXPath(selector, false, options);
+    }
+    waitForXPath(xpath, options) {
+        return this._waitForSelectorOrXPath(xpath, true, options);
+    }
+    waitForFunction(pageFunction, options = {}, ...args) {
+        const { polling = 'raf', timeout = this._timeoutSettings.timeout(), } = options;
+        return new WaitTask(this, pageFunction, undefined, 'function', polling, timeout, ...args).promise;
+    }
+    async title() {
+        return this.evaluate(() => document.title);
+    }
+    async _waitForSelectorOrXPath(selectorOrXPath, isXPath, options = {}) {
+        const { visible: waitForVisible = false, hidden: waitForHidden = false, timeout = this._timeoutSettings.timeout(), } = options;
+        const polling = waitForVisible || waitForHidden ? 'raf' : 'mutation';
+        const title = `${isXPath ? 'XPath' : 'selector'} "${selectorOrXPath}"${waitForHidden ? ' to be hidden' : ''}`;
+        const { updatedSelector, queryHandler } = QueryHandler_1.getQueryHandlerAndSelector(selectorOrXPath, (element, selector) => document.querySelector(selector));
+        const waitTask = new WaitTask(this, predicate, queryHandler, title, polling, timeout, updatedSelector, isXPath, waitForVisible, waitForHidden);
+        const handle = await waitTask.promise;
+        if (!handle.asElement()) {
+            await handle.dispose();
+            return null;
+        }
+        return handle.asElement();
+        /**
+         * @param {string} selectorOrXPath
+         * @param {boolean} isXPath
+         * @param {boolean} waitForVisible
+         * @param {boolean} waitForHidden
+         * @return {?Node|boolean}
+         */
+        function predicate(selectorOrXPath, isXPath, waitForVisible, waitForHidden) {
+            const node = isXPath
+                ? document.evaluate(selectorOrXPath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue
+                : predicateQueryHandler ? predicateQueryHandler(document, selectorOrXPath) : document.querySelector(selectorOrXPath);
+            if (!node)
+                return waitForHidden;
+            if (!waitForVisible && !waitForHidden)
+                return node;
+            const element = (node.nodeType === Node.TEXT_NODE ? node.parentElement : node);
+            const style = window.getComputedStyle(element);
+            const isVisible = style && style.visibility !== 'hidden' && hasVisibleBoundingBox();
+            const success = (waitForVisible === isVisible || waitForHidden === !isVisible);
+            return success ? node : null;
+            function hasVisibleBoundingBox() {
+                const rect = element.getBoundingClientRect();
+                return !!(rect.top || rect.bottom || rect.width || rect.height);
+            }
+        }
+    }
 }
-
+exports.DOMWorld = DOMWorld;
 class WaitTask {
-  /**
-   * @param {!DOMWorld} domWorld
-   * @param {Function|string} predicateBody
-   * @param {string|number} polling
-   * @param {number} timeout
-   * @param {!Array<*>} args
-   */
-  constructor(domWorld, predicateBody, title, polling, timeout, ...args) {
-    if (helper.isString(polling))
-      assert(polling === 'raf' || polling === 'mutation', 'Unknown polling option: ' + polling);
-    else if (helper.isNumber(polling))
-      assert(polling > 0, 'Cannot poll with non-positive interval: ' + polling);
-    else
-      throw new Error('Unknown polling options: ' + polling);
-
-    this._domWorld = domWorld;
-    this._polling = polling;
-    this._timeout = timeout;
-    this._predicateBody = helper.isString(predicateBody) ? 'return (' + predicateBody + ')' : 'return (' + predicateBody + ')(...args)';
-    this._args = args;
-    this._runCount = 0;
-    domWorld._waitTasks.add(this);
-    this.promise = new Promise((resolve, reject) => {
-      this._resolve = resolve;
-      this._reject = reject;
-    });
-    // Since page navigation requires us to re-install the pageScript, we should track
-    // timeout on our end.
-    if (timeout) {
-      const timeoutError = new TimeoutError(`waiting for ${title} failed: timeout ${timeout}ms exceeded`);
-      this._timeoutTimer = setTimeout(() => this.terminate(timeoutError), timeout);
+    constructor(domWorld, predicateBody, predicateQueryHandlerBody, title, polling, timeout, ...args) {
+        this._runCount = 0;
+        this._terminated = false;
+        if (helper_1.helper.isString(polling))
+            helper_1.assert(polling === 'raf' || polling === 'mutation', 'Unknown polling option: ' + polling);
+        else if (helper_1.helper.isNumber(polling))
+            helper_1.assert(polling > 0, 'Cannot poll with non-positive interval: ' + polling);
+        else
+            throw new Error('Unknown polling options: ' + polling);
+        function getPredicateBody(predicateBody, predicateQueryHandlerBody) {
+            if (helper_1.helper.isString(predicateBody))
+                return `return (${predicateBody});`;
+            if (predicateQueryHandlerBody) {
+                return `
+          return (function wrapper(args) {
+            const predicateQueryHandler = ${predicateQueryHandlerBody};
+            return (${predicateBody})(...args);
+          })(args);`;
+            }
+            return `return (${predicateBody})(...args);`;
+        }
+        this._domWorld = domWorld;
+        this._polling = polling;
+        this._timeout = timeout;
+        this._predicateBody = getPredicateBody(predicateBody, predicateQueryHandlerBody);
+        this._args = args;
+        this._runCount = 0;
+        domWorld._waitTasks.add(this);
+        this.promise = new Promise((resolve, reject) => {
+            this._resolve = resolve;
+            this._reject = reject;
+        });
+        // Since page navigation requires us to re-install the pageScript, we should track
+        // timeout on our end.
+        if (timeout) {
+            const timeoutError = new Errors_1.TimeoutError(`waiting for ${title} failed: timeout ${timeout}ms exceeded`);
+            this._timeoutTimer = setTimeout(() => this.terminate(timeoutError), timeout);
+        }
+        this.rerun();
     }
-    this.rerun();
-  }
-
-  /**
-   * @param {!Error} error
-   */
-  terminate(error) {
-    this._terminated = true;
-    this._reject(error);
-    this._cleanup();
-  }
-
-  async rerun() {
-    const runCount = ++this._runCount;
-    /** @type {?Puppeteer.JSHandle} */
-    let success = null;
-    let error = null;
-    try {
-      success = await (await this._domWorld.executionContext()).evaluateHandle(waitForPredicatePageFunction, this._predicateBody, this._polling, this._timeout, ...this._args);
-    } catch (e) {
-      error = e;
+    terminate(error) {
+        this._terminated = true;
+        this._reject(error);
+        this._cleanup();
     }
-
-    if (this._terminated || runCount !== this._runCount) {
-      if (success)
-        await success.dispose();
-      return;
+    async rerun() {
+        const runCount = ++this._runCount;
+        /** @type {?JSHandle} */
+        let success = null;
+        let error = null;
+        try {
+            success = await (await this._domWorld.executionContext()).evaluateHandle(waitForPredicatePageFunction, this._predicateBody, this._polling, this._timeout, ...this._args);
+        }
+        catch (error_) {
+            error = error_;
+        }
+        if (this._terminated || runCount !== this._runCount) {
+            if (success)
+                await success.dispose();
+            return;
+        }
+        // Ignore timeouts in pageScript - we track timeouts ourselves.
+        // If the frame's execution context has already changed, `frame.evaluate` will
+        // throw an error - ignore this predicate run altogether.
+        if (!error && await this._domWorld.evaluate(s => !s, success).catch(() => true)) {
+            await success.dispose();
+            return;
+        }
+        // When the page is navigated, the promise is rejected.
+        // We will try again in the new execution context.
+        if (error && error.message.includes('Execution context was destroyed'))
+            return;
+        // We could have tried to evaluate in a context which was already
+        // destroyed.
+        if (error && error.message.includes('Cannot find context with specified id'))
+            return;
+        if (error)
+            this._reject(error);
+        else
+            this._resolve(success);
+        this._cleanup();
     }
-
-    // Ignore timeouts in pageScript - we track timeouts ourselves.
-    // If the frame's execution context has already changed, `frame.evaluate` will
-    // throw an error - ignore this predicate run altogether.
-    if (!error && await this._domWorld.evaluate(s => !s, success).catch(e => true)) {
-      await success.dispose();
-      return;
+    _cleanup() {
+        clearTimeout(this._timeoutTimer);
+        this._domWorld._waitTasks.delete(this);
     }
-
-    // When the page is navigated, the promise is rejected.
-    // We will try again in the new execution context.
-    if (error && error.message.includes('Execution context was destroyed'))
-      return;
-
-    // We could have tried to evaluate in a context which was already
-    // destroyed.
-    if (error && error.message.includes('Cannot find context with specified id'))
-      return;
-
-    if (error)
-      this._reject(error);
-    else
-      this._resolve(success);
-
-    this._cleanup();
-  }
-
-  _cleanup() {
-    clearTimeout(this._timeoutTimer);
-    this._domWorld._waitTasks.delete(this);
-    this._runningTask = null;
-  }
 }
-
-/**
- * @param {string} predicateBody
- * @param {string} polling
- * @param {number} timeout
- * @return {!Promise<*>}
- */
 async function waitForPredicatePageFunction(predicateBody, polling, timeout, ...args) {
-  const predicate = new Function('...args', predicateBody);
-  let timedOut = false;
-  if (timeout)
-    setTimeout(() => timedOut = true, timeout);
-  if (polling === 'raf')
-    return await pollRaf();
-  if (polling === 'mutation')
-    return await pollMutation();
-  if (typeof polling === 'number')
-    return await pollInterval(polling);
-
-  /**
-   * @return {!Promise<*>}
-   */
-  function pollMutation() {
-    const success = predicate.apply(null, args);
-    if (success)
-      return Promise.resolve(success);
-
-    let fulfill;
-    const result = new Promise(x => fulfill = x);
-    const observer = new MutationObserver(mutations => {
-      if (timedOut) {
-        observer.disconnect();
-        fulfill();
-      }
-      const success = predicate.apply(null, args);
-      if (success) {
-        observer.disconnect();
-        fulfill(success);
-      }
-    });
-    observer.observe(document, {
-      childList: true,
-      subtree: true,
-      attributes: true
-    });
-    return result;
-  }
-
-  /**
-   * @return {!Promise<*>}
-   */
-  function pollRaf() {
-    let fulfill;
-    const result = new Promise(x => fulfill = x);
-    onRaf();
-    return result;
-
-    function onRaf() {
-      if (timedOut) {
-        fulfill();
-        return;
-      }
-      const success = predicate.apply(null, args);
-      if (success)
-        fulfill(success);
-      else
-        requestAnimationFrame(onRaf);
+    const predicate = new Function('...args', predicateBody);
+    let timedOut = false;
+    if (timeout)
+        setTimeout(() => timedOut = true, timeout);
+    if (polling === 'raf')
+        return await pollRaf();
+    if (polling === 'mutation')
+        return await pollMutation();
+    if (typeof polling === 'number')
+        return await pollInterval(polling);
+    /**
+     * @return {!Promise<*>}
+     */
+    function pollMutation() {
+        const success = predicate(...args);
+        if (success)
+            return Promise.resolve(success);
+        let fulfill;
+        const result = new Promise(x => fulfill = x);
+        const observer = new MutationObserver(() => {
+            if (timedOut) {
+                observer.disconnect();
+                fulfill();
+            }
+            const success = predicate(...args);
+            if (success) {
+                observer.disconnect();
+                fulfill(success);
+            }
+        });
+        observer.observe(document, {
+            childList: true,
+            subtree: true,
+            attributes: true
+        });
+        return result;
     }
-  }
-
-  /**
-   * @param {number} pollInterval
-   * @return {!Promise<*>}
-   */
-  function pollInterval(pollInterval) {
-    let fulfill;
-    const result = new Promise(x => fulfill = x);
-    onTimeout();
-    return result;
-
-    function onTimeout() {
-      if (timedOut) {
-        fulfill();
-        return;
-      }
-      const success = predicate.apply(null, args);
-      if (success)
-        fulfill(success);
-      else
-        setTimeout(onTimeout, pollInterval);
+    function pollRaf() {
+        let fulfill;
+        const result = new Promise(x => fulfill = x);
+        onRaf();
+        return result;
+        function onRaf() {
+            if (timedOut) {
+                fulfill();
+                return;
+            }
+            const success = predicate(...args);
+            if (success)
+                fulfill(success);
+            else
+                requestAnimationFrame(onRaf);
+        }
     }
-  }
+    function pollInterval(pollInterval) {
+        let fulfill;
+        const result = new Promise(x => fulfill = x);
+        onTimeout();
+        return result;
+        function onTimeout() {
+            if (timedOut) {
+                fulfill();
+                return;
+            }
+            const success = predicate(...args);
+            if (success)
+                fulfill(success);
+            else
+                setTimeout(onTimeout, pollInterval);
+        }
+    }
 }
-
-module.exports = {DOMWorld};
diff --git a/node_modules/puppeteer/lib/DeviceDescriptors.js b/node_modules/puppeteer/lib/DeviceDescriptors.js
index 5d586d7..a3b698f 100644
--- a/node_modules/puppeteer/lib/DeviceDescriptors.js
+++ b/node_modules/puppeteer/lib/DeviceDescriptors.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,860 +14,862 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-module.exports = [
-  {
-    'name': 'Blackberry PlayBook',
-    'userAgent': 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+',
-    'viewport': {
-      'width': 600,
-      'height': 1024,
-      'deviceScaleFactor': 1,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Blackberry PlayBook landscape',
-    'userAgent': 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+',
-    'viewport': {
-      'width': 1024,
-      'height': 600,
-      'deviceScaleFactor': 1,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'BlackBerry Z30',
-    'userAgent': 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+',
-    'viewport': {
-      'width': 360,
-      'height': 640,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'BlackBerry Z30 landscape',
-    'userAgent': 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+',
-    'viewport': {
-      'width': 640,
-      'height': 360,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Galaxy Note 3',
-    'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
-    'viewport': {
-      'width': 360,
-      'height': 640,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Galaxy Note 3 landscape',
-    'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
-    'viewport': {
-      'width': 640,
-      'height': 360,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Galaxy Note II',
-    'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
-    'viewport': {
-      'width': 360,
-      'height': 640,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Galaxy Note II landscape',
-    'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
-    'viewport': {
-      'width': 640,
-      'height': 360,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Galaxy S III',
-    'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
-    'viewport': {
-      'width': 360,
-      'height': 640,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Galaxy S III landscape',
-    'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
-    'viewport': {
-      'width': 640,
-      'height': 360,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Galaxy S5',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 360,
-      'height': 640,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Galaxy S5 landscape',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 640,
-      'height': 360,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'iPad',
-    'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
-    'viewport': {
-      'width': 768,
-      'height': 1024,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'iPad landscape',
-    'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
-    'viewport': {
-      'width': 1024,
-      'height': 768,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'iPad Mini',
-    'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
-    'viewport': {
-      'width': 768,
-      'height': 1024,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'iPad Mini landscape',
-    'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
-    'viewport': {
-      'width': 1024,
-      'height': 768,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'iPad Pro',
-    'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
-    'viewport': {
-      'width': 1024,
-      'height': 1366,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'iPad Pro landscape',
-    'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
-    'viewport': {
-      'width': 1366,
-      'height': 1024,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'iPhone 4',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53',
-    'viewport': {
-      'width': 320,
-      'height': 480,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'iPhone 4 landscape',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53',
-    'viewport': {
-      'width': 480,
-      'height': 320,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'iPhone 5',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1',
-    'viewport': {
-      'width': 320,
-      'height': 568,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'iPhone 5 landscape',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1',
-    'viewport': {
-      'width': 568,
-      'height': 320,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'iPhone 6',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
-    'viewport': {
-      'width': 375,
-      'height': 667,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'iPhone 6 landscape',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
-    'viewport': {
-      'width': 667,
-      'height': 375,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'iPhone 6 Plus',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
-    'viewport': {
-      'width': 414,
-      'height': 736,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'iPhone 6 Plus landscape',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
-    'viewport': {
-      'width': 736,
-      'height': 414,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'iPhone 7',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
-    'viewport': {
-      'width': 375,
-      'height': 667,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'iPhone 7 landscape',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
-    'viewport': {
-      'width': 667,
-      'height': 375,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'iPhone 7 Plus',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
-    'viewport': {
-      'width': 414,
-      'height': 736,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'iPhone 7 Plus landscape',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
-    'viewport': {
-      'width': 736,
-      'height': 414,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'iPhone 8',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
-    'viewport': {
-      'width': 375,
-      'height': 667,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'iPhone 8 landscape',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
-    'viewport': {
-      'width': 667,
-      'height': 375,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'iPhone 8 Plus',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
-    'viewport': {
-      'width': 414,
-      'height': 736,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'iPhone 8 Plus landscape',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
-    'viewport': {
-      'width': 736,
-      'height': 414,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'iPhone SE',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1',
-    'viewport': {
-      'width': 320,
-      'height': 568,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'iPhone SE landscape',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1',
-    'viewport': {
-      'width': 568,
-      'height': 320,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'iPhone X',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
-    'viewport': {
-      'width': 375,
-      'height': 812,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'iPhone X landscape',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
-    'viewport': {
-      'width': 812,
-      'height': 375,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'iPhone XR',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1',
-    'viewport': {
-      'width': 414,
-      'height': 896,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'iPhone XR landscape',
-    'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1',
-    'viewport': {
-      'width': 896,
-      'height': 414,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'JioPhone 2',
-    'userAgent': 'Mozilla/5.0 (Mobile; LYF/F300B/LYF-F300B-001-01-15-130718-i;Android; rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/2.5',
-    'viewport': {
-      'width': 240,
-      'height': 320,
-      'deviceScaleFactor': 1,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'JioPhone 2 landscape',
-    'userAgent': 'Mozilla/5.0 (Mobile; LYF/F300B/LYF-F300B-001-01-15-130718-i;Android; rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/2.5',
-    'viewport': {
-      'width': 320,
-      'height': 240,
-      'deviceScaleFactor': 1,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Kindle Fire HDX',
-    'userAgent': 'Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true',
-    'viewport': {
-      'width': 800,
-      'height': 1280,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Kindle Fire HDX landscape',
-    'userAgent': 'Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true',
-    'viewport': {
-      'width': 1280,
-      'height': 800,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'LG Optimus L70',
-    'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 384,
-      'height': 640,
-      'deviceScaleFactor': 1.25,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'LG Optimus L70 landscape',
-    'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 640,
-      'height': 384,
-      'deviceScaleFactor': 1.25,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Microsoft Lumia 550',
-    'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 550) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263',
-    'viewport': {
-      'width': 640,
-      'height': 360,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Microsoft Lumia 950',
-    'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263',
-    'viewport': {
-      'width': 360,
-      'height': 640,
-      'deviceScaleFactor': 4,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Microsoft Lumia 950 landscape',
-    'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263',
-    'viewport': {
-      'width': 640,
-      'height': 360,
-      'deviceScaleFactor': 4,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Nexus 10',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Safari/537.36',
-    'viewport': {
-      'width': 800,
-      'height': 1280,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Nexus 10 landscape',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Safari/537.36',
-    'viewport': {
-      'width': 1280,
-      'height': 800,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Nexus 4',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 384,
-      'height': 640,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Nexus 4 landscape',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 640,
-      'height': 384,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Nexus 5',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 360,
-      'height': 640,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Nexus 5 landscape',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 640,
-      'height': 360,
-      'deviceScaleFactor': 3,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Nexus 5X',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 412,
-      'height': 732,
-      'deviceScaleFactor': 2.625,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Nexus 5X landscape',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 732,
-      'height': 412,
-      'deviceScaleFactor': 2.625,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Nexus 6',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 412,
-      'height': 732,
-      'deviceScaleFactor': 3.5,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Nexus 6 landscape',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 732,
-      'height': 412,
-      'deviceScaleFactor': 3.5,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Nexus 6P',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 412,
-      'height': 732,
-      'deviceScaleFactor': 3.5,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Nexus 6P landscape',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 732,
-      'height': 412,
-      'deviceScaleFactor': 3.5,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Nexus 7',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Safari/537.36',
-    'viewport': {
-      'width': 600,
-      'height': 960,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Nexus 7 landscape',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Safari/537.36',
-    'viewport': {
-      'width': 960,
-      'height': 600,
-      'deviceScaleFactor': 2,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Nokia Lumia 520',
-    'userAgent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)',
-    'viewport': {
-      'width': 320,
-      'height': 533,
-      'deviceScaleFactor': 1.5,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Nokia Lumia 520 landscape',
-    'userAgent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)',
-    'viewport': {
-      'width': 533,
-      'height': 320,
-      'deviceScaleFactor': 1.5,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Nokia N9',
-    'userAgent': 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13',
-    'viewport': {
-      'width': 480,
-      'height': 854,
-      'deviceScaleFactor': 1,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Nokia N9 landscape',
-    'userAgent': 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13',
-    'viewport': {
-      'width': 854,
-      'height': 480,
-      'deviceScaleFactor': 1,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Pixel 2',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 411,
-      'height': 731,
-      'deviceScaleFactor': 2.625,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Pixel 2 landscape',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 731,
-      'height': 411,
-      'deviceScaleFactor': 2.625,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
-    }
-  },
-  {
-    'name': 'Pixel 2 XL',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 411,
-      'height': 823,
-      'deviceScaleFactor': 3.5,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': false
-    }
-  },
-  {
-    'name': 'Pixel 2 XL landscape',
-    'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
-    'viewport': {
-      'width': 823,
-      'height': 411,
-      'deviceScaleFactor': 3.5,
-      'isMobile': true,
-      'hasTouch': true,
-      'isLandscape': true
+Object.defineProperty(exports, "__esModule", { value: true });
+const devices = [
+    {
+        'name': 'Blackberry PlayBook',
+        'userAgent': 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+',
+        'viewport': {
+            'width': 600,
+            'height': 1024,
+            'deviceScaleFactor': 1,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Blackberry PlayBook landscape',
+        'userAgent': 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+',
+        'viewport': {
+            'width': 1024,
+            'height': 600,
+            'deviceScaleFactor': 1,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'BlackBerry Z30',
+        'userAgent': 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+',
+        'viewport': {
+            'width': 360,
+            'height': 640,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'BlackBerry Z30 landscape',
+        'userAgent': 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile Safari/537.10+',
+        'viewport': {
+            'width': 640,
+            'height': 360,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Galaxy Note 3',
+        'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
+        'viewport': {
+            'width': 360,
+            'height': 640,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Galaxy Note 3 landscape',
+        'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
+        'viewport': {
+            'width': 640,
+            'height': 360,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Galaxy Note II',
+        'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
+        'viewport': {
+            'width': 360,
+            'height': 640,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Galaxy Note II landscape',
+        'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
+        'viewport': {
+            'width': 640,
+            'height': 360,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Galaxy S III',
+        'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
+        'viewport': {
+            'width': 360,
+            'height': 640,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Galaxy S III landscape',
+        'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
+        'viewport': {
+            'width': 640,
+            'height': 360,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Galaxy S5',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 360,
+            'height': 640,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Galaxy S5 landscape',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 640,
+            'height': 360,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'iPad',
+        'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
+        'viewport': {
+            'width': 768,
+            'height': 1024,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'iPad landscape',
+        'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
+        'viewport': {
+            'width': 1024,
+            'height': 768,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'iPad Mini',
+        'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
+        'viewport': {
+            'width': 768,
+            'height': 1024,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'iPad Mini landscape',
+        'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
+        'viewport': {
+            'width': 1024,
+            'height': 768,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'iPad Pro',
+        'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
+        'viewport': {
+            'width': 1024,
+            'height': 1366,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'iPad Pro landscape',
+        'userAgent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
+        'viewport': {
+            'width': 1366,
+            'height': 1024,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'iPhone 4',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53',
+        'viewport': {
+            'width': 320,
+            'height': 480,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'iPhone 4 landscape',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53',
+        'viewport': {
+            'width': 480,
+            'height': 320,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'iPhone 5',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1',
+        'viewport': {
+            'width': 320,
+            'height': 568,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'iPhone 5 landscape',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1',
+        'viewport': {
+            'width': 568,
+            'height': 320,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'iPhone 6',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
+        'viewport': {
+            'width': 375,
+            'height': 667,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'iPhone 6 landscape',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
+        'viewport': {
+            'width': 667,
+            'height': 375,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'iPhone 6 Plus',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
+        'viewport': {
+            'width': 414,
+            'height': 736,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'iPhone 6 Plus landscape',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
+        'viewport': {
+            'width': 736,
+            'height': 414,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'iPhone 7',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
+        'viewport': {
+            'width': 375,
+            'height': 667,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'iPhone 7 landscape',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
+        'viewport': {
+            'width': 667,
+            'height': 375,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'iPhone 7 Plus',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
+        'viewport': {
+            'width': 414,
+            'height': 736,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'iPhone 7 Plus landscape',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
+        'viewport': {
+            'width': 736,
+            'height': 414,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'iPhone 8',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
+        'viewport': {
+            'width': 375,
+            'height': 667,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'iPhone 8 landscape',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
+        'viewport': {
+            'width': 667,
+            'height': 375,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'iPhone 8 Plus',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
+        'viewport': {
+            'width': 414,
+            'height': 736,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'iPhone 8 Plus landscape',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
+        'viewport': {
+            'width': 736,
+            'height': 414,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'iPhone SE',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1',
+        'viewport': {
+            'width': 320,
+            'height': 568,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'iPhone SE landscape',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1',
+        'viewport': {
+            'width': 568,
+            'height': 320,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'iPhone X',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
+        'viewport': {
+            'width': 375,
+            'height': 812,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'iPhone X landscape',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
+        'viewport': {
+            'width': 812,
+            'height': 375,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'iPhone XR',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1',
+        'viewport': {
+            'width': 414,
+            'height': 896,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'iPhone XR landscape',
+        'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1',
+        'viewport': {
+            'width': 896,
+            'height': 414,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'JioPhone 2',
+        'userAgent': 'Mozilla/5.0 (Mobile; LYF/F300B/LYF-F300B-001-01-15-130718-i;Android; rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/2.5',
+        'viewport': {
+            'width': 240,
+            'height': 320,
+            'deviceScaleFactor': 1,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'JioPhone 2 landscape',
+        'userAgent': 'Mozilla/5.0 (Mobile; LYF/F300B/LYF-F300B-001-01-15-130718-i;Android; rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/2.5',
+        'viewport': {
+            'width': 320,
+            'height': 240,
+            'deviceScaleFactor': 1,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Kindle Fire HDX',
+        'userAgent': 'Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true',
+        'viewport': {
+            'width': 800,
+            'height': 1280,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Kindle Fire HDX landscape',
+        'userAgent': 'Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 Safari/535.19 Silk-Accelerated=true',
+        'viewport': {
+            'width': 1280,
+            'height': 800,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'LG Optimus L70',
+        'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 384,
+            'height': 640,
+            'deviceScaleFactor': 1.25,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'LG Optimus L70 landscape',
+        'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 640,
+            'height': 384,
+            'deviceScaleFactor': 1.25,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Microsoft Lumia 550',
+        'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 550) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263',
+        'viewport': {
+            'width': 640,
+            'height': 360,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Microsoft Lumia 950',
+        'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263',
+        'viewport': {
+            'width': 360,
+            'height': 640,
+            'deviceScaleFactor': 4,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Microsoft Lumia 950 landscape',
+        'userAgent': 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263',
+        'viewport': {
+            'width': 640,
+            'height': 360,
+            'deviceScaleFactor': 4,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Nexus 10',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Safari/537.36',
+        'viewport': {
+            'width': 800,
+            'height': 1280,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Nexus 10 landscape',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Safari/537.36',
+        'viewport': {
+            'width': 1280,
+            'height': 800,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Nexus 4',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 384,
+            'height': 640,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Nexus 4 landscape',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 640,
+            'height': 384,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Nexus 5',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 360,
+            'height': 640,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Nexus 5 landscape',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 640,
+            'height': 360,
+            'deviceScaleFactor': 3,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Nexus 5X',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 412,
+            'height': 732,
+            'deviceScaleFactor': 2.625,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Nexus 5X landscape',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 732,
+            'height': 412,
+            'deviceScaleFactor': 2.625,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Nexus 6',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 412,
+            'height': 732,
+            'deviceScaleFactor': 3.5,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Nexus 6 landscape',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 732,
+            'height': 412,
+            'deviceScaleFactor': 3.5,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Nexus 6P',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 412,
+            'height': 732,
+            'deviceScaleFactor': 3.5,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Nexus 6P landscape',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 732,
+            'height': 412,
+            'deviceScaleFactor': 3.5,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Nexus 7',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Safari/537.36',
+        'viewport': {
+            'width': 600,
+            'height': 960,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Nexus 7 landscape',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Safari/537.36',
+        'viewport': {
+            'width': 960,
+            'height': 600,
+            'deviceScaleFactor': 2,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Nokia Lumia 520',
+        'userAgent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)',
+        'viewport': {
+            'width': 320,
+            'height': 533,
+            'deviceScaleFactor': 1.5,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Nokia Lumia 520 landscape',
+        'userAgent': 'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 520)',
+        'viewport': {
+            'width': 533,
+            'height': 320,
+            'deviceScaleFactor': 1.5,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Nokia N9',
+        'userAgent': 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13',
+        'viewport': {
+            'width': 480,
+            'height': 854,
+            'deviceScaleFactor': 1,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Nokia N9 landscape',
+        'userAgent': 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13',
+        'viewport': {
+            'width': 854,
+            'height': 480,
+            'deviceScaleFactor': 1,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Pixel 2',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 411,
+            'height': 731,
+            'deviceScaleFactor': 2.625,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Pixel 2 landscape',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 731,
+            'height': 411,
+            'deviceScaleFactor': 2.625,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
+    },
+    {
+        'name': 'Pixel 2 XL',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 411,
+            'height': 823,
+            'deviceScaleFactor': 3.5,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': false
+        }
+    },
+    {
+        'name': 'Pixel 2 XL landscape',
+        'userAgent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36',
+        'viewport': {
+            'width': 823,
+            'height': 411,
+            'deviceScaleFactor': 3.5,
+            'isMobile': true,
+            'hasTouch': true,
+            'isLandscape': true
+        }
     }
-  }
 ];
-for (const device of module.exports)
-  module.exports[device.name] = device;
+const devicesMap = {};
+exports.devicesMap = devicesMap;
+for (const device of devices)
+    devicesMap[device.name] = device;
diff --git a/node_modules/puppeteer/lib/Dialog.js b/node_modules/puppeteer/lib/Dialog.js
index cbdc271..45d9a35 100644
--- a/node_modules/puppeteer/lib/Dialog.js
+++ b/node_modules/puppeteer/lib/Dialog.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,71 +14,50 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-const {assert} = require('./helper');
-
+Object.defineProperty(exports, "__esModule", { value: true });
+const helper_1 = require("./helper");
+/* TODO(jacktfranklin): protocol.d.ts defines this
+ * so let's ditch this and avoid the duplication
+ */
+var DialogType;
+(function (DialogType) {
+    DialogType["Alert"] = "alert";
+    DialogType["BeforeUnload"] = "beforeunload";
+    DialogType["Confirm"] = "confirm";
+    DialogType["Prompt"] = "prompt";
+})(DialogType = exports.DialogType || (exports.DialogType = {}));
 class Dialog {
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   * @param {string} type
-   * @param {string} message
-   * @param {(string|undefined)} defaultValue
-   */
-  constructor(client, type, message, defaultValue = '') {
-    this._client = client;
-    this._type = type;
-    this._message = message;
-    this._handled = false;
-    this._defaultValue = defaultValue;
-  }
-
-  /**
-   * @return {string}
-   */
-  type() {
-    return this._type;
-  }
-
-  /**
-   * @return {string}
-   */
-  message() {
-    return this._message;
-  }
-
-  /**
-   * @return {string}
-   */
-  defaultValue() {
-    return this._defaultValue;
-  }
-
-  /**
-   * @param {string=} promptText
-   */
-  async accept(promptText) {
-    assert(!this._handled, 'Cannot accept dialog which is already handled!');
-    this._handled = true;
-    await this._client.send('Page.handleJavaScriptDialog', {
-      accept: true,
-      promptText: promptText
-    });
-  }
-
-  async dismiss() {
-    assert(!this._handled, 'Cannot dismiss dialog which is already handled!');
-    this._handled = true;
-    await this._client.send('Page.handleJavaScriptDialog', {
-      accept: false
-    });
-  }
+    constructor(client, type, message, defaultValue = '') {
+        this._handled = false;
+        this._client = client;
+        this._type = type;
+        this._message = message;
+        this._defaultValue = defaultValue;
+    }
+    type() {
+        return this._type;
+    }
+    message() {
+        return this._message;
+    }
+    defaultValue() {
+        return this._defaultValue;
+    }
+    async accept(promptText) {
+        helper_1.assert(!this._handled, 'Cannot accept dialog which is already handled!');
+        this._handled = true;
+        await this._client.send('Page.handleJavaScriptDialog', {
+            accept: true,
+            promptText: promptText
+        });
+    }
+    async dismiss() {
+        helper_1.assert(!this._handled, 'Cannot dismiss dialog which is already handled!');
+        this._handled = true;
+        await this._client.send('Page.handleJavaScriptDialog', {
+            accept: false
+        });
+    }
 }
-
-Dialog.Type = {
-  Alert: 'alert',
-  BeforeUnload: 'beforeunload',
-  Confirm: 'confirm',
-  Prompt: 'prompt'
-};
-
-module.exports = {Dialog};
+exports.Dialog = Dialog;
+Dialog.Type = DialogType;
diff --git a/node_modules/puppeteer/lib/EmulationManager.js b/node_modules/puppeteer/lib/EmulationManager.js
index 88c8a02..35b486d 100644
--- a/node_modules/puppeteer/lib/EmulationManager.js
+++ b/node_modules/puppeteer/lib/EmulationManager.js
@@ -1,54 +1,28 @@
-/**
- * Copyright 2017 Google Inc. All rights reserved.
- *
- * 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.
- */
-
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
 class EmulationManager {
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   */
-  constructor(client) {
-    this._client = client;
-    this._emulatingMobile = false;
-    this._hasTouch = false;
-  }
-
-  /**
-   * @param {!Puppeteer.Viewport} viewport
-   * @return {Promise<boolean>}
-   */
-  async emulateViewport(viewport) {
-    const mobile = viewport.isMobile || false;
-    const width = viewport.width;
-    const height = viewport.height;
-    const deviceScaleFactor = viewport.deviceScaleFactor || 1;
-    /** @type {Protocol.Emulation.ScreenOrientation} */
-    const screenOrientation = viewport.isLandscape ? { angle: 90, type: 'landscapePrimary' } : { angle: 0, type: 'portraitPrimary' };
-    const hasTouch = viewport.hasTouch || false;
-
-    await Promise.all([
-      this._client.send('Emulation.setDeviceMetricsOverride', { mobile, width, height, deviceScaleFactor, screenOrientation }),
-      this._client.send('Emulation.setTouchEmulationEnabled', {
-        enabled: hasTouch
-      })
-    ]);
-
-    const reloadNeeded = this._emulatingMobile !== mobile || this._hasTouch !== hasTouch;
-    this._emulatingMobile = mobile;
-    this._hasTouch = hasTouch;
-    return reloadNeeded;
-  }
+    constructor(client) {
+        this._emulatingMobile = false;
+        this._hasTouch = false;
+        this._client = client;
+    }
+    async emulateViewport(viewport) {
+        const mobile = viewport.isMobile || false;
+        const width = viewport.width;
+        const height = viewport.height;
+        const deviceScaleFactor = viewport.deviceScaleFactor || 1;
+        const screenOrientation = viewport.isLandscape ? { angle: 90, type: 'landscapePrimary' } : { angle: 0, type: 'portraitPrimary' };
+        const hasTouch = viewport.hasTouch || false;
+        await Promise.all([
+            this._client.send('Emulation.setDeviceMetricsOverride', { mobile, width, height, deviceScaleFactor, screenOrientation }),
+            this._client.send('Emulation.setTouchEmulationEnabled', {
+                enabled: hasTouch
+            })
+        ]);
+        const reloadNeeded = this._emulatingMobile !== mobile || this._hasTouch !== hasTouch;
+        this._emulatingMobile = mobile;
+        this._hasTouch = hasTouch;
+        return reloadNeeded;
+    }
 }
-
-module.exports = {EmulationManager};
+exports.EmulationManager = EmulationManager;
diff --git a/node_modules/puppeteer/lib/Errors.js b/node_modules/puppeteer/lib/Errors.js
index 1bcfc2d..4484b41 100644
--- a/node_modules/puppeteer/lib/Errors.js
+++ b/node_modules/puppeteer/lib/Errors.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2018 Google Inc. All rights reserved.
  *
@@ -13,17 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
+Object.defineProperty(exports, "__esModule", { value: true });
 class CustomError extends Error {
-  constructor(message) {
-    super(message);
-    this.name = this.constructor.name;
-    Error.captureStackTrace(this, this.constructor);
-  }
+    constructor(message) {
+        super(message);
+        this.name = this.constructor.name;
+        Error.captureStackTrace(this, this.constructor);
+    }
 }
-
-class TimeoutError extends CustomError {}
-
-module.exports = {
-  TimeoutError,
+class TimeoutError extends CustomError {
+}
+exports.TimeoutError = TimeoutError;
+exports.puppeteerErrors = {
+    TimeoutError,
 };
diff --git a/node_modules/puppeteer/lib/Events.js b/node_modules/puppeteer/lib/Events.js
index c994de5..1c31550 100644
--- a/node_modules/puppeteer/lib/Events.js
+++ b/node_modules/puppeteer/lib/Events.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2019 Google Inc. All rights reserved.
  *
@@ -13,68 +14,60 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-const Events = {
-  Page: {
-    Close: 'close',
-    Console: 'console',
-    Dialog: 'dialog',
-    DOMContentLoaded: 'domcontentloaded',
-    Error: 'error',
-    // Can't use just 'error' due to node.js special treatment of error events.
-    // @see https://nodejs.org/api/events.html#events_error_events
-    PageError: 'pageerror',
-    Request: 'request',
-    Response: 'response',
-    RequestFailed: 'requestfailed',
-    RequestFinished: 'requestfinished',
-    FrameAttached: 'frameattached',
-    FrameDetached: 'framedetached',
-    FrameNavigated: 'framenavigated',
-    Load: 'load',
-    Metrics: 'metrics',
-    Popup: 'popup',
-    WorkerCreated: 'workercreated',
-    WorkerDestroyed: 'workerdestroyed',
-  },
-
-  Browser: {
-    TargetCreated: 'targetcreated',
-    TargetDestroyed: 'targetdestroyed',
-    TargetChanged: 'targetchanged',
-    Disconnected: 'disconnected'
-  },
-
-  BrowserContext: {
-    TargetCreated: 'targetcreated',
-    TargetDestroyed: 'targetdestroyed',
-    TargetChanged: 'targetchanged',
-  },
-
-  NetworkManager: {
-    Request: Symbol('Events.NetworkManager.Request'),
-    Response: Symbol('Events.NetworkManager.Response'),
-    RequestFailed: Symbol('Events.NetworkManager.RequestFailed'),
-    RequestFinished: Symbol('Events.NetworkManager.RequestFinished'),
-  },
-
-  FrameManager: {
-    FrameAttached: Symbol('Events.FrameManager.FrameAttached'),
-    FrameNavigated: Symbol('Events.FrameManager.FrameNavigated'),
-    FrameDetached: Symbol('Events.FrameManager.FrameDetached'),
-    LifecycleEvent: Symbol('Events.FrameManager.LifecycleEvent'),
-    FrameNavigatedWithinDocument: Symbol('Events.FrameManager.FrameNavigatedWithinDocument'),
-    ExecutionContextCreated: Symbol('Events.FrameManager.ExecutionContextCreated'),
-    ExecutionContextDestroyed: Symbol('Events.FrameManager.ExecutionContextDestroyed'),
-  },
-
-  Connection: {
-    Disconnected: Symbol('Events.Connection.Disconnected'),
-  },
-
-  CDPSession: {
-    Disconnected: Symbol('Events.CDPSession.Disconnected'),
-  },
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Events = {
+    Page: {
+        Close: 'close',
+        Console: 'console',
+        Dialog: 'dialog',
+        DOMContentLoaded: 'domcontentloaded',
+        Error: 'error',
+        // Can't use just 'error' due to node.js special treatment of error events.
+        // @see https://nodejs.org/api/events.html#events_error_events
+        PageError: 'pageerror',
+        Request: 'request',
+        Response: 'response',
+        RequestFailed: 'requestfailed',
+        RequestFinished: 'requestfinished',
+        FrameAttached: 'frameattached',
+        FrameDetached: 'framedetached',
+        FrameNavigated: 'framenavigated',
+        Load: 'load',
+        Metrics: 'metrics',
+        Popup: 'popup',
+        WorkerCreated: 'workercreated',
+        WorkerDestroyed: 'workerdestroyed',
+    },
+    Browser: {
+        TargetCreated: 'targetcreated',
+        TargetDestroyed: 'targetdestroyed',
+        TargetChanged: 'targetchanged',
+        Disconnected: 'disconnected'
+    },
+    BrowserContext: {
+        TargetCreated: 'targetcreated',
+        TargetDestroyed: 'targetdestroyed',
+        TargetChanged: 'targetchanged',
+    },
+    NetworkManager: {
+        Request: Symbol('Events.NetworkManager.Request'),
+        Response: Symbol('Events.NetworkManager.Response'),
+        RequestFailed: Symbol('Events.NetworkManager.RequestFailed'),
+        RequestFinished: Symbol('Events.NetworkManager.RequestFinished'),
+    },
+    FrameManager: {
+        FrameAttached: Symbol('Events.FrameManager.FrameAttached'),
+        FrameNavigated: Symbol('Events.FrameManager.FrameNavigated'),
+        FrameDetached: Symbol('Events.FrameManager.FrameDetached'),
+        LifecycleEvent: Symbol('Events.FrameManager.LifecycleEvent'),
+        FrameNavigatedWithinDocument: Symbol('Events.FrameManager.FrameNavigatedWithinDocument'),
+        ExecutionContextCreated: Symbol('Events.FrameManager.ExecutionContextCreated'),
+        ExecutionContextDestroyed: Symbol('Events.FrameManager.ExecutionContextDestroyed'),
+    },
+    Connection: {
+        Disconnected: Symbol('Events.Connection.Disconnected'),
+    },
+    CDPSession: {
+        Disconnected: Symbol('Events.CDPSession.Disconnected'),
+    },
 };
-
-module.exports = { Events };
diff --git a/node_modules/puppeteer/lib/ExecutionContext.js b/node_modules/puppeteer/lib/ExecutionContext.js
index d66c0d7..5a9d73a 100644
--- a/node_modules/puppeteer/lib/ExecutionContext.js
+++ b/node_modules/puppeteer/lib/ExecutionContext.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,191 +14,146 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-const {helper, assert} = require('./helper');
-const {createJSHandle, JSHandle} = require('./JSHandle');
-
-const EVALUATION_SCRIPT_URL = '__puppeteer_evaluation_script__';
+Object.defineProperty(exports, "__esModule", { value: true });
+const helper_1 = require("./helper");
+const JSHandle_1 = require("./JSHandle");
+exports.EVALUATION_SCRIPT_URL = '__puppeteer_evaluation_script__';
 const SOURCE_URL_REGEX = /^[\040\t]*\/\/[@#] sourceURL=\s*(\S*?)\s*$/m;
-
 class ExecutionContext {
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   * @param {!Protocol.Runtime.ExecutionContextDescription} contextPayload
-   * @param {?Puppeteer.DOMWorld} world
-   */
-  constructor(client, contextPayload, world) {
-    this._client = client;
-    this._world = world;
-    this._contextId = contextPayload.id;
-  }
-
-  /**
-   * @return {?Puppeteer.Frame}
-   */
-  frame() {
-    return this._world ? this._world.frame() : null;
-  }
-
-  /**
-   * @param {Function|string} pageFunction
-   * @param {...*} args
-   * @return {!Promise<*>}
-   */
-  async evaluate(pageFunction, ...args) {
-    return await this._evaluateInternal(true /* returnByValue */, pageFunction, ...args);
-  }
-
-  /**
-   * @param {Function|string} pageFunction
-   * @param {...*} args
-   * @return {!Promise<!JSHandle>}
-   */
-  async evaluateHandle(pageFunction, ...args) {
-    return this._evaluateInternal(false /* returnByValue */, pageFunction, ...args);
-  }
-
-  /**
-   * @param {boolean} returnByValue
-   * @param {Function|string} pageFunction
-   * @param {...*} args
-   * @return {!Promise<*>}
-   */
-  async _evaluateInternal(returnByValue, pageFunction, ...args) {
-    const suffix = `//# sourceURL=${EVALUATION_SCRIPT_URL}`;
-
-    if (helper.isString(pageFunction)) {
-      const contextId = this._contextId;
-      const expression = /** @type {string} */ (pageFunction);
-      const expressionWithSourceUrl = SOURCE_URL_REGEX.test(expression) ? expression : expression + '\n' + suffix;
-      const {exceptionDetails, result: remoteObject} = await this._client.send('Runtime.evaluate', {
-        expression: expressionWithSourceUrl,
-        contextId,
-        returnByValue,
-        awaitPromise: true,
-        userGesture: true
-      }).catch(rewriteError);
-      if (exceptionDetails)
-        throw new Error('Evaluation failed: ' + helper.getExceptionMessage(exceptionDetails));
-      return returnByValue ? helper.valueFromRemoteObject(remoteObject) : createJSHandle(this, remoteObject);
+    constructor(client, contextPayload, world) {
+        this._client = client;
+        this._world = world;
+        this._contextId = contextPayload.id;
     }
-
-    if (typeof pageFunction !== 'function')
-      throw new Error(`Expected to get |string| or |function| as the first argument, but got "${pageFunction}" instead.`);
-
-    let functionText = pageFunction.toString();
-    try {
-      new Function('(' + functionText + ')');
-    } catch (e1) {
-      // This means we might have a function shorthand. Try another
-      // time prefixing 'function '.
-      if (functionText.startsWith('async '))
-        functionText = 'async function ' + functionText.substring('async '.length);
-      else
-        functionText = 'function ' + functionText;
-      try {
-        new Function('(' + functionText  + ')');
-      } catch (e2) {
-        // We tried hard to serialize, but there's a weird beast here.
-        throw new Error('Passed function is not well-serializable!');
-      }
+    frame() {
+        return this._world ? this._world.frame() : null;
     }
-    let callFunctionOnPromise;
-    try {
-      callFunctionOnPromise = this._client.send('Runtime.callFunctionOn', {
-        functionDeclaration: functionText + '\n' + suffix + '\n',
-        executionContextId: this._contextId,
-        arguments: args.map(convertArgument.bind(this)),
-        returnByValue,
-        awaitPromise: true,
-        userGesture: true
-      });
-    } catch (err) {
-      if (err instanceof TypeError && err.message.startsWith('Converting circular structure to JSON'))
-        err.message += ' Are you passing a nested JSHandle?';
-      throw err;
+    async evaluate(pageFunction, ...args) {
+        return await this._evaluateInternal(true, pageFunction, ...args);
     }
-    const { exceptionDetails, result: remoteObject } = await callFunctionOnPromise.catch(rewriteError);
-    if (exceptionDetails)
-      throw new Error('Evaluation failed: ' + helper.getExceptionMessage(exceptionDetails));
-    return returnByValue ? helper.valueFromRemoteObject(remoteObject) : createJSHandle(this, remoteObject);
-
-    /**
-     * @param {*} arg
-     * @return {*}
-     * @this {ExecutionContext}
-     */
-    function convertArgument(arg) {
-      if (typeof arg === 'bigint') // eslint-disable-line valid-typeof
-        return { unserializableValue: `${arg.toString()}n` };
-      if (Object.is(arg, -0))
-        return { unserializableValue: '-0' };
-      if (Object.is(arg, Infinity))
-        return { unserializableValue: 'Infinity' };
-      if (Object.is(arg, -Infinity))
-        return { unserializableValue: '-Infinity' };
-      if (Object.is(arg, NaN))
-        return { unserializableValue: 'NaN' };
-      const objectHandle = arg && (arg instanceof JSHandle) ? arg : null;
-      if (objectHandle) {
-        if (objectHandle._context !== this)
-          throw new Error('JSHandles can be evaluated only in the context they were created!');
-        if (objectHandle._disposed)
-          throw new Error('JSHandle is disposed!');
-        if (objectHandle._remoteObject.unserializableValue)
-          return { unserializableValue: objectHandle._remoteObject.unserializableValue };
-        if (!objectHandle._remoteObject.objectId)
-          return { value: objectHandle._remoteObject.value };
-        return { objectId: objectHandle._remoteObject.objectId };
-      }
-      return { value: arg };
+    async evaluateHandle(pageFunction, ...args) {
+        return this._evaluateInternal(false, pageFunction, ...args);
     }
-
-    /**
-     * @param {!Error} error
-     * @return {!Protocol.Runtime.evaluateReturnValue}
-     */
-    function rewriteError(error) {
-      if (error.message.includes('Object reference chain is too long'))
-        return {result: {type: 'undefined'}};
-      if (error.message.includes('Object couldn\'t be returned by value'))
-        return {result: {type: 'undefined'}};
-
-      if (error.message.endsWith('Cannot find context with specified id') || error.message.endsWith('Inspected target navigated or closed'))
-        throw new Error('Execution context was destroyed, most likely because of a navigation.');
-      throw error;
+    async _evaluateInternal(returnByValue, pageFunction, ...args) {
+        const suffix = `//# sourceURL=${exports.EVALUATION_SCRIPT_URL}`;
+        if (helper_1.helper.isString(pageFunction)) {
+            const contextId = this._contextId;
+            const expression = pageFunction;
+            const expressionWithSourceUrl = SOURCE_URL_REGEX.test(expression) ? expression : expression + '\n' + suffix;
+            const { exceptionDetails, result: remoteObject } = await this._client.send('Runtime.evaluate', {
+                expression: expressionWithSourceUrl,
+                contextId,
+                returnByValue,
+                awaitPromise: true,
+                userGesture: true
+            }).catch(rewriteError);
+            if (exceptionDetails)
+                throw new Error('Evaluation failed: ' + helper_1.helper.getExceptionMessage(exceptionDetails));
+            return returnByValue ? helper_1.helper.valueFromRemoteObject(remoteObject) : JSHandle_1.createJSHandle(this, remoteObject);
+        }
+        if (typeof pageFunction !== 'function')
+            throw new Error(`Expected to get |string| or |function| as the first argument, but got "${pageFunction}" instead.`);
+        let functionText = pageFunction.toString();
+        try {
+            new Function('(' + functionText + ')');
+        }
+        catch (error) {
+            // This means we might have a function shorthand. Try another
+            // time prefixing 'function '.
+            if (functionText.startsWith('async '))
+                functionText = 'async function ' + functionText.substring('async '.length);
+            else
+                functionText = 'function ' + functionText;
+            try {
+                new Function('(' + functionText + ')');
+            }
+            catch (error) {
+                // We tried hard to serialize, but there's a weird beast here.
+                throw new Error('Passed function is not well-serializable!');
+            }
+        }
+        let callFunctionOnPromise;
+        try {
+            callFunctionOnPromise = this._client.send('Runtime.callFunctionOn', {
+                functionDeclaration: functionText + '\n' + suffix + '\n',
+                executionContextId: this._contextId,
+                arguments: args.map(convertArgument.bind(this)),
+                returnByValue,
+                awaitPromise: true,
+                userGesture: true
+            });
+        }
+        catch (error) {
+            if (error instanceof TypeError && error.message.startsWith('Converting circular structure to JSON'))
+                error.message += ' Are you passing a nested JSHandle?';
+            throw error;
+        }
+        const { exceptionDetails, result: remoteObject } = await callFunctionOnPromise.catch(rewriteError);
+        if (exceptionDetails)
+            throw new Error('Evaluation failed: ' + helper_1.helper.getExceptionMessage(exceptionDetails));
+        return returnByValue ? helper_1.helper.valueFromRemoteObject(remoteObject) : JSHandle_1.createJSHandle(this, remoteObject);
+        /**
+         * @param {*} arg
+         * @return {*}
+         * @this {ExecutionContext}
+         */
+        function convertArgument(arg) {
+            if (typeof arg === 'bigint') // eslint-disable-line valid-typeof
+                return { unserializableValue: `${arg.toString()}n` };
+            if (Object.is(arg, -0))
+                return { unserializableValue: '-0' };
+            if (Object.is(arg, Infinity))
+                return { unserializableValue: 'Infinity' };
+            if (Object.is(arg, -Infinity))
+                return { unserializableValue: '-Infinity' };
+            if (Object.is(arg, NaN))
+                return { unserializableValue: 'NaN' };
+            const objectHandle = arg && (arg instanceof JSHandle_1.JSHandle) ? arg : null;
+            if (objectHandle) {
+                if (objectHandle._context !== this)
+                    throw new Error('JSHandles can be evaluated only in the context they were created!');
+                if (objectHandle._disposed)
+                    throw new Error('JSHandle is disposed!');
+                if (objectHandle._remoteObject.unserializableValue)
+                    return { unserializableValue: objectHandle._remoteObject.unserializableValue };
+                if (!objectHandle._remoteObject.objectId)
+                    return { value: objectHandle._remoteObject.value };
+                return { objectId: objectHandle._remoteObject.objectId };
+            }
+            return { value: arg };
+        }
+        function rewriteError(error) {
+            if (error.message.includes('Object reference chain is too long'))
+                return { result: { type: 'undefined' } };
+            if (error.message.includes('Object couldn\'t be returned by value'))
+                return { result: { type: 'undefined' } };
+            if (error.message.endsWith('Cannot find context with specified id') || error.message.endsWith('Inspected target navigated or closed'))
+                throw new Error('Execution context was destroyed, most likely because of a navigation.');
+            throw error;
+        }
     }
-  }
-
-  /**
-   * @param {!JSHandle} prototypeHandle
-   * @return {!Promise<!JSHandle>}
-   */
-  async queryObjects(prototypeHandle) {
-    assert(!prototypeHandle._disposed, 'Prototype JSHandle is disposed!');
-    assert(prototypeHandle._remoteObject.objectId, 'Prototype JSHandle must not be referencing primitive value');
-    const response = await this._client.send('Runtime.queryObjects', {
-      prototypeObjectId: prototypeHandle._remoteObject.objectId
-    });
-    return createJSHandle(this, response.objects);
-  }
-
-  /**
-   * @param {Puppeteer.ElementHandle} elementHandle
-   * @return {Promise<Puppeteer.ElementHandle>}
-   */
-  async _adoptElementHandle(elementHandle) {
-    assert(elementHandle.executionContext() !== this, 'Cannot adopt handle that already belongs to this execution context');
-    assert(this._world, 'Cannot adopt handle without DOMWorld');
-    const nodeInfo = await this._client.send('DOM.describeNode', {
-      objectId: elementHandle._remoteObject.objectId,
-    });
-    const {object} = await this._client.send('DOM.resolveNode', {
-      backendNodeId: nodeInfo.node.backendNodeId,
-      executionContextId: this._contextId,
-    });
-    return /** @type {Puppeteer.ElementHandle}*/(createJSHandle(this, object));
-  }
+    async queryObjects(prototypeHandle) {
+        helper_1.assert(!prototypeHandle._disposed, 'Prototype JSHandle is disposed!');
+        helper_1.assert(prototypeHandle._remoteObject.objectId, 'Prototype JSHandle must not be referencing primitive value');
+        const response = await this._client.send('Runtime.queryObjects', {
+            prototypeObjectId: prototypeHandle._remoteObject.objectId
+        });
+        return JSHandle_1.createJSHandle(this, response.objects);
+    }
+    async _adoptBackendNodeId(backendNodeId) {
+        const { object } = await this._client.send('DOM.resolveNode', {
+            backendNodeId: backendNodeId,
+            executionContextId: this._contextId,
+        });
+        return JSHandle_1.createJSHandle(this, object);
+    }
+    async _adoptElementHandle(elementHandle) {
+        helper_1.assert(elementHandle.executionContext() !== this, 'Cannot adopt handle that already belongs to this execution context');
+        helper_1.assert(this._world, 'Cannot adopt handle without DOMWorld');
+        const nodeInfo = await this._client.send('DOM.describeNode', {
+            objectId: elementHandle._remoteObject.objectId,
+        });
+        return this._adoptBackendNodeId(nodeInfo.node.backendNodeId);
+    }
 }
-
-module.exports = {ExecutionContext, EVALUATION_SCRIPT_URL};
+exports.ExecutionContext = ExecutionContext;
diff --git a/node_modules/puppeteer/lib/FrameManager.js b/node_modules/puppeteer/lib/FrameManager.js
index fea03dc..157f876 100644
--- a/node_modules/puppeteer/lib/FrameManager.js
+++ b/node_modules/puppeteer/lib/FrameManager.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,705 +14,410 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-const EventEmitter = require('events');
-const {helper, assert, debugError} = require('./helper');
-const {Events} = require('./Events');
-const {ExecutionContext, EVALUATION_SCRIPT_URL} = require('./ExecutionContext');
-const {LifecycleWatcher} = require('./LifecycleWatcher');
-const {DOMWorld} = require('./DOMWorld');
-const {NetworkManager} = require('./NetworkManager');
-
+Object.defineProperty(exports, "__esModule", { value: true });
+const EventEmitter = require("events");
+const helper_1 = require("./helper");
+const Events_1 = require("./Events");
+const ExecutionContext_1 = require("./ExecutionContext");
+const LifecycleWatcher_1 = require("./LifecycleWatcher");
+const DOMWorld_1 = require("./DOMWorld");
+const NetworkManager_1 = require("./NetworkManager");
 const UTILITY_WORLD_NAME = '__puppeteer_utility_world__';
-
 class FrameManager extends EventEmitter {
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   * @param {!Puppeteer.Page} page
-   * @param {boolean} ignoreHTTPSErrors
-   * @param {!Puppeteer.TimeoutSettings} timeoutSettings
-   */
-  constructor(client, page, ignoreHTTPSErrors, timeoutSettings) {
-    super();
-    this._client = client;
-    this._page = page;
-    this._networkManager = new NetworkManager(client, ignoreHTTPSErrors, this);
-    this._timeoutSettings = timeoutSettings;
-    /** @type {!Map<string, !Frame>} */
-    this._frames = new Map();
-    /** @type {!Map<number, !ExecutionContext>} */
-    this._contextIdToContext = new Map();
-    /** @type {!Set<string>} */
-    this._isolatedWorlds = new Set();
-
-    this._client.on('Page.frameAttached', event => this._onFrameAttached(event.frameId, event.parentFrameId));
-    this._client.on('Page.frameNavigated', event => this._onFrameNavigated(event.frame));
-    this._client.on('Page.navigatedWithinDocument', event => this._onFrameNavigatedWithinDocument(event.frameId, event.url));
-    this._client.on('Page.frameDetached', event => this._onFrameDetached(event.frameId));
-    this._client.on('Page.frameStoppedLoading', event => this._onFrameStoppedLoading(event.frameId));
-    this._client.on('Runtime.executionContextCreated', event => this._onExecutionContextCreated(event.context));
-    this._client.on('Runtime.executionContextDestroyed', event => this._onExecutionContextDestroyed(event.executionContextId));
-    this._client.on('Runtime.executionContextsCleared', event => this._onExecutionContextsCleared());
-    this._client.on('Page.lifecycleEvent', event => this._onLifecycleEvent(event));
-  }
-
-  async initialize() {
-    const [,{frameTree}] = await Promise.all([
-      this._client.send('Page.enable'),
-      this._client.send('Page.getFrameTree'),
-    ]);
-    this._handleFrameTree(frameTree);
-    await Promise.all([
-      this._client.send('Page.setLifecycleEventsEnabled', { enabled: true }),
-      this._client.send('Runtime.enable', {}).then(() => this._ensureIsolatedWorld(UTILITY_WORLD_NAME)),
-      this._networkManager.initialize(),
-    ]);
-  }
-
-  /**
-   * @return {!NetworkManager}
-   */
-  networkManager() {
-    return this._networkManager;
-  }
-
-  /**
-   * @param {!Puppeteer.Frame} frame
-   * @param {string} url
-   * @param {!{referer?: string, timeout?: number, waitUntil?: string|!Array<string>}=} options
-   * @return {!Promise<?Puppeteer.Response>}
-   */
-  async navigateFrame(frame, url, options = {}) {
-    assertNoLegacyNavigationOptions(options);
-    const {
-      referer = this._networkManager.extraHTTPHeaders()['referer'],
-      waitUntil = ['load'],
-      timeout = this._timeoutSettings.navigationTimeout(),
-    } = options;
-
-    const watcher = new LifecycleWatcher(this, frame, waitUntil, timeout);
-    let ensureNewDocumentNavigation = false;
-    let error = await Promise.race([
-      navigate(this._client, url, referer, frame._id),
-      watcher.timeoutOrTerminationPromise(),
-    ]);
-    if (!error) {
-      error = await Promise.race([
-        watcher.timeoutOrTerminationPromise(),
-        ensureNewDocumentNavigation ? watcher.newDocumentNavigationPromise() : watcher.sameDocumentNavigationPromise(),
-      ]);
+    constructor(client, page, ignoreHTTPSErrors, timeoutSettings) {
+        super();
+        this._frames = new Map();
+        this._contextIdToContext = new Map();
+        this._isolatedWorlds = new Set();
+        this._client = client;
+        this._page = page;
+        this._networkManager = new NetworkManager_1.NetworkManager(client, ignoreHTTPSErrors, this);
+        this._timeoutSettings = timeoutSettings;
+        this._client.on('Page.frameAttached', event => this._onFrameAttached(event.frameId, event.parentFrameId));
+        this._client.on('Page.frameNavigated', event => this._onFrameNavigated(event.frame));
+        this._client.on('Page.navigatedWithinDocument', event => this._onFrameNavigatedWithinDocument(event.frameId, event.url));
+        this._client.on('Page.frameDetached', event => this._onFrameDetached(event.frameId));
+        this._client.on('Page.frameStoppedLoading', event => this._onFrameStoppedLoading(event.frameId));
+        this._client.on('Runtime.executionContextCreated', event => this._onExecutionContextCreated(event.context));
+        this._client.on('Runtime.executionContextDestroyed', event => this._onExecutionContextDestroyed(event.executionContextId));
+        this._client.on('Runtime.executionContextsCleared', () => this._onExecutionContextsCleared());
+        this._client.on('Page.lifecycleEvent', event => this._onLifecycleEvent(event));
     }
-    watcher.dispose();
-    if (error)
-      throw error;
-    return watcher.navigationResponse();
-
+    async initialize() {
+        const result = await Promise.all([
+            this._client.send('Page.enable'),
+            this._client.send('Page.getFrameTree'),
+        ]);
+        const { frameTree } = result[1];
+        this._handleFrameTree(frameTree);
+        await Promise.all([
+            this._client.send('Page.setLifecycleEventsEnabled', { enabled: true }),
+            this._client.send('Runtime.enable', {}).then(() => this._ensureIsolatedWorld(UTILITY_WORLD_NAME)),
+            this._networkManager.initialize(),
+        ]);
+    }
+    networkManager() {
+        return this._networkManager;
+    }
+    async navigateFrame(frame, url, options = {}) {
+        assertNoLegacyNavigationOptions(options);
+        const { referer = this._networkManager.extraHTTPHeaders()['referer'], waitUntil = ['load'], timeout = this._timeoutSettings.navigationTimeout(), } = options;
+        const watcher = new LifecycleWatcher_1.LifecycleWatcher(this, frame, waitUntil, timeout);
+        let ensureNewDocumentNavigation = false;
+        let error = await Promise.race([
+            navigate(this._client, url, referer, frame._id),
+            watcher.timeoutOrTerminationPromise(),
+        ]);
+        if (!error) {
+            error = await Promise.race([
+                watcher.timeoutOrTerminationPromise(),
+                ensureNewDocumentNavigation ? watcher.newDocumentNavigationPromise() : watcher.sameDocumentNavigationPromise(),
+            ]);
+        }
+        watcher.dispose();
+        if (error)
+            throw error;
+        return watcher.navigationResponse();
+        async function navigate(client, url, referrer, frameId) {
+            try {
+                const response = await client.send('Page.navigate', { url, referrer, frameId });
+                ensureNewDocumentNavigation = !!response.loaderId;
+                return response.errorText ? new Error(`${response.errorText} at ${url}`) : null;
+            }
+            catch (error) {
+                return error;
+            }
+        }
+    }
+    async waitForFrameNavigation(frame, options = {}) {
+        assertNoLegacyNavigationOptions(options);
+        const { waitUntil = ['load'], timeout = this._timeoutSettings.navigationTimeout(), } = options;
+        const watcher = new LifecycleWatcher_1.LifecycleWatcher(this, frame, waitUntil, timeout);
+        const error = await Promise.race([
+            watcher.timeoutOrTerminationPromise(),
+            watcher.sameDocumentNavigationPromise(),
+            watcher.newDocumentNavigationPromise()
+        ]);
+        watcher.dispose();
+        if (error)
+            throw error;
+        return watcher.navigationResponse();
+    }
+    _onLifecycleEvent(event) {
+        const frame = this._frames.get(event.frameId);
+        if (!frame)
+            return;
+        frame._onLifecycleEvent(event.loaderId, event.name);
+        this.emit(Events_1.Events.FrameManager.LifecycleEvent, frame);
+    }
+    _onFrameStoppedLoading(frameId) {
+        const frame = this._frames.get(frameId);
+        if (!frame)
+            return;
+        frame._onLoadingStopped();
+        this.emit(Events_1.Events.FrameManager.LifecycleEvent, frame);
+    }
+    _handleFrameTree(frameTree) {
+        if (frameTree.frame.parentId)
+            this._onFrameAttached(frameTree.frame.id, frameTree.frame.parentId);
+        this._onFrameNavigated(frameTree.frame);
+        if (!frameTree.childFrames)
+            return;
+        for (const child of frameTree.childFrames)
+            this._handleFrameTree(child);
+    }
+    page() {
+        return this._page;
+    }
+    mainFrame() {
+        return this._mainFrame;
+    }
+    frames() {
+        return Array.from(this._frames.values());
+    }
+    frame(frameId) {
+        return this._frames.get(frameId) || null;
+    }
+    _onFrameAttached(frameId, parentFrameId) {
+        if (this._frames.has(frameId))
+            return;
+        helper_1.assert(parentFrameId);
+        const parentFrame = this._frames.get(parentFrameId);
+        const frame = new Frame(this, this._client, parentFrame, frameId);
+        this._frames.set(frame._id, frame);
+        this.emit(Events_1.Events.FrameManager.FrameAttached, frame);
+    }
+    _onFrameNavigated(framePayload) {
+        const isMainFrame = !framePayload.parentId;
+        let frame = isMainFrame ? this._mainFrame : this._frames.get(framePayload.id);
+        helper_1.assert(isMainFrame || frame, 'We either navigate top level or have old version of the navigated frame');
+        // Detach all child frames first.
+        if (frame) {
+            for (const child of frame.childFrames())
+                this._removeFramesRecursively(child);
+        }
+        // Update or create main frame.
+        if (isMainFrame) {
+            if (frame) {
+                // Update frame id to retain frame identity on cross-process navigation.
+                this._frames.delete(frame._id);
+                frame._id = framePayload.id;
+            }
+            else {
+                // Initial main frame navigation.
+                frame = new Frame(this, this._client, null, framePayload.id);
+            }
+            this._frames.set(framePayload.id, frame);
+            this._mainFrame = frame;
+        }
+        // Update frame payload.
+        frame._navigated(framePayload);
+        this.emit(Events_1.Events.FrameManager.FrameNavigated, frame);
+    }
+    async _ensureIsolatedWorld(name) {
+        if (this._isolatedWorlds.has(name))
+            return;
+        this._isolatedWorlds.add(name);
+        await this._client.send('Page.addScriptToEvaluateOnNewDocument', {
+            source: `//# sourceURL=${ExecutionContext_1.EVALUATION_SCRIPT_URL}`,
+            worldName: name,
+        }),
+            await Promise.all(this.frames().map(frame => this._client.send('Page.createIsolatedWorld', {
+                frameId: frame._id,
+                grantUniveralAccess: true,
+                worldName: name,
+            }).catch(helper_1.debugError))); // frames might be removed before we send this
+    }
+    _onFrameNavigatedWithinDocument(frameId, url) {
+        const frame = this._frames.get(frameId);
+        if (!frame)
+            return;
+        frame._navigatedWithinDocument(url);
+        this.emit(Events_1.Events.FrameManager.FrameNavigatedWithinDocument, frame);
+        this.emit(Events_1.Events.FrameManager.FrameNavigated, frame);
+    }
+    _onFrameDetached(frameId) {
+        const frame = this._frames.get(frameId);
+        if (frame)
+            this._removeFramesRecursively(frame);
+    }
+    _onExecutionContextCreated(contextPayload) {
+        const auxData = contextPayload.auxData;
+        const frameId = auxData ? auxData.frameId : null;
+        const frame = this._frames.get(frameId) || null;
+        let world = null;
+        if (frame) {
+            if (contextPayload.auxData && !!contextPayload.auxData['isDefault']) {
+                world = frame._mainWorld;
+            }
+            else if (contextPayload.name === UTILITY_WORLD_NAME && !frame._secondaryWorld._hasContext()) {
+                // In case of multiple sessions to the same target, there's a race between
+                // connections so we might end up creating multiple isolated worlds.
+                // We can use either.
+                world = frame._secondaryWorld;
+            }
+        }
+        if (contextPayload.auxData && contextPayload.auxData['type'] === 'isolated')
+            this._isolatedWorlds.add(contextPayload.name);
+        const context = new ExecutionContext_1.ExecutionContext(this._client, contextPayload, world);
+        if (world)
+            world._setContext(context);
+        this._contextIdToContext.set(contextPayload.id, context);
+    }
     /**
-     * @param {!Puppeteer.CDPSession} client
-     * @param {string} url
-     * @param {string} referrer
-     * @param {string} frameId
-     * @return {!Promise<?Error>}
+     * @param {number} executionContextId
      */
-    async function navigate(client, url, referrer, frameId) {
-      try {
-        const response = await client.send('Page.navigate', {url, referrer, frameId});
-        ensureNewDocumentNavigation = !!response.loaderId;
-        return response.errorText ? new Error(`${response.errorText} at ${url}`) : null;
-      } catch (error) {
-        return error;
-      }
+    _onExecutionContextDestroyed(executionContextId) {
+        const context = this._contextIdToContext.get(executionContextId);
+        if (!context)
+            return;
+        this._contextIdToContext.delete(executionContextId);
+        if (context._world)
+            context._world._setContext(null);
     }
-  }
-
-  /**
-   * @param {!Puppeteer.Frame} frame
-   * @param {!{timeout?: number, waitUntil?: string|!Array<string>}=} options
-   * @return {!Promise<?Puppeteer.Response>}
-   */
-  async waitForFrameNavigation(frame, options = {}) {
-    assertNoLegacyNavigationOptions(options);
-    const {
-      waitUntil = ['load'],
-      timeout = this._timeoutSettings.navigationTimeout(),
-    } = options;
-    const watcher = new LifecycleWatcher(this, frame, waitUntil, timeout);
-    const error = await Promise.race([
-      watcher.timeoutOrTerminationPromise(),
-      watcher.sameDocumentNavigationPromise(),
-      watcher.newDocumentNavigationPromise()
-    ]);
-    watcher.dispose();
-    if (error)
-      throw error;
-    return watcher.navigationResponse();
-  }
-
-  /**
-   * @param {!Protocol.Page.lifecycleEventPayload} event
-   */
-  _onLifecycleEvent(event) {
-    const frame = this._frames.get(event.frameId);
-    if (!frame)
-      return;
-    frame._onLifecycleEvent(event.loaderId, event.name);
-    this.emit(Events.FrameManager.LifecycleEvent, frame);
-  }
-
-  /**
-   * @param {string} frameId
-   */
-  _onFrameStoppedLoading(frameId) {
-    const frame = this._frames.get(frameId);
-    if (!frame)
-      return;
-    frame._onLoadingStopped();
-    this.emit(Events.FrameManager.LifecycleEvent, frame);
-  }
-
-  /**
-   * @param {!Protocol.Page.FrameTree} frameTree
-   */
-  _handleFrameTree(frameTree) {
-    if (frameTree.frame.parentId)
-      this._onFrameAttached(frameTree.frame.id, frameTree.frame.parentId);
-    this._onFrameNavigated(frameTree.frame);
-    if (!frameTree.childFrames)
-      return;
-
-    for (const child of frameTree.childFrames)
-      this._handleFrameTree(child);
-  }
-
-  /**
-   * @return {!Puppeteer.Page}
-   */
-  page() {
-    return this._page;
-  }
-
-  /**
-   * @return {!Frame}
-   */
-  mainFrame() {
-    return this._mainFrame;
-  }
-
-  /**
-   * @return {!Array<!Frame>}
-   */
-  frames() {
-    return Array.from(this._frames.values());
-  }
-
-  /**
-   * @param {!string} frameId
-   * @return {?Frame}
-   */
-  frame(frameId) {
-    return this._frames.get(frameId) || null;
-  }
-
-  /**
-   * @param {string} frameId
-   * @param {?string} parentFrameId
-   */
-  _onFrameAttached(frameId, parentFrameId) {
-    if (this._frames.has(frameId))
-      return;
-    assert(parentFrameId);
-    const parentFrame = this._frames.get(parentFrameId);
-    const frame = new Frame(this, this._client, parentFrame, frameId);
-    this._frames.set(frame._id, frame);
-    this.emit(Events.FrameManager.FrameAttached, frame);
-  }
-
-  /**
-   * @param {!Protocol.Page.Frame} framePayload
-   */
-  _onFrameNavigated(framePayload) {
-    const isMainFrame = !framePayload.parentId;
-    let frame = isMainFrame ? this._mainFrame : this._frames.get(framePayload.id);
-    assert(isMainFrame || frame, 'We either navigate top level or have old version of the navigated frame');
-
-    // Detach all child frames first.
-    if (frame) {
-      for (const child of frame.childFrames())
-        this._removeFramesRecursively(child);
+    _onExecutionContextsCleared() {
+        for (const context of this._contextIdToContext.values()) {
+            if (context._world)
+                context._world._setContext(null);
+        }
+        this._contextIdToContext.clear();
     }
-
-    // Update or create main frame.
-    if (isMainFrame) {
-      if (frame) {
-        // Update frame id to retain frame identity on cross-process navigation.
+    executionContextById(contextId) {
+        const context = this._contextIdToContext.get(contextId);
+        helper_1.assert(context, 'INTERNAL ERROR: missing context with id = ' + contextId);
+        return context;
+    }
+    _removeFramesRecursively(frame) {
+        for (const child of frame.childFrames())
+            this._removeFramesRecursively(child);
+        frame._detach();
         this._frames.delete(frame._id);
-        frame._id = framePayload.id;
-      } else {
-        // Initial main frame navigation.
-        frame = new Frame(this, this._client, null, framePayload.id);
-      }
-      this._frames.set(framePayload.id, frame);
-      this._mainFrame = frame;
+        this.emit(Events_1.Events.FrameManager.FrameDetached, frame);
     }
-
-    // Update frame payload.
-    frame._navigated(framePayload);
-
-    this.emit(Events.FrameManager.FrameNavigated, frame);
-  }
-
-  /**
-   * @param {string} name
-   */
-  async _ensureIsolatedWorld(name) {
-    if (this._isolatedWorlds.has(name))
-      return;
-    this._isolatedWorlds.add(name);
-    await this._client.send('Page.addScriptToEvaluateOnNewDocument', {
-      source: `//# sourceURL=${EVALUATION_SCRIPT_URL}`,
-      worldName: name,
-    }),
-    await Promise.all(this.frames().map(frame => this._client.send('Page.createIsolatedWorld', {
-      frameId: frame._id,
-      grantUniveralAccess: true,
-      worldName: name,
-    }).catch(debugError))); // frames might be removed before we send this
-  }
-
-  /**
-   * @param {string} frameId
-   * @param {string} url
-   */
-  _onFrameNavigatedWithinDocument(frameId, url) {
-    const frame = this._frames.get(frameId);
-    if (!frame)
-      return;
-    frame._navigatedWithinDocument(url);
-    this.emit(Events.FrameManager.FrameNavigatedWithinDocument, frame);
-    this.emit(Events.FrameManager.FrameNavigated, frame);
-  }
-
-  /**
-   * @param {string} frameId
-   */
-  _onFrameDetached(frameId) {
-    const frame = this._frames.get(frameId);
-    if (frame)
-      this._removeFramesRecursively(frame);
-  }
-
-  _onExecutionContextCreated(contextPayload) {
-    const frameId = contextPayload.auxData ? contextPayload.auxData.frameId : null;
-    const frame = this._frames.get(frameId) || null;
-    let world = null;
-    if (frame) {
-      if (contextPayload.auxData && !!contextPayload.auxData['isDefault']) {
-        world = frame._mainWorld;
-      } else if (contextPayload.name === UTILITY_WORLD_NAME && !frame._secondaryWorld._hasContext()) {
-        // In case of multiple sessions to the same target, there's a race between
-        // connections so we might end up creating multiple isolated worlds.
-        // We can use either.
-        world = frame._secondaryWorld;
-      }
-    }
-    if (contextPayload.auxData && contextPayload.auxData['type'] === 'isolated')
-      this._isolatedWorlds.add(contextPayload.name);
-    /** @type {!ExecutionContext} */
-    const context = new ExecutionContext(this._client, contextPayload, world);
-    if (world)
-      world._setContext(context);
-    this._contextIdToContext.set(contextPayload.id, context);
-  }
-
-  /**
-   * @param {number} executionContextId
-   */
-  _onExecutionContextDestroyed(executionContextId) {
-    const context = this._contextIdToContext.get(executionContextId);
-    if (!context)
-      return;
-    this._contextIdToContext.delete(executionContextId);
-    if (context._world)
-      context._world._setContext(null);
-  }
-
-  _onExecutionContextsCleared() {
-    for (const context of this._contextIdToContext.values()) {
-      if (context._world)
-        context._world._setContext(null);
-    }
-    this._contextIdToContext.clear();
-  }
-
-  /**
-   * @param {number} contextId
-   * @return {!ExecutionContext}
-   */
-  executionContextById(contextId) {
-    const context = this._contextIdToContext.get(contextId);
-    assert(context, 'INTERNAL ERROR: missing context with id = ' + contextId);
-    return context;
-  }
-
-  /**
-   * @param {!Frame} frame
-   */
-  _removeFramesRecursively(frame) {
-    for (const child of frame.childFrames())
-      this._removeFramesRecursively(child);
-    frame._detach();
-    this._frames.delete(frame._id);
-    this.emit(Events.FrameManager.FrameDetached, frame);
-  }
 }
-
-/**
- * @unrestricted
- */
+exports.FrameManager = FrameManager;
 class Frame {
-  /**
-   * @param {!FrameManager} frameManager
-   * @param {!Puppeteer.CDPSession} client
-   * @param {?Frame} parentFrame
-   * @param {string} frameId
-   */
-  constructor(frameManager, client, parentFrame, frameId) {
-    this._frameManager = frameManager;
-    this._client = client;
-    this._parentFrame = parentFrame;
-    this._url = '';
-    this._id = frameId;
-    this._detached = false;
-
-    this._loaderId = '';
-    /** @type {!Set<string>} */
-    this._lifecycleEvents = new Set();
-    /** @type {!DOMWorld} */
-    this._mainWorld = new DOMWorld(frameManager, this, frameManager._timeoutSettings);
-    /** @type {!DOMWorld} */
-    this._secondaryWorld = new DOMWorld(frameManager, this, frameManager._timeoutSettings);
-
-    /** @type {!Set<!Frame>} */
-    this._childFrames = new Set();
-    if (this._parentFrame)
-      this._parentFrame._childFrames.add(this);
-  }
-
-  /**
-   * @param {string} url
-   * @param {!{referer?: string, timeout?: number, waitUntil?: string|!Array<string>}=} options
-   * @return {!Promise<?Puppeteer.Response>}
-   */
-  async goto(url, options) {
-    return await this._frameManager.navigateFrame(this, url, options);
-  }
-
-  /**
-   * @param {!{timeout?: number, waitUntil?: string|!Array<string>}=} options
-   * @return {!Promise<?Puppeteer.Response>}
-   */
-  async waitForNavigation(options) {
-    return await this._frameManager.waitForFrameNavigation(this, options);
-  }
-
-  /**
-   * @return {!Promise<!ExecutionContext>}
-   */
-  executionContext() {
-    return this._mainWorld.executionContext();
-  }
-
-  /**
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<!Puppeteer.JSHandle>}
-   */
-  async evaluateHandle(pageFunction, ...args) {
-    return this._mainWorld.evaluateHandle(pageFunction, ...args);
-  }
-
-  /**
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<*>}
-   */
-  async evaluate(pageFunction, ...args) {
-    return this._mainWorld.evaluate(pageFunction, ...args);
-  }
-
-  /**
-   * @param {string} selector
-   * @return {!Promise<?Puppeteer.ElementHandle>}
-   */
-  async $(selector) {
-    return this._mainWorld.$(selector);
-  }
-
-  /**
-   * @param {string} expression
-   * @return {!Promise<!Array<!Puppeteer.ElementHandle>>}
-   */
-  async $x(expression) {
-    return this._mainWorld.$x(expression);
-  }
-
-  /**
-   * @param {string} selector
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<(!Object|undefined)>}
-   */
-  async $eval(selector, pageFunction, ...args) {
-    return this._mainWorld.$eval(selector, pageFunction, ...args);
-  }
-
-  /**
-   * @param {string} selector
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<(!Object|undefined)>}
-   */
-  async $$eval(selector, pageFunction, ...args) {
-    return this._mainWorld.$$eval(selector, pageFunction, ...args);
-  }
-
-  /**
-   * @param {string} selector
-   * @return {!Promise<!Array<!Puppeteer.ElementHandle>>}
-   */
-  async $$(selector) {
-    return this._mainWorld.$$(selector);
-  }
-
-  /**
-   * @return {!Promise<String>}
-   */
-  async content() {
-    return this._secondaryWorld.content();
-  }
-
-  /**
-   * @param {string} html
-   * @param {!{timeout?: number, waitUntil?: string|!Array<string>}=} options
-   */
-  async setContent(html, options = {}) {
-    return this._secondaryWorld.setContent(html, options);
-  }
-
-  /**
-   * @return {string}
-   */
-  name() {
-    return this._name || '';
-  }
-
-  /**
-   * @return {string}
-   */
-  url() {
-    return this._url;
-  }
-
-  /**
-   * @return {?Frame}
-   */
-  parentFrame() {
-    return this._parentFrame;
-  }
-
-  /**
-   * @return {!Array.<!Frame>}
-   */
-  childFrames() {
-    return Array.from(this._childFrames);
-  }
-
-  /**
-   * @return {boolean}
-   */
-  isDetached() {
-    return this._detached;
-  }
-
-  /**
-   * @param {!{url?: string, path?: string, content?: string, type?: string}} options
-   * @return {!Promise<!Puppeteer.ElementHandle>}
-   */
-  async addScriptTag(options) {
-    return this._mainWorld.addScriptTag(options);
-  }
-
-  /**
-   * @param {!{url?: string, path?: string, content?: string}} options
-   * @return {!Promise<!Puppeteer.ElementHandle>}
-   */
-  async addStyleTag(options) {
-    return this._mainWorld.addStyleTag(options);
-  }
-
-  /**
-   * @param {string} selector
-   * @param {!{delay?: number, button?: "left"|"right"|"middle", clickCount?: number}=} options
-   */
-  async click(selector, options) {
-    return this._secondaryWorld.click(selector, options);
-  }
-
-  /**
-   * @param {string} selector
-   */
-  async focus(selector) {
-    return this._secondaryWorld.focus(selector);
-  }
-
-  /**
-   * @param {string} selector
-   */
-  async hover(selector) {
-    return this._secondaryWorld.hover(selector);
-  }
-
-  /**
-  * @param {string} selector
-  * @param {!Array<string>} values
-  * @return {!Promise<!Array<string>>}
-  */
-  select(selector, ...values){
-    return this._secondaryWorld.select(selector, ...values);
-  }
-
-  /**
-   * @param {string} selector
-   */
-  async tap(selector) {
-    return this._secondaryWorld.tap(selector);
-  }
-
-  /**
-   * @param {string} selector
-   * @param {string} text
-   * @param {{delay: (number|undefined)}=} options
-   */
-  async type(selector, text, options) {
-    return this._mainWorld.type(selector, text, options);
-  }
-
-  /**
-   * @param {(string|number|Function)} selectorOrFunctionOrTimeout
-   * @param {!Object=} options
-   * @param {!Array<*>} args
-   * @return {!Promise<?Puppeteer.JSHandle>}
-   */
-  waitFor(selectorOrFunctionOrTimeout, options = {}, ...args) {
-    const xPathPattern = '//';
-
-    if (helper.isString(selectorOrFunctionOrTimeout)) {
-      const string = /** @type {string} */ (selectorOrFunctionOrTimeout);
-      if (string.startsWith(xPathPattern))
-        return this.waitForXPath(string, options);
-      return this.waitForSelector(string, options);
+    constructor(frameManager, client, parentFrame, frameId) {
+        this._url = '';
+        this._detached = false;
+        this._loaderId = '';
+        this._lifecycleEvents = new Set();
+        this._frameManager = frameManager;
+        this._client = client;
+        this._parentFrame = parentFrame;
+        this._url = '';
+        this._id = frameId;
+        this._detached = false;
+        this._loaderId = '';
+        this._mainWorld = new DOMWorld_1.DOMWorld(frameManager, this, frameManager._timeoutSettings);
+        this._secondaryWorld = new DOMWorld_1.DOMWorld(frameManager, this, frameManager._timeoutSettings);
+        this._childFrames = new Set();
+        if (this._parentFrame)
+            this._parentFrame._childFrames.add(this);
     }
-    if (helper.isNumber(selectorOrFunctionOrTimeout))
-      return new Promise(fulfill => setTimeout(fulfill, /** @type {number} */ (selectorOrFunctionOrTimeout)));
-    if (typeof selectorOrFunctionOrTimeout === 'function')
-      return this.waitForFunction(selectorOrFunctionOrTimeout, options, ...args);
-    return Promise.reject(new Error('Unsupported target type: ' + (typeof selectorOrFunctionOrTimeout)));
-  }
-
-  /**
-   * @param {string} selector
-   * @param {!{visible?: boolean, hidden?: boolean, timeout?: number}=} options
-   * @return {!Promise<?Puppeteer.ElementHandle>}
-   */
-  async waitForSelector(selector, options) {
-    const handle = await this._secondaryWorld.waitForSelector(selector, options);
-    if (!handle)
-      return null;
-    const mainExecutionContext = await this._mainWorld.executionContext();
-    const result = await mainExecutionContext._adoptElementHandle(handle);
-    await handle.dispose();
-    return result;
-  }
-
-  /**
-   * @param {string} xpath
-   * @param {!{visible?: boolean, hidden?: boolean, timeout?: number}=} options
-   * @return {!Promise<?Puppeteer.ElementHandle>}
-   */
-  async waitForXPath(xpath, options) {
-    const handle = await this._secondaryWorld.waitForXPath(xpath, options);
-    if (!handle)
-      return null;
-    const mainExecutionContext = await this._mainWorld.executionContext();
-    const result = await mainExecutionContext._adoptElementHandle(handle);
-    await handle.dispose();
-    return result;
-  }
-
-  /**
-   * @param {Function|string} pageFunction
-   * @param {!{polling?: string|number, timeout?: number}=} options
-   * @return {!Promise<!Puppeteer.JSHandle>}
-   */
-  waitForFunction(pageFunction, options = {}, ...args) {
-    return this._mainWorld.waitForFunction(pageFunction, options, ...args);
-  }
-
-  /**
-   * @return {!Promise<string>}
-   */
-  async title() {
-    return this._secondaryWorld.title();
-  }
-
-  /**
-   * @param {!Protocol.Page.Frame} framePayload
-   */
-  _navigated(framePayload) {
-    this._name = framePayload.name;
-    // TODO(lushnikov): remove this once requestInterception has loaderId exposed.
-    this._navigationURL = framePayload.url;
-    this._url = framePayload.url;
-  }
-
-  /**
-   * @param {string} url
-   */
-  _navigatedWithinDocument(url) {
-    this._url = url;
-  }
-
-  /**
-   * @param {string} loaderId
-   * @param {string} name
-   */
-  _onLifecycleEvent(loaderId, name) {
-    if (name === 'init') {
-      this._loaderId = loaderId;
-      this._lifecycleEvents.clear();
+    async goto(url, options) {
+        return await this._frameManager.navigateFrame(this, url, options);
     }
-    this._lifecycleEvents.add(name);
-  }
-
-  _onLoadingStopped() {
-    this._lifecycleEvents.add('DOMContentLoaded');
-    this._lifecycleEvents.add('load');
-  }
-
-  _detach() {
-    this._detached = true;
-    this._mainWorld._detach();
-    this._secondaryWorld._detach();
-    if (this._parentFrame)
-      this._parentFrame._childFrames.delete(this);
-    this._parentFrame = null;
-  }
+    async waitForNavigation(options) {
+        return await this._frameManager.waitForFrameNavigation(this, options);
+    }
+    executionContext() {
+        return this._mainWorld.executionContext();
+    }
+    async evaluateHandle(pageFunction, ...args) {
+        return this._mainWorld.evaluateHandle(pageFunction, ...args);
+    }
+    async evaluate(pageFunction, ...args) {
+        return this._mainWorld.evaluate(pageFunction, ...args);
+    }
+    async $(selector) {
+        return this._mainWorld.$(selector);
+    }
+    async $x(expression) {
+        return this._mainWorld.$x(expression);
+    }
+    async $eval(selector, pageFunction, ...args) {
+        return this._mainWorld.$eval(selector, pageFunction, ...args);
+    }
+    async $$eval(selector, pageFunction, ...args) {
+        return this._mainWorld.$$eval(selector, pageFunction, ...args);
+    }
+    async $$(selector) {
+        return this._mainWorld.$$(selector);
+    }
+    async content() {
+        return this._secondaryWorld.content();
+    }
+    async setContent(html, options = {}) {
+        return this._secondaryWorld.setContent(html, options);
+    }
+    name() {
+        return this._name || '';
+    }
+    url() {
+        return this._url;
+    }
+    parentFrame() {
+        return this._parentFrame;
+    }
+    childFrames() {
+        return Array.from(this._childFrames);
+    }
+    isDetached() {
+        return this._detached;
+    }
+    async addScriptTag(options) {
+        return this._mainWorld.addScriptTag(options);
+    }
+    async addStyleTag(options) {
+        return this._mainWorld.addStyleTag(options);
+    }
+    async click(selector, options) {
+        return this._secondaryWorld.click(selector, options);
+    }
+    async focus(selector) {
+        return this._secondaryWorld.focus(selector);
+    }
+    async hover(selector) {
+        return this._secondaryWorld.hover(selector);
+    }
+    select(selector, ...values) {
+        return this._secondaryWorld.select(selector, ...values);
+    }
+    async tap(selector) {
+        return this._secondaryWorld.tap(selector);
+    }
+    async type(selector, text, options) {
+        return this._mainWorld.type(selector, text, options);
+    }
+    waitFor(selectorOrFunctionOrTimeout, options = {}, ...args) {
+        const xPathPattern = '//';
+        if (helper_1.helper.isString(selectorOrFunctionOrTimeout)) {
+            const string = selectorOrFunctionOrTimeout;
+            if (string.startsWith(xPathPattern))
+                return this.waitForXPath(string, options);
+            return this.waitForSelector(string, options);
+        }
+        if (helper_1.helper.isNumber(selectorOrFunctionOrTimeout))
+            return new Promise(fulfill => setTimeout(fulfill, selectorOrFunctionOrTimeout));
+        if (typeof selectorOrFunctionOrTimeout === 'function')
+            return this.waitForFunction(selectorOrFunctionOrTimeout, options, ...args);
+        return Promise.reject(new Error('Unsupported target type: ' + (typeof selectorOrFunctionOrTimeout)));
+    }
+    async waitForSelector(selector, options) {
+        const handle = await this._secondaryWorld.waitForSelector(selector, options);
+        if (!handle)
+            return null;
+        const mainExecutionContext = await this._mainWorld.executionContext();
+        const result = await mainExecutionContext._adoptElementHandle(handle);
+        await handle.dispose();
+        return result;
+    }
+    async waitForXPath(xpath, options) {
+        const handle = await this._secondaryWorld.waitForXPath(xpath, options);
+        if (!handle)
+            return null;
+        const mainExecutionContext = await this._mainWorld.executionContext();
+        const result = await mainExecutionContext._adoptElementHandle(handle);
+        await handle.dispose();
+        return result;
+    }
+    waitForFunction(pageFunction, options = {}, ...args) {
+        return this._mainWorld.waitForFunction(pageFunction, options, ...args);
+    }
+    async title() {
+        return this._secondaryWorld.title();
+    }
+    _navigated(framePayload) {
+        this._name = framePayload.name;
+        this._url = framePayload.url;
+    }
+    _navigatedWithinDocument(url) {
+        this._url = url;
+    }
+    _onLifecycleEvent(loaderId, name) {
+        if (name === 'init') {
+            this._loaderId = loaderId;
+            this._lifecycleEvents.clear();
+        }
+        this._lifecycleEvents.add(name);
+    }
+    _onLoadingStopped() {
+        this._lifecycleEvents.add('DOMContentLoaded');
+        this._lifecycleEvents.add('load');
+    }
+    _detach() {
+        this._detached = true;
+        this._mainWorld._detach();
+        this._secondaryWorld._detach();
+        if (this._parentFrame)
+            this._parentFrame._childFrames.delete(this);
+        this._parentFrame = null;
+    }
 }
-
+exports.Frame = Frame;
 function assertNoLegacyNavigationOptions(options) {
-  assert(options['networkIdleTimeout'] === undefined, 'ERROR: networkIdleTimeout option is no longer supported.');
-  assert(options['networkIdleInflight'] === undefined, 'ERROR: networkIdleInflight option is no longer supported.');
-  assert(options.waitUntil !== 'networkidle', 'ERROR: "networkidle" option is no longer supported. Use "networkidle2" instead');
+    helper_1.assert(options['networkIdleTimeout'] === undefined, 'ERROR: networkIdleTimeout option is no longer supported.');
+    helper_1.assert(options['networkIdleInflight'] === undefined, 'ERROR: networkIdleInflight option is no longer supported.');
+    helper_1.assert(options.waitUntil !== 'networkidle', 'ERROR: "networkidle" option is no longer supported. Use "networkidle2" instead');
 }
-
-module.exports = {FrameManager, Frame};
diff --git a/node_modules/puppeteer/lib/Input.js b/node_modules/puppeteer/lib/Input.js
index e7d36a8..5d8965d 100644
--- a/node_modules/puppeteer/lib/Input.js
+++ b/node_modules/puppeteer/lib/Input.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,300 +14,222 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-const {assert} = require('./helper');
-const keyDefinitions = require('./USKeyboardLayout');
-
-/**
- * @typedef {Object} KeyDescription
- * @property {number} keyCode
- * @property {string} key
- * @property {string} text
- * @property {string} code
- * @property {number} location
- */
-
+Object.defineProperty(exports, "__esModule", { value: true });
+const helper_1 = require("./helper");
+const USKeyboardLayout_1 = require("./USKeyboardLayout");
 class Keyboard {
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   */
-  constructor(client) {
-    this._client = client;
-    this._modifiers = 0;
-    this._pressedKeys = new Set();
-  }
-
-  /**
-   * @param {string} key
-   * @param {{text?: string}=} options
-   */
-  async down(key, options = { text: undefined }) {
-    const description = this._keyDescriptionForString(key);
-
-    const autoRepeat = this._pressedKeys.has(description.code);
-    this._pressedKeys.add(description.code);
-    this._modifiers |= this._modifierBit(description.key);
-
-    const text = options.text === undefined ? description.text : options.text;
-    await this._client.send('Input.dispatchKeyEvent', {
-      type: text ? 'keyDown' : 'rawKeyDown',
-      modifiers: this._modifiers,
-      windowsVirtualKeyCode: description.keyCode,
-      code: description.code,
-      key: description.key,
-      text: text,
-      unmodifiedText: text,
-      autoRepeat,
-      location: description.location,
-      isKeypad: description.location === 3
-    });
-  }
-
-  /**
-   * @param {string} key
-   * @return {number}
-   */
-  _modifierBit(key) {
-    if (key === 'Alt')
-      return 1;
-    if (key === 'Control')
-      return 2;
-    if (key === 'Meta')
-      return 4;
-    if (key === 'Shift')
-      return 8;
-    return 0;
-  }
-
-  /**
-   * @param {string} keyString
-   * @return {KeyDescription}
-   */
-  _keyDescriptionForString(keyString) {
-    const shift = this._modifiers & 8;
-    const description = {
-      key: '',
-      keyCode: 0,
-      code: '',
-      text: '',
-      location: 0
-    };
-
-    const definition = keyDefinitions[keyString];
-    assert(definition, `Unknown key: "${keyString}"`);
-
-    if (definition.key)
-      description.key = definition.key;
-    if (shift && definition.shiftKey)
-      description.key = definition.shiftKey;
-
-    if (definition.keyCode)
-      description.keyCode = definition.keyCode;
-    if (shift && definition.shiftKeyCode)
-      description.keyCode = definition.shiftKeyCode;
-
-    if (definition.code)
-      description.code = definition.code;
-
-    if (definition.location)
-      description.location = definition.location;
-
-    if (description.key.length === 1)
-      description.text = description.key;
-
-    if (definition.text)
-      description.text = definition.text;
-    if (shift && definition.shiftText)
-      description.text = definition.shiftText;
-
-    // if any modifiers besides shift are pressed, no text should be sent
-    if (this._modifiers & ~8)
-      description.text = '';
-
-    return description;
-  }
-
-  /**
-   * @param {string} key
-   */
-  async up(key) {
-    const description = this._keyDescriptionForString(key);
-
-    this._modifiers &= ~this._modifierBit(description.key);
-    this._pressedKeys.delete(description.code);
-    await this._client.send('Input.dispatchKeyEvent', {
-      type: 'keyUp',
-      modifiers: this._modifiers,
-      key: description.key,
-      windowsVirtualKeyCode: description.keyCode,
-      code: description.code,
-      location: description.location
-    });
-  }
-
-  /**
-   * @param {string} char
-   */
-  async sendCharacter(char) {
-    await this._client.send('Input.insertText', {text: char});
-  }
-
-  /**
-   * @param {string} text
-   * @param {{delay: (number|undefined)}=} options
-   */
-  async type(text, options) {
-    const delay = (options && options.delay) || null;
-    for (const char of text) {
-      if (keyDefinitions[char]) {
-        await this.press(char, {delay});
-      } else {
+    constructor(client) {
+        this._modifiers = 0;
+        this._pressedKeys = new Set();
+        this._client = client;
+    }
+    async down(key, options = { text: undefined }) {
+        const description = this._keyDescriptionForString(key);
+        const autoRepeat = this._pressedKeys.has(description.code);
+        this._pressedKeys.add(description.code);
+        this._modifiers |= this._modifierBit(description.key);
+        const text = options.text === undefined ? description.text : options.text;
+        await this._client.send('Input.dispatchKeyEvent', {
+            type: text ? 'keyDown' : 'rawKeyDown',
+            modifiers: this._modifiers,
+            windowsVirtualKeyCode: description.keyCode,
+            code: description.code,
+            key: description.key,
+            text: text,
+            unmodifiedText: text,
+            autoRepeat,
+            location: description.location,
+            isKeypad: description.location === 3
+        });
+    }
+    _modifierBit(key) {
+        if (key === 'Alt')
+            return 1;
+        if (key === 'Control')
+            return 2;
+        if (key === 'Meta')
+            return 4;
+        if (key === 'Shift')
+            return 8;
+        return 0;
+    }
+    _keyDescriptionForString(keyString) {
+        const shift = this._modifiers & 8;
+        const description = {
+            key: '',
+            keyCode: 0,
+            code: '',
+            text: '',
+            location: 0
+        };
+        const definition = USKeyboardLayout_1.keyDefinitions[keyString];
+        helper_1.assert(definition, `Unknown key: "${keyString}"`);
+        if (definition.key)
+            description.key = definition.key;
+        if (shift && definition.shiftKey)
+            description.key = definition.shiftKey;
+        if (definition.keyCode)
+            description.keyCode = definition.keyCode;
+        if (shift && definition.shiftKeyCode)
+            description.keyCode = definition.shiftKeyCode;
+        if (definition.code)
+            description.code = definition.code;
+        if (definition.location)
+            description.location = definition.location;
+        if (description.key.length === 1)
+            description.text = description.key;
+        if (definition.text)
+            description.text = definition.text;
+        if (shift && definition.shiftText)
+            description.text = definition.shiftText;
+        // if any modifiers besides shift are pressed, no text should be sent
+        if (this._modifiers & ~8)
+            description.text = '';
+        return description;
+    }
+    async up(key) {
+        const description = this._keyDescriptionForString(key);
+        this._modifiers &= ~this._modifierBit(description.key);
+        this._pressedKeys.delete(description.code);
+        await this._client.send('Input.dispatchKeyEvent', {
+            type: 'keyUp',
+            modifiers: this._modifiers,
+            key: description.key,
+            windowsVirtualKeyCode: description.keyCode,
+            code: description.code,
+            location: description.location
+        });
+    }
+    async sendCharacter(char) {
+        await this._client.send('Input.insertText', { text: char });
+    }
+    charIsKey(char) {
+        return !!USKeyboardLayout_1.keyDefinitions[char];
+    }
+    async type(text, options) {
+        const delay = (options && options.delay) || null;
+        for (const char of text) {
+            if (this.charIsKey(char)) {
+                await this.press(char, { delay });
+            }
+            else {
+                if (delay)
+                    await new Promise(f => setTimeout(f, delay));
+                await this.sendCharacter(char);
+            }
+        }
+    }
+    async press(key, options = {}) {
+        const { delay = null } = options;
+        await this.down(key, options);
         if (delay)
-          await new Promise(f => setTimeout(f, delay));
-        await this.sendCharacter(char);
-      }
+            await new Promise(f => setTimeout(f, options.delay));
+        await this.up(key);
     }
-  }
-
-  /**
-   * @param {string} key
-   * @param {!{delay?: number, text?: string}=} options
-   */
-  async press(key, options = {}) {
-    const {delay = null} = options;
-    await this.down(key, options);
-    if (delay)
-      await new Promise(f => setTimeout(f, options.delay));
-    await this.up(key);
-  }
 }
-
+exports.Keyboard = Keyboard;
 class Mouse {
-  /**
-   * @param {Puppeteer.CDPSession} client
-   * @param {!Keyboard} keyboard
-   */
-  constructor(client, keyboard) {
-    this._client = client;
-    this._keyboard = keyboard;
-    this._x = 0;
-    this._y = 0;
-    /** @type {'none'|'left'|'right'|'middle'} */
-    this._button = 'none';
-  }
-
-  /**
-   * @param {number} x
-   * @param {number} y
-   * @param {!{steps?: number}=} options
-   */
-  async move(x, y, options = {}) {
-    const {steps = 1} = options;
-    const fromX = this._x, fromY = this._y;
-    this._x = x;
-    this._y = y;
-    for (let i = 1; i <= steps; i++) {
-      await this._client.send('Input.dispatchMouseEvent', {
-        type: 'mouseMoved',
-        button: this._button,
-        x: fromX + (this._x - fromX) * (i / steps),
-        y: fromY + (this._y - fromY) * (i / steps),
-        modifiers: this._keyboard._modifiers
-      });
+    /**
+     * @param {CDPSession} client
+     * @param {!Keyboard} keyboard
+     */
+    constructor(client, keyboard) {
+        this._x = 0;
+        this._y = 0;
+        this._button = 'none';
+        this._client = client;
+        this._keyboard = keyboard;
     }
-  }
-
-  /**
-   * @param {number} x
-   * @param {number} y
-   * @param {!{delay?: number, button?: "left"|"right"|"middle", clickCount?: number}=} options
-   */
-  async click(x, y, options = {}) {
-    const {delay = null} = options;
-    if (delay !== null) {
-      await Promise.all([
-        this.move(x, y),
-        this.down(options),
-      ]);
-      await new Promise(f => setTimeout(f, delay));
-      await this.up(options);
-    } else {
-      await Promise.all([
-        this.move(x, y),
-        this.down(options),
-        this.up(options),
-      ]);
+    async move(x, y, options = {}) {
+        const { steps = 1 } = options;
+        const fromX = this._x, fromY = this._y;
+        this._x = x;
+        this._y = y;
+        for (let i = 1; i <= steps; i++) {
+            await this._client.send('Input.dispatchMouseEvent', {
+                type: 'mouseMoved',
+                button: this._button,
+                x: fromX + (this._x - fromX) * (i / steps),
+                y: fromY + (this._y - fromY) * (i / steps),
+                modifiers: this._keyboard._modifiers
+            });
+        }
     }
-  }
-
-  /**
-   * @param {!{button?: "left"|"right"|"middle", clickCount?: number}=} options
-   */
-  async down(options = {}) {
-    const {button = 'left', clickCount = 1} = options;
-    this._button = button;
-    await this._client.send('Input.dispatchMouseEvent', {
-      type: 'mousePressed',
-      button,
-      x: this._x,
-      y: this._y,
-      modifiers: this._keyboard._modifiers,
-      clickCount
-    });
-  }
-
-  /**
-   * @param {!{button?: "left"|"right"|"middle", clickCount?: number}=} options
-   */
-  async up(options = {}) {
-    const {button = 'left', clickCount = 1} = options;
-    this._button = 'none';
-    await this._client.send('Input.dispatchMouseEvent', {
-      type: 'mouseReleased',
-      button,
-      x: this._x,
-      y: this._y,
-      modifiers: this._keyboard._modifiers,
-      clickCount
-    });
-  }
+    async click(x, y, options = {}) {
+        const { delay = null } = options;
+        if (delay !== null) {
+            await Promise.all([
+                this.move(x, y),
+                this.down(options),
+            ]);
+            await new Promise(f => setTimeout(f, delay));
+            await this.up(options);
+        }
+        else {
+            await Promise.all([
+                this.move(x, y),
+                this.down(options),
+                this.up(options),
+            ]);
+        }
+    }
+    async down(options = {}) {
+        const { button = 'left', clickCount = 1 } = options;
+        this._button = button;
+        await this._client.send('Input.dispatchMouseEvent', {
+            type: 'mousePressed',
+            button,
+            x: this._x,
+            y: this._y,
+            modifiers: this._keyboard._modifiers,
+            clickCount
+        });
+    }
+    /**
+     * @param {!{button?: "left"|"right"|"middle", clickCount?: number}=} options
+     */
+    async up(options = {}) {
+        const { button = 'left', clickCount = 1 } = options;
+        this._button = 'none';
+        await this._client.send('Input.dispatchMouseEvent', {
+            type: 'mouseReleased',
+            button,
+            x: this._x,
+            y: this._y,
+            modifiers: this._keyboard._modifiers,
+            clickCount
+        });
+    }
 }
-
+exports.Mouse = Mouse;
 class Touchscreen {
-  /**
-   * @param {Puppeteer.CDPSession} client
-   * @param {Keyboard} keyboard
-   */
-  constructor(client, keyboard) {
-    this._client = client;
-    this._keyboard = keyboard;
-  }
-
-  /**
-   * @param {number} x
-   * @param {number} y
-   */
-  async tap(x, y) {
-    // Touches appear to be lost during the first frame after navigation.
-    // This waits a frame before sending the tap.
-    // @see https://crbug.com/613219
-    await this._client.send('Runtime.evaluate', {
-      expression: 'new Promise(x => requestAnimationFrame(() => requestAnimationFrame(x)))',
-      awaitPromise: true
-    });
-
-    const touchPoints = [{x: Math.round(x), y: Math.round(y)}];
-    await this._client.send('Input.dispatchTouchEvent', {
-      type: 'touchStart',
-      touchPoints,
-      modifiers: this._keyboard._modifiers
-    });
-    await this._client.send('Input.dispatchTouchEvent', {
-      type: 'touchEnd',
-      touchPoints: [],
-      modifiers: this._keyboard._modifiers
-    });
-  }
+    constructor(client, keyboard) {
+        this._client = client;
+        this._keyboard = keyboard;
+    }
+    /**
+     * @param {number} x
+     * @param {number} y
+     */
+    async tap(x, y) {
+        // Touches appear to be lost during the first frame after navigation.
+        // This waits a frame before sending the tap.
+        // @see https://crbug.com/613219
+        await this._client.send('Runtime.evaluate', {
+            expression: 'new Promise(x => requestAnimationFrame(() => requestAnimationFrame(x)))',
+            awaitPromise: true
+        });
+        const touchPoints = [{ x: Math.round(x), y: Math.round(y) }];
+        await this._client.send('Input.dispatchTouchEvent', {
+            type: 'touchStart',
+            touchPoints,
+            modifiers: this._keyboard._modifiers
+        });
+        await this._client.send('Input.dispatchTouchEvent', {
+            type: 'touchEnd',
+            touchPoints: [],
+            modifiers: this._keyboard._modifiers
+        });
+    }
 }
-
-module.exports = { Keyboard, Mouse, Touchscreen};
+exports.Touchscreen = Touchscreen;
diff --git a/node_modules/puppeteer/lib/JSHandle.js b/node_modules/puppeteer/lib/JSHandle.js
index a15be53..7e7aa18 100644
--- a/node_modules/puppeteer/lib/JSHandle.js
+++ b/node_modules/puppeteer/lib/JSHandle.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2019 Google Inc. All rights reserved.
  *
@@ -13,555 +14,415 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-const {helper, assert, debugError} = require('./helper');
-const path = require('path');
-
+Object.defineProperty(exports, "__esModule", { value: true });
+const helper_1 = require("./helper");
+const QueryHandler_1 = require("./QueryHandler");
 function createJSHandle(context, remoteObject) {
-  const frame = context.frame();
-  if (remoteObject.subtype === 'node' && frame) {
-    const frameManager = frame._frameManager;
-    return new ElementHandle(context, context._client, remoteObject, frameManager.page(), frameManager);
-  }
-  return new JSHandle(context, context._client, remoteObject);
+    const frame = context.frame();
+    if (remoteObject.subtype === 'node' && frame) {
+        const frameManager = frame._frameManager;
+        return new ElementHandle(context, context._client, remoteObject, frameManager.page(), frameManager);
+    }
+    return new JSHandle(context, context._client, remoteObject);
 }
-
+exports.createJSHandle = createJSHandle;
 class JSHandle {
-  /**
-   * @param {!Puppeteer.ExecutionContext} context
-   * @param {!Puppeteer.CDPSession} client
-   * @param {!Protocol.Runtime.RemoteObject} remoteObject
-   */
-  constructor(context, client, remoteObject) {
-    this._context = context;
-    this._client = client;
-    this._remoteObject = remoteObject;
-    this._disposed = false;
-  }
-
-  /**
-   * @return {!Puppeteer.ExecutionContext}
-   */
-  executionContext() {
-    return this._context;
-  }
-
-  /**
-   * @param {Function|String} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<(!Object|undefined)>}
-   */
-  async evaluate(pageFunction, ...args) {
-    return await this.executionContext().evaluate(pageFunction, this, ...args);
-  }
-
-  /**
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<!Puppeteer.JSHandle>}
-   */
-  async evaluateHandle(pageFunction, ...args) {
-    return await this.executionContext().evaluateHandle(pageFunction, this, ...args);
-  }
-
-  /**
-   * @param {string} propertyName
-   * @return {!Promise<?JSHandle>}
-   */
-  async getProperty(propertyName) {
-    const objectHandle = await this.evaluateHandle((object, propertyName) => {
-      const result = {__proto__: null};
-      result[propertyName] = object[propertyName];
-      return result;
-    }, propertyName);
-    const properties = await objectHandle.getProperties();
-    const result = properties.get(propertyName) || null;
-    await objectHandle.dispose();
-    return result;
-  }
-
-  /**
-   * @return {!Promise<!Map<string, !JSHandle>>}
-   */
-  async getProperties() {
-    const response = await this._client.send('Runtime.getProperties', {
-      objectId: this._remoteObject.objectId,
-      ownProperties: true
-    });
-    const result = new Map();
-    for (const property of response.result) {
-      if (!property.enumerable)
-        continue;
-      result.set(property.name, createJSHandle(this._context, property.value));
+    constructor(context, client, remoteObject) {
+        this._disposed = false;
+        this._context = context;
+        this._client = client;
+        this._remoteObject = remoteObject;
     }
-    return result;
-  }
-
-  /**
-   * @return {!Promise<?Object>}
-   */
-  async jsonValue() {
-    if (this._remoteObject.objectId) {
-      const response = await this._client.send('Runtime.callFunctionOn', {
-        functionDeclaration: 'function() { return this; }',
-        objectId: this._remoteObject.objectId,
-        returnByValue: true,
-        awaitPromise: true,
-      });
-      return helper.valueFromRemoteObject(response.result);
+    executionContext() {
+        return this._context;
     }
-    return helper.valueFromRemoteObject(this._remoteObject);
-  }
-
-  /**
-   * @return {?Puppeteer.ElementHandle}
-   */
-  asElement() {
-    return null;
-  }
-
-  async dispose() {
-    if (this._disposed)
-      return;
-    this._disposed = true;
-    await helper.releaseObject(this._client, this._remoteObject);
-  }
-
-  /**
-   * @override
-   * @return {string}
-   */
-  toString() {
-    if (this._remoteObject.objectId) {
-      const type =  this._remoteObject.subtype || this._remoteObject.type;
-      return 'JSHandle@' + type;
+    async evaluate(pageFunction, ...args) {
+        return await this.executionContext().evaluate(pageFunction, this, ...args);
     }
-    return 'JSHandle:' + helper.valueFromRemoteObject(this._remoteObject);
-  }
+    async evaluateHandle(pageFunction, ...args) {
+        return await this.executionContext().evaluateHandle(pageFunction, this, ...args);
+    }
+    async getProperty(propertyName) {
+        const objectHandle = await this.evaluateHandle((object, propertyName) => {
+            const result = { __proto__: null };
+            result[propertyName] = object[propertyName];
+            return result;
+        }, propertyName);
+        const properties = await objectHandle.getProperties();
+        const result = properties.get(propertyName) || null;
+        await objectHandle.dispose();
+        return result;
+    }
+    async getProperties() {
+        const response = await this._client.send('Runtime.getProperties', {
+            objectId: this._remoteObject.objectId,
+            ownProperties: true
+        });
+        const result = new Map();
+        for (const property of response.result) {
+            if (!property.enumerable)
+                continue;
+            result.set(property.name, createJSHandle(this._context, property.value));
+        }
+        return result;
+    }
+    async jsonValue() {
+        if (this._remoteObject.objectId) {
+            const response = await this._client.send('Runtime.callFunctionOn', {
+                functionDeclaration: 'function() { return this; }',
+                objectId: this._remoteObject.objectId,
+                returnByValue: true,
+                awaitPromise: true,
+            });
+            return helper_1.helper.valueFromRemoteObject(response.result);
+        }
+        return helper_1.helper.valueFromRemoteObject(this._remoteObject);
+    }
+    /* This always returns null but children can define this and return an ElementHandle */
+    asElement() {
+        return null;
+    }
+    async dispose() {
+        if (this._disposed)
+            return;
+        this._disposed = true;
+        await helper_1.helper.releaseObject(this._client, this._remoteObject);
+    }
+    toString() {
+        if (this._remoteObject.objectId) {
+            const type = this._remoteObject.subtype || this._remoteObject.type;
+            return 'JSHandle@' + type;
+        }
+        return 'JSHandle:' + helper_1.helper.valueFromRemoteObject(this._remoteObject);
+    }
 }
-
+exports.JSHandle = JSHandle;
 class ElementHandle extends JSHandle {
-  /**
-   * @param {!Puppeteer.ExecutionContext} context
-   * @param {!Puppeteer.CDPSession} client
-   * @param {!Protocol.Runtime.RemoteObject} remoteObject
-   * @param {!Puppeteer.Page} page
-   * @param {!Puppeteer.FrameManager} frameManager
-   */
-  constructor(context, client, remoteObject, page, frameManager) {
-    super(context, client, remoteObject);
-    this._client = client;
-    this._remoteObject = remoteObject;
-    this._page = page;
-    this._frameManager = frameManager;
-    this._disposed = false;
-  }
-
-  /**
-   * @override
-   * @return {?ElementHandle}
-   */
-  asElement() {
-    return this;
-  }
-
-  /**
-   * @return {!Promise<?Puppeteer.Frame>}
-   */
-  async contentFrame() {
-    const nodeInfo = await this._client.send('DOM.describeNode', {
-      objectId: this._remoteObject.objectId
-    });
-    if (typeof nodeInfo.node.frameId !== 'string')
-      return null;
-    return this._frameManager.frame(nodeInfo.node.frameId);
-  }
-
-  async _scrollIntoViewIfNeeded() {
-    const error = await this.evaluate(async(element, pageJavascriptEnabled) => {
-      if (!element.isConnected)
-        return 'Node is detached from document';
-      if (element.nodeType !== Node.ELEMENT_NODE)
-        return 'Node is not of type HTMLElement';
-      // force-scroll if page's javascript is disabled.
-      if (!pageJavascriptEnabled) {
-        element.scrollIntoView({block: 'center', inline: 'center', behavior: 'instant'});
-        return false;
-      }
-      const visibleRatio = await new Promise(resolve => {
-        const observer = new IntersectionObserver(entries => {
-          resolve(entries[0].intersectionRatio);
-          observer.disconnect();
+    constructor(context, client, remoteObject, page, frameManager) {
+        super(context, client, remoteObject);
+        this._client = client;
+        this._remoteObject = remoteObject;
+        this._page = page;
+        this._frameManager = frameManager;
+    }
+    asElement() {
+        return this;
+    }
+    async contentFrame() {
+        const nodeInfo = await this._client.send('DOM.describeNode', {
+            objectId: this._remoteObject.objectId
         });
-        observer.observe(element);
-      });
-      if (visibleRatio !== 1.0)
-        element.scrollIntoView({block: 'center', inline: 'center', behavior: 'instant'});
-      return false;
-    }, this._page._javascriptEnabled);
-    if (error)
-      throw new Error(error);
-  }
-
-  /**
-   * @return {!Promise<!{x: number, y: number}>}
-   */
-  async _clickablePoint() {
-    const [result, layoutMetrics] = await Promise.all([
-      this._client.send('DOM.getContentQuads', {
-        objectId: this._remoteObject.objectId
-      }).catch(debugError),
-      this._client.send('Page.getLayoutMetrics'),
-    ]);
-    if (!result || !result.quads.length)
-      throw new Error('Node is either not visible or not an HTMLElement');
-    // Filter out quads that have too small area to click into.
-    const {clientWidth, clientHeight} = layoutMetrics.layoutViewport;
-    const quads = result.quads.map(quad => this._fromProtocolQuad(quad)).map(quad => this._intersectQuadWithViewport(quad, clientWidth, clientHeight)).filter(quad => computeQuadArea(quad) > 1);
-    if (!quads.length)
-      throw new Error('Node is either not visible or not an HTMLElement');
-    // Return the middle point of the first quad.
-    const quad = quads[0];
-    let x = 0;
-    let y = 0;
-    for (const point of quad) {
-      x += point.x;
-      y += point.y;
+        if (typeof nodeInfo.node.frameId !== 'string')
+            return null;
+        return this._frameManager.frame(nodeInfo.node.frameId);
     }
-    return {
-      x: x / 4,
-      y: y / 4
-    };
-  }
-
-  /**
-   * @return {!Promise<void|Protocol.DOM.getBoxModelReturnValue>}
-   */
-  _getBoxModel() {
-    return this._client.send('DOM.getBoxModel', {
-      objectId: this._remoteObject.objectId
-    }).catch(error => debugError(error));
-  }
-
-  /**
-   * @param {!Array<number>} quad
-   * @return {!Array<{x: number, y: number}>}
-   */
-  _fromProtocolQuad(quad) {
-    return [
-      {x: quad[0], y: quad[1]},
-      {x: quad[2], y: quad[3]},
-      {x: quad[4], y: quad[5]},
-      {x: quad[6], y: quad[7]}
-    ];
-  }
-
-  /**
-   * @param {!Array<{x: number, y: number}>} quad
-   * @param {number} width
-   * @param {number} height
-   * @return {!Array<{x: number, y: number}>}
-   */
-  _intersectQuadWithViewport(quad, width, height) {
-    return quad.map(point => ({
-      x: Math.min(Math.max(point.x, 0), width),
-      y: Math.min(Math.max(point.y, 0), height),
-    }));
-  }
-
-  async hover() {
-    await this._scrollIntoViewIfNeeded();
-    const {x, y} = await this._clickablePoint();
-    await this._page.mouse.move(x, y);
-  }
-
-  /**
-   * @param {!{delay?: number, button?: "left"|"right"|"middle", clickCount?: number}=} options
-   */
-  async click(options) {
-    await this._scrollIntoViewIfNeeded();
-    const {x, y} = await this._clickablePoint();
-    await this._page.mouse.click(x, y, options);
-  }
-
-  /**
-   * @param {!Array<string>} values
-   * @return {!Promise<!Array<string>>}
-   */
-  async select(...values) {
-    for (const value of values)
-      assert(helper.isString(value), 'Values must be strings. Found value "' + value + '" of type "' + (typeof value) + '"');
-    return this.evaluate((element, values) => {
-      if (element.nodeName.toLowerCase() !== 'select')
-        throw new Error('Element is not a <select> element.');
-
-      const options = Array.from(element.options);
-      element.value = undefined;
-      for (const option of options) {
-        option.selected = values.includes(option.value);
-        if (option.selected && !element.multiple)
-          break;
-      }
-      element.dispatchEvent(new Event('input', { 'bubbles': true }));
-      element.dispatchEvent(new Event('change', { 'bubbles': true }));
-      return options.filter(option => option.selected).map(option => option.value);
-    }, values);
-  }
-
-  /**
-   * @param {!Array<string>} filePaths
-   */
-  async uploadFile(...filePaths) {
-    const files = filePaths.map(filePath => path.resolve(filePath));
-    const objectId = this._remoteObject.objectId;
-    await this._client.send('DOM.setFileInputFiles', { objectId, files });
-  }
-
-  async tap() {
-    await this._scrollIntoViewIfNeeded();
-    const {x, y} = await this._clickablePoint();
-    await this._page.touchscreen.tap(x, y);
-  }
-
-  async focus() {
-    await this.evaluate(element => element.focus());
-  }
-
-  /**
-   * @param {string} text
-   * @param {{delay: (number|undefined)}=} options
-   */
-  async type(text, options) {
-    await this.focus();
-    await this._page.keyboard.type(text, options);
-  }
-
-  /**
-   * @param {string} key
-   * @param {!{delay?: number, text?: string}=} options
-   */
-  async press(key, options) {
-    await this.focus();
-    await this._page.keyboard.press(key, options);
-  }
-
-  /**
-   * @return {!Promise<?{x: number, y: number, width: number, height: number}>}
-   */
-  async boundingBox() {
-    const result = await this._getBoxModel();
-
-    if (!result)
-      return null;
-
-    const quad = result.model.border;
-    const x = Math.min(quad[0], quad[2], quad[4], quad[6]);
-    const y = Math.min(quad[1], quad[3], quad[5], quad[7]);
-    const width = Math.max(quad[0], quad[2], quad[4], quad[6]) - x;
-    const height = Math.max(quad[1], quad[3], quad[5], quad[7]) - y;
-
-    return {x, y, width, height};
-  }
-
-  /**
-   * @return {!Promise<?BoxModel>}
-   */
-  async boxModel() {
-    const result = await this._getBoxModel();
-
-    if (!result)
-      return null;
-
-    const {content, padding, border, margin, width, height} = result.model;
-    return {
-      content: this._fromProtocolQuad(content),
-      padding: this._fromProtocolQuad(padding),
-      border: this._fromProtocolQuad(border),
-      margin: this._fromProtocolQuad(margin),
-      width,
-      height
-    };
-  }
-
-  /**
-   *
-   * @param {!Object=} options
-   * @returns {!Promise<string|!Buffer>}
-   */
-  async screenshot(options = {}) {
-    let needsViewportReset = false;
-
-    let boundingBox = await this.boundingBox();
-    assert(boundingBox, 'Node is either not visible or not an HTMLElement');
-
-    const viewport = this._page.viewport();
-
-    if (viewport && (boundingBox.width > viewport.width || boundingBox.height > viewport.height)) {
-      const newViewport = {
-        width: Math.max(viewport.width, Math.ceil(boundingBox.width)),
-        height: Math.max(viewport.height, Math.ceil(boundingBox.height)),
-      };
-      await this._page.setViewport(Object.assign({}, viewport, newViewport));
-
-      needsViewportReset = true;
+    async _scrollIntoViewIfNeeded() {
+        const error = await this.evaluate(async (element, pageJavascriptEnabled) => {
+            if (!element.isConnected)
+                return 'Node is detached from document';
+            if (element.nodeType !== Node.ELEMENT_NODE)
+                return 'Node is not of type HTMLElement';
+            // force-scroll if page's javascript is disabled.
+            if (!pageJavascriptEnabled) {
+                // Chrome still supports behavior: instant but it's not in the spec so TS shouts
+                // We don't want to make this breaking change in Puppeteer yet so we'll ignore the line.
+                // @ts-ignore
+                element.scrollIntoView({ block: 'center', inline: 'center', behavior: 'instant' });
+                return false;
+            }
+            const visibleRatio = await new Promise(resolve => {
+                const observer = new IntersectionObserver(entries => {
+                    resolve(entries[0].intersectionRatio);
+                    observer.disconnect();
+                });
+                observer.observe(element);
+            });
+            if (visibleRatio !== 1.0) {
+                // Chrome still supports behavior: instant but it's not in the spec so TS shouts
+                // We don't want to make this breaking change in Puppeteer yet so we'll ignore the line.
+                // @ts-ignore
+                element.scrollIntoView({ block: 'center', inline: 'center', behavior: 'instant' });
+            }
+            return false;
+        }, this._page._javascriptEnabled);
+        if (error)
+            throw new Error(error);
     }
-
-    await this._scrollIntoViewIfNeeded();
-
-    boundingBox = await this.boundingBox();
-    assert(boundingBox, 'Node is either not visible or not an HTMLElement');
-    assert(boundingBox.width !== 0, 'Node has 0 width.');
-    assert(boundingBox.height !== 0, 'Node has 0 height.');
-
-    const { layoutViewport: { pageX, pageY } } = await this._client.send('Page.getLayoutMetrics');
-
-    const clip = Object.assign({}, boundingBox);
-    clip.x += pageX;
-    clip.y += pageY;
-
-    const imageData = await this._page.screenshot(Object.assign({}, {
-      clip
-    }, options));
-
-    if (needsViewportReset)
-      await this._page.setViewport(viewport);
-
-    return imageData;
-  }
-
-  /**
-   * @param {string} selector
-   * @return {!Promise<?ElementHandle>}
-   */
-  async $(selector) {
-    const handle = await this.evaluateHandle(
-        (element, selector) => element.querySelector(selector),
-        selector
-    );
-    const element = handle.asElement();
-    if (element)
-      return element;
-    await handle.dispose();
-    return null;
-  }
-
-  /**
-   * @param {string} selector
-   * @return {!Promise<!Array<!ElementHandle>>}
-   */
-  async $$(selector) {
-    const arrayHandle = await this.evaluateHandle(
-        (element, selector) => element.querySelectorAll(selector),
-        selector
-    );
-    const properties = await arrayHandle.getProperties();
-    await arrayHandle.dispose();
-    const result = [];
-    for (const property of properties.values()) {
-      const elementHandle = property.asElement();
-      if (elementHandle)
-        result.push(elementHandle);
+    async _clickablePoint() {
+        const [result, layoutMetrics] = await Promise.all([
+            this._client.send('DOM.getContentQuads', {
+                objectId: this._remoteObject.objectId
+            }).catch(helper_1.debugError),
+            this._client.send('Page.getLayoutMetrics'),
+        ]);
+        if (!result || !result.quads.length)
+            throw new Error('Node is either not visible or not an HTMLElement');
+        // Filter out quads that have too small area to click into.
+        const { clientWidth, clientHeight } = layoutMetrics.layoutViewport;
+        const quads = result.quads.map(quad => this._fromProtocolQuad(quad)).map(quad => this._intersectQuadWithViewport(quad, clientWidth, clientHeight)).filter(quad => computeQuadArea(quad) > 1);
+        if (!quads.length)
+            throw new Error('Node is either not visible or not an HTMLElement');
+        // Return the middle point of the first quad.
+        const quad = quads[0];
+        let x = 0;
+        let y = 0;
+        for (const point of quad) {
+            x += point.x;
+            y += point.y;
+        }
+        return {
+            x: x / 4,
+            y: y / 4
+        };
     }
-    return result;
-  }
-
-  /**
-   * @param {string} selector
-   * @param {Function|String} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<(!Object|undefined)>}
-   */
-  async $eval(selector, pageFunction, ...args) {
-    const elementHandle = await this.$(selector);
-    if (!elementHandle)
-      throw new Error(`Error: failed to find element matching selector "${selector}"`);
-    const result = await elementHandle.evaluate(pageFunction, ...args);
-    await elementHandle.dispose();
-    return result;
-  }
-
-  /**
-   * @param {string} selector
-   * @param {Function|String} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<(!Object|undefined)>}
-   */
-  async $$eval(selector, pageFunction, ...args) {
-    const arrayHandle = await this.evaluateHandle(
-        (element, selector) => Array.from(element.querySelectorAll(selector)),
-        selector
-    );
-
-    const result = await arrayHandle.evaluate(pageFunction, ...args);
-    await arrayHandle.dispose();
-    return result;
-  }
-
-  /**
-   * @param {string} expression
-   * @return {!Promise<!Array<!ElementHandle>>}
-   */
-  async $x(expression) {
-    const arrayHandle = await this.evaluateHandle(
-        (element, expression) => {
-          const document = element.ownerDocument || element;
-          const iterator = document.evaluate(expression, element, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE);
-          const array = [];
-          let item;
-          while ((item = iterator.iterateNext()))
-            array.push(item);
-          return array;
-        },
-        expression
-    );
-    const properties = await arrayHandle.getProperties();
-    await arrayHandle.dispose();
-    const result = [];
-    for (const property of properties.values()) {
-      const elementHandle = property.asElement();
-      if (elementHandle)
-        result.push(elementHandle);
+    _getBoxModel() {
+        return this._client.send('DOM.getBoxModel', {
+            objectId: this._remoteObject.objectId
+        }).catch(error => helper_1.debugError(error));
     }
-    return result;
-  }
-
-  /**
-   * @returns {!Promise<boolean>}
-   */
-  isIntersectingViewport() {
-    return this.evaluate(async element => {
-      const visibleRatio = await new Promise(resolve => {
-        const observer = new IntersectionObserver(entries => {
-          resolve(entries[0].intersectionRatio);
-          observer.disconnect();
+    _fromProtocolQuad(quad) {
+        return [
+            { x: quad[0], y: quad[1] },
+            { x: quad[2], y: quad[3] },
+            { x: quad[4], y: quad[5] },
+            { x: quad[6], y: quad[7] }
+        ];
+    }
+    _intersectQuadWithViewport(quad, width, height) {
+        return quad.map(point => ({
+            x: Math.min(Math.max(point.x, 0), width),
+            y: Math.min(Math.max(point.y, 0), height),
+        }));
+    }
+    async hover() {
+        await this._scrollIntoViewIfNeeded();
+        const { x, y } = await this._clickablePoint();
+        await this._page.mouse.move(x, y);
+    }
+    async click(options) {
+        await this._scrollIntoViewIfNeeded();
+        const { x, y } = await this._clickablePoint();
+        await this._page.mouse.click(x, y, options);
+    }
+    async select(...values) {
+        for (const value of values)
+            helper_1.assert(helper_1.helper.isString(value), 'Values must be strings. Found value "' + value + '" of type "' + (typeof value) + '"');
+        /* TODO(jacktfranklin@): once ExecutionContext is TypeScript, and
+        * its evaluate function is properly typed with generics we can
+        * return here and remove the typecasting
+        */
+        return this.evaluate((element, values) => {
+            if (element.nodeName.toLowerCase() !== 'select')
+                throw new Error('Element is not a <select> element.');
+            const options = Array.from(element.options);
+            element.value = undefined;
+            for (const option of options) {
+                option.selected = values.includes(option.value);
+                if (option.selected && !element.multiple)
+                    break;
+            }
+            element.dispatchEvent(new Event('input', { bubbles: true }));
+            element.dispatchEvent(new Event('change', { bubbles: true }));
+            return options.filter(option => option.selected).map(option => option.value);
+        }, values);
+    }
+    async uploadFile(...filePaths) {
+        const isMultiple = await this.evaluate((element) => element.multiple);
+        helper_1.assert(filePaths.length <= 1 || isMultiple, 'Multiple file uploads only work with <input type=file multiple>');
+        // This import is only needed for `uploadFile`, so keep it scoped here to avoid paying
+        // the cost unnecessarily.
+        // eslint-disable-next-line @typescript-eslint/no-var-requires
+        const path = require('path');
+        // eslint-disable-next-line @typescript-eslint/no-var-requires
+        const fs = require('fs');
+        // eslint-disable-next-line @typescript-eslint/no-var-requires
+        const { promisify } = require('util');
+        const access = promisify(fs.access);
+        // Locate all files and confirm that they exist.
+        const files = await Promise.all(filePaths.map(async (filePath) => {
+            const resolvedPath = path.resolve(filePath);
+            try {
+                await access(resolvedPath, fs.constants.R_OK);
+            }
+            catch (error) {
+                if (error.code === 'ENOENT')
+                    throw new Error(`${filePath} does not exist or is not readable`);
+            }
+            return resolvedPath;
+        }));
+        const { objectId } = this._remoteObject;
+        const { node } = await this._client.send('DOM.describeNode', { objectId });
+        const { backendNodeId } = node;
+        // The zero-length array is a special case, it seems that DOM.setFileInputFiles does
+        // not actually update the files in that case, so the solution is to eval the element
+        // value to a new FileList directly.
+        if (files.length === 0) {
+            await this.evaluate((element) => {
+                element.files = new DataTransfer().files;
+                // Dispatch events for this case because it should behave akin to a user action.
+                element.dispatchEvent(new Event('input', { bubbles: true }));
+                element.dispatchEvent(new Event('change', { bubbles: true }));
+            });
+        }
+        else {
+            await this._client.send('DOM.setFileInputFiles', { objectId, files, backendNodeId });
+        }
+    }
+    async tap() {
+        await this._scrollIntoViewIfNeeded();
+        const { x, y } = await this._clickablePoint();
+        await this._page.touchscreen.tap(x, y);
+    }
+    async focus() {
+        await this.evaluate(element => element.focus());
+    }
+    async type(text, options) {
+        await this.focus();
+        await this._page.keyboard.type(text, options);
+    }
+    async press(key, options) {
+        await this.focus();
+        await this._page.keyboard.press(key, options);
+    }
+    async boundingBox() {
+        const result = await this._getBoxModel();
+        if (!result)
+            return null;
+        const quad = result.model.border;
+        const x = Math.min(quad[0], quad[2], quad[4], quad[6]);
+        const y = Math.min(quad[1], quad[3], quad[5], quad[7]);
+        const width = Math.max(quad[0], quad[2], quad[4], quad[6]) - x;
+        const height = Math.max(quad[1], quad[3], quad[5], quad[7]) - y;
+        return { x, y, width, height };
+    }
+    /**
+     * @return {!Promise<?BoxModel>}
+     */
+    async boxModel() {
+        const result = await this._getBoxModel();
+        if (!result)
+            return null;
+        const { content, padding, border, margin, width, height } = result.model;
+        return {
+            content: this._fromProtocolQuad(content),
+            padding: this._fromProtocolQuad(padding),
+            border: this._fromProtocolQuad(border),
+            margin: this._fromProtocolQuad(margin),
+            width,
+            height
+        };
+    }
+    async screenshot(options = {}) {
+        let needsViewportReset = false;
+        let boundingBox = await this.boundingBox();
+        helper_1.assert(boundingBox, 'Node is either not visible or not an HTMLElement');
+        const viewport = this._page.viewport();
+        if (viewport && (boundingBox.width > viewport.width || boundingBox.height > viewport.height)) {
+            const newViewport = {
+                width: Math.max(viewport.width, Math.ceil(boundingBox.width)),
+                height: Math.max(viewport.height, Math.ceil(boundingBox.height)),
+            };
+            await this._page.setViewport(Object.assign({}, viewport, newViewport));
+            needsViewportReset = true;
+        }
+        await this._scrollIntoViewIfNeeded();
+        boundingBox = await this.boundingBox();
+        helper_1.assert(boundingBox, 'Node is either not visible or not an HTMLElement');
+        helper_1.assert(boundingBox.width !== 0, 'Node has 0 width.');
+        helper_1.assert(boundingBox.height !== 0, 'Node has 0 height.');
+        const { layoutViewport: { pageX, pageY } } = await this._client.send('Page.getLayoutMetrics');
+        const clip = Object.assign({}, boundingBox);
+        clip.x += pageX;
+        clip.y += pageY;
+        const imageData = await this._page.screenshot(Object.assign({}, {
+            clip
+        }, options));
+        if (needsViewportReset)
+            await this._page.setViewport(viewport);
+        return imageData;
+    }
+    async $(selector) {
+        const defaultHandler = (element, selector) => element.querySelector(selector);
+        const { updatedSelector, queryHandler } = QueryHandler_1.getQueryHandlerAndSelector(selector, defaultHandler);
+        const handle = await this.evaluateHandle(queryHandler, updatedSelector);
+        const element = handle.asElement();
+        if (element)
+            return element;
+        await handle.dispose();
+        return null;
+    }
+    async $$(selector) {
+        const defaultHandler = (element, selector) => element.querySelectorAll(selector);
+        const { updatedSelector, queryHandler } = QueryHandler_1.getQueryHandlerAndSelector(selector, defaultHandler);
+        const arrayHandle = await this.evaluateHandle(queryHandler, updatedSelector);
+        const properties = await arrayHandle.getProperties();
+        await arrayHandle.dispose();
+        const result = [];
+        for (const property of properties.values()) {
+            const elementHandle = property.asElement();
+            if (elementHandle)
+                result.push(elementHandle);
+        }
+        return result;
+    }
+    async $eval(selector, pageFunction, ...args) {
+        const elementHandle = await this.$(selector);
+        if (!elementHandle)
+            throw new Error(`Error: failed to find element matching selector "${selector}"`);
+        const result = await elementHandle.evaluate(pageFunction, ...args);
+        await elementHandle.dispose();
+        return result;
+    }
+    async $$eval(selector, pageFunction, ...args) {
+        const defaultHandler = (element, selector) => Array.from(element.querySelectorAll(selector));
+        const { updatedSelector, queryHandler } = QueryHandler_1.getQueryHandlerAndSelector(selector, defaultHandler);
+        const arrayHandle = await this.evaluateHandle(queryHandler, updatedSelector);
+        const result = await arrayHandle.evaluate(pageFunction, ...args);
+        await arrayHandle.dispose();
+        return result;
+    }
+    async $x(expression) {
+        const arrayHandle = await this.evaluateHandle((element, expression) => {
+            const document = element.ownerDocument || element;
+            const iterator = document.evaluate(expression, element, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE);
+            const array = [];
+            let item;
+            while ((item = iterator.iterateNext()))
+                array.push(item);
+            return array;
+        }, expression);
+        const properties = await arrayHandle.getProperties();
+        await arrayHandle.dispose();
+        const result = [];
+        for (const property of properties.values()) {
+            const elementHandle = property.asElement();
+            if (elementHandle)
+                result.push(elementHandle);
+        }
+        return result;
+    }
+    async isIntersectingViewport() {
+        return await this.evaluate(async (element) => {
+            const visibleRatio = await new Promise(resolve => {
+                const observer = new IntersectionObserver(entries => {
+                    resolve(entries[0].intersectionRatio);
+                    observer.disconnect();
+                });
+                observer.observe(element);
+            });
+            return visibleRatio > 0;
         });
-        observer.observe(element);
-      });
-      return visibleRatio > 0;
-    });
-  }
+    }
 }
-
+exports.ElementHandle = ElementHandle;
 function computeQuadArea(quad) {
-  // Compute sum of all directed areas of adjacent triangles
-  // https://en.wikipedia.org/wiki/Polygon#Simple_polygons
-  let area = 0;
-  for (let i = 0; i < quad.length; ++i) {
-    const p1 = quad[i];
-    const p2 = quad[(i + 1) % quad.length];
-    area += (p1.x * p2.y - p2.x * p1.y) / 2;
-  }
-  return Math.abs(area);
+    // Compute sum of all directed areas of adjacent triangles
+    // https://en.wikipedia.org/wiki/Polygon#Simple_polygons
+    let area = 0;
+    for (let i = 0; i < quad.length; ++i) {
+        const p1 = quad[i];
+        const p2 = quad[(i + 1) % quad.length];
+        area += (p1.x * p2.y - p2.x * p1.y) / 2;
+    }
+    return Math.abs(area);
 }
-
-/**
- * @typedef {Object} BoxModel
- * @property {!Array<!{x: number, y: number}>} content
- * @property {!Array<!{x: number, y: number}>} padding
- * @property {!Array<!{x: number, y: number}>} border
- * @property {!Array<!{x: number, y: number}>} margin
- * @property {number} width
- * @property {number} height
- */
-
-module.exports = {createJSHandle, JSHandle, ElementHandle};
diff --git a/node_modules/puppeteer/lib/Launcher.js b/node_modules/puppeteer/lib/Launcher.js
index 41dc1e5..5acaa40 100644
--- a/node_modules/puppeteer/lib/Launcher.js
+++ b/node_modules/puppeteer/lib/Launcher.js
@@ -1,3 +1,5 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,432 +15,619 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-const os = require('os');
-const path = require('path');
-const http = require('http');
-const https = require('https');
-const URL = require('url');
-const removeFolder = require('rimraf');
-const childProcess = require('child_process');
-const BrowserFetcher = require('./BrowserFetcher');
-const {Connection} = require('./Connection');
-const {Browser} = require('./Browser');
-const readline = require('readline');
-const fs = require('fs');
-const {helper, assert, debugError} = require('./helper');
-const {TimeoutError} = require('./Errors');
-const WebSocketTransport = require('./WebSocketTransport');
-const PipeTransport = require('./PipeTransport');
-
-const mkdtempAsync = helper.promisify(fs.mkdtemp);
-const removeFolderAsync = helper.promisify(removeFolder);
-
-const CHROME_PROFILE_PATH = path.join(os.tmpdir(), 'puppeteer_dev_profile-');
-
-const DEFAULT_ARGS = [
-  '--disable-background-networking',
-  '--enable-features=NetworkService,NetworkServiceInProcess',
-  '--disable-background-timer-throttling',
-  '--disable-backgrounding-occluded-windows',
-  '--disable-breakpad',
-  '--disable-client-side-phishing-detection',
-  '--disable-component-extensions-with-background-pages',
-  '--disable-default-apps',
-  '--disable-dev-shm-usage',
-  '--disable-extensions',
-  // BlinkGenPropertyTrees disabled due to crbug.com/937609
-  '--disable-features=TranslateUI,BlinkGenPropertyTrees',
-  '--disable-hang-monitor',
-  '--disable-ipc-flooding-protection',
-  '--disable-popup-blocking',
-  '--disable-prompt-on-repost',
-  '--disable-renderer-backgrounding',
-  '--disable-sync',
-  '--force-color-profile=srgb',
-  '--metrics-recording-only',
-  '--no-first-run',
-  '--enable-automation',
-  '--password-store=basic',
-  '--use-mock-keychain',
-];
-
-class Launcher {
-  /**
-   * @param {string} projectRoot
-   * @param {string} preferredRevision
-   * @param {boolean} isPuppeteerCore
-   */
-  constructor(projectRoot, preferredRevision, isPuppeteerCore) {
-    this._projectRoot = projectRoot;
-    this._preferredRevision = preferredRevision;
-    this._isPuppeteerCore = isPuppeteerCore;
-  }
-
-  /**
-   * @param {!(Launcher.LaunchOptions & Launcher.ChromeArgOptions & Launcher.BrowserOptions)=} options
-   * @return {!Promise<!Browser>}
-   */
-  async launch(options = {}) {
-    const {
-      ignoreDefaultArgs = false,
-      args = [],
-      dumpio = false,
-      executablePath = null,
-      pipe = false,
-      env = process.env,
-      handleSIGINT = true,
-      handleSIGTERM = true,
-      handleSIGHUP = true,
-      ignoreHTTPSErrors = false,
-      defaultViewport = {width: 800, height: 600},
-      slowMo = 0,
-      timeout = 30000
-    } = options;
-
-    const chromeArguments = [];
-    if (!ignoreDefaultArgs)
-      chromeArguments.push(...this.defaultArgs(options));
-    else if (Array.isArray(ignoreDefaultArgs))
-      chromeArguments.push(...this.defaultArgs(options).filter(arg => ignoreDefaultArgs.indexOf(arg) === -1));
-    else
-      chromeArguments.push(...args);
-
-    let temporaryUserDataDir = null;
-
-    if (!chromeArguments.some(argument => argument.startsWith('--remote-debugging-')))
-      chromeArguments.push(pipe ? '--remote-debugging-pipe' : '--remote-debugging-port=0');
-    if (!chromeArguments.some(arg => arg.startsWith('--user-data-dir'))) {
-      temporaryUserDataDir = await mkdtempAsync(CHROME_PROFILE_PATH);
-      chromeArguments.push(`--user-data-dir=${temporaryUserDataDir}`);
+const os = require("os");
+const path = require("path");
+const http = require("http");
+const https = require("https");
+const URL = require("url");
+const fs = require("fs");
+const readline = require("readline");
+const debug = require("debug");
+const removeFolder = require("rimraf");
+const childProcess = require("child_process");
+const BrowserFetcher_1 = require("./BrowserFetcher");
+const Connection_1 = require("./Connection");
+const Browser_1 = require("./Browser");
+const helper_1 = require("./helper");
+const Errors_1 = require("./Errors");
+const WebSocketTransport_1 = require("./WebSocketTransport");
+const PipeTransport_1 = require("./PipeTransport");
+const mkdtempAsync = helper_1.helper.promisify(fs.mkdtemp);
+const removeFolderAsync = helper_1.helper.promisify(removeFolder);
+const writeFileAsync = helper_1.helper.promisify(fs.writeFile);
+const debugLauncher = debug('puppeteer:launcher');
+class BrowserRunner {
+    constructor(executablePath, processArguments, tempDirectory) {
+        this.proc = null;
+        this.connection = null;
+        this._closed = true;
+        this._listeners = [];
+        this._executablePath = executablePath;
+        this._processArguments = processArguments;
+        this._tempDirectory = tempDirectory;
     }
-
-    let chromeExecutable = executablePath;
-    if (!executablePath) {
-      const {missingText, executablePath} = this._resolveExecutablePath();
-      if (missingText)
-        throw new Error(missingText);
-      chromeExecutable = executablePath;
-    }
-
-    const usePipe = chromeArguments.includes('--remote-debugging-pipe');
-    /** @type {!Array<"ignore"|"pipe">} */
-    let stdio = ['pipe', 'pipe', 'pipe'];
-    if (usePipe) {
-      if (dumpio)
-        stdio = ['ignore', 'pipe', 'pipe', 'pipe', 'pipe'];
-      else
-        stdio = ['ignore', 'ignore', 'ignore', 'pipe', 'pipe'];
-    }
-    const chromeProcess = childProcess.spawn(
-        chromeExecutable,
-        chromeArguments,
-        {
-          // On non-windows platforms, `detached: true` makes child process a leader of a new
-          // process group, making it possible to kill child process tree with `.kill(-pid)` command.
-          // @see https://nodejs.org/api/child_process.html#child_process_options_detached
-          detached: process.platform !== 'win32',
-          env,
-          stdio
+    start(options = {}) {
+        const { handleSIGINT, handleSIGTERM, handleSIGHUP, dumpio, env, pipe } = options;
+        let stdio = ['pipe', 'pipe', 'pipe'];
+        if (pipe) {
+            if (dumpio)
+                stdio = ['ignore', 'pipe', 'pipe', 'pipe', 'pipe'];
+            else
+                stdio = ['ignore', 'ignore', 'ignore', 'pipe', 'pipe'];
         }
-    );
-
-    if (dumpio) {
-      chromeProcess.stderr.pipe(process.stderr);
-      chromeProcess.stdout.pipe(process.stdout);
-    }
-
-    let chromeClosed = false;
-    const waitForChromeToClose = new Promise((fulfill, reject) => {
-      chromeProcess.once('exit', () => {
-        chromeClosed = true;
-        // Cleanup as processes exit.
-        if (temporaryUserDataDir) {
-          removeFolderAsync(temporaryUserDataDir)
-              .then(() => fulfill())
-              .catch(err => console.error(err));
-        } else {
-          fulfill();
-        }
-      });
-    });
-
-    const listeners = [ helper.addEventListener(process, 'exit', killChrome) ];
-    if (handleSIGINT)
-      listeners.push(helper.addEventListener(process, 'SIGINT', () => { killChrome(); process.exit(130); }));
-    if (handleSIGTERM)
-      listeners.push(helper.addEventListener(process, 'SIGTERM', gracefullyCloseChrome));
-    if (handleSIGHUP)
-      listeners.push(helper.addEventListener(process, 'SIGHUP', gracefullyCloseChrome));
-    /** @type {?Connection} */
-    let connection = null;
-    try {
-      if (!usePipe) {
-        const browserWSEndpoint = await waitForWSEndpoint(chromeProcess, timeout, this._preferredRevision);
-        const transport = await WebSocketTransport.create(browserWSEndpoint);
-        connection = new Connection(browserWSEndpoint, transport, slowMo);
-      } else {
-        const transport = new PipeTransport(/** @type {!NodeJS.WritableStream} */(chromeProcess.stdio[3]), /** @type {!NodeJS.ReadableStream} */ (chromeProcess.stdio[4]));
-        connection = new Connection('', transport, slowMo);
-      }
-      const browser = await Browser.create(connection, [], ignoreHTTPSErrors, defaultViewport, chromeProcess, gracefullyCloseChrome);
-      await browser.waitForTarget(t => t.type() === 'page');
-      return browser;
-    } catch (e) {
-      killChrome();
-      throw e;
-    }
-
-    /**
-     * @return {Promise}
-     */
-    function gracefullyCloseChrome() {
-      helper.removeEventListeners(listeners);
-      if (temporaryUserDataDir) {
-        killChrome();
-      } else if (connection) {
-        // Attempt to close chrome gracefully
-        connection.send('Browser.close').catch(error => {
-          debugError(error);
-          killChrome();
+        helper_1.assert(!this.proc, 'This process has previously been started.');
+        debugLauncher(`Calling ${this._executablePath} ${this._processArguments.join(' ')}`);
+        this.proc = childProcess.spawn(this._executablePath, this._processArguments, {
+            // On non-windows platforms, `detached: true` makes child process a leader of a new
+            // process group, making it possible to kill child process tree with `.kill(-pid)` command.
+            // @see https://nodejs.org/api/child_process.html#child_process_options_detached
+            detached: process.platform !== 'win32',
+            env,
+            stdio
         });
-      }
-      return waitForChromeToClose;
-    }
-
-    // This method has to be sync to be used as 'exit' event handler.
-    function killChrome() {
-      helper.removeEventListeners(listeners);
-      if (chromeProcess.pid && !chromeProcess.killed && !chromeClosed) {
-        // Force kill chrome.
-        try {
-          if (process.platform === 'win32')
-            childProcess.execSync(`taskkill /pid ${chromeProcess.pid} /T /F`);
-          else
-            process.kill(-chromeProcess.pid, 'SIGKILL');
-        } catch (e) {
-          // the process might have already stopped
+        if (dumpio) {
+            this.proc.stderr.pipe(process.stderr);
+            this.proc.stdout.pipe(process.stdout);
         }
-      }
-      // Attempt to remove temporary profile directory to avoid littering.
-      try {
-        removeFolder.sync(temporaryUserDataDir);
-      } catch (e) { }
+        this._closed = false;
+        this._processClosing = new Promise(fulfill => {
+            this.proc.once('exit', () => {
+                this._closed = true;
+                // Cleanup as processes exit.
+                if (this._tempDirectory) {
+                    removeFolderAsync(this._tempDirectory)
+                        .then(() => fulfill())
+                        .catch(error => console.error(error));
+                }
+                else {
+                    fulfill();
+                }
+            });
+        });
+        this._listeners = [helper_1.helper.addEventListener(process, 'exit', this.kill.bind(this))];
+        if (handleSIGINT)
+            this._listeners.push(helper_1.helper.addEventListener(process, 'SIGINT', () => { this.kill(); process.exit(130); }));
+        if (handleSIGTERM)
+            this._listeners.push(helper_1.helper.addEventListener(process, 'SIGTERM', this.close.bind(this)));
+        if (handleSIGHUP)
+            this._listeners.push(helper_1.helper.addEventListener(process, 'SIGHUP', this.close.bind(this)));
     }
-  }
-
-  /**
-   * @param {!Launcher.ChromeArgOptions=} options
-   * @return {!Array<string>}
-   */
-  defaultArgs(options = {}) {
-    const {
-      devtools = false,
-      headless = !devtools,
-      args = [],
-      userDataDir = null
-    } = options;
-    const chromeArguments = [...DEFAULT_ARGS];
-    if (userDataDir)
-      chromeArguments.push(`--user-data-dir=${userDataDir}`);
-    if (devtools)
-      chromeArguments.push('--auto-open-devtools-for-tabs');
-    if (headless) {
-      chromeArguments.push(
-          '--headless',
-          '--hide-scrollbars',
-          '--mute-audio'
-      );
+    close() {
+        if (this._closed)
+            return Promise.resolve();
+        helper_1.helper.removeEventListeners(this._listeners);
+        if (this._tempDirectory) {
+            this.kill();
+        }
+        else if (this.connection) {
+            // Attempt to close the browser gracefully
+            this.connection.send('Browser.close').catch(error => {
+                helper_1.debugError(error);
+                this.kill();
+            });
+        }
+        return this._processClosing;
     }
-    if (args.every(arg => arg.startsWith('-')))
-      chromeArguments.push('about:blank');
-    chromeArguments.push(...args);
-    return chromeArguments;
-  }
-
-  /**
-   * @return {string}
-   */
-  executablePath() {
-    return this._resolveExecutablePath().executablePath;
-  }
-
-  /**
-   * @param {!(Launcher.BrowserOptions & {browserWSEndpoint?: string, browserURL?: string, transport?: !Puppeteer.ConnectionTransport})} options
-   * @return {!Promise<!Browser>}
-   */
-  async connect(options) {
-    const {
-      browserWSEndpoint,
-      browserURL,
-      ignoreHTTPSErrors = false,
-      defaultViewport = {width: 800, height: 600},
-      transport,
-      slowMo = 0,
-    } = options;
-
-    assert(Number(!!browserWSEndpoint) + Number(!!browserURL) + Number(!!transport) === 1, 'Exactly one of browserWSEndpoint, browserURL or transport must be passed to puppeteer.connect');
-
-    let connection = null;
-    if (transport) {
-      connection = new Connection('', transport, slowMo);
-    } else if (browserWSEndpoint) {
-      const connectionTransport = await WebSocketTransport.create(browserWSEndpoint);
-      connection = new Connection(browserWSEndpoint, connectionTransport, slowMo);
-    } else if (browserURL) {
-      const connectionURL = await getWSEndpoint(browserURL);
-      const connectionTransport = await WebSocketTransport.create(connectionURL);
-      connection = new Connection(connectionURL, connectionTransport, slowMo);
+    kill() {
+        helper_1.helper.removeEventListeners(this._listeners);
+        if (this.proc && this.proc.pid && !this.proc.killed && !this._closed) {
+            try {
+                if (process.platform === 'win32')
+                    childProcess.execSync(`taskkill /pid ${this.proc.pid} /T /F`);
+                else
+                    process.kill(-this.proc.pid, 'SIGKILL');
+            }
+            catch (error) {
+                // the process might have already stopped
+            }
+        }
+        // Attempt to remove temporary profile directory to avoid littering.
+        try {
+            removeFolder.sync(this._tempDirectory);
+        }
+        catch (error) { }
     }
-
-    const {browserContextIds} = await connection.send('Target.getBrowserContexts');
-    return Browser.create(connection, browserContextIds, ignoreHTTPSErrors, defaultViewport, null, () => connection.send('Browser.close').catch(debugError));
-  }
-
-  /**
-   * @return {{executablePath: string, missingText: ?string}}
-   */
-  _resolveExecutablePath() {
-    // puppeteer-core doesn't take into account PUPPETEER_* env variables.
-    if (!this._isPuppeteerCore) {
-      const executablePath = process.env.PUPPETEER_EXECUTABLE_PATH || process.env.npm_config_puppeteer_executable_path || process.env.npm_package_config_puppeteer_executable_path;
-      if (executablePath) {
-        const missingText = !fs.existsSync(executablePath) ? 'Tried to use PUPPETEER_EXECUTABLE_PATH env variable to launch browser but did not find any executable at: ' + executablePath : null;
-        return { executablePath, missingText };
-      }
-    }
-    const browserFetcher = new BrowserFetcher(this._projectRoot);
-    if (!this._isPuppeteerCore) {
-      const revision = process.env['PUPPETEER_CHROMIUM_REVISION'];
-      if (revision) {
-        const revisionInfo = browserFetcher.revisionInfo(revision);
-        const missingText = !revisionInfo.local ? 'Tried to use PUPPETEER_CHROMIUM_REVISION env variable to launch browser but did not find executable at: ' + revisionInfo.executablePath : null;
-        return {executablePath: revisionInfo.executablePath, missingText};
-      }
-    }
-    const revisionInfo = browserFetcher.revisionInfo(this._preferredRevision);
-    const missingText = !revisionInfo.local ? `Chromium revision is not downloaded. Run "npm install" or "yarn install"` : null;
-    return {executablePath: revisionInfo.executablePath, missingText};
-  }
-
-}
-
-/**
- * @param {!Puppeteer.ChildProcess} chromeProcess
- * @param {number} timeout
- * @param {string} preferredRevision
- * @return {!Promise<string>}
- */
-function waitForWSEndpoint(chromeProcess, timeout, preferredRevision) {
-  return new Promise((resolve, reject) => {
-    const rl = readline.createInterface({ input: chromeProcess.stderr });
-    let stderr = '';
-    const listeners = [
-      helper.addEventListener(rl, 'line', onLine),
-      helper.addEventListener(rl, 'close', () => onClose()),
-      helper.addEventListener(chromeProcess, 'exit', () => onClose()),
-      helper.addEventListener(chromeProcess, 'error', error => onClose(error))
-    ];
-    const timeoutId = timeout ? setTimeout(onTimeout, timeout) : 0;
-
     /**
-     * @param {!Error=} error
+     * @param {!({usePipe?: boolean, timeout: number, slowMo: number, preferredRevision: string})} options
+     *
+     * @return {!Promise<!Connection>}
      */
-    function onClose(error) {
-      cleanup();
-      reject(new Error([
-        'Failed to launch chrome!' + (error ? ' ' + error.message : ''),
-        stderr,
-        '',
-        'TROUBLESHOOTING: https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md',
-        '',
-      ].join('\n')));
+    async setupConnection(options) {
+        const { usePipe, timeout, slowMo, preferredRevision } = options;
+        if (!usePipe) {
+            const browserWSEndpoint = await waitForWSEndpoint(this.proc, timeout, preferredRevision);
+            const transport = await WebSocketTransport_1.WebSocketTransport.create(browserWSEndpoint);
+            this.connection = new Connection_1.Connection(browserWSEndpoint, transport, slowMo);
+        }
+        else {
+            // stdio was assigned during start(), and the 'pipe' option there adds the 4th and 5th items to stdio array
+            const { 3: pipeWrite, 4: pipeRead } = this.proc.stdio;
+            const transport = new PipeTransport_1.PipeTransport(pipeWrite, pipeRead);
+            this.connection = new Connection_1.Connection('', transport, slowMo);
+        }
+        return this.connection;
     }
-
-    function onTimeout() {
-      cleanup();
-      reject(new TimeoutError(`Timed out after ${timeout} ms while trying to connect to Chrome! The only Chrome revision guaranteed to work is r${preferredRevision}`));
-    }
-
-    /**
-     * @param {string} line
-     */
-    function onLine(line) {
-      stderr += line + '\n';
-      const match = line.match(/^DevTools listening on (ws:\/\/.*)$/);
-      if (!match)
-        return;
-      cleanup();
-      resolve(match[1]);
-    }
-
-    function cleanup() {
-      if (timeoutId)
-        clearTimeout(timeoutId);
-      helper.removeEventListeners(listeners);
-    }
-  });
 }
-
-/**
- * @param {string} browserURL
- * @return {!Promise<string>}
- */
+class ChromeLauncher {
+    constructor(projectRoot, preferredRevision, isPuppeteerCore) {
+        this._projectRoot = projectRoot;
+        this._preferredRevision = preferredRevision;
+        this._isPuppeteerCore = isPuppeteerCore;
+    }
+    async launch(options = {}) {
+        const { ignoreDefaultArgs = false, args = [], dumpio = false, executablePath = null, pipe = false, env = process.env, handleSIGINT = true, handleSIGTERM = true, handleSIGHUP = true, ignoreHTTPSErrors = false, defaultViewport = { width: 800, height: 600 }, slowMo = 0, timeout = 30000 } = options;
+        const profilePath = path.join(os.tmpdir(), 'puppeteer_dev_chrome_profile-');
+        const chromeArguments = [];
+        if (!ignoreDefaultArgs)
+            chromeArguments.push(...this.defaultArgs(options));
+        else if (Array.isArray(ignoreDefaultArgs))
+            chromeArguments.push(...this.defaultArgs(options).filter(arg => !ignoreDefaultArgs.includes(arg)));
+        else
+            chromeArguments.push(...args);
+        let temporaryUserDataDir = null;
+        if (!chromeArguments.some(argument => argument.startsWith('--remote-debugging-')))
+            chromeArguments.push(pipe ? '--remote-debugging-pipe' : '--remote-debugging-port=0');
+        if (!chromeArguments.some(arg => arg.startsWith('--user-data-dir'))) {
+            temporaryUserDataDir = await mkdtempAsync(profilePath);
+            chromeArguments.push(`--user-data-dir=${temporaryUserDataDir}`);
+        }
+        let chromeExecutable = executablePath;
+        if (!executablePath) {
+            const { missingText, executablePath } = resolveExecutablePath(this);
+            if (missingText)
+                throw new Error(missingText);
+            chromeExecutable = executablePath;
+        }
+        const usePipe = chromeArguments.includes('--remote-debugging-pipe');
+        const runner = new BrowserRunner(chromeExecutable, chromeArguments, temporaryUserDataDir);
+        runner.start({ handleSIGHUP, handleSIGTERM, handleSIGINT, dumpio, env, pipe: usePipe });
+        try {
+            const connection = await runner.setupConnection({ usePipe, timeout, slowMo, preferredRevision: this._preferredRevision });
+            const browser = await Browser_1.Browser.create(connection, [], ignoreHTTPSErrors, defaultViewport, runner.proc, runner.close.bind(runner));
+            await browser.waitForTarget(t => t.type() === 'page');
+            return browser;
+        }
+        catch (error) {
+            runner.kill();
+            throw error;
+        }
+    }
+    /**
+     * @param {!Launcher.ChromeArgOptions=} options
+     * @return {!Array<string>}
+     */
+    defaultArgs(options = {}) {
+        const chromeArguments = [
+            '--disable-background-networking',
+            '--enable-features=NetworkService,NetworkServiceInProcess',
+            '--disable-background-timer-throttling',
+            '--disable-backgrounding-occluded-windows',
+            '--disable-breakpad',
+            '--disable-client-side-phishing-detection',
+            '--disable-component-extensions-with-background-pages',
+            '--disable-default-apps',
+            '--disable-dev-shm-usage',
+            '--disable-extensions',
+            '--disable-features=TranslateUI',
+            '--disable-hang-monitor',
+            '--disable-ipc-flooding-protection',
+            '--disable-popup-blocking',
+            '--disable-prompt-on-repost',
+            '--disable-renderer-backgrounding',
+            '--disable-sync',
+            '--force-color-profile=srgb',
+            '--metrics-recording-only',
+            '--no-first-run',
+            '--enable-automation',
+            '--password-store=basic',
+            '--use-mock-keychain',
+        ];
+        const { devtools = false, headless = !devtools, args = [], userDataDir = null } = options;
+        if (userDataDir)
+            chromeArguments.push(`--user-data-dir=${userDataDir}`);
+        if (devtools)
+            chromeArguments.push('--auto-open-devtools-for-tabs');
+        if (headless) {
+            chromeArguments.push('--headless', '--hide-scrollbars', '--mute-audio');
+        }
+        if (args.every(arg => arg.startsWith('-')))
+            chromeArguments.push('about:blank');
+        chromeArguments.push(...args);
+        return chromeArguments;
+    }
+    executablePath() {
+        return resolveExecutablePath(this).executablePath;
+    }
+    get product() {
+        return 'chrome';
+    }
+    async connect(options) {
+        const { browserWSEndpoint, browserURL, ignoreHTTPSErrors = false, defaultViewport = { width: 800, height: 600 }, transport, slowMo = 0, } = options;
+        helper_1.assert(Number(!!browserWSEndpoint) + Number(!!browserURL) + Number(!!transport) === 1, 'Exactly one of browserWSEndpoint, browserURL or transport must be passed to puppeteer.connect');
+        let connection = null;
+        if (transport) {
+            connection = new Connection_1.Connection('', transport, slowMo);
+        }
+        else if (browserWSEndpoint) {
+            const connectionTransport = await WebSocketTransport_1.WebSocketTransport.create(browserWSEndpoint);
+            connection = new Connection_1.Connection(browserWSEndpoint, connectionTransport, slowMo);
+        }
+        else if (browserURL) {
+            const connectionURL = await getWSEndpoint(browserURL);
+            const connectionTransport = await WebSocketTransport_1.WebSocketTransport.create(connectionURL);
+            connection = new Connection_1.Connection(connectionURL, connectionTransport, slowMo);
+        }
+        const { browserContextIds } = await connection.send('Target.getBrowserContexts');
+        return Browser_1.Browser.create(connection, browserContextIds, ignoreHTTPSErrors, defaultViewport, null, () => connection.send('Browser.close').catch(helper_1.debugError));
+    }
+}
+class FirefoxLauncher {
+    constructor(projectRoot, preferredRevision, isPuppeteerCore) {
+        this._projectRoot = projectRoot;
+        this._preferredRevision = preferredRevision;
+        this._isPuppeteerCore = isPuppeteerCore;
+    }
+    async launch(options = {}) {
+        const { ignoreDefaultArgs = false, args = [], dumpio = false, executablePath = null, pipe = false, env = process.env, handleSIGINT = true, handleSIGTERM = true, handleSIGHUP = true, ignoreHTTPSErrors = false, defaultViewport = { width: 800, height: 600 }, slowMo = 0, timeout = 30000, extraPrefsFirefox = {} } = options;
+        const firefoxArguments = [];
+        if (!ignoreDefaultArgs)
+            firefoxArguments.push(...this.defaultArgs(options));
+        else if (Array.isArray(ignoreDefaultArgs))
+            firefoxArguments.push(...this.defaultArgs(options).filter(arg => !ignoreDefaultArgs.includes(arg)));
+        else
+            firefoxArguments.push(...args);
+        if (!firefoxArguments.some(argument => argument.startsWith('--remote-debugging-')))
+            firefoxArguments.push('--remote-debugging-port=0');
+        let temporaryUserDataDir = null;
+        if (!firefoxArguments.includes('-profile') && !firefoxArguments.includes('--profile')) {
+            temporaryUserDataDir = await this._createProfile(extraPrefsFirefox);
+            firefoxArguments.push('--profile');
+            firefoxArguments.push(temporaryUserDataDir);
+        }
+        await this._updateRevision();
+        let firefoxExecutable = executablePath;
+        if (!executablePath) {
+            const { missingText, executablePath } = resolveExecutablePath(this);
+            if (missingText)
+                throw new Error(missingText);
+            firefoxExecutable = executablePath;
+        }
+        const runner = new BrowserRunner(firefoxExecutable, firefoxArguments, temporaryUserDataDir);
+        runner.start({ handleSIGHUP, handleSIGTERM, handleSIGINT, dumpio, env, pipe });
+        try {
+            const connection = await runner.setupConnection({ usePipe: pipe, timeout, slowMo, preferredRevision: this._preferredRevision });
+            const browser = await Browser_1.Browser.create(connection, [], ignoreHTTPSErrors, defaultViewport, runner.proc, runner.close.bind(runner));
+            await browser.waitForTarget(t => t.type() === 'page');
+            return browser;
+        }
+        catch (error) {
+            runner.kill();
+            throw error;
+        }
+    }
+    async connect(options) {
+        const { browserWSEndpoint, browserURL, ignoreHTTPSErrors = false, defaultViewport = { width: 800, height: 600 }, transport, slowMo = 0, } = options;
+        helper_1.assert(Number(!!browserWSEndpoint) + Number(!!browserURL) + Number(!!transport) === 1, 'Exactly one of browserWSEndpoint, browserURL or transport must be passed to puppeteer.connect');
+        let connection = null;
+        if (transport) {
+            connection = new Connection_1.Connection('', transport, slowMo);
+        }
+        else if (browserWSEndpoint) {
+            const connectionTransport = await WebSocketTransport_1.WebSocketTransport.create(browserWSEndpoint);
+            connection = new Connection_1.Connection(browserWSEndpoint, connectionTransport, slowMo);
+        }
+        else if (browserURL) {
+            const connectionURL = await getWSEndpoint(browserURL);
+            const connectionTransport = await WebSocketTransport_1.WebSocketTransport.create(connectionURL);
+            connection = new Connection_1.Connection(connectionURL, connectionTransport, slowMo);
+        }
+        const { browserContextIds } = await connection.send('Target.getBrowserContexts');
+        return Browser_1.Browser.create(connection, browserContextIds, ignoreHTTPSErrors, defaultViewport, null, () => connection.send('Browser.close').catch(helper_1.debugError));
+    }
+    executablePath() {
+        return resolveExecutablePath(this).executablePath;
+    }
+    async _updateRevision() {
+        // replace 'latest' placeholder with actual downloaded revision
+        if (this._preferredRevision === 'latest') {
+            const browserFetcher = new BrowserFetcher_1.BrowserFetcher(this._projectRoot, { product: this.product });
+            const localRevisions = await browserFetcher.localRevisions();
+            if (localRevisions[0])
+                this._preferredRevision = localRevisions[0];
+        }
+    }
+    get product() {
+        return 'firefox';
+    }
+    defaultArgs(options = {}) {
+        const firefoxArguments = [
+            '--no-remote',
+            '--foreground',
+        ];
+        const { devtools = false, headless = !devtools, args = [], userDataDir = null } = options;
+        if (userDataDir) {
+            firefoxArguments.push('--profile');
+            firefoxArguments.push(userDataDir);
+        }
+        if (headless)
+            firefoxArguments.push('--headless');
+        if (devtools)
+            firefoxArguments.push('--devtools');
+        if (args.every(arg => arg.startsWith('-')))
+            firefoxArguments.push('about:blank');
+        firefoxArguments.push(...args);
+        return firefoxArguments;
+    }
+    async _createProfile(extraPrefs) {
+        const profilePath = await mkdtempAsync(path.join(os.tmpdir(), 'puppeteer_dev_firefox_profile-'));
+        const prefsJS = [];
+        const userJS = [];
+        const server = 'dummy.test';
+        const defaultPreferences = {
+            // Make sure Shield doesn't hit the network.
+            'app.normandy.api_url': '',
+            // Disable Firefox old build background check
+            'app.update.checkInstallTime': false,
+            // Disable automatically upgrading Firefox
+            'app.update.disabledForTesting': true,
+            // Increase the APZ content response timeout to 1 minute
+            'apz.content_response_timeout': 60000,
+            // Prevent various error message on the console
+            // jest-puppeteer asserts that no error message is emitted by the console
+            'browser.contentblocking.features.standard': '-tp,tpPrivate,cookieBehavior0,-cm,-fp',
+            // Enable the dump function: which sends messages to the system
+            // console
+            // https://bugzilla.mozilla.org/show_bug.cgi?id=1543115
+            'browser.dom.window.dump.enabled': true,
+            // Disable topstories
+            'browser.newtabpage.activity-stream.feeds.section.topstories': false,
+            // Always display a blank page
+            'browser.newtabpage.enabled': false,
+            // Background thumbnails in particular cause grief: and disabling
+            // thumbnails in general cannot hurt
+            'browser.pagethumbnails.capturing_disabled': true,
+            // Disable safebrowsing components.
+            'browser.safebrowsing.blockedURIs.enabled': false,
+            'browser.safebrowsing.downloads.enabled': false,
+            'browser.safebrowsing.malware.enabled': false,
+            'browser.safebrowsing.passwords.enabled': false,
+            'browser.safebrowsing.phishing.enabled': false,
+            // Disable updates to search engines.
+            'browser.search.update': false,
+            // Do not restore the last open set of tabs if the browser has crashed
+            'browser.sessionstore.resume_from_crash': false,
+            // Skip check for default browser on startup
+            'browser.shell.checkDefaultBrowser': false,
+            // Disable newtabpage
+            'browser.startup.homepage': 'about:blank',
+            // Do not redirect user when a milstone upgrade of Firefox is detected
+            'browser.startup.homepage_override.mstone': 'ignore',
+            // Start with a blank page about:blank
+            'browser.startup.page': 0,
+            // Do not allow background tabs to be zombified on Android: otherwise for
+            // tests that open additional tabs: the test harness tab itself might get
+            // unloaded
+            'browser.tabs.disableBackgroundZombification': false,
+            // Do not warn when closing all other open tabs
+            'browser.tabs.warnOnCloseOtherTabs': false,
+            // Do not warn when multiple tabs will be opened
+            'browser.tabs.warnOnOpen': false,
+            // Disable the UI tour.
+            'browser.uitour.enabled': false,
+            // Turn off search suggestions in the location bar so as not to trigger
+            // network connections.
+            'browser.urlbar.suggest.searches': false,
+            // Disable first run splash page on Windows 10
+            'browser.usedOnWindows10.introURL': '',
+            // Do not warn on quitting Firefox
+            'browser.warnOnQuit': false,
+            // Do not show datareporting policy notifications which can
+            // interfere with tests
+            'datareporting.healthreport.about.reportUrl': `http://${server}/dummy/abouthealthreport/`,
+            'datareporting.healthreport.documentServerURI': `http://${server}/dummy/healthreport/`,
+            'datareporting.healthreport.logging.consoleEnabled': false,
+            'datareporting.healthreport.service.enabled': false,
+            'datareporting.healthreport.service.firstRun': false,
+            'datareporting.healthreport.uploadEnabled': false,
+            'datareporting.policy.dataSubmissionEnabled': false,
+            'datareporting.policy.dataSubmissionPolicyAccepted': false,
+            'datareporting.policy.dataSubmissionPolicyBypassNotification': true,
+            // DevTools JSONViewer sometimes fails to load dependencies with its require.js.
+            // This doesn't affect Puppeteer but spams console (Bug 1424372)
+            'devtools.jsonview.enabled': false,
+            // Disable popup-blocker
+            'dom.disable_open_during_load': false,
+            // Enable the support for File object creation in the content process
+            // Required for |Page.setFileInputFiles| protocol method.
+            'dom.file.createInChild': true,
+            // Disable the ProcessHangMonitor
+            'dom.ipc.reportProcessHangs': false,
+            // Disable slow script dialogues
+            'dom.max_chrome_script_run_time': 0,
+            'dom.max_script_run_time': 0,
+            // Only load extensions from the application and user profile
+            // AddonManager.SCOPE_PROFILE + AddonManager.SCOPE_APPLICATION
+            'extensions.autoDisableScopes': 0,
+            'extensions.enabledScopes': 5,
+            // Disable metadata caching for installed add-ons by default
+            'extensions.getAddons.cache.enabled': false,
+            // Disable installing any distribution extensions or add-ons.
+            'extensions.installDistroAddons': false,
+            // Disabled screenshots extension
+            'extensions.screenshots.disabled': true,
+            // Turn off extension updates so they do not bother tests
+            'extensions.update.enabled': false,
+            // Turn off extension updates so they do not bother tests
+            'extensions.update.notifyUser': false,
+            // Make sure opening about:addons will not hit the network
+            'extensions.webservice.discoverURL': `http://${server}/dummy/discoveryURL`,
+            // Allow the application to have focus even it runs in the background
+            'focusmanager.testmode': true,
+            // Disable useragent updates
+            'general.useragent.updates.enabled': false,
+            // Always use network provider for geolocation tests so we bypass the
+            // macOS dialog raised by the corelocation provider
+            'geo.provider.testing': true,
+            // Do not scan Wifi
+            'geo.wifi.scan': false,
+            // No hang monitor
+            'hangmonitor.timeout': 0,
+            // Show chrome errors and warnings in the error console
+            'javascript.options.showInConsole': true,
+            // Disable download and usage of OpenH264: and Widevine plugins
+            'media.gmp-manager.updateEnabled': false,
+            // Prevent various error message on the console
+            // jest-puppeteer asserts that no error message is emitted by the console
+            'network.cookie.cookieBehavior': 0,
+            // Do not prompt for temporary redirects
+            'network.http.prompt-temp-redirect': false,
+            // Disable speculative connections so they are not reported as leaking
+            // when they are hanging around
+            'network.http.speculative-parallel-limit': 0,
+            // Do not automatically switch between offline and online
+            'network.manage-offline-status': false,
+            // Make sure SNTP requests do not hit the network
+            'network.sntp.pools': server,
+            // Disable Flash.
+            'plugin.state.flash': 0,
+            'privacy.trackingprotection.enabled': false,
+            // Enable Remote Agent
+            // https://bugzilla.mozilla.org/show_bug.cgi?id=1544393
+            'remote.enabled': true,
+            // Don't do network connections for mitm priming
+            'security.certerrors.mitm.priming.enabled': false,
+            // Local documents have access to all other local documents,
+            // including directory listings
+            'security.fileuri.strict_origin_policy': false,
+            // Do not wait for the notification button security delay
+            'security.notification_enable_delay': 0,
+            // Ensure blocklist updates do not hit the network
+            'services.settings.server': `http://${server}/dummy/blocklist/`,
+            // Do not automatically fill sign-in forms with known usernames and
+            // passwords
+            'signon.autofillForms': false,
+            // Disable password capture, so that tests that include forms are not
+            // influenced by the presence of the persistent doorhanger notification
+            'signon.rememberSignons': false,
+            // Disable first-run welcome page
+            'startup.homepage_welcome_url': 'about:blank',
+            // Disable first-run welcome page
+            'startup.homepage_welcome_url.additional': '',
+            // Disable browser animations (tabs, fullscreen, sliding alerts)
+            'toolkit.cosmeticAnimations.enabled': false,
+            // We want to collect telemetry, but we don't want to send in the results
+            'toolkit.telemetry.server': `https://${server}/dummy/telemetry/`,
+            // Prevent starting into safe mode after application crashes
+            'toolkit.startup.max_resumed_crashes': -1,
+        };
+        Object.assign(defaultPreferences, extraPrefs);
+        for (const [key, value] of Object.entries(defaultPreferences))
+            userJS.push(`user_pref(${JSON.stringify(key)}, ${JSON.stringify(value)});`);
+        await writeFileAsync(path.join(profilePath, 'user.js'), userJS.join('\n'));
+        await writeFileAsync(path.join(profilePath, 'prefs.js'), prefsJS.join('\n'));
+        return profilePath;
+    }
+}
+function waitForWSEndpoint(browserProcess, timeout, preferredRevision) {
+    return new Promise((resolve, reject) => {
+        const rl = readline.createInterface({ input: browserProcess.stderr });
+        let stderr = '';
+        const listeners = [
+            helper_1.helper.addEventListener(rl, 'line', onLine),
+            helper_1.helper.addEventListener(rl, 'close', () => onClose()),
+            helper_1.helper.addEventListener(browserProcess, 'exit', () => onClose()),
+            helper_1.helper.addEventListener(browserProcess, 'error', error => onClose(error))
+        ];
+        const timeoutId = timeout ? setTimeout(onTimeout, timeout) : 0;
+        /**
+         * @param {!Error=} error
+         */
+        function onClose(error) {
+            cleanup();
+            reject(new Error([
+                'Failed to launch the browser process!' + (error ? ' ' + error.message : ''),
+                stderr,
+                '',
+                'TROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/master/docs/troubleshooting.md',
+                '',
+            ].join('\n')));
+        }
+        function onTimeout() {
+            cleanup();
+            reject(new Errors_1.TimeoutError(`Timed out after ${timeout} ms while trying to connect to the browser! Only Chrome at revision r${preferredRevision} is guaranteed to work.`));
+        }
+        function onLine(line) {
+            stderr += line + '\n';
+            const match = line.match(/^DevTools listening on (ws:\/\/.*)$/);
+            if (!match)
+                return;
+            cleanup();
+            resolve(match[1]);
+        }
+        function cleanup() {
+            if (timeoutId)
+                clearTimeout(timeoutId);
+            helper_1.helper.removeEventListeners(listeners);
+        }
+    });
+}
 function getWSEndpoint(browserURL) {
-  let resolve, reject;
-  const promise = new Promise((res, rej) => { resolve = res; reject = rej; });
-
-  const endpointURL = URL.resolve(browserURL, '/json/version');
-  const protocol = endpointURL.startsWith('https') ? https : http;
-  const requestOptions = Object.assign(URL.parse(endpointURL), { method: 'GET' });
-  const request = protocol.request(requestOptions, res => {
-    let data = '';
-    if (res.statusCode !== 200) {
-      // Consume response data to free up memory.
-      res.resume();
-      reject(new Error('HTTP ' + res.statusCode));
-      return;
-    }
-    res.setEncoding('utf8');
-    res.on('data', chunk => data += chunk);
-    res.on('end', () => resolve(JSON.parse(data).webSocketDebuggerUrl));
-  });
-
-  request.on('error', reject);
-  request.end();
-
-  return promise.catch(e => {
-    e.message = `Failed to fetch browser webSocket url from ${endpointURL}: ` + e.message;
-    throw e;
-  });
+    let resolve, reject;
+    const promise = new Promise((res, rej) => { resolve = res; reject = rej; });
+    const endpointURL = URL.resolve(browserURL, '/json/version');
+    const protocol = endpointURL.startsWith('https') ? https : http;
+    const requestOptions = Object.assign(URL.parse(endpointURL), { method: 'GET' });
+    const request = protocol.request(requestOptions, res => {
+        let data = '';
+        if (res.statusCode !== 200) {
+            // Consume response data to free up memory.
+            res.resume();
+            reject(new Error('HTTP ' + res.statusCode));
+            return;
+        }
+        res.setEncoding('utf8');
+        res.on('data', chunk => data += chunk);
+        res.on('end', () => resolve(JSON.parse(data).webSocketDebuggerUrl));
+    });
+    request.on('error', reject);
+    request.end();
+    return promise.catch(error => {
+        error.message = `Failed to fetch browser webSocket url from ${endpointURL}: ` + error.message;
+        throw error;
+    });
 }
-
-/**
- * @typedef {Object} Launcher.ChromeArgOptions
- * @property {boolean=} headless
- * @property {Array<string>=} args
- * @property {string=} userDataDir
- * @property {boolean=} devtools
- */
-
-/**
- * @typedef {Object} Launcher.LaunchOptions
- * @property {string=} executablePath
- * @property {boolean|Array<string>=} ignoreDefaultArgs
- * @property {boolean=} handleSIGINT
- * @property {boolean=} handleSIGTERM
- * @property {boolean=} handleSIGHUP
- * @property {number=} timeout
- * @property {boolean=} dumpio
- * @property {!Object<string, string | undefined>=} env
- * @property {boolean=} pipe
- */
-
-/**
- * @typedef {Object} Launcher.BrowserOptions
- * @property {boolean=} ignoreHTTPSErrors
- * @property {(?Puppeteer.Viewport)=} defaultViewport
- * @property {number=} slowMo
- */
-
-
-module.exports = Launcher;
+function resolveExecutablePath(launcher) {
+    // puppeteer-core doesn't take into account PUPPETEER_* env variables.
+    if (!launcher._isPuppeteerCore) {
+        const executablePath = process.env.PUPPETEER_EXECUTABLE_PATH || process.env.npm_config_puppeteer_executable_path || process.env.npm_package_config_puppeteer_executable_path;
+        if (executablePath) {
+            const missingText = !fs.existsSync(executablePath) ? 'Tried to use PUPPETEER_EXECUTABLE_PATH env variable to launch browser but did not find any executable at: ' + executablePath : null;
+            return { executablePath, missingText };
+        }
+    }
+    const browserFetcher = new BrowserFetcher_1.BrowserFetcher(launcher._projectRoot, { product: launcher.product });
+    if (!launcher._isPuppeteerCore && launcher.product === 'chrome') {
+        const revision = process.env['PUPPETEER_CHROMIUM_REVISION'];
+        if (revision) {
+            const revisionInfo = browserFetcher.revisionInfo(revision);
+            const missingText = !revisionInfo.local ? 'Tried to use PUPPETEER_CHROMIUM_REVISION env variable to launch browser but did not find executable at: ' + revisionInfo.executablePath : null;
+            return { executablePath: revisionInfo.executablePath, missingText };
+        }
+    }
+    const revisionInfo = browserFetcher.revisionInfo(launcher._preferredRevision);
+    const missingText = !revisionInfo.local ? `Could not find browser revision ${launcher._preferredRevision}. Run "npm install" or "yarn install" to download a browser binary.` : null;
+    return { executablePath: revisionInfo.executablePath, missingText };
+}
+function Launcher(projectRoot, preferredRevision, isPuppeteerCore, product) {
+    // puppeteer-core doesn't take into account PUPPETEER_* env variables.
+    if (!product && !isPuppeteerCore)
+        product = process.env.PUPPETEER_PRODUCT || process.env.npm_config_puppeteer_product || process.env.npm_package_config_puppeteer_product;
+    switch (product) {
+        case 'firefox':
+            return new FirefoxLauncher(projectRoot, preferredRevision, isPuppeteerCore);
+        case 'chrome':
+        default:
+            return new ChromeLauncher(projectRoot, preferredRevision, isPuppeteerCore);
+    }
+}
+exports.default = Launcher;
diff --git a/node_modules/puppeteer/lib/LifecycleWatcher.js b/node_modules/puppeteer/lib/LifecycleWatcher.js
index ab997e5..163af87 100644
--- a/node_modules/puppeteer/lib/LifecycleWatcher.js
+++ b/node_modules/puppeteer/lib/LifecycleWatcher.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2019 Google Inc. All rights reserved.
  *
@@ -13,186 +14,128 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-const {helper, assert} = require('./helper');
-const {Events} = require('./Events');
-const {TimeoutError} = require('./Errors');
-
-class LifecycleWatcher {
-  /**
-   * @param {!Puppeteer.FrameManager} frameManager
-   * @param {!Puppeteer.Frame} frame
-   * @param {string|!Array<string>} waitUntil
-   * @param {number} timeout
-   */
-  constructor(frameManager, frame, waitUntil, timeout) {
-    if (Array.isArray(waitUntil))
-      waitUntil = waitUntil.slice();
-    else if (typeof waitUntil === 'string')
-      waitUntil = [waitUntil];
-    this._expectedLifecycle = waitUntil.map(value => {
-      const protocolEvent = puppeteerToProtocolLifecycle.get(value);
-      assert(protocolEvent, 'Unknown value for options.waitUntil: ' + value);
-      return protocolEvent;
-    });
-
-    this._frameManager = frameManager;
-    this._frame = frame;
-    this._initialLoaderId = frame._loaderId;
-    this._timeout = timeout;
-    /** @type {?Puppeteer.Request} */
-    this._navigationRequest = null;
-    this._eventListeners = [
-      helper.addEventListener(frameManager._client, Events.CDPSession.Disconnected, () => this._terminate(new Error('Navigation failed because browser has disconnected!'))),
-      helper.addEventListener(this._frameManager, Events.FrameManager.LifecycleEvent, this._checkLifecycleComplete.bind(this)),
-      helper.addEventListener(this._frameManager, Events.FrameManager.FrameNavigatedWithinDocument, this._navigatedWithinDocument.bind(this)),
-      helper.addEventListener(this._frameManager, Events.FrameManager.FrameDetached, this._onFrameDetached.bind(this)),
-      helper.addEventListener(this._frameManager.networkManager(), Events.NetworkManager.Request, this._onRequest.bind(this)),
-    ];
-
-    this._sameDocumentNavigationPromise = new Promise(fulfill => {
-      this._sameDocumentNavigationCompleteCallback = fulfill;
-    });
-
-    this._lifecyclePromise = new Promise(fulfill => {
-      this._lifecycleCallback = fulfill;
-    });
-
-    this._newDocumentNavigationPromise = new Promise(fulfill => {
-      this._newDocumentNavigationCompleteCallback = fulfill;
-    });
-
-    this._timeoutPromise = this._createTimeoutPromise();
-    this._terminationPromise = new Promise(fulfill => {
-      this._terminationCallback = fulfill;
-    });
-    this._checkLifecycleComplete();
-  }
-
-  /**
-   * @param {!Puppeteer.Request} request
-   */
-  _onRequest(request) {
-    if (request.frame() !== this._frame || !request.isNavigationRequest())
-      return;
-    this._navigationRequest = request;
-  }
-
-  /**
-   * @param {!Puppeteer.Frame} frame
-   */
-  _onFrameDetached(frame) {
-    if (this._frame === frame) {
-      this._terminationCallback.call(null, new Error('Navigating frame was detached'));
-      return;
-    }
-    this._checkLifecycleComplete();
-  }
-
-  /**
-   * @return {?Puppeteer.Response}
-   */
-  navigationResponse() {
-    return this._navigationRequest ? this._navigationRequest.response() : null;
-  }
-
-  /**
-   * @param {!Error} error
-   */
-  _terminate(error) {
-    this._terminationCallback.call(null, error);
-  }
-
-  /**
-   * @return {!Promise<?Error>}
-   */
-  sameDocumentNavigationPromise() {
-    return this._sameDocumentNavigationPromise;
-  }
-
-  /**
-   * @return {!Promise<?Error>}
-   */
-  newDocumentNavigationPromise() {
-    return this._newDocumentNavigationPromise;
-  }
-
-  /**
-   * @return {!Promise}
-   */
-  lifecyclePromise() {
-    return this._lifecyclePromise;
-  }
-
-  /**
-   * @return {!Promise<?Error>}
-   */
-  timeoutOrTerminationPromise() {
-    return Promise.race([this._timeoutPromise, this._terminationPromise]);
-  }
-
-  /**
-   * @return {!Promise<?Error>}
-   */
-  _createTimeoutPromise() {
-    if (!this._timeout)
-      return new Promise(() => {});
-    const errorMessage = 'Navigation timeout of ' + this._timeout + ' ms exceeded';
-    return new Promise(fulfill => this._maximumTimer = setTimeout(fulfill, this._timeout))
-        .then(() => new TimeoutError(errorMessage));
-  }
-
-  /**
-   * @param {!Puppeteer.Frame} frame
-   */
-  _navigatedWithinDocument(frame) {
-    if (frame !== this._frame)
-      return;
-    this._hasSameDocumentNavigation = true;
-    this._checkLifecycleComplete();
-  }
-
-  _checkLifecycleComplete() {
-    // We expect navigation to commit.
-    if (!checkLifecycle(this._frame, this._expectedLifecycle))
-      return;
-    this._lifecycleCallback();
-    if (this._frame._loaderId === this._initialLoaderId && !this._hasSameDocumentNavigation)
-      return;
-    if (this._hasSameDocumentNavigation)
-      this._sameDocumentNavigationCompleteCallback();
-    if (this._frame._loaderId !== this._initialLoaderId)
-      this._newDocumentNavigationCompleteCallback();
-
-    /**
-     * @param {!Puppeteer.Frame} frame
-     * @param {!Array<string>} expectedLifecycle
-     * @return {boolean}
-     */
-    function checkLifecycle(frame, expectedLifecycle) {
-      for (const event of expectedLifecycle) {
-        if (!frame._lifecycleEvents.has(event))
-          return false;
-      }
-      for (const child of frame.childFrames()) {
-        if (!checkLifecycle(child, expectedLifecycle))
-          return false;
-      }
-      return true;
-    }
-  }
-
-  dispose() {
-    helper.removeEventListeners(this._eventListeners);
-    clearTimeout(this._maximumTimer);
-  }
-}
-
+Object.defineProperty(exports, "__esModule", { value: true });
+const helper_1 = require("./helper");
+const Events_1 = require("./Events");
+const Errors_1 = require("./Errors");
 const puppeteerToProtocolLifecycle = new Map([
-  ['load', 'load'],
-  ['domcontentloaded', 'DOMContentLoaded'],
-  ['networkidle0', 'networkIdle'],
-  ['networkidle2', 'networkAlmostIdle'],
+    ['load', 'load'],
+    ['domcontentloaded', 'DOMContentLoaded'],
+    ['networkidle0', 'networkIdle'],
+    ['networkidle2', 'networkAlmostIdle'],
 ]);
-
-module.exports = {LifecycleWatcher};
+class LifecycleWatcher {
+    constructor(frameManager, frame, waitUntil, timeout) {
+        if (Array.isArray(waitUntil))
+            waitUntil = waitUntil.slice();
+        else if (typeof waitUntil === 'string')
+            waitUntil = [waitUntil];
+        this._expectedLifecycle = waitUntil.map(value => {
+            const protocolEvent = puppeteerToProtocolLifecycle.get(value);
+            helper_1.assert(protocolEvent, 'Unknown value for options.waitUntil: ' + value);
+            return protocolEvent;
+        });
+        this._frameManager = frameManager;
+        this._frame = frame;
+        this._initialLoaderId = frame._loaderId;
+        this._timeout = timeout;
+        this._navigationRequest = null;
+        this._eventListeners = [
+            helper_1.helper.addEventListener(frameManager._client, Events_1.Events.CDPSession.Disconnected, () => this._terminate(new Error('Navigation failed because browser has disconnected!'))),
+            helper_1.helper.addEventListener(this._frameManager, Events_1.Events.FrameManager.LifecycleEvent, this._checkLifecycleComplete.bind(this)),
+            helper_1.helper.addEventListener(this._frameManager, Events_1.Events.FrameManager.FrameNavigatedWithinDocument, this._navigatedWithinDocument.bind(this)),
+            helper_1.helper.addEventListener(this._frameManager, Events_1.Events.FrameManager.FrameDetached, this._onFrameDetached.bind(this)),
+            helper_1.helper.addEventListener(this._frameManager.networkManager(), Events_1.Events.NetworkManager.Request, this._onRequest.bind(this)),
+        ];
+        this._sameDocumentNavigationPromise = new Promise(fulfill => {
+            this._sameDocumentNavigationCompleteCallback = fulfill;
+        });
+        this._lifecyclePromise = new Promise(fulfill => {
+            this._lifecycleCallback = fulfill;
+        });
+        this._newDocumentNavigationPromise = new Promise(fulfill => {
+            this._newDocumentNavigationCompleteCallback = fulfill;
+        });
+        this._timeoutPromise = this._createTimeoutPromise();
+        this._terminationPromise = new Promise(fulfill => {
+            this._terminationCallback = fulfill;
+        });
+        this._checkLifecycleComplete();
+    }
+    _onRequest(request) {
+        if (request.frame() !== this._frame || !request.isNavigationRequest())
+            return;
+        this._navigationRequest = request;
+    }
+    _onFrameDetached(frame) {
+        if (this._frame === frame) {
+            this._terminationCallback.call(null, new Error('Navigating frame was detached'));
+            return;
+        }
+        this._checkLifecycleComplete();
+    }
+    navigationResponse() {
+        return this._navigationRequest ? this._navigationRequest.response() : null;
+    }
+    _terminate(error) {
+        this._terminationCallback.call(null, error);
+    }
+    sameDocumentNavigationPromise() {
+        return this._sameDocumentNavigationPromise;
+    }
+    newDocumentNavigationPromise() {
+        return this._newDocumentNavigationPromise;
+    }
+    lifecyclePromise() {
+        return this._lifecyclePromise;
+    }
+    timeoutOrTerminationPromise() {
+        return Promise.race([this._timeoutPromise, this._terminationPromise]);
+    }
+    _createTimeoutPromise() {
+        if (!this._timeout)
+            return new Promise(() => { });
+        const errorMessage = 'Navigation timeout of ' + this._timeout + ' ms exceeded';
+        return new Promise(fulfill => this._maximumTimer = setTimeout(fulfill, this._timeout))
+            .then(() => new Errors_1.TimeoutError(errorMessage));
+    }
+    _navigatedWithinDocument(frame) {
+        if (frame !== this._frame)
+            return;
+        this._hasSameDocumentNavigation = true;
+        this._checkLifecycleComplete();
+    }
+    _checkLifecycleComplete() {
+        // We expect navigation to commit.
+        if (!checkLifecycle(this._frame, this._expectedLifecycle))
+            return;
+        this._lifecycleCallback();
+        if (this._frame._loaderId === this._initialLoaderId && !this._hasSameDocumentNavigation)
+            return;
+        if (this._hasSameDocumentNavigation)
+            this._sameDocumentNavigationCompleteCallback();
+        if (this._frame._loaderId !== this._initialLoaderId)
+            this._newDocumentNavigationCompleteCallback();
+        /**
+         * @param {!Frame} frame
+         * @param {!Array<string>} expectedLifecycle
+         * @return {boolean}
+         */
+        function checkLifecycle(frame, expectedLifecycle) {
+            for (const event of expectedLifecycle) {
+                if (!frame._lifecycleEvents.has(event))
+                    return false;
+            }
+            for (const child of frame.childFrames()) {
+                if (!checkLifecycle(child, expectedLifecycle))
+                    return false;
+            }
+            return true;
+        }
+    }
+    dispose() {
+        helper_1.helper.removeEventListeners(this._eventListeners);
+        clearTimeout(this._maximumTimer);
+    }
+}
+exports.LifecycleWatcher = LifecycleWatcher;
diff --git a/node_modules/puppeteer/lib/Multimap.js b/node_modules/puppeteer/lib/Multimap.js
deleted file mode 100644
index 28a419c..0000000
--- a/node_modules/puppeteer/lib/Multimap.js
+++ /dev/null
@@ -1,136 +0,0 @@
-/**
- * Copyright 2017 Google Inc. All rights reserved.
- *
- * 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.
- */
-/**
- * @template T
- * @template V
- */
-class Multimap {
-  constructor() {
-    this._map = new Map();
-  }
-
-  /**
-   * @param {T} key
-   * @param {V} value
-   */
-  set(key, value) {
-    let set = this._map.get(key);
-    if (!set) {
-      set = new Set();
-      this._map.set(key, set);
-    }
-    set.add(value);
-  }
-
-  /**
-   * @param {T} key
-   * @return {!Set<V>}
-   */
-  get(key) {
-    let result = this._map.get(key);
-    if (!result)
-      result = new Set();
-    return result;
-  }
-
-  /**
-   * @param {T} key
-   * @return {boolean}
-   */
-  has(key) {
-    return this._map.has(key);
-  }
-
-  /**
-   * @param {T} key
-   * @param {V} value
-   * @return {boolean}
-   */
-  hasValue(key, value) {
-    const set = this._map.get(key);
-    if (!set)
-      return false;
-    return set.has(value);
-  }
-
-  /**
-   * @return {number}
-   */
-  get size() {
-    return this._map.size;
-  }
-
-  /**
-   * @param {T} key
-   * @param {V} value
-   * @return {boolean}
-   */
-  delete(key, value) {
-    const values = this.get(key);
-    const result = values.delete(value);
-    if (!values.size)
-      this._map.delete(key);
-    return result;
-  }
-
-  /**
-   * @param {T} key
-   */
-  deleteAll(key) {
-    this._map.delete(key);
-  }
-
-  /**
-   * @param {T} key
-   * @return {V}
-   */
-  firstValue(key) {
-    const set = this._map.get(key);
-    if (!set)
-      return null;
-    return set.values().next().value;
-  }
-
-  /**
-   * @return {T}
-   */
-  firstKey() {
-    return this._map.keys().next().value;
-  }
-
-  /**
-   * @return {!Array<V>}
-   */
-  valuesArray() {
-    const result = [];
-    for (const key of this._map.keys())
-      result.push(...Array.from(this._map.get(key).values()));
-    return result;
-  }
-
-  /**
-   * @return {!Array<T>}
-   */
-  keysArray() {
-    return Array.from(this._map.keys());
-  }
-
-  clear() {
-    this._map.clear();
-  }
-}
-
-module.exports = Multimap;
diff --git a/node_modules/puppeteer/lib/NetworkManager.js b/node_modules/puppeteer/lib/NetworkManager.js
index 9f33300..5f475c4 100644
--- a/node_modules/puppeteer/lib/NetworkManager.js
+++ b/node_modules/puppeteer/lib/NetworkManager.js
@@ -1,3 +1,5 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,782 +15,540 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-const EventEmitter = require('events');
-const {helper, assert, debugError} = require('./helper');
-const {Events} = require('./Events');
-
+const EventEmitter = require("events");
+const helper_1 = require("./helper");
+const Events_1 = require("./Events");
 class NetworkManager extends EventEmitter {
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   * @param {!Puppeteer.FrameManager} frameManager
-   */
-  constructor(client, ignoreHTTPSErrors, frameManager) {
-    super();
-    this._client = client;
-    this._ignoreHTTPSErrors = ignoreHTTPSErrors;
-    this._frameManager = frameManager;
-    /** @type {!Map<string, !Request>} */
-    this._requestIdToRequest = new Map();
-    /** @type {!Map<string, !Protocol.Network.requestWillBeSentPayload>} */
-    this._requestIdToRequestWillBeSentEvent = new Map();
-    /** @type {!Object<string, string>} */
-    this._extraHTTPHeaders = {};
-
-    this._offline = false;
-
-    /** @type {?{username: string, password: string}} */
-    this._credentials = null;
-    /** @type {!Set<string>} */
-    this._attemptedAuthentications = new Set();
-    this._userRequestInterceptionEnabled = false;
-    this._protocolRequestInterceptionEnabled = false;
-    this._userCacheDisabled = false;
-    /** @type {!Map<string, string>} */
-    this._requestIdToInterceptionId = new Map();
-
-    this._client.on('Fetch.requestPaused', this._onRequestPaused.bind(this));
-    this._client.on('Fetch.authRequired', this._onAuthRequired.bind(this));
-    this._client.on('Network.requestWillBeSent', this._onRequestWillBeSent.bind(this));
-    this._client.on('Network.requestServedFromCache', this._onRequestServedFromCache.bind(this));
-    this._client.on('Network.responseReceived', this._onResponseReceived.bind(this));
-    this._client.on('Network.loadingFinished', this._onLoadingFinished.bind(this));
-    this._client.on('Network.loadingFailed', this._onLoadingFailed.bind(this));
-  }
-
-  async initialize() {
-    await this._client.send('Network.enable');
-    if (this._ignoreHTTPSErrors)
-      await this._client.send('Security.setIgnoreCertificateErrors', {ignore: true});
-  }
-
-  /**
-   * @param {?{username: string, password: string}} credentials
-   */
-  async authenticate(credentials) {
-    this._credentials = credentials;
-    await this._updateProtocolRequestInterception();
-  }
-
-  /**
-   * @param {!Object<string, string>} extraHTTPHeaders
-   */
-  async setExtraHTTPHeaders(extraHTTPHeaders) {
-    this._extraHTTPHeaders = {};
-    for (const key of Object.keys(extraHTTPHeaders)) {
-      const value = extraHTTPHeaders[key];
-      assert(helper.isString(value), `Expected value of header "${key}" to be String, but "${typeof value}" is found.`);
-      this._extraHTTPHeaders[key.toLowerCase()] = value;
+    constructor(client, ignoreHTTPSErrors, frameManager) {
+        super();
+        this._requestIdToRequest = new Map();
+        this._requestIdToRequestWillBeSentEvent = new Map();
+        this._extraHTTPHeaders = {};
+        this._offline = false;
+        this._credentials = null;
+        this._attemptedAuthentications = new Set();
+        this._userRequestInterceptionEnabled = false;
+        this._protocolRequestInterceptionEnabled = false;
+        this._userCacheDisabled = false;
+        this._requestIdToInterceptionId = new Map();
+        this._client = client;
+        this._ignoreHTTPSErrors = ignoreHTTPSErrors;
+        this._frameManager = frameManager;
+        this._client.on('Fetch.requestPaused', this._onRequestPaused.bind(this));
+        this._client.on('Fetch.authRequired', this._onAuthRequired.bind(this));
+        this._client.on('Network.requestWillBeSent', this._onRequestWillBeSent.bind(this));
+        this._client.on('Network.requestServedFromCache', this._onRequestServedFromCache.bind(this));
+        this._client.on('Network.responseReceived', this._onResponseReceived.bind(this));
+        this._client.on('Network.loadingFinished', this._onLoadingFinished.bind(this));
+        this._client.on('Network.loadingFailed', this._onLoadingFailed.bind(this));
     }
-    await this._client.send('Network.setExtraHTTPHeaders', { headers: this._extraHTTPHeaders });
-  }
-
-  /**
-   * @return {!Object<string, string>}
-   */
-  extraHTTPHeaders() {
-    return Object.assign({}, this._extraHTTPHeaders);
-  }
-
-  /**
-   * @param {boolean} value
-   */
-  async setOfflineMode(value) {
-    if (this._offline === value)
-      return;
-    this._offline = value;
-    await this._client.send('Network.emulateNetworkConditions', {
-      offline: this._offline,
-      // values of 0 remove any active throttling. crbug.com/456324#c9
-      latency: 0,
-      downloadThroughput: -1,
-      uploadThroughput: -1
-    });
-  }
-
-  /**
-   * @param {string} userAgent
-   */
-  async setUserAgent(userAgent) {
-    await this._client.send('Network.setUserAgentOverride', { userAgent });
-  }
-
-  /**
-   * @param {boolean} enabled
-   */
-  async setCacheEnabled(enabled) {
-    this._userCacheDisabled = !enabled;
-    await this._updateProtocolCacheDisabled();
-  }
-
-  /**
-   * @param {boolean} value
-   */
-  async setRequestInterception(value) {
-    this._userRequestInterceptionEnabled = value;
-    await this._updateProtocolRequestInterception();
-  }
-
-  async _updateProtocolRequestInterception() {
-    const enabled = this._userRequestInterceptionEnabled || !!this._credentials;
-    if (enabled === this._protocolRequestInterceptionEnabled)
-      return;
-    this._protocolRequestInterceptionEnabled = enabled;
-    if (enabled) {
-      await Promise.all([
-        this._updateProtocolCacheDisabled(),
-        this._client.send('Fetch.enable', {
-          handleAuthRequests: true,
-          patterns: [{urlPattern: '*'}],
-        }),
-      ]);
-    } else {
-      await Promise.all([
-        this._updateProtocolCacheDisabled(),
-        this._client.send('Fetch.disable')
-      ]);
+    async initialize() {
+        await this._client.send('Network.enable');
+        if (this._ignoreHTTPSErrors)
+            await this._client.send('Security.setIgnoreCertificateErrors', { ignore: true });
     }
-  }
-
-  async _updateProtocolCacheDisabled() {
-    await this._client.send('Network.setCacheDisabled', {
-      cacheDisabled: this._userCacheDisabled || this._protocolRequestInterceptionEnabled
-    });
-  }
-
-  /**
-   * @param {!Protocol.Network.requestWillBeSentPayload} event
-   */
-  _onRequestWillBeSent(event) {
-    // Request interception doesn't happen for data URLs with Network Service.
-    if (this._protocolRequestInterceptionEnabled && !event.request.url.startsWith('data:')) {
-      const requestId = event.requestId;
-      const interceptionId = this._requestIdToInterceptionId.get(requestId);
-      if (interceptionId) {
-        this._onRequest(event, interceptionId);
-        this._requestIdToInterceptionId.delete(requestId);
-      } else {
-        this._requestIdToRequestWillBeSentEvent.set(event.requestId, event);
-      }
-      return;
+    async authenticate(credentials) {
+        this._credentials = credentials;
+        await this._updateProtocolRequestInterception();
     }
-    this._onRequest(event, null);
-  }
-
-  /**
-   * @param {!Protocol.Fetch.authRequiredPayload} event
-   */
-  _onAuthRequired(event) {
-    /** @type {"Default"|"CancelAuth"|"ProvideCredentials"} */
-    let response = 'Default';
-    if (this._attemptedAuthentications.has(event.requestId)) {
-      response = 'CancelAuth';
-    } else if (this._credentials) {
-      response = 'ProvideCredentials';
-      this._attemptedAuthentications.add(event.requestId);
+    async setExtraHTTPHeaders(extraHTTPHeaders) {
+        this._extraHTTPHeaders = {};
+        for (const key of Object.keys(extraHTTPHeaders)) {
+            const value = extraHTTPHeaders[key];
+            helper_1.assert(helper_1.helper.isString(value), `Expected value of header "${key}" to be String, but "${typeof value}" is found.`);
+            this._extraHTTPHeaders[key.toLowerCase()] = value;
+        }
+        await this._client.send('Network.setExtraHTTPHeaders', { headers: this._extraHTTPHeaders });
     }
-    const {username, password} = this._credentials || {username: undefined, password: undefined};
-    this._client.send('Fetch.continueWithAuth', {
-      requestId: event.requestId,
-      authChallengeResponse: { response, username, password },
-    }).catch(debugError);
-  }
-
-  /**
-   * @param {!Protocol.Fetch.requestPausedPayload} event
-   */
-  _onRequestPaused(event) {
-    if (!this._userRequestInterceptionEnabled && this._protocolRequestInterceptionEnabled) {
-      this._client.send('Fetch.continueRequest', {
-        requestId: event.requestId
-      }).catch(debugError);
+    extraHTTPHeaders() {
+        return Object.assign({}, this._extraHTTPHeaders);
     }
-
-    const requestId = event.networkId;
-    const interceptionId = event.requestId;
-    if (requestId && this._requestIdToRequestWillBeSentEvent.has(requestId)) {
-      const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(requestId);
-      this._onRequest(requestWillBeSentEvent, interceptionId);
-      this._requestIdToRequestWillBeSentEvent.delete(requestId);
-    } else {
-      this._requestIdToInterceptionId.set(requestId, interceptionId);
-    }
-  }
-
-  /**
-   * @param {!Protocol.Network.requestWillBeSentPayload} event
-   * @param {?string} interceptionId
-   */
-  _onRequest(event, interceptionId) {
-    let redirectChain = [];
-    if (event.redirectResponse) {
-      const request = this._requestIdToRequest.get(event.requestId);
-      // If we connect late to the target, we could have missed the requestWillBeSent event.
-      if (request) {
-        this._handleRequestRedirect(request, event.redirectResponse);
-        redirectChain = request._redirectChain;
-      }
-    }
-    const frame = event.frameId ? this._frameManager.frame(event.frameId) : null;
-    const request = new Request(this._client, frame, interceptionId, this._userRequestInterceptionEnabled, event, redirectChain);
-    this._requestIdToRequest.set(event.requestId, request);
-    this.emit(Events.NetworkManager.Request, request);
-  }
-
-
-  /**
-   * @param {!Protocol.Network.requestServedFromCachePayload} event
-   */
-  _onRequestServedFromCache(event) {
-    const request = this._requestIdToRequest.get(event.requestId);
-    if (request)
-      request._fromMemoryCache = true;
-  }
-
-  /**
-   * @param {!Request} request
-   * @param {!Protocol.Network.Response} responsePayload
-   */
-  _handleRequestRedirect(request, responsePayload) {
-    const response = new Response(this._client, request, responsePayload);
-    request._response = response;
-    request._redirectChain.push(request);
-    response._bodyLoadedPromiseFulfill.call(null, new Error('Response body is unavailable for redirect responses'));
-    this._requestIdToRequest.delete(request._requestId);
-    this._attemptedAuthentications.delete(request._interceptionId);
-    this.emit(Events.NetworkManager.Response, response);
-    this.emit(Events.NetworkManager.RequestFinished, request);
-  }
-
-  /**
-   * @param {!Protocol.Network.responseReceivedPayload} event
-   */
-  _onResponseReceived(event) {
-    const request = this._requestIdToRequest.get(event.requestId);
-    // FileUpload sends a response without a matching request.
-    if (!request)
-      return;
-    const response = new Response(this._client, request, event.response);
-    request._response = response;
-    this.emit(Events.NetworkManager.Response, response);
-  }
-
-  /**
-   * @param {!Protocol.Network.loadingFinishedPayload} event
-   */
-  _onLoadingFinished(event) {
-    const request = this._requestIdToRequest.get(event.requestId);
-    // For certain requestIds we never receive requestWillBeSent event.
-    // @see https://crbug.com/750469
-    if (!request)
-      return;
-
-    // Under certain conditions we never get the Network.responseReceived
-    // event from protocol. @see https://crbug.com/883475
-    if (request.response())
-      request.response()._bodyLoadedPromiseFulfill.call(null);
-    this._requestIdToRequest.delete(request._requestId);
-    this._attemptedAuthentications.delete(request._interceptionId);
-    this.emit(Events.NetworkManager.RequestFinished, request);
-  }
-
-  /**
-   * @param {!Protocol.Network.loadingFailedPayload} event
-   */
-  _onLoadingFailed(event) {
-    const request = this._requestIdToRequest.get(event.requestId);
-    // For certain requestIds we never receive requestWillBeSent event.
-    // @see https://crbug.com/750469
-    if (!request)
-      return;
-    request._failureText = event.errorText;
-    const response = request.response();
-    if (response)
-      response._bodyLoadedPromiseFulfill.call(null);
-    this._requestIdToRequest.delete(request._requestId);
-    this._attemptedAuthentications.delete(request._interceptionId);
-    this.emit(Events.NetworkManager.RequestFailed, request);
-  }
-}
-
-class Request {
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   * @param {?Puppeteer.Frame} frame
-   * @param {string} interceptionId
-   * @param {boolean} allowInterception
-   * @param {!Protocol.Network.requestWillBeSentPayload} event
-   * @param {!Array<!Request>} redirectChain
-   */
-  constructor(client, frame, interceptionId, allowInterception, event, redirectChain) {
-    this._client = client;
-    this._requestId = event.requestId;
-    this._isNavigationRequest = event.requestId === event.loaderId && event.type === 'Document';
-    this._interceptionId = interceptionId;
-    this._allowInterception = allowInterception;
-    this._interceptionHandled = false;
-    this._response = null;
-    this._failureText = null;
-
-    this._url = event.request.url;
-    this._resourceType = event.type.toLowerCase();
-    this._method = event.request.method;
-    this._postData = event.request.postData;
-    this._headers = {};
-    this._frame = frame;
-    this._redirectChain = redirectChain;
-    for (const key of Object.keys(event.request.headers))
-      this._headers[key.toLowerCase()] = event.request.headers[key];
-
-    this._fromMemoryCache = false;
-  }
-
-  /**
-   * @return {string}
-   */
-  url() {
-    return this._url;
-  }
-
-  /**
-   * @return {string}
-   */
-  resourceType() {
-    return this._resourceType;
-  }
-
-  /**
-   * @return {string}
-   */
-  method() {
-    return this._method;
-  }
-
-  /**
-   * @return {string|undefined}
-   */
-  postData() {
-    return this._postData;
-  }
-
-  /**
-   * @return {!Object}
-   */
-  headers() {
-    return this._headers;
-  }
-
-  /**
-   * @return {?Response}
-   */
-  response() {
-    return this._response;
-  }
-
-  /**
-   * @return {?Puppeteer.Frame}
-   */
-  frame() {
-    return this._frame;
-  }
-
-  /**
-   * @return {boolean}
-   */
-  isNavigationRequest() {
-    return this._isNavigationRequest;
-  }
-
-  /**
-   * @return {!Array<!Request>}
-   */
-  redirectChain() {
-    return this._redirectChain.slice();
-  }
-
-  /**
-   * @return {?{errorText: string}}
-   */
-  failure() {
-    if (!this._failureText)
-      return null;
-    return {
-      errorText: this._failureText
-    };
-  }
-
-  /**
-   * @param {!{url?: string, method?:string, postData?: string, headers?: !Object}} overrides
-   */
-  async continue(overrides = {}) {
-    // Request interception is not supported for data: urls.
-    if (this._url.startsWith('data:'))
-      return;
-    assert(this._allowInterception, 'Request Interception is not enabled!');
-    assert(!this._interceptionHandled, 'Request is already handled!');
-    const {
-      url,
-      method,
-      postData,
-      headers
-    } = overrides;
-    this._interceptionHandled = true;
-    await this._client.send('Fetch.continueRequest', {
-      requestId: this._interceptionId,
-      url,
-      method,
-      postData,
-      headers: headers ? headersArray(headers) : undefined,
-    }).catch(error => {
-      // In certain cases, protocol will return error if the request was already canceled
-      // or the page was closed. We should tolerate these errors.
-      debugError(error);
-    });
-  }
-
-  /**
-   * @param {!{status: number, headers: Object, contentType: string, body: (string|Buffer)}} response
-   */
-  async respond(response) {
-    // Mocking responses for dataURL requests is not currently supported.
-    if (this._url.startsWith('data:'))
-      return;
-    assert(this._allowInterception, 'Request Interception is not enabled!');
-    assert(!this._interceptionHandled, 'Request is already handled!');
-    this._interceptionHandled = true;
-
-    const responseBody = response.body && helper.isString(response.body) ? Buffer.from(/** @type {string} */(response.body)) : /** @type {?Buffer} */(response.body || null);
-
-    /** @type {!Object<string, string>} */
-    const responseHeaders = {};
-    if (response.headers) {
-      for (const header of Object.keys(response.headers))
-        responseHeaders[header.toLowerCase()] = response.headers[header];
-    }
-    if (response.contentType)
-      responseHeaders['content-type'] = response.contentType;
-    if (responseBody && !('content-length' in responseHeaders))
-      responseHeaders['content-length'] = String(Buffer.byteLength(responseBody));
-
-    await this._client.send('Fetch.fulfillRequest', {
-      requestId: this._interceptionId,
-      responseCode: response.status || 200,
-      responsePhrase: STATUS_TEXTS[response.status || 200],
-      responseHeaders: headersArray(responseHeaders),
-      body: responseBody ? responseBody.toString('base64') : undefined,
-    }).catch(error => {
-      // In certain cases, protocol will return error if the request was already canceled
-      // or the page was closed. We should tolerate these errors.
-      debugError(error);
-    });
-  }
-
-  /**
-   * @param {string=} errorCode
-   */
-  async abort(errorCode = 'failed') {
-    // Request interception is not supported for data: urls.
-    if (this._url.startsWith('data:'))
-      return;
-    const errorReason = errorReasons[errorCode];
-    assert(errorReason, 'Unknown error code: ' + errorCode);
-    assert(this._allowInterception, 'Request Interception is not enabled!');
-    assert(!this._interceptionHandled, 'Request is already handled!');
-    this._interceptionHandled = true;
-    await this._client.send('Fetch.failRequest', {
-      requestId: this._interceptionId,
-      errorReason
-    }).catch(error => {
-      // In certain cases, protocol will return error if the request was already canceled
-      // or the page was closed. We should tolerate these errors.
-      debugError(error);
-    });
-  }
-}
-
-const errorReasons = {
-  'aborted': 'Aborted',
-  'accessdenied': 'AccessDenied',
-  'addressunreachable': 'AddressUnreachable',
-  'blockedbyclient': 'BlockedByClient',
-  'blockedbyresponse': 'BlockedByResponse',
-  'connectionaborted': 'ConnectionAborted',
-  'connectionclosed': 'ConnectionClosed',
-  'connectionfailed': 'ConnectionFailed',
-  'connectionrefused': 'ConnectionRefused',
-  'connectionreset': 'ConnectionReset',
-  'internetdisconnected': 'InternetDisconnected',
-  'namenotresolved': 'NameNotResolved',
-  'timedout': 'TimedOut',
-  'failed': 'Failed',
-};
-
-class Response {
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   * @param {!Request} request
-   * @param {!Protocol.Network.Response} responsePayload
-   */
-  constructor(client, request, responsePayload) {
-    this._client = client;
-    this._request = request;
-    this._contentPromise = null;
-
-    this._bodyLoadedPromise = new Promise(fulfill => {
-      this._bodyLoadedPromiseFulfill = fulfill;
-    });
-
-    this._remoteAddress = {
-      ip: responsePayload.remoteIPAddress,
-      port: responsePayload.remotePort,
-    };
-    this._status = responsePayload.status;
-    this._statusText = responsePayload.statusText;
-    this._url = request.url();
-    this._fromDiskCache = !!responsePayload.fromDiskCache;
-    this._fromServiceWorker = !!responsePayload.fromServiceWorker;
-    this._headers = {};
-    for (const key of Object.keys(responsePayload.headers))
-      this._headers[key.toLowerCase()] = responsePayload.headers[key];
-    this._securityDetails = responsePayload.securityDetails ? new SecurityDetails(responsePayload.securityDetails) : null;
-  }
-
-  /**
-   * @return {{ip: string, port: number}}
-   */
-  remoteAddress() {
-    return this._remoteAddress;
-  }
-
-  /**
-   * @return {string}
-   */
-  url() {
-    return this._url;
-  }
-
-  /**
-   * @return {boolean}
-   */
-  ok() {
-    return this._status === 0 || (this._status >= 200 && this._status <= 299);
-  }
-
-  /**
-   * @return {number}
-   */
-  status() {
-    return this._status;
-  }
-
-  /**
-   * @return {string}
-   */
-  statusText() {
-    return this._statusText;
-  }
-
-  /**
-   * @return {!Object}
-   */
-  headers() {
-    return this._headers;
-  }
-
-  /**
-   * @return {?SecurityDetails}
-   */
-  securityDetails() {
-    return this._securityDetails;
-  }
-
-  /**
-   * @return {!Promise<!Buffer>}
-   */
-  buffer() {
-    if (!this._contentPromise) {
-      this._contentPromise = this._bodyLoadedPromise.then(async error => {
-        if (error)
-          throw error;
-        const response = await this._client.send('Network.getResponseBody', {
-          requestId: this._request._requestId
+    async setOfflineMode(value) {
+        if (this._offline === value)
+            return;
+        this._offline = value;
+        await this._client.send('Network.emulateNetworkConditions', {
+            offline: this._offline,
+            // values of 0 remove any active throttling. crbug.com/456324#c9
+            latency: 0,
+            downloadThroughput: -1,
+            uploadThroughput: -1
         });
-        return Buffer.from(response.body, response.base64Encoded ? 'base64' : 'utf8');
-      });
     }
-    return this._contentPromise;
-  }
-
-  /**
-   * @return {!Promise<string>}
-   */
-  async text() {
-    const content = await this.buffer();
-    return content.toString('utf8');
-  }
-
-  /**
-   * @return {!Promise<!Object>}
-   */
-  async json() {
-    const content = await this.text();
-    return JSON.parse(content);
-  }
-
-  /**
-   * @return {!Request}
-   */
-  request() {
-    return this._request;
-  }
-
-  /**
-   * @return {boolean}
-   */
-  fromCache() {
-    return this._fromDiskCache || this._request._fromMemoryCache;
-  }
-
-  /**
-   * @return {boolean}
-   */
-  fromServiceWorker() {
-    return this._fromServiceWorker;
-  }
-
-  /**
-   * @return {?Puppeteer.Frame}
-   */
-  frame() {
-    return this._request.frame();
-  }
+    async setUserAgent(userAgent) {
+        await this._client.send('Network.setUserAgentOverride', { userAgent });
+    }
+    async setCacheEnabled(enabled) {
+        this._userCacheDisabled = !enabled;
+        await this._updateProtocolCacheDisabled();
+    }
+    async setRequestInterception(value) {
+        this._userRequestInterceptionEnabled = value;
+        await this._updateProtocolRequestInterception();
+    }
+    async _updateProtocolRequestInterception() {
+        const enabled = this._userRequestInterceptionEnabled || !!this._credentials;
+        if (enabled === this._protocolRequestInterceptionEnabled)
+            return;
+        this._protocolRequestInterceptionEnabled = enabled;
+        if (enabled) {
+            await Promise.all([
+                this._updateProtocolCacheDisabled(),
+                this._client.send('Fetch.enable', {
+                    handleAuthRequests: true,
+                    patterns: [{ urlPattern: '*' }],
+                }),
+            ]);
+        }
+        else {
+            await Promise.all([
+                this._updateProtocolCacheDisabled(),
+                this._client.send('Fetch.disable')
+            ]);
+        }
+    }
+    async _updateProtocolCacheDisabled() {
+        await this._client.send('Network.setCacheDisabled', {
+            cacheDisabled: this._userCacheDisabled || this._protocolRequestInterceptionEnabled
+        });
+    }
+    _onRequestWillBeSent(event) {
+        // Request interception doesn't happen for data URLs with Network Service.
+        if (this._protocolRequestInterceptionEnabled && !event.request.url.startsWith('data:')) {
+            const requestId = event.requestId;
+            const interceptionId = this._requestIdToInterceptionId.get(requestId);
+            if (interceptionId) {
+                this._onRequest(event, interceptionId);
+                this._requestIdToInterceptionId.delete(requestId);
+            }
+            else {
+                this._requestIdToRequestWillBeSentEvent.set(event.requestId, event);
+            }
+            return;
+        }
+        this._onRequest(event, null);
+    }
+    /**
+     * @param {!Protocol.Fetch.authRequiredPayload} event
+     */
+    _onAuthRequired(event) {
+        let response = 'Default';
+        if (this._attemptedAuthentications.has(event.requestId)) {
+            response = 'CancelAuth';
+        }
+        else if (this._credentials) {
+            response = 'ProvideCredentials';
+            this._attemptedAuthentications.add(event.requestId);
+        }
+        const { username, password } = this._credentials || { username: undefined, password: undefined };
+        this._client.send('Fetch.continueWithAuth', {
+            requestId: event.requestId,
+            authChallengeResponse: { response, username, password },
+        }).catch(helper_1.debugError);
+    }
+    _onRequestPaused(event) {
+        if (!this._userRequestInterceptionEnabled && this._protocolRequestInterceptionEnabled) {
+            this._client.send('Fetch.continueRequest', {
+                requestId: event.requestId
+            }).catch(helper_1.debugError);
+        }
+        const requestId = event.networkId;
+        const interceptionId = event.requestId;
+        if (requestId && this._requestIdToRequestWillBeSentEvent.has(requestId)) {
+            const requestWillBeSentEvent = this._requestIdToRequestWillBeSentEvent.get(requestId);
+            this._onRequest(requestWillBeSentEvent, interceptionId);
+            this._requestIdToRequestWillBeSentEvent.delete(requestId);
+        }
+        else {
+            this._requestIdToInterceptionId.set(requestId, interceptionId);
+        }
+    }
+    _onRequest(event, interceptionId) {
+        let redirectChain = [];
+        if (event.redirectResponse) {
+            const request = this._requestIdToRequest.get(event.requestId);
+            // If we connect late to the target, we could have missed the requestWillBeSent event.
+            if (request) {
+                this._handleRequestRedirect(request, event.redirectResponse);
+                redirectChain = request._redirectChain;
+            }
+        }
+        const frame = event.frameId ? this._frameManager.frame(event.frameId) : null;
+        const request = new Request(this._client, frame, interceptionId, this._userRequestInterceptionEnabled, event, redirectChain);
+        this._requestIdToRequest.set(event.requestId, request);
+        this.emit(Events_1.Events.NetworkManager.Request, request);
+    }
+    _onRequestServedFromCache(event) {
+        const request = this._requestIdToRequest.get(event.requestId);
+        if (request)
+            request._fromMemoryCache = true;
+    }
+    _handleRequestRedirect(request, responsePayload) {
+        const response = new Response(this._client, request, responsePayload);
+        request._response = response;
+        request._redirectChain.push(request);
+        response._bodyLoadedPromiseFulfill.call(null, new Error('Response body is unavailable for redirect responses'));
+        this._requestIdToRequest.delete(request._requestId);
+        this._attemptedAuthentications.delete(request._interceptionId);
+        this.emit(Events_1.Events.NetworkManager.Response, response);
+        this.emit(Events_1.Events.NetworkManager.RequestFinished, request);
+    }
+    _onResponseReceived(event) {
+        const request = this._requestIdToRequest.get(event.requestId);
+        // FileUpload sends a response without a matching request.
+        if (!request)
+            return;
+        const response = new Response(this._client, request, event.response);
+        request._response = response;
+        this.emit(Events_1.Events.NetworkManager.Response, response);
+    }
+    _onLoadingFinished(event) {
+        const request = this._requestIdToRequest.get(event.requestId);
+        // For certain requestIds we never receive requestWillBeSent event.
+        // @see https://crbug.com/750469
+        if (!request)
+            return;
+        // Under certain conditions we never get the Network.responseReceived
+        // event from protocol. @see https://crbug.com/883475
+        if (request.response())
+            request.response()._bodyLoadedPromiseFulfill.call(null);
+        this._requestIdToRequest.delete(request._requestId);
+        this._attemptedAuthentications.delete(request._interceptionId);
+        this.emit(Events_1.Events.NetworkManager.RequestFinished, request);
+    }
+    _onLoadingFailed(event) {
+        const request = this._requestIdToRequest.get(event.requestId);
+        // For certain requestIds we never receive requestWillBeSent event.
+        // @see https://crbug.com/750469
+        if (!request)
+            return;
+        request._failureText = event.errorText;
+        const response = request.response();
+        if (response)
+            response._bodyLoadedPromiseFulfill.call(null);
+        this._requestIdToRequest.delete(request._requestId);
+        this._attemptedAuthentications.delete(request._interceptionId);
+        this.emit(Events_1.Events.NetworkManager.RequestFailed, request);
+    }
 }
-
+exports.NetworkManager = NetworkManager;
+class Request {
+    constructor(client, frame, interceptionId, allowInterception, event, redirectChain) {
+        this._interceptionHandled = false;
+        this._response = null;
+        this._failureText = null;
+        this._headers = {};
+        this._fromMemoryCache = false;
+        this._client = client;
+        this._requestId = event.requestId;
+        this._isNavigationRequest = event.requestId === event.loaderId && event.type === 'Document';
+        this._interceptionId = interceptionId;
+        this._allowInterception = allowInterception;
+        this._url = event.request.url;
+        this._resourceType = event.type.toLowerCase();
+        this._method = event.request.method;
+        this._postData = event.request.postData;
+        this._frame = frame;
+        this._redirectChain = redirectChain;
+        for (const key of Object.keys(event.request.headers))
+            this._headers[key.toLowerCase()] = event.request.headers[key];
+    }
+    url() {
+        return this._url;
+    }
+    resourceType() {
+        return this._resourceType;
+    }
+    method() {
+        return this._method;
+    }
+    postData() {
+        return this._postData;
+    }
+    headers() {
+        return this._headers;
+    }
+    response() {
+        return this._response;
+    }
+    frame() {
+        return this._frame;
+    }
+    isNavigationRequest() {
+        return this._isNavigationRequest;
+    }
+    redirectChain() {
+        return this._redirectChain.slice();
+    }
+    /**
+     * @return {?{errorText: string}}
+     */
+    failure() {
+        if (!this._failureText)
+            return null;
+        return {
+            errorText: this._failureText
+        };
+    }
+    async continue(overrides = {}) {
+        // Request interception is not supported for data: urls.
+        if (this._url.startsWith('data:'))
+            return;
+        helper_1.assert(this._allowInterception, 'Request Interception is not enabled!');
+        helper_1.assert(!this._interceptionHandled, 'Request is already handled!');
+        const { url, method, postData, headers } = overrides;
+        this._interceptionHandled = true;
+        await this._client.send('Fetch.continueRequest', {
+            requestId: this._interceptionId,
+            url,
+            method,
+            postData,
+            headers: headers ? headersArray(headers) : undefined,
+        }).catch(error => {
+            // In certain cases, protocol will return error if the request was already canceled
+            // or the page was closed. We should tolerate these errors.
+            helper_1.debugError(error);
+        });
+    }
+    async respond(response) {
+        // Mocking responses for dataURL requests is not currently supported.
+        if (this._url.startsWith('data:'))
+            return;
+        helper_1.assert(this._allowInterception, 'Request Interception is not enabled!');
+        helper_1.assert(!this._interceptionHandled, 'Request is already handled!');
+        this._interceptionHandled = true;
+        const responseBody = response.body && helper_1.helper.isString(response.body) ? Buffer.from(response.body) : response.body || null;
+        const responseHeaders = {};
+        if (response.headers) {
+            for (const header of Object.keys(response.headers))
+                responseHeaders[header.toLowerCase()] = response.headers[header];
+        }
+        if (response.contentType)
+            responseHeaders['content-type'] = response.contentType;
+        if (responseBody && !('content-length' in responseHeaders))
+            responseHeaders['content-length'] = String(Buffer.byteLength(responseBody));
+        await this._client.send('Fetch.fulfillRequest', {
+            requestId: this._interceptionId,
+            responseCode: response.status || 200,
+            responsePhrase: STATUS_TEXTS[response.status || 200],
+            responseHeaders: headersArray(responseHeaders),
+            body: responseBody ? responseBody.toString('base64') : undefined,
+        }).catch(error => {
+            // In certain cases, protocol will return error if the request was already canceled
+            // or the page was closed. We should tolerate these errors.
+            helper_1.debugError(error);
+        });
+    }
+    async abort(errorCode = 'failed') {
+        // Request interception is not supported for data: urls.
+        if (this._url.startsWith('data:'))
+            return;
+        const errorReason = errorReasons[errorCode];
+        helper_1.assert(errorReason, 'Unknown error code: ' + errorCode);
+        helper_1.assert(this._allowInterception, 'Request Interception is not enabled!');
+        helper_1.assert(!this._interceptionHandled, 'Request is already handled!');
+        this._interceptionHandled = true;
+        await this._client.send('Fetch.failRequest', {
+            requestId: this._interceptionId,
+            errorReason
+        }).catch(error => {
+            // In certain cases, protocol will return error if the request was already canceled
+            // or the page was closed. We should tolerate these errors.
+            helper_1.debugError(error);
+        });
+    }
+}
+exports.Request = Request;
+const errorReasons = {
+    'aborted': 'Aborted',
+    'accessdenied': 'AccessDenied',
+    'addressunreachable': 'AddressUnreachable',
+    'blockedbyclient': 'BlockedByClient',
+    'blockedbyresponse': 'BlockedByResponse',
+    'connectionaborted': 'ConnectionAborted',
+    'connectionclosed': 'ConnectionClosed',
+    'connectionfailed': 'ConnectionFailed',
+    'connectionrefused': 'ConnectionRefused',
+    'connectionreset': 'ConnectionReset',
+    'internetdisconnected': 'InternetDisconnected',
+    'namenotresolved': 'NameNotResolved',
+    'timedout': 'TimedOut',
+    'failed': 'Failed',
+};
+class Response {
+    constructor(client, request, responsePayload) {
+        this._contentPromise = null;
+        this._headers = {};
+        this._client = client;
+        this._request = request;
+        this._bodyLoadedPromise = new Promise(fulfill => {
+            this._bodyLoadedPromiseFulfill = fulfill;
+        });
+        this._remoteAddress = {
+            ip: responsePayload.remoteIPAddress,
+            port: responsePayload.remotePort,
+        };
+        this._status = responsePayload.status;
+        this._statusText = responsePayload.statusText;
+        this._url = request.url();
+        this._fromDiskCache = !!responsePayload.fromDiskCache;
+        this._fromServiceWorker = !!responsePayload.fromServiceWorker;
+        for (const key of Object.keys(responsePayload.headers))
+            this._headers[key.toLowerCase()] = responsePayload.headers[key];
+        this._securityDetails = responsePayload.securityDetails ? new SecurityDetails(responsePayload.securityDetails) : null;
+    }
+    remoteAddress() {
+        return this._remoteAddress;
+    }
+    url() {
+        return this._url;
+    }
+    ok() {
+        return this._status === 0 || (this._status >= 200 && this._status <= 299);
+    }
+    status() {
+        return this._status;
+    }
+    statusText() {
+        return this._statusText;
+    }
+    headers() {
+        return this._headers;
+    }
+    securityDetails() {
+        return this._securityDetails;
+    }
+    buffer() {
+        if (!this._contentPromise) {
+            this._contentPromise = this._bodyLoadedPromise.then(async (error) => {
+                if (error)
+                    throw error;
+                const response = await this._client.send('Network.getResponseBody', {
+                    requestId: this._request._requestId
+                });
+                return Buffer.from(response.body, response.base64Encoded ? 'base64' : 'utf8');
+            });
+        }
+        return this._contentPromise;
+    }
+    async text() {
+        const content = await this.buffer();
+        return content.toString('utf8');
+    }
+    async json() {
+        const content = await this.text();
+        return JSON.parse(content);
+    }
+    request() {
+        return this._request;
+    }
+    fromCache() {
+        return this._fromDiskCache || this._request._fromMemoryCache;
+    }
+    fromServiceWorker() {
+        return this._fromServiceWorker;
+    }
+    frame() {
+        return this._request.frame();
+    }
+}
+exports.Response = Response;
 class SecurityDetails {
-  /**
-   * @param {!Protocol.Network.SecurityDetails} securityPayload
-   */
-  constructor(securityPayload) {
-    this._subjectName = securityPayload['subjectName'];
-    this._issuer = securityPayload['issuer'];
-    this._validFrom = securityPayload['validFrom'];
-    this._validTo = securityPayload['validTo'];
-    this._protocol = securityPayload['protocol'];
-  }
-
-  /**
-   * @return {string}
-   */
-  subjectName() {
-    return this._subjectName;
-  }
-
-  /**
-   * @return {string}
-   */
-  issuer() {
-    return this._issuer;
-  }
-
-  /**
-   * @return {number}
-   */
-  validFrom() {
-    return this._validFrom;
-  }
-
-  /**
-   * @return {number}
-   */
-  validTo() {
-    return this._validTo;
-  }
-
-  /**
-   * @return {string}
-   */
-  protocol() {
-    return this._protocol;
-  }
+    constructor(securityPayload) {
+        this._subjectName = securityPayload.subjectName;
+        this._issuer = securityPayload.issuer;
+        this._validFrom = securityPayload.validFrom;
+        this._validTo = securityPayload.validTo;
+        this._protocol = securityPayload.protocol;
+    }
+    subjectName() {
+        return this._subjectName;
+    }
+    issuer() {
+        return this._issuer;
+    }
+    validFrom() {
+        return this._validFrom;
+    }
+    validTo() {
+        return this._validTo;
+    }
+    protocol() {
+        return this._protocol;
+    }
 }
-
-/**
- * @param {Object<string, string>} headers
- * @return {!Array<{name: string, value: string}>}
- */
+exports.SecurityDetails = SecurityDetails;
 function headersArray(headers) {
-  const result = [];
-  for (const name in headers) {
-    if (!Object.is(headers[name], undefined))
-      result.push({name, value: headers[name] + ''});
-  }
-  return result;
+    const result = [];
+    for (const name in headers) {
+        if (!Object.is(headers[name], undefined))
+            result.push({ name, value: headers[name] + '' });
+    }
+    return result;
 }
-
 // List taken from https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml with extra 306 and 418 codes.
 const STATUS_TEXTS = {
-  '100': 'Continue',
-  '101': 'Switching Protocols',
-  '102': 'Processing',
-  '103': 'Early Hints',
-  '200': 'OK',
-  '201': 'Created',
-  '202': 'Accepted',
-  '203': 'Non-Authoritative Information',
-  '204': 'No Content',
-  '205': 'Reset Content',
-  '206': 'Partial Content',
-  '207': 'Multi-Status',
-  '208': 'Already Reported',
-  '226': 'IM Used',
-  '300': 'Multiple Choices',
-  '301': 'Moved Permanently',
-  '302': 'Found',
-  '303': 'See Other',
-  '304': 'Not Modified',
-  '305': 'Use Proxy',
-  '306': 'Switch Proxy',
-  '307': 'Temporary Redirect',
-  '308': 'Permanent Redirect',
-  '400': 'Bad Request',
-  '401': 'Unauthorized',
-  '402': 'Payment Required',
-  '403': 'Forbidden',
-  '404': 'Not Found',
-  '405': 'Method Not Allowed',
-  '406': 'Not Acceptable',
-  '407': 'Proxy Authentication Required',
-  '408': 'Request Timeout',
-  '409': 'Conflict',
-  '410': 'Gone',
-  '411': 'Length Required',
-  '412': 'Precondition Failed',
-  '413': 'Payload Too Large',
-  '414': 'URI Too Long',
-  '415': 'Unsupported Media Type',
-  '416': 'Range Not Satisfiable',
-  '417': 'Expectation Failed',
-  '418': 'I\'m a teapot',
-  '421': 'Misdirected Request',
-  '422': 'Unprocessable Entity',
-  '423': 'Locked',
-  '424': 'Failed Dependency',
-  '425': 'Too Early',
-  '426': 'Upgrade Required',
-  '428': 'Precondition Required',
-  '429': 'Too Many Requests',
-  '431': 'Request Header Fields Too Large',
-  '451': 'Unavailable For Legal Reasons',
-  '500': 'Internal Server Error',
-  '501': 'Not Implemented',
-  '502': 'Bad Gateway',
-  '503': 'Service Unavailable',
-  '504': 'Gateway Timeout',
-  '505': 'HTTP Version Not Supported',
-  '506': 'Variant Also Negotiates',
-  '507': 'Insufficient Storage',
-  '508': 'Loop Detected',
-  '510': 'Not Extended',
-  '511': 'Network Authentication Required',
+    '100': 'Continue',
+    '101': 'Switching Protocols',
+    '102': 'Processing',
+    '103': 'Early Hints',
+    '200': 'OK',
+    '201': 'Created',
+    '202': 'Accepted',
+    '203': 'Non-Authoritative Information',
+    '204': 'No Content',
+    '205': 'Reset Content',
+    '206': 'Partial Content',
+    '207': 'Multi-Status',
+    '208': 'Already Reported',
+    '226': 'IM Used',
+    '300': 'Multiple Choices',
+    '301': 'Moved Permanently',
+    '302': 'Found',
+    '303': 'See Other',
+    '304': 'Not Modified',
+    '305': 'Use Proxy',
+    '306': 'Switch Proxy',
+    '307': 'Temporary Redirect',
+    '308': 'Permanent Redirect',
+    '400': 'Bad Request',
+    '401': 'Unauthorized',
+    '402': 'Payment Required',
+    '403': 'Forbidden',
+    '404': 'Not Found',
+    '405': 'Method Not Allowed',
+    '406': 'Not Acceptable',
+    '407': 'Proxy Authentication Required',
+    '408': 'Request Timeout',
+    '409': 'Conflict',
+    '410': 'Gone',
+    '411': 'Length Required',
+    '412': 'Precondition Failed',
+    '413': 'Payload Too Large',
+    '414': 'URI Too Long',
+    '415': 'Unsupported Media Type',
+    '416': 'Range Not Satisfiable',
+    '417': 'Expectation Failed',
+    '418': 'I\'m a teapot',
+    '421': 'Misdirected Request',
+    '422': 'Unprocessable Entity',
+    '423': 'Locked',
+    '424': 'Failed Dependency',
+    '425': 'Too Early',
+    '426': 'Upgrade Required',
+    '428': 'Precondition Required',
+    '429': 'Too Many Requests',
+    '431': 'Request Header Fields Too Large',
+    '451': 'Unavailable For Legal Reasons',
+    '500': 'Internal Server Error',
+    '501': 'Not Implemented',
+    '502': 'Bad Gateway',
+    '503': 'Service Unavailable',
+    '504': 'Gateway Timeout',
+    '505': 'HTTP Version Not Supported',
+    '506': 'Variant Also Negotiates',
+    '507': 'Insufficient Storage',
+    '508': 'Loop Detected',
+    '510': 'Not Extended',
+    '511': 'Network Authentication Required',
 };
-
-module.exports = {Request, Response, NetworkManager, SecurityDetails};
diff --git a/node_modules/puppeteer/lib/Page.js b/node_modules/puppeteer/lib/Page.js
index 2c5d479..dbfc941 100644
--- a/node_modules/puppeteer/lib/Page.js
+++ b/node_modules/puppeteer/lib/Page.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,1383 +14,793 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-const fs = require('fs');
-const path = require('path');
-const EventEmitter = require('events');
-const mime = require('mime');
-const {Events} = require('./Events');
-const {Connection} = require('./Connection');
-const {Dialog} = require('./Dialog');
-const {EmulationManager} = require('./EmulationManager');
-const {FrameManager} = require('./FrameManager');
-const {Keyboard, Mouse, Touchscreen} = require('./Input');
-const Tracing = require('./Tracing');
-const {helper, debugError, assert} = require('./helper');
-const {Coverage} = require('./Coverage');
-const {Worker} = require('./Worker');
-const {createJSHandle} = require('./JSHandle');
-const {Accessibility} = require('./Accessibility');
-const {TimeoutSettings} = require('./TimeoutSettings');
-
-const writeFileAsync = helper.promisify(fs.writeFile);
-
+Object.defineProperty(exports, "__esModule", { value: true });
+const fs = require("fs");
+const EventEmitter = require("events");
+const mime = require("mime");
+const Events_1 = require("./Events");
+const Connection_1 = require("./Connection");
+const Dialog_1 = require("./Dialog");
+const EmulationManager_1 = require("./EmulationManager");
+const FrameManager_1 = require("./FrameManager");
+const Input_1 = require("./Input");
+const Tracing_1 = require("./Tracing");
+const helper_1 = require("./helper");
+const Coverage_1 = require("./Coverage");
+const Worker_1 = require("./Worker");
+const JSHandle_1 = require("./JSHandle");
+const Accessibility_1 = require("./Accessibility");
+const TimeoutSettings_1 = require("./TimeoutSettings");
+const writeFileAsync = helper_1.helper.promisify(fs.writeFile);
+const paperFormats = {
+    letter: { width: 8.5, height: 11 },
+    legal: { width: 8.5, height: 14 },
+    tabloid: { width: 11, height: 17 },
+    ledger: { width: 17, height: 11 },
+    a0: { width: 33.1, height: 46.8 },
+    a1: { width: 23.4, height: 33.1 },
+    a2: { width: 16.54, height: 23.4 },
+    a3: { width: 11.7, height: 16.54 },
+    a4: { width: 8.27, height: 11.7 },
+    a5: { width: 5.83, height: 8.27 },
+    a6: { width: 4.13, height: 5.83 },
+};
 class Page extends EventEmitter {
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   * @param {!Puppeteer.Target} target
-   * @param {boolean} ignoreHTTPSErrors
-   * @param {?Puppeteer.Viewport} defaultViewport
-   * @param {!Puppeteer.TaskQueue} screenshotTaskQueue
-   * @return {!Promise<!Page>}
-   */
-  static async create(client, target, ignoreHTTPSErrors, defaultViewport, screenshotTaskQueue) {
-    const page = new Page(client, target, ignoreHTTPSErrors, screenshotTaskQueue);
-    await page._initialize();
-    if (defaultViewport)
-      await page.setViewport(defaultViewport);
-    return page;
-  }
-
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   * @param {!Puppeteer.Target} target
-   * @param {boolean} ignoreHTTPSErrors
-   * @param {!Puppeteer.TaskQueue} screenshotTaskQueue
-   */
-  constructor(client, target, ignoreHTTPSErrors, screenshotTaskQueue) {
-    super();
-    this._closed = false;
-    this._client = client;
-    this._target = target;
-    this._keyboard = new Keyboard(client);
-    this._mouse = new Mouse(client, this._keyboard);
-    this._timeoutSettings = new TimeoutSettings();
-    this._touchscreen = new Touchscreen(client, this._keyboard);
-    this._accessibility = new Accessibility(client);
-    /** @type {!FrameManager} */
-    this._frameManager = new FrameManager(client, this, ignoreHTTPSErrors, this._timeoutSettings);
-    this._emulationManager = new EmulationManager(client);
-    this._tracing = new Tracing(client);
-    /** @type {!Map<string, Function>} */
-    this._pageBindings = new Map();
-    this._coverage = new Coverage(client);
-    this._javascriptEnabled = true;
-    /** @type {?Puppeteer.Viewport} */
-    this._viewport = null;
-
-    this._screenshotTaskQueue = screenshotTaskQueue;
-
-    /** @type {!Map<string, Worker>} */
-    this._workers = new Map();
-    client.on('Target.attachedToTarget', event => {
-      if (event.targetInfo.type !== 'worker') {
-        // If we don't detach from service workers, they will never die.
-        client.send('Target.detachFromTarget', {
-          sessionId: event.sessionId
-        }).catch(debugError);
-        return;
-      }
-      const session = Connection.fromSession(client).session(event.sessionId);
-      const worker = new Worker(session, event.targetInfo.url, this._addConsoleMessage.bind(this), this._handleException.bind(this));
-      this._workers.set(event.sessionId, worker);
-      this.emit(Events.Page.WorkerCreated, worker);
-    });
-    client.on('Target.detachedFromTarget', event => {
-      const worker = this._workers.get(event.sessionId);
-      if (!worker)
-        return;
-      this.emit(Events.Page.WorkerDestroyed, worker);
-      this._workers.delete(event.sessionId);
-    });
-
-    this._frameManager.on(Events.FrameManager.FrameAttached, event => this.emit(Events.Page.FrameAttached, event));
-    this._frameManager.on(Events.FrameManager.FrameDetached, event => this.emit(Events.Page.FrameDetached, event));
-    this._frameManager.on(Events.FrameManager.FrameNavigated, event => this.emit(Events.Page.FrameNavigated, event));
-
-    const networkManager = this._frameManager.networkManager();
-    networkManager.on(Events.NetworkManager.Request, event => this.emit(Events.Page.Request, event));
-    networkManager.on(Events.NetworkManager.Response, event => this.emit(Events.Page.Response, event));
-    networkManager.on(Events.NetworkManager.RequestFailed, event => this.emit(Events.Page.RequestFailed, event));
-    networkManager.on(Events.NetworkManager.RequestFinished, event => this.emit(Events.Page.RequestFinished, event));
-    this._fileChooserInterceptionIsDisabled = false;
-    this._fileChooserInterceptors = new Set();
-
-    client.on('Page.domContentEventFired', event => this.emit(Events.Page.DOMContentLoaded));
-    client.on('Page.loadEventFired', event => this.emit(Events.Page.Load));
-    client.on('Runtime.consoleAPICalled', event => this._onConsoleAPI(event));
-    client.on('Runtime.bindingCalled', event => this._onBindingCalled(event));
-    client.on('Page.javascriptDialogOpening', event => this._onDialog(event));
-    client.on('Runtime.exceptionThrown', exception => this._handleException(exception.exceptionDetails));
-    client.on('Inspector.targetCrashed', event => this._onTargetCrashed());
-    client.on('Performance.metrics', event => this._emitMetrics(event));
-    client.on('Log.entryAdded', event => this._onLogEntryAdded(event));
-    client.on('Page.fileChooserOpened', event => this._onFileChooser(event));
-    this._target._isClosedPromise.then(() => {
-      this.emit(Events.Page.Close);
-      this._closed = true;
-    });
-  }
-
-  async _initialize() {
-    await Promise.all([
-      this._frameManager.initialize(),
-      this._client.send('Target.setAutoAttach', {autoAttach: true, waitForDebuggerOnStart: false, flatten: true}),
-      this._client.send('Performance.enable', {}),
-      this._client.send('Log.enable', {}),
-      this._client.send('Page.setInterceptFileChooserDialog', {enabled: true}).catch(e => {
-        this._fileChooserInterceptionIsDisabled = true;
-      }),
-    ]);
-  }
-
-  /**
-   * @param {!Protocol.Page.fileChooserOpenedPayload} event
-   */
-  _onFileChooser(event) {
-    if (!this._fileChooserInterceptors.size) {
-      this._client.send('Page.handleFileChooser', { action: 'fallback' }).catch(debugError);
-      return;
+    constructor(client, target, ignoreHTTPSErrors, screenshotTaskQueue) {
+        super();
+        this._closed = false;
+        this._timeoutSettings = new TimeoutSettings_1.TimeoutSettings();
+        this._pageBindings = new Map();
+        this._javascriptEnabled = true;
+        this._workers = new Map();
+        // TODO: improve this typedef - it's a function that takes a file chooser or something?
+        this._fileChooserInterceptors = new Set();
+        this._client = client;
+        this._target = target;
+        this._keyboard = new Input_1.Keyboard(client);
+        this._mouse = new Input_1.Mouse(client, this._keyboard);
+        this._touchscreen = new Input_1.Touchscreen(client, this._keyboard);
+        this._accessibility = new Accessibility_1.Accessibility(client);
+        this._frameManager = new FrameManager_1.FrameManager(client, this, ignoreHTTPSErrors, this._timeoutSettings);
+        this._emulationManager = new EmulationManager_1.EmulationManager(client);
+        this._tracing = new Tracing_1.Tracing(client);
+        this._coverage = new Coverage_1.Coverage(client);
+        this._screenshotTaskQueue = screenshotTaskQueue;
+        this._viewport = null;
+        client.on('Target.attachedToTarget', event => {
+            if (event.targetInfo.type !== 'worker') {
+                // If we don't detach from service workers, they will never die.
+                client.send('Target.detachFromTarget', {
+                    sessionId: event.sessionId
+                }).catch(helper_1.debugError);
+                return;
+            }
+            const session = Connection_1.Connection.fromSession(client).session(event.sessionId);
+            const worker = new Worker_1.Worker(session, event.targetInfo.url, this._addConsoleMessage.bind(this), this._handleException.bind(this));
+            this._workers.set(event.sessionId, worker);
+            this.emit(Events_1.Events.Page.WorkerCreated, worker);
+        });
+        client.on('Target.detachedFromTarget', event => {
+            const worker = this._workers.get(event.sessionId);
+            if (!worker)
+                return;
+            this.emit(Events_1.Events.Page.WorkerDestroyed, worker);
+            this._workers.delete(event.sessionId);
+        });
+        this._frameManager.on(Events_1.Events.FrameManager.FrameAttached, event => this.emit(Events_1.Events.Page.FrameAttached, event));
+        this._frameManager.on(Events_1.Events.FrameManager.FrameDetached, event => this.emit(Events_1.Events.Page.FrameDetached, event));
+        this._frameManager.on(Events_1.Events.FrameManager.FrameNavigated, event => this.emit(Events_1.Events.Page.FrameNavigated, event));
+        const networkManager = this._frameManager.networkManager();
+        networkManager.on(Events_1.Events.NetworkManager.Request, event => this.emit(Events_1.Events.Page.Request, event));
+        networkManager.on(Events_1.Events.NetworkManager.Response, event => this.emit(Events_1.Events.Page.Response, event));
+        networkManager.on(Events_1.Events.NetworkManager.RequestFailed, event => this.emit(Events_1.Events.Page.RequestFailed, event));
+        networkManager.on(Events_1.Events.NetworkManager.RequestFinished, event => this.emit(Events_1.Events.Page.RequestFinished, event));
+        this._fileChooserInterceptors = new Set();
+        client.on('Page.domContentEventFired', () => this.emit(Events_1.Events.Page.DOMContentLoaded));
+        client.on('Page.loadEventFired', () => this.emit(Events_1.Events.Page.Load));
+        client.on('Runtime.consoleAPICalled', event => this._onConsoleAPI(event));
+        client.on('Runtime.bindingCalled', event => this._onBindingCalled(event));
+        client.on('Page.javascriptDialogOpening', event => this._onDialog(event));
+        client.on('Runtime.exceptionThrown', exception => this._handleException(exception.exceptionDetails));
+        client.on('Inspector.targetCrashed', () => this._onTargetCrashed());
+        client.on('Performance.metrics', event => this._emitMetrics(event));
+        client.on('Log.entryAdded', event => this._onLogEntryAdded(event));
+        client.on('Page.fileChooserOpened', event => this._onFileChooser(event));
+        this._target._isClosedPromise.then(() => {
+            this.emit(Events_1.Events.Page.Close);
+            this._closed = true;
+        });
     }
-    const interceptors = Array.from(this._fileChooserInterceptors);
-    this._fileChooserInterceptors.clear();
-    const fileChooser = new FileChooser(this._client, event);
-    for (const interceptor of interceptors)
-      interceptor.call(null, fileChooser);
-  }
-
-  /**
-   * @param {!{timeout?: number}=} options
-   * @return !Promise<!FileChooser>}
-   */
-  async waitForFileChooser(options = {}) {
-    if (this._fileChooserInterceptionIsDisabled)
-      throw new Error('File chooser handling does not work with multiple connections to the same page');
-    const {
-      timeout = this._timeoutSettings.timeout(),
-    } = options;
-    let callback;
-    const promise = new Promise(x => callback = x);
-    this._fileChooserInterceptors.add(callback);
-    return helper.waitWithTimeout(promise, 'waiting for file chooser', timeout).catch(e => {
-      this._fileChooserInterceptors.delete(callback);
-      throw e;
-    });
-  }
-
-  /**
-   * @param {!{longitude: number, latitude: number, accuracy: (number|undefined)}} options
-   */
-  async setGeolocation(options) {
-    const { longitude, latitude, accuracy = 0} = options;
-    if (longitude < -180 || longitude > 180)
-      throw new Error(`Invalid longitude "${longitude}": precondition -180 <= LONGITUDE <= 180 failed.`);
-    if (latitude < -90 || latitude > 90)
-      throw new Error(`Invalid latitude "${latitude}": precondition -90 <= LATITUDE <= 90 failed.`);
-    if (accuracy < 0)
-      throw new Error(`Invalid accuracy "${accuracy}": precondition 0 <= ACCURACY failed.`);
-    await this._client.send('Emulation.setGeolocationOverride', {longitude, latitude, accuracy});
-  }
-
-  /**
-   * @return {!Puppeteer.Target}
-   */
-  target() {
-    return this._target;
-  }
-
-  /**
-   * @return {!Puppeteer.Browser}
-   */
-  browser() {
-    return this._target.browser();
-  }
-
-  /**
-   * @return {!Puppeteer.BrowserContext}
-   */
-  browserContext() {
-    return this._target.browserContext();
-  }
-
-  _onTargetCrashed() {
-    this.emit('error', new Error('Page crashed!'));
-  }
-
-  /**
-   * @param {!Protocol.Log.entryAddedPayload} event
-   */
-  _onLogEntryAdded(event) {
-    const {level, text, args, source, url, lineNumber} = event.entry;
-    if (args)
-      args.map(arg => helper.releaseObject(this._client, arg));
-    if (source !== 'worker')
-      this.emit(Events.Page.Console, new ConsoleMessage(level, text, [], {url, lineNumber}));
-  }
-
-  /**
-   * @return {!Puppeteer.Frame}
-   */
-  mainFrame() {
-    return this._frameManager.mainFrame();
-  }
-
-  /**
-   * @return {!Keyboard}
-   */
-  get keyboard() {
-    return this._keyboard;
-  }
-
-  /**
-   * @return {!Touchscreen}
-   */
-  get touchscreen() {
-    return this._touchscreen;
-  }
-
-  /**
-   * @return {!Coverage}
-   */
-  get coverage() {
-    return this._coverage;
-  }
-
-  /**
-   * @return {!Tracing}
-   */
-  get tracing() {
-    return this._tracing;
-  }
-
-  /**
-   * @return {!Accessibility}
-   */
-  get accessibility() {
-    return this._accessibility;
-  }
-
-  /**
-   * @return {!Array<Puppeteer.Frame>}
-   */
-  frames() {
-    return this._frameManager.frames();
-  }
-
-  /**
-   * @return {!Array<!Worker>}
-   */
-  workers() {
-    return Array.from(this._workers.values());
-  }
-
-  /**
-   * @param {boolean} value
-   */
-  async setRequestInterception(value) {
-    return this._frameManager.networkManager().setRequestInterception(value);
-  }
-
-  /**
-   * @param {boolean} enabled
-   */
-  setOfflineMode(enabled) {
-    return this._frameManager.networkManager().setOfflineMode(enabled);
-  }
-
-  /**
-   * @param {number} timeout
-   */
-  setDefaultNavigationTimeout(timeout) {
-    this._timeoutSettings.setDefaultNavigationTimeout(timeout);
-  }
-
-  /**
-   * @param {number} timeout
-   */
-  setDefaultTimeout(timeout) {
-    this._timeoutSettings.setDefaultTimeout(timeout);
-  }
-
-  /**
-   * @param {string} selector
-   * @return {!Promise<?Puppeteer.ElementHandle>}
-   */
-  async $(selector) {
-    return this.mainFrame().$(selector);
-  }
-
-  /**
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<!Puppeteer.JSHandle>}
-   */
-  async evaluateHandle(pageFunction, ...args) {
-    const context = await this.mainFrame().executionContext();
-    return context.evaluateHandle(pageFunction, ...args);
-  }
-
-  /**
-   * @param {!Puppeteer.JSHandle} prototypeHandle
-   * @return {!Promise<!Puppeteer.JSHandle>}
-   */
-  async queryObjects(prototypeHandle) {
-    const context = await this.mainFrame().executionContext();
-    return context.queryObjects(prototypeHandle);
-  }
-
-  /**
-   * @param {string} selector
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<(!Object|undefined)>}
-   */
-  async $eval(selector, pageFunction, ...args) {
-    return this.mainFrame().$eval(selector, pageFunction, ...args);
-  }
-
-  /**
-   * @param {string} selector
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<(!Object|undefined)>}
-   */
-  async $$eval(selector, pageFunction, ...args) {
-    return this.mainFrame().$$eval(selector, pageFunction, ...args);
-  }
-
-  /**
-   * @param {string} selector
-   * @return {!Promise<!Array<!Puppeteer.ElementHandle>>}
-   */
-  async $$(selector) {
-    return this.mainFrame().$$(selector);
-  }
-
-  /**
-   * @param {string} expression
-   * @return {!Promise<!Array<!Puppeteer.ElementHandle>>}
-   */
-  async $x(expression) {
-    return this.mainFrame().$x(expression);
-  }
-
-  /**
-   * @param {!Array<string>} urls
-   * @return {!Promise<!Array<Network.Cookie>>}
-   */
-  async cookies(...urls) {
-    return (await this._client.send('Network.getCookies', {
-      urls: urls.length ? urls : [this.url()]
-    })).cookies;
-  }
-
-  /**
-   * @param {Array<Protocol.Network.deleteCookiesParameters>} cookies
-   */
-  async deleteCookie(...cookies) {
-    const pageURL = this.url();
-    for (const cookie of cookies) {
-      const item = Object.assign({}, cookie);
-      if (!cookie.url && pageURL.startsWith('http'))
-        item.url = pageURL;
-      await this._client.send('Network.deleteCookies', item);
+    static async create(client, target, ignoreHTTPSErrors, defaultViewport, screenshotTaskQueue) {
+        const page = new Page(client, target, ignoreHTTPSErrors, screenshotTaskQueue);
+        await page._initialize();
+        if (defaultViewport)
+            await page.setViewport(defaultViewport);
+        return page;
     }
-  }
-
-  /**
-   * @param {Array<Network.CookieParam>} cookies
-   */
-  async setCookie(...cookies) {
-    const pageURL = this.url();
-    const startsWithHTTP = pageURL.startsWith('http');
-    const items = cookies.map(cookie => {
-      const item = Object.assign({}, cookie);
-      if (!item.url && startsWithHTTP)
-        item.url = pageURL;
-      assert(item.url !== 'about:blank', `Blank page can not have cookie "${item.name}"`);
-      assert(!String.prototype.startsWith.call(item.url || '', 'data:'), `Data URL page can not have cookie "${item.name}"`);
-      return item;
-    });
-    await this.deleteCookie(...items);
-    if (items.length)
-      await this._client.send('Network.setCookies', { cookies: items });
-  }
-
-  /**
-   * @param {!{url?: string, path?: string, content?: string, type?: string}} options
-   * @return {!Promise<!Puppeteer.ElementHandle>}
-   */
-  async addScriptTag(options) {
-    return this.mainFrame().addScriptTag(options);
-  }
-
-  /**
-   * @param {!{url?: string, path?: string, content?: string}} options
-   * @return {!Promise<!Puppeteer.ElementHandle>}
-   */
-  async addStyleTag(options) {
-    return this.mainFrame().addStyleTag(options);
-  }
-
-  /**
-   * @param {string} name
-   * @param {Function} puppeteerFunction
-   */
-  async exposeFunction(name, puppeteerFunction) {
-    if (this._pageBindings.has(name))
-      throw new Error(`Failed to add page binding with name ${name}: window['${name}'] already exists!`);
-    this._pageBindings.set(name, puppeteerFunction);
-
-    const expression = helper.evaluationString(addPageBinding, name);
-    await this._client.send('Runtime.addBinding', {name: name});
-    await this._client.send('Page.addScriptToEvaluateOnNewDocument', {source: expression});
-    await Promise.all(this.frames().map(frame => frame.evaluate(expression).catch(debugError)));
-
-    function addPageBinding(bindingName) {
-      const binding = window[bindingName];
-      window[bindingName] = (...args) => {
-        const me = window[bindingName];
-        let callbacks = me['callbacks'];
-        if (!callbacks) {
-          callbacks = new Map();
-          me['callbacks'] = callbacks;
+    async _initialize() {
+        await Promise.all([
+            this._frameManager.initialize(),
+            this._client.send('Target.setAutoAttach', { autoAttach: true, waitForDebuggerOnStart: false, flatten: true }),
+            this._client.send('Performance.enable', {}),
+            this._client.send('Log.enable', {}),
+        ]);
+    }
+    async _onFileChooser(event) {
+        if (!this._fileChooserInterceptors.size)
+            return;
+        const frame = this._frameManager.frame(event.frameId);
+        const context = await frame.executionContext();
+        const element = await context._adoptBackendNodeId(event.backendNodeId);
+        const interceptors = Array.from(this._fileChooserInterceptors);
+        this._fileChooserInterceptors.clear();
+        const fileChooser = new FileChooser(this._client, element, event);
+        for (const interceptor of interceptors)
+            interceptor.call(null, fileChooser);
+    }
+    async waitForFileChooser(options = {}) {
+        if (!this._fileChooserInterceptors.size)
+            await this._client.send('Page.setInterceptFileChooserDialog', { enabled: true });
+        const { timeout = this._timeoutSettings.timeout(), } = options;
+        let callback;
+        const promise = new Promise(x => callback = x);
+        this._fileChooserInterceptors.add(callback);
+        return helper_1.helper.waitWithTimeout(promise, 'waiting for file chooser', timeout).catch(error => {
+            this._fileChooserInterceptors.delete(callback);
+            throw error;
+        });
+    }
+    async setGeolocation(options) {
+        const { longitude, latitude, accuracy = 0 } = options;
+        if (longitude < -180 || longitude > 180)
+            throw new Error(`Invalid longitude "${longitude}": precondition -180 <= LONGITUDE <= 180 failed.`);
+        if (latitude < -90 || latitude > 90)
+            throw new Error(`Invalid latitude "${latitude}": precondition -90 <= LATITUDE <= 90 failed.`);
+        if (accuracy < 0)
+            throw new Error(`Invalid accuracy "${accuracy}": precondition 0 <= ACCURACY failed.`);
+        await this._client.send('Emulation.setGeolocationOverride', { longitude, latitude, accuracy });
+    }
+    target() {
+        return this._target;
+    }
+    browser() {
+        return this._target.browser();
+    }
+    browserContext() {
+        return this._target.browserContext();
+    }
+    _onTargetCrashed() {
+        this.emit('error', new Error('Page crashed!'));
+    }
+    _onLogEntryAdded(event) {
+        const { level, text, args, source, url, lineNumber } = event.entry;
+        if (args)
+            args.map(arg => helper_1.helper.releaseObject(this._client, arg));
+        if (source !== 'worker')
+            this.emit(Events_1.Events.Page.Console, new ConsoleMessage(level, text, [], { url, lineNumber }));
+    }
+    mainFrame() {
+        return this._frameManager.mainFrame();
+    }
+    get keyboard() {
+        return this._keyboard;
+    }
+    get touchscreen() {
+        return this._touchscreen;
+    }
+    get coverage() {
+        return this._coverage;
+    }
+    get tracing() {
+        return this._tracing;
+    }
+    get accessibility() {
+        return this._accessibility;
+    }
+    frames() {
+        return this._frameManager.frames();
+    }
+    workers() {
+        return Array.from(this._workers.values());
+    }
+    async setRequestInterception(value) {
+        return this._frameManager.networkManager().setRequestInterception(value);
+    }
+    setOfflineMode(enabled) {
+        return this._frameManager.networkManager().setOfflineMode(enabled);
+    }
+    setDefaultNavigationTimeout(timeout) {
+        this._timeoutSettings.setDefaultNavigationTimeout(timeout);
+    }
+    setDefaultTimeout(timeout) {
+        this._timeoutSettings.setDefaultTimeout(timeout);
+    }
+    async $(selector) {
+        return this.mainFrame().$(selector);
+    }
+    async evaluateHandle(pageFunction, ...args) {
+        const context = await this.mainFrame().executionContext();
+        return context.evaluateHandle(pageFunction, ...args);
+    }
+    async queryObjects(prototypeHandle) {
+        const context = await this.mainFrame().executionContext();
+        return context.queryObjects(prototypeHandle);
+    }
+    async $eval(selector, pageFunction, ...args) {
+        return this.mainFrame().$eval(selector, pageFunction, ...args);
+    }
+    async $$eval(selector, pageFunction, ...args) {
+        return this.mainFrame().$$eval(selector, pageFunction, ...args);
+    }
+    async $$(selector) {
+        return this.mainFrame().$$(selector);
+    }
+    async $x(expression) {
+        return this.mainFrame().$x(expression);
+    }
+    async cookies(...urls) {
+        const originalCookies = (await this._client.send('Network.getCookies', {
+            urls: urls.length ? urls : [this.url()]
+        })).cookies;
+        const unsupportedCookieAttributes = ['priority'];
+        const filterUnsupportedAttributes = (cookie) => {
+            for (const attr of unsupportedCookieAttributes)
+                delete cookie[attr];
+            return cookie;
+        };
+        return originalCookies.map(filterUnsupportedAttributes);
+    }
+    async deleteCookie(...cookies) {
+        const pageURL = this.url();
+        for (const cookie of cookies) {
+            const item = Object.assign({}, cookie);
+            if (!cookie.url && pageURL.startsWith('http'))
+                item.url = pageURL;
+            await this._client.send('Network.deleteCookies', item);
         }
-        const seq = (me['lastSeq'] || 0) + 1;
-        me['lastSeq'] = seq;
-        const promise = new Promise((resolve, reject) => callbacks.set(seq, {resolve, reject}));
-        binding(JSON.stringify({name: bindingName, seq, args}));
-        return promise;
-      };
     }
-  }
-
-  /**
-   * @param {?{username: string, password: string}} credentials
-   */
-  async authenticate(credentials) {
-    return this._frameManager.networkManager().authenticate(credentials);
-  }
-
-  /**
-   * @param {!Object<string, string>} headers
-   */
-  async setExtraHTTPHeaders(headers) {
-    return this._frameManager.networkManager().setExtraHTTPHeaders(headers);
-  }
-
-  /**
-   * @param {string} userAgent
-   */
-  async setUserAgent(userAgent) {
-    return this._frameManager.networkManager().setUserAgent(userAgent);
-  }
-
-  /**
-   * @return {!Promise<!Metrics>}
-   */
-  async metrics() {
-    const response = await this._client.send('Performance.getMetrics');
-    return this._buildMetricsObject(response.metrics);
-  }
-
-  /**
-   * @param {!Protocol.Performance.metricsPayload} event
-   */
-  _emitMetrics(event) {
-    this.emit(Events.Page.Metrics, {
-      title: event.title,
-      metrics: this._buildMetricsObject(event.metrics)
-    });
-  }
-
-  /**
-   * @param {?Array<!Protocol.Performance.Metric>} metrics
-   * @return {!Metrics}
-   */
-  _buildMetricsObject(metrics) {
-    const result = {};
-    for (const metric of metrics || []) {
-      if (supportedMetrics.has(metric.name))
-        result[metric.name] = metric.value;
+    async setCookie(...cookies) {
+        const pageURL = this.url();
+        const startsWithHTTP = pageURL.startsWith('http');
+        const items = cookies.map(cookie => {
+            const item = Object.assign({}, cookie);
+            if (!item.url && startsWithHTTP)
+                item.url = pageURL;
+            helper_1.assert(item.url !== 'about:blank', `Blank page can not have cookie "${item.name}"`);
+            helper_1.assert(!String.prototype.startsWith.call(item.url || '', 'data:'), `Data URL page can not have cookie "${item.name}"`);
+            return item;
+        });
+        await this.deleteCookie(...items);
+        if (items.length)
+            await this._client.send('Network.setCookies', { cookies: items });
     }
-    return result;
-  }
-
-  /**
-   * @param {!Protocol.Runtime.ExceptionDetails} exceptionDetails
-   */
-  _handleException(exceptionDetails) {
-    const message = helper.getExceptionMessage(exceptionDetails);
-    const err = new Error(message);
-    err.stack = ''; // Don't report clientside error with a node stack attached
-    this.emit(Events.Page.PageError, err);
-  }
-
-  /**
-   * @param {!Protocol.Runtime.consoleAPICalledPayload} event
-   */
-  async _onConsoleAPI(event) {
-    if (event.executionContextId === 0) {
-      // DevTools protocol stores the last 1000 console messages. These
-      // messages are always reported even for removed execution contexts. In
-      // this case, they are marked with executionContextId = 0 and are
-      // reported upon enabling Runtime agent.
-      //
-      // Ignore these messages since:
-      // - there's no execution context we can use to operate with message
-      //   arguments
-      // - these messages are reported before Puppeteer clients can subscribe
-      //   to the 'console'
-      //   page event.
-      //
-      // @see https://github.com/GoogleChrome/puppeteer/issues/3865
-      return;
+    async addScriptTag(options) {
+        return this.mainFrame().addScriptTag(options);
     }
-    const context = this._frameManager.executionContextById(event.executionContextId);
-    const values = event.args.map(arg => createJSHandle(context, arg));
-    this._addConsoleMessage(event.type, values, event.stackTrace);
-  }
-
-  /**
-   * @param {!Protocol.Runtime.bindingCalledPayload} event
-   */
-  async _onBindingCalled(event) {
-    const {name, seq, args} = JSON.parse(event.payload);
-    let expression = null;
-    try {
-      const result = await this._pageBindings.get(name)(...args);
-      expression = helper.evaluationString(deliverResult, name, seq, result);
-    } catch (error) {
-      if (error instanceof Error)
-        expression = helper.evaluationString(deliverError, name, seq, error.message, error.stack);
-      else
-        expression = helper.evaluationString(deliverErrorValue, name, seq, error);
+    async addStyleTag(options) {
+        return this.mainFrame().addStyleTag(options);
     }
-    this._client.send('Runtime.evaluate', { expression, contextId: event.executionContextId }).catch(debugError);
-
-    /**
-     * @param {string} name
-     * @param {number} seq
-     * @param {*} result
-     */
-    function deliverResult(name, seq, result) {
-      window[name]['callbacks'].get(seq).resolve(result);
-      window[name]['callbacks'].delete(seq);
+    async exposeFunction(name, puppeteerFunction) {
+        if (this._pageBindings.has(name))
+            throw new Error(`Failed to add page binding with name ${name}: window['${name}'] already exists!`);
+        this._pageBindings.set(name, puppeteerFunction);
+        const expression = helper_1.helper.evaluationString(addPageBinding, name);
+        await this._client.send('Runtime.addBinding', { name: name });
+        await this._client.send('Page.addScriptToEvaluateOnNewDocument', { source: expression });
+        await Promise.all(this.frames().map(frame => frame.evaluate(expression).catch(helper_1.debugError)));
+        function addPageBinding(bindingName) {
+            /* Cast window to any here as we're about to add properties to it
+             * via win[bindingName] which TypeScript doesn't like.
+             */
+            const win = window;
+            const binding = win[bindingName];
+            win[bindingName] = (...args) => {
+                const me = window[bindingName];
+                let callbacks = me['callbacks'];
+                if (!callbacks) {
+                    callbacks = new Map();
+                    me['callbacks'] = callbacks;
+                }
+                const seq = (me['lastSeq'] || 0) + 1;
+                me['lastSeq'] = seq;
+                const promise = new Promise((resolve, reject) => callbacks.set(seq, { resolve, reject }));
+                binding(JSON.stringify({ name: bindingName, seq, args }));
+                return promise;
+            };
+        }
     }
-
-    /**
-     * @param {string} name
-     * @param {number} seq
-     * @param {string} message
-     * @param {string} stack
-     */
-    function deliverError(name, seq, message, stack) {
-      const error = new Error(message);
-      error.stack = stack;
-      window[name]['callbacks'].get(seq).reject(error);
-      window[name]['callbacks'].delete(seq);
+    async authenticate(credentials) {
+        return this._frameManager.networkManager().authenticate(credentials);
     }
-
-    /**
-     * @param {string} name
-     * @param {number} seq
-     * @param {*} value
-     */
-    function deliverErrorValue(name, seq, value) {
-      window[name]['callbacks'].get(seq).reject(value);
-      window[name]['callbacks'].delete(seq);
+    async setExtraHTTPHeaders(headers) {
+        return this._frameManager.networkManager().setExtraHTTPHeaders(headers);
     }
-  }
-
-  /**
-   * @param {string} type
-   * @param {!Array<!Puppeteer.JSHandle>} args
-   * @param {Protocol.Runtime.StackTrace=} stackTrace
-   */
-  _addConsoleMessage(type, args, stackTrace) {
-    if (!this.listenerCount(Events.Page.Console)) {
-      args.forEach(arg => arg.dispose());
-      return;
+    async setUserAgent(userAgent) {
+        return this._frameManager.networkManager().setUserAgent(userAgent);
     }
-    const textTokens = [];
-    for (const arg of args) {
-      const remoteObject = arg._remoteObject;
-      if (remoteObject.objectId)
-        textTokens.push(arg.toString());
-      else
-        textTokens.push(helper.valueFromRemoteObject(remoteObject));
+    async metrics() {
+        const response = await this._client.send('Performance.getMetrics');
+        return this._buildMetricsObject(response.metrics);
     }
-    const location = stackTrace && stackTrace.callFrames.length ? {
-      url: stackTrace.callFrames[0].url,
-      lineNumber: stackTrace.callFrames[0].lineNumber,
-      columnNumber: stackTrace.callFrames[0].columnNumber,
-    } : {};
-    const message = new ConsoleMessage(type, textTokens.join(' '), args, location);
-    this.emit(Events.Page.Console, message);
-  }
-
-  _onDialog(event) {
-    let dialogType = null;
-    if (event.type === 'alert')
-      dialogType = Dialog.Type.Alert;
-    else if (event.type === 'confirm')
-      dialogType = Dialog.Type.Confirm;
-    else if (event.type === 'prompt')
-      dialogType = Dialog.Type.Prompt;
-    else if (event.type === 'beforeunload')
-      dialogType = Dialog.Type.BeforeUnload;
-    assert(dialogType, 'Unknown javascript dialog type: ' + event.type);
-    const dialog = new Dialog(this._client, dialogType, event.message, event.defaultPrompt);
-    this.emit(Events.Page.Dialog, dialog);
-  }
-
-  /**
-   * @return {!string}
-   */
-  url() {
-    return this.mainFrame().url();
-  }
-
-  /**
-   * @return {!Promise<string>}
-   */
-  async content() {
-    return await this._frameManager.mainFrame().content();
-  }
-
-  /**
-   * @param {string} html
-   * @param {!{timeout?: number, waitUntil?: string|!Array<string>}=} options
-   */
-  async setContent(html, options) {
-    await this._frameManager.mainFrame().setContent(html, options);
-  }
-
-  /**
-   * @param {string} url
-   * @param {!{referer?: string, timeout?: number, waitUntil?: string|!Array<string>}=} options
-   * @return {!Promise<?Puppeteer.Response>}
-   */
-  async goto(url, options) {
-    return await this._frameManager.mainFrame().goto(url, options);
-  }
-
-  /**
-   * @param {!{timeout?: number, waitUntil?: string|!Array<string>}=} options
-   * @return {!Promise<?Puppeteer.Response>}
-   */
-  async reload(options) {
-    const [response] = await Promise.all([
-      this.waitForNavigation(options),
-      this._client.send('Page.reload')
-    ]);
-    return response;
-  }
-
-  /**
-   * @param {!{timeout?: number, waitUntil?: string|!Array<string>}=} options
-   * @return {!Promise<?Puppeteer.Response>}
-   */
-  async waitForNavigation(options = {}) {
-    return await this._frameManager.mainFrame().waitForNavigation(options);
-  }
-
-  _sessionClosePromise() {
-    if (!this._disconnectPromise)
-      this._disconnectPromise = new Promise(fulfill => this._client.once(Events.CDPSession.Disconnected, () => fulfill(new Error('Target closed'))));
-    return this._disconnectPromise;
-  }
-
-  /**
-   * @param {(string|Function)} urlOrPredicate
-   * @param {!{timeout?: number}=} options
-   * @return {!Promise<!Puppeteer.Request>}
-   */
-  async waitForRequest(urlOrPredicate, options = {}) {
-    const {
-      timeout = this._timeoutSettings.timeout(),
-    } = options;
-    return helper.waitForEvent(this._frameManager.networkManager(), Events.NetworkManager.Request, request => {
-      if (helper.isString(urlOrPredicate))
-        return (urlOrPredicate === request.url());
-      if (typeof urlOrPredicate === 'function')
-        return !!(urlOrPredicate(request));
-      return false;
-    }, timeout, this._sessionClosePromise());
-  }
-
-  /**
-   * @param {(string|Function)} urlOrPredicate
-   * @param {!{timeout?: number}=} options
-   * @return {!Promise<!Puppeteer.Response>}
-   */
-  async waitForResponse(urlOrPredicate, options = {}) {
-    const {
-      timeout = this._timeoutSettings.timeout(),
-    } = options;
-    return helper.waitForEvent(this._frameManager.networkManager(), Events.NetworkManager.Response, response => {
-      if (helper.isString(urlOrPredicate))
-        return (urlOrPredicate === response.url());
-      if (typeof urlOrPredicate === 'function')
-        return !!(urlOrPredicate(response));
-      return false;
-    }, timeout, this._sessionClosePromise());
-  }
-
-  /**
-   * @param {!{timeout?: number, waitUntil?: string|!Array<string>}=} options
-   * @return {!Promise<?Puppeteer.Response>}
-   */
-  async goBack(options) {
-    return this._go(-1, options);
-  }
-
-  /**
-   * @param {!{timeout?: number, waitUntil?: string|!Array<string>}=} options
-   * @return {!Promise<?Puppeteer.Response>}
-   */
-  async goForward(options) {
-    return this._go(+1, options);
-  }
-
-  /**
-   * @param {!{timeout?: number, waitUntil?: string|!Array<string>}=} options
-   * @return {!Promise<?Puppeteer.Response>}
-   */
-  async _go(delta, options) {
-    const history = await this._client.send('Page.getNavigationHistory');
-    const entry = history.entries[history.currentIndex + delta];
-    if (!entry)
-      return null;
-    const [response] = await Promise.all([
-      this.waitForNavigation(options),
-      this._client.send('Page.navigateToHistoryEntry', {entryId: entry.id}),
-    ]);
-    return response;
-  }
-
-  async bringToFront() {
-    await this._client.send('Page.bringToFront');
-  }
-
-  /**
-   * @param {!{viewport: !Puppeteer.Viewport, userAgent: string}} options
-   */
-  async emulate(options) {
-    await Promise.all([
-      this.setViewport(options.viewport),
-      this.setUserAgent(options.userAgent)
-    ]);
-  }
-
-  /**
-   * @param {boolean} enabled
-   */
-  async setJavaScriptEnabled(enabled) {
-    if (this._javascriptEnabled === enabled)
-      return;
-    this._javascriptEnabled = enabled;
-    await this._client.send('Emulation.setScriptExecutionDisabled', { value: !enabled });
-  }
-
-  /**
-   * @param {boolean} enabled
-   */
-  async setBypassCSP(enabled) {
-    await this._client.send('Page.setBypassCSP', { enabled });
-  }
-
-  /**
-   * @param {?string} type
-   */
-  async emulateMediaType(type) {
-    assert(type === 'screen' || type === 'print' || type === null, 'Unsupported media type: ' + type);
-    await this._client.send('Emulation.setEmulatedMedia', {media: type || ''});
-  }
-
-  /**
-   * @param {?Array<MediaFeature>} features
-   */
-  async emulateMediaFeatures(features) {
-    if (features === null)
-      await this._client.send('Emulation.setEmulatedMedia', {features: null});
-    if (Array.isArray(features)) {
-      features.every(mediaFeature => {
-        const name = mediaFeature.name;
-        assert(/^prefers-(?:color-scheme|reduced-motion)$/.test(name), 'Unsupported media feature: ' + name);
-        return true;
-      });
-      await this._client.send('Emulation.setEmulatedMedia', {features: features});
+    _emitMetrics(event) {
+        this.emit(Events_1.Events.Page.Metrics, {
+            title: event.title,
+            metrics: this._buildMetricsObject(event.metrics)
+        });
     }
-  }
-
-  /**
-   * @param {?string} timezoneId
-   */
-  async emulateTimezone(timezoneId) {
-    try {
-      await this._client.send('Emulation.setTimezoneOverride', {timezoneId: timezoneId || ''});
-    } catch (exception) {
-      if (exception.message.includes('Invalid timezone'))
-        throw new Error(`Invalid timezone ID: ${timezoneId}`);
-      throw exception;
+    _buildMetricsObject(metrics) {
+        const result = {};
+        for (const metric of metrics || []) {
+            if (supportedMetrics.has(metric.name))
+                result[metric.name] = metric.value;
+        }
+        return result;
     }
-  }
-
-  /**
-   * @param {!Puppeteer.Viewport} viewport
-   */
-  async setViewport(viewport) {
-    const needsReload = await this._emulationManager.emulateViewport(viewport);
-    this._viewport = viewport;
-    if (needsReload)
-      await this.reload();
-  }
-
-  /**
-   * @return {?Puppeteer.Viewport}
-   */
-  viewport() {
-    return this._viewport;
-  }
-
-  /**
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<*>}
-   */
-  async evaluate(pageFunction, ...args) {
-    return this._frameManager.mainFrame().evaluate(pageFunction, ...args);
-  }
-
-  /**
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   */
-  async evaluateOnNewDocument(pageFunction, ...args) {
-    const source = helper.evaluationString(pageFunction, ...args);
-    await this._client.send('Page.addScriptToEvaluateOnNewDocument', { source });
-  }
-
-  /**
-   * @param {boolean} enabled
-   */
-  async setCacheEnabled(enabled = true) {
-    await this._frameManager.networkManager().setCacheEnabled(enabled);
-  }
-
-  /**
-   * @param {!ScreenshotOptions=} options
-   * @return {!Promise<!Buffer|!String>}
-   */
-  async screenshot(options = {}) {
-    let screenshotType = null;
-    // options.type takes precedence over inferring the type from options.path
-    // because it may be a 0-length file with no extension created beforehand (i.e. as a temp file).
-    if (options.type) {
-      assert(options.type === 'png' || options.type === 'jpeg', 'Unknown options.type value: ' + options.type);
-      screenshotType = options.type;
-    } else if (options.path) {
-      const mimeType = mime.getType(options.path);
-      if (mimeType === 'image/png')
-        screenshotType = 'png';
-      else if (mimeType === 'image/jpeg')
-        screenshotType = 'jpeg';
-      assert(screenshotType, 'Unsupported screenshot mime type: ' + mimeType);
+    _handleException(exceptionDetails) {
+        const message = helper_1.helper.getExceptionMessage(exceptionDetails);
+        const err = new Error(message);
+        err.stack = ''; // Don't report clientside error with a node stack attached
+        this.emit(Events_1.Events.Page.PageError, err);
     }
-
-    if (!screenshotType)
-      screenshotType = 'png';
-
-    if (options.quality) {
-      assert(screenshotType === 'jpeg', 'options.quality is unsupported for the ' + screenshotType + ' screenshots');
-      assert(typeof options.quality === 'number', 'Expected options.quality to be a number but found ' + (typeof options.quality));
-      assert(Number.isInteger(options.quality), 'Expected options.quality to be an integer');
-      assert(options.quality >= 0 && options.quality <= 100, 'Expected options.quality to be between 0 and 100 (inclusive), got ' + options.quality);
+    async _onConsoleAPI(event) {
+        if (event.executionContextId === 0) {
+            // DevTools protocol stores the last 1000 console messages. These
+            // messages are always reported even for removed execution contexts. In
+            // this case, they are marked with executionContextId = 0 and are
+            // reported upon enabling Runtime agent.
+            //
+            // Ignore these messages since:
+            // - there's no execution context we can use to operate with message
+            //   arguments
+            // - these messages are reported before Puppeteer clients can subscribe
+            //   to the 'console'
+            //   page event.
+            //
+            // @see https://github.com/puppeteer/puppeteer/issues/3865
+            return;
+        }
+        const context = this._frameManager.executionContextById(event.executionContextId);
+        const values = event.args.map(arg => JSHandle_1.createJSHandle(context, arg));
+        this._addConsoleMessage(event.type, values, event.stackTrace);
     }
-    assert(!options.clip || !options.fullPage, 'options.clip and options.fullPage are exclusive');
-    if (options.clip) {
-      assert(typeof options.clip.x === 'number', 'Expected options.clip.x to be a number but found ' + (typeof options.clip.x));
-      assert(typeof options.clip.y === 'number', 'Expected options.clip.y to be a number but found ' + (typeof options.clip.y));
-      assert(typeof options.clip.width === 'number', 'Expected options.clip.width to be a number but found ' + (typeof options.clip.width));
-      assert(typeof options.clip.height === 'number', 'Expected options.clip.height to be a number but found ' + (typeof options.clip.height));
-      assert(options.clip.width !== 0, 'Expected options.clip.width not to be 0.');
-      assert(options.clip.height !== 0, 'Expected options.clip.height not to be 0.');
+    async _onBindingCalled(event) {
+        const { name, seq, args } = JSON.parse(event.payload);
+        let expression = null;
+        try {
+            const result = await this._pageBindings.get(name)(...args);
+            expression = helper_1.helper.evaluationString(deliverResult, name, seq, result);
+        }
+        catch (error) {
+            if (error instanceof Error)
+                expression = helper_1.helper.evaluationString(deliverError, name, seq, error.message, error.stack);
+            else
+                expression = helper_1.helper.evaluationString(deliverErrorValue, name, seq, error);
+        }
+        this._client.send('Runtime.evaluate', { expression, contextId: event.executionContextId }).catch(helper_1.debugError);
+        function deliverResult(name, seq, result) {
+            window[name]['callbacks'].get(seq).resolve(result);
+            window[name]['callbacks'].delete(seq);
+        }
+        function deliverError(name, seq, message, stack) {
+            const error = new Error(message);
+            error.stack = stack;
+            window[name]['callbacks'].get(seq).reject(error);
+            window[name]['callbacks'].delete(seq);
+        }
+        function deliverErrorValue(name, seq, value) {
+            window[name]['callbacks'].get(seq).reject(value);
+            window[name]['callbacks'].delete(seq);
+        }
     }
-    return this._screenshotTaskQueue.postTask(this._screenshotTask.bind(this, screenshotType, options));
-  }
-
-  /**
-   * @param {"png"|"jpeg"} format
-   * @param {!ScreenshotOptions=} options
-   * @return {!Promise<!Buffer|!String>}
-   */
-  async _screenshotTask(format, options) {
-    await this._client.send('Target.activateTarget', {targetId: this._target._targetId});
-    let clip = options.clip ? processClip(options.clip) : undefined;
-
-    if (options.fullPage) {
-      const metrics = await this._client.send('Page.getLayoutMetrics');
-      const width = Math.ceil(metrics.contentSize.width);
-      const height = Math.ceil(metrics.contentSize.height);
-
-      // Overwrite clip for full page at all times.
-      clip = { x: 0, y: 0, width, height, scale: 1 };
-      const {
-        isMobile = false,
-        deviceScaleFactor = 1,
-        isLandscape = false
-      } = this._viewport || {};
-      /** @type {!Protocol.Emulation.ScreenOrientation} */
-      const screenOrientation = isLandscape ? { angle: 90, type: 'landscapePrimary' } : { angle: 0, type: 'portraitPrimary' };
-      await this._client.send('Emulation.setDeviceMetricsOverride', { mobile: isMobile, width, height, deviceScaleFactor, screenOrientation });
+    _addConsoleMessage(type, args, stackTrace) {
+        if (!this.listenerCount(Events_1.Events.Page.Console)) {
+            args.forEach(arg => arg.dispose());
+            return;
+        }
+        const textTokens = [];
+        for (const arg of args) {
+            const remoteObject = arg._remoteObject;
+            if (remoteObject.objectId)
+                textTokens.push(arg.toString());
+            else
+                textTokens.push(helper_1.helper.valueFromRemoteObject(remoteObject));
+        }
+        const location = stackTrace && stackTrace.callFrames.length ? {
+            url: stackTrace.callFrames[0].url,
+            lineNumber: stackTrace.callFrames[0].lineNumber,
+            columnNumber: stackTrace.callFrames[0].columnNumber,
+        } : {};
+        const message = new ConsoleMessage(type, textTokens.join(' '), args, location);
+        this.emit(Events_1.Events.Page.Console, message);
     }
-    const shouldSetDefaultBackground = options.omitBackground && format === 'png';
-    if (shouldSetDefaultBackground)
-      await this._client.send('Emulation.setDefaultBackgroundColorOverride', { color: { r: 0, g: 0, b: 0, a: 0 } });
-    const result = await this._client.send('Page.captureScreenshot', { format, quality: options.quality, clip });
-    if (shouldSetDefaultBackground)
-      await this._client.send('Emulation.setDefaultBackgroundColorOverride');
-
-    if (options.fullPage && this._viewport)
-      await this.setViewport(this._viewport);
-
-    const buffer = options.encoding === 'base64' ? result.data : Buffer.from(result.data, 'base64');
-    if (options.path)
-      await writeFileAsync(options.path, buffer);
-    return buffer;
-
-    function processClip(clip) {
-      const x = Math.round(clip.x);
-      const y = Math.round(clip.y);
-      const width = Math.round(clip.width + clip.x - x);
-      const height = Math.round(clip.height + clip.y - y);
-      return {x, y, width, height, scale: 1};
+    _onDialog(event) {
+        let dialogType = null;
+        if (event.type === 'alert')
+            dialogType = Dialog_1.Dialog.Type.Alert;
+        else if (event.type === 'confirm')
+            dialogType = Dialog_1.Dialog.Type.Confirm;
+        else if (event.type === 'prompt')
+            dialogType = Dialog_1.Dialog.Type.Prompt;
+        else if (event.type === 'beforeunload')
+            dialogType = Dialog_1.Dialog.Type.BeforeUnload;
+        helper_1.assert(dialogType, 'Unknown javascript dialog type: ' + event.type);
+        const dialog = new Dialog_1.Dialog(this._client, dialogType, event.message, event.defaultPrompt);
+        this.emit(Events_1.Events.Page.Dialog, dialog);
     }
-  }
-
-  /**
-   * @param {!PDFOptions=} options
-   * @return {!Promise<!Buffer>}
-   */
-  async pdf(options = {}) {
-    const {
-      scale = 1,
-      displayHeaderFooter = false,
-      headerTemplate = '',
-      footerTemplate = '',
-      printBackground = false,
-      landscape = false,
-      pageRanges = '',
-      preferCSSPageSize = false,
-      margin = {},
-      path = null
-    } = options;
-
-    let paperWidth = 8.5;
-    let paperHeight = 11;
-    if (options.format) {
-      const format = Page.PaperFormats[options.format.toLowerCase()];
-      assert(format, 'Unknown paper format: ' + options.format);
-      paperWidth = format.width;
-      paperHeight = format.height;
-    } else {
-      paperWidth = convertPrintParameterToInches(options.width) || paperWidth;
-      paperHeight = convertPrintParameterToInches(options.height) || paperHeight;
+    url() {
+        return this.mainFrame().url();
     }
-
-    const marginTop = convertPrintParameterToInches(margin.top) || 0;
-    const marginLeft = convertPrintParameterToInches(margin.left) || 0;
-    const marginBottom = convertPrintParameterToInches(margin.bottom) || 0;
-    const marginRight = convertPrintParameterToInches(margin.right) || 0;
-
-    const result = await this._client.send('Page.printToPDF', {
-      transferMode: 'ReturnAsStream',
-      landscape,
-      displayHeaderFooter,
-      headerTemplate,
-      footerTemplate,
-      printBackground,
-      scale,
-      paperWidth,
-      paperHeight,
-      marginTop,
-      marginBottom,
-      marginLeft,
-      marginRight,
-      pageRanges,
-      preferCSSPageSize
-    });
-    return await helper.readProtocolStream(this._client, result.stream, path);
-  }
-
-  /**
-   * @return {!Promise<string>}
-   */
-  async title() {
-    return this.mainFrame().title();
-  }
-
-  /**
-   * @param {!{runBeforeUnload: (boolean|undefined)}=} options
-   */
-  async close(options = {runBeforeUnload: undefined}) {
-    assert(!!this._client._connection, 'Protocol error: Connection closed. Most likely the page has been closed.');
-    const runBeforeUnload = !!options.runBeforeUnload;
-    if (runBeforeUnload) {
-      await this._client.send('Page.close');
-    } else {
-      await this._client._connection.send('Target.closeTarget', { targetId: this._target._targetId });
-      await this._target._isClosedPromise;
+    async content() {
+        return await this._frameManager.mainFrame().content();
     }
-  }
-
-  /**
-   * @return {boolean}
-   */
-  isClosed() {
-    return this._closed;
-  }
-
-  /**
-   * @return {!Mouse}
-   */
-  get mouse() {
-    return this._mouse;
-  }
-
-  /**
-   * @param {string} selector
-   * @param {!{delay?: number, button?: "left"|"right"|"middle", clickCount?: number}=} options
-   */
-  click(selector, options = {}) {
-    return this.mainFrame().click(selector, options);
-  }
-
-  /**
-   * @param {string} selector
-   */
-  focus(selector) {
-    return this.mainFrame().focus(selector);
-  }
-
-  /**
-   * @param {string} selector
-   */
-  hover(selector) {
-    return this.mainFrame().hover(selector);
-  }
-
-  /**
-   * @param {string} selector
-   * @param {!Array<string>} values
-   * @return {!Promise<!Array<string>>}
-   */
-  select(selector, ...values) {
-    return this.mainFrame().select(selector, ...values);
-  }
-
-  /**
-   * @param {string} selector
-   */
-  tap(selector) {
-    return this.mainFrame().tap(selector);
-  }
-
-  /**
-   * @param {string} selector
-   * @param {string} text
-   * @param {{delay: (number|undefined)}=} options
-   */
-  type(selector, text, options) {
-    return this.mainFrame().type(selector, text, options);
-  }
-
-  /**
-   * @param {(string|number|Function)} selectorOrFunctionOrTimeout
-   * @param {!{visible?: boolean, hidden?: boolean, timeout?: number, polling?: string|number}=} options
-   * @param {!Array<*>} args
-   * @return {!Promise<!Puppeteer.JSHandle>}
-   */
-  waitFor(selectorOrFunctionOrTimeout, options = {}, ...args) {
-    return this.mainFrame().waitFor(selectorOrFunctionOrTimeout, options, ...args);
-  }
-
-  /**
-   * @param {string} selector
-   * @param {!{visible?: boolean, hidden?: boolean, timeout?: number}=} options
-   * @return {!Promise<?Puppeteer.ElementHandle>}
-   */
-  waitForSelector(selector, options = {}) {
-    return this.mainFrame().waitForSelector(selector, options);
-  }
-
-  /**
-   * @param {string} xpath
-   * @param {!{visible?: boolean, hidden?: boolean, timeout?: number}=} options
-   * @return {!Promise<?Puppeteer.ElementHandle>}
-   */
-  waitForXPath(xpath, options = {}) {
-    return this.mainFrame().waitForXPath(xpath, options);
-  }
-
-  /**
-   * @param {Function} pageFunction
-   * @param {!{polling?: string|number, timeout?: number}=} options
-   * @param {!Array<*>} args
-   * @return {!Promise<!Puppeteer.JSHandle>}
-   */
-  waitForFunction(pageFunction, options = {}, ...args) {
-    return this.mainFrame().waitForFunction(pageFunction, options, ...args);
-  }
+    async setContent(html, options) {
+        await this._frameManager.mainFrame().setContent(html, options);
+    }
+    async goto(url, options) {
+        return await this._frameManager.mainFrame().goto(url, options);
+    }
+    async reload(options) {
+        const result = await Promise.all([
+            this.waitForNavigation(options),
+            this._client.send('Page.reload')
+        ]);
+        return result[0];
+    }
+    async waitForNavigation(options = {}) {
+        return await this._frameManager.mainFrame().waitForNavigation(options);
+    }
+    _sessionClosePromise() {
+        if (!this._disconnectPromise)
+            this._disconnectPromise = new Promise(fulfill => this._client.once(Events_1.Events.CDPSession.Disconnected, () => fulfill(new Error('Target closed'))));
+        return this._disconnectPromise;
+    }
+    async waitForRequest(urlOrPredicate, options = {}) {
+        const { timeout = this._timeoutSettings.timeout(), } = options;
+        return helper_1.helper.waitForEvent(this._frameManager.networkManager(), Events_1.Events.NetworkManager.Request, request => {
+            if (helper_1.helper.isString(urlOrPredicate))
+                return (urlOrPredicate === request.url());
+            if (typeof urlOrPredicate === 'function')
+                return !!(urlOrPredicate(request));
+            return false;
+        }, timeout, this._sessionClosePromise());
+    }
+    async waitForResponse(urlOrPredicate, options = {}) {
+        const { timeout = this._timeoutSettings.timeout(), } = options;
+        return helper_1.helper.waitForEvent(this._frameManager.networkManager(), Events_1.Events.NetworkManager.Response, response => {
+            if (helper_1.helper.isString(urlOrPredicate))
+                return (urlOrPredicate === response.url());
+            if (typeof urlOrPredicate === 'function')
+                return !!(urlOrPredicate(response));
+            return false;
+        }, timeout, this._sessionClosePromise());
+    }
+    async goBack(options) {
+        return this._go(-1, options);
+    }
+    async goForward(options) {
+        return this._go(+1, options);
+    }
+    async _go(delta, options) {
+        const history = await this._client.send('Page.getNavigationHistory');
+        const entry = history.entries[history.currentIndex + delta];
+        if (!entry)
+            return null;
+        const result = await Promise.all([
+            this.waitForNavigation(options),
+            this._client.send('Page.navigateToHistoryEntry', { entryId: entry.id }),
+        ]);
+        return result[0];
+    }
+    async bringToFront() {
+        await this._client.send('Page.bringToFront');
+    }
+    async emulate(options) {
+        await Promise.all([
+            this.setViewport(options.viewport),
+            this.setUserAgent(options.userAgent)
+        ]);
+    }
+    async setJavaScriptEnabled(enabled) {
+        if (this._javascriptEnabled === enabled)
+            return;
+        this._javascriptEnabled = enabled;
+        await this._client.send('Emulation.setScriptExecutionDisabled', { value: !enabled });
+    }
+    async setBypassCSP(enabled) {
+        await this._client.send('Page.setBypassCSP', { enabled });
+    }
+    async emulateMediaType(type) {
+        helper_1.assert(type === 'screen' || type === 'print' || type === null, 'Unsupported media type: ' + type);
+        await this._client.send('Emulation.setEmulatedMedia', { media: type || '' });
+    }
+    async emulateMediaFeatures(features) {
+        if (features === null)
+            await this._client.send('Emulation.setEmulatedMedia', { features: null });
+        if (Array.isArray(features)) {
+            features.every(mediaFeature => {
+                const name = mediaFeature.name;
+                helper_1.assert(/^prefers-(?:color-scheme|reduced-motion)$/.test(name), 'Unsupported media feature: ' + name);
+                return true;
+            });
+            await this._client.send('Emulation.setEmulatedMedia', { features: features });
+        }
+    }
+    async emulateTimezone(timezoneId) {
+        try {
+            await this._client.send('Emulation.setTimezoneOverride', { timezoneId: timezoneId || '' });
+        }
+        catch (error) {
+            if (error.message.includes('Invalid timezone'))
+                throw new Error(`Invalid timezone ID: ${timezoneId}`);
+            throw error;
+        }
+    }
+    async setViewport(viewport) {
+        const needsReload = await this._emulationManager.emulateViewport(viewport);
+        this._viewport = viewport;
+        if (needsReload)
+            await this.reload();
+    }
+    viewport() {
+        return this._viewport;
+    }
+    async evaluate(pageFunction, ...args) {
+        return this._frameManager.mainFrame().evaluate(pageFunction, ...args);
+    }
+    async evaluateOnNewDocument(pageFunction, ...args) {
+        const source = helper_1.helper.evaluationString(pageFunction, ...args);
+        await this._client.send('Page.addScriptToEvaluateOnNewDocument', { source });
+    }
+    async setCacheEnabled(enabled = true) {
+        await this._frameManager.networkManager().setCacheEnabled(enabled);
+    }
+    async screenshot(options = {}) {
+        let screenshotType = null;
+        // options.type takes precedence over inferring the type from options.path
+        // because it may be a 0-length file with no extension created beforehand (i.e. as a temp file).
+        if (options.type) {
+            helper_1.assert(options.type === 'png' || options.type === 'jpeg', 'Unknown options.type value: ' + options.type);
+            screenshotType = options.type;
+        }
+        else if (options.path) {
+            const mimeType = mime.getType(options.path);
+            if (mimeType === 'image/png')
+                screenshotType = 'png';
+            else if (mimeType === 'image/jpeg')
+                screenshotType = 'jpeg';
+            helper_1.assert(screenshotType, 'Unsupported screenshot mime type: ' + mimeType);
+        }
+        if (!screenshotType)
+            screenshotType = 'png';
+        if (options.quality) {
+            helper_1.assert(screenshotType === 'jpeg', 'options.quality is unsupported for the ' + screenshotType + ' screenshots');
+            helper_1.assert(typeof options.quality === 'number', 'Expected options.quality to be a number but found ' + (typeof options.quality));
+            helper_1.assert(Number.isInteger(options.quality), 'Expected options.quality to be an integer');
+            helper_1.assert(options.quality >= 0 && options.quality <= 100, 'Expected options.quality to be between 0 and 100 (inclusive), got ' + options.quality);
+        }
+        helper_1.assert(!options.clip || !options.fullPage, 'options.clip and options.fullPage are exclusive');
+        if (options.clip) {
+            helper_1.assert(typeof options.clip.x === 'number', 'Expected options.clip.x to be a number but found ' + (typeof options.clip.x));
+            helper_1.assert(typeof options.clip.y === 'number', 'Expected options.clip.y to be a number but found ' + (typeof options.clip.y));
+            helper_1.assert(typeof options.clip.width === 'number', 'Expected options.clip.width to be a number but found ' + (typeof options.clip.width));
+            helper_1.assert(typeof options.clip.height === 'number', 'Expected options.clip.height to be a number but found ' + (typeof options.clip.height));
+            helper_1.assert(options.clip.width !== 0, 'Expected options.clip.width not to be 0.');
+            helper_1.assert(options.clip.height !== 0, 'Expected options.clip.height not to be 0.');
+        }
+        return this._screenshotTaskQueue.postTask(this._screenshotTask.bind(this, screenshotType, options));
+    }
+    async _screenshotTask(format, options) {
+        await this._client.send('Target.activateTarget', { targetId: this._target._targetId });
+        let clip = options.clip ? processClip(options.clip) : undefined;
+        if (options.fullPage) {
+            const metrics = await this._client.send('Page.getLayoutMetrics');
+            const width = Math.ceil(metrics.contentSize.width);
+            const height = Math.ceil(metrics.contentSize.height);
+            // Overwrite clip for full page at all times.
+            clip = { x: 0, y: 0, width, height, scale: 1 };
+            const { isMobile = false, deviceScaleFactor = 1, isLandscape = false } = this._viewport || {};
+            const screenOrientation = isLandscape ? { angle: 90, type: 'landscapePrimary' } : { angle: 0, type: 'portraitPrimary' };
+            await this._client.send('Emulation.setDeviceMetricsOverride', { mobile: isMobile, width, height, deviceScaleFactor, screenOrientation });
+        }
+        const shouldSetDefaultBackground = options.omitBackground && format === 'png';
+        if (shouldSetDefaultBackground)
+            await this._client.send('Emulation.setDefaultBackgroundColorOverride', { color: { r: 0, g: 0, b: 0, a: 0 } });
+        const result = await this._client.send('Page.captureScreenshot', { format, quality: options.quality, clip });
+        if (shouldSetDefaultBackground)
+            await this._client.send('Emulation.setDefaultBackgroundColorOverride');
+        if (options.fullPage && this._viewport)
+            await this.setViewport(this._viewport);
+        const buffer = options.encoding === 'base64' ? result.data : Buffer.from(result.data, 'base64');
+        if (options.path)
+            await writeFileAsync(options.path, buffer);
+        return buffer;
+        function processClip(clip) {
+            const x = Math.round(clip.x);
+            const y = Math.round(clip.y);
+            const width = Math.round(clip.width + clip.x - x);
+            const height = Math.round(clip.height + clip.y - y);
+            return { x, y, width, height, scale: 1 };
+        }
+    }
+    async pdf(options = {}) {
+        const { scale = 1, displayHeaderFooter = false, headerTemplate = '', footerTemplate = '', printBackground = false, landscape = false, pageRanges = '', preferCSSPageSize = false, margin = {}, path = null } = options;
+        let paperWidth = 8.5;
+        let paperHeight = 11;
+        if (options.format) {
+            const format = paperFormats[options.format.toLowerCase()];
+            helper_1.assert(format, 'Unknown paper format: ' + options.format);
+            paperWidth = format.width;
+            paperHeight = format.height;
+        }
+        else {
+            paperWidth = convertPrintParameterToInches(options.width) || paperWidth;
+            paperHeight = convertPrintParameterToInches(options.height) || paperHeight;
+        }
+        const marginTop = convertPrintParameterToInches(margin.top) || 0;
+        const marginLeft = convertPrintParameterToInches(margin.left) || 0;
+        const marginBottom = convertPrintParameterToInches(margin.bottom) || 0;
+        const marginRight = convertPrintParameterToInches(margin.right) || 0;
+        const result = await this._client.send('Page.printToPDF', {
+            transferMode: 'ReturnAsStream',
+            landscape,
+            displayHeaderFooter,
+            headerTemplate,
+            footerTemplate,
+            printBackground,
+            scale,
+            paperWidth,
+            paperHeight,
+            marginTop,
+            marginBottom,
+            marginLeft,
+            marginRight,
+            pageRanges,
+            preferCSSPageSize
+        });
+        return await helper_1.helper.readProtocolStream(this._client, result.stream, path);
+    }
+    async title() {
+        return this.mainFrame().title();
+    }
+    async close(options = { runBeforeUnload: undefined }) {
+        helper_1.assert(!!this._client._connection, 'Protocol error: Connection closed. Most likely the page has been closed.');
+        const runBeforeUnload = !!options.runBeforeUnload;
+        if (runBeforeUnload) {
+            await this._client.send('Page.close');
+        }
+        else {
+            await this._client._connection.send('Target.closeTarget', { targetId: this._target._targetId });
+            await this._target._isClosedPromise;
+        }
+    }
+    isClosed() {
+        return this._closed;
+    }
+    get mouse() {
+        return this._mouse;
+    }
+    click(selector, options = {}) {
+        return this.mainFrame().click(selector, options);
+    }
+    focus(selector) {
+        return this.mainFrame().focus(selector);
+    }
+    hover(selector) {
+        return this.mainFrame().hover(selector);
+    }
+    select(selector, ...values) {
+        return this.mainFrame().select(selector, ...values);
+    }
+    tap(selector) {
+        return this.mainFrame().tap(selector);
+    }
+    type(selector, text, options) {
+        return this.mainFrame().type(selector, text, options);
+    }
+    waitFor(selectorOrFunctionOrTimeout, options = {}, ...args) {
+        return this.mainFrame().waitFor(selectorOrFunctionOrTimeout, options, ...args);
+    }
+    waitForSelector(selector, options = {}) {
+        return this.mainFrame().waitForSelector(selector, options);
+    }
+    waitForXPath(xpath, options = {}) {
+        return this.mainFrame().waitForXPath(xpath, options);
+    }
+    waitForFunction(pageFunction, options = {}, ...args) {
+        return this.mainFrame().waitForFunction(pageFunction, options, ...args);
+    }
 }
-
-// Expose alias for deprecated method.
-Page.prototype.emulateMedia = Page.prototype.emulateMediaType;
-
-/**
- * @typedef {Object} PDFOptions
- * @property {number=} scale
- * @property {boolean=} displayHeaderFooter
- * @property {string=} headerTemplate
- * @property {string=} footerTemplate
- * @property {boolean=} printBackground
- * @property {boolean=} landscape
- * @property {string=} pageRanges
- * @property {string=} format
- * @property {string|number=} width
- * @property {string|number=} height
- * @property {boolean=} preferCSSPageSize
- * @property {!{top?: string|number, bottom?: string|number, left?: string|number, right?: string|number}=} margin
- * @property {string=} path
- */
-
-/**
- * @typedef {Object} Metrics
- * @property {number=} Timestamp
- * @property {number=} Documents
- * @property {number=} Frames
- * @property {number=} JSEventListeners
- * @property {number=} Nodes
- * @property {number=} LayoutCount
- * @property {number=} RecalcStyleCount
- * @property {number=} LayoutDuration
- * @property {number=} RecalcStyleDuration
- * @property {number=} ScriptDuration
- * @property {number=} TaskDuration
- * @property {number=} JSHeapUsedSize
- * @property {number=} JSHeapTotalSize
- */
-
-/**
- * @typedef {Object} ScreenshotOptions
- * @property {string=} type
- * @property {string=} path
- * @property {boolean=} fullPage
- * @property {{x: number, y: number, width: number, height: number}=} clip
- * @property {number=} quality
- * @property {boolean=} omitBackground
- * @property {string=} encoding
- */
-
-/**
- * @typedef {Object} MediaFeature
- * @property {string} name
- * @property {string} value
- */
-
-/** @type {!Set<string>} */
+exports.Page = Page;
 const supportedMetrics = new Set([
-  'Timestamp',
-  'Documents',
-  'Frames',
-  'JSEventListeners',
-  'Nodes',
-  'LayoutCount',
-  'RecalcStyleCount',
-  'LayoutDuration',
-  'RecalcStyleDuration',
-  'ScriptDuration',
-  'TaskDuration',
-  'JSHeapUsedSize',
-  'JSHeapTotalSize',
+    'Timestamp',
+    'Documents',
+    'Frames',
+    'JSEventListeners',
+    'Nodes',
+    'LayoutCount',
+    'RecalcStyleCount',
+    'LayoutDuration',
+    'RecalcStyleDuration',
+    'ScriptDuration',
+    'TaskDuration',
+    'JSHeapUsedSize',
+    'JSHeapTotalSize',
 ]);
-
-/** @enum {!{width: number, height: number}} */
-Page.PaperFormats = {
-  letter: {width: 8.5, height: 11},
-  legal: {width: 8.5, height: 14},
-  tabloid: {width: 11, height: 17},
-  ledger: {width: 17, height: 11},
-  a0: {width: 33.1, height: 46.8 },
-  a1: {width: 23.4, height: 33.1 },
-  a2: {width: 16.54, height: 23.4 },
-  a3: {width: 11.7, height: 16.54 },
-  a4: {width: 8.27, height: 11.7 },
-  a5: {width: 5.83, height: 8.27 },
-  a6: {width: 4.13, height: 5.83 },
-};
-
 const unitToPixels = {
-  'px': 1,
-  'in': 96,
-  'cm': 37.8,
-  'mm': 3.78
+    'px': 1,
+    'in': 96,
+    'cm': 37.8,
+    'mm': 3.78
 };
-
-/**
- * @param {(string|number|undefined)} parameter
- * @return {(number|undefined)}
- */
 function convertPrintParameterToInches(parameter) {
-  if (typeof parameter === 'undefined')
-    return undefined;
-  let pixels;
-  if (helper.isNumber(parameter)) {
-    // Treat numbers as pixel values to be aligned with phantom's paperSize.
-    pixels = /** @type {number} */ (parameter);
-  } else if (helper.isString(parameter)) {
-    const text = /** @type {string} */ (parameter);
-    let unit = text.substring(text.length - 2).toLowerCase();
-    let valueText = '';
-    if (unitToPixels.hasOwnProperty(unit)) {
-      valueText = text.substring(0, text.length - 2);
-    } else {
-      // In case of unknown unit try to parse the whole parameter as number of pixels.
-      // This is consistent with phantom's paperSize behavior.
-      unit = 'px';
-      valueText = text;
+    if (typeof parameter === 'undefined')
+        return undefined;
+    let pixels;
+    if (helper_1.helper.isNumber(parameter)) {
+        // Treat numbers as pixel values to be aligned with phantom's paperSize.
+        pixels = /** @type {number} */ (parameter);
     }
-    const value = Number(valueText);
-    assert(!isNaN(value), 'Failed to parse parameter value: ' + text);
-    pixels = value * unitToPixels[unit];
-  } else {
-    throw new Error('page.pdf() Cannot handle parameter type: ' + (typeof parameter));
-  }
-  return pixels / 96;
+    else if (helper_1.helper.isString(parameter)) {
+        const text = /** @type {string} */ (parameter);
+        let unit = text.substring(text.length - 2).toLowerCase();
+        let valueText = '';
+        if (unitToPixels.hasOwnProperty(unit)) {
+            valueText = text.substring(0, text.length - 2);
+        }
+        else {
+            // In case of unknown unit try to parse the whole parameter as number of pixels.
+            // This is consistent with phantom's paperSize behavior.
+            unit = 'px';
+            valueText = text;
+        }
+        const value = Number(valueText);
+        helper_1.assert(!isNaN(value), 'Failed to parse parameter value: ' + text);
+        pixels = value * unitToPixels[unit];
+    }
+    else {
+        throw new Error('page.pdf() Cannot handle parameter type: ' + (typeof parameter));
+    }
+    return pixels / 96;
 }
-
-/**
- * @typedef {Object} Network.Cookie
- * @property {string} name
- * @property {string} value
- * @property {string} domain
- * @property {string} path
- * @property {number} expires
- * @property {number} size
- * @property {boolean} httpOnly
- * @property {boolean} secure
- * @property {boolean} session
- * @property {("Strict"|"Lax"|"Extended"|"None")=} sameSite
- */
-
-
-/**
- * @typedef {Object} Network.CookieParam
- * @property {string} name
- * @property {string} value
- * @property {string=} url
- * @property {string=} domain
- * @property {string=} path
- * @property {number=} expires
- * @property {boolean=} httpOnly
- * @property {boolean=} secure
- * @property {("Strict"|"Lax")=} sameSite
- */
-
-/**
- * @typedef {Object} ConsoleMessage.Location
- * @property {string=} url
- * @property {number=} lineNumber
- * @property {number=} columnNumber
- */
-
 class ConsoleMessage {
-  /**
-   * @param {string} type
-   * @param {string} text
-   * @param {!Array<!Puppeteer.JSHandle>} args
-   * @param {ConsoleMessage.Location} location
-   */
-  constructor(type, text, args, location = {}) {
-    this._type = type;
-    this._text = text;
-    this._args = args;
-    this._location = location;
-  }
-
-  /**
-   * @return {string}
-   */
-  type() {
-    return this._type;
-  }
-
-  /**
-   * @return {string}
-   */
-  text() {
-    return this._text;
-  }
-
-  /**
-   * @return {!Array<!Puppeteer.JSHandle>}
-   */
-  args() {
-    return this._args;
-  }
-
-  /**
-   * @return {Object}
-   */
-  location() {
-    return this._location;
-  }
+    constructor(type, text, args, location = {}) {
+        this._type = type;
+        this._text = text;
+        this._args = args;
+        this._location = location;
+    }
+    type() {
+        return this._type;
+    }
+    text() {
+        return this._text;
+    }
+    args() {
+        return this._args;
+    }
+    location() {
+        return this._location;
+    }
 }
-
+exports.ConsoleMessage = ConsoleMessage;
 class FileChooser {
-  /**
-   * @param {Puppeteer.CDPSession} client
-   * @param {!Protocol.Page.fileChooserOpenedPayload} event
-   */
-  constructor(client, event) {
-    this._client = client;
-    this._multiple = event.mode !== 'selectSingle';
-    this._handled = false;
-  }
-
-  /**
-   * @return {boolean}
-   */
-  isMultiple() {
-    return this._multiple;
-  }
-
-  /**
-   * @param {!Array<string>} filePaths
-   * @return {!Promise}
-   */
-  async accept(filePaths) {
-    assert(!this._handled, 'Cannot accept FileChooser which is already handled!');
-    this._handled = true;
-    const files = filePaths.map(filePath => path.resolve(filePath));
-    await this._client.send('Page.handleFileChooser', {
-      action: 'accept',
-      files,
-    });
-  }
-
-  /**
-   * @return {!Promise}
-   */
-  async cancel() {
-    assert(!this._handled, 'Cannot cancel FileChooser which is already handled!');
-    this._handled = true;
-    await this._client.send('Page.handleFileChooser', {
-      action: 'cancel',
-    });
-  }
+    constructor(client, element, event) {
+        this._handled = false;
+        this._client = client;
+        this._element = element;
+        this._multiple = event.mode !== 'selectSingle';
+    }
+    isMultiple() {
+        return this._multiple;
+    }
+    async accept(filePaths) {
+        helper_1.assert(!this._handled, 'Cannot accept FileChooser which is already handled!');
+        this._handled = true;
+        await this._element.uploadFile(...filePaths);
+    }
+    async cancel() {
+        helper_1.assert(!this._handled, 'Cannot cancel FileChooser which is already handled!');
+        this._handled = true;
+    }
 }
-
-module.exports = {Page, ConsoleMessage, FileChooser};
+exports.FileChooser = FileChooser;
diff --git a/node_modules/puppeteer/lib/PipeTransport.js b/node_modules/puppeteer/lib/PipeTransport.js
index fb87a97..4bea558 100644
--- a/node_modules/puppeteer/lib/PipeTransport.js
+++ b/node_modules/puppeteer/lib/PipeTransport.js
@@ -1,3 +1,5 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
 /**
  * Copyright 2018 Google Inc. All rights reserved.
  *
@@ -13,68 +15,49 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-const {helper, debugError} = require('./helper');
-
-/**
- * @implements {!Puppeteer.ConnectionTransport}
- */
+const helper_1 = require("./helper");
 class PipeTransport {
-  /**
-   * @param {!NodeJS.WritableStream} pipeWrite
-   * @param {!NodeJS.ReadableStream} pipeRead
-   */
-  constructor(pipeWrite, pipeRead) {
-    this._pipeWrite = pipeWrite;
-    this._pendingMessage = '';
-    this._eventListeners = [
-      helper.addEventListener(pipeRead, 'data', buffer => this._dispatch(buffer)),
-      helper.addEventListener(pipeRead, 'close', () => {
-        if (this.onclose)
-          this.onclose.call(null);
-      }),
-      helper.addEventListener(pipeRead, 'error', debugError),
-      helper.addEventListener(pipeWrite, 'error', debugError),
-    ];
-    this.onmessage = null;
-    this.onclose = null;
-  }
-
-  /**
-   * @param {string} message
-   */
-  send(message) {
-    this._pipeWrite.write(message);
-    this._pipeWrite.write('\0');
-  }
-
-  /**
-   * @param {!Buffer} buffer
-   */
-  _dispatch(buffer) {
-    let end = buffer.indexOf('\0');
-    if (end === -1) {
-      this._pendingMessage += buffer.toString();
-      return;
+    constructor(pipeWrite, pipeRead) {
+        this._pipeWrite = pipeWrite;
+        this._pendingMessage = '';
+        this._eventListeners = [
+            helper_1.helper.addEventListener(pipeRead, 'data', buffer => this._dispatch(buffer)),
+            helper_1.helper.addEventListener(pipeRead, 'close', () => {
+                if (this.onclose)
+                    this.onclose.call(null);
+            }),
+            helper_1.helper.addEventListener(pipeRead, 'error', helper_1.debugError),
+            helper_1.helper.addEventListener(pipeWrite, 'error', helper_1.debugError),
+        ];
+        this.onmessage = null;
+        this.onclose = null;
     }
-    const message = this._pendingMessage + buffer.toString(undefined, 0, end);
-    if (this.onmessage)
-      this.onmessage.call(null, message);
-
-    let start = end + 1;
-    end = buffer.indexOf('\0', start);
-    while (end !== -1) {
-      if (this.onmessage)
-        this.onmessage.call(null, buffer.toString(undefined, start, end));
-      start = end + 1;
-      end = buffer.indexOf('\0', start);
+    send(message) {
+        this._pipeWrite.write(message);
+        this._pipeWrite.write('\0');
     }
-    this._pendingMessage = buffer.toString(undefined, start);
-  }
-
-  close() {
-    this._pipeWrite = null;
-    helper.removeEventListeners(this._eventListeners);
-  }
+    _dispatch(buffer) {
+        let end = buffer.indexOf('\0');
+        if (end === -1) {
+            this._pendingMessage += buffer.toString();
+            return;
+        }
+        const message = this._pendingMessage + buffer.toString(undefined, 0, end);
+        if (this.onmessage)
+            this.onmessage.call(null, message);
+        let start = end + 1;
+        end = buffer.indexOf('\0', start);
+        while (end !== -1) {
+            if (this.onmessage)
+                this.onmessage.call(null, buffer.toString(undefined, start, end));
+            start = end + 1;
+            end = buffer.indexOf('\0', start);
+        }
+        this._pendingMessage = buffer.toString(undefined, start);
+    }
+    close() {
+        this._pipeWrite = null;
+        helper_1.helper.removeEventListeners(this._eventListeners);
+    }
 }
-
-module.exports = PipeTransport;
+exports.PipeTransport = PipeTransport;
diff --git a/node_modules/puppeteer/lib/Puppeteer.js b/node_modules/puppeteer/lib/Puppeteer.js
index 08c402c..bdad2a9 100644
--- a/node_modules/puppeteer/lib/Puppeteer.js
+++ b/node_modules/puppeteer/lib/Puppeteer.js
@@ -1,3 +1,5 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,73 +15,89 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-const Launcher = require('./Launcher');
-const BrowserFetcher = require('./BrowserFetcher');
-const Errors = require('./Errors');
-const DeviceDescriptors = require('./DeviceDescriptors');
-
-module.exports = class {
-  /**
-   * @param {string} projectRoot
-   * @param {string} preferredRevision
-   * @param {boolean} isPuppeteerCore
-   */
-  constructor(projectRoot, preferredRevision, isPuppeteerCore) {
-    this._projectRoot = projectRoot;
-    this._launcher = new Launcher(projectRoot, preferredRevision, isPuppeteerCore);
-  }
-
-  /**
-   * @param {!(Launcher.LaunchOptions & Launcher.ChromeArgOptions & Launcher.BrowserOptions)=} options
-   * @return {!Promise<!Puppeteer.Browser>}
-   */
-  launch(options) {
-    return this._launcher.launch(options);
-  }
-
-  /**
-   * @param {!(Launcher.BrowserOptions & {browserWSEndpoint?: string, browserURL?: string, transport?: !Puppeteer.ConnectionTransport})} options
-   * @return {!Promise<!Puppeteer.Browser>}
-   */
-  connect(options) {
-    return this._launcher.connect(options);
-  }
-
-  /**
-   * @return {string}
-   */
-  executablePath() {
-    return this._launcher.executablePath();
-  }
-
-  /**
-   * @return {Object}
-   */
-  get devices() {
-    return DeviceDescriptors;
-  }
-
-  /**
-   * @return {Object}
-   */
-  get errors() {
-    return Errors;
-  }
-
-  /**
-   * @param {!Launcher.ChromeArgOptions=} options
-   * @return {!Array<string>}
-   */
-  defaultArgs(options) {
-    return this._launcher.defaultArgs(options);
-  }
-
-  /**
-   * @param {!BrowserFetcher.Options=} options
-   * @return {!BrowserFetcher}
-   */
-  createBrowserFetcher(options) {
-    return new BrowserFetcher(this._projectRoot, options);
-  }
-};
-
+const Launcher_1 = require("./Launcher");
+const BrowserFetcher_1 = require("./BrowserFetcher");
+const Errors_1 = require("./Errors");
+const DeviceDescriptors_1 = require("./DeviceDescriptors");
+const QueryHandler = require("./QueryHandler");
+class Puppeteer {
+    constructor(projectRoot, preferredRevision, isPuppeteerCore, productName) {
+        this._changedProduct = false;
+        this._projectRoot = projectRoot;
+        this._preferredRevision = preferredRevision;
+        this._isPuppeteerCore = isPuppeteerCore;
+        // track changes to Launcher configuration via options or environment variables
+        this.__productName = productName;
+    }
+    launch(options = {}) {
+        if (options.product)
+            this._productName = options.product;
+        return this._launcher.launch(options);
+    }
+    connect(options) {
+        if (options.product)
+            this._productName = options.product;
+        return this._launcher.connect(options);
+    }
+    set _productName(name) {
+        if (this.__productName !== name)
+            this._changedProduct = true;
+        this.__productName = name;
+    }
+    get _productName() {
+        return this.__productName;
+    }
+    executablePath() {
+        return this._launcher.executablePath();
+    }
+    get _launcher() {
+        if (!this._lazyLauncher || this._lazyLauncher.product !== this._productName || this._changedProduct) {
+            // @ts-ignore
+            // eslint-disable-next-line @typescript-eslint/no-var-requires
+            const packageJson = require('../package.json');
+            switch (this._productName) {
+                case 'firefox':
+                    this._preferredRevision = packageJson.puppeteer.firefox_revision;
+                    break;
+                case 'chrome':
+                default:
+                    this._preferredRevision = packageJson.puppeteer.chromium_revision;
+            }
+            this._changedProduct = false;
+            this._lazyLauncher = Launcher_1.default(this._projectRoot, this._preferredRevision, this._isPuppeteerCore, this._productName);
+        }
+        return this._lazyLauncher;
+    }
+    get product() {
+        return this._launcher.product;
+    }
+    get devices() {
+        return DeviceDescriptors_1.devicesMap;
+    }
+    get errors() {
+        return Errors_1.puppeteerErrors;
+    }
+    defaultArgs(options) {
+        return this._launcher.defaultArgs(options);
+    }
+    createBrowserFetcher(options) {
+        return new BrowserFetcher_1.BrowserFetcher(this._projectRoot, options);
+    }
+    // eslint-disable-next-line @typescript-eslint/camelcase
+    __experimental_registerCustomQueryHandler(name, queryHandler) {
+        QueryHandler.registerCustomQueryHandler(name, queryHandler);
+    }
+    // eslint-disable-next-line @typescript-eslint/camelcase
+    __experimental_unregisterCustomQueryHandler(name) {
+        QueryHandler.unregisterCustomQueryHandler(name);
+    }
+    // eslint-disable-next-line @typescript-eslint/camelcase
+    __experimental_customQueryHandlers() {
+        return QueryHandler.customQueryHandlers();
+    }
+    // eslint-disable-next-line @typescript-eslint/camelcase
+    __experimental_clearQueryHandlers() {
+        QueryHandler.clearQueryHandlers();
+    }
+}
+exports.Puppeteer = Puppeteer;
diff --git a/node_modules/puppeteer/lib/PuppeteerViewport.js b/node_modules/puppeteer/lib/PuppeteerViewport.js
new file mode 100644
index 0000000..c8ad2e5
--- /dev/null
+++ b/node_modules/puppeteer/lib/PuppeteerViewport.js
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/node_modules/puppeteer/lib/QueryHandler.js b/node_modules/puppeteer/lib/QueryHandler.js
new file mode 100644
index 0000000..2990062
--- /dev/null
+++ b/node_modules/puppeteer/lib/QueryHandler.js
@@ -0,0 +1,65 @@
+"use strict";
+/**
+ * Copyright 2020 Google Inc. All rights reserved.
+ *
+ * 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.
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
+const _customQueryHandlers = new Map();
+function registerCustomQueryHandler(name, handler) {
+    if (_customQueryHandlers.get(name))
+        throw new Error(`A custom query handler named "${name}" already exists`);
+    const isValidName = /^[a-zA-Z]+$/.test(name);
+    if (!isValidName)
+        throw new Error(`Custom query handler names may only contain [a-zA-Z]`);
+    _customQueryHandlers.set(name, handler);
+}
+exports.registerCustomQueryHandler = registerCustomQueryHandler;
+/**
+ * @param {string} name
+ */
+function unregisterCustomQueryHandler(name) {
+    _customQueryHandlers.delete(name);
+}
+exports.unregisterCustomQueryHandler = unregisterCustomQueryHandler;
+function customQueryHandlers() {
+    return _customQueryHandlers;
+}
+exports.customQueryHandlers = customQueryHandlers;
+function clearQueryHandlers() {
+    _customQueryHandlers.clear();
+}
+exports.clearQueryHandlers = clearQueryHandlers;
+function getQueryHandlerAndSelector(selector, defaultQueryHandler) {
+    const hasCustomQueryHandler = /^[a-zA-Z]+\//.test(selector);
+    if (!hasCustomQueryHandler)
+        return { updatedSelector: selector, queryHandler: defaultQueryHandler };
+    const index = selector.indexOf('/');
+    const name = selector.slice(0, index);
+    const updatedSelector = selector.slice(index + 1);
+    const queryHandler = customQueryHandlers().get(name);
+    if (!queryHandler)
+        throw new Error(`Query set to use "${name}", but no query handler of that name was found`);
+    return {
+        updatedSelector,
+        queryHandler
+    };
+}
+exports.getQueryHandlerAndSelector = getQueryHandlerAndSelector;
+module.exports = {
+    registerCustomQueryHandler,
+    unregisterCustomQueryHandler,
+    customQueryHandlers,
+    getQueryHandlerAndSelector,
+    clearQueryHandlers
+};
diff --git a/node_modules/puppeteer/lib/Target.js b/node_modules/puppeteer/lib/Target.js
index f8bbe6f..bae9349 100644
--- a/node_modules/puppeteer/lib/Target.js
+++ b/node_modules/puppeteer/lib/Target.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2019 Google Inc. All rights reserved.
  *
@@ -13,136 +14,89 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-const {Events} = require('./Events');
-const {Page} = require('./Page');
-const {Worker} = require('./Worker');
-
+Object.defineProperty(exports, "__esModule", { value: true });
+const Events_1 = require("./Events");
+const Page_1 = require("./Page");
+const Worker_1 = require("./Worker");
 class Target {
-  /**
-   * @param {!Protocol.Target.TargetInfo} targetInfo
-   * @param {!Puppeteer.BrowserContext} browserContext
-   * @param {!function():!Promise<!Puppeteer.CDPSession>} sessionFactory
-   * @param {boolean} ignoreHTTPSErrors
-   * @param {?Puppeteer.Viewport} defaultViewport
-   * @param {!Puppeteer.TaskQueue} screenshotTaskQueue
-   */
-  constructor(targetInfo, browserContext, sessionFactory, ignoreHTTPSErrors, defaultViewport, screenshotTaskQueue) {
-    this._targetInfo = targetInfo;
-    this._browserContext = browserContext;
-    this._targetId = targetInfo.targetId;
-    this._sessionFactory = sessionFactory;
-    this._ignoreHTTPSErrors = ignoreHTTPSErrors;
-    this._defaultViewport = defaultViewport;
-    this._screenshotTaskQueue = screenshotTaskQueue;
-    /** @type {?Promise<!Puppeteer.Page>} */
-    this._pagePromise = null;
-    /** @type {?Promise<!Worker>} */
-    this._workerPromise = null;
-    this._initializedPromise = new Promise(fulfill => this._initializedCallback = fulfill).then(async success => {
-      if (!success)
-        return false;
-      const opener = this.opener();
-      if (!opener || !opener._pagePromise || this.type() !== 'page')
-        return true;
-      const openerPage = await opener._pagePromise;
-      if (!openerPage.listenerCount(Events.Page.Popup))
-        return true;
-      const popupPage = await this.page();
-      openerPage.emit(Events.Page.Popup, popupPage);
-      return true;
-    });
-    this._isClosedPromise = new Promise(fulfill => this._closedCallback = fulfill);
-    this._isInitialized = this._targetInfo.type !== 'page' || this._targetInfo.url !== '';
-    if (this._isInitialized)
-      this._initializedCallback(true);
-  }
-
-  /**
-   * @return {!Promise<!Puppeteer.CDPSession>}
-   */
-  createCDPSession() {
-    return this._sessionFactory();
-  }
-
-  /**
-   * @return {!Promise<?Page>}
-   */
-  async page() {
-    if ((this._targetInfo.type === 'page' || this._targetInfo.type === 'background_page') && !this._pagePromise) {
-      this._pagePromise = this._sessionFactory()
-          .then(client => Page.create(client, this, this._ignoreHTTPSErrors, this._defaultViewport, this._screenshotTaskQueue));
+    constructor(targetInfo, browserContext, sessionFactory, ignoreHTTPSErrors, defaultViewport, screenshotTaskQueue) {
+        this._targetInfo = targetInfo;
+        this._browserContext = browserContext;
+        this._targetId = targetInfo.targetId;
+        this._sessionFactory = sessionFactory;
+        this._ignoreHTTPSErrors = ignoreHTTPSErrors;
+        this._defaultViewport = defaultViewport;
+        this._screenshotTaskQueue = screenshotTaskQueue;
+        /** @type {?Promise<!Puppeteer.Page>} */
+        this._pagePromise = null;
+        /** @type {?Promise<!PuppeteerWorker>} */
+        this._workerPromise = null;
+        this._initializedPromise = new Promise(fulfill => this._initializedCallback = fulfill).then(async (success) => {
+            if (!success)
+                return false;
+            const opener = this.opener();
+            if (!opener || !opener._pagePromise || this.type() !== 'page')
+                return true;
+            const openerPage = await opener._pagePromise;
+            if (!openerPage.listenerCount(Events_1.Events.Page.Popup))
+                return true;
+            const popupPage = await this.page();
+            openerPage.emit(Events_1.Events.Page.Popup, popupPage);
+            return true;
+        });
+        this._isClosedPromise = new Promise(fulfill => this._closedCallback = fulfill);
+        this._isInitialized = this._targetInfo.type !== 'page' || this._targetInfo.url !== '';
+        if (this._isInitialized)
+            this._initializedCallback(true);
     }
-    return this._pagePromise;
-  }
-
-  /**
-   * @return {!Promise<?Worker>}
-   */
-  async worker() {
-    if (this._targetInfo.type !== 'service_worker' && this._targetInfo.type !== 'shared_worker')
-      return null;
-    if (!this._workerPromise) {
-      // TODO(einbinder): Make workers send their console logs.
-      this._workerPromise = this._sessionFactory()
-          .then(client => new Worker(client, this._targetInfo.url, () => {} /* consoleAPICalled */, () => {} /* exceptionThrown */));
+    createCDPSession() {
+        return this._sessionFactory();
     }
-    return this._workerPromise;
-  }
-
-  /**
-   * @return {string}
-   */
-  url() {
-    return this._targetInfo.url;
-  }
-
-  /**
-   * @return {"page"|"background_page"|"service_worker"|"shared_worker"|"other"|"browser"}
-   */
-  type() {
-    const type = this._targetInfo.type;
-    if (type === 'page' || type === 'background_page' || type === 'service_worker' || type === 'shared_worker' || type === 'browser')
-      return type;
-    return 'other';
-  }
-
-  /**
-   * @return {!Puppeteer.Browser}
-   */
-  browser() {
-    return this._browserContext.browser();
-  }
-
-  /**
-   * @return {!Puppeteer.BrowserContext}
-   */
-  browserContext() {
-    return this._browserContext;
-  }
-
-  /**
-   * @return {?Puppeteer.Target}
-   */
-  opener() {
-    const { openerId } = this._targetInfo;
-    if (!openerId)
-      return null;
-    return this.browser()._targets.get(openerId);
-  }
-
-  /**
-   * @param {!Protocol.Target.TargetInfo} targetInfo
-   */
-  _targetInfoChanged(targetInfo) {
-    this._targetInfo = targetInfo;
-
-    if (!this._isInitialized && (this._targetInfo.type !== 'page' || this._targetInfo.url !== '')) {
-      this._isInitialized = true;
-      this._initializedCallback(true);
-      return;
+    async page() {
+        if ((this._targetInfo.type === 'page' || this._targetInfo.type === 'background_page') && !this._pagePromise) {
+            this._pagePromise = this._sessionFactory()
+                .then(client => Page_1.Page.create(client, this, this._ignoreHTTPSErrors, this._defaultViewport, this._screenshotTaskQueue));
+        }
+        return this._pagePromise;
     }
-  }
+    async worker() {
+        if (this._targetInfo.type !== 'service_worker' && this._targetInfo.type !== 'shared_worker')
+            return null;
+        if (!this._workerPromise) {
+            // TODO(einbinder): Make workers send their console logs.
+            this._workerPromise = this._sessionFactory()
+                .then(client => new Worker_1.Worker(client, this._targetInfo.url, () => { } /* consoleAPICalled */, () => { } /* exceptionThrown */));
+        }
+        return this._workerPromise;
+    }
+    url() {
+        return this._targetInfo.url;
+    }
+    type() {
+        const type = this._targetInfo.type;
+        if (type === 'page' || type === 'background_page' || type === 'service_worker' || type === 'shared_worker' || type === 'browser')
+            return type;
+        return 'other';
+    }
+    browser() {
+        return this._browserContext.browser();
+    }
+    browserContext() {
+        return this._browserContext;
+    }
+    opener() {
+        const { openerId } = this._targetInfo;
+        if (!openerId)
+            return null;
+        return this.browser()._targets.get(openerId);
+    }
+    _targetInfoChanged(targetInfo) {
+        this._targetInfo = targetInfo;
+        if (!this._isInitialized && (this._targetInfo.type !== 'page' || this._targetInfo.url !== '')) {
+            this._isInitialized = true;
+            this._initializedCallback(true);
+            return;
+        }
+    }
 }
-
-module.exports = {Target};
+exports.Target = Target;
diff --git a/node_modules/puppeteer/lib/TaskQueue.js b/node_modules/puppeteer/lib/TaskQueue.js
index 8cfb7a7..a0b62e6 100644
--- a/node_modules/puppeteer/lib/TaskQueue.js
+++ b/node_modules/puppeteer/lib/TaskQueue.js
@@ -1,17 +1,33 @@
+"use strict";
+/**
+ * Copyright 2020 Google Inc. All rights reserved.
+ *
+ * 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.
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
+/* TODO(jacktfranklin@): once we are calling this from TS files we can
+ * avoid the horrible void | any type and instead make use of generics
+ * to make this into TaskQueue<T> and let the caller tell us what types
+ * the promise in the queue should return.
+ */
 class TaskQueue {
-  constructor() {
-    this._chain = Promise.resolve();
-  }
-
-  /**
-   * @param {Function} task
-   * @return {!Promise}
-   */
-  postTask(task) {
-    const result = this._chain.then(task);
-    this._chain = result.catch(() => {});
-    return result;
-  }
+    constructor() {
+        this._chain = Promise.resolve();
+    }
+    postTask(task) {
+        const result = this._chain.then(task);
+        this._chain = result.catch(() => { });
+        return result;
+    }
 }
-
-module.exports = {TaskQueue};
\ No newline at end of file
+exports.TaskQueue = TaskQueue;
diff --git a/node_modules/puppeteer/lib/TimeoutSettings.js b/node_modules/puppeteer/lib/TimeoutSettings.js
index c6b08d3..12a79d3 100644
--- a/node_modules/puppeteer/lib/TimeoutSettings.js
+++ b/node_modules/puppeteer/lib/TimeoutSettings.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2019 Google Inc. All rights reserved.
  *
@@ -13,45 +14,33 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
+Object.defineProperty(exports, "__esModule", { value: true });
 const DEFAULT_TIMEOUT = 30000;
-
 class TimeoutSettings {
-  constructor() {
-    this._defaultTimeout = null;
-    this._defaultNavigationTimeout = null;
-  }
-
-  /**
-   * @param {number} timeout
-   */
-  setDefaultTimeout(timeout) {
-    this._defaultTimeout = timeout;
-  }
-
-  /**
-   * @param {number} timeout
-   */
-  setDefaultNavigationTimeout(timeout) {
-    this._defaultNavigationTimeout = timeout;
-  }
-
-  /**
-   * @return {number}
-   */
-  navigationTimeout() {
-    if (this._defaultNavigationTimeout !== null)
-      return this._defaultNavigationTimeout;
-    if (this._defaultTimeout !== null)
-      return this._defaultTimeout;
-    return DEFAULT_TIMEOUT;
-  }
-
-  timeout() {
-    if (this._defaultTimeout !== null)
-      return this._defaultTimeout;
-    return DEFAULT_TIMEOUT;
-  }
+    constructor() {
+        this._defaultTimeout = null;
+        this._defaultNavigationTimeout = null;
+    }
+    setDefaultTimeout(timeout) {
+        this._defaultTimeout = timeout;
+    }
+    /**
+     * @param {number} timeout
+     */
+    setDefaultNavigationTimeout(timeout) {
+        this._defaultNavigationTimeout = timeout;
+    }
+    navigationTimeout() {
+        if (this._defaultNavigationTimeout !== null)
+            return this._defaultNavigationTimeout;
+        if (this._defaultTimeout !== null)
+            return this._defaultTimeout;
+        return DEFAULT_TIMEOUT;
+    }
+    timeout() {
+        if (this._defaultTimeout !== null)
+            return this._defaultTimeout;
+        return DEFAULT_TIMEOUT;
+    }
 }
-
-module.exports = {TimeoutSettings};
+exports.TimeoutSettings = TimeoutSettings;
diff --git a/node_modules/puppeteer/lib/Tracing.js b/node_modules/puppeteer/lib/Tracing.js
index fa2276e..68e9cd5 100644
--- a/node_modules/puppeteer/lib/Tracing.js
+++ b/node_modules/puppeteer/lib/Tracing.js
@@ -1,3 +1,5 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,60 +15,40 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-const {helper, assert} = require('./helper');
-
+const helper_1 = require("./helper");
 class Tracing {
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   */
-  constructor(client) {
-    this._client = client;
-    this._recording = false;
-    this._path = '';
-  }
-
-  /**
-   * @param {!{path?: string, screenshots?: boolean, categories?: !Array<string>}} options
-   */
-  async start(options = {}) {
-    assert(!this._recording, 'Cannot start recording trace while already recording trace.');
-
-    const defaultCategories = [
-      '-*', 'devtools.timeline', 'v8.execute', 'disabled-by-default-devtools.timeline',
-      'disabled-by-default-devtools.timeline.frame', 'toplevel',
-      'blink.console', 'blink.user_timing', 'latencyInfo', 'disabled-by-default-devtools.timeline.stack',
-      'disabled-by-default-v8.cpu_profiler', 'disabled-by-default-v8.cpu_profiler.hires'
-    ];
-    const {
-      path = null,
-      screenshots = false,
-      categories = defaultCategories,
-    } = options;
-
-    if (screenshots)
-      categories.push('disabled-by-default-devtools.screenshot');
-
-    this._path = path;
-    this._recording = true;
-    await this._client.send('Tracing.start', {
-      transferMode: 'ReturnAsStream',
-      categories: categories.join(',')
-    });
-  }
-
-  /**
-   * @return {!Promise<!Buffer>}
-   */
-  async stop() {
-    let fulfill;
-    const contentPromise = new Promise(x => fulfill = x);
-    this._client.once('Tracing.tracingComplete', event => {
-      helper.readProtocolStream(this._client, event.stream, this._path).then(fulfill);
-    });
-    await this._client.send('Tracing.end');
-    this._recording = false;
-    return contentPromise;
-  }
+    constructor(client) {
+        this._recording = false;
+        this._path = '';
+        this._client = client;
+    }
+    async start(options = {}) {
+        helper_1.assert(!this._recording, 'Cannot start recording trace while already recording trace.');
+        const defaultCategories = [
+            '-*', 'devtools.timeline', 'v8.execute', 'disabled-by-default-devtools.timeline',
+            'disabled-by-default-devtools.timeline.frame', 'toplevel',
+            'blink.console', 'blink.user_timing', 'latencyInfo', 'disabled-by-default-devtools.timeline.stack',
+            'disabled-by-default-v8.cpu_profiler', 'disabled-by-default-v8.cpu_profiler.hires'
+        ];
+        const { path = null, screenshots = false, categories = defaultCategories, } = options;
+        if (screenshots)
+            categories.push('disabled-by-default-devtools.screenshot');
+        this._path = path;
+        this._recording = true;
+        await this._client.send('Tracing.start', {
+            transferMode: 'ReturnAsStream',
+            categories: categories.join(',')
+        });
+    }
+    async stop() {
+        let fulfill;
+        const contentPromise = new Promise(x => fulfill = x);
+        this._client.once('Tracing.tracingComplete', event => {
+            helper_1.helper.readProtocolStream(this._client, event.stream, this._path).then(fulfill);
+        });
+        await this._client.send('Tracing.end');
+        this._recording = false;
+        return contentPromise;
+    }
 }
-
-module.exports = Tracing;
+exports.Tracing = Tracing;
diff --git a/node_modules/puppeteer/lib/USKeyboardLayout.js b/node_modules/puppeteer/lib/USKeyboardLayout.js
index 7ac2768..cc56b2d 100644
--- a/node_modules/puppeteer/lib/USKeyboardLayout.js
+++ b/node_modules/puppeteer/lib/USKeyboardLayout.js
@@ -1,3 +1,4 @@
+"use strict";
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,276 +14,261 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-/**
- * @typedef {Object} KeyDefinition
- * @property {number=} keyCode
- * @property {number=} shiftKeyCode
- * @property {string=} key
- * @property {string=} shiftKey
- * @property {string=} code
- * @property {string=} text
- * @property {string=} shiftText
- * @property {number=} location
- */
-
-/**
- * @type {Object<string, KeyDefinition>}
- */
-module.exports = {
-  '0': {'keyCode': 48, 'key': '0', 'code': 'Digit0'},
-  '1': {'keyCode': 49, 'key': '1', 'code': 'Digit1'},
-  '2': {'keyCode': 50, 'key': '2', 'code': 'Digit2'},
-  '3': {'keyCode': 51, 'key': '3', 'code': 'Digit3'},
-  '4': {'keyCode': 52, 'key': '4', 'code': 'Digit4'},
-  '5': {'keyCode': 53, 'key': '5', 'code': 'Digit5'},
-  '6': {'keyCode': 54, 'key': '6', 'code': 'Digit6'},
-  '7': {'keyCode': 55, 'key': '7', 'code': 'Digit7'},
-  '8': {'keyCode': 56, 'key': '8', 'code': 'Digit8'},
-  '9': {'keyCode': 57, 'key': '9', 'code': 'Digit9'},
-  'Power': {'key': 'Power', 'code': 'Power'},
-  'Eject': {'key': 'Eject', 'code': 'Eject'},
-  'Abort': {'keyCode': 3, 'code': 'Abort', 'key': 'Cancel'},
-  'Help': {'keyCode': 6, 'code': 'Help', 'key': 'Help'},
-  'Backspace': {'keyCode': 8, 'code': 'Backspace', 'key': 'Backspace'},
-  'Tab': {'keyCode': 9, 'code': 'Tab', 'key': 'Tab'},
-  'Numpad5': {'keyCode': 12, 'shiftKeyCode': 101, 'key': 'Clear', 'code': 'Numpad5', 'shiftKey': '5', 'location': 3},
-  'NumpadEnter': {'keyCode': 13, 'code': 'NumpadEnter', 'key': 'Enter', 'text': '\r', 'location': 3},
-  'Enter': {'keyCode': 13, 'code': 'Enter', 'key': 'Enter', 'text': '\r'},
-  '\r': {'keyCode': 13, 'code': 'Enter', 'key': 'Enter', 'text': '\r'},
-  '\n': {'keyCode': 13, 'code': 'Enter', 'key': 'Enter', 'text': '\r'},
-  'ShiftLeft': {'keyCode': 16, 'code': 'ShiftLeft', 'key': 'Shift', 'location': 1},
-  'ShiftRight': {'keyCode': 16, 'code': 'ShiftRight', 'key': 'Shift', 'location': 2},
-  'ControlLeft': {'keyCode': 17, 'code': 'ControlLeft', 'key': 'Control', 'location': 1},
-  'ControlRight': {'keyCode': 17, 'code': 'ControlRight', 'key': 'Control', 'location': 2},
-  'AltLeft': {'keyCode': 18, 'code': 'AltLeft', 'key': 'Alt', 'location': 1},
-  'AltRight': {'keyCode': 18, 'code': 'AltRight', 'key': 'Alt', 'location': 2},
-  'Pause': {'keyCode': 19, 'code': 'Pause', 'key': 'Pause'},
-  'CapsLock': {'keyCode': 20, 'code': 'CapsLock', 'key': 'CapsLock'},
-  'Escape': {'keyCode': 27, 'code': 'Escape', 'key': 'Escape'},
-  'Convert': {'keyCode': 28, 'code': 'Convert', 'key': 'Convert'},
-  'NonConvert': {'keyCode': 29, 'code': 'NonConvert', 'key': 'NonConvert'},
-  'Space': {'keyCode': 32, 'code': 'Space', 'key': ' '},
-  'Numpad9': {'keyCode': 33, 'shiftKeyCode': 105, 'key': 'PageUp', 'code': 'Numpad9', 'shiftKey': '9', 'location': 3},
-  'PageUp': {'keyCode': 33, 'code': 'PageUp', 'key': 'PageUp'},
-  'Numpad3': {'keyCode': 34, 'shiftKeyCode': 99, 'key': 'PageDown', 'code': 'Numpad3', 'shiftKey': '3', 'location': 3},
-  'PageDown': {'keyCode': 34, 'code': 'PageDown', 'key': 'PageDown'},
-  'End': {'keyCode': 35, 'code': 'End', 'key': 'End'},
-  'Numpad1': {'keyCode': 35, 'shiftKeyCode': 97, 'key': 'End', 'code': 'Numpad1', 'shiftKey': '1', 'location': 3},
-  'Home': {'keyCode': 36, 'code': 'Home', 'key': 'Home'},
-  'Numpad7': {'keyCode': 36, 'shiftKeyCode': 103, 'key': 'Home', 'code': 'Numpad7', 'shiftKey': '7', 'location': 3},
-  'ArrowLeft': {'keyCode': 37, 'code': 'ArrowLeft', 'key': 'ArrowLeft'},
-  'Numpad4': {'keyCode': 37, 'shiftKeyCode': 100, 'key': 'ArrowLeft', 'code': 'Numpad4', 'shiftKey': '4', 'location': 3},
-  'Numpad8': {'keyCode': 38, 'shiftKeyCode': 104, 'key': 'ArrowUp', 'code': 'Numpad8', 'shiftKey': '8', 'location': 3},
-  'ArrowUp': {'keyCode': 38, 'code': 'ArrowUp', 'key': 'ArrowUp'},
-  'ArrowRight': {'keyCode': 39, 'code': 'ArrowRight', 'key': 'ArrowRight'},
-  'Numpad6': {'keyCode': 39, 'shiftKeyCode': 102, 'key': 'ArrowRight', 'code': 'Numpad6', 'shiftKey': '6', 'location': 3},
-  'Numpad2': {'keyCode': 40, 'shiftKeyCode': 98, 'key': 'ArrowDown', 'code': 'Numpad2', 'shiftKey': '2', 'location': 3},
-  'ArrowDown': {'keyCode': 40, 'code': 'ArrowDown', 'key': 'ArrowDown'},
-  'Select': {'keyCode': 41, 'code': 'Select', 'key': 'Select'},
-  'Open': {'keyCode': 43, 'code': 'Open', 'key': 'Execute'},
-  'PrintScreen': {'keyCode': 44, 'code': 'PrintScreen', 'key': 'PrintScreen'},
-  'Insert': {'keyCode': 45, 'code': 'Insert', 'key': 'Insert'},
-  'Numpad0': {'keyCode': 45, 'shiftKeyCode': 96, 'key': 'Insert', 'code': 'Numpad0', 'shiftKey': '0', 'location': 3},
-  'Delete': {'keyCode': 46, 'code': 'Delete', 'key': 'Delete'},
-  'NumpadDecimal': {'keyCode': 46, 'shiftKeyCode': 110, 'code': 'NumpadDecimal', 'key': '\u0000', 'shiftKey': '.', 'location': 3},
-  'Digit0': {'keyCode': 48, 'code': 'Digit0', 'shiftKey': ')', 'key': '0'},
-  'Digit1': {'keyCode': 49, 'code': 'Digit1', 'shiftKey': '!', 'key': '1'},
-  'Digit2': {'keyCode': 50, 'code': 'Digit2', 'shiftKey': '@', 'key': '2'},
-  'Digit3': {'keyCode': 51, 'code': 'Digit3', 'shiftKey': '#', 'key': '3'},
-  'Digit4': {'keyCode': 52, 'code': 'Digit4', 'shiftKey': '$', 'key': '4'},
-  'Digit5': {'keyCode': 53, 'code': 'Digit5', 'shiftKey': '%', 'key': '5'},
-  'Digit6': {'keyCode': 54, 'code': 'Digit6', 'shiftKey': '^', 'key': '6'},
-  'Digit7': {'keyCode': 55, 'code': 'Digit7', 'shiftKey': '&', 'key': '7'},
-  'Digit8': {'keyCode': 56, 'code': 'Digit8', 'shiftKey': '*', 'key': '8'},
-  'Digit9': {'keyCode': 57, 'code': 'Digit9', 'shiftKey': '\(', 'key': '9'},
-  'KeyA': {'keyCode': 65, 'code': 'KeyA', 'shiftKey': 'A', 'key': 'a'},
-  'KeyB': {'keyCode': 66, 'code': 'KeyB', 'shiftKey': 'B', 'key': 'b'},
-  'KeyC': {'keyCode': 67, 'code': 'KeyC', 'shiftKey': 'C', 'key': 'c'},
-  'KeyD': {'keyCode': 68, 'code': 'KeyD', 'shiftKey': 'D', 'key': 'd'},
-  'KeyE': {'keyCode': 69, 'code': 'KeyE', 'shiftKey': 'E', 'key': 'e'},
-  'KeyF': {'keyCode': 70, 'code': 'KeyF', 'shiftKey': 'F', 'key': 'f'},
-  'KeyG': {'keyCode': 71, 'code': 'KeyG', 'shiftKey': 'G', 'key': 'g'},
-  'KeyH': {'keyCode': 72, 'code': 'KeyH', 'shiftKey': 'H', 'key': 'h'},
-  'KeyI': {'keyCode': 73, 'code': 'KeyI', 'shiftKey': 'I', 'key': 'i'},
-  'KeyJ': {'keyCode': 74, 'code': 'KeyJ', 'shiftKey': 'J', 'key': 'j'},
-  'KeyK': {'keyCode': 75, 'code': 'KeyK', 'shiftKey': 'K', 'key': 'k'},
-  'KeyL': {'keyCode': 76, 'code': 'KeyL', 'shiftKey': 'L', 'key': 'l'},
-  'KeyM': {'keyCode': 77, 'code': 'KeyM', 'shiftKey': 'M', 'key': 'm'},
-  'KeyN': {'keyCode': 78, 'code': 'KeyN', 'shiftKey': 'N', 'key': 'n'},
-  'KeyO': {'keyCode': 79, 'code': 'KeyO', 'shiftKey': 'O', 'key': 'o'},
-  'KeyP': {'keyCode': 80, 'code': 'KeyP', 'shiftKey': 'P', 'key': 'p'},
-  'KeyQ': {'keyCode': 81, 'code': 'KeyQ', 'shiftKey': 'Q', 'key': 'q'},
-  'KeyR': {'keyCode': 82, 'code': 'KeyR', 'shiftKey': 'R', 'key': 'r'},
-  'KeyS': {'keyCode': 83, 'code': 'KeyS', 'shiftKey': 'S', 'key': 's'},
-  'KeyT': {'keyCode': 84, 'code': 'KeyT', 'shiftKey': 'T', 'key': 't'},
-  'KeyU': {'keyCode': 85, 'code': 'KeyU', 'shiftKey': 'U', 'key': 'u'},
-  'KeyV': {'keyCode': 86, 'code': 'KeyV', 'shiftKey': 'V', 'key': 'v'},
-  'KeyW': {'keyCode': 87, 'code': 'KeyW', 'shiftKey': 'W', 'key': 'w'},
-  'KeyX': {'keyCode': 88, 'code': 'KeyX', 'shiftKey': 'X', 'key': 'x'},
-  'KeyY': {'keyCode': 89, 'code': 'KeyY', 'shiftKey': 'Y', 'key': 'y'},
-  'KeyZ': {'keyCode': 90, 'code': 'KeyZ', 'shiftKey': 'Z', 'key': 'z'},
-  'MetaLeft': {'keyCode': 91, 'code': 'MetaLeft', 'key': 'Meta', 'location': 1},
-  'MetaRight': {'keyCode': 92, 'code': 'MetaRight', 'key': 'Meta', 'location': 2},
-  'ContextMenu': {'keyCode': 93, 'code': 'ContextMenu', 'key': 'ContextMenu'},
-  'NumpadMultiply': {'keyCode': 106, 'code': 'NumpadMultiply', 'key': '*', 'location': 3},
-  'NumpadAdd': {'keyCode': 107, 'code': 'NumpadAdd', 'key': '+', 'location': 3},
-  'NumpadSubtract': {'keyCode': 109, 'code': 'NumpadSubtract', 'key': '-', 'location': 3},
-  'NumpadDivide': {'keyCode': 111, 'code': 'NumpadDivide', 'key': '/', 'location': 3},
-  'F1': {'keyCode': 112, 'code': 'F1', 'key': 'F1'},
-  'F2': {'keyCode': 113, 'code': 'F2', 'key': 'F2'},
-  'F3': {'keyCode': 114, 'code': 'F3', 'key': 'F3'},
-  'F4': {'keyCode': 115, 'code': 'F4', 'key': 'F4'},
-  'F5': {'keyCode': 116, 'code': 'F5', 'key': 'F5'},
-  'F6': {'keyCode': 117, 'code': 'F6', 'key': 'F6'},
-  'F7': {'keyCode': 118, 'code': 'F7', 'key': 'F7'},
-  'F8': {'keyCode': 119, 'code': 'F8', 'key': 'F8'},
-  'F9': {'keyCode': 120, 'code': 'F9', 'key': 'F9'},
-  'F10': {'keyCode': 121, 'code': 'F10', 'key': 'F10'},
-  'F11': {'keyCode': 122, 'code': 'F11', 'key': 'F11'},
-  'F12': {'keyCode': 123, 'code': 'F12', 'key': 'F12'},
-  'F13': {'keyCode': 124, 'code': 'F13', 'key': 'F13'},
-  'F14': {'keyCode': 125, 'code': 'F14', 'key': 'F14'},
-  'F15': {'keyCode': 126, 'code': 'F15', 'key': 'F15'},
-  'F16': {'keyCode': 127, 'code': 'F16', 'key': 'F16'},
-  'F17': {'keyCode': 128, 'code': 'F17', 'key': 'F17'},
-  'F18': {'keyCode': 129, 'code': 'F18', 'key': 'F18'},
-  'F19': {'keyCode': 130, 'code': 'F19', 'key': 'F19'},
-  'F20': {'keyCode': 131, 'code': 'F20', 'key': 'F20'},
-  'F21': {'keyCode': 132, 'code': 'F21', 'key': 'F21'},
-  'F22': {'keyCode': 133, 'code': 'F22', 'key': 'F22'},
-  'F23': {'keyCode': 134, 'code': 'F23', 'key': 'F23'},
-  'F24': {'keyCode': 135, 'code': 'F24', 'key': 'F24'},
-  'NumLock': {'keyCode': 144, 'code': 'NumLock', 'key': 'NumLock'},
-  'ScrollLock': {'keyCode': 145, 'code': 'ScrollLock', 'key': 'ScrollLock'},
-  'AudioVolumeMute': {'keyCode': 173, 'code': 'AudioVolumeMute', 'key': 'AudioVolumeMute'},
-  'AudioVolumeDown': {'keyCode': 174, 'code': 'AudioVolumeDown', 'key': 'AudioVolumeDown'},
-  'AudioVolumeUp': {'keyCode': 175, 'code': 'AudioVolumeUp', 'key': 'AudioVolumeUp'},
-  'MediaTrackNext': {'keyCode': 176, 'code': 'MediaTrackNext', 'key': 'MediaTrackNext'},
-  'MediaTrackPrevious': {'keyCode': 177, 'code': 'MediaTrackPrevious', 'key': 'MediaTrackPrevious'},
-  'MediaStop': {'keyCode': 178, 'code': 'MediaStop', 'key': 'MediaStop'},
-  'MediaPlayPause': {'keyCode': 179, 'code': 'MediaPlayPause', 'key': 'MediaPlayPause'},
-  'Semicolon': {'keyCode': 186, 'code': 'Semicolon', 'shiftKey': ':', 'key': ';'},
-  'Equal': {'keyCode': 187, 'code': 'Equal', 'shiftKey': '+', 'key': '='},
-  'NumpadEqual': {'keyCode': 187, 'code': 'NumpadEqual', 'key': '=', 'location': 3},
-  'Comma': {'keyCode': 188, 'code': 'Comma', 'shiftKey': '\<', 'key': ','},
-  'Minus': {'keyCode': 189, 'code': 'Minus', 'shiftKey': '_', 'key': '-'},
-  'Period': {'keyCode': 190, 'code': 'Period', 'shiftKey': '>', 'key': '.'},
-  'Slash': {'keyCode': 191, 'code': 'Slash', 'shiftKey': '?', 'key': '/'},
-  'Backquote': {'keyCode': 192, 'code': 'Backquote', 'shiftKey': '~', 'key': '`'},
-  'BracketLeft': {'keyCode': 219, 'code': 'BracketLeft', 'shiftKey': '{', 'key': '['},
-  'Backslash': {'keyCode': 220, 'code': 'Backslash', 'shiftKey': '|', 'key': '\\'},
-  'BracketRight': {'keyCode': 221, 'code': 'BracketRight', 'shiftKey': '}', 'key': ']'},
-  'Quote': {'keyCode': 222, 'code': 'Quote', 'shiftKey': '"', 'key': '\''},
-  'AltGraph': {'keyCode': 225, 'code': 'AltGraph', 'key': 'AltGraph'},
-  'Props': {'keyCode': 247, 'code': 'Props', 'key': 'CrSel'},
-  'Cancel': {'keyCode': 3, 'key': 'Cancel', 'code': 'Abort'},
-  'Clear': {'keyCode': 12, 'key': 'Clear', 'code': 'Numpad5', 'location': 3},
-  'Shift': {'keyCode': 16, 'key': 'Shift', 'code': 'ShiftLeft', 'location': 1},
-  'Control': {'keyCode': 17, 'key': 'Control', 'code': 'ControlLeft', 'location': 1},
-  'Alt': {'keyCode': 18, 'key': 'Alt', 'code': 'AltLeft', 'location': 1},
-  'Accept': {'keyCode': 30, 'key': 'Accept'},
-  'ModeChange': {'keyCode': 31, 'key': 'ModeChange'},
-  ' ': {'keyCode': 32, 'key': ' ', 'code': 'Space'},
-  'Print': {'keyCode': 42, 'key': 'Print'},
-  'Execute': {'keyCode': 43, 'key': 'Execute', 'code': 'Open'},
-  '\u0000': {'keyCode': 46, 'key': '\u0000', 'code': 'NumpadDecimal', 'location': 3},
-  'a': {'keyCode': 65, 'key': 'a', 'code': 'KeyA'},
-  'b': {'keyCode': 66, 'key': 'b', 'code': 'KeyB'},
-  'c': {'keyCode': 67, 'key': 'c', 'code': 'KeyC'},
-  'd': {'keyCode': 68, 'key': 'd', 'code': 'KeyD'},
-  'e': {'keyCode': 69, 'key': 'e', 'code': 'KeyE'},
-  'f': {'keyCode': 70, 'key': 'f', 'code': 'KeyF'},
-  'g': {'keyCode': 71, 'key': 'g', 'code': 'KeyG'},
-  'h': {'keyCode': 72, 'key': 'h', 'code': 'KeyH'},
-  'i': {'keyCode': 73, 'key': 'i', 'code': 'KeyI'},
-  'j': {'keyCode': 74, 'key': 'j', 'code': 'KeyJ'},
-  'k': {'keyCode': 75, 'key': 'k', 'code': 'KeyK'},
-  'l': {'keyCode': 76, 'key': 'l', 'code': 'KeyL'},
-  'm': {'keyCode': 77, 'key': 'm', 'code': 'KeyM'},
-  'n': {'keyCode': 78, 'key': 'n', 'code': 'KeyN'},
-  'o': {'keyCode': 79, 'key': 'o', 'code': 'KeyO'},
-  'p': {'keyCode': 80, 'key': 'p', 'code': 'KeyP'},
-  'q': {'keyCode': 81, 'key': 'q', 'code': 'KeyQ'},
-  'r': {'keyCode': 82, 'key': 'r', 'code': 'KeyR'},
-  's': {'keyCode': 83, 'key': 's', 'code': 'KeyS'},
-  't': {'keyCode': 84, 'key': 't', 'code': 'KeyT'},
-  'u': {'keyCode': 85, 'key': 'u', 'code': 'KeyU'},
-  'v': {'keyCode': 86, 'key': 'v', 'code': 'KeyV'},
-  'w': {'keyCode': 87, 'key': 'w', 'code': 'KeyW'},
-  'x': {'keyCode': 88, 'key': 'x', 'code': 'KeyX'},
-  'y': {'keyCode': 89, 'key': 'y', 'code': 'KeyY'},
-  'z': {'keyCode': 90, 'key': 'z', 'code': 'KeyZ'},
-  'Meta': {'keyCode': 91, 'key': 'Meta', 'code': 'MetaLeft', 'location': 1},
-  '*': {'keyCode': 106, 'key': '*', 'code': 'NumpadMultiply', 'location': 3},
-  '+': {'keyCode': 107, 'key': '+', 'code': 'NumpadAdd', 'location': 3},
-  '-': {'keyCode': 109, 'key': '-', 'code': 'NumpadSubtract', 'location': 3},
-  '/': {'keyCode': 111, 'key': '/', 'code': 'NumpadDivide', 'location': 3},
-  ';': {'keyCode': 186, 'key': ';', 'code': 'Semicolon'},
-  '=': {'keyCode': 187, 'key': '=', 'code': 'Equal'},
-  ',': {'keyCode': 188, 'key': ',', 'code': 'Comma'},
-  '.': {'keyCode': 190, 'key': '.', 'code': 'Period'},
-  '`': {'keyCode': 192, 'key': '`', 'code': 'Backquote'},
-  '[': {'keyCode': 219, 'key': '[', 'code': 'BracketLeft'},
-  '\\': {'keyCode': 220, 'key': '\\', 'code': 'Backslash'},
-  ']': {'keyCode': 221, 'key': ']', 'code': 'BracketRight'},
-  '\'': {'keyCode': 222, 'key': '\'', 'code': 'Quote'},
-  'Attn': {'keyCode': 246, 'key': 'Attn'},
-  'CrSel': {'keyCode': 247, 'key': 'CrSel', 'code': 'Props'},
-  'ExSel': {'keyCode': 248, 'key': 'ExSel'},
-  'EraseEof': {'keyCode': 249, 'key': 'EraseEof'},
-  'Play': {'keyCode': 250, 'key': 'Play'},
-  'ZoomOut': {'keyCode': 251, 'key': 'ZoomOut'},
-  ')': {'keyCode': 48, 'key': ')', 'code': 'Digit0'},
-  '!': {'keyCode': 49, 'key': '!', 'code': 'Digit1'},
-  '@': {'keyCode': 50, 'key': '@', 'code': 'Digit2'},
-  '#': {'keyCode': 51, 'key': '#', 'code': 'Digit3'},
-  '$': {'keyCode': 52, 'key': '$', 'code': 'Digit4'},
-  '%': {'keyCode': 53, 'key': '%', 'code': 'Digit5'},
-  '^': {'keyCode': 54, 'key': '^', 'code': 'Digit6'},
-  '&': {'keyCode': 55, 'key': '&', 'code': 'Digit7'},
-  '(': {'keyCode': 57, 'key': '\(', 'code': 'Digit9'},
-  'A': {'keyCode': 65, 'key': 'A', 'code': 'KeyA'},
-  'B': {'keyCode': 66, 'key': 'B', 'code': 'KeyB'},
-  'C': {'keyCode': 67, 'key': 'C', 'code': 'KeyC'},
-  'D': {'keyCode': 68, 'key': 'D', 'code': 'KeyD'},
-  'E': {'keyCode': 69, 'key': 'E', 'code': 'KeyE'},
-  'F': {'keyCode': 70, 'key': 'F', 'code': 'KeyF'},
-  'G': {'keyCode': 71, 'key': 'G', 'code': 'KeyG'},
-  'H': {'keyCode': 72, 'key': 'H', 'code': 'KeyH'},
-  'I': {'keyCode': 73, 'key': 'I', 'code': 'KeyI'},
-  'J': {'keyCode': 74, 'key': 'J', 'code': 'KeyJ'},
-  'K': {'keyCode': 75, 'key': 'K', 'code': 'KeyK'},
-  'L': {'keyCode': 76, 'key': 'L', 'code': 'KeyL'},
-  'M': {'keyCode': 77, 'key': 'M', 'code': 'KeyM'},
-  'N': {'keyCode': 78, 'key': 'N', 'code': 'KeyN'},
-  'O': {'keyCode': 79, 'key': 'O', 'code': 'KeyO'},
-  'P': {'keyCode': 80, 'key': 'P', 'code': 'KeyP'},
-  'Q': {'keyCode': 81, 'key': 'Q', 'code': 'KeyQ'},
-  'R': {'keyCode': 82, 'key': 'R', 'code': 'KeyR'},
-  'S': {'keyCode': 83, 'key': 'S', 'code': 'KeyS'},
-  'T': {'keyCode': 84, 'key': 'T', 'code': 'KeyT'},
-  'U': {'keyCode': 85, 'key': 'U', 'code': 'KeyU'},
-  'V': {'keyCode': 86, 'key': 'V', 'code': 'KeyV'},
-  'W': {'keyCode': 87, 'key': 'W', 'code': 'KeyW'},
-  'X': {'keyCode': 88, 'key': 'X', 'code': 'KeyX'},
-  'Y': {'keyCode': 89, 'key': 'Y', 'code': 'KeyY'},
-  'Z': {'keyCode': 90, 'key': 'Z', 'code': 'KeyZ'},
-  ':': {'keyCode': 186, 'key': ':', 'code': 'Semicolon'},
-  '<': {'keyCode': 188, 'key': '\<', 'code': 'Comma'},
-  '_': {'keyCode': 189, 'key': '_', 'code': 'Minus'},
-  '>': {'keyCode': 190, 'key': '>', 'code': 'Period'},
-  '?': {'keyCode': 191, 'key': '?', 'code': 'Slash'},
-  '~': {'keyCode': 192, 'key': '~', 'code': 'Backquote'},
-  '{': {'keyCode': 219, 'key': '{', 'code': 'BracketLeft'},
-  '|': {'keyCode': 220, 'key': '|', 'code': 'Backslash'},
-  '}': {'keyCode': 221, 'key': '}', 'code': 'BracketRight'},
-  '"': {'keyCode': 222, 'key': '"', 'code': 'Quote'},
-  'SoftLeft': {'key': 'SoftLeft', 'code': 'SoftLeft', 'location': 4},
-  'SoftRight': {'key': 'SoftRight', 'code': 'SoftRight', 'location': 4},
-  'Camera': {'keyCode': 44, 'key': 'Camera', 'code': 'Camera', 'location': 4},
-  'Call': {'key': 'Call', 'code': 'Call', 'location': 4},
-  'EndCall': {'keyCode': 95, 'key': 'EndCall', 'code': 'EndCall', 'location': 4},
-  'VolumeDown': {'keyCode': 182, 'key': 'VolumeDown', 'code': 'VolumeDown', 'location': 4},
-  'VolumeUp': {'keyCode': 183, 'key': 'VolumeUp', 'code': 'VolumeUp', 'location': 4},
-};
\ No newline at end of file
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.keyDefinitions = {
+    '0': { 'keyCode': 48, 'key': '0', 'code': 'Digit0' },
+    '1': { 'keyCode': 49, 'key': '1', 'code': 'Digit1' },
+    '2': { 'keyCode': 50, 'key': '2', 'code': 'Digit2' },
+    '3': { 'keyCode': 51, 'key': '3', 'code': 'Digit3' },
+    '4': { 'keyCode': 52, 'key': '4', 'code': 'Digit4' },
+    '5': { 'keyCode': 53, 'key': '5', 'code': 'Digit5' },
+    '6': { 'keyCode': 54, 'key': '6', 'code': 'Digit6' },
+    '7': { 'keyCode': 55, 'key': '7', 'code': 'Digit7' },
+    '8': { 'keyCode': 56, 'key': '8', 'code': 'Digit8' },
+    '9': { 'keyCode': 57, 'key': '9', 'code': 'Digit9' },
+    'Power': { 'key': 'Power', 'code': 'Power' },
+    'Eject': { 'key': 'Eject', 'code': 'Eject' },
+    'Abort': { 'keyCode': 3, 'code': 'Abort', 'key': 'Cancel' },
+    'Help': { 'keyCode': 6, 'code': 'Help', 'key': 'Help' },
+    'Backspace': { 'keyCode': 8, 'code': 'Backspace', 'key': 'Backspace' },
+    'Tab': { 'keyCode': 9, 'code': 'Tab', 'key': 'Tab' },
+    'Numpad5': { 'keyCode': 12, 'shiftKeyCode': 101, 'key': 'Clear', 'code': 'Numpad5', 'shiftKey': '5', 'location': 3 },
+    'NumpadEnter': { 'keyCode': 13, 'code': 'NumpadEnter', 'key': 'Enter', 'text': '\r', 'location': 3 },
+    'Enter': { 'keyCode': 13, 'code': 'Enter', 'key': 'Enter', 'text': '\r' },
+    '\r': { 'keyCode': 13, 'code': 'Enter', 'key': 'Enter', 'text': '\r' },
+    '\n': { 'keyCode': 13, 'code': 'Enter', 'key': 'Enter', 'text': '\r' },
+    'ShiftLeft': { 'keyCode': 16, 'code': 'ShiftLeft', 'key': 'Shift', 'location': 1 },
+    'ShiftRight': { 'keyCode': 16, 'code': 'ShiftRight', 'key': 'Shift', 'location': 2 },
+    'ControlLeft': { 'keyCode': 17, 'code': 'ControlLeft', 'key': 'Control', 'location': 1 },
+    'ControlRight': { 'keyCode': 17, 'code': 'ControlRight', 'key': 'Control', 'location': 2 },
+    'AltLeft': { 'keyCode': 18, 'code': 'AltLeft', 'key': 'Alt', 'location': 1 },
+    'AltRight': { 'keyCode': 18, 'code': 'AltRight', 'key': 'Alt', 'location': 2 },
+    'Pause': { 'keyCode': 19, 'code': 'Pause', 'key': 'Pause' },
+    'CapsLock': { 'keyCode': 20, 'code': 'CapsLock', 'key': 'CapsLock' },
+    'Escape': { 'keyCode': 27, 'code': 'Escape', 'key': 'Escape' },
+    'Convert': { 'keyCode': 28, 'code': 'Convert', 'key': 'Convert' },
+    'NonConvert': { 'keyCode': 29, 'code': 'NonConvert', 'key': 'NonConvert' },
+    'Space': { 'keyCode': 32, 'code': 'Space', 'key': ' ' },
+    'Numpad9': { 'keyCode': 33, 'shiftKeyCode': 105, 'key': 'PageUp', 'code': 'Numpad9', 'shiftKey': '9', 'location': 3 },
+    'PageUp': { 'keyCode': 33, 'code': 'PageUp', 'key': 'PageUp' },
+    'Numpad3': { 'keyCode': 34, 'shiftKeyCode': 99, 'key': 'PageDown', 'code': 'Numpad3', 'shiftKey': '3', 'location': 3 },
+    'PageDown': { 'keyCode': 34, 'code': 'PageDown', 'key': 'PageDown' },
+    'End': { 'keyCode': 35, 'code': 'End', 'key': 'End' },
+    'Numpad1': { 'keyCode': 35, 'shiftKeyCode': 97, 'key': 'End', 'code': 'Numpad1', 'shiftKey': '1', 'location': 3 },
+    'Home': { 'keyCode': 36, 'code': 'Home', 'key': 'Home' },
+    'Numpad7': { 'keyCode': 36, 'shiftKeyCode': 103, 'key': 'Home', 'code': 'Numpad7', 'shiftKey': '7', 'location': 3 },
+    'ArrowLeft': { 'keyCode': 37, 'code': 'ArrowLeft', 'key': 'ArrowLeft' },
+    'Numpad4': { 'keyCode': 37, 'shiftKeyCode': 100, 'key': 'ArrowLeft', 'code': 'Numpad4', 'shiftKey': '4', 'location': 3 },
+    'Numpad8': { 'keyCode': 38, 'shiftKeyCode': 104, 'key': 'ArrowUp', 'code': 'Numpad8', 'shiftKey': '8', 'location': 3 },
+    'ArrowUp': { 'keyCode': 38, 'code': 'ArrowUp', 'key': 'ArrowUp' },
+    'ArrowRight': { 'keyCode': 39, 'code': 'ArrowRight', 'key': 'ArrowRight' },
+    'Numpad6': { 'keyCode': 39, 'shiftKeyCode': 102, 'key': 'ArrowRight', 'code': 'Numpad6', 'shiftKey': '6', 'location': 3 },
+    'Numpad2': { 'keyCode': 40, 'shiftKeyCode': 98, 'key': 'ArrowDown', 'code': 'Numpad2', 'shiftKey': '2', 'location': 3 },
+    'ArrowDown': { 'keyCode': 40, 'code': 'ArrowDown', 'key': 'ArrowDown' },
+    'Select': { 'keyCode': 41, 'code': 'Select', 'key': 'Select' },
+    'Open': { 'keyCode': 43, 'code': 'Open', 'key': 'Execute' },
+    'PrintScreen': { 'keyCode': 44, 'code': 'PrintScreen', 'key': 'PrintScreen' },
+    'Insert': { 'keyCode': 45, 'code': 'Insert', 'key': 'Insert' },
+    'Numpad0': { 'keyCode': 45, 'shiftKeyCode': 96, 'key': 'Insert', 'code': 'Numpad0', 'shiftKey': '0', 'location': 3 },
+    'Delete': { 'keyCode': 46, 'code': 'Delete', 'key': 'Delete' },
+    'NumpadDecimal': { 'keyCode': 46, 'shiftKeyCode': 110, 'code': 'NumpadDecimal', 'key': '\u0000', 'shiftKey': '.', 'location': 3 },
+    'Digit0': { 'keyCode': 48, 'code': 'Digit0', 'shiftKey': ')', 'key': '0' },
+    'Digit1': { 'keyCode': 49, 'code': 'Digit1', 'shiftKey': '!', 'key': '1' },
+    'Digit2': { 'keyCode': 50, 'code': 'Digit2', 'shiftKey': '@', 'key': '2' },
+    'Digit3': { 'keyCode': 51, 'code': 'Digit3', 'shiftKey': '#', 'key': '3' },
+    'Digit4': { 'keyCode': 52, 'code': 'Digit4', 'shiftKey': '$', 'key': '4' },
+    'Digit5': { 'keyCode': 53, 'code': 'Digit5', 'shiftKey': '%', 'key': '5' },
+    'Digit6': { 'keyCode': 54, 'code': 'Digit6', 'shiftKey': '^', 'key': '6' },
+    'Digit7': { 'keyCode': 55, 'code': 'Digit7', 'shiftKey': '&', 'key': '7' },
+    'Digit8': { 'keyCode': 56, 'code': 'Digit8', 'shiftKey': '*', 'key': '8' },
+    'Digit9': { 'keyCode': 57, 'code': 'Digit9', 'shiftKey': '\(', 'key': '9' },
+    'KeyA': { 'keyCode': 65, 'code': 'KeyA', 'shiftKey': 'A', 'key': 'a' },
+    'KeyB': { 'keyCode': 66, 'code': 'KeyB', 'shiftKey': 'B', 'key': 'b' },
+    'KeyC': { 'keyCode': 67, 'code': 'KeyC', 'shiftKey': 'C', 'key': 'c' },
+    'KeyD': { 'keyCode': 68, 'code': 'KeyD', 'shiftKey': 'D', 'key': 'd' },
+    'KeyE': { 'keyCode': 69, 'code': 'KeyE', 'shiftKey': 'E', 'key': 'e' },
+    'KeyF': { 'keyCode': 70, 'code': 'KeyF', 'shiftKey': 'F', 'key': 'f' },
+    'KeyG': { 'keyCode': 71, 'code': 'KeyG', 'shiftKey': 'G', 'key': 'g' },
+    'KeyH': { 'keyCode': 72, 'code': 'KeyH', 'shiftKey': 'H', 'key': 'h' },
+    'KeyI': { 'keyCode': 73, 'code': 'KeyI', 'shiftKey': 'I', 'key': 'i' },
+    'KeyJ': { 'keyCode': 74, 'code': 'KeyJ', 'shiftKey': 'J', 'key': 'j' },
+    'KeyK': { 'keyCode': 75, 'code': 'KeyK', 'shiftKey': 'K', 'key': 'k' },
+    'KeyL': { 'keyCode': 76, 'code': 'KeyL', 'shiftKey': 'L', 'key': 'l' },
+    'KeyM': { 'keyCode': 77, 'code': 'KeyM', 'shiftKey': 'M', 'key': 'm' },
+    'KeyN': { 'keyCode': 78, 'code': 'KeyN', 'shiftKey': 'N', 'key': 'n' },
+    'KeyO': { 'keyCode': 79, 'code': 'KeyO', 'shiftKey': 'O', 'key': 'o' },
+    'KeyP': { 'keyCode': 80, 'code': 'KeyP', 'shiftKey': 'P', 'key': 'p' },
+    'KeyQ': { 'keyCode': 81, 'code': 'KeyQ', 'shiftKey': 'Q', 'key': 'q' },
+    'KeyR': { 'keyCode': 82, 'code': 'KeyR', 'shiftKey': 'R', 'key': 'r' },
+    'KeyS': { 'keyCode': 83, 'code': 'KeyS', 'shiftKey': 'S', 'key': 's' },
+    'KeyT': { 'keyCode': 84, 'code': 'KeyT', 'shiftKey': 'T', 'key': 't' },
+    'KeyU': { 'keyCode': 85, 'code': 'KeyU', 'shiftKey': 'U', 'key': 'u' },
+    'KeyV': { 'keyCode': 86, 'code': 'KeyV', 'shiftKey': 'V', 'key': 'v' },
+    'KeyW': { 'keyCode': 87, 'code': 'KeyW', 'shiftKey': 'W', 'key': 'w' },
+    'KeyX': { 'keyCode': 88, 'code': 'KeyX', 'shiftKey': 'X', 'key': 'x' },
+    'KeyY': { 'keyCode': 89, 'code': 'KeyY', 'shiftKey': 'Y', 'key': 'y' },
+    'KeyZ': { 'keyCode': 90, 'code': 'KeyZ', 'shiftKey': 'Z', 'key': 'z' },
+    'MetaLeft': { 'keyCode': 91, 'code': 'MetaLeft', 'key': 'Meta', 'location': 1 },
+    'MetaRight': { 'keyCode': 92, 'code': 'MetaRight', 'key': 'Meta', 'location': 2 },
+    'ContextMenu': { 'keyCode': 93, 'code': 'ContextMenu', 'key': 'ContextMenu' },
+    'NumpadMultiply': { 'keyCode': 106, 'code': 'NumpadMultiply', 'key': '*', 'location': 3 },
+    'NumpadAdd': { 'keyCode': 107, 'code': 'NumpadAdd', 'key': '+', 'location': 3 },
+    'NumpadSubtract': { 'keyCode': 109, 'code': 'NumpadSubtract', 'key': '-', 'location': 3 },
+    'NumpadDivide': { 'keyCode': 111, 'code': 'NumpadDivide', 'key': '/', 'location': 3 },
+    'F1': { 'keyCode': 112, 'code': 'F1', 'key': 'F1' },
+    'F2': { 'keyCode': 113, 'code': 'F2', 'key': 'F2' },
+    'F3': { 'keyCode': 114, 'code': 'F3', 'key': 'F3' },
+    'F4': { 'keyCode': 115, 'code': 'F4', 'key': 'F4' },
+    'F5': { 'keyCode': 116, 'code': 'F5', 'key': 'F5' },
+    'F6': { 'keyCode': 117, 'code': 'F6', 'key': 'F6' },
+    'F7': { 'keyCode': 118, 'code': 'F7', 'key': 'F7' },
+    'F8': { 'keyCode': 119, 'code': 'F8', 'key': 'F8' },
+    'F9': { 'keyCode': 120, 'code': 'F9', 'key': 'F9' },
+    'F10': { 'keyCode': 121, 'code': 'F10', 'key': 'F10' },
+    'F11': { 'keyCode': 122, 'code': 'F11', 'key': 'F11' },
+    'F12': { 'keyCode': 123, 'code': 'F12', 'key': 'F12' },
+    'F13': { 'keyCode': 124, 'code': 'F13', 'key': 'F13' },
+    'F14': { 'keyCode': 125, 'code': 'F14', 'key': 'F14' },
+    'F15': { 'keyCode': 126, 'code': 'F15', 'key': 'F15' },
+    'F16': { 'keyCode': 127, 'code': 'F16', 'key': 'F16' },
+    'F17': { 'keyCode': 128, 'code': 'F17', 'key': 'F17' },
+    'F18': { 'keyCode': 129, 'code': 'F18', 'key': 'F18' },
+    'F19': { 'keyCode': 130, 'code': 'F19', 'key': 'F19' },
+    'F20': { 'keyCode': 131, 'code': 'F20', 'key': 'F20' },
+    'F21': { 'keyCode': 132, 'code': 'F21', 'key': 'F21' },
+    'F22': { 'keyCode': 133, 'code': 'F22', 'key': 'F22' },
+    'F23': { 'keyCode': 134, 'code': 'F23', 'key': 'F23' },
+    'F24': { 'keyCode': 135, 'code': 'F24', 'key': 'F24' },
+    'NumLock': { 'keyCode': 144, 'code': 'NumLock', 'key': 'NumLock' },
+    'ScrollLock': { 'keyCode': 145, 'code': 'ScrollLock', 'key': 'ScrollLock' },
+    'AudioVolumeMute': { 'keyCode': 173, 'code': 'AudioVolumeMute', 'key': 'AudioVolumeMute' },
+    'AudioVolumeDown': { 'keyCode': 174, 'code': 'AudioVolumeDown', 'key': 'AudioVolumeDown' },
+    'AudioVolumeUp': { 'keyCode': 175, 'code': 'AudioVolumeUp', 'key': 'AudioVolumeUp' },
+    'MediaTrackNext': { 'keyCode': 176, 'code': 'MediaTrackNext', 'key': 'MediaTrackNext' },
+    'MediaTrackPrevious': { 'keyCode': 177, 'code': 'MediaTrackPrevious', 'key': 'MediaTrackPrevious' },
+    'MediaStop': { 'keyCode': 178, 'code': 'MediaStop', 'key': 'MediaStop' },
+    'MediaPlayPause': { 'keyCode': 179, 'code': 'MediaPlayPause', 'key': 'MediaPlayPause' },
+    'Semicolon': { 'keyCode': 186, 'code': 'Semicolon', 'shiftKey': ':', 'key': ';' },
+    'Equal': { 'keyCode': 187, 'code': 'Equal', 'shiftKey': '+', 'key': '=' },
+    'NumpadEqual': { 'keyCode': 187, 'code': 'NumpadEqual', 'key': '=', 'location': 3 },
+    'Comma': { 'keyCode': 188, 'code': 'Comma', 'shiftKey': '\<', 'key': ',' },
+    'Minus': { 'keyCode': 189, 'code': 'Minus', 'shiftKey': '_', 'key': '-' },
+    'Period': { 'keyCode': 190, 'code': 'Period', 'shiftKey': '>', 'key': '.' },
+    'Slash': { 'keyCode': 191, 'code': 'Slash', 'shiftKey': '?', 'key': '/' },
+    'Backquote': { 'keyCode': 192, 'code': 'Backquote', 'shiftKey': '~', 'key': '`' },
+    'BracketLeft': { 'keyCode': 219, 'code': 'BracketLeft', 'shiftKey': '{', 'key': '[' },
+    'Backslash': { 'keyCode': 220, 'code': 'Backslash', 'shiftKey': '|', 'key': '\\' },
+    'BracketRight': { 'keyCode': 221, 'code': 'BracketRight', 'shiftKey': '}', 'key': ']' },
+    'Quote': { 'keyCode': 222, 'code': 'Quote', 'shiftKey': '"', 'key': '\'' },
+    'AltGraph': { 'keyCode': 225, 'code': 'AltGraph', 'key': 'AltGraph' },
+    'Props': { 'keyCode': 247, 'code': 'Props', 'key': 'CrSel' },
+    'Cancel': { 'keyCode': 3, 'key': 'Cancel', 'code': 'Abort' },
+    'Clear': { 'keyCode': 12, 'key': 'Clear', 'code': 'Numpad5', 'location': 3 },
+    'Shift': { 'keyCode': 16, 'key': 'Shift', 'code': 'ShiftLeft', 'location': 1 },
+    'Control': { 'keyCode': 17, 'key': 'Control', 'code': 'ControlLeft', 'location': 1 },
+    'Alt': { 'keyCode': 18, 'key': 'Alt', 'code': 'AltLeft', 'location': 1 },
+    'Accept': { 'keyCode': 30, 'key': 'Accept' },
+    'ModeChange': { 'keyCode': 31, 'key': 'ModeChange' },
+    ' ': { 'keyCode': 32, 'key': ' ', 'code': 'Space' },
+    'Print': { 'keyCode': 42, 'key': 'Print' },
+    'Execute': { 'keyCode': 43, 'key': 'Execute', 'code': 'Open' },
+    '\u0000': { 'keyCode': 46, 'key': '\u0000', 'code': 'NumpadDecimal', 'location': 3 },
+    'a': { 'keyCode': 65, 'key': 'a', 'code': 'KeyA' },
+    'b': { 'keyCode': 66, 'key': 'b', 'code': 'KeyB' },
+    'c': { 'keyCode': 67, 'key': 'c', 'code': 'KeyC' },
+    'd': { 'keyCode': 68, 'key': 'd', 'code': 'KeyD' },
+    'e': { 'keyCode': 69, 'key': 'e', 'code': 'KeyE' },
+    'f': { 'keyCode': 70, 'key': 'f', 'code': 'KeyF' },
+    'g': { 'keyCode': 71, 'key': 'g', 'code': 'KeyG' },
+    'h': { 'keyCode': 72, 'key': 'h', 'code': 'KeyH' },
+    'i': { 'keyCode': 73, 'key': 'i', 'code': 'KeyI' },
+    'j': { 'keyCode': 74, 'key': 'j', 'code': 'KeyJ' },
+    'k': { 'keyCode': 75, 'key': 'k', 'code': 'KeyK' },
+    'l': { 'keyCode': 76, 'key': 'l', 'code': 'KeyL' },
+    'm': { 'keyCode': 77, 'key': 'm', 'code': 'KeyM' },
+    'n': { 'keyCode': 78, 'key': 'n', 'code': 'KeyN' },
+    'o': { 'keyCode': 79, 'key': 'o', 'code': 'KeyO' },
+    'p': { 'keyCode': 80, 'key': 'p', 'code': 'KeyP' },
+    'q': { 'keyCode': 81, 'key': 'q', 'code': 'KeyQ' },
+    'r': { 'keyCode': 82, 'key': 'r', 'code': 'KeyR' },
+    's': { 'keyCode': 83, 'key': 's', 'code': 'KeyS' },
+    't': { 'keyCode': 84, 'key': 't', 'code': 'KeyT' },
+    'u': { 'keyCode': 85, 'key': 'u', 'code': 'KeyU' },
+    'v': { 'keyCode': 86, 'key': 'v', 'code': 'KeyV' },
+    'w': { 'keyCode': 87, 'key': 'w', 'code': 'KeyW' },
+    'x': { 'keyCode': 88, 'key': 'x', 'code': 'KeyX' },
+    'y': { 'keyCode': 89, 'key': 'y', 'code': 'KeyY' },
+    'z': { 'keyCode': 90, 'key': 'z', 'code': 'KeyZ' },
+    'Meta': { 'keyCode': 91, 'key': 'Meta', 'code': 'MetaLeft', 'location': 1 },
+    '*': { 'keyCode': 106, 'key': '*', 'code': 'NumpadMultiply', 'location': 3 },
+    '+': { 'keyCode': 107, 'key': '+', 'code': 'NumpadAdd', 'location': 3 },
+    '-': { 'keyCode': 109, 'key': '-', 'code': 'NumpadSubtract', 'location': 3 },
+    '/': { 'keyCode': 111, 'key': '/', 'code': 'NumpadDivide', 'location': 3 },
+    ';': { 'keyCode': 186, 'key': ';', 'code': 'Semicolon' },
+    '=': { 'keyCode': 187, 'key': '=', 'code': 'Equal' },
+    ',': { 'keyCode': 188, 'key': ',', 'code': 'Comma' },
+    '.': { 'keyCode': 190, 'key': '.', 'code': 'Period' },
+    '`': { 'keyCode': 192, 'key': '`', 'code': 'Backquote' },
+    '[': { 'keyCode': 219, 'key': '[', 'code': 'BracketLeft' },
+    '\\': { 'keyCode': 220, 'key': '\\', 'code': 'Backslash' },
+    ']': { 'keyCode': 221, 'key': ']', 'code': 'BracketRight' },
+    '\'': { 'keyCode': 222, 'key': '\'', 'code': 'Quote' },
+    'Attn': { 'keyCode': 246, 'key': 'Attn' },
+    'CrSel': { 'keyCode': 247, 'key': 'CrSel', 'code': 'Props' },
+    'ExSel': { 'keyCode': 248, 'key': 'ExSel' },
+    'EraseEof': { 'keyCode': 249, 'key': 'EraseEof' },
+    'Play': { 'keyCode': 250, 'key': 'Play' },
+    'ZoomOut': { 'keyCode': 251, 'key': 'ZoomOut' },
+    ')': { 'keyCode': 48, 'key': ')', 'code': 'Digit0' },
+    '!': { 'keyCode': 49, 'key': '!', 'code': 'Digit1' },
+    '@': { 'keyCode': 50, 'key': '@', 'code': 'Digit2' },
+    '#': { 'keyCode': 51, 'key': '#', 'code': 'Digit3' },
+    '$': { 'keyCode': 52, 'key': '$', 'code': 'Digit4' },
+    '%': { 'keyCode': 53, 'key': '%', 'code': 'Digit5' },
+    '^': { 'keyCode': 54, 'key': '^', 'code': 'Digit6' },
+    '&': { 'keyCode': 55, 'key': '&', 'code': 'Digit7' },
+    '(': { 'keyCode': 57, 'key': '\(', 'code': 'Digit9' },
+    'A': { 'keyCode': 65, 'key': 'A', 'code': 'KeyA' },
+    'B': { 'keyCode': 66, 'key': 'B', 'code': 'KeyB' },
+    'C': { 'keyCode': 67, 'key': 'C', 'code': 'KeyC' },
+    'D': { 'keyCode': 68, 'key': 'D', 'code': 'KeyD' },
+    'E': { 'keyCode': 69, 'key': 'E', 'code': 'KeyE' },
+    'F': { 'keyCode': 70, 'key': 'F', 'code': 'KeyF' },
+    'G': { 'keyCode': 71, 'key': 'G', 'code': 'KeyG' },
+    'H': { 'keyCode': 72, 'key': 'H', 'code': 'KeyH' },
+    'I': { 'keyCode': 73, 'key': 'I', 'code': 'KeyI' },
+    'J': { 'keyCode': 74, 'key': 'J', 'code': 'KeyJ' },
+    'K': { 'keyCode': 75, 'key': 'K', 'code': 'KeyK' },
+    'L': { 'keyCode': 76, 'key': 'L', 'code': 'KeyL' },
+    'M': { 'keyCode': 77, 'key': 'M', 'code': 'KeyM' },
+    'N': { 'keyCode': 78, 'key': 'N', 'code': 'KeyN' },
+    'O': { 'keyCode': 79, 'key': 'O', 'code': 'KeyO' },
+    'P': { 'keyCode': 80, 'key': 'P', 'code': 'KeyP' },
+    'Q': { 'keyCode': 81, 'key': 'Q', 'code': 'KeyQ' },
+    'R': { 'keyCode': 82, 'key': 'R', 'code': 'KeyR' },
+    'S': { 'keyCode': 83, 'key': 'S', 'code': 'KeyS' },
+    'T': { 'keyCode': 84, 'key': 'T', 'code': 'KeyT' },
+    'U': { 'keyCode': 85, 'key': 'U', 'code': 'KeyU' },
+    'V': { 'keyCode': 86, 'key': 'V', 'code': 'KeyV' },
+    'W': { 'keyCode': 87, 'key': 'W', 'code': 'KeyW' },
+    'X': { 'keyCode': 88, 'key': 'X', 'code': 'KeyX' },
+    'Y': { 'keyCode': 89, 'key': 'Y', 'code': 'KeyY' },
+    'Z': { 'keyCode': 90, 'key': 'Z', 'code': 'KeyZ' },
+    ':': { 'keyCode': 186, 'key': ':', 'code': 'Semicolon' },
+    '<': { 'keyCode': 188, 'key': '\<', 'code': 'Comma' },
+    '_': { 'keyCode': 189, 'key': '_', 'code': 'Minus' },
+    '>': { 'keyCode': 190, 'key': '>', 'code': 'Period' },
+    '?': { 'keyCode': 191, 'key': '?', 'code': 'Slash' },
+    '~': { 'keyCode': 192, 'key': '~', 'code': 'Backquote' },
+    '{': { 'keyCode': 219, 'key': '{', 'code': 'BracketLeft' },
+    '|': { 'keyCode': 220, 'key': '|', 'code': 'Backslash' },
+    '}': { 'keyCode': 221, 'key': '}', 'code': 'BracketRight' },
+    '"': { 'keyCode': 222, 'key': '"', 'code': 'Quote' },
+    'SoftLeft': { 'key': 'SoftLeft', 'code': 'SoftLeft', 'location': 4 },
+    'SoftRight': { 'key': 'SoftRight', 'code': 'SoftRight', 'location': 4 },
+    'Camera': { 'keyCode': 44, 'key': 'Camera', 'code': 'Camera', 'location': 4 },
+    'Call': { 'key': 'Call', 'code': 'Call', 'location': 4 },
+    'EndCall': { 'keyCode': 95, 'key': 'EndCall', 'code': 'EndCall', 'location': 4 },
+    'VolumeDown': { 'keyCode': 182, 'key': 'VolumeDown', 'code': 'VolumeDown', 'location': 4 },
+    'VolumeUp': { 'keyCode': 183, 'key': 'VolumeUp', 'code': 'VolumeUp', 'location': 4 },
+};
diff --git a/node_modules/puppeteer/lib/Viewport.js b/node_modules/puppeteer/lib/Viewport.js
new file mode 100644
index 0000000..c8ad2e5
--- /dev/null
+++ b/node_modules/puppeteer/lib/Viewport.js
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
diff --git a/node_modules/puppeteer/lib/WebSocketTransport.js b/node_modules/puppeteer/lib/WebSocketTransport.js
index 7bf5a0a..e8c5d3d 100644
--- a/node_modules/puppeteer/lib/WebSocketTransport.js
+++ b/node_modules/puppeteer/lib/WebSocketTransport.js
@@ -1,3 +1,5 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
 /**
  * Copyright 2018 Google Inc. All rights reserved.
  *
@@ -13,56 +15,38 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-const WebSocket = require('ws');
-
-/**
- * @implements {!Puppeteer.ConnectionTransport}
- */
+const NodeWebSocket = require("ws");
 class WebSocketTransport {
-  /**
-   * @param {string} url
-   * @return {!Promise<!WebSocketTransport>}
-   */
-  static create(url) {
-    return new Promise((resolve, reject) => {
-      const ws = new WebSocket(url, [], {
-        perMessageDeflate: false,
-        maxPayload: 256 * 1024 * 1024, // 256Mb
-      });
-      ws.addEventListener('open', () => resolve(new WebSocketTransport(ws)));
-      ws.addEventListener('error', reject);
-    });
-  }
-
-  /**
-   * @param {!WebSocket} ws
-   */
-  constructor(ws) {
-    this._ws = ws;
-    this._ws.addEventListener('message', event => {
-      if (this.onmessage)
-        this.onmessage.call(null, event.data);
-    });
-    this._ws.addEventListener('close', event => {
-      if (this.onclose)
-        this.onclose.call(null);
-    });
-    // Silently ignore all errors - we don't know what to do with them.
-    this._ws.addEventListener('error', () => {});
-    this.onmessage = null;
-    this.onclose = null;
-  }
-
-  /**
-   * @param {string} message
-   */
-  send(message) {
-    this._ws.send(message);
-  }
-
-  close() {
-    this._ws.close();
-  }
+    constructor(ws) {
+        this._ws = ws;
+        this._ws.addEventListener('message', event => {
+            if (this.onmessage)
+                this.onmessage.call(null, event.data);
+        });
+        this._ws.addEventListener('close', () => {
+            if (this.onclose)
+                this.onclose.call(null);
+        });
+        // Silently ignore all errors - we don't know what to do with them.
+        this._ws.addEventListener('error', () => { });
+        this.onmessage = null;
+        this.onclose = null;
+    }
+    static create(url) {
+        return new Promise((resolve, reject) => {
+            const ws = new NodeWebSocket(url, [], {
+                perMessageDeflate: false,
+                maxPayload: 256 * 1024 * 1024,
+            });
+            ws.addEventListener('open', () => resolve(new WebSocketTransport(ws)));
+            ws.addEventListener('error', reject);
+        });
+    }
+    send(message) {
+        this._ws.send(message);
+    }
+    close() {
+        this._ws.close();
+    }
 }
-
-module.exports = WebSocketTransport;
+exports.WebSocketTransport = WebSocketTransport;
diff --git a/node_modules/puppeteer/lib/Worker.js b/node_modules/puppeteer/lib/Worker.js
index 7661165..1193a2c 100644
--- a/node_modules/puppeteer/lib/Worker.js
+++ b/node_modules/puppeteer/lib/Worker.js
@@ -1,3 +1,5 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
 /**
  * Copyright 2018 Google Inc. All rights reserved.
  *
@@ -13,68 +15,39 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-const EventEmitter = require('events');
-const {debugError} = require('./helper');
-const {ExecutionContext} = require('./ExecutionContext');
-const {JSHandle} = require('./JSHandle');
-
-class Worker extends EventEmitter {
-  /**
-   * @param {Puppeteer.CDPSession} client
-   * @param {string} url
-   * @param {function(string, !Array<!JSHandle>, Protocol.Runtime.StackTrace=):void} consoleAPICalled
-   * @param {function(!Protocol.Runtime.ExceptionDetails):void} exceptionThrown
-   */
-  constructor(client, url, consoleAPICalled, exceptionThrown) {
-    super();
-    this._client = client;
-    this._url = url;
-    this._executionContextPromise = new Promise(x => this._executionContextCallback = x);
-    /** @type {function(!Protocol.Runtime.RemoteObject):!JSHandle} */
-    let jsHandleFactory;
-    this._client.once('Runtime.executionContextCreated', async event => {
-      jsHandleFactory = remoteObject => new JSHandle(executionContext, client, remoteObject);
-      const executionContext = new ExecutionContext(client, event.context, null);
-      this._executionContextCallback(executionContext);
-    });
-    // This might fail if the target is closed before we recieve all execution contexts.
-    this._client.send('Runtime.enable', {}).catch(debugError);
-
-    this._client.on('Runtime.consoleAPICalled', event => consoleAPICalled(event.type, event.args.map(jsHandleFactory), event.stackTrace));
-    this._client.on('Runtime.exceptionThrown', exception => exceptionThrown(exception.exceptionDetails));
-  }
-
-  /**
-   * @return {string}
-   */
-  url() {
-    return this._url;
-  }
-
-  /**
-   * @return {!Promise<ExecutionContext>}
-   */
-  async executionContext() {
-    return this._executionContextPromise;
-  }
-
-  /**
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<*>}
-   */
-  async evaluate(pageFunction, ...args) {
-    return (await this._executionContextPromise).evaluate(pageFunction, ...args);
-  }
-
-  /**
-   * @param {Function|string} pageFunction
-   * @param {!Array<*>} args
-   * @return {!Promise<!JSHandle>}
-   */
-  async evaluateHandle(pageFunction, ...args) {
-    return (await this._executionContextPromise).evaluateHandle(pageFunction, ...args);
-  }
+const events_1 = require("events");
+const helper_1 = require("./helper");
+const ExecutionContext_1 = require("./ExecutionContext");
+const JSHandle_1 = require("./JSHandle");
+class Worker extends events_1.EventEmitter {
+    constructor(client, url, consoleAPICalled, exceptionThrown) {
+        super();
+        this._client = client;
+        this._url = url;
+        this._executionContextPromise = new Promise(x => this._executionContextCallback = x);
+        let jsHandleFactory;
+        this._client.once('Runtime.executionContextCreated', async (event) => {
+            // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
+            jsHandleFactory = remoteObject => new JSHandle_1.JSHandle(executionContext, client, remoteObject);
+            const executionContext = new ExecutionContext_1.ExecutionContext(client, event.context, null);
+            this._executionContextCallback(executionContext);
+        });
+        // This might fail if the target is closed before we recieve all execution contexts.
+        this._client.send('Runtime.enable', {}).catch(helper_1.debugError);
+        this._client.on('Runtime.consoleAPICalled', event => consoleAPICalled(event.type, event.args.map(jsHandleFactory), event.stackTrace));
+        this._client.on('Runtime.exceptionThrown', exception => exceptionThrown(exception.exceptionDetails));
+    }
+    url() {
+        return this._url;
+    }
+    async executionContext() {
+        return this._executionContextPromise;
+    }
+    async evaluate(pageFunction, ...args) {
+        return (await this._executionContextPromise).evaluate(pageFunction, ...args);
+    }
+    async evaluateHandle(pageFunction, ...args) {
+        return (await this._executionContextPromise).evaluateHandle(pageFunction, ...args);
+    }
 }
-
-module.exports = {Worker};
+exports.Worker = Worker;
diff --git a/node_modules/puppeteer/lib/api.js b/node_modules/puppeteer/lib/api.js
index afb0acb..06594fd 100644
--- a/node_modules/puppeteer/lib/api.js
+++ b/node_modules/puppeteer/lib/api.js
@@ -13,31 +13,34 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
+/* This file is used in two places:
+ * 1) the coverage-utils use it to gain a list of all methods we check for test coverage on
+ * 2) index.js uses it to iterate through all methods and call helper.installAsyncStackHooks on
+ */
 module.exports = {
-  Accessibility: require('./Accessibility').Accessibility,
-  Browser: require('./Browser').Browser,
-  BrowserContext: require('./Browser').BrowserContext,
-  BrowserFetcher: require('./BrowserFetcher'),
-  CDPSession: require('./Connection').CDPSession,
-  ConsoleMessage: require('./Page').ConsoleMessage,
-  Coverage: require('./Coverage').Coverage,
-  Dialog: require('./Dialog').Dialog,
-  ElementHandle: require('./JSHandle').ElementHandle,
-  ExecutionContext: require('./ExecutionContext').ExecutionContext,
-  FileChooser: require('./Page').FileChooser,
-  Frame: require('./FrameManager').Frame,
-  JSHandle: require('./JSHandle').JSHandle,
-  Keyboard: require('./Input').Keyboard,
-  Mouse: require('./Input').Mouse,
-  Page: require('./Page').Page,
-  Puppeteer: require('./Puppeteer'),
-  Request: require('./NetworkManager').Request,
-  Response: require('./NetworkManager').Response,
-  SecurityDetails: require('./NetworkManager').SecurityDetails,
-  Target: require('./Target').Target,
-  TimeoutError: require('./Errors').TimeoutError,
-  Touchscreen: require('./Input').Touchscreen,
-  Tracing: require('./Tracing'),
-  Worker: require('./Worker').Worker,
+    Accessibility: require('./Accessibility').Accessibility,
+    Browser: require('./Browser').Browser,
+    BrowserContext: require('./Browser').BrowserContext,
+    BrowserFetcher: require('./BrowserFetcher').BrowserFetcher,
+    CDPSession: require('./Connection').CDPSession,
+    ConsoleMessage: require('./Page').ConsoleMessage,
+    Coverage: require('./Coverage').Coverage,
+    Dialog: require('./Dialog').Dialog,
+    ElementHandle: require('./JSHandle').ElementHandle,
+    ExecutionContext: require('./ExecutionContext').ExecutionContext,
+    FileChooser: require('./Page').FileChooser,
+    Frame: require('./FrameManager').Frame,
+    JSHandle: require('./JSHandle').JSHandle,
+    Keyboard: require('./Input').Keyboard,
+    Mouse: require('./Input').Mouse,
+    Page: require('./Page').Page,
+    Puppeteer: require('./Puppeteer').Puppeteer,
+    Request: require('./NetworkManager').Request,
+    Response: require('./NetworkManager').Response,
+    SecurityDetails: require('./NetworkManager').SecurityDetails,
+    Target: require('./Target').Target,
+    TimeoutError: require('./Errors').TimeoutError,
+    Touchscreen: require('./Input').Touchscreen,
+    Tracing: require('./Tracing').Tracing,
+    Worker: require('./Worker').Worker,
 };
diff --git a/node_modules/puppeteer/lib/helper.js b/node_modules/puppeteer/lib/helper.js
index 3c5d987..96eae91 100644
--- a/node_modules/puppeteer/lib/helper.js
+++ b/node_modules/puppeteer/lib/helper.js
@@ -1,3 +1,5 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
 /**
  * Copyright 2017 Google Inc. All rights reserved.
  *
@@ -13,278 +15,191 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-const {TimeoutError} = require('./Errors');
-const debugError = require('debug')(`puppeteer:error`);
-const fs = require('fs');
-
-class Helper {
-  /**
-   * @param {Function|string} fun
-   * @param {!Array<*>} args
-   * @return {string}
-   */
-  static evaluationString(fun, ...args) {
-    if (Helper.isString(fun)) {
-      assert(args.length === 0, 'Cannot evaluate a string with arguments');
-      return /** @type {string} */ (fun);
-    }
-    return `(${fun})(${args.map(serializeArgument).join(',')})`;
-
-    /**
-     * @param {*} arg
-     * @return {string}
-     */
-    function serializeArgument(arg) {
-      if (Object.is(arg, undefined))
-        return 'undefined';
-      return JSON.stringify(arg);
-    }
-  }
-
-  /**
-   * @param {!Protocol.Runtime.ExceptionDetails} exceptionDetails
-   * @return {string}
-   */
-  static getExceptionMessage(exceptionDetails) {
+const Errors_1 = require("./Errors");
+const debug = require("debug");
+const fs = require("fs");
+const util_1 = require("util");
+const openAsync = util_1.promisify(fs.open);
+const writeAsync = util_1.promisify(fs.write);
+const closeAsync = util_1.promisify(fs.close);
+exports.debugError = debug('puppeteer:error');
+function assert(value, message) {
+    if (!value)
+        throw new Error(message);
+}
+exports.assert = assert;
+function getExceptionMessage(exceptionDetails) {
     if (exceptionDetails.exception)
-      return exceptionDetails.exception.description || exceptionDetails.exception.value;
+        return exceptionDetails.exception.description || exceptionDetails.exception.value;
     let message = exceptionDetails.text;
     if (exceptionDetails.stackTrace) {
-      for (const callframe of exceptionDetails.stackTrace.callFrames) {
-        const location = callframe.url + ':' + callframe.lineNumber + ':' + callframe.columnNumber;
-        const functionName = callframe.functionName || '<anonymous>';
-        message += `\n    at ${functionName} (${location})`;
-      }
+        for (const callframe of exceptionDetails.stackTrace.callFrames) {
+            const location = callframe.url + ':' + callframe.lineNumber + ':' + callframe.columnNumber;
+            const functionName = callframe.functionName || '<anonymous>';
+            message += `\n    at ${functionName} (${location})`;
+        }
     }
     return message;
-  }
-
-  /**
-   * @param {!Protocol.Runtime.RemoteObject} remoteObject
-   * @return {*}
-   */
-  static valueFromRemoteObject(remoteObject) {
+}
+function valueFromRemoteObject(remoteObject) {
     assert(!remoteObject.objectId, 'Cannot extract value when objectId is given');
     if (remoteObject.unserializableValue) {
-      if (remoteObject.type === 'bigint' && typeof BigInt !== 'undefined')
-        return BigInt(remoteObject.unserializableValue.replace('n', ''));
-      switch (remoteObject.unserializableValue) {
-        case '-0':
-          return -0;
-        case 'NaN':
-          return NaN;
-        case 'Infinity':
-          return Infinity;
-        case '-Infinity':
-          return -Infinity;
-        default:
-          throw new Error('Unsupported unserializable value: ' + remoteObject.unserializableValue);
-      }
+        if (remoteObject.type === 'bigint' && typeof BigInt !== 'undefined')
+            return BigInt(remoteObject.unserializableValue.replace('n', ''));
+        switch (remoteObject.unserializableValue) {
+            case '-0':
+                return -0;
+            case 'NaN':
+                return NaN;
+            case 'Infinity':
+                return Infinity;
+            case '-Infinity':
+                return -Infinity;
+            default:
+                throw new Error('Unsupported unserializable value: ' + remoteObject.unserializableValue);
+        }
     }
     return remoteObject.value;
-  }
-
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   * @param {!Protocol.Runtime.RemoteObject} remoteObject
-   */
-  static async releaseObject(client, remoteObject) {
+}
+async function releaseObject(client, remoteObject) {
     if (!remoteObject.objectId)
-      return;
-    await client.send('Runtime.releaseObject', {objectId: remoteObject.objectId}).catch(error => {
-      // Exceptions might happen in case of a page been navigated or closed.
-      // Swallow these since they are harmless and we don't leak anything in this case.
-      debugError(error);
+        return;
+    await client.send('Runtime.releaseObject', { objectId: remoteObject.objectId }).catch(error => {
+        // Exceptions might happen in case of a page been navigated or closed.
+        // Swallow these since they are harmless and we don't leak anything in this case.
+        exports.debugError(error);
     });
-  }
-
-  /**
-   * @param {!Object} classType
-   */
-  static installAsyncStackHooks(classType) {
+}
+function installAsyncStackHooks(classType) {
     for (const methodName of Reflect.ownKeys(classType.prototype)) {
-      const method = Reflect.get(classType.prototype, methodName);
-      if (methodName === 'constructor' || typeof methodName !== 'string' || methodName.startsWith('_') || typeof method !== 'function' || method.constructor.name !== 'AsyncFunction')
-        continue;
-      Reflect.set(classType.prototype, methodName, function(...args) {
-        const syncStack = {};
-        Error.captureStackTrace(syncStack);
-        return method.call(this, ...args).catch(e => {
-          const stack = syncStack.stack.substring(syncStack.stack.indexOf('\n') + 1);
-          const clientStack = stack.substring(stack.indexOf('\n'));
-          if (e instanceof Error && e.stack && !e.stack.includes(clientStack))
-            e.stack += '\n  -- ASYNC --\n' + stack;
-          throw e;
+        const method = Reflect.get(classType.prototype, methodName);
+        if (methodName === 'constructor' || typeof methodName !== 'string' || methodName.startsWith('_') || typeof method !== 'function' || method.constructor.name !== 'AsyncFunction')
+            continue;
+        Reflect.set(classType.prototype, methodName, function (...args) {
+            const syncStack = {
+                stack: ''
+            };
+            Error.captureStackTrace(syncStack);
+            return method.call(this, ...args).catch(error => {
+                const stack = syncStack.stack.substring(syncStack.stack.indexOf('\n') + 1);
+                const clientStack = stack.substring(stack.indexOf('\n'));
+                if (error instanceof Error && error.stack && !error.stack.includes(clientStack))
+                    error.stack += '\n  -- ASYNC --\n' + stack;
+                throw error;
+            });
         });
-      });
     }
-  }
-
-  /**
-   * @param {!NodeJS.EventEmitter} emitter
-   * @param {(string|symbol)} eventName
-   * @param {function(?):void} handler
-   * @return {{emitter: !NodeJS.EventEmitter, eventName: (string|symbol), handler: function(?)}}
-   */
-  static addEventListener(emitter, eventName, handler) {
+}
+function addEventListener(emitter, eventName, handler) {
     emitter.on(eventName, handler);
     return { emitter, eventName, handler };
-  }
-
-  /**
-   * @param {!Array<{emitter: !NodeJS.EventEmitter, eventName: (string|symbol), handler: function(?):void}>} listeners
-   */
-  static removeEventListeners(listeners) {
+}
+function removeEventListeners(listeners) {
     for (const listener of listeners)
-      listener.emitter.removeListener(listener.eventName, listener.handler);
-    listeners.splice(0, listeners.length);
-  }
-
-  /**
-   * @param {!Object} obj
-   * @return {boolean}
-   */
-  static isString(obj) {
+        listener.emitter.removeListener(listener.eventName, listener.handler);
+    listeners.length = 0;
+}
+function isString(obj) {
     return typeof obj === 'string' || obj instanceof String;
-  }
-
-  /**
-   * @param {!Object} obj
-   * @return {boolean}
-   */
-  static isNumber(obj) {
+}
+function isNumber(obj) {
     return typeof obj === 'number' || obj instanceof Number;
-  }
-
-  /**
-   * @param {function} nodeFunction
-   * @return {function}
-   */
-  static promisify(nodeFunction) {
-    function promisified(...args) {
-      return new Promise((resolve, reject) => {
-        function callback(err, ...result) {
-          if (err)
-            return reject(err);
-          if (result.length === 1)
-            return resolve(result[0]);
-          return resolve(result);
-        }
-        nodeFunction.call(null, ...args, callback);
-      });
-    }
-    return promisified;
-  }
-
-  /**
-   * @param {!NodeJS.EventEmitter} emitter
-   * @param {(string|symbol)} eventName
-   * @param {function} predicate
-   * @param {number} timeout
-   * @param {!Promise<!Error>} abortPromise
-   * @return {!Promise}
-   */
-  static async waitForEvent(emitter, eventName, predicate, timeout, abortPromise) {
+}
+async function waitForEvent(emitter, eventName, predicate, timeout, abortPromise) {
     let eventTimeout, resolveCallback, rejectCallback;
     const promise = new Promise((resolve, reject) => {
-      resolveCallback = resolve;
-      rejectCallback = reject;
+        resolveCallback = resolve;
+        rejectCallback = reject;
     });
-    const listener = Helper.addEventListener(emitter, eventName, event => {
-      if (!predicate(event))
-        return;
-      resolveCallback(event);
+    const listener = addEventListener(emitter, eventName, event => {
+        if (!predicate(event))
+            return;
+        resolveCallback(event);
     });
     if (timeout) {
-      eventTimeout = setTimeout(() => {
-        rejectCallback(new TimeoutError('Timeout exceeded while waiting for event'));
-      }, timeout);
+        eventTimeout = setTimeout(() => {
+            rejectCallback(new Errors_1.TimeoutError('Timeout exceeded while waiting for event'));
+        }, timeout);
     }
     function cleanup() {
-      Helper.removeEventListeners([listener]);
-      clearTimeout(eventTimeout);
+        removeEventListeners([listener]);
+        clearTimeout(eventTimeout);
     }
     const result = await Promise.race([promise, abortPromise]).then(r => {
-      cleanup();
-      return r;
-    }, e => {
-      cleanup();
-      throw e;
+        cleanup();
+        return r;
+    }, error => {
+        cleanup();
+        throw error;
     });
     if (result instanceof Error)
-      throw result;
+        throw result;
     return result;
-  }
-
-  /**
-   * @template T
-   * @param {!Promise<T>} promise
-   * @param {string} taskName
-   * @param {number} timeout
-   * @return {!Promise<T>}
-   */
-  static async waitWithTimeout(promise, taskName, timeout) {
+}
+function evaluationString(fun, ...args) {
+    if (isString(fun)) {
+        assert(args.length === 0, 'Cannot evaluate a string with arguments');
+        return fun;
+    }
+    function serializeArgument(arg) {
+        if (Object.is(arg, undefined))
+            return 'undefined';
+        return JSON.stringify(arg);
+    }
+    return `(${fun})(${args.map(serializeArgument).join(',')})`;
+}
+async function waitWithTimeout(promise, taskName, timeout) {
     let reject;
-    const timeoutError = new TimeoutError(`waiting for ${taskName} failed: timeout ${timeout}ms exceeded`);
+    const timeoutError = new Errors_1.TimeoutError(`waiting for ${taskName} failed: timeout ${timeout}ms exceeded`);
     const timeoutPromise = new Promise((resolve, x) => reject = x);
     let timeoutTimer = null;
     if (timeout)
-      timeoutTimer = setTimeout(() => reject(timeoutError), timeout);
+        timeoutTimer = setTimeout(() => reject(timeoutError), timeout);
     try {
-      return await Promise.race([promise, timeoutPromise]);
-    } finally {
-      if (timeoutTimer)
-        clearTimeout(timeoutTimer);
+        return await Promise.race([promise, timeoutPromise]);
     }
-  }
-
-  /**
-   * @param {!Puppeteer.CDPSession} client
-   * @param {string} handle
-   * @param {?string} path
-   * @return {!Promise<!Buffer>}
-   */
-  static async readProtocolStream(client, handle, path) {
+    finally {
+        if (timeoutTimer)
+            clearTimeout(timeoutTimer);
+    }
+}
+async function readProtocolStream(client, handle, path) {
     let eof = false;
     let file;
     if (path)
-      file = await openAsync(path, 'w');
+        file = await openAsync(path, 'w');
     const bufs = [];
     while (!eof) {
-      const response = await client.send('IO.read', {handle});
-      eof = response.eof;
-      const buf = Buffer.from(response.data, response.base64Encoded ? 'base64' : undefined);
-      bufs.push(buf);
-      if (path)
-        await writeAsync(file, buf);
+        const response = await client.send('IO.read', { handle });
+        eof = response.eof;
+        const buf = Buffer.from(response.data, response.base64Encoded ? 'base64' : undefined);
+        bufs.push(buf);
+        if (path)
+            await writeAsync(file, buf);
     }
     if (path)
-      await closeAsync(file);
-    await client.send('IO.close', {handle});
+        await closeAsync(file);
+    await client.send('IO.close', { handle });
     let resultBuffer = null;
     try {
-      resultBuffer = Buffer.concat(bufs);
-    } finally {
-      return resultBuffer;
+        resultBuffer = Buffer.concat(bufs);
     }
-  }
+    finally {
+        return resultBuffer;
+    }
 }
-
-const openAsync = Helper.promisify(fs.open);
-const writeAsync = Helper.promisify(fs.write);
-const closeAsync = Helper.promisify(fs.close);
-
-/**
- * @param {*} value
- * @param {string=} message
- */
-function assert(value, message) {
-  if (!value)
-    throw new Error(message);
-}
-
-module.exports = {
-  helper: Helper,
-  assert,
-  debugError
+exports.helper = {
+    promisify: util_1.promisify,
+    evaluationString,
+    readProtocolStream,
+    waitWithTimeout,
+    waitForEvent,
+    isString,
+    isNumber,
+    addEventListener,
+    removeEventListeners,
+    valueFromRemoteObject,
+    installAsyncStackHooks,
+    getExceptionMessage,
+    releaseObject,
 };
diff --git a/node_modules/puppeteer/lib/protocol.d.ts b/node_modules/puppeteer/lib/protocol.d.ts
new file mode 100644
index 0000000..40febf5
--- /dev/null
+++ b/node_modules/puppeteer/lib/protocol.d.ts
@@ -0,0 +1,15275 @@
+// This is generated from /utils/protocol-types-generator/index.js
+  type binary = string;
+declare global {
+  module Protocol {
+    export module Accessibility {
+        /**
+         * Unique accessibility node identifier.
+         */
+        export type AXNodeId = string;
+        /**
+         * Enum of possible property types.
+         */
+        export type AXValueType = "boolean"|"tristate"|"booleanOrUndefined"|"idref"|"idrefList"|"integer"|"node"|"nodeList"|"number"|"string"|"computedString"|"token"|"tokenList"|"domRelation"|"role"|"internalRole"|"valueUndefined";
+        /**
+         * Enum of possible property sources.
+         */
+        export type AXValueSourceType = "attribute"|"implicit"|"style"|"contents"|"placeholder"|"relatedElement";
+        /**
+         * Enum of possible native property sources (as a subtype of a particular AXValueSourceType).
+         */
+        export type AXValueNativeSourceType = "figcaption"|"label"|"labelfor"|"labelwrapped"|"legend"|"tablecaption"|"title"|"other";
+        /**
+         * A single source for a computed AX property.
+         */
+        export interface AXValueSource {
+            /**
+             * What type of source this is.
+             */
+            type: AXValueSourceType;
+            /**
+             * The value of this property source.
+             */
+            value?: AXValue;
+            /**
+             * The name of the relevant attribute, if any.
+             */
+            attribute?: string;
+            /**
+             * The value of the relevant attribute, if any.
+             */
+            attributeValue?: AXValue;
+            /**
+             * Whether this source is superseded by a higher priority source.
+             */
+            superseded?: boolean;
+            /**
+             * The native markup source for this value, e.g. a <label> element.
+             */
+            nativeSource?: AXValueNativeSourceType;
+            /**
+             * The value, such as a node or node list, of the native source.
+             */
+            nativeSourceValue?: AXValue;
+            /**
+             * Whether the value for this property is invalid.
+             */
+            invalid?: boolean;
+            /**
+             * Reason for the value being invalid, if it is.
+             */
+            invalidReason?: string;
+        }
+        export interface AXRelatedNode {
+            /**
+             * The BackendNodeId of the related DOM node.
+             */
+            backendDOMNodeId: DOM.BackendNodeId;
+            /**
+             * The IDRef value provided, if any.
+             */
+            idref?: string;
+            /**
+             * The text alternative of this node in the current context.
+             */
+            text?: string;
+        }
+        export interface AXProperty {
+            /**
+             * The name of this property.
+             */
+            name: AXPropertyName;
+            /**
+             * The value of this property.
+             */
+            value: AXValue;
+        }
+        /**
+         * A single computed AX property.
+         */
+        export interface AXValue {
+            /**
+             * The type of this value.
+             */
+            type: AXValueType;
+            /**
+             * The computed value of this property.
+             */
+            value?: any;
+            /**
+             * One or more related nodes, if applicable.
+             */
+            relatedNodes?: AXRelatedNode[];
+            /**
+             * The sources which contributed to the computation of this property.
+             */
+            sources?: AXValueSource[];
+        }
+        /**
+         * Values of AXProperty name:
+- from 'busy' to 'roledescription': states which apply to every AX node
+- from 'live' to 'root': attributes which apply to nodes in live regions
+- from 'autocomplete' to 'valuetext': attributes which apply to widgets
+- from 'checked' to 'selected': states which apply to widgets
+- from 'activedescendant' to 'owns' - relationships between elements other than parent/child/sibling.
+         */
+        export type AXPropertyName = "busy"|"disabled"|"editable"|"focusable"|"focused"|"hidden"|"hiddenRoot"|"invalid"|"keyshortcuts"|"settable"|"roledescription"|"live"|"atomic"|"relevant"|"root"|"autocomplete"|"hasPopup"|"level"|"multiselectable"|"orientation"|"multiline"|"readonly"|"required"|"valuemin"|"valuemax"|"valuetext"|"checked"|"expanded"|"modal"|"pressed"|"selected"|"activedescendant"|"controls"|"describedby"|"details"|"errormessage"|"flowto"|"labelledby"|"owns";
+        /**
+         * A node in the accessibility tree.
+         */
+        export interface AXNode {
+            /**
+             * Unique identifier for this node.
+             */
+            nodeId: AXNodeId;
+            /**
+             * Whether this node is ignored for accessibility
+             */
+            ignored: boolean;
+            /**
+             * Collection of reasons why this node is hidden.
+             */
+            ignoredReasons?: AXProperty[];
+            /**
+             * This `Node`'s role, whether explicit or implicit.
+             */
+            role?: AXValue;
+            /**
+             * The accessible name for this `Node`.
+             */
+            name?: AXValue;
+            /**
+             * The accessible description for this `Node`.
+             */
+            description?: AXValue;
+            /**
+             * The value for this `Node`.
+             */
+            value?: AXValue;
+            /**
+             * All other properties
+             */
+            properties?: AXProperty[];
+            /**
+             * IDs for each of this node's child nodes.
+             */
+            childIds?: AXNodeId[];
+            /**
+             * The backend ID for the associated DOM node, if any.
+             */
+            backendDOMNodeId?: DOM.BackendNodeId;
+        }
+        
+        
+        /**
+         * Disables the accessibility domain.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables the accessibility domain which causes `AXNodeId`s to remain consistent between method calls.
+This turns on accessibility for the page, which can impact performance until accessibility is disabled.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Fetches the accessibility node and partial accessibility tree for this DOM node, if it exists.
+         */
+        export type getPartialAXTreeParameters = {
+            /**
+             * Identifier of the node to get the partial accessibility tree for.
+             */
+            nodeId?: DOM.NodeId;
+            /**
+             * Identifier of the backend node to get the partial accessibility tree for.
+             */
+            backendNodeId?: DOM.BackendNodeId;
+            /**
+             * JavaScript object id of the node wrapper to get the partial accessibility tree for.
+             */
+            objectId?: Runtime.RemoteObjectId;
+            /**
+             * Whether to fetch this nodes ancestors, siblings and children. Defaults to true.
+             */
+            fetchRelatives?: boolean;
+        }
+        export type getPartialAXTreeReturnValue = {
+            /**
+             * The `Accessibility.AXNode` for this DOM node, if it exists, plus its ancestors, siblings and
+children, if requested.
+             */
+            nodes: AXNode[];
+        }
+        /**
+         * Fetches the entire accessibility tree
+         */
+        export type getFullAXTreeParameters = {
+        }
+        export type getFullAXTreeReturnValue = {
+            nodes: AXNode[];
+        }
+    }
+    
+    export module Animation {
+        /**
+         * Animation instance.
+         */
+        export interface Animation {
+            /**
+             * `Animation`'s id.
+             */
+            id: string;
+            /**
+             * `Animation`'s name.
+             */
+            name: string;
+            /**
+             * `Animation`'s internal paused state.
+             */
+            pausedState: boolean;
+            /**
+             * `Animation`'s play state.
+             */
+            playState: string;
+            /**
+             * `Animation`'s playback rate.
+             */
+            playbackRate: number;
+            /**
+             * `Animation`'s start time.
+             */
+            startTime: number;
+            /**
+             * `Animation`'s current time.
+             */
+            currentTime: number;
+            /**
+             * Animation type of `Animation`.
+             */
+            type: "CSSTransition"|"CSSAnimation"|"WebAnimation";
+            /**
+             * `Animation`'s source animation node.
+             */
+            source?: AnimationEffect;
+            /**
+             * A unique ID for `Animation` representing the sources that triggered this CSS
+animation/transition.
+             */
+            cssId?: string;
+        }
+        /**
+         * AnimationEffect instance
+         */
+        export interface AnimationEffect {
+            /**
+             * `AnimationEffect`'s delay.
+             */
+            delay: number;
+            /**
+             * `AnimationEffect`'s end delay.
+             */
+            endDelay: number;
+            /**
+             * `AnimationEffect`'s iteration start.
+             */
+            iterationStart: number;
+            /**
+             * `AnimationEffect`'s iterations.
+             */
+            iterations: number;
+            /**
+             * `AnimationEffect`'s iteration duration.
+             */
+            duration: number;
+            /**
+             * `AnimationEffect`'s playback direction.
+             */
+            direction: string;
+            /**
+             * `AnimationEffect`'s fill mode.
+             */
+            fill: string;
+            /**
+             * `AnimationEffect`'s target node.
+             */
+            backendNodeId?: DOM.BackendNodeId;
+            /**
+             * `AnimationEffect`'s keyframes.
+             */
+            keyframesRule?: KeyframesRule;
+            /**
+             * `AnimationEffect`'s timing function.
+             */
+            easing: string;
+        }
+        /**
+         * Keyframes Rule
+         */
+        export interface KeyframesRule {
+            /**
+             * CSS keyframed animation's name.
+             */
+            name?: string;
+            /**
+             * List of animation keyframes.
+             */
+            keyframes: KeyframeStyle[];
+        }
+        /**
+         * Keyframe Style
+         */
+        export interface KeyframeStyle {
+            /**
+             * Keyframe's time offset.
+             */
+            offset: string;
+            /**
+             * `AnimationEffect`'s timing function.
+             */
+            easing: string;
+        }
+        
+        /**
+         * Event for when an animation has been cancelled.
+         */
+        export type animationCanceledPayload = {
+            /**
+             * Id of the animation that was cancelled.
+             */
+            id: string;
+        }
+        /**
+         * Event for each animation that has been created.
+         */
+        export type animationCreatedPayload = {
+            /**
+             * Id of the animation that was created.
+             */
+            id: string;
+        }
+        /**
+         * Event for animation that has been started.
+         */
+        export type animationStartedPayload = {
+            /**
+             * Animation that was started.
+             */
+            animation: Animation;
+        }
+        
+        /**
+         * Disables animation domain notifications.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables animation domain notifications.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Returns the current time of the an animation.
+         */
+        export type getCurrentTimeParameters = {
+            /**
+             * Id of animation.
+             */
+            id: string;
+        }
+        export type getCurrentTimeReturnValue = {
+            /**
+             * Current time of the page.
+             */
+            currentTime: number;
+        }
+        /**
+         * Gets the playback rate of the document timeline.
+         */
+        export type getPlaybackRateParameters = {
+        }
+        export type getPlaybackRateReturnValue = {
+            /**
+             * Playback rate for animations on page.
+             */
+            playbackRate: number;
+        }
+        /**
+         * Releases a set of animations to no longer be manipulated.
+         */
+        export type releaseAnimationsParameters = {
+            /**
+             * List of animation ids to seek.
+             */
+            animations: string[];
+        }
+        export type releaseAnimationsReturnValue = {
+        }
+        /**
+         * Gets the remote object of the Animation.
+         */
+        export type resolveAnimationParameters = {
+            /**
+             * Animation id.
+             */
+            animationId: string;
+        }
+        export type resolveAnimationReturnValue = {
+            /**
+             * Corresponding remote object.
+             */
+            remoteObject: Runtime.RemoteObject;
+        }
+        /**
+         * Seek a set of animations to a particular time within each animation.
+         */
+        export type seekAnimationsParameters = {
+            /**
+             * List of animation ids to seek.
+             */
+            animations: string[];
+            /**
+             * Set the current time of each animation.
+             */
+            currentTime: number;
+        }
+        export type seekAnimationsReturnValue = {
+        }
+        /**
+         * Sets the paused state of a set of animations.
+         */
+        export type setPausedParameters = {
+            /**
+             * Animations to set the pause state of.
+             */
+            animations: string[];
+            /**
+             * Paused state to set to.
+             */
+            paused: boolean;
+        }
+        export type setPausedReturnValue = {
+        }
+        /**
+         * Sets the playback rate of the document timeline.
+         */
+        export type setPlaybackRateParameters = {
+            /**
+             * Playback rate for animations on page
+             */
+            playbackRate: number;
+        }
+        export type setPlaybackRateReturnValue = {
+        }
+        /**
+         * Sets the timing of an animation node.
+         */
+        export type setTimingParameters = {
+            /**
+             * Animation id.
+             */
+            animationId: string;
+            /**
+             * Duration of the animation.
+             */
+            duration: number;
+            /**
+             * Delay of the animation.
+             */
+            delay: number;
+        }
+        export type setTimingReturnValue = {
+        }
+    }
+    
+    export module ApplicationCache {
+        /**
+         * Detailed application cache resource information.
+         */
+        export interface ApplicationCacheResource {
+            /**
+             * Resource url.
+             */
+            url: string;
+            /**
+             * Resource size.
+             */
+            size: number;
+            /**
+             * Resource type.
+             */
+            type: string;
+        }
+        /**
+         * Detailed application cache information.
+         */
+        export interface ApplicationCache {
+            /**
+             * Manifest URL.
+             */
+            manifestURL: string;
+            /**
+             * Application cache size.
+             */
+            size: number;
+            /**
+             * Application cache creation time.
+             */
+            creationTime: number;
+            /**
+             * Application cache update time.
+             */
+            updateTime: number;
+            /**
+             * Application cache resources.
+             */
+            resources: ApplicationCacheResource[];
+        }
+        /**
+         * Frame identifier - manifest URL pair.
+         */
+        export interface FrameWithManifest {
+            /**
+             * Frame identifier.
+             */
+            frameId: Page.FrameId;
+            /**
+             * Manifest URL.
+             */
+            manifestURL: string;
+            /**
+             * Application cache status.
+             */
+            status: number;
+        }
+        
+        export type applicationCacheStatusUpdatedPayload = {
+            /**
+             * Identifier of the frame containing document whose application cache updated status.
+             */
+            frameId: Page.FrameId;
+            /**
+             * Manifest URL.
+             */
+            manifestURL: string;
+            /**
+             * Updated application cache status.
+             */
+            status: number;
+        }
+        export type networkStateUpdatedPayload = {
+            isNowOnline: boolean;
+        }
+        
+        /**
+         * Enables application cache domain notifications.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Returns relevant application cache data for the document in given frame.
+         */
+        export type getApplicationCacheForFrameParameters = {
+            /**
+             * Identifier of the frame containing document whose application cache is retrieved.
+             */
+            frameId: Page.FrameId;
+        }
+        export type getApplicationCacheForFrameReturnValue = {
+            /**
+             * Relevant application cache data for the document in given frame.
+             */
+            applicationCache: ApplicationCache;
+        }
+        /**
+         * Returns array of frame identifiers with manifest urls for each frame containing a document
+associated with some application cache.
+         */
+        export type getFramesWithManifestsParameters = {
+        }
+        export type getFramesWithManifestsReturnValue = {
+            /**
+             * Array of frame identifiers with manifest urls for each frame containing a document
+associated with some application cache.
+             */
+            frameIds: FrameWithManifest[];
+        }
+        /**
+         * Returns manifest URL for document in the given frame.
+         */
+        export type getManifestForFrameParameters = {
+            /**
+             * Identifier of the frame containing document whose manifest is retrieved.
+             */
+            frameId: Page.FrameId;
+        }
+        export type getManifestForFrameReturnValue = {
+            /**
+             * Manifest URL for document in the given frame.
+             */
+            manifestURL: string;
+        }
+    }
+    
+    /**
+     * Audits domain allows investigation of page violations and possible improvements.
+     */
+    export module Audits {
+        
+        
+        /**
+         * Returns the response body and size if it were re-encoded with the specified settings. Only
+applies to images.
+         */
+        export type getEncodedResponseParameters = {
+            /**
+             * Identifier of the network request to get content for.
+             */
+            requestId: Network.RequestId;
+            /**
+             * The encoding to use.
+             */
+            encoding: "webp"|"jpeg"|"png";
+            /**
+             * The quality of the encoding (0-1). (defaults to 1)
+             */
+            quality?: number;
+            /**
+             * Whether to only return the size information (defaults to false).
+             */
+            sizeOnly?: boolean;
+        }
+        export type getEncodedResponseReturnValue = {
+            /**
+             * The encoded body as a base64 string. Omitted if sizeOnly is true.
+             */
+            body?: binary;
+            /**
+             * Size before re-encoding.
+             */
+            originalSize: number;
+            /**
+             * Size after re-encoding.
+             */
+            encodedSize: number;
+        }
+    }
+    
+    /**
+     * Defines events for background web platform features.
+     */
+    export module BackgroundService {
+        /**
+         * The Background Service that will be associated with the commands/events.
+Every Background Service operates independently, but they share the same
+API.
+         */
+        export type ServiceName = "backgroundFetch"|"backgroundSync"|"pushMessaging"|"notifications"|"paymentHandler"|"periodicBackgroundSync";
+        /**
+         * A key-value pair for additional event information to pass along.
+         */
+        export interface EventMetadata {
+            key: string;
+            value: string;
+        }
+        export interface BackgroundServiceEvent {
+            /**
+             * Timestamp of the event (in seconds).
+             */
+            timestamp: Network.TimeSinceEpoch;
+            /**
+             * The origin this event belongs to.
+             */
+            origin: string;
+            /**
+             * The Service Worker ID that initiated the event.
+             */
+            serviceWorkerRegistrationId: ServiceWorker.RegistrationID;
+            /**
+             * The Background Service this event belongs to.
+             */
+            service: ServiceName;
+            /**
+             * A description of the event.
+             */
+            eventName: string;
+            /**
+             * An identifier that groups related events together.
+             */
+            instanceId: string;
+            /**
+             * A list of event-specific information.
+             */
+            eventMetadata: EventMetadata[];
+        }
+        
+        /**
+         * Called when the recording state for the service has been updated.
+         */
+        export type recordingStateChangedPayload = {
+            isRecording: boolean;
+            service: ServiceName;
+        }
+        /**
+         * Called with all existing backgroundServiceEvents when enabled, and all new
+events afterwards if enabled and recording.
+         */
+        export type backgroundServiceEventReceivedPayload = {
+            backgroundServiceEvent: BackgroundServiceEvent;
+        }
+        
+        /**
+         * Enables event updates for the service.
+         */
+        export type startObservingParameters = {
+            service: ServiceName;
+        }
+        export type startObservingReturnValue = {
+        }
+        /**
+         * Disables event updates for the service.
+         */
+        export type stopObservingParameters = {
+            service: ServiceName;
+        }
+        export type stopObservingReturnValue = {
+        }
+        /**
+         * Set the recording state for the service.
+         */
+        export type setRecordingParameters = {
+            shouldRecord: boolean;
+            service: ServiceName;
+        }
+        export type setRecordingReturnValue = {
+        }
+        /**
+         * Clears all stored data for the service.
+         */
+        export type clearEventsParameters = {
+            service: ServiceName;
+        }
+        export type clearEventsReturnValue = {
+        }
+    }
+    
+    /**
+     * The Browser domain defines methods and events for browser managing.
+     */
+    export module Browser {
+        export type BrowserContextID = string;
+        export type WindowID = number;
+        /**
+         * The state of the browser window.
+         */
+        export type WindowState = "normal"|"minimized"|"maximized"|"fullscreen";
+        /**
+         * Browser window bounds information
+         */
+        export interface Bounds {
+            /**
+             * The offset from the left edge of the screen to the window in pixels.
+             */
+            left?: number;
+            /**
+             * The offset from the top edge of the screen to the window in pixels.
+             */
+            top?: number;
+            /**
+             * The window width in pixels.
+             */
+            width?: number;
+            /**
+             * The window height in pixels.
+             */
+            height?: number;
+            /**
+             * The window state. Default to normal.
+             */
+            windowState?: WindowState;
+        }
+        export type PermissionType = "accessibilityEvents"|"audioCapture"|"backgroundSync"|"backgroundFetch"|"clipboardReadWrite"|"clipboardSanitizedWrite"|"durableStorage"|"flash"|"geolocation"|"midi"|"midiSysex"|"nfc"|"notifications"|"paymentHandler"|"periodicBackgroundSync"|"protectedMediaIdentifier"|"sensors"|"videoCapture"|"idleDetection"|"wakeLockScreen"|"wakeLockSystem";
+        export type PermissionSetting = "granted"|"denied"|"prompt";
+        /**
+         * Definition of PermissionDescriptor defined in the Permissions API:
+https://w3c.github.io/permissions/#dictdef-permissiondescriptor.
+         */
+        export interface PermissionDescriptor {
+            /**
+             * Name of permission.
+See https://cs.chromium.org/chromium/src/third_party/blink/renderer/modules/permissions/permission_descriptor.idl for valid permission names.
+             */
+            name: string;
+            /**
+             * For "midi" permission, may also specify sysex control.
+             */
+            sysex?: boolean;
+            /**
+             * For "push" permission, may specify userVisibleOnly.
+Note that userVisibleOnly = true is the only currently supported type.
+             */
+            userVisibleOnly?: boolean;
+            /**
+             * For "wake-lock" permission, must specify type as either "screen" or "system".
+             */
+            type?: string;
+            /**
+             * For "clipboard" permission, may specify allowWithoutSanitization.
+             */
+            allowWithoutSanitization?: boolean;
+        }
+        /**
+         * Chrome histogram bucket.
+         */
+        export interface Bucket {
+            /**
+             * Minimum value (inclusive).
+             */
+            low: number;
+            /**
+             * Maximum value (exclusive).
+             */
+            high: number;
+            /**
+             * Number of samples.
+             */
+            count: number;
+        }
+        /**
+         * Chrome histogram.
+         */
+        export interface Histogram {
+            /**
+             * Name.
+             */
+            name: string;
+            /**
+             * Sum of sample values.
+             */
+            sum: number;
+            /**
+             * Total number of samples.
+             */
+            count: number;
+            /**
+             * Buckets.
+             */
+            buckets: Bucket[];
+        }
+        
+        
+        /**
+         * Set permission settings for given origin.
+         */
+        export type setPermissionParameters = {
+            /**
+             * Origin the permission applies to.
+             */
+            origin: string;
+            /**
+             * Descriptor of permission to override.
+             */
+            permission: PermissionDescriptor;
+            /**
+             * Setting of the permission.
+             */
+            setting: PermissionSetting;
+            /**
+             * Context to override. When omitted, default browser context is used.
+             */
+            browserContextId?: BrowserContextID;
+        }
+        export type setPermissionReturnValue = {
+        }
+        /**
+         * Grant specific permissions to the given origin and reject all others.
+         */
+        export type grantPermissionsParameters = {
+            origin: string;
+            permissions: PermissionType[];
+            /**
+             * BrowserContext to override permissions. When omitted, default browser context is used.
+             */
+            browserContextId?: BrowserContextID;
+        }
+        export type grantPermissionsReturnValue = {
+        }
+        /**
+         * Reset all permission management for all origins.
+         */
+        export type resetPermissionsParameters = {
+            /**
+             * BrowserContext to reset permissions. When omitted, default browser context is used.
+             */
+            browserContextId?: BrowserContextID;
+        }
+        export type resetPermissionsReturnValue = {
+        }
+        /**
+         * Close browser gracefully.
+         */
+        export type closeParameters = {
+        }
+        export type closeReturnValue = {
+        }
+        /**
+         * Crashes browser on the main thread.
+         */
+        export type crashParameters = {
+        }
+        export type crashReturnValue = {
+        }
+        /**
+         * Crashes GPU process.
+         */
+        export type crashGpuProcessParameters = {
+        }
+        export type crashGpuProcessReturnValue = {
+        }
+        /**
+         * Returns version information.
+         */
+        export type getVersionParameters = {
+        }
+        export type getVersionReturnValue = {
+            /**
+             * Protocol version.
+             */
+            protocolVersion: string;
+            /**
+             * Product name.
+             */
+            product: string;
+            /**
+             * Product revision.
+             */
+            revision: string;
+            /**
+             * User-Agent.
+             */
+            userAgent: string;
+            /**
+             * V8 version.
+             */
+            jsVersion: string;
+        }
+        /**
+         * Returns the command line switches for the browser process if, and only if
+--enable-automation is on the commandline.
+         */
+        export type getBrowserCommandLineParameters = {
+        }
+        export type getBrowserCommandLineReturnValue = {
+            /**
+             * Commandline parameters
+             */
+            arguments: string[];
+        }
+        /**
+         * Get Chrome histograms.
+         */
+        export type getHistogramsParameters = {
+            /**
+             * Requested substring in name. Only histograms which have query as a
+substring in their name are extracted. An empty or absent query returns
+all histograms.
+             */
+            query?: string;
+            /**
+             * If true, retrieve delta since last call.
+             */
+            delta?: boolean;
+        }
+        export type getHistogramsReturnValue = {
+            /**
+             * Histograms.
+             */
+            histograms: Histogram[];
+        }
+        /**
+         * Get a Chrome histogram by name.
+         */
+        export type getHistogramParameters = {
+            /**
+             * Requested histogram name.
+             */
+            name: string;
+            /**
+             * If true, retrieve delta since last call.
+             */
+            delta?: boolean;
+        }
+        export type getHistogramReturnValue = {
+            /**
+             * Histogram.
+             */
+            histogram: Histogram;
+        }
+        /**
+         * Get position and size of the browser window.
+         */
+        export type getWindowBoundsParameters = {
+            /**
+             * Browser window id.
+             */
+            windowId: WindowID;
+        }
+        export type getWindowBoundsReturnValue = {
+            /**
+             * Bounds information of the window. When window state is 'minimized', the restored window
+position and size are returned.
+             */
+            bounds: Bounds;
+        }
+        /**
+         * Get the browser window that contains the devtools target.
+         */
+        export type getWindowForTargetParameters = {
+            /**
+             * Devtools agent host id. If called as a part of the session, associated targetId is used.
+             */
+            targetId?: Target.TargetID;
+        }
+        export type getWindowForTargetReturnValue = {
+            /**
+             * Browser window id.
+             */
+            windowId: WindowID;
+            /**
+             * Bounds information of the window. When window state is 'minimized', the restored window
+position and size are returned.
+             */
+            bounds: Bounds;
+        }
+        /**
+         * Set position and/or size of the browser window.
+         */
+        export type setWindowBoundsParameters = {
+            /**
+             * Browser window id.
+             */
+            windowId: WindowID;
+            /**
+             * New window bounds. The 'minimized', 'maximized' and 'fullscreen' states cannot be combined
+with 'left', 'top', 'width' or 'height'. Leaves unspecified fields unchanged.
+             */
+            bounds: Bounds;
+        }
+        export type setWindowBoundsReturnValue = {
+        }
+        /**
+         * Set dock tile details, platform-specific.
+         */
+        export type setDockTileParameters = {
+            badgeLabel?: string;
+            /**
+             * Png encoded image.
+             */
+            image?: binary;
+        }
+        export type setDockTileReturnValue = {
+        }
+    }
+    
+    /**
+     * This domain exposes CSS read/write operations. All CSS objects (stylesheets, rules, and styles)
+have an associated `id` used in subsequent operations on the related object. Each object type has
+a specific `id` structure, and those are not interchangeable between objects of different kinds.
+CSS objects can be loaded using the `get*ForNode()` calls (which accept a DOM node id). A client
+can also keep track of stylesheets via the `styleSheetAdded`/`styleSheetRemoved` events and
+subsequently load the required stylesheet contents using the `getStyleSheet[Text]()` methods.
+     */
+    export module CSS {
+        export type StyleSheetId = string;
+        /**
+         * Stylesheet type: "injected" for stylesheets injected via extension, "user-agent" for user-agent
+stylesheets, "inspector" for stylesheets created by the inspector (i.e. those holding the "via
+inspector" rules), "regular" for regular stylesheets.
+         */
+        export type StyleSheetOrigin = "injected"|"user-agent"|"inspector"|"regular";
+        /**
+         * CSS rule collection for a single pseudo style.
+         */
+        export interface PseudoElementMatches {
+            /**
+             * Pseudo element type.
+             */
+            pseudoType: DOM.PseudoType;
+            /**
+             * Matches of CSS rules applicable to the pseudo style.
+             */
+            matches: RuleMatch[];
+        }
+        /**
+         * Inherited CSS rule collection from ancestor node.
+         */
+        export interface InheritedStyleEntry {
+            /**
+             * The ancestor node's inline style, if any, in the style inheritance chain.
+             */
+            inlineStyle?: CSSStyle;
+            /**
+             * Matches of CSS rules matching the ancestor node in the style inheritance chain.
+             */
+            matchedCSSRules: RuleMatch[];
+        }
+        /**
+         * Match data for a CSS rule.
+         */
+        export interface RuleMatch {
+            /**
+             * CSS rule in the match.
+             */
+            rule: CSSRule;
+            /**
+             * Matching selector indices in the rule's selectorList selectors (0-based).
+             */
+            matchingSelectors: number[];
+        }
+        /**
+         * Data for a simple selector (these are delimited by commas in a selector list).
+         */
+        export interface Value {
+            /**
+             * Value text.
+             */
+            text: string;
+            /**
+             * Value range in the underlying resource (if available).
+             */
+            range?: SourceRange;
+        }
+        /**
+         * Selector list data.
+         */
+        export interface SelectorList {
+            /**
+             * Selectors in the list.
+             */
+            selectors: Value[];
+            /**
+             * Rule selector text.
+             */
+            text: string;
+        }
+        /**
+         * CSS stylesheet metainformation.
+         */
+        export interface CSSStyleSheetHeader {
+            /**
+             * The stylesheet identifier.
+             */
+            styleSheetId: StyleSheetId;
+            /**
+             * Owner frame identifier.
+             */
+            frameId: Page.FrameId;
+            /**
+             * Stylesheet resource URL.
+             */
+            sourceURL: string;
+            /**
+             * URL of source map associated with the stylesheet (if any).
+             */
+            sourceMapURL?: string;
+            /**
+             * Stylesheet origin.
+             */
+            origin: StyleSheetOrigin;
+            /**
+             * Stylesheet title.
+             */
+            title: string;
+            /**
+             * The backend id for the owner node of the stylesheet.
+             */
+            ownerNode?: DOM.BackendNodeId;
+            /**
+             * Denotes whether the stylesheet is disabled.
+             */
+            disabled: boolean;
+            /**
+             * Whether the sourceURL field value comes from the sourceURL comment.
+             */
+            hasSourceURL?: boolean;
+            /**
+             * Whether this stylesheet is created for STYLE tag by parser. This flag is not set for
+document.written STYLE tags.
+             */
+            isInline: boolean;
+            /**
+             * Line offset of the stylesheet within the resource (zero based).
+             */
+            startLine: number;
+            /**
+             * Column offset of the stylesheet within the resource (zero based).
+             */
+            startColumn: number;
+            /**
+             * Size of the content (in characters).
+             */
+            length: number;
+            /**
+             * Line offset of the end of the stylesheet within the resource (zero based).
+             */
+            endLine: number;
+            /**
+             * Column offset of the end of the stylesheet within the resource (zero based).
+             */
+            endColumn: number;
+        }
+        /**
+         * CSS rule representation.
+         */
+        export interface CSSRule {
+            /**
+             * The css style sheet identifier (absent for user agent stylesheet and user-specified
+stylesheet rules) this rule came from.
+             */
+            styleSheetId?: StyleSheetId;
+            /**
+             * Rule selector data.
+             */
+            selectorList: SelectorList;
+            /**
+             * Parent stylesheet's origin.
+             */
+            origin: StyleSheetOrigin;
+            /**
+             * Associated style declaration.
+             */
+            style: CSSStyle;
+            /**
+             * Media list array (for rules involving media queries). The array enumerates media queries
+starting with the innermost one, going outwards.
+             */
+            media?: CSSMedia[];
+        }
+        /**
+         * CSS coverage information.
+         */
+        export interface RuleUsage {
+            /**
+             * The css style sheet identifier (absent for user agent stylesheet and user-specified
+stylesheet rules) this rule came from.
+             */
+            styleSheetId: StyleSheetId;
+            /**
+             * Offset of the start of the rule (including selector) from the beginning of the stylesheet.
+             */
+            startOffset: number;
+            /**
+             * Offset of the end of the rule body from the beginning of the stylesheet.
+             */
+            endOffset: number;
+            /**
+             * Indicates whether the rule was actually used by some element in the page.
+             */
+            used: boolean;
+        }
+        /**
+         * Text range within a resource. All numbers are zero-based.
+         */
+        export interface SourceRange {
+            /**
+             * Start line of range.
+             */
+            startLine: number;
+            /**
+             * Start column of range (inclusive).
+             */
+            startColumn: number;
+            /**
+             * End line of range
+             */
+            endLine: number;
+            /**
+             * End column of range (exclusive).
+             */
+            endColumn: number;
+        }
+        export interface ShorthandEntry {
+            /**
+             * Shorthand name.
+             */
+            name: string;
+            /**
+             * Shorthand value.
+             */
+            value: string;
+            /**
+             * Whether the property has "!important" annotation (implies `false` if absent).
+             */
+            important?: boolean;
+        }
+        export interface CSSComputedStyleProperty {
+            /**
+             * Computed style property name.
+             */
+            name: string;
+            /**
+             * Computed style property value.
+             */
+            value: string;
+        }
+        /**
+         * CSS style representation.
+         */
+        export interface CSSStyle {
+            /**
+             * The css style sheet identifier (absent for user agent stylesheet and user-specified
+stylesheet rules) this rule came from.
+             */
+            styleSheetId?: StyleSheetId;
+            /**
+             * CSS properties in the style.
+             */
+            cssProperties: CSSProperty[];
+            /**
+             * Computed values for all shorthands found in the style.
+             */
+            shorthandEntries: ShorthandEntry[];
+            /**
+             * Style declaration text (if available).
+             */
+            cssText?: string;
+            /**
+             * Style declaration range in the enclosing stylesheet (if available).
+             */
+            range?: SourceRange;
+        }
+        /**
+         * CSS property declaration data.
+         */
+        export interface CSSProperty {
+            /**
+             * The property name.
+             */
+            name: string;
+            /**
+             * The property value.
+             */
+            value: string;
+            /**
+             * Whether the property has "!important" annotation (implies `false` if absent).
+             */
+            important?: boolean;
+            /**
+             * Whether the property is implicit (implies `false` if absent).
+             */
+            implicit?: boolean;
+            /**
+             * The full property text as specified in the style.
+             */
+            text?: string;
+            /**
+             * Whether the property is understood by the browser (implies `true` if absent).
+             */
+            parsedOk?: boolean;
+            /**
+             * Whether the property is disabled by the user (present for source-based properties only).
+             */
+            disabled?: boolean;
+            /**
+             * The entire property range in the enclosing style declaration (if available).
+             */
+            range?: SourceRange;
+        }
+        /**
+         * CSS media rule descriptor.
+         */
+        export interface CSSMedia {
+            /**
+             * Media query text.
+             */
+            text: string;
+            /**
+             * Source of the media query: "mediaRule" if specified by a @media rule, "importRule" if
+specified by an @import rule, "linkedSheet" if specified by a "media" attribute in a linked
+stylesheet's LINK tag, "inlineSheet" if specified by a "media" attribute in an inline
+stylesheet's STYLE tag.
+             */
+            source: "mediaRule"|"importRule"|"linkedSheet"|"inlineSheet";
+            /**
+             * URL of the document containing the media query description.
+             */
+            sourceURL?: string;
+            /**
+             * The associated rule (@media or @import) header range in the enclosing stylesheet (if
+available).
+             */
+            range?: SourceRange;
+            /**
+             * Identifier of the stylesheet containing this object (if exists).
+             */
+            styleSheetId?: StyleSheetId;
+            /**
+             * Array of media queries.
+             */
+            mediaList?: MediaQuery[];
+        }
+        /**
+         * Media query descriptor.
+         */
+        export interface MediaQuery {
+            /**
+             * Array of media query expressions.
+             */
+            expressions: MediaQueryExpression[];
+            /**
+             * Whether the media query condition is satisfied.
+             */
+            active: boolean;
+        }
+        /**
+         * Media query expression descriptor.
+         */
+        export interface MediaQueryExpression {
+            /**
+             * Media query expression value.
+             */
+            value: number;
+            /**
+             * Media query expression units.
+             */
+            unit: string;
+            /**
+             * Media query expression feature.
+             */
+            feature: string;
+            /**
+             * The associated range of the value text in the enclosing stylesheet (if available).
+             */
+            valueRange?: SourceRange;
+            /**
+             * Computed length of media query expression (if applicable).
+             */
+            computedLength?: number;
+        }
+        /**
+         * Information about amount of glyphs that were rendered with given font.
+         */
+        export interface PlatformFontUsage {
+            /**
+             * Font's family name reported by platform.
+             */
+            familyName: string;
+            /**
+             * Indicates if the font was downloaded or resolved locally.
+             */
+            isCustomFont: boolean;
+            /**
+             * Amount of glyphs that were rendered with this font.
+             */
+            glyphCount: number;
+        }
+        /**
+         * Properties of a web font: https://www.w3.org/TR/2008/REC-CSS2-20080411/fonts.html#font-descriptions
+         */
+        export interface FontFace {
+            /**
+             * The font-family.
+             */
+            fontFamily: string;
+            /**
+             * The font-style.
+             */
+            fontStyle: string;
+            /**
+             * The font-variant.
+             */
+            fontVariant: string;
+            /**
+             * The font-weight.
+             */
+            fontWeight: string;
+            /**
+             * The font-stretch.
+             */
+            fontStretch: string;
+            /**
+             * The unicode-range.
+             */
+            unicodeRange: string;
+            /**
+             * The src.
+             */
+            src: string;
+            /**
+             * The resolved platform font family
+             */
+            platformFontFamily: string;
+        }
+        /**
+         * CSS keyframes rule representation.
+         */
+        export interface CSSKeyframesRule {
+            /**
+             * Animation name.
+             */
+            animationName: Value;
+            /**
+             * List of keyframes.
+             */
+            keyframes: CSSKeyframeRule[];
+        }
+        /**
+         * CSS keyframe rule representation.
+         */
+        export interface CSSKeyframeRule {
+            /**
+             * The css style sheet identifier (absent for user agent stylesheet and user-specified
+stylesheet rules) this rule came from.
+             */
+            styleSheetId?: StyleSheetId;
+            /**
+             * Parent stylesheet's origin.
+             */
+            origin: StyleSheetOrigin;
+            /**
+             * Associated key text.
+             */
+            keyText: Value;
+            /**
+             * Associated style declaration.
+             */
+            style: CSSStyle;
+        }
+        /**
+         * A descriptor of operation to mutate style declaration text.
+         */
+        export interface StyleDeclarationEdit {
+            /**
+             * The css style sheet identifier.
+             */
+            styleSheetId: StyleSheetId;
+            /**
+             * The range of the style text in the enclosing stylesheet.
+             */
+            range: SourceRange;
+            /**
+             * New style text.
+             */
+            text: string;
+        }
+        
+        /**
+         * Fires whenever a web font is updated.  A non-empty font parameter indicates a successfully loaded
+web font
+         */
+        export type fontsUpdatedPayload = {
+            /**
+             * The web font that has loaded.
+             */
+            font?: FontFace;
+        }
+        /**
+         * Fires whenever a MediaQuery result changes (for example, after a browser window has been
+resized.) The current implementation considers only viewport-dependent media features.
+         */
+        export type mediaQueryResultChangedPayload = void;
+        /**
+         * Fired whenever an active document stylesheet is added.
+         */
+        export type styleSheetAddedPayload = {
+            /**
+             * Added stylesheet metainfo.
+             */
+            header: CSSStyleSheetHeader;
+        }
+        /**
+         * Fired whenever a stylesheet is changed as a result of the client operation.
+         */
+        export type styleSheetChangedPayload = {
+            styleSheetId: StyleSheetId;
+        }
+        /**
+         * Fired whenever an active document stylesheet is removed.
+         */
+        export type styleSheetRemovedPayload = {
+            /**
+             * Identifier of the removed stylesheet.
+             */
+            styleSheetId: StyleSheetId;
+        }
+        
+        /**
+         * Inserts a new rule with the given `ruleText` in a stylesheet with given `styleSheetId`, at the
+position specified by `location`.
+         */
+        export type addRuleParameters = {
+            /**
+             * The css style sheet identifier where a new rule should be inserted.
+             */
+            styleSheetId: StyleSheetId;
+            /**
+             * The text of a new rule.
+             */
+            ruleText: string;
+            /**
+             * Text position of a new rule in the target style sheet.
+             */
+            location: SourceRange;
+        }
+        export type addRuleReturnValue = {
+            /**
+             * The newly created rule.
+             */
+            rule: CSSRule;
+        }
+        /**
+         * Returns all class names from specified stylesheet.
+         */
+        export type collectClassNamesParameters = {
+            styleSheetId: StyleSheetId;
+        }
+        export type collectClassNamesReturnValue = {
+            /**
+             * Class name list.
+             */
+            classNames: string[];
+        }
+        /**
+         * Creates a new special "via-inspector" stylesheet in the frame with given `frameId`.
+         */
+        export type createStyleSheetParameters = {
+            /**
+             * Identifier of the frame where "via-inspector" stylesheet should be created.
+             */
+            frameId: Page.FrameId;
+        }
+        export type createStyleSheetReturnValue = {
+            /**
+             * Identifier of the created "via-inspector" stylesheet.
+             */
+            styleSheetId: StyleSheetId;
+        }
+        /**
+         * Disables the CSS agent for the given page.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables the CSS agent for the given page. Clients should not assume that the CSS agent has been
+enabled until the result of this command is received.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Ensures that the given node will have specified pseudo-classes whenever its style is computed by
+the browser.
+         */
+        export type forcePseudoStateParameters = {
+            /**
+             * The element id for which to force the pseudo state.
+             */
+            nodeId: DOM.NodeId;
+            /**
+             * Element pseudo classes to force when computing the element's style.
+             */
+            forcedPseudoClasses: string[];
+        }
+        export type forcePseudoStateReturnValue = {
+        }
+        export type getBackgroundColorsParameters = {
+            /**
+             * Id of the node to get background colors for.
+             */
+            nodeId: DOM.NodeId;
+        }
+        export type getBackgroundColorsReturnValue = {
+            /**
+             * The range of background colors behind this element, if it contains any visible text. If no
+visible text is present, this will be undefined. In the case of a flat background color,
+this will consist of simply that color. In the case of a gradient, this will consist of each
+of the color stops. For anything more complicated, this will be an empty array. Images will
+be ignored (as if the image had failed to load).
+             */
+            backgroundColors?: string[];
+            /**
+             * The computed font size for this node, as a CSS computed value string (e.g. '12px').
+             */
+            computedFontSize?: string;
+            /**
+             * The computed font weight for this node, as a CSS computed value string (e.g. 'normal' or
+'100').
+             */
+            computedFontWeight?: string;
+        }
+        /**
+         * Returns the computed style for a DOM node identified by `nodeId`.
+         */
+        export type getComputedStyleForNodeParameters = {
+            nodeId: DOM.NodeId;
+        }
+        export type getComputedStyleForNodeReturnValue = {
+            /**
+             * Computed style for the specified DOM node.
+             */
+            computedStyle: CSSComputedStyleProperty[];
+        }
+        /**
+         * Returns the styles defined inline (explicitly in the "style" attribute and implicitly, using DOM
+attributes) for a DOM node identified by `nodeId`.
+         */
+        export type getInlineStylesForNodeParameters = {
+            nodeId: DOM.NodeId;
+        }
+        export type getInlineStylesForNodeReturnValue = {
+            /**
+             * Inline style for the specified DOM node.
+             */
+            inlineStyle?: CSSStyle;
+            /**
+             * Attribute-defined element style (e.g. resulting from "width=20 height=100%").
+             */
+            attributesStyle?: CSSStyle;
+        }
+        /**
+         * Returns requested styles for a DOM node identified by `nodeId`.
+         */
+        export type getMatchedStylesForNodeParameters = {
+            nodeId: DOM.NodeId;
+        }
+        export type getMatchedStylesForNodeReturnValue = {
+            /**
+             * Inline style for the specified DOM node.
+             */
+            inlineStyle?: CSSStyle;
+            /**
+             * Attribute-defined element style (e.g. resulting from "width=20 height=100%").
+             */
+            attributesStyle?: CSSStyle;
+            /**
+             * CSS rules matching this node, from all applicable stylesheets.
+             */
+            matchedCSSRules?: RuleMatch[];
+            /**
+             * Pseudo style matches for this node.
+             */
+            pseudoElements?: PseudoElementMatches[];
+            /**
+             * A chain of inherited styles (from the immediate node parent up to the DOM tree root).
+             */
+            inherited?: InheritedStyleEntry[];
+            /**
+             * A list of CSS keyframed animations matching this node.
+             */
+            cssKeyframesRules?: CSSKeyframesRule[];
+        }
+        /**
+         * Returns all media queries parsed by the rendering engine.
+         */
+        export type getMediaQueriesParameters = {
+        }
+        export type getMediaQueriesReturnValue = {
+            medias: CSSMedia[];
+        }
+        /**
+         * Requests information about platform fonts which we used to render child TextNodes in the given
+node.
+         */
+        export type getPlatformFontsForNodeParameters = {
+            nodeId: DOM.NodeId;
+        }
+        export type getPlatformFontsForNodeReturnValue = {
+            /**
+             * Usage statistics for every employed platform font.
+             */
+            fonts: PlatformFontUsage[];
+        }
+        /**
+         * Returns the current textual content for a stylesheet.
+         */
+        export type getStyleSheetTextParameters = {
+            styleSheetId: StyleSheetId;
+        }
+        export type getStyleSheetTextReturnValue = {
+            /**
+             * The stylesheet text.
+             */
+            text: string;
+        }
+        /**
+         * Find a rule with the given active property for the given node and set the new value for this
+property
+         */
+        export type setEffectivePropertyValueForNodeParameters = {
+            /**
+             * The element id for which to set property.
+             */
+            nodeId: DOM.NodeId;
+            propertyName: string;
+            value: string;
+        }
+        export type setEffectivePropertyValueForNodeReturnValue = {
+        }
+        /**
+         * Modifies the keyframe rule key text.
+         */
+        export type setKeyframeKeyParameters = {
+            styleSheetId: StyleSheetId;
+            range: SourceRange;
+            keyText: string;
+        }
+        export type setKeyframeKeyReturnValue = {
+            /**
+             * The resulting key text after modification.
+             */
+            keyText: Value;
+        }
+        /**
+         * Modifies the rule selector.
+         */
+        export type setMediaTextParameters = {
+            styleSheetId: StyleSheetId;
+            range: SourceRange;
+            text: string;
+        }
+        export type setMediaTextReturnValue = {
+            /**
+             * The resulting CSS media rule after modification.
+             */
+            media: CSSMedia;
+        }
+        /**
+         * Modifies the rule selector.
+         */
+        export type setRuleSelectorParameters = {
+            styleSheetId: StyleSheetId;
+            range: SourceRange;
+            selector: string;
+        }
+        export type setRuleSelectorReturnValue = {
+            /**
+             * The resulting selector list after modification.
+             */
+            selectorList: SelectorList;
+        }
+        /**
+         * Sets the new stylesheet text.
+         */
+        export type setStyleSheetTextParameters = {
+            styleSheetId: StyleSheetId;
+            text: string;
+        }
+        export type setStyleSheetTextReturnValue = {
+            /**
+             * URL of source map associated with script (if any).
+             */
+            sourceMapURL?: string;
+        }
+        /**
+         * Applies specified style edits one after another in the given order.
+         */
+        export type setStyleTextsParameters = {
+            edits: StyleDeclarationEdit[];
+        }
+        export type setStyleTextsReturnValue = {
+            /**
+             * The resulting styles after modification.
+             */
+            styles: CSSStyle[];
+        }
+        /**
+         * Enables the selector recording.
+         */
+        export type startRuleUsageTrackingParameters = {
+        }
+        export type startRuleUsageTrackingReturnValue = {
+        }
+        /**
+         * Stop tracking rule usage and return the list of rules that were used since last call to
+`takeCoverageDelta` (or since start of coverage instrumentation)
+         */
+        export type stopRuleUsageTrackingParameters = {
+        }
+        export type stopRuleUsageTrackingReturnValue = {
+            ruleUsage: RuleUsage[];
+        }
+        /**
+         * Obtain list of rules that became used since last call to this method (or since start of coverage
+instrumentation)
+         */
+        export type takeCoverageDeltaParameters = {
+        }
+        export type takeCoverageDeltaReturnValue = {
+            coverage: RuleUsage[];
+            /**
+             * Monotonically increasing time, in seconds.
+             */
+            timestamp: number;
+        }
+    }
+    
+    export module CacheStorage {
+        /**
+         * Unique identifier of the Cache object.
+         */
+        export type CacheId = string;
+        /**
+         * type of HTTP response cached
+         */
+        export type CachedResponseType = "basic"|"cors"|"default"|"error"|"opaqueResponse"|"opaqueRedirect";
+        /**
+         * Data entry.
+         */
+        export interface DataEntry {
+            /**
+             * Request URL.
+             */
+            requestURL: string;
+            /**
+             * Request method.
+             */
+            requestMethod: string;
+            /**
+             * Request headers
+             */
+            requestHeaders: Header[];
+            /**
+             * Number of seconds since epoch.
+             */
+            responseTime: number;
+            /**
+             * HTTP response status code.
+             */
+            responseStatus: number;
+            /**
+             * HTTP response status text.
+             */
+            responseStatusText: string;
+            /**
+             * HTTP response type
+             */
+            responseType: CachedResponseType;
+            /**
+             * Response headers
+             */
+            responseHeaders: Header[];
+        }
+        /**
+         * Cache identifier.
+         */
+        export interface Cache {
+            /**
+             * An opaque unique id of the cache.
+             */
+            cacheId: CacheId;
+            /**
+             * Security origin of the cache.
+             */
+            securityOrigin: string;
+            /**
+             * The name of the cache.
+             */
+            cacheName: string;
+        }
+        export interface Header {
+            name: string;
+            value: string;
+        }
+        /**
+         * Cached response
+         */
+        export interface CachedResponse {
+            /**
+             * Entry content, base64-encoded.
+             */
+            body: binary;
+        }
+        
+        
+        /**
+         * Deletes a cache.
+         */
+        export type deleteCacheParameters = {
+            /**
+             * Id of cache for deletion.
+             */
+            cacheId: CacheId;
+        }
+        export type deleteCacheReturnValue = {
+        }
+        /**
+         * Deletes a cache entry.
+         */
+        export type deleteEntryParameters = {
+            /**
+             * Id of cache where the entry will be deleted.
+             */
+            cacheId: CacheId;
+            /**
+             * URL spec of the request.
+             */
+            request: string;
+        }
+        export type deleteEntryReturnValue = {
+        }
+        /**
+         * Requests cache names.
+         */
+        export type requestCacheNamesParameters = {
+            /**
+             * Security origin.
+             */
+            securityOrigin: string;
+        }
+        export type requestCacheNamesReturnValue = {
+            /**
+             * Caches for the security origin.
+             */
+            caches: Cache[];
+        }
+        /**
+         * Fetches cache entry.
+         */
+        export type requestCachedResponseParameters = {
+            /**
+             * Id of cache that contains the entry.
+             */
+            cacheId: CacheId;
+            /**
+             * URL spec of the request.
+             */
+            requestURL: string;
+            /**
+             * headers of the request.
+             */
+            requestHeaders: Header[];
+        }
+        export type requestCachedResponseReturnValue = {
+            /**
+             * Response read from the cache.
+             */
+            response: CachedResponse;
+        }
+        /**
+         * Requests data from cache.
+         */
+        export type requestEntriesParameters = {
+            /**
+             * ID of cache to get entries from.
+             */
+            cacheId: CacheId;
+            /**
+             * Number of records to skip.
+             */
+            skipCount?: number;
+            /**
+             * Number of records to fetch.
+             */
+            pageSize?: number;
+            /**
+             * If present, only return the entries containing this substring in the path
+             */
+            pathFilter?: string;
+        }
+        export type requestEntriesReturnValue = {
+            /**
+             * Array of object store data entries.
+             */
+            cacheDataEntries: DataEntry[];
+            /**
+             * Count of returned entries from this storage. If pathFilter is empty, it
+is the count of all entries from this storage.
+             */
+            returnCount: number;
+        }
+    }
+    
+    /**
+     * A domain for interacting with Cast, Presentation API, and Remote Playback API
+functionalities.
+     */
+    export module Cast {
+        export interface Sink {
+            name: string;
+            id: string;
+            /**
+             * Text describing the current session. Present only if there is an active
+session on the sink.
+             */
+            session?: string;
+        }
+        
+        /**
+         * This is fired whenever the list of available sinks changes. A sink is a
+device or a software surface that you can cast to.
+         */
+        export type sinksUpdatedPayload = {
+            sinks: Sink[];
+        }
+        /**
+         * This is fired whenever the outstanding issue/error message changes.
+|issueMessage| is empty if there is no issue.
+         */
+        export type issueUpdatedPayload = {
+            issueMessage: string;
+        }
+        
+        /**
+         * Starts observing for sinks that can be used for tab mirroring, and if set,
+sinks compatible with |presentationUrl| as well. When sinks are found, a
+|sinksUpdated| event is fired.
+Also starts observing for issue messages. When an issue is added or removed,
+an |issueUpdated| event is fired.
+         */
+        export type enableParameters = {
+            presentationUrl?: string;
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Stops observing for sinks and issues.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Sets a sink to be used when the web page requests the browser to choose a
+sink via Presentation API, Remote Playback API, or Cast SDK.
+         */
+        export type setSinkToUseParameters = {
+            sinkName: string;
+        }
+        export type setSinkToUseReturnValue = {
+        }
+        /**
+         * Starts mirroring the tab to the sink.
+         */
+        export type startTabMirroringParameters = {
+            sinkName: string;
+        }
+        export type startTabMirroringReturnValue = {
+        }
+        /**
+         * Stops the active Cast session on the sink.
+         */
+        export type stopCastingParameters = {
+            sinkName: string;
+        }
+        export type stopCastingReturnValue = {
+        }
+    }
+    
+    /**
+     * This domain exposes DOM read/write operations. Each DOM Node is represented with its mirror object
+that has an `id`. This `id` can be used to get additional information on the Node, resolve it into
+the JavaScript object wrapper, etc. It is important that client receives DOM events only for the
+nodes that are known to the client. Backend keeps track of the nodes that were sent to the client
+and never sends the same node twice. It is client's responsibility to collect information about
+the nodes that were sent to the client.<p>Note that `iframe` owner elements will return
+corresponding document elements as their child nodes.</p>
+     */
+    export module DOM {
+        /**
+         * Unique DOM node identifier.
+         */
+        export type NodeId = number;
+        /**
+         * Unique DOM node identifier used to reference a node that may not have been pushed to the
+front-end.
+         */
+        export type BackendNodeId = number;
+        /**
+         * Backend node with a friendly name.
+         */
+        export interface BackendNode {
+            /**
+             * `Node`'s nodeType.
+             */
+            nodeType: number;
+            /**
+             * `Node`'s nodeName.
+             */
+            nodeName: string;
+            backendNodeId: BackendNodeId;
+        }
+        /**
+         * Pseudo element type.
+         */
+        export type PseudoType = "first-line"|"first-letter"|"before"|"after"|"marker"|"backdrop"|"selection"|"first-line-inherited"|"scrollbar"|"scrollbar-thumb"|"scrollbar-button"|"scrollbar-track"|"scrollbar-track-piece"|"scrollbar-corner"|"resizer"|"input-list-button";
+        /**
+         * Shadow root type.
+         */
+        export type ShadowRootType = "user-agent"|"open"|"closed";
+        /**
+         * DOM interaction is implemented in terms of mirror objects that represent the actual DOM nodes.
+DOMNode is a base node mirror type.
+         */
+        export interface Node {
+            /**
+             * Node identifier that is passed into the rest of the DOM messages as the `nodeId`. Backend
+will only push node with given `id` once. It is aware of all requested nodes and will only
+fire DOM events for nodes known to the client.
+             */
+            nodeId: NodeId;
+            /**
+             * The id of the parent node if any.
+             */
+            parentId?: NodeId;
+            /**
+             * The BackendNodeId for this node.
+             */
+            backendNodeId: BackendNodeId;
+            /**
+             * `Node`'s nodeType.
+             */
+            nodeType: number;
+            /**
+             * `Node`'s nodeName.
+             */
+            nodeName: string;
+            /**
+             * `Node`'s localName.
+             */
+            localName: string;
+            /**
+             * `Node`'s nodeValue.
+             */
+            nodeValue: string;
+            /**
+             * Child count for `Container` nodes.
+             */
+            childNodeCount?: number;
+            /**
+             * Child nodes of this node when requested with children.
+             */
+            children?: Node[];
+            /**
+             * Attributes of the `Element` node in the form of flat array `[name1, value1, name2, value2]`.
+             */
+            attributes?: string[];
+            /**
+             * Document URL that `Document` or `FrameOwner` node points to.
+             */
+            documentURL?: string;
+            /**
+             * Base URL that `Document` or `FrameOwner` node uses for URL completion.
+             */
+            baseURL?: string;
+            /**
+             * `DocumentType`'s publicId.
+             */
+            publicId?: string;
+            /**
+             * `DocumentType`'s systemId.
+             */
+            systemId?: string;
+            /**
+             * `DocumentType`'s internalSubset.
+             */
+            internalSubset?: string;
+            /**
+             * `Document`'s XML version in case of XML documents.
+             */
+            xmlVersion?: string;
+            /**
+             * `Attr`'s name.
+             */
+            name?: string;
+            /**
+             * `Attr`'s value.
+             */
+            value?: string;
+            /**
+             * Pseudo element type for this node.
+             */
+            pseudoType?: PseudoType;
+            /**
+             * Shadow root type.
+             */
+            shadowRootType?: ShadowRootType;
+            /**
+             * Frame ID for frame owner elements.
+             */
+            frameId?: Page.FrameId;
+            /**
+             * Content document for frame owner elements.
+             */
+            contentDocument?: Node;
+            /**
+             * Shadow root list for given element host.
+             */
+            shadowRoots?: Node[];
+            /**
+             * Content document fragment for template elements.
+             */
+            templateContent?: Node;
+            /**
+             * Pseudo elements associated with this node.
+             */
+            pseudoElements?: Node[];
+            /**
+             * Import document for the HTMLImport links.
+             */
+            importedDocument?: Node;
+            /**
+             * Distributed nodes for given insertion point.
+             */
+            distributedNodes?: BackendNode[];
+            /**
+             * Whether the node is SVG.
+             */
+            isSVG?: boolean;
+        }
+        /**
+         * A structure holding an RGBA color.
+         */
+        export interface RGBA {
+            /**
+             * The red component, in the [0-255] range.
+             */
+            r: number;
+            /**
+             * The green component, in the [0-255] range.
+             */
+            g: number;
+            /**
+             * The blue component, in the [0-255] range.
+             */
+            b: number;
+            /**
+             * The alpha component, in the [0-1] range (default: 1).
+             */
+            a?: number;
+        }
+        /**
+         * An array of quad vertices, x immediately followed by y for each point, points clock-wise.
+         */
+        export type Quad = number[];
+        /**
+         * Box model.
+         */
+        export interface BoxModel {
+            /**
+             * Content box
+             */
+            content: Quad;
+            /**
+             * Padding box
+             */
+            padding: Quad;
+            /**
+             * Border box
+             */
+            border: Quad;
+            /**
+             * Margin box
+             */
+            margin: Quad;
+            /**
+             * Node width
+             */
+            width: number;
+            /**
+             * Node height
+             */
+            height: number;
+            /**
+             * Shape outside coordinates
+             */
+            shapeOutside?: ShapeOutsideInfo;
+        }
+        /**
+         * CSS Shape Outside details.
+         */
+        export interface ShapeOutsideInfo {
+            /**
+             * Shape bounds
+             */
+            bounds: Quad;
+            /**
+             * Shape coordinate details
+             */
+            shape: any[];
+            /**
+             * Margin shape bounds
+             */
+            marginShape: any[];
+        }
+        /**
+         * Rectangle.
+         */
+        export interface Rect {
+            /**
+             * X coordinate
+             */
+            x: number;
+            /**
+             * Y coordinate
+             */
+            y: number;
+            /**
+             * Rectangle width
+             */
+            width: number;
+            /**
+             * Rectangle height
+             */
+            height: number;
+        }
+        
+        /**
+         * Fired when `Element`'s attribute is modified.
+         */
+        export type attributeModifiedPayload = {
+            /**
+             * Id of the node that has changed.
+             */
+            nodeId: NodeId;
+            /**
+             * Attribute name.
+             */
+            name: string;
+            /**
+             * Attribute value.
+             */
+            value: string;
+        }
+        /**
+         * Fired when `Element`'s attribute is removed.
+         */
+        export type attributeRemovedPayload = {
+            /**
+             * Id of the node that has changed.
+             */
+            nodeId: NodeId;
+            /**
+             * A ttribute name.
+             */
+            name: string;
+        }
+        /**
+         * Mirrors `DOMCharacterDataModified` event.
+         */
+        export type characterDataModifiedPayload = {
+            /**
+             * Id of the node that has changed.
+             */
+            nodeId: NodeId;
+            /**
+             * New text value.
+             */
+            characterData: string;
+        }
+        /**
+         * Fired when `Container`'s child node count has changed.
+         */
+        export type childNodeCountUpdatedPayload = {
+            /**
+             * Id of the node that has changed.
+             */
+            nodeId: NodeId;
+            /**
+             * New node count.
+             */
+            childNodeCount: number;
+        }
+        /**
+         * Mirrors `DOMNodeInserted` event.
+         */
+        export type childNodeInsertedPayload = {
+            /**
+             * Id of the node that has changed.
+             */
+            parentNodeId: NodeId;
+            /**
+             * If of the previous siblint.
+             */
+            previousNodeId: NodeId;
+            /**
+             * Inserted node data.
+             */
+            node: Node;
+        }
+        /**
+         * Mirrors `DOMNodeRemoved` event.
+         */
+        export type childNodeRemovedPayload = {
+            /**
+             * Parent id.
+             */
+            parentNodeId: NodeId;
+            /**
+             * Id of the node that has been removed.
+             */
+            nodeId: NodeId;
+        }
+        /**
+         * Called when distrubution is changed.
+         */
+        export type distributedNodesUpdatedPayload = {
+            /**
+             * Insertion point where distrubuted nodes were updated.
+             */
+            insertionPointId: NodeId;
+            /**
+             * Distributed nodes for given insertion point.
+             */
+            distributedNodes: BackendNode[];
+        }
+        /**
+         * Fired when `Document` has been totally updated. Node ids are no longer valid.
+         */
+        export type documentUpdatedPayload = void;
+        /**
+         * Fired when `Element`'s inline style is modified via a CSS property modification.
+         */
+        export type inlineStyleInvalidatedPayload = {
+            /**
+             * Ids of the nodes for which the inline styles have been invalidated.
+             */
+            nodeIds: NodeId[];
+        }
+        /**
+         * Called when a pseudo element is added to an element.
+         */
+        export type pseudoElementAddedPayload = {
+            /**
+             * Pseudo element's parent element id.
+             */
+            parentId: NodeId;
+            /**
+             * The added pseudo element.
+             */
+            pseudoElement: Node;
+        }
+        /**
+         * Called when a pseudo element is removed from an element.
+         */
+        export type pseudoElementRemovedPayload = {
+            /**
+             * Pseudo element's parent element id.
+             */
+            parentId: NodeId;
+            /**
+             * The removed pseudo element id.
+             */
+            pseudoElementId: NodeId;
+        }
+        /**
+         * Fired when backend wants to provide client with the missing DOM structure. This happens upon
+most of the calls requesting node ids.
+         */
+        export type setChildNodesPayload = {
+            /**
+             * Parent node id to populate with children.
+             */
+            parentId: NodeId;
+            /**
+             * Child nodes array.
+             */
+            nodes: Node[];
+        }
+        /**
+         * Called when shadow root is popped from the element.
+         */
+        export type shadowRootPoppedPayload = {
+            /**
+             * Host element id.
+             */
+            hostId: NodeId;
+            /**
+             * Shadow root id.
+             */
+            rootId: NodeId;
+        }
+        /**
+         * Called when shadow root is pushed into the element.
+         */
+        export type shadowRootPushedPayload = {
+            /**
+             * Host element id.
+             */
+            hostId: NodeId;
+            /**
+             * Shadow root.
+             */
+            root: Node;
+        }
+        
+        /**
+         * Collects class names for the node with given id and all of it's child nodes.
+         */
+        export type collectClassNamesFromSubtreeParameters = {
+            /**
+             * Id of the node to collect class names.
+             */
+            nodeId: NodeId;
+        }
+        export type collectClassNamesFromSubtreeReturnValue = {
+            /**
+             * Class name list.
+             */
+            classNames: string[];
+        }
+        /**
+         * Creates a deep copy of the specified node and places it into the target container before the
+given anchor.
+         */
+        export type copyToParameters = {
+            /**
+             * Id of the node to copy.
+             */
+            nodeId: NodeId;
+            /**
+             * Id of the element to drop the copy into.
+             */
+            targetNodeId: NodeId;
+            /**
+             * Drop the copy before this node (if absent, the copy becomes the last child of
+`targetNodeId`).
+             */
+            insertBeforeNodeId?: NodeId;
+        }
+        export type copyToReturnValue = {
+            /**
+             * Id of the node clone.
+             */
+            nodeId: NodeId;
+        }
+        /**
+         * Describes node given its id, does not require domain to be enabled. Does not start tracking any
+objects, can be used for automation.
+         */
+        export type describeNodeParameters = {
+            /**
+             * Identifier of the node.
+             */
+            nodeId?: NodeId;
+            /**
+             * Identifier of the backend node.
+             */
+            backendNodeId?: BackendNodeId;
+            /**
+             * JavaScript object id of the node wrapper.
+             */
+            objectId?: Runtime.RemoteObjectId;
+            /**
+             * The maximum depth at which children should be retrieved, defaults to 1. Use -1 for the
+entire subtree or provide an integer larger than 0.
+             */
+            depth?: number;
+            /**
+             * Whether or not iframes and shadow roots should be traversed when returning the subtree
+(default is false).
+             */
+            pierce?: boolean;
+        }
+        export type describeNodeReturnValue = {
+            /**
+             * Node description.
+             */
+            node: Node;
+        }
+        /**
+         * Disables DOM agent for the given page.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Discards search results from the session with the given id. `getSearchResults` should no longer
+be called for that search.
+         */
+        export type discardSearchResultsParameters = {
+            /**
+             * Unique search session identifier.
+             */
+            searchId: string;
+        }
+        export type discardSearchResultsReturnValue = {
+        }
+        /**
+         * Enables DOM agent for the given page.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Focuses the given element.
+         */
+        export type focusParameters = {
+            /**
+             * Identifier of the node.
+             */
+            nodeId?: NodeId;
+            /**
+             * Identifier of the backend node.
+             */
+            backendNodeId?: BackendNodeId;
+            /**
+             * JavaScript object id of the node wrapper.
+             */
+            objectId?: Runtime.RemoteObjectId;
+        }
+        export type focusReturnValue = {
+        }
+        /**
+         * Returns attributes for the specified node.
+         */
+        export type getAttributesParameters = {
+            /**
+             * Id of the node to retrieve attibutes for.
+             */
+            nodeId: NodeId;
+        }
+        export type getAttributesReturnValue = {
+            /**
+             * An interleaved array of node attribute names and values.
+             */
+            attributes: string[];
+        }
+        /**
+         * Returns boxes for the given node.
+         */
+        export type getBoxModelParameters = {
+            /**
+             * Identifier of the node.
+             */
+            nodeId?: NodeId;
+            /**
+             * Identifier of the backend node.
+             */
+            backendNodeId?: BackendNodeId;
+            /**
+             * JavaScript object id of the node wrapper.
+             */
+            objectId?: Runtime.RemoteObjectId;
+        }
+        export type getBoxModelReturnValue = {
+            /**
+             * Box model for the node.
+             */
+            model: BoxModel;
+        }
+        /**
+         * Returns quads that describe node position on the page. This method
+might return multiple quads for inline nodes.
+         */
+        export type getContentQuadsParameters = {
+            /**
+             * Identifier of the node.
+             */
+            nodeId?: NodeId;
+            /**
+             * Identifier of the backend node.
+             */
+            backendNodeId?: BackendNodeId;
+            /**
+             * JavaScript object id of the node wrapper.
+             */
+            objectId?: Runtime.RemoteObjectId;
+        }
+        export type getContentQuadsReturnValue = {
+            /**
+             * Quads that describe node layout relative to viewport.
+             */
+            quads: Quad[];
+        }
+        /**
+         * Returns the root DOM node (and optionally the subtree) to the caller.
+         */
+        export type getDocumentParameters = {
+            /**
+             * The maximum depth at which children should be retrieved, defaults to 1. Use -1 for the
+entire subtree or provide an integer larger than 0.
+             */
+            depth?: number;
+            /**
+             * Whether or not iframes and shadow roots should be traversed when returning the subtree
+(default is false).
+             */
+            pierce?: boolean;
+        }
+        export type getDocumentReturnValue = {
+            /**
+             * Resulting node.
+             */
+            root: Node;
+        }
+        /**
+         * Returns the root DOM node (and optionally the subtree) to the caller.
+         */
+        export type getFlattenedDocumentParameters = {
+            /**
+             * The maximum depth at which children should be retrieved, defaults to 1. Use -1 for the
+entire subtree or provide an integer larger than 0.
+             */
+            depth?: number;
+            /**
+             * Whether or not iframes and shadow roots should be traversed when returning the subtree
+(default is false).
+             */
+            pierce?: boolean;
+        }
+        export type getFlattenedDocumentReturnValue = {
+            /**
+             * Resulting node.
+             */
+            nodes: Node[];
+        }
+        /**
+         * Returns node id at given location. Depending on whether DOM domain is enabled, nodeId is
+either returned or not.
+         */
+        export type getNodeForLocationParameters = {
+            /**
+             * X coordinate.
+             */
+            x: number;
+            /**
+             * Y coordinate.
+             */
+            y: number;
+            /**
+             * False to skip to the nearest non-UA shadow root ancestor (default: false).
+             */
+            includeUserAgentShadowDOM?: boolean;
+            /**
+             * Whether to ignore pointer-events: none on elements and hit test them.
+             */
+            ignorePointerEventsNone?: boolean;
+        }
+        export type getNodeForLocationReturnValue = {
+            /**
+             * Resulting node.
+             */
+            backendNodeId: BackendNodeId;
+            /**
+             * Frame this node belongs to.
+             */
+            frameId: Page.FrameId;
+            /**
+             * Id of the node at given coordinates, only when enabled and requested document.
+             */
+            nodeId?: NodeId;
+        }
+        /**
+         * Returns node's HTML markup.
+         */
+        export type getOuterHTMLParameters = {
+            /**
+             * Identifier of the node.
+             */
+            nodeId?: NodeId;
+            /**
+             * Identifier of the backend node.
+             */
+            backendNodeId?: BackendNodeId;
+            /**
+             * JavaScript object id of the node wrapper.
+             */
+            objectId?: Runtime.RemoteObjectId;
+        }
+        export type getOuterHTMLReturnValue = {
+            /**
+             * Outer HTML markup.
+             */
+            outerHTML: string;
+        }
+        /**
+         * Returns the id of the nearest ancestor that is a relayout boundary.
+         */
+        export type getRelayoutBoundaryParameters = {
+            /**
+             * Id of the node.
+             */
+            nodeId: NodeId;
+        }
+        export type getRelayoutBoundaryReturnValue = {
+            /**
+             * Relayout boundary node id for the given node.
+             */
+            nodeId: NodeId;
+        }
+        /**
+         * Returns search results from given `fromIndex` to given `toIndex` from the search with the given
+identifier.
+         */
+        export type getSearchResultsParameters = {
+            /**
+             * Unique search session identifier.
+             */
+            searchId: string;
+            /**
+             * Start index of the search result to be returned.
+             */
+            fromIndex: number;
+            /**
+             * End index of the search result to be returned.
+             */
+            toIndex: number;
+        }
+        export type getSearchResultsReturnValue = {
+            /**
+             * Ids of the search result nodes.
+             */
+            nodeIds: NodeId[];
+        }
+        /**
+         * Hides any highlight.
+         */
+        export type hideHighlightParameters = {
+        }
+        export type hideHighlightReturnValue = {
+        }
+        /**
+         * Highlights DOM node.
+         */
+        export type highlightNodeParameters = {
+        }
+        export type highlightNodeReturnValue = {
+        }
+        /**
+         * Highlights given rectangle.
+         */
+        export type highlightRectParameters = {
+        }
+        export type highlightRectReturnValue = {
+        }
+        /**
+         * Marks last undoable state.
+         */
+        export type markUndoableStateParameters = {
+        }
+        export type markUndoableStateReturnValue = {
+        }
+        /**
+         * Moves node into the new container, places it before the given anchor.
+         */
+        export type moveToParameters = {
+            /**
+             * Id of the node to move.
+             */
+            nodeId: NodeId;
+            /**
+             * Id of the element to drop the moved node into.
+             */
+            targetNodeId: NodeId;
+            /**
+             * Drop node before this one (if absent, the moved node becomes the last child of
+`targetNodeId`).
+             */
+            insertBeforeNodeId?: NodeId;
+        }
+        export type moveToReturnValue = {
+            /**
+             * New id of the moved node.
+             */
+            nodeId: NodeId;
+        }
+        /**
+         * Searches for a given string in the DOM tree. Use `getSearchResults` to access search results or
+`cancelSearch` to end this search session.
+         */
+        export type performSearchParameters = {
+            /**
+             * Plain text or query selector or XPath search query.
+             */
+            query: string;
+            /**
+             * True to search in user agent shadow DOM.
+             */
+            includeUserAgentShadowDOM?: boolean;
+        }
+        export type performSearchReturnValue = {
+            /**
+             * Unique search session identifier.
+             */
+            searchId: string;
+            /**
+             * Number of search results.
+             */
+            resultCount: number;
+        }
+        /**
+         * Requests that the node is sent to the caller given its path. // FIXME, use XPath
+         */
+        export type pushNodeByPathToFrontendParameters = {
+            /**
+             * Path to node in the proprietary format.
+             */
+            path: string;
+        }
+        export type pushNodeByPathToFrontendReturnValue = {
+            /**
+             * Id of the node for given path.
+             */
+            nodeId: NodeId;
+        }
+        /**
+         * Requests that a batch of nodes is sent to the caller given their backend node ids.
+         */
+        export type pushNodesByBackendIdsToFrontendParameters = {
+            /**
+             * The array of backend node ids.
+             */
+            backendNodeIds: BackendNodeId[];
+        }
+        export type pushNodesByBackendIdsToFrontendReturnValue = {
+            /**
+             * The array of ids of pushed nodes that correspond to the backend ids specified in
+backendNodeIds.
+             */
+            nodeIds: NodeId[];
+        }
+        /**
+         * Executes `querySelector` on a given node.
+         */
+        export type querySelectorParameters = {
+            /**
+             * Id of the node to query upon.
+             */
+            nodeId: NodeId;
+            /**
+             * Selector string.
+             */
+            selector: string;
+        }
+        export type querySelectorReturnValue = {
+            /**
+             * Query selector result.
+             */
+            nodeId: NodeId;
+        }
+        /**
+         * Executes `querySelectorAll` on a given node.
+         */
+        export type querySelectorAllParameters = {
+            /**
+             * Id of the node to query upon.
+             */
+            nodeId: NodeId;
+            /**
+             * Selector string.
+             */
+            selector: string;
+        }
+        export type querySelectorAllReturnValue = {
+            /**
+             * Query selector result.
+             */
+            nodeIds: NodeId[];
+        }
+        /**
+         * Re-does the last undone action.
+         */
+        export type redoParameters = {
+        }
+        export type redoReturnValue = {
+        }
+        /**
+         * Removes attribute with given name from an element with given id.
+         */
+        export type removeAttributeParameters = {
+            /**
+             * Id of the element to remove attribute from.
+             */
+            nodeId: NodeId;
+            /**
+             * Name of the attribute to remove.
+             */
+            name: string;
+        }
+        export type removeAttributeReturnValue = {
+        }
+        /**
+         * Removes node with given id.
+         */
+        export type removeNodeParameters = {
+            /**
+             * Id of the node to remove.
+             */
+            nodeId: NodeId;
+        }
+        export type removeNodeReturnValue = {
+        }
+        /**
+         * Requests that children of the node with given id are returned to the caller in form of
+`setChildNodes` events where not only immediate children are retrieved, but all children down to
+the specified depth.
+         */
+        export type requestChildNodesParameters = {
+            /**
+             * Id of the node to get children for.
+             */
+            nodeId: NodeId;
+            /**
+             * The maximum depth at which children should be retrieved, defaults to 1. Use -1 for the
+entire subtree or provide an integer larger than 0.
+             */
+            depth?: number;
+            /**
+             * Whether or not iframes and shadow roots should be traversed when returning the sub-tree
+(default is false).
+             */
+            pierce?: boolean;
+        }
+        export type requestChildNodesReturnValue = {
+        }
+        /**
+         * Requests that the node is sent to the caller given the JavaScript node object reference. All
+nodes that form the path from the node to the root are also sent to the client as a series of
+`setChildNodes` notifications.
+         */
+        export type requestNodeParameters = {
+            /**
+             * JavaScript object id to convert into node.
+             */
+            objectId: Runtime.RemoteObjectId;
+        }
+        export type requestNodeReturnValue = {
+            /**
+             * Node id for given object.
+             */
+            nodeId: NodeId;
+        }
+        /**
+         * Resolves the JavaScript node object for a given NodeId or BackendNodeId.
+         */
+        export type resolveNodeParameters = {
+            /**
+             * Id of the node to resolve.
+             */
+            nodeId?: NodeId;
+            /**
+             * Backend identifier of the node to resolve.
+             */
+            backendNodeId?: DOM.BackendNodeId;
+            /**
+             * Symbolic group name that can be used to release multiple objects.
+             */
+            objectGroup?: string;
+            /**
+             * Execution context in which to resolve the node.
+             */
+            executionContextId?: Runtime.ExecutionContextId;
+        }
+        export type resolveNodeReturnValue = {
+            /**
+             * JavaScript object wrapper for given node.
+             */
+            object: Runtime.RemoteObject;
+        }
+        /**
+         * Sets attribute for an element with given id.
+         */
+        export type setAttributeValueParameters = {
+            /**
+             * Id of the element to set attribute for.
+             */
+            nodeId: NodeId;
+            /**
+             * Attribute name.
+             */
+            name: string;
+            /**
+             * Attribute value.
+             */
+            value: string;
+        }
+        export type setAttributeValueReturnValue = {
+        }
+        /**
+         * Sets attributes on element with given id. This method is useful when user edits some existing
+attribute value and types in several attribute name/value pairs.
+         */
+        export type setAttributesAsTextParameters = {
+            /**
+             * Id of the element to set attributes for.
+             */
+            nodeId: NodeId;
+            /**
+             * Text with a number of attributes. Will parse this text using HTML parser.
+             */
+            text: string;
+            /**
+             * Attribute name to replace with new attributes derived from text in case text parsed
+successfully.
+             */
+            name?: string;
+        }
+        export type setAttributesAsTextReturnValue = {
+        }
+        /**
+         * Sets files for the given file input element.
+         */
+        export type setFileInputFilesParameters = {
+            /**
+             * Array of file paths to set.
+             */
+            files: string[];
+            /**
+             * Identifier of the node.
+             */
+            nodeId?: NodeId;
+            /**
+             * Identifier of the backend node.
+             */
+            backendNodeId?: BackendNodeId;
+            /**
+             * JavaScript object id of the node wrapper.
+             */
+            objectId?: Runtime.RemoteObjectId;
+        }
+        export type setFileInputFilesReturnValue = {
+        }
+        /**
+         * Sets if stack traces should be captured for Nodes. See `Node.getNodeStackTraces`. Default is disabled.
+         */
+        export type setNodeStackTracesEnabledParameters = {
+            /**
+             * Enable or disable.
+             */
+            enable: boolean;
+        }
+        export type setNodeStackTracesEnabledReturnValue = {
+        }
+        /**
+         * Gets stack traces associated with a Node. As of now, only provides stack trace for Node creation.
+         */
+        export type getNodeStackTracesParameters = {
+            /**
+             * Id of the node to get stack traces for.
+             */
+            nodeId: NodeId;
+        }
+        export type getNodeStackTracesReturnValue = {
+            /**
+             * Creation stack trace, if available.
+             */
+            creation?: Runtime.StackTrace;
+        }
+        /**
+         * Returns file information for the given
+File wrapper.
+         */
+        export type getFileInfoParameters = {
+            /**
+             * JavaScript object id of the node wrapper.
+             */
+            objectId: Runtime.RemoteObjectId;
+        }
+        export type getFileInfoReturnValue = {
+            path: string;
+        }
+        /**
+         * Enables console to refer to the node with given id via $x (see Command Line API for more details
+$x functions).
+         */
+        export type setInspectedNodeParameters = {
+            /**
+             * DOM node id to be accessible by means of $x command line API.
+             */
+            nodeId: NodeId;
+        }
+        export type setInspectedNodeReturnValue = {
+        }
+        /**
+         * Sets node name for a node with given id.
+         */
+        export type setNodeNameParameters = {
+            /**
+             * Id of the node to set name for.
+             */
+            nodeId: NodeId;
+            /**
+             * New node's name.
+             */
+            name: string;
+        }
+        export type setNodeNameReturnValue = {
+            /**
+             * New node's id.
+             */
+            nodeId: NodeId;
+        }
+        /**
+         * Sets node value for a node with given id.
+         */
+        export type setNodeValueParameters = {
+            /**
+             * Id of the node to set value for.
+             */
+            nodeId: NodeId;
+            /**
+             * New node's value.
+             */
+            value: string;
+        }
+        export type setNodeValueReturnValue = {
+        }
+        /**
+         * Sets node HTML markup, returns new node id.
+         */
+        export type setOuterHTMLParameters = {
+            /**
+             * Id of the node to set markup for.
+             */
+            nodeId: NodeId;
+            /**
+             * Outer HTML markup to set.
+             */
+            outerHTML: string;
+        }
+        export type setOuterHTMLReturnValue = {
+        }
+        /**
+         * Undoes the last performed action.
+         */
+        export type undoParameters = {
+        }
+        export type undoReturnValue = {
+        }
+        /**
+         * Returns iframe node that owns iframe with the given domain.
+         */
+        export type getFrameOwnerParameters = {
+            frameId: Page.FrameId;
+        }
+        export type getFrameOwnerReturnValue = {
+            /**
+             * Resulting node.
+             */
+            backendNodeId: BackendNodeId;
+            /**
+             * Id of the node at given coordinates, only when enabled and requested document.
+             */
+            nodeId?: NodeId;
+        }
+    }
+    
+    /**
+     * DOM debugging allows setting breakpoints on particular DOM operations and events. JavaScript
+execution will stop on these operations as if there was a regular breakpoint set.
+     */
+    export module DOMDebugger {
+        /**
+         * DOM breakpoint type.
+         */
+        export type DOMBreakpointType = "subtree-modified"|"attribute-modified"|"node-removed";
+        /**
+         * Object event listener.
+         */
+        export interface EventListener {
+            /**
+             * `EventListener`'s type.
+             */
+            type: string;
+            /**
+             * `EventListener`'s useCapture.
+             */
+            useCapture: boolean;
+            /**
+             * `EventListener`'s passive flag.
+             */
+            passive: boolean;
+            /**
+             * `EventListener`'s once flag.
+             */
+            once: boolean;
+            /**
+             * Script id of the handler code.
+             */
+            scriptId: Runtime.ScriptId;
+            /**
+             * Line number in the script (0-based).
+             */
+            lineNumber: number;
+            /**
+             * Column number in the script (0-based).
+             */
+            columnNumber: number;
+            /**
+             * Event handler function value.
+             */
+            handler?: Runtime.RemoteObject;
+            /**
+             * Event original handler function value.
+             */
+            originalHandler?: Runtime.RemoteObject;
+            /**
+             * Node the listener is added to (if any).
+             */
+            backendNodeId?: DOM.BackendNodeId;
+        }
+        
+        
+        /**
+         * Returns event listeners of the given object.
+         */
+        export type getEventListenersParameters = {
+            /**
+             * Identifier of the object to return listeners for.
+             */
+            objectId: Runtime.RemoteObjectId;
+            /**
+             * The maximum depth at which Node children should be retrieved, defaults to 1. Use -1 for the
+entire subtree or provide an integer larger than 0.
+             */
+            depth?: number;
+            /**
+             * Whether or not iframes and shadow roots should be traversed when returning the subtree
+(default is false). Reports listeners for all contexts if pierce is enabled.
+             */
+            pierce?: boolean;
+        }
+        export type getEventListenersReturnValue = {
+            /**
+             * Array of relevant listeners.
+             */
+            listeners: EventListener[];
+        }
+        /**
+         * Removes DOM breakpoint that was set using `setDOMBreakpoint`.
+         */
+        export type removeDOMBreakpointParameters = {
+            /**
+             * Identifier of the node to remove breakpoint from.
+             */
+            nodeId: DOM.NodeId;
+            /**
+             * Type of the breakpoint to remove.
+             */
+            type: DOMBreakpointType;
+        }
+        export type removeDOMBreakpointReturnValue = {
+        }
+        /**
+         * Removes breakpoint on particular DOM event.
+         */
+        export type removeEventListenerBreakpointParameters = {
+            /**
+             * Event name.
+             */
+            eventName: string;
+            /**
+             * EventTarget interface name.
+             */
+            targetName?: string;
+        }
+        export type removeEventListenerBreakpointReturnValue = {
+        }
+        /**
+         * Removes breakpoint on particular native event.
+         */
+        export type removeInstrumentationBreakpointParameters = {
+            /**
+             * Instrumentation name to stop on.
+             */
+            eventName: string;
+        }
+        export type removeInstrumentationBreakpointReturnValue = {
+        }
+        /**
+         * Removes breakpoint from XMLHttpRequest.
+         */
+        export type removeXHRBreakpointParameters = {
+            /**
+             * Resource URL substring.
+             */
+            url: string;
+        }
+        export type removeXHRBreakpointReturnValue = {
+        }
+        /**
+         * Sets breakpoint on particular operation with DOM.
+         */
+        export type setDOMBreakpointParameters = {
+            /**
+             * Identifier of the node to set breakpoint on.
+             */
+            nodeId: DOM.NodeId;
+            /**
+             * Type of the operation to stop upon.
+             */
+            type: DOMBreakpointType;
+        }
+        export type setDOMBreakpointReturnValue = {
+        }
+        /**
+         * Sets breakpoint on particular DOM event.
+         */
+        export type setEventListenerBreakpointParameters = {
+            /**
+             * DOM Event name to stop on (any DOM event will do).
+             */
+            eventName: string;
+            /**
+             * EventTarget interface name to stop on. If equal to `"*"` or not provided, will stop on any
+EventTarget.
+             */
+            targetName?: string;
+        }
+        export type setEventListenerBreakpointReturnValue = {
+        }
+        /**
+         * Sets breakpoint on particular native event.
+         */
+        export type setInstrumentationBreakpointParameters = {
+            /**
+             * Instrumentation name to stop on.
+             */
+            eventName: string;
+        }
+        export type setInstrumentationBreakpointReturnValue = {
+        }
+        /**
+         * Sets breakpoint on XMLHttpRequest.
+         */
+        export type setXHRBreakpointParameters = {
+            /**
+             * Resource URL substring. All XHRs having this substring in the URL will get stopped upon.
+             */
+            url: string;
+        }
+        export type setXHRBreakpointReturnValue = {
+        }
+    }
+    
+    /**
+     * This domain facilitates obtaining document snapshots with DOM, layout, and style information.
+     */
+    export module DOMSnapshot {
+        /**
+         * A Node in the DOM tree.
+         */
+        export interface DOMNode {
+            /**
+             * `Node`'s nodeType.
+             */
+            nodeType: number;
+            /**
+             * `Node`'s nodeName.
+             */
+            nodeName: string;
+            /**
+             * `Node`'s nodeValue.
+             */
+            nodeValue: string;
+            /**
+             * Only set for textarea elements, contains the text value.
+             */
+            textValue?: string;
+            /**
+             * Only set for input elements, contains the input's associated text value.
+             */
+            inputValue?: string;
+            /**
+             * Only set for radio and checkbox input elements, indicates if the element has been checked
+             */
+            inputChecked?: boolean;
+            /**
+             * Only set for option elements, indicates if the element has been selected
+             */
+            optionSelected?: boolean;
+            /**
+             * `Node`'s id, corresponds to DOM.Node.backendNodeId.
+             */
+            backendNodeId: DOM.BackendNodeId;
+            /**
+             * The indexes of the node's child nodes in the `domNodes` array returned by `getSnapshot`, if
+any.
+             */
+            childNodeIndexes?: number[];
+            /**
+             * Attributes of an `Element` node.
+             */
+            attributes?: NameValue[];
+            /**
+             * Indexes of pseudo elements associated with this node in the `domNodes` array returned by
+`getSnapshot`, if any.
+             */
+            pseudoElementIndexes?: number[];
+            /**
+             * The index of the node's related layout tree node in the `layoutTreeNodes` array returned by
+`getSnapshot`, if any.
+             */
+            layoutNodeIndex?: number;
+            /**
+             * Document URL that `Document` or `FrameOwner` node points to.
+             */
+            documentURL?: string;
+            /**
+             * Base URL that `Document` or `FrameOwner` node uses for URL completion.
+             */
+            baseURL?: string;
+            /**
+             * Only set for documents, contains the document's content language.
+             */
+            contentLanguage?: string;
+            /**
+             * Only set for documents, contains the document's character set encoding.
+             */
+            documentEncoding?: string;
+            /**
+             * `DocumentType` node's publicId.
+             */
+            publicId?: string;
+            /**
+             * `DocumentType` node's systemId.
+             */
+            systemId?: string;
+            /**
+             * Frame ID for frame owner elements and also for the document node.
+             */
+            frameId?: Page.FrameId;
+            /**
+             * The index of a frame owner element's content document in the `domNodes` array returned by
+`getSnapshot`, if any.
+             */
+            contentDocumentIndex?: number;
+            /**
+             * Type of a pseudo element node.
+             */
+            pseudoType?: DOM.PseudoType;
+            /**
+             * Shadow root type.
+             */
+            shadowRootType?: DOM.ShadowRootType;
+            /**
+             * Whether this DOM node responds to mouse clicks. This includes nodes that have had click
+event listeners attached via JavaScript as well as anchor tags that naturally navigate when
+clicked.
+             */
+            isClickable?: boolean;
+            /**
+             * Details of the node's event listeners, if any.
+             */
+            eventListeners?: DOMDebugger.EventListener[];
+            /**
+             * The selected url for nodes with a srcset attribute.
+             */
+            currentSourceURL?: string;
+            /**
+             * The url of the script (if any) that generates this node.
+             */
+            originURL?: string;
+            /**
+             * Scroll offsets, set when this node is a Document.
+             */
+            scrollOffsetX?: number;
+            scrollOffsetY?: number;
+        }
+        /**
+         * Details of post layout rendered text positions. The exact layout should not be regarded as
+stable and may change between versions.
+         */
+        export interface InlineTextBox {
+            /**
+             * The bounding box in document coordinates. Note that scroll offset of the document is ignored.
+             */
+            boundingBox: DOM.Rect;
+            /**
+             * The starting index in characters, for this post layout textbox substring. Characters that
+would be represented as a surrogate pair in UTF-16 have length 2.
+             */
+            startCharacterIndex: number;
+            /**
+             * The number of characters in this post layout textbox substring. Characters that would be
+represented as a surrogate pair in UTF-16 have length 2.
+             */
+            numCharacters: number;
+        }
+        /**
+         * Details of an element in the DOM tree with a LayoutObject.
+         */
+        export interface LayoutTreeNode {
+            /**
+             * The index of the related DOM node in the `domNodes` array returned by `getSnapshot`.
+             */
+            domNodeIndex: number;
+            /**
+             * The bounding box in document coordinates. Note that scroll offset of the document is ignored.
+             */
+            boundingBox: DOM.Rect;
+            /**
+             * Contents of the LayoutText, if any.
+             */
+            layoutText?: string;
+            /**
+             * The post-layout inline text nodes, if any.
+             */
+            inlineTextNodes?: InlineTextBox[];
+            /**
+             * Index into the `computedStyles` array returned by `getSnapshot`.
+             */
+            styleIndex?: number;
+            /**
+             * Global paint order index, which is determined by the stacking order of the nodes. Nodes
+that are painted together will have the same index. Only provided if includePaintOrder in
+getSnapshot was true.
+             */
+            paintOrder?: number;
+            /**
+             * Set to true to indicate the element begins a new stacking context.
+             */
+            isStackingContext?: boolean;
+        }
+        /**
+         * A subset of the full ComputedStyle as defined by the request whitelist.
+         */
+        export interface ComputedStyle {
+            /**
+             * Name/value pairs of computed style properties.
+             */
+            properties: NameValue[];
+        }
+        /**
+         * A name/value pair.
+         */
+        export interface NameValue {
+            /**
+             * Attribute/property name.
+             */
+            name: string;
+            /**
+             * Attribute/property value.
+             */
+            value: string;
+        }
+        /**
+         * Index of the string in the strings table.
+         */
+        export type StringIndex = number;
+        /**
+         * Index of the string in the strings table.
+         */
+        export type ArrayOfStrings = StringIndex[];
+        /**
+         * Data that is only present on rare nodes.
+         */
+        export interface RareStringData {
+            index: number[];
+            value: StringIndex[];
+        }
+        export interface RareBooleanData {
+            index: number[];
+        }
+        export interface RareIntegerData {
+            index: number[];
+            value: number[];
+        }
+        export type Rectangle = number[];
+        /**
+         * Document snapshot.
+         */
+        export interface DocumentSnapshot {
+            /**
+             * Document URL that `Document` or `FrameOwner` node points to.
+             */
+            documentURL: StringIndex;
+            /**
+             * Document title.
+             */
+            title: StringIndex;
+            /**
+             * Base URL that `Document` or `FrameOwner` node uses for URL completion.
+             */
+            baseURL: StringIndex;
+            /**
+             * Contains the document's content language.
+             */
+            contentLanguage: StringIndex;
+            /**
+             * Contains the document's character set encoding.
+             */
+            encodingName: StringIndex;
+            /**
+             * `DocumentType` node's publicId.
+             */
+            publicId: StringIndex;
+            /**
+             * `DocumentType` node's systemId.
+             */
+            systemId: StringIndex;
+            /**
+             * Frame ID for frame owner elements and also for the document node.
+             */
+            frameId: StringIndex;
+            /**
+             * A table with dom nodes.
+             */
+            nodes: NodeTreeSnapshot;
+            /**
+             * The nodes in the layout tree.
+             */
+            layout: LayoutTreeSnapshot;
+            /**
+             * The post-layout inline text nodes.
+             */
+            textBoxes: TextBoxSnapshot;
+            /**
+             * Horizontal scroll offset.
+             */
+            scrollOffsetX?: number;
+            /**
+             * Vertical scroll offset.
+             */
+            scrollOffsetY?: number;
+            /**
+             * Document content width.
+             */
+            contentWidth?: number;
+            /**
+             * Document content height.
+             */
+            contentHeight?: number;
+        }
+        /**
+         * Table containing nodes.
+         */
+        export interface NodeTreeSnapshot {
+            /**
+             * Parent node index.
+             */
+            parentIndex?: number[];
+            /**
+             * `Node`'s nodeType.
+             */
+            nodeType?: number[];
+            /**
+             * `Node`'s nodeName.
+             */
+            nodeName?: StringIndex[];
+            /**
+             * `Node`'s nodeValue.
+             */
+            nodeValue?: StringIndex[];
+            /**
+             * `Node`'s id, corresponds to DOM.Node.backendNodeId.
+             */
+            backendNodeId?: DOM.BackendNodeId[];
+            /**
+             * Attributes of an `Element` node. Flatten name, value pairs.
+             */
+            attributes?: ArrayOfStrings[];
+            /**
+             * Only set for textarea elements, contains the text value.
+             */
+            textValue?: RareStringData;
+            /**
+             * Only set for input elements, contains the input's associated text value.
+             */
+            inputValue?: RareStringData;
+            /**
+             * Only set for radio and checkbox input elements, indicates if the element has been checked
+             */
+            inputChecked?: RareBooleanData;
+            /**
+             * Only set for option elements, indicates if the element has been selected
+             */
+            optionSelected?: RareBooleanData;
+            /**
+             * The index of the document in the list of the snapshot documents.
+             */
+            contentDocumentIndex?: RareIntegerData;
+            /**
+             * Type of a pseudo element node.
+             */
+            pseudoType?: RareStringData;
+            /**
+             * Whether this DOM node responds to mouse clicks. This includes nodes that have had click
+event listeners attached via JavaScript as well as anchor tags that naturally navigate when
+clicked.
+             */
+            isClickable?: RareBooleanData;
+            /**
+             * The selected url for nodes with a srcset attribute.
+             */
+            currentSourceURL?: RareStringData;
+            /**
+             * The url of the script (if any) that generates this node.
+             */
+            originURL?: RareStringData;
+        }
+        /**
+         * Table of details of an element in the DOM tree with a LayoutObject.
+         */
+        export interface LayoutTreeSnapshot {
+            /**
+             * Index of the corresponding node in the `NodeTreeSnapshot` array returned by `captureSnapshot`.
+             */
+            nodeIndex: number[];
+            /**
+             * Array of indexes specifying computed style strings, filtered according to the `computedStyles` parameter passed to `captureSnapshot`.
+             */
+            styles: ArrayOfStrings[];
+            /**
+             * The absolute position bounding box.
+             */
+            bounds: Rectangle[];
+            /**
+             * Contents of the LayoutText, if any.
+             */
+            text: StringIndex[];
+            /**
+             * Stacking context information.
+             */
+            stackingContexts: RareBooleanData;
+            /**
+             * Global paint order index, which is determined by the stacking order of the nodes. Nodes
+that are painted together will have the same index. Only provided if includePaintOrder in
+captureSnapshot was true.
+             */
+            paintOrders?: number[];
+            /**
+             * The offset rect of nodes. Only available when includeDOMRects is set to true
+             */
+            offsetRects?: Rectangle[];
+            /**
+             * The scroll rect of nodes. Only available when includeDOMRects is set to true
+             */
+            scrollRects?: Rectangle[];
+            /**
+             * The client rect of nodes. Only available when includeDOMRects is set to true
+             */
+            clientRects?: Rectangle[];
+        }
+        /**
+         * Table of details of the post layout rendered text positions. The exact layout should not be regarded as
+stable and may change between versions.
+         */
+        export interface TextBoxSnapshot {
+            /**
+             * Index of the layout tree node that owns this box collection.
+             */
+            layoutIndex: number[];
+            /**
+             * The absolute position bounding box.
+             */
+            bounds: Rectangle[];
+            /**
+             * The starting index in characters, for this post layout textbox substring. Characters that
+would be represented as a surrogate pair in UTF-16 have length 2.
+             */
+            start: number[];
+            /**
+             * The number of characters in this post layout textbox substring. Characters that would be
+represented as a surrogate pair in UTF-16 have length 2.
+             */
+            length: number[];
+        }
+        
+        
+        /**
+         * Disables DOM snapshot agent for the given page.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables DOM snapshot agent for the given page.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Returns a document snapshot, including the full DOM tree of the root node (including iframes,
+template contents, and imported documents) in a flattened array, as well as layout and
+white-listed computed style information for the nodes. Shadow DOM in the returned DOM tree is
+flattened.
+         */
+        export type getSnapshotParameters = {
+            /**
+             * Whitelist of computed styles to return.
+             */
+            computedStyleWhitelist: string[];
+            /**
+             * Whether or not to retrieve details of DOM listeners (default false).
+             */
+            includeEventListeners?: boolean;
+            /**
+             * Whether to determine and include the paint order index of LayoutTreeNodes (default false).
+             */
+            includePaintOrder?: boolean;
+            /**
+             * Whether to include UA shadow tree in the snapshot (default false).
+             */
+            includeUserAgentShadowTree?: boolean;
+        }
+        export type getSnapshotReturnValue = {
+            /**
+             * The nodes in the DOM tree. The DOMNode at index 0 corresponds to the root document.
+             */
+            domNodes: DOMNode[];
+            /**
+             * The nodes in the layout tree.
+             */
+            layoutTreeNodes: LayoutTreeNode[];
+            /**
+             * Whitelisted ComputedStyle properties for each node in the layout tree.
+             */
+            computedStyles: ComputedStyle[];
+        }
+        /**
+         * Returns a document snapshot, including the full DOM tree of the root node (including iframes,
+template contents, and imported documents) in a flattened array, as well as layout and
+white-listed computed style information for the nodes. Shadow DOM in the returned DOM tree is
+flattened.
+         */
+        export type captureSnapshotParameters = {
+            /**
+             * Whitelist of computed styles to return.
+             */
+            computedStyles: string[];
+            /**
+             * Whether to include layout object paint orders into the snapshot.
+             */
+            includePaintOrder?: boolean;
+            /**
+             * Whether to include DOM rectangles (offsetRects, clientRects, scrollRects) into the snapshot
+             */
+            includeDOMRects?: boolean;
+        }
+        export type captureSnapshotReturnValue = {
+            /**
+             * The nodes in the DOM tree. The DOMNode at index 0 corresponds to the root document.
+             */
+            documents: DocumentSnapshot[];
+            /**
+             * Shared string table that all string properties refer to with indexes.
+             */
+            strings: string[];
+        }
+    }
+    
+    /**
+     * Query and modify DOM storage.
+     */
+    export module DOMStorage {
+        /**
+         * DOM Storage identifier.
+         */
+        export interface StorageId {
+            /**
+             * Security origin for the storage.
+             */
+            securityOrigin: string;
+            /**
+             * Whether the storage is local storage (not session storage).
+             */
+            isLocalStorage: boolean;
+        }
+        /**
+         * DOM Storage item.
+         */
+        export type Item = string[];
+        
+        export type domStorageItemAddedPayload = {
+            storageId: StorageId;
+            key: string;
+            newValue: string;
+        }
+        export type domStorageItemRemovedPayload = {
+            storageId: StorageId;
+            key: string;
+        }
+        export type domStorageItemUpdatedPayload = {
+            storageId: StorageId;
+            key: string;
+            oldValue: string;
+            newValue: string;
+        }
+        export type domStorageItemsClearedPayload = {
+            storageId: StorageId;
+        }
+        
+        export type clearParameters = {
+            storageId: StorageId;
+        }
+        export type clearReturnValue = {
+        }
+        /**
+         * Disables storage tracking, prevents storage events from being sent to the client.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables storage tracking, storage events will now be delivered to the client.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        export type getDOMStorageItemsParameters = {
+            storageId: StorageId;
+        }
+        export type getDOMStorageItemsReturnValue = {
+            entries: Item[];
+        }
+        export type removeDOMStorageItemParameters = {
+            storageId: StorageId;
+            key: string;
+        }
+        export type removeDOMStorageItemReturnValue = {
+        }
+        export type setDOMStorageItemParameters = {
+            storageId: StorageId;
+            key: string;
+            value: string;
+        }
+        export type setDOMStorageItemReturnValue = {
+        }
+    }
+    
+    export module Database {
+        /**
+         * Unique identifier of Database object.
+         */
+        export type DatabaseId = string;
+        /**
+         * Database object.
+         */
+        export interface Database {
+            /**
+             * Database ID.
+             */
+            id: DatabaseId;
+            /**
+             * Database domain.
+             */
+            domain: string;
+            /**
+             * Database name.
+             */
+            name: string;
+            /**
+             * Database version.
+             */
+            version: string;
+        }
+        /**
+         * Database error.
+         */
+        export interface Error {
+            /**
+             * Error message.
+             */
+            message: string;
+            /**
+             * Error code.
+             */
+            code: number;
+        }
+        
+        export type addDatabasePayload = {
+            database: Database;
+        }
+        
+        /**
+         * Disables database tracking, prevents database events from being sent to the client.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables database tracking, database events will now be delivered to the client.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        export type executeSQLParameters = {
+            databaseId: DatabaseId;
+            query: string;
+        }
+        export type executeSQLReturnValue = {
+            columnNames?: string[];
+            values?: any[];
+            sqlError?: Error;
+        }
+        export type getDatabaseTableNamesParameters = {
+            databaseId: DatabaseId;
+        }
+        export type getDatabaseTableNamesReturnValue = {
+            tableNames: string[];
+        }
+    }
+    
+    export module DeviceOrientation {
+        
+        
+        /**
+         * Clears the overridden Device Orientation.
+         */
+        export type clearDeviceOrientationOverrideParameters = {
+        }
+        export type clearDeviceOrientationOverrideReturnValue = {
+        }
+        /**
+         * Overrides the Device Orientation.
+         */
+        export type setDeviceOrientationOverrideParameters = {
+            /**
+             * Mock alpha
+             */
+            alpha: number;
+            /**
+             * Mock beta
+             */
+            beta: number;
+            /**
+             * Mock gamma
+             */
+            gamma: number;
+        }
+        export type setDeviceOrientationOverrideReturnValue = {
+        }
+    }
+    
+    /**
+     * This domain emulates different environments for the page.
+     */
+    export module Emulation {
+        /**
+         * Screen orientation.
+         */
+        export interface ScreenOrientation {
+            /**
+             * Orientation type.
+             */
+            type: "portraitPrimary"|"portraitSecondary"|"landscapePrimary"|"landscapeSecondary";
+            /**
+             * Orientation angle.
+             */
+            angle: number;
+        }
+        export interface MediaFeature {
+            name: string;
+            value: string;
+        }
+        /**
+         * advance: If the scheduler runs out of immediate work, the virtual time base may fast forward to
+allow the next delayed task (if any) to run; pause: The virtual time base may not advance;
+pauseIfNetworkFetchesPending: The virtual time base may not advance if there are any pending
+resource fetches.
+         */
+        export type VirtualTimePolicy = "advance"|"pause"|"pauseIfNetworkFetchesPending";
+        
+        /**
+         * Notification sent after the virtual time budget for the current VirtualTimePolicy has run out.
+         */
+        export type virtualTimeBudgetExpiredPayload = void;
+        
+        /**
+         * Tells whether emulation is supported.
+         */
+        export type canEmulateParameters = {
+        }
+        export type canEmulateReturnValue = {
+            /**
+             * True if emulation is supported.
+             */
+            result: boolean;
+        }
+        /**
+         * Clears the overriden device metrics.
+         */
+        export type clearDeviceMetricsOverrideParameters = {
+        }
+        export type clearDeviceMetricsOverrideReturnValue = {
+        }
+        /**
+         * Clears the overriden Geolocation Position and Error.
+         */
+        export type clearGeolocationOverrideParameters = {
+        }
+        export type clearGeolocationOverrideReturnValue = {
+        }
+        /**
+         * Requests that page scale factor is reset to initial values.
+         */
+        export type resetPageScaleFactorParameters = {
+        }
+        export type resetPageScaleFactorReturnValue = {
+        }
+        /**
+         * Enables or disables simulating a focused and active page.
+         */
+        export type setFocusEmulationEnabledParameters = {
+            /**
+             * Whether to enable to disable focus emulation.
+             */
+            enabled: boolean;
+        }
+        export type setFocusEmulationEnabledReturnValue = {
+        }
+        /**
+         * Enables CPU throttling to emulate slow CPUs.
+         */
+        export type setCPUThrottlingRateParameters = {
+            /**
+             * Throttling rate as a slowdown factor (1 is no throttle, 2 is 2x slowdown, etc).
+             */
+            rate: number;
+        }
+        export type setCPUThrottlingRateReturnValue = {
+        }
+        /**
+         * Sets or clears an override of the default background color of the frame. This override is used
+if the content does not specify one.
+         */
+        export type setDefaultBackgroundColorOverrideParameters = {
+            /**
+             * RGBA of the default background color. If not specified, any existing override will be
+cleared.
+             */
+            color?: DOM.RGBA;
+        }
+        export type setDefaultBackgroundColorOverrideReturnValue = {
+        }
+        /**
+         * Overrides the values of device screen dimensions (window.screen.width, window.screen.height,
+window.innerWidth, window.innerHeight, and "device-width"/"device-height"-related CSS media
+query results).
+         */
+        export type setDeviceMetricsOverrideParameters = {
+            /**
+             * Overriding width value in pixels (minimum 0, maximum 10000000). 0 disables the override.
+             */
+            width: number;
+            /**
+             * Overriding height value in pixels (minimum 0, maximum 10000000). 0 disables the override.
+             */
+            height: number;
+            /**
+             * Overriding device scale factor value. 0 disables the override.
+             */
+            deviceScaleFactor: number;
+            /**
+             * Whether to emulate mobile device. This includes viewport meta tag, overlay scrollbars, text
+autosizing and more.
+             */
+            mobile: boolean;
+            /**
+             * Scale to apply to resulting view image.
+             */
+            scale?: number;
+            /**
+             * Overriding screen width value in pixels (minimum 0, maximum 10000000).
+             */
+            screenWidth?: number;
+            /**
+             * Overriding screen height value in pixels (minimum 0, maximum 10000000).
+             */
+            screenHeight?: number;
+            /**
+             * Overriding view X position on screen in pixels (minimum 0, maximum 10000000).
+             */
+            positionX?: number;
+            /**
+             * Overriding view Y position on screen in pixels (minimum 0, maximum 10000000).
+             */
+            positionY?: number;
+            /**
+             * Do not set visible view size, rely upon explicit setVisibleSize call.
+             */
+            dontSetVisibleSize?: boolean;
+            /**
+             * Screen orientation override.
+             */
+            screenOrientation?: ScreenOrientation;
+            /**
+             * If set, the visible area of the page will be overridden to this viewport. This viewport
+change is not observed by the page, e.g. viewport-relative elements do not change positions.
+             */
+            viewport?: Page.Viewport;
+        }
+        export type setDeviceMetricsOverrideReturnValue = {
+        }
+        export type setScrollbarsHiddenParameters = {
+            /**
+             * Whether scrollbars should be always hidden.
+             */
+            hidden: boolean;
+        }
+        export type setScrollbarsHiddenReturnValue = {
+        }
+        export type setDocumentCookieDisabledParameters = {
+            /**
+             * Whether document.coookie API should be disabled.
+             */
+            disabled: boolean;
+        }
+        export type setDocumentCookieDisabledReturnValue = {
+        }
+        export type setEmitTouchEventsForMouseParameters = {
+            /**
+             * Whether touch emulation based on mouse input should be enabled.
+             */
+            enabled: boolean;
+            /**
+             * Touch/gesture events configuration. Default: current platform.
+             */
+            configuration?: "mobile"|"desktop";
+        }
+        export type setEmitTouchEventsForMouseReturnValue = {
+        }
+        /**
+         * Emulates the given media type or media feature for CSS media queries.
+         */
+        export type setEmulatedMediaParameters = {
+            /**
+             * Media type to emulate. Empty string disables the override.
+             */
+            media?: string;
+            /**
+             * Media features to emulate.
+             */
+            features?: MediaFeature[];
+        }
+        export type setEmulatedMediaReturnValue = {
+        }
+        /**
+         * Overrides the Geolocation Position or Error. Omitting any of the parameters emulates position
+unavailable.
+         */
+        export type setGeolocationOverrideParameters = {
+            /**
+             * Mock latitude
+             */
+            latitude?: number;
+            /**
+             * Mock longitude
+             */
+            longitude?: number;
+            /**
+             * Mock accuracy
+             */
+            accuracy?: number;
+        }
+        export type setGeolocationOverrideReturnValue = {
+        }
+        /**
+         * Overrides value returned by the javascript navigator object.
+         */
+        export type setNavigatorOverridesParameters = {
+            /**
+             * The platform navigator.platform should return.
+             */
+            platform: string;
+        }
+        export type setNavigatorOverridesReturnValue = {
+        }
+        /**
+         * Sets a specified page scale factor.
+         */
+        export type setPageScaleFactorParameters = {
+            /**
+             * Page scale factor.
+             */
+            pageScaleFactor: number;
+        }
+        export type setPageScaleFactorReturnValue = {
+        }
+        /**
+         * Switches script execution in the page.
+         */
+        export type setScriptExecutionDisabledParameters = {
+            /**
+             * Whether script execution should be disabled in the page.
+             */
+            value: boolean;
+        }
+        export type setScriptExecutionDisabledReturnValue = {
+        }
+        /**
+         * Enables touch on platforms which do not support them.
+         */
+        export type setTouchEmulationEnabledParameters = {
+            /**
+             * Whether the touch event emulation should be enabled.
+             */
+            enabled: boolean;
+            /**
+             * Maximum touch points supported. Defaults to one.
+             */
+            maxTouchPoints?: number;
+        }
+        export type setTouchEmulationEnabledReturnValue = {
+        }
+        /**
+         * Turns on virtual time for all frames (replacing real-time with a synthetic time source) and sets
+the current virtual time policy.  Note this supersedes any previous time budget.
+         */
+        export type setVirtualTimePolicyParameters = {
+            policy: VirtualTimePolicy;
+            /**
+             * If set, after this many virtual milliseconds have elapsed virtual time will be paused and a
+virtualTimeBudgetExpired event is sent.
+             */
+            budget?: number;
+            /**
+             * If set this specifies the maximum number of tasks that can be run before virtual is forced
+forwards to prevent deadlock.
+             */
+            maxVirtualTimeTaskStarvationCount?: number;
+            /**
+             * If set the virtual time policy change should be deferred until any frame starts navigating.
+Note any previous deferred policy change is superseded.
+             */
+            waitForNavigation?: boolean;
+            /**
+             * If set, base::Time::Now will be overriden to initially return this value.
+             */
+            initialVirtualTime?: Network.TimeSinceEpoch;
+        }
+        export type setVirtualTimePolicyReturnValue = {
+            /**
+             * Absolute timestamp at which virtual time was first enabled (up time in milliseconds).
+             */
+            virtualTimeTicksBase: number;
+        }
+        /**
+         * Overrides default host system timezone with the specified one.
+         */
+        export type setTimezoneOverrideParameters = {
+            /**
+             * The timezone identifier. If empty, disables the override and
+restores default host system timezone.
+             */
+            timezoneId: string;
+        }
+        export type setTimezoneOverrideReturnValue = {
+        }
+        /**
+         * Resizes the frame/viewport of the page. Note that this does not affect the frame's container
+(e.g. browser window). Can be used to produce screenshots of the specified size. Not supported
+on Android.
+         */
+        export type setVisibleSizeParameters = {
+            /**
+             * Frame width (DIP).
+             */
+            width: number;
+            /**
+             * Frame height (DIP).
+             */
+            height: number;
+        }
+        export type setVisibleSizeReturnValue = {
+        }
+        /**
+         * Allows overriding user agent with the given string.
+         */
+        export type setUserAgentOverrideParameters = {
+            /**
+             * User agent to use.
+             */
+            userAgent: string;
+            /**
+             * Browser langugage to emulate.
+             */
+            acceptLanguage?: string;
+            /**
+             * The platform navigator.platform should return.
+             */
+            platform?: string;
+        }
+        export type setUserAgentOverrideReturnValue = {
+        }
+    }
+    
+    /**
+     * This domain provides experimental commands only supported in headless mode.
+     */
+    export module HeadlessExperimental {
+        /**
+         * Encoding options for a screenshot.
+         */
+        export interface ScreenshotParams {
+            /**
+             * Image compression format (defaults to png).
+             */
+            format?: "jpeg"|"png";
+            /**
+             * Compression quality from range [0..100] (jpeg only).
+             */
+            quality?: number;
+        }
+        
+        /**
+         * Issued when the target starts or stops needing BeginFrames.
+Deprecated. Issue beginFrame unconditionally instead and use result from
+beginFrame to detect whether the frames were suppressed.
+         */
+        export type needsBeginFramesChangedPayload = {
+            /**
+             * True if BeginFrames are needed, false otherwise.
+             */
+            needsBeginFrames: boolean;
+        }
+        
+        /**
+         * Sends a BeginFrame to the target and returns when the frame was completed. Optionally captures a
+screenshot from the resulting frame. Requires that the target was created with enabled
+BeginFrameControl. Designed for use with --run-all-compositor-stages-before-draw, see also
+https://goo.gl/3zHXhB for more background.
+         */
+        export type beginFrameParameters = {
+            /**
+             * Timestamp of this BeginFrame in Renderer TimeTicks (milliseconds of uptime). If not set,
+the current time will be used.
+             */
+            frameTimeTicks?: number;
+            /**
+             * The interval between BeginFrames that is reported to the compositor, in milliseconds.
+Defaults to a 60 frames/second interval, i.e. about 16.666 milliseconds.
+             */
+            interval?: number;
+            /**
+             * Whether updates should not be committed and drawn onto the display. False by default. If
+true, only side effects of the BeginFrame will be run, such as layout and animations, but
+any visual updates may not be visible on the display or in screenshots.
+             */
+            noDisplayUpdates?: boolean;
+            /**
+             * If set, a screenshot of the frame will be captured and returned in the response. Otherwise,
+no screenshot will be captured. Note that capturing a screenshot can fail, for example,
+during renderer initialization. In such a case, no screenshot data will be returned.
+             */
+            screenshot?: ScreenshotParams;
+        }
+        export type beginFrameReturnValue = {
+            /**
+             * Whether the BeginFrame resulted in damage and, thus, a new frame was committed to the
+display. Reported for diagnostic uses, may be removed in the future.
+             */
+            hasDamage: boolean;
+            /**
+             * Base64-encoded image data of the screenshot, if one was requested and successfully taken.
+             */
+            screenshotData?: binary;
+        }
+        /**
+         * Disables headless events for the target.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables headless events for the target.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+    }
+    
+    /**
+     * Input/Output operations for streams produced by DevTools.
+     */
+    export module IO {
+        /**
+         * This is either obtained from another method or specifed as `blob:&lt;uuid&gt;` where
+`&lt;uuid&gt` is an UUID of a Blob.
+         */
+        export type StreamHandle = string;
+        
+        
+        /**
+         * Close the stream, discard any temporary backing storage.
+         */
+        export type closeParameters = {
+            /**
+             * Handle of the stream to close.
+             */
+            handle: StreamHandle;
+        }
+        export type closeReturnValue = {
+        }
+        /**
+         * Read a chunk of the stream
+         */
+        export type readParameters = {
+            /**
+             * Handle of the stream to read.
+             */
+            handle: StreamHandle;
+            /**
+             * Seek to the specified offset before reading (if not specificed, proceed with offset
+following the last read). Some types of streams may only support sequential reads.
+             */
+            offset?: number;
+            /**
+             * Maximum number of bytes to read (left upon the agent discretion if not specified).
+             */
+            size?: number;
+        }
+        export type readReturnValue = {
+            /**
+             * Set if the data is base64-encoded
+             */
+            base64Encoded?: boolean;
+            /**
+             * Data that were read.
+             */
+            data: string;
+            /**
+             * Set if the end-of-file condition occured while reading.
+             */
+            eof: boolean;
+        }
+        /**
+         * Return UUID of Blob object specified by a remote object id.
+         */
+        export type resolveBlobParameters = {
+            /**
+             * Object id of a Blob object wrapper.
+             */
+            objectId: Runtime.RemoteObjectId;
+        }
+        export type resolveBlobReturnValue = {
+            /**
+             * UUID of the specified Blob.
+             */
+            uuid: string;
+        }
+    }
+    
+    export module IndexedDB {
+        /**
+         * Database with an array of object stores.
+         */
+        export interface DatabaseWithObjectStores {
+            /**
+             * Database name.
+             */
+            name: string;
+            /**
+             * Database version (type is not 'integer', as the standard
+requires the version number to be 'unsigned long long')
+             */
+            version: number;
+            /**
+             * Object stores in this database.
+             */
+            objectStores: ObjectStore[];
+        }
+        /**
+         * Object store.
+         */
+        export interface ObjectStore {
+            /**
+             * Object store name.
+             */
+            name: string;
+            /**
+             * Object store key path.
+             */
+            keyPath: KeyPath;
+            /**
+             * If true, object store has auto increment flag set.
+             */
+            autoIncrement: boolean;
+            /**
+             * Indexes in this object store.
+             */
+            indexes: ObjectStoreIndex[];
+        }
+        /**
+         * Object store index.
+         */
+        export interface ObjectStoreIndex {
+            /**
+             * Index name.
+             */
+            name: string;
+            /**
+             * Index key path.
+             */
+            keyPath: KeyPath;
+            /**
+             * If true, index is unique.
+             */
+            unique: boolean;
+            /**
+             * If true, index allows multiple entries for a key.
+             */
+            multiEntry: boolean;
+        }
+        /**
+         * Key.
+         */
+        export interface Key {
+            /**
+             * Key type.
+             */
+            type: "number"|"string"|"date"|"array";
+            /**
+             * Number value.
+             */
+            number?: number;
+            /**
+             * String value.
+             */
+            string?: string;
+            /**
+             * Date value.
+             */
+            date?: number;
+            /**
+             * Array value.
+             */
+            array?: Key[];
+        }
+        /**
+         * Key range.
+         */
+        export interface KeyRange {
+            /**
+             * Lower bound.
+             */
+            lower?: Key;
+            /**
+             * Upper bound.
+             */
+            upper?: Key;
+            /**
+             * If true lower bound is open.
+             */
+            lowerOpen: boolean;
+            /**
+             * If true upper bound is open.
+             */
+            upperOpen: boolean;
+        }
+        /**
+         * Data entry.
+         */
+        export interface DataEntry {
+            /**
+             * Key object.
+             */
+            key: Runtime.RemoteObject;
+            /**
+             * Primary key object.
+             */
+            primaryKey: Runtime.RemoteObject;
+            /**
+             * Value object.
+             */
+            value: Runtime.RemoteObject;
+        }
+        /**
+         * Key path.
+         */
+        export interface KeyPath {
+            /**
+             * Key path type.
+             */
+            type: "null"|"string"|"array";
+            /**
+             * String value.
+             */
+            string?: string;
+            /**
+             * Array value.
+             */
+            array?: string[];
+        }
+        
+        
+        /**
+         * Clears all entries from an object store.
+         */
+        export type clearObjectStoreParameters = {
+            /**
+             * Security origin.
+             */
+            securityOrigin: string;
+            /**
+             * Database name.
+             */
+            databaseName: string;
+            /**
+             * Object store name.
+             */
+            objectStoreName: string;
+        }
+        export type clearObjectStoreReturnValue = {
+        }
+        /**
+         * Deletes a database.
+         */
+        export type deleteDatabaseParameters = {
+            /**
+             * Security origin.
+             */
+            securityOrigin: string;
+            /**
+             * Database name.
+             */
+            databaseName: string;
+        }
+        export type deleteDatabaseReturnValue = {
+        }
+        /**
+         * Delete a range of entries from an object store
+         */
+        export type deleteObjectStoreEntriesParameters = {
+            securityOrigin: string;
+            databaseName: string;
+            objectStoreName: string;
+            /**
+             * Range of entry keys to delete
+             */
+            keyRange: KeyRange;
+        }
+        export type deleteObjectStoreEntriesReturnValue = {
+        }
+        /**
+         * Disables events from backend.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables events from backend.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Requests data from object store or index.
+         */
+        export type requestDataParameters = {
+            /**
+             * Security origin.
+             */
+            securityOrigin: string;
+            /**
+             * Database name.
+             */
+            databaseName: string;
+            /**
+             * Object store name.
+             */
+            objectStoreName: string;
+            /**
+             * Index name, empty string for object store data requests.
+             */
+            indexName: string;
+            /**
+             * Number of records to skip.
+             */
+            skipCount: number;
+            /**
+             * Number of records to fetch.
+             */
+            pageSize: number;
+            /**
+             * Key range.
+             */
+            keyRange?: KeyRange;
+        }
+        export type requestDataReturnValue = {
+            /**
+             * Array of object store data entries.
+             */
+            objectStoreDataEntries: DataEntry[];
+            /**
+             * If true, there are more entries to fetch in the given range.
+             */
+            hasMore: boolean;
+        }
+        /**
+         * Gets metadata of an object store
+         */
+        export type getMetadataParameters = {
+            /**
+             * Security origin.
+             */
+            securityOrigin: string;
+            /**
+             * Database name.
+             */
+            databaseName: string;
+            /**
+             * Object store name.
+             */
+            objectStoreName: string;
+        }
+        export type getMetadataReturnValue = {
+            /**
+             * the entries count
+             */
+            entriesCount: number;
+            /**
+             * the current value of key generator, to become the next inserted
+key into the object store. Valid if objectStore.autoIncrement
+is true.
+             */
+            keyGeneratorValue: number;
+        }
+        /**
+         * Requests database with given name in given frame.
+         */
+        export type requestDatabaseParameters = {
+            /**
+             * Security origin.
+             */
+            securityOrigin: string;
+            /**
+             * Database name.
+             */
+            databaseName: string;
+        }
+        export type requestDatabaseReturnValue = {
+            /**
+             * Database with an array of object stores.
+             */
+            databaseWithObjectStores: DatabaseWithObjectStores;
+        }
+        /**
+         * Requests database names for given security origin.
+         */
+        export type requestDatabaseNamesParameters = {
+            /**
+             * Security origin.
+             */
+            securityOrigin: string;
+        }
+        export type requestDatabaseNamesReturnValue = {
+            /**
+             * Database names for origin.
+             */
+            databaseNames: string[];
+        }
+    }
+    
+    export module Input {
+        export interface TouchPoint {
+            /**
+             * X coordinate of the event relative to the main frame's viewport in CSS pixels.
+             */
+            x: number;
+            /**
+             * Y coordinate of the event relative to the main frame's viewport in CSS pixels. 0 refers to
+the top of the viewport and Y increases as it proceeds towards the bottom of the viewport.
+             */
+            y: number;
+            /**
+             * X radius of the touch area (default: 1.0).
+             */
+            radiusX?: number;
+            /**
+             * Y radius of the touch area (default: 1.0).
+             */
+            radiusY?: number;
+            /**
+             * Rotation angle (default: 0.0).
+             */
+            rotationAngle?: number;
+            /**
+             * Force (default: 1.0).
+             */
+            force?: number;
+            /**
+             * Identifier used to track touch sources between events, must be unique within an event.
+             */
+            id?: number;
+        }
+        export type GestureSourceType = "default"|"touch"|"mouse";
+        export type MouseButton = "none"|"left"|"middle"|"right"|"back"|"forward";
+        /**
+         * UTC time in seconds, counted from January 1, 1970.
+         */
+        export type TimeSinceEpoch = number;
+        
+        
+        /**
+         * Dispatches a key event to the page.
+         */
+        export type dispatchKeyEventParameters = {
+            /**
+             * Type of the key event.
+             */
+            type: "keyDown"|"keyUp"|"rawKeyDown"|"char";
+            /**
+             * Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
+(default: 0).
+             */
+            modifiers?: number;
+            /**
+             * Time at which the event occurred.
+             */
+            timestamp?: TimeSinceEpoch;
+            /**
+             * Text as generated by processing a virtual key code with a keyboard layout. Not needed for
+for `keyUp` and `rawKeyDown` events (default: "")
+             */
+            text?: string;
+            /**
+             * Text that would have been generated by the keyboard if no modifiers were pressed (except for
+shift). Useful for shortcut (accelerator) key handling (default: "").
+             */
+            unmodifiedText?: string;
+            /**
+             * Unique key identifier (e.g., 'U+0041') (default: "").
+             */
+            keyIdentifier?: string;
+            /**
+             * Unique DOM defined string value for each physical key (e.g., 'KeyA') (default: "").
+             */
+            code?: string;
+            /**
+             * Unique DOM defined string value describing the meaning of the key in the context of active
+modifiers, keyboard layout, etc (e.g., 'AltGr') (default: "").
+             */
+            key?: string;
+            /**
+             * Windows virtual key code (default: 0).
+             */
+            windowsVirtualKeyCode?: number;
+            /**
+             * Native virtual key code (default: 0).
+             */
+            nativeVirtualKeyCode?: number;
+            /**
+             * Whether the event was generated from auto repeat (default: false).
+             */
+            autoRepeat?: boolean;
+            /**
+             * Whether the event was generated from the keypad (default: false).
+             */
+            isKeypad?: boolean;
+            /**
+             * Whether the event was a system key event (default: false).
+             */
+            isSystemKey?: boolean;
+            /**
+             * Whether the event was from the left or right side of the keyboard. 1=Left, 2=Right (default:
+0).
+             */
+            location?: number;
+        }
+        export type dispatchKeyEventReturnValue = {
+        }
+        /**
+         * This method emulates inserting text that doesn't come from a key press,
+for example an emoji keyboard or an IME.
+         */
+        export type insertTextParameters = {
+            /**
+             * The text to insert.
+             */
+            text: string;
+        }
+        export type insertTextReturnValue = {
+        }
+        /**
+         * Dispatches a mouse event to the page.
+         */
+        export type dispatchMouseEventParameters = {
+            /**
+             * Type of the mouse event.
+             */
+            type: "mousePressed"|"mouseReleased"|"mouseMoved"|"mouseWheel";
+            /**
+             * X coordinate of the event relative to the main frame's viewport in CSS pixels.
+             */
+            x: number;
+            /**
+             * Y coordinate of the event relative to the main frame's viewport in CSS pixels. 0 refers to
+the top of the viewport and Y increases as it proceeds towards the bottom of the viewport.
+             */
+            y: number;
+            /**
+             * Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
+(default: 0).
+             */
+            modifiers?: number;
+            /**
+             * Time at which the event occurred.
+             */
+            timestamp?: TimeSinceEpoch;
+            /**
+             * Mouse button (default: "none").
+             */
+            button?: MouseButton;
+            /**
+             * A number indicating which buttons are pressed on the mouse when a mouse event is triggered.
+Left=1, Right=2, Middle=4, Back=8, Forward=16, None=0.
+             */
+            buttons?: number;
+            /**
+             * Number of times the mouse button was clicked (default: 0).
+             */
+            clickCount?: number;
+            /**
+             * X delta in CSS pixels for mouse wheel event (default: 0).
+             */
+            deltaX?: number;
+            /**
+             * Y delta in CSS pixels for mouse wheel event (default: 0).
+             */
+            deltaY?: number;
+            /**
+             * Pointer type (default: "mouse").
+             */
+            pointerType?: "mouse"|"pen";
+        }
+        export type dispatchMouseEventReturnValue = {
+        }
+        /**
+         * Dispatches a touch event to the page.
+         */
+        export type dispatchTouchEventParameters = {
+            /**
+             * Type of the touch event. TouchEnd and TouchCancel must not contain any touch points, while
+TouchStart and TouchMove must contains at least one.
+             */
+            type: "touchStart"|"touchEnd"|"touchMove"|"touchCancel";
+            /**
+             * Active touch points on the touch device. One event per any changed point (compared to
+previous touch event in a sequence) is generated, emulating pressing/moving/releasing points
+one by one.
+             */
+            touchPoints: TouchPoint[];
+            /**
+             * Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
+(default: 0).
+             */
+            modifiers?: number;
+            /**
+             * Time at which the event occurred.
+             */
+            timestamp?: TimeSinceEpoch;
+        }
+        export type dispatchTouchEventReturnValue = {
+        }
+        /**
+         * Emulates touch event from the mouse event parameters.
+         */
+        export type emulateTouchFromMouseEventParameters = {
+            /**
+             * Type of the mouse event.
+             */
+            type: "mousePressed"|"mouseReleased"|"mouseMoved"|"mouseWheel";
+            /**
+             * X coordinate of the mouse pointer in DIP.
+             */
+            x: number;
+            /**
+             * Y coordinate of the mouse pointer in DIP.
+             */
+            y: number;
+            /**
+             * Mouse button. Only "none", "left", "right" are supported.
+             */
+            button: MouseButton;
+            /**
+             * Time at which the event occurred (default: current time).
+             */
+            timestamp?: TimeSinceEpoch;
+            /**
+             * X delta in DIP for mouse wheel event (default: 0).
+             */
+            deltaX?: number;
+            /**
+             * Y delta in DIP for mouse wheel event (default: 0).
+             */
+            deltaY?: number;
+            /**
+             * Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
+(default: 0).
+             */
+            modifiers?: number;
+            /**
+             * Number of times the mouse button was clicked (default: 0).
+             */
+            clickCount?: number;
+        }
+        export type emulateTouchFromMouseEventReturnValue = {
+        }
+        /**
+         * Ignores input events (useful while auditing page).
+         */
+        export type setIgnoreInputEventsParameters = {
+            /**
+             * Ignores input events processing when set to true.
+             */
+            ignore: boolean;
+        }
+        export type setIgnoreInputEventsReturnValue = {
+        }
+        /**
+         * Synthesizes a pinch gesture over a time period by issuing appropriate touch events.
+         */
+        export type synthesizePinchGestureParameters = {
+            /**
+             * X coordinate of the start of the gesture in CSS pixels.
+             */
+            x: number;
+            /**
+             * Y coordinate of the start of the gesture in CSS pixels.
+             */
+            y: number;
+            /**
+             * Relative scale factor after zooming (>1.0 zooms in, <1.0 zooms out).
+             */
+            scaleFactor: number;
+            /**
+             * Relative pointer speed in pixels per second (default: 800).
+             */
+            relativeSpeed?: number;
+            /**
+             * Which type of input events to be generated (default: 'default', which queries the platform
+for the preferred input type).
+             */
+            gestureSourceType?: GestureSourceType;
+        }
+        export type synthesizePinchGestureReturnValue = {
+        }
+        /**
+         * Synthesizes a scroll gesture over a time period by issuing appropriate touch events.
+         */
+        export type synthesizeScrollGestureParameters = {
+            /**
+             * X coordinate of the start of the gesture in CSS pixels.
+             */
+            x: number;
+            /**
+             * Y coordinate of the start of the gesture in CSS pixels.
+             */
+            y: number;
+            /**
+             * The distance to scroll along the X axis (positive to scroll left).
+             */
+            xDistance?: number;
+            /**
+             * The distance to scroll along the Y axis (positive to scroll up).
+             */
+            yDistance?: number;
+            /**
+             * The number of additional pixels to scroll back along the X axis, in addition to the given
+distance.
+             */
+            xOverscroll?: number;
+            /**
+             * The number of additional pixels to scroll back along the Y axis, in addition to the given
+distance.
+             */
+            yOverscroll?: number;
+            /**
+             * Prevent fling (default: true).
+             */
+            preventFling?: boolean;
+            /**
+             * Swipe speed in pixels per second (default: 800).
+             */
+            speed?: number;
+            /**
+             * Which type of input events to be generated (default: 'default', which queries the platform
+for the preferred input type).
+             */
+            gestureSourceType?: GestureSourceType;
+            /**
+             * The number of times to repeat the gesture (default: 0).
+             */
+            repeatCount?: number;
+            /**
+             * The number of milliseconds delay between each repeat. (default: 250).
+             */
+            repeatDelayMs?: number;
+            /**
+             * The name of the interaction markers to generate, if not empty (default: "").
+             */
+            interactionMarkerName?: string;
+        }
+        export type synthesizeScrollGestureReturnValue = {
+        }
+        /**
+         * Synthesizes a tap gesture over a time period by issuing appropriate touch events.
+         */
+        export type synthesizeTapGestureParameters = {
+            /**
+             * X coordinate of the start of the gesture in CSS pixels.
+             */
+            x: number;
+            /**
+             * Y coordinate of the start of the gesture in CSS pixels.
+             */
+            y: number;
+            /**
+             * Duration between touchdown and touchup events in ms (default: 50).
+             */
+            duration?: number;
+            /**
+             * Number of times to perform the tap (e.g. 2 for double tap, default: 1).
+             */
+            tapCount?: number;
+            /**
+             * Which type of input events to be generated (default: 'default', which queries the platform
+for the preferred input type).
+             */
+            gestureSourceType?: GestureSourceType;
+        }
+        export type synthesizeTapGestureReturnValue = {
+        }
+    }
+    
+    export module Inspector {
+        
+        /**
+         * Fired when remote debugging connection is about to be terminated. Contains detach reason.
+         */
+        export type detachedPayload = {
+            /**
+             * The reason why connection has been terminated.
+             */
+            reason: string;
+        }
+        /**
+         * Fired when debugging target has crashed
+         */
+        export type targetCrashedPayload = void;
+        /**
+         * Fired when debugging target has reloaded after crash
+         */
+        export type targetReloadedAfterCrashPayload = void;
+        
+        /**
+         * Disables inspector domain notifications.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables inspector domain notifications.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+    }
+    
+    export module LayerTree {
+        /**
+         * Unique Layer identifier.
+         */
+        export type LayerId = string;
+        /**
+         * Unique snapshot identifier.
+         */
+        export type SnapshotId = string;
+        /**
+         * Rectangle where scrolling happens on the main thread.
+         */
+        export interface ScrollRect {
+            /**
+             * Rectangle itself.
+             */
+            rect: DOM.Rect;
+            /**
+             * Reason for rectangle to force scrolling on the main thread
+             */
+            type: "RepaintsOnScroll"|"TouchEventHandler"|"WheelEventHandler";
+        }
+        /**
+         * Sticky position constraints.
+         */
+        export interface StickyPositionConstraint {
+            /**
+             * Layout rectangle of the sticky element before being shifted
+             */
+            stickyBoxRect: DOM.Rect;
+            /**
+             * Layout rectangle of the containing block of the sticky element
+             */
+            containingBlockRect: DOM.Rect;
+            /**
+             * The nearest sticky layer that shifts the sticky box
+             */
+            nearestLayerShiftingStickyBox?: LayerId;
+            /**
+             * The nearest sticky layer that shifts the containing block
+             */
+            nearestLayerShiftingContainingBlock?: LayerId;
+        }
+        /**
+         * Serialized fragment of layer picture along with its offset within the layer.
+         */
+        export interface PictureTile {
+            /**
+             * Offset from owning layer left boundary
+             */
+            x: number;
+            /**
+             * Offset from owning layer top boundary
+             */
+            y: number;
+            /**
+             * Base64-encoded snapshot data.
+             */
+            picture: binary;
+        }
+        /**
+         * Information about a compositing layer.
+         */
+        export interface Layer {
+            /**
+             * The unique id for this layer.
+             */
+            layerId: LayerId;
+            /**
+             * The id of parent (not present for root).
+             */
+            parentLayerId?: LayerId;
+            /**
+             * The backend id for the node associated with this layer.
+             */
+            backendNodeId?: DOM.BackendNodeId;
+            /**
+             * Offset from parent layer, X coordinate.
+             */
+            offsetX: number;
+            /**
+             * Offset from parent layer, Y coordinate.
+             */
+            offsetY: number;
+            /**
+             * Layer width.
+             */
+            width: number;
+            /**
+             * Layer height.
+             */
+            height: number;
+            /**
+             * Transformation matrix for layer, default is identity matrix
+             */
+            transform?: number[];
+            /**
+             * Transform anchor point X, absent if no transform specified
+             */
+            anchorX?: number;
+            /**
+             * Transform anchor point Y, absent if no transform specified
+             */
+            anchorY?: number;
+            /**
+             * Transform anchor point Z, absent if no transform specified
+             */
+            anchorZ?: number;
+            /**
+             * Indicates how many time this layer has painted.
+             */
+            paintCount: number;
+            /**
+             * Indicates whether this layer hosts any content, rather than being used for
+transform/scrolling purposes only.
+             */
+            drawsContent: boolean;
+            /**
+             * Set if layer is not visible.
+             */
+            invisible?: boolean;
+            /**
+             * Rectangles scrolling on main thread only.
+             */
+            scrollRects?: ScrollRect[];
+            /**
+             * Sticky position constraint information
+             */
+            stickyPositionConstraint?: StickyPositionConstraint;
+        }
+        /**
+         * Array of timings, one per paint step.
+         */
+        export type PaintProfile = number[];
+        
+        export type layerPaintedPayload = {
+            /**
+             * The id of the painted layer.
+             */
+            layerId: LayerId;
+            /**
+             * Clip rectangle.
+             */
+            clip: DOM.Rect;
+        }
+        export type layerTreeDidChangePayload = {
+            /**
+             * Layer tree, absent if not in the comspositing mode.
+             */
+            layers?: Layer[];
+        }
+        
+        /**
+         * Provides the reasons why the given layer was composited.
+         */
+        export type compositingReasonsParameters = {
+            /**
+             * The id of the layer for which we want to get the reasons it was composited.
+             */
+            layerId: LayerId;
+        }
+        export type compositingReasonsReturnValue = {
+            /**
+             * A list of strings specifying reasons for the given layer to become composited.
+             */
+            compositingReasons: string[];
+            /**
+             * A list of strings specifying reason IDs for the given layer to become composited.
+             */
+            compositingReasonIds: string[];
+        }
+        /**
+         * Disables compositing tree inspection.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables compositing tree inspection.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Returns the snapshot identifier.
+         */
+        export type loadSnapshotParameters = {
+            /**
+             * An array of tiles composing the snapshot.
+             */
+            tiles: PictureTile[];
+        }
+        export type loadSnapshotReturnValue = {
+            /**
+             * The id of the snapshot.
+             */
+            snapshotId: SnapshotId;
+        }
+        /**
+         * Returns the layer snapshot identifier.
+         */
+        export type makeSnapshotParameters = {
+            /**
+             * The id of the layer.
+             */
+            layerId: LayerId;
+        }
+        export type makeSnapshotReturnValue = {
+            /**
+             * The id of the layer snapshot.
+             */
+            snapshotId: SnapshotId;
+        }
+        export type profileSnapshotParameters = {
+            /**
+             * The id of the layer snapshot.
+             */
+            snapshotId: SnapshotId;
+            /**
+             * The maximum number of times to replay the snapshot (1, if not specified).
+             */
+            minRepeatCount?: number;
+            /**
+             * The minimum duration (in seconds) to replay the snapshot.
+             */
+            minDuration?: number;
+            /**
+             * The clip rectangle to apply when replaying the snapshot.
+             */
+            clipRect?: DOM.Rect;
+        }
+        export type profileSnapshotReturnValue = {
+            /**
+             * The array of paint profiles, one per run.
+             */
+            timings: PaintProfile[];
+        }
+        /**
+         * Releases layer snapshot captured by the back-end.
+         */
+        export type releaseSnapshotParameters = {
+            /**
+             * The id of the layer snapshot.
+             */
+            snapshotId: SnapshotId;
+        }
+        export type releaseSnapshotReturnValue = {
+        }
+        /**
+         * Replays the layer snapshot and returns the resulting bitmap.
+         */
+        export type replaySnapshotParameters = {
+            /**
+             * The id of the layer snapshot.
+             */
+            snapshotId: SnapshotId;
+            /**
+             * The first step to replay from (replay from the very start if not specified).
+             */
+            fromStep?: number;
+            /**
+             * The last step to replay to (replay till the end if not specified).
+             */
+            toStep?: number;
+            /**
+             * The scale to apply while replaying (defaults to 1).
+             */
+            scale?: number;
+        }
+        export type replaySnapshotReturnValue = {
+            /**
+             * A data: URL for resulting image.
+             */
+            dataURL: string;
+        }
+        /**
+         * Replays the layer snapshot and returns canvas log.
+         */
+        export type snapshotCommandLogParameters = {
+            /**
+             * The id of the layer snapshot.
+             */
+            snapshotId: SnapshotId;
+        }
+        export type snapshotCommandLogReturnValue = {
+            /**
+             * The array of canvas function calls.
+             */
+            commandLog: object[];
+        }
+    }
+    
+    /**
+     * Provides access to log entries.
+     */
+    export module Log {
+        /**
+         * Log entry.
+         */
+        export interface LogEntry {
+            /**
+             * Log entry source.
+             */
+            source: "xml"|"javascript"|"network"|"storage"|"appcache"|"rendering"|"security"|"deprecation"|"worker"|"violation"|"intervention"|"recommendation"|"other";
+            /**
+             * Log entry severity.
+             */
+            level: "verbose"|"info"|"warning"|"error";
+            /**
+             * Logged text.
+             */
+            text: string;
+            /**
+             * Timestamp when this entry was added.
+             */
+            timestamp: Runtime.Timestamp;
+            /**
+             * URL of the resource if known.
+             */
+            url?: string;
+            /**
+             * Line number in the resource.
+             */
+            lineNumber?: number;
+            /**
+             * JavaScript stack trace.
+             */
+            stackTrace?: Runtime.StackTrace;
+            /**
+             * Identifier of the network request associated with this entry.
+             */
+            networkRequestId?: Network.RequestId;
+            /**
+             * Identifier of the worker associated with this entry.
+             */
+            workerId?: string;
+            /**
+             * Call arguments.
+             */
+            args?: Runtime.RemoteObject[];
+        }
+        /**
+         * Violation configuration setting.
+         */
+        export interface ViolationSetting {
+            /**
+             * Violation type.
+             */
+            name: "longTask"|"longLayout"|"blockedEvent"|"blockedParser"|"discouragedAPIUse"|"handler"|"recurringHandler";
+            /**
+             * Time threshold to trigger upon.
+             */
+            threshold: number;
+        }
+        
+        /**
+         * Issued when new message was logged.
+         */
+        export type entryAddedPayload = {
+            /**
+             * The entry.
+             */
+            entry: LogEntry;
+        }
+        
+        /**
+         * Clears the log.
+         */
+        export type clearParameters = {
+        }
+        export type clearReturnValue = {
+        }
+        /**
+         * Disables log domain, prevents further log entries from being reported to the client.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables log domain, sends the entries collected so far to the client by means of the
+`entryAdded` notification.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * start violation reporting.
+         */
+        export type startViolationsReportParameters = {
+            /**
+             * Configuration for violations.
+             */
+            config: ViolationSetting[];
+        }
+        export type startViolationsReportReturnValue = {
+        }
+        /**
+         * Stop violation reporting.
+         */
+        export type stopViolationsReportParameters = {
+        }
+        export type stopViolationsReportReturnValue = {
+        }
+    }
+    
+    export module Memory {
+        /**
+         * Memory pressure level.
+         */
+        export type PressureLevel = "moderate"|"critical";
+        /**
+         * Heap profile sample.
+         */
+        export interface SamplingProfileNode {
+            /**
+             * Size of the sampled allocation.
+             */
+            size: number;
+            /**
+             * Total bytes attributed to this sample.
+             */
+            total: number;
+            /**
+             * Execution stack at the point of allocation.
+             */
+            stack: string[];
+        }
+        /**
+         * Array of heap profile samples.
+         */
+        export interface SamplingProfile {
+            samples: SamplingProfileNode[];
+            modules: Module[];
+        }
+        /**
+         * Executable module information
+         */
+        export interface Module {
+            /**
+             * Name of the module.
+             */
+            name: string;
+            /**
+             * UUID of the module.
+             */
+            uuid: string;
+            /**
+             * Base address where the module is loaded into memory. Encoded as a decimal
+or hexadecimal (0x prefixed) string.
+             */
+            baseAddress: string;
+            /**
+             * Size of the module in bytes.
+             */
+            size: number;
+        }
+        
+        
+        export type getDOMCountersParameters = {
+        }
+        export type getDOMCountersReturnValue = {
+            documents: number;
+            nodes: number;
+            jsEventListeners: number;
+        }
+        export type prepareForLeakDetectionParameters = {
+        }
+        export type prepareForLeakDetectionReturnValue = {
+        }
+        /**
+         * Simulate OomIntervention by purging V8 memory.
+         */
+        export type forciblyPurgeJavaScriptMemoryParameters = {
+        }
+        export type forciblyPurgeJavaScriptMemoryReturnValue = {
+        }
+        /**
+         * Enable/disable suppressing memory pressure notifications in all processes.
+         */
+        export type setPressureNotificationsSuppressedParameters = {
+            /**
+             * If true, memory pressure notifications will be suppressed.
+             */
+            suppressed: boolean;
+        }
+        export type setPressureNotificationsSuppressedReturnValue = {
+        }
+        /**
+         * Simulate a memory pressure notification in all processes.
+         */
+        export type simulatePressureNotificationParameters = {
+            /**
+             * Memory pressure level of the notification.
+             */
+            level: PressureLevel;
+        }
+        export type simulatePressureNotificationReturnValue = {
+        }
+        /**
+         * Start collecting native memory profile.
+         */
+        export type startSamplingParameters = {
+            /**
+             * Average number of bytes between samples.
+             */
+            samplingInterval?: number;
+            /**
+             * Do not randomize intervals between samples.
+             */
+            suppressRandomness?: boolean;
+        }
+        export type startSamplingReturnValue = {
+        }
+        /**
+         * Stop collecting native memory profile.
+         */
+        export type stopSamplingParameters = {
+        }
+        export type stopSamplingReturnValue = {
+        }
+        /**
+         * Retrieve native memory allocations profile
+collected since renderer process startup.
+         */
+        export type getAllTimeSamplingProfileParameters = {
+        }
+        export type getAllTimeSamplingProfileReturnValue = {
+            profile: SamplingProfile;
+        }
+        /**
+         * Retrieve native memory allocations profile
+collected since browser process startup.
+         */
+        export type getBrowserSamplingProfileParameters = {
+        }
+        export type getBrowserSamplingProfileReturnValue = {
+            profile: SamplingProfile;
+        }
+        /**
+         * Retrieve native memory allocations profile collected since last
+`startSampling` call.
+         */
+        export type getSamplingProfileParameters = {
+        }
+        export type getSamplingProfileReturnValue = {
+            profile: SamplingProfile;
+        }
+    }
+    
+    /**
+     * Network domain allows tracking network activities of the page. It exposes information about http,
+file, data and other requests and responses, their headers, bodies, timing, etc.
+     */
+    export module Network {
+        /**
+         * Resource type as it was perceived by the rendering engine.
+         */
+        export type ResourceType = "Document"|"Stylesheet"|"Image"|"Media"|"Font"|"Script"|"TextTrack"|"XHR"|"Fetch"|"EventSource"|"WebSocket"|"Manifest"|"SignedExchange"|"Ping"|"CSPViolationReport"|"Other";
+        /**
+         * Unique loader identifier.
+         */
+        export type LoaderId = string;
+        /**
+         * Unique request identifier.
+         */
+        export type RequestId = string;
+        /**
+         * Unique intercepted request identifier.
+         */
+        export type InterceptionId = string;
+        /**
+         * Network level fetch failure reason.
+         */
+        export type ErrorReason = "Failed"|"Aborted"|"TimedOut"|"AccessDenied"|"ConnectionClosed"|"ConnectionReset"|"ConnectionRefused"|"ConnectionAborted"|"ConnectionFailed"|"NameNotResolved"|"InternetDisconnected"|"AddressUnreachable"|"BlockedByClient"|"BlockedByResponse";
+        /**
+         * UTC time in seconds, counted from January 1, 1970.
+         */
+        export type TimeSinceEpoch = number;
+        /**
+         * Monotonically increasing time in seconds since an arbitrary point in the past.
+         */
+        export type MonotonicTime = number;
+        /**
+         * Request / response headers as keys / values of JSON object.
+         */
+        export type Headers = object;
+        /**
+         * The underlying connection technology that the browser is supposedly using.
+         */
+        export type ConnectionType = "none"|"cellular2g"|"cellular3g"|"cellular4g"|"bluetooth"|"ethernet"|"wifi"|"wimax"|"other";
+        /**
+         * Represents the cookie's 'SameSite' status:
+https://tools.ietf.org/html/draft-west-first-party-cookies
+         */
+        export type CookieSameSite = "Strict"|"Lax"|"None";
+        /**
+         * Represents the cookie's 'Priority' status:
+https://tools.ietf.org/html/draft-west-cookie-priority-00
+         */
+        export type CookiePriority = "Low"|"Medium"|"High";
+        /**
+         * Timing information for the request.
+         */
+        export interface ResourceTiming {
+            /**
+             * Timing's requestTime is a baseline in seconds, while the other numbers are ticks in
+milliseconds relatively to this requestTime.
+             */
+            requestTime: number;
+            /**
+             * Started resolving proxy.
+             */
+            proxyStart: number;
+            /**
+             * Finished resolving proxy.
+             */
+            proxyEnd: number;
+            /**
+             * Started DNS address resolve.
+             */
+            dnsStart: number;
+            /**
+             * Finished DNS address resolve.
+             */
+            dnsEnd: number;
+            /**
+             * Started connecting to the remote host.
+             */
+            connectStart: number;
+            /**
+             * Connected to the remote host.
+             */
+            connectEnd: number;
+            /**
+             * Started SSL handshake.
+             */
+            sslStart: number;
+            /**
+             * Finished SSL handshake.
+             */
+            sslEnd: number;
+            /**
+             * Started running ServiceWorker.
+             */
+            workerStart: number;
+            /**
+             * Finished Starting ServiceWorker.
+             */
+            workerReady: number;
+            /**
+             * Started sending request.
+             */
+            sendStart: number;
+            /**
+             * Finished sending request.
+             */
+            sendEnd: number;
+            /**
+             * Time the server started pushing request.
+             */
+            pushStart: number;
+            /**
+             * Time the server finished pushing request.
+             */
+            pushEnd: number;
+            /**
+             * Finished receiving response headers.
+             */
+            receiveHeadersEnd: number;
+        }
+        /**
+         * Loading priority of a resource request.
+         */
+        export type ResourcePriority = "VeryLow"|"Low"|"Medium"|"High"|"VeryHigh";
+        /**
+         * HTTP request data.
+         */
+        export interface Request {
+            /**
+             * Request URL (without fragment).
+             */
+            url: string;
+            /**
+             * Fragment of the requested URL starting with hash, if present.
+             */
+            urlFragment?: string;
+            /**
+             * HTTP request method.
+             */
+            method: string;
+            /**
+             * HTTP request headers.
+             */
+            headers: Headers;
+            /**
+             * HTTP POST request data.
+             */
+            postData?: string;
+            /**
+             * True when the request has POST data. Note that postData might still be omitted when this flag is true when the data is too long.
+             */
+            hasPostData?: boolean;
+            /**
+             * The mixed content type of the request.
+             */
+            mixedContentType?: Security.MixedContentType;
+            /**
+             * Priority of the resource request at the time request is sent.
+             */
+            initialPriority: ResourcePriority;
+            /**
+             * The referrer policy of the request, as defined in https://www.w3.org/TR/referrer-policy/
+             */
+            referrerPolicy: "unsafe-url"|"no-referrer-when-downgrade"|"no-referrer"|"origin"|"origin-when-cross-origin"|"same-origin"|"strict-origin"|"strict-origin-when-cross-origin";
+            /**
+             * Whether is loaded via link preload.
+             */
+            isLinkPreload?: boolean;
+        }
+        /**
+         * Details of a signed certificate timestamp (SCT).
+         */
+        export interface SignedCertificateTimestamp {
+            /**
+             * Validation status.
+             */
+            status: string;
+            /**
+             * Origin.
+             */
+            origin: string;
+            /**
+             * Log name / description.
+             */
+            logDescription: string;
+            /**
+             * Log ID.
+             */
+            logId: string;
+            /**
+             * Issuance date.
+             */
+            timestamp: TimeSinceEpoch;
+            /**
+             * Hash algorithm.
+             */
+            hashAlgorithm: string;
+            /**
+             * Signature algorithm.
+             */
+            signatureAlgorithm: string;
+            /**
+             * Signature data.
+             */
+            signatureData: string;
+        }
+        /**
+         * Security details about a request.
+         */
+        export interface SecurityDetails {
+            /**
+             * Protocol name (e.g. "TLS 1.2" or "QUIC").
+             */
+            protocol: string;
+            /**
+             * Key Exchange used by the connection, or the empty string if not applicable.
+             */
+            keyExchange: string;
+            /**
+             * (EC)DH group used by the connection, if applicable.
+             */
+            keyExchangeGroup?: string;
+            /**
+             * Cipher name.
+             */
+            cipher: string;
+            /**
+             * TLS MAC. Note that AEAD ciphers do not have separate MACs.
+             */
+            mac?: string;
+            /**
+             * Certificate ID value.
+             */
+            certificateId: Security.CertificateId;
+            /**
+             * Certificate subject name.
+             */
+            subjectName: string;
+            /**
+             * Subject Alternative Name (SAN) DNS names and IP addresses.
+             */
+            sanList: string[];
+            /**
+             * Name of the issuing CA.
+             */
+            issuer: string;
+            /**
+             * Certificate valid from date.
+             */
+            validFrom: TimeSinceEpoch;
+            /**
+             * Certificate valid to (expiration) date
+             */
+            validTo: TimeSinceEpoch;
+            /**
+             * List of signed certificate timestamps (SCTs).
+             */
+            signedCertificateTimestampList: SignedCertificateTimestamp[];
+            /**
+             * Whether the request complied with Certificate Transparency policy
+             */
+            certificateTransparencyCompliance: CertificateTransparencyCompliance;
+        }
+        /**
+         * Whether the request complied with Certificate Transparency policy.
+         */
+        export type CertificateTransparencyCompliance = "unknown"|"not-compliant"|"compliant";
+        /**
+         * The reason why request was blocked.
+         */
+        export type BlockedReason = "other"|"csp"|"mixed-content"|"origin"|"inspector"|"subresource-filter"|"content-type"|"collapsed-by-client";
+        /**
+         * HTTP response data.
+         */
+        export interface Response {
+            /**
+             * Response URL. This URL can be different from CachedResource.url in case of redirect.
+             */
+            url: string;
+            /**
+             * HTTP response status code.
+             */
+            status: number;
+            /**
+             * HTTP response status text.
+             */
+            statusText: string;
+            /**
+             * HTTP response headers.
+             */
+            headers: Headers;
+            /**
+             * HTTP response headers text.
+             */
+            headersText?: string;
+            /**
+             * Resource mimeType as determined by the browser.
+             */
+            mimeType: string;
+            /**
+             * Refined HTTP request headers that were actually transmitted over the network.
+             */
+            requestHeaders?: Headers;
+            /**
+             * HTTP request headers text.
+             */
+            requestHeadersText?: string;
+            /**
+             * Specifies whether physical connection was actually reused for this request.
+             */
+            connectionReused: boolean;
+            /**
+             * Physical connection id that was actually used for this request.
+             */
+            connectionId: number;
+            /**
+             * Remote IP address.
+             */
+            remoteIPAddress?: string;
+            /**
+             * Remote port.
+             */
+            remotePort?: number;
+            /**
+             * Specifies that the request was served from the disk cache.
+             */
+            fromDiskCache?: boolean;
+            /**
+             * Specifies that the request was served from the ServiceWorker.
+             */
+            fromServiceWorker?: boolean;
+            /**
+             * Specifies that the request was served from the prefetch cache.
+             */
+            fromPrefetchCache?: boolean;
+            /**
+             * Total number of bytes received for this request so far.
+             */
+            encodedDataLength: number;
+            /**
+             * Timing information for the given request.
+             */
+            timing?: ResourceTiming;
+            /**
+             * Protocol used to fetch this request.
+             */
+            protocol?: string;
+            /**
+             * Security state of the request resource.
+             */
+            securityState: Security.SecurityState;
+            /**
+             * Security details for the request.
+             */
+            securityDetails?: SecurityDetails;
+        }
+        /**
+         * WebSocket request data.
+         */
+        export interface WebSocketRequest {
+            /**
+             * HTTP request headers.
+             */
+            headers: Headers;
+        }
+        /**
+         * WebSocket response data.
+         */
+        export interface WebSocketResponse {
+            /**
+             * HTTP response status code.
+             */
+            status: number;
+            /**
+             * HTTP response status text.
+             */
+            statusText: string;
+            /**
+             * HTTP response headers.
+             */
+            headers: Headers;
+            /**
+             * HTTP response headers text.
+             */
+            headersText?: string;
+            /**
+             * HTTP request headers.
+             */
+            requestHeaders?: Headers;
+            /**
+             * HTTP request headers text.
+             */
+            requestHeadersText?: string;
+        }
+        /**
+         * WebSocket message data. This represents an entire WebSocket message, not just a fragmented frame as the name suggests.
+         */
+        export interface WebSocketFrame {
+            /**
+             * WebSocket message opcode.
+             */
+            opcode: number;
+            /**
+             * WebSocket message mask.
+             */
+            mask: boolean;
+            /**
+             * WebSocket message payload data.
+If the opcode is 1, this is a text message and payloadData is a UTF-8 string.
+If the opcode isn't 1, then payloadData is a base64 encoded string representing binary data.
+             */
+            payloadData: string;
+        }
+        /**
+         * Information about the cached resource.
+         */
+        export interface CachedResource {
+            /**
+             * Resource URL. This is the url of the original network request.
+             */
+            url: string;
+            /**
+             * Type of this resource.
+             */
+            type: ResourceType;
+            /**
+             * Cached response data.
+             */
+            response?: Response;
+            /**
+             * Cached response body size.
+             */
+            bodySize: number;
+        }
+        /**
+         * Information about the request initiator.
+         */
+        export interface Initiator {
+            /**
+             * Type of this initiator.
+             */
+            type: "parser"|"script"|"preload"|"SignedExchange"|"other";
+            /**
+             * Initiator JavaScript stack trace, set for Script only.
+             */
+            stack?: Runtime.StackTrace;
+            /**
+             * Initiator URL, set for Parser type or for Script type (when script is importing module) or for SignedExchange type.
+             */
+            url?: string;
+            /**
+             * Initiator line number, set for Parser type or for Script type (when script is importing
+module) (0-based).
+             */
+            lineNumber?: number;
+        }
+        /**
+         * Cookie object
+         */
+        export interface Cookie {
+            /**
+             * Cookie name.
+             */
+            name: string;
+            /**
+             * Cookie value.
+             */
+            value: string;
+            /**
+             * Cookie domain.
+             */
+            domain: string;
+            /**
+             * Cookie path.
+             */
+            path: string;
+            /**
+             * Cookie expiration date as the number of seconds since the UNIX epoch.
+             */
+            expires: number;
+            /**
+             * Cookie size.
+             */
+            size: number;
+            /**
+             * True if cookie is http-only.
+             */
+            httpOnly: boolean;
+            /**
+             * True if cookie is secure.
+             */
+            secure: boolean;
+            /**
+             * True in case of session cookie.
+             */
+            session: boolean;
+            /**
+             * Cookie SameSite type.
+             */
+            sameSite?: CookieSameSite;
+            /**
+             * Cookie Priority
+             */
+            priority: CookiePriority;
+        }
+        /**
+         * Types of reasons why a cookie may not be stored from a response.
+         */
+        export type SetCookieBlockedReason = "SecureOnly"|"SameSiteStrict"|"SameSiteLax"|"SameSiteUnspecifiedTreatedAsLax"|"SameSiteNoneInsecure"|"UserPreferences"|"SyntaxError"|"SchemeNotSupported"|"OverwriteSecure"|"InvalidDomain"|"InvalidPrefix"|"UnknownError";
+        /**
+         * Types of reasons why a cookie may not be sent with a request.
+         */
+        export type CookieBlockedReason = "SecureOnly"|"NotOnPath"|"DomainMismatch"|"SameSiteStrict"|"SameSiteLax"|"SameSiteUnspecifiedTreatedAsLax"|"SameSiteNoneInsecure"|"UserPreferences"|"UnknownError";
+        /**
+         * A cookie which was not stored from a response with the corresponding reason.
+         */
+        export interface BlockedSetCookieWithReason {
+            /**
+             * The reason(s) this cookie was blocked.
+             */
+            blockedReasons: SetCookieBlockedReason[];
+            /**
+             * The string representing this individual cookie as it would appear in the header.
+This is not the entire "cookie" or "set-cookie" header which could have multiple cookies.
+             */
+            cookieLine: string;
+            /**
+             * The cookie object which represents the cookie which was not stored. It is optional because
+sometimes complete cookie information is not available, such as in the case of parsing
+errors.
+             */
+            cookie?: Cookie;
+        }
+        /**
+         * A cookie with was not sent with a request with the corresponding reason.
+         */
+        export interface BlockedCookieWithReason {
+            /**
+             * The reason(s) the cookie was blocked.
+             */
+            blockedReasons: CookieBlockedReason[];
+            /**
+             * The cookie object representing the cookie which was not sent.
+             */
+            cookie: Cookie;
+        }
+        /**
+         * Cookie parameter object
+         */
+        export interface CookieParam {
+            /**
+             * Cookie name.
+             */
+            name: string;
+            /**
+             * Cookie value.
+             */
+            value: string;
+            /**
+             * The request-URI to associate with the setting of the cookie. This value can affect the
+default domain and path values of the created cookie.
+             */
+            url?: string;
+            /**
+             * Cookie domain.
+             */
+            domain?: string;
+            /**
+             * Cookie path.
+             */
+            path?: string;
+            /**
+             * True if cookie is secure.
+             */
+            secure?: boolean;
+            /**
+             * True if cookie is http-only.
+             */
+            httpOnly?: boolean;
+            /**
+             * Cookie SameSite type.
+             */
+            sameSite?: CookieSameSite;
+            /**
+             * Cookie expiration date, session cookie if not set
+             */
+            expires?: TimeSinceEpoch;
+            /**
+             * Cookie Priority.
+             */
+            priority?: CookiePriority;
+        }
+        /**
+         * Authorization challenge for HTTP status code 401 or 407.
+         */
+        export interface AuthChallenge {
+            /**
+             * Source of the authentication challenge.
+             */
+            source?: "Server"|"Proxy";
+            /**
+             * Origin of the challenger.
+             */
+            origin: string;
+            /**
+             * The authentication scheme used, such as basic or digest
+             */
+            scheme: string;
+            /**
+             * The realm of the challenge. May be empty.
+             */
+            realm: string;
+        }
+        /**
+         * Response to an AuthChallenge.
+         */
+        export interface AuthChallengeResponse {
+            /**
+             * The decision on what to do in response to the authorization challenge.  Default means
+deferring to the default behavior of the net stack, which will likely either the Cancel
+authentication or display a popup dialog box.
+             */
+            response: "Default"|"CancelAuth"|"ProvideCredentials";
+            /**
+             * The username to provide, possibly empty. Should only be set if response is
+ProvideCredentials.
+             */
+            username?: string;
+            /**
+             * The password to provide, possibly empty. Should only be set if response is
+ProvideCredentials.
+             */
+            password?: string;
+        }
+        /**
+         * Stages of the interception to begin intercepting. Request will intercept before the request is
+sent. Response will intercept after the response is received.
+         */
+        export type InterceptionStage = "Request"|"HeadersReceived";
+        /**
+         * Request pattern for interception.
+         */
+        export interface RequestPattern {
+            /**
+             * Wildcards ('*' -> zero or more, '?' -> exactly one) are allowed. Escape character is
+backslash. Omitting is equivalent to "*".
+             */
+            urlPattern?: string;
+            /**
+             * If set, only requests for matching resource types will be intercepted.
+             */
+            resourceType?: ResourceType;
+            /**
+             * Stage at wich to begin intercepting requests. Default is Request.
+             */
+            interceptionStage?: InterceptionStage;
+        }
+        /**
+         * Information about a signed exchange signature.
+https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html#rfc.section.3.1
+         */
+        export interface SignedExchangeSignature {
+            /**
+             * Signed exchange signature label.
+             */
+            label: string;
+            /**
+             * The hex string of signed exchange signature.
+             */
+            signature: string;
+            /**
+             * Signed exchange signature integrity.
+             */
+            integrity: string;
+            /**
+             * Signed exchange signature cert Url.
+             */
+            certUrl?: string;
+            /**
+             * The hex string of signed exchange signature cert sha256.
+             */
+            certSha256?: string;
+            /**
+             * Signed exchange signature validity Url.
+             */
+            validityUrl: string;
+            /**
+             * Signed exchange signature date.
+             */
+            date: number;
+            /**
+             * Signed exchange signature expires.
+             */
+            expires: number;
+            /**
+             * The encoded certificates.
+             */
+            certificates?: string[];
+        }
+        /**
+         * Information about a signed exchange header.
+https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html#cbor-representation
+         */
+        export interface SignedExchangeHeader {
+            /**
+             * Signed exchange request URL.
+             */
+            requestUrl: string;
+            /**
+             * Signed exchange response code.
+             */
+            responseCode: number;
+            /**
+             * Signed exchange response headers.
+             */
+            responseHeaders: Headers;
+            /**
+             * Signed exchange response signature.
+             */
+            signatures: SignedExchangeSignature[];
+            /**
+             * Signed exchange header integrity hash in the form of "sha256-<base64-hash-value>".
+             */
+            headerIntegrity: string;
+        }
+        /**
+         * Field type for a signed exchange related error.
+         */
+        export type SignedExchangeErrorField = "signatureSig"|"signatureIntegrity"|"signatureCertUrl"|"signatureCertSha256"|"signatureValidityUrl"|"signatureTimestamps";
+        /**
+         * Information about a signed exchange response.
+         */
+        export interface SignedExchangeError {
+            /**
+             * Error message.
+             */
+            message: string;
+            /**
+             * The index of the signature which caused the error.
+             */
+            signatureIndex?: number;
+            /**
+             * The field which caused the error.
+             */
+            errorField?: SignedExchangeErrorField;
+        }
+        /**
+         * Information about a signed exchange response.
+         */
+        export interface SignedExchangeInfo {
+            /**
+             * The outer response of signed HTTP exchange which was received from network.
+             */
+            outerResponse: Response;
+            /**
+             * Information about the signed exchange header.
+             */
+            header?: SignedExchangeHeader;
+            /**
+             * Security details for the signed exchange header.
+             */
+            securityDetails?: SecurityDetails;
+            /**
+             * Errors occurred while handling the signed exchagne.
+             */
+            errors?: SignedExchangeError[];
+        }
+        
+        /**
+         * Fired when data chunk was received over the network.
+         */
+        export type dataReceivedPayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+            /**
+             * Timestamp.
+             */
+            timestamp: MonotonicTime;
+            /**
+             * Data chunk length.
+             */
+            dataLength: number;
+            /**
+             * Actual bytes received (might be less than dataLength for compressed encodings).
+             */
+            encodedDataLength: number;
+        }
+        /**
+         * Fired when EventSource message is received.
+         */
+        export type eventSourceMessageReceivedPayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+            /**
+             * Timestamp.
+             */
+            timestamp: MonotonicTime;
+            /**
+             * Message type.
+             */
+            eventName: string;
+            /**
+             * Message identifier.
+             */
+            eventId: string;
+            /**
+             * Message content.
+             */
+            data: string;
+        }
+        /**
+         * Fired when HTTP request has failed to load.
+         */
+        export type loadingFailedPayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+            /**
+             * Timestamp.
+             */
+            timestamp: MonotonicTime;
+            /**
+             * Resource type.
+             */
+            type: ResourceType;
+            /**
+             * User friendly error message.
+             */
+            errorText: string;
+            /**
+             * True if loading was canceled.
+             */
+            canceled?: boolean;
+            /**
+             * The reason why loading was blocked, if any.
+             */
+            blockedReason?: BlockedReason;
+        }
+        /**
+         * Fired when HTTP request has finished loading.
+         */
+        export type loadingFinishedPayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+            /**
+             * Timestamp.
+             */
+            timestamp: MonotonicTime;
+            /**
+             * Total number of bytes received for this request.
+             */
+            encodedDataLength: number;
+            /**
+             * Set when 1) response was blocked by Cross-Origin Read Blocking and also
+2) this needs to be reported to the DevTools console.
+             */
+            shouldReportCorbBlocking?: boolean;
+        }
+        /**
+         * Details of an intercepted HTTP request, which must be either allowed, blocked, modified or
+mocked.
+Deprecated, use Fetch.requestPaused instead.
+         */
+        export type requestInterceptedPayload = {
+            /**
+             * Each request the page makes will have a unique id, however if any redirects are encountered
+while processing that fetch, they will be reported with the same id as the original fetch.
+Likewise if HTTP authentication is needed then the same fetch id will be used.
+             */
+            interceptionId: InterceptionId;
+            request: Request;
+            /**
+             * The id of the frame that initiated the request.
+             */
+            frameId: Page.FrameId;
+            /**
+             * How the requested resource will be used.
+             */
+            resourceType: ResourceType;
+            /**
+             * Whether this is a navigation request, which can abort the navigation completely.
+             */
+            isNavigationRequest: boolean;
+            /**
+             * Set if the request is a navigation that will result in a download.
+Only present after response is received from the server (i.e. HeadersReceived stage).
+             */
+            isDownload?: boolean;
+            /**
+             * Redirect location, only sent if a redirect was intercepted.
+             */
+            redirectUrl?: string;
+            /**
+             * Details of the Authorization Challenge encountered. If this is set then
+continueInterceptedRequest must contain an authChallengeResponse.
+             */
+            authChallenge?: AuthChallenge;
+            /**
+             * Response error if intercepted at response stage or if redirect occurred while intercepting
+request.
+             */
+            responseErrorReason?: ErrorReason;
+            /**
+             * Response code if intercepted at response stage or if redirect occurred while intercepting
+request or auth retry occurred.
+             */
+            responseStatusCode?: number;
+            /**
+             * Response headers if intercepted at the response stage or if redirect occurred while
+intercepting request or auth retry occurred.
+             */
+            responseHeaders?: Headers;
+            /**
+             * If the intercepted request had a corresponding requestWillBeSent event fired for it, then
+this requestId will be the same as the requestId present in the requestWillBeSent event.
+             */
+            requestId?: RequestId;
+        }
+        /**
+         * Fired if request ended up loading from cache.
+         */
+        export type requestServedFromCachePayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+        }
+        /**
+         * Fired when page is about to send HTTP request.
+         */
+        export type requestWillBeSentPayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+            /**
+             * Loader identifier. Empty string if the request is fetched from worker.
+             */
+            loaderId: LoaderId;
+            /**
+             * URL of the document this request is loaded for.
+             */
+            documentURL: string;
+            /**
+             * Request data.
+             */
+            request: Request;
+            /**
+             * Timestamp.
+             */
+            timestamp: MonotonicTime;
+            /**
+             * Timestamp.
+             */
+            wallTime: TimeSinceEpoch;
+            /**
+             * Request initiator.
+             */
+            initiator: Initiator;
+            /**
+             * Redirect response data.
+             */
+            redirectResponse?: Response;
+            /**
+             * Type of this resource.
+             */
+            type?: ResourceType;
+            /**
+             * Frame identifier.
+             */
+            frameId?: Page.FrameId;
+            /**
+             * Whether the request is initiated by a user gesture. Defaults to false.
+             */
+            hasUserGesture?: boolean;
+        }
+        /**
+         * Fired when resource loading priority is changed
+         */
+        export type resourceChangedPriorityPayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+            /**
+             * New priority
+             */
+            newPriority: ResourcePriority;
+            /**
+             * Timestamp.
+             */
+            timestamp: MonotonicTime;
+        }
+        /**
+         * Fired when a signed exchange was received over the network
+         */
+        export type signedExchangeReceivedPayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+            /**
+             * Information about the signed exchange response.
+             */
+            info: SignedExchangeInfo;
+        }
+        /**
+         * Fired when HTTP response is available.
+         */
+        export type responseReceivedPayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+            /**
+             * Loader identifier. Empty string if the request is fetched from worker.
+             */
+            loaderId: LoaderId;
+            /**
+             * Timestamp.
+             */
+            timestamp: MonotonicTime;
+            /**
+             * Resource type.
+             */
+            type: ResourceType;
+            /**
+             * Response data.
+             */
+            response: Response;
+            /**
+             * Frame identifier.
+             */
+            frameId?: Page.FrameId;
+        }
+        /**
+         * Fired when WebSocket is closed.
+         */
+        export type webSocketClosedPayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+            /**
+             * Timestamp.
+             */
+            timestamp: MonotonicTime;
+        }
+        /**
+         * Fired upon WebSocket creation.
+         */
+        export type webSocketCreatedPayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+            /**
+             * WebSocket request URL.
+             */
+            url: string;
+            /**
+             * Request initiator.
+             */
+            initiator?: Initiator;
+        }
+        /**
+         * Fired when WebSocket message error occurs.
+         */
+        export type webSocketFrameErrorPayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+            /**
+             * Timestamp.
+             */
+            timestamp: MonotonicTime;
+            /**
+             * WebSocket error message.
+             */
+            errorMessage: string;
+        }
+        /**
+         * Fired when WebSocket message is received.
+         */
+        export type webSocketFrameReceivedPayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+            /**
+             * Timestamp.
+             */
+            timestamp: MonotonicTime;
+            /**
+             * WebSocket response data.
+             */
+            response: WebSocketFrame;
+        }
+        /**
+         * Fired when WebSocket message is sent.
+         */
+        export type webSocketFrameSentPayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+            /**
+             * Timestamp.
+             */
+            timestamp: MonotonicTime;
+            /**
+             * WebSocket response data.
+             */
+            response: WebSocketFrame;
+        }
+        /**
+         * Fired when WebSocket handshake response becomes available.
+         */
+        export type webSocketHandshakeResponseReceivedPayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+            /**
+             * Timestamp.
+             */
+            timestamp: MonotonicTime;
+            /**
+             * WebSocket response data.
+             */
+            response: WebSocketResponse;
+        }
+        /**
+         * Fired when WebSocket is about to initiate handshake.
+         */
+        export type webSocketWillSendHandshakeRequestPayload = {
+            /**
+             * Request identifier.
+             */
+            requestId: RequestId;
+            /**
+             * Timestamp.
+             */
+            timestamp: MonotonicTime;
+            /**
+             * UTC Timestamp.
+             */
+            wallTime: TimeSinceEpoch;
+            /**
+             * WebSocket request data.
+             */
+            request: WebSocketRequest;
+        }
+        /**
+         * Fired when additional information about a requestWillBeSent event is available from the
+network stack. Not every requestWillBeSent event will have an additional
+requestWillBeSentExtraInfo fired for it, and there is no guarantee whether requestWillBeSent
+or requestWillBeSentExtraInfo will be fired first for the same request.
+         */
+        export type requestWillBeSentExtraInfoPayload = {
+            /**
+             * Request identifier. Used to match this information to an existing requestWillBeSent event.
+             */
+            requestId: RequestId;
+            /**
+             * A list of cookies which will not be sent with this request along with corresponding reasons
+for blocking.
+             */
+            blockedCookies: BlockedCookieWithReason[];
+            /**
+             * Raw request headers as they will be sent over the wire.
+             */
+            headers: Headers;
+        }
+        /**
+         * Fired when additional information about a responseReceived event is available from the network
+stack. Not every responseReceived event will have an additional responseReceivedExtraInfo for
+it, and responseReceivedExtraInfo may be fired before or after responseReceived.
+         */
+        export type responseReceivedExtraInfoPayload = {
+            /**
+             * Request identifier. Used to match this information to another responseReceived event.
+             */
+            requestId: RequestId;
+            /**
+             * A list of cookies which were not stored from the response along with the corresponding
+reasons for blocking. The cookies here may not be valid due to syntax errors, which
+are represented by the invalid cookie line string instead of a proper cookie.
+             */
+            blockedCookies: BlockedSetCookieWithReason[];
+            /**
+             * Raw response headers as they were received over the wire.
+             */
+            headers: Headers;
+            /**
+             * Raw response header text as it was received over the wire. The raw text may not always be
+available, such as in the case of HTTP/2 or QUIC.
+             */
+            headersText?: string;
+        }
+        
+        /**
+         * Tells whether clearing browser cache is supported.
+         */
+        export type canClearBrowserCacheParameters = {
+        }
+        export type canClearBrowserCacheReturnValue = {
+            /**
+             * True if browser cache can be cleared.
+             */
+            result: boolean;
+        }
+        /**
+         * Tells whether clearing browser cookies is supported.
+         */
+        export type canClearBrowserCookiesParameters = {
+        }
+        export type canClearBrowserCookiesReturnValue = {
+            /**
+             * True if browser cookies can be cleared.
+             */
+            result: boolean;
+        }
+        /**
+         * Tells whether emulation of network conditions is supported.
+         */
+        export type canEmulateNetworkConditionsParameters = {
+        }
+        export type canEmulateNetworkConditionsReturnValue = {
+            /**
+             * True if emulation of network conditions is supported.
+             */
+            result: boolean;
+        }
+        /**
+         * Clears browser cache.
+         */
+        export type clearBrowserCacheParameters = {
+        }
+        export type clearBrowserCacheReturnValue = {
+        }
+        /**
+         * Clears browser cookies.
+         */
+        export type clearBrowserCookiesParameters = {
+        }
+        export type clearBrowserCookiesReturnValue = {
+        }
+        /**
+         * Response to Network.requestIntercepted which either modifies the request to continue with any
+modifications, or blocks it, or completes it with the provided response bytes. If a network
+fetch occurs as a result which encounters a redirect an additional Network.requestIntercepted
+event will be sent with the same InterceptionId.
+Deprecated, use Fetch.continueRequest, Fetch.fulfillRequest and Fetch.failRequest instead.
+         */
+        export type continueInterceptedRequestParameters = {
+            interceptionId: InterceptionId;
+            /**
+             * If set this causes the request to fail with the given reason. Passing `Aborted` for requests
+marked with `isNavigationRequest` also cancels the navigation. Must not be set in response
+to an authChallenge.
+             */
+            errorReason?: ErrorReason;
+            /**
+             * If set the requests completes using with the provided base64 encoded raw response, including
+HTTP status line and headers etc... Must not be set in response to an authChallenge.
+             */
+            rawResponse?: binary;
+            /**
+             * If set the request url will be modified in a way that's not observable by page. Must not be
+set in response to an authChallenge.
+             */
+            url?: string;
+            /**
+             * If set this allows the request method to be overridden. Must not be set in response to an
+authChallenge.
+             */
+            method?: string;
+            /**
+             * If set this allows postData to be set. Must not be set in response to an authChallenge.
+             */
+            postData?: string;
+            /**
+             * If set this allows the request headers to be changed. Must not be set in response to an
+authChallenge.
+             */
+            headers?: Headers;
+            /**
+             * Response to a requestIntercepted with an authChallenge. Must not be set otherwise.
+             */
+            authChallengeResponse?: AuthChallengeResponse;
+        }
+        export type continueInterceptedRequestReturnValue = {
+        }
+        /**
+         * Deletes browser cookies with matching name and url or domain/path pair.
+         */
+        export type deleteCookiesParameters = {
+            /**
+             * Name of the cookies to remove.
+             */
+            name: string;
+            /**
+             * If specified, deletes all the cookies with the given name where domain and path match
+provided URL.
+             */
+            url?: string;
+            /**
+             * If specified, deletes only cookies with the exact domain.
+             */
+            domain?: string;
+            /**
+             * If specified, deletes only cookies with the exact path.
+             */
+            path?: string;
+        }
+        export type deleteCookiesReturnValue = {
+        }
+        /**
+         * Disables network tracking, prevents network events from being sent to the client.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Activates emulation of network conditions.
+         */
+        export type emulateNetworkConditionsParameters = {
+            /**
+             * True to emulate internet disconnection.
+             */
+            offline: boolean;
+            /**
+             * Minimum latency from request sent to response headers received (ms).
+             */
+            latency: number;
+            /**
+             * Maximal aggregated download throughput (bytes/sec). -1 disables download throttling.
+             */
+            downloadThroughput: number;
+            /**
+             * Maximal aggregated upload throughput (bytes/sec).  -1 disables upload throttling.
+             */
+            uploadThroughput: number;
+            /**
+             * Connection type if known.
+             */
+            connectionType?: ConnectionType;
+        }
+        export type emulateNetworkConditionsReturnValue = {
+        }
+        /**
+         * Enables network tracking, network events will now be delivered to the client.
+         */
+        export type enableParameters = {
+            /**
+             * Buffer size in bytes to use when preserving network payloads (XHRs, etc).
+             */
+            maxTotalBufferSize?: number;
+            /**
+             * Per-resource buffer size in bytes to use when preserving network payloads (XHRs, etc).
+             */
+            maxResourceBufferSize?: number;
+            /**
+             * Longest post body size (in bytes) that would be included in requestWillBeSent notification
+             */
+            maxPostDataSize?: number;
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Returns all browser cookies. Depending on the backend support, will return detailed cookie
+information in the `cookies` field.
+         */
+        export type getAllCookiesParameters = {
+        }
+        export type getAllCookiesReturnValue = {
+            /**
+             * Array of cookie objects.
+             */
+            cookies: Cookie[];
+        }
+        /**
+         * Returns the DER-encoded certificate.
+         */
+        export type getCertificateParameters = {
+            /**
+             * Origin to get certificate for.
+             */
+            origin: string;
+        }
+        export type getCertificateReturnValue = {
+            tableNames: string[];
+        }
+        /**
+         * Returns all browser cookies for the current URL. Depending on the backend support, will return
+detailed cookie information in the `cookies` field.
+         */
+        export type getCookiesParameters = {
+            /**
+             * The list of URLs for which applicable cookies will be fetched
+             */
+            urls?: string[];
+        }
+        export type getCookiesReturnValue = {
+            /**
+             * Array of cookie objects.
+             */
+            cookies: Cookie[];
+        }
+        /**
+         * Returns content served for the given request.
+         */
+        export type getResponseBodyParameters = {
+            /**
+             * Identifier of the network request to get content for.
+             */
+            requestId: RequestId;
+        }
+        export type getResponseBodyReturnValue = {
+            /**
+             * Response body.
+             */
+            body: string;
+            /**
+             * True, if content was sent as base64.
+             */
+            base64Encoded: boolean;
+        }
+        /**
+         * Returns post data sent with the request. Returns an error when no data was sent with the request.
+         */
+        export type getRequestPostDataParameters = {
+            /**
+             * Identifier of the network request to get content for.
+             */
+            requestId: RequestId;
+        }
+        export type getRequestPostDataReturnValue = {
+            /**
+             * Request body string, omitting files from multipart requests
+             */
+            postData: string;
+        }
+        /**
+         * Returns content served for the given currently intercepted request.
+         */
+        export type getResponseBodyForInterceptionParameters = {
+            /**
+             * Identifier for the intercepted request to get body for.
+             */
+            interceptionId: InterceptionId;
+        }
+        export type getResponseBodyForInterceptionReturnValue = {
+            /**
+             * Response body.
+             */
+            body: string;
+            /**
+             * True, if content was sent as base64.
+             */
+            base64Encoded: boolean;
+        }
+        /**
+         * Returns a handle to the stream representing the response body. Note that after this command,
+the intercepted request can't be continued as is -- you either need to cancel it or to provide
+the response body. The stream only supports sequential read, IO.read will fail if the position
+is specified.
+         */
+        export type takeResponseBodyForInterceptionAsStreamParameters = {
+            interceptionId: InterceptionId;
+        }
+        export type takeResponseBodyForInterceptionAsStreamReturnValue = {
+            stream: IO.StreamHandle;
+        }
+        /**
+         * This method sends a new XMLHttpRequest which is identical to the original one. The following
+parameters should be identical: method, url, async, request body, extra headers, withCredentials
+attribute, user, password.
+         */
+        export type replayXHRParameters = {
+            /**
+             * Identifier of XHR to replay.
+             */
+            requestId: RequestId;
+        }
+        export type replayXHRReturnValue = {
+        }
+        /**
+         * Searches for given string in response content.
+         */
+        export type searchInResponseBodyParameters = {
+            /**
+             * Identifier of the network response to search.
+             */
+            requestId: RequestId;
+            /**
+             * String to search for.
+             */
+            query: string;
+            /**
+             * If true, search is case sensitive.
+             */
+            caseSensitive?: boolean;
+            /**
+             * If true, treats string parameter as regex.
+             */
+            isRegex?: boolean;
+        }
+        export type searchInResponseBodyReturnValue = {
+            /**
+             * List of search matches.
+             */
+            result: Debugger.SearchMatch[];
+        }
+        /**
+         * Blocks URLs from loading.
+         */
+        export type setBlockedURLsParameters = {
+            /**
+             * URL patterns to block. Wildcards ('*') are allowed.
+             */
+            urls: string[];
+        }
+        export type setBlockedURLsReturnValue = {
+        }
+        /**
+         * Toggles ignoring of service worker for each request.
+         */
+        export type setBypassServiceWorkerParameters = {
+            /**
+             * Bypass service worker and load from network.
+             */
+            bypass: boolean;
+        }
+        export type setBypassServiceWorkerReturnValue = {
+        }
+        /**
+         * Toggles ignoring cache for each request. If `true`, cache will not be used.
+         */
+        export type setCacheDisabledParameters = {
+            /**
+             * Cache disabled state.
+             */
+            cacheDisabled: boolean;
+        }
+        export type setCacheDisabledReturnValue = {
+        }
+        /**
+         * Sets a cookie with the given cookie data; may overwrite equivalent cookies if they exist.
+         */
+        export type setCookieParameters = {
+            /**
+             * Cookie name.
+             */
+            name: string;
+            /**
+             * Cookie value.
+             */
+            value: string;
+            /**
+             * The request-URI to associate with the setting of the cookie. This value can affect the
+default domain and path values of the created cookie.
+             */
+            url?: string;
+            /**
+             * Cookie domain.
+             */
+            domain?: string;
+            /**
+             * Cookie path.
+             */
+            path?: string;
+            /**
+             * True if cookie is secure.
+             */
+            secure?: boolean;
+            /**
+             * True if cookie is http-only.
+             */
+            httpOnly?: boolean;
+            /**
+             * Cookie SameSite type.
+             */
+            sameSite?: CookieSameSite;
+            /**
+             * Cookie expiration date, session cookie if not set
+             */
+            expires?: TimeSinceEpoch;
+            /**
+             * Cookie Priority type.
+             */
+            priority?: CookiePriority;
+        }
+        export type setCookieReturnValue = {
+            /**
+             * True if successfully set cookie.
+             */
+            success: boolean;
+        }
+        /**
+         * Sets given cookies.
+         */
+        export type setCookiesParameters = {
+            /**
+             * Cookies to be set.
+             */
+            cookies: CookieParam[];
+        }
+        export type setCookiesReturnValue = {
+        }
+        /**
+         * For testing.
+         */
+        export type setDataSizeLimitsForTestParameters = {
+            /**
+             * Maximum total buffer size.
+             */
+            maxTotalSize: number;
+            /**
+             * Maximum per-resource size.
+             */
+            maxResourceSize: number;
+        }
+        export type setDataSizeLimitsForTestReturnValue = {
+        }
+        /**
+         * Specifies whether to always send extra HTTP headers with the requests from this page.
+         */
+        export type setExtraHTTPHeadersParameters = {
+            /**
+             * Map with extra HTTP headers.
+             */
+            headers: Headers;
+        }
+        export type setExtraHTTPHeadersReturnValue = {
+        }
+        /**
+         * Sets the requests to intercept that match the provided patterns and optionally resource types.
+Deprecated, please use Fetch.enable instead.
+         */
+        export type setRequestInterceptionParameters = {
+            /**
+             * Requests matching any of these patterns will be forwarded and wait for the corresponding
+continueInterceptedRequest call.
+             */
+            patterns: RequestPattern[];
+        }
+        export type setRequestInterceptionReturnValue = {
+        }
+        /**
+         * Allows overriding user agent with the given string.
+         */
+        export type setUserAgentOverrideParameters = {
+            /**
+             * User agent to use.
+             */
+            userAgent: string;
+            /**
+             * Browser langugage to emulate.
+             */
+            acceptLanguage?: string;
+            /**
+             * The platform navigator.platform should return.
+             */
+            platform?: string;
+        }
+        export type setUserAgentOverrideReturnValue = {
+        }
+    }
+    
+    /**
+     * This domain provides various functionality related to drawing atop the inspected page.
+     */
+    export module Overlay {
+        /**
+         * Configuration data for the highlighting of page elements.
+         */
+        export interface HighlightConfig {
+            /**
+             * Whether the node info tooltip should be shown (default: false).
+             */
+            showInfo?: boolean;
+            /**
+             * Whether the node styles in the tooltip (default: false).
+             */
+            showStyles?: boolean;
+            /**
+             * Whether the rulers should be shown (default: false).
+             */
+            showRulers?: boolean;
+            /**
+             * Whether the extension lines from node to the rulers should be shown (default: false).
+             */
+            showExtensionLines?: boolean;
+            /**
+             * The content box highlight fill color (default: transparent).
+             */
+            contentColor?: DOM.RGBA;
+            /**
+             * The padding highlight fill color (default: transparent).
+             */
+            paddingColor?: DOM.RGBA;
+            /**
+             * The border highlight fill color (default: transparent).
+             */
+            borderColor?: DOM.RGBA;
+            /**
+             * The margin highlight fill color (default: transparent).
+             */
+            marginColor?: DOM.RGBA;
+            /**
+             * The event target element highlight fill color (default: transparent).
+             */
+            eventTargetColor?: DOM.RGBA;
+            /**
+             * The shape outside fill color (default: transparent).
+             */
+            shapeColor?: DOM.RGBA;
+            /**
+             * The shape margin fill color (default: transparent).
+             */
+            shapeMarginColor?: DOM.RGBA;
+            /**
+             * The grid layout color (default: transparent).
+             */
+            cssGridColor?: DOM.RGBA;
+        }
+        export type InspectMode = "searchForNode"|"searchForUAShadowDOM"|"captureAreaScreenshot"|"showDistances"|"none";
+        
+        /**
+         * Fired when the node should be inspected. This happens after call to `setInspectMode` or when
+user manually inspects an element.
+         */
+        export type inspectNodeRequestedPayload = {
+            /**
+             * Id of the node to inspect.
+             */
+            backendNodeId: DOM.BackendNodeId;
+        }
+        /**
+         * Fired when the node should be highlighted. This happens after call to `setInspectMode`.
+         */
+        export type nodeHighlightRequestedPayload = {
+            nodeId: DOM.NodeId;
+        }
+        /**
+         * Fired when user asks to capture screenshot of some area on the page.
+         */
+        export type screenshotRequestedPayload = {
+            /**
+             * Viewport to capture, in device independent pixels (dip).
+             */
+            viewport: Page.Viewport;
+        }
+        /**
+         * Fired when user cancels the inspect mode.
+         */
+        export type inspectModeCanceledPayload = void;
+        
+        /**
+         * Disables domain notifications.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables domain notifications.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * For testing.
+         */
+        export type getHighlightObjectForTestParameters = {
+            /**
+             * Id of the node to get highlight object for.
+             */
+            nodeId: DOM.NodeId;
+            /**
+             * Whether to include distance info.
+             */
+            includeDistance?: boolean;
+            /**
+             * Whether to include style info.
+             */
+            includeStyle?: boolean;
+        }
+        export type getHighlightObjectForTestReturnValue = {
+            /**
+             * Highlight data for the node.
+             */
+            highlight: object;
+        }
+        /**
+         * Hides any highlight.
+         */
+        export type hideHighlightParameters = {
+        }
+        export type hideHighlightReturnValue = {
+        }
+        /**
+         * Highlights owner element of the frame with given id.
+         */
+        export type highlightFrameParameters = {
+            /**
+             * Identifier of the frame to highlight.
+             */
+            frameId: Page.FrameId;
+            /**
+             * The content box highlight fill color (default: transparent).
+             */
+            contentColor?: DOM.RGBA;
+            /**
+             * The content box highlight outline color (default: transparent).
+             */
+            contentOutlineColor?: DOM.RGBA;
+        }
+        export type highlightFrameReturnValue = {
+        }
+        /**
+         * Highlights DOM node with given id or with the given JavaScript object wrapper. Either nodeId or
+objectId must be specified.
+         */
+        export type highlightNodeParameters = {
+            /**
+             * A descriptor for the highlight appearance.
+             */
+            highlightConfig: HighlightConfig;
+            /**
+             * Identifier of the node to highlight.
+             */
+            nodeId?: DOM.NodeId;
+            /**
+             * Identifier of the backend node to highlight.
+             */
+            backendNodeId?: DOM.BackendNodeId;
+            /**
+             * JavaScript object id of the node to be highlighted.
+             */
+            objectId?: Runtime.RemoteObjectId;
+            /**
+             * Selectors to highlight relevant nodes.
+             */
+            selector?: string;
+        }
+        export type highlightNodeReturnValue = {
+        }
+        /**
+         * Highlights given quad. Coordinates are absolute with respect to the main frame viewport.
+         */
+        export type highlightQuadParameters = {
+            /**
+             * Quad to highlight
+             */
+            quad: DOM.Quad;
+            /**
+             * The highlight fill color (default: transparent).
+             */
+            color?: DOM.RGBA;
+            /**
+             * The highlight outline color (default: transparent).
+             */
+            outlineColor?: DOM.RGBA;
+        }
+        export type highlightQuadReturnValue = {
+        }
+        /**
+         * Highlights given rectangle. Coordinates are absolute with respect to the main frame viewport.
+         */
+        export type highlightRectParameters = {
+            /**
+             * X coordinate
+             */
+            x: number;
+            /**
+             * Y coordinate
+             */
+            y: number;
+            /**
+             * Rectangle width
+             */
+            width: number;
+            /**
+             * Rectangle height
+             */
+            height: number;
+            /**
+             * The highlight fill color (default: transparent).
+             */
+            color?: DOM.RGBA;
+            /**
+             * The highlight outline color (default: transparent).
+             */
+            outlineColor?: DOM.RGBA;
+        }
+        export type highlightRectReturnValue = {
+        }
+        /**
+         * Enters the 'inspect' mode. In this mode, elements that user is hovering over are highlighted.
+Backend then generates 'inspectNodeRequested' event upon element selection.
+         */
+        export type setInspectModeParameters = {
+            /**
+             * Set an inspection mode.
+             */
+            mode: InspectMode;
+            /**
+             * A descriptor for the highlight appearance of hovered-over nodes. May be omitted if `enabled
+== false`.
+             */
+            highlightConfig?: HighlightConfig;
+        }
+        export type setInspectModeReturnValue = {
+        }
+        /**
+         * Highlights owner element of all frames detected to be ads.
+         */
+        export type setShowAdHighlightsParameters = {
+            /**
+             * True for showing ad highlights
+             */
+            show: boolean;
+        }
+        export type setShowAdHighlightsReturnValue = {
+        }
+        export type setPausedInDebuggerMessageParameters = {
+            /**
+             * The message to display, also triggers resume and step over controls.
+             */
+            message?: string;
+        }
+        export type setPausedInDebuggerMessageReturnValue = {
+        }
+        /**
+         * Requests that backend shows debug borders on layers
+         */
+        export type setShowDebugBordersParameters = {
+            /**
+             * True for showing debug borders
+             */
+            show: boolean;
+        }
+        export type setShowDebugBordersReturnValue = {
+        }
+        /**
+         * Requests that backend shows the FPS counter
+         */
+        export type setShowFPSCounterParameters = {
+            /**
+             * True for showing the FPS counter
+             */
+            show: boolean;
+        }
+        export type setShowFPSCounterReturnValue = {
+        }
+        /**
+         * Requests that backend shows paint rectangles
+         */
+        export type setShowPaintRectsParameters = {
+            /**
+             * True for showing paint rectangles
+             */
+            result: boolean;
+        }
+        export type setShowPaintRectsReturnValue = {
+        }
+        /**
+         * Requests that backend shows layout shift regions
+         */
+        export type setShowLayoutShiftRegionsParameters = {
+            /**
+             * True for showing layout shift regions
+             */
+            result: boolean;
+        }
+        export type setShowLayoutShiftRegionsReturnValue = {
+        }
+        /**
+         * Requests that backend shows scroll bottleneck rects
+         */
+        export type setShowScrollBottleneckRectsParameters = {
+            /**
+             * True for showing scroll bottleneck rects
+             */
+            show: boolean;
+        }
+        export type setShowScrollBottleneckRectsReturnValue = {
+        }
+        /**
+         * Requests that backend shows hit-test borders on layers
+         */
+        export type setShowHitTestBordersParameters = {
+            /**
+             * True for showing hit-test borders
+             */
+            show: boolean;
+        }
+        export type setShowHitTestBordersReturnValue = {
+        }
+        /**
+         * Paints viewport size upon main frame resize.
+         */
+        export type setShowViewportSizeOnResizeParameters = {
+            /**
+             * Whether to paint size or not.
+             */
+            show: boolean;
+        }
+        export type setShowViewportSizeOnResizeReturnValue = {
+        }
+    }
+    
+    /**
+     * Actions and events related to the inspected page belong to the page domain.
+     */
+    export module Page {
+        /**
+         * Unique frame identifier.
+         */
+        export type FrameId = string;
+        /**
+         * Information about the Frame on the page.
+         */
+        export interface Frame {
+            /**
+             * Frame unique identifier.
+             */
+            id: FrameId;
+            /**
+             * Parent frame identifier.
+             */
+            parentId?: string;
+            /**
+             * Identifier of the loader associated with this frame.
+             */
+            loaderId: Network.LoaderId;
+            /**
+             * Frame's name as specified in the tag.
+             */
+            name?: string;
+            /**
+             * Frame document's URL without fragment.
+             */
+            url: string;
+            /**
+             * Frame document's URL fragment including the '#'.
+             */
+            urlFragment?: string;
+            /**
+             * Frame document's security origin.
+             */
+            securityOrigin: string;
+            /**
+             * Frame document's mimeType as determined by the browser.
+             */
+            mimeType: string;
+            /**
+             * If the frame failed to load, this contains the URL that could not be loaded. Note that unlike url above, this URL may contain a fragment.
+             */
+            unreachableUrl?: string;
+        }
+        /**
+         * Information about the Resource on the page.
+         */
+        export interface FrameResource {
+            /**
+             * Resource URL.
+             */
+            url: string;
+            /**
+             * Type of this resource.
+             */
+            type: Network.ResourceType;
+            /**
+             * Resource mimeType as determined by the browser.
+             */
+            mimeType: string;
+            /**
+             * last-modified timestamp as reported by server.
+             */
+            lastModified?: Network.TimeSinceEpoch;
+            /**
+             * Resource content size.
+             */
+            contentSize?: number;
+            /**
+             * True if the resource failed to load.
+             */
+            failed?: boolean;
+            /**
+             * True if the resource was canceled during loading.
+             */
+            canceled?: boolean;
+        }
+        /**
+         * Information about the Frame hierarchy along with their cached resources.
+         */
+        export interface FrameResourceTree {
+            /**
+             * Frame information for this tree item.
+             */
+            frame: Frame;
+            /**
+             * Child frames.
+             */
+            childFrames?: FrameResourceTree[];
+            /**
+             * Information about frame resources.
+             */
+            resources: FrameResource[];
+        }
+        /**
+         * Information about the Frame hierarchy.
+         */
+        export interface FrameTree {
+            /**
+             * Frame information for this tree item.
+             */
+            frame: Frame;
+            /**
+             * Child frames.
+             */
+            childFrames?: FrameTree[];
+        }
+        /**
+         * Unique script identifier.
+         */
+        export type ScriptIdentifier = string;
+        /**
+         * Transition type.
+         */
+        export type TransitionType = "link"|"typed"|"address_bar"|"auto_bookmark"|"auto_subframe"|"manual_subframe"|"generated"|"auto_toplevel"|"form_submit"|"reload"|"keyword"|"keyword_generated"|"other";
+        /**
+         * Navigation history entry.
+         */
+        export interface NavigationEntry {
+            /**
+             * Unique id of the navigation history entry.
+             */
+            id: number;
+            /**
+             * URL of the navigation history entry.
+             */
+            url: string;
+            /**
+             * URL that the user typed in the url bar.
+             */
+            userTypedURL: string;
+            /**
+             * Title of the navigation history entry.
+             */
+            title: string;
+            /**
+             * Transition type.
+             */
+            transitionType: TransitionType;
+        }
+        /**
+         * Screencast frame metadata.
+         */
+        export interface ScreencastFrameMetadata {
+            /**
+             * Top offset in DIP.
+             */
+            offsetTop: number;
+            /**
+             * Page scale factor.
+             */
+            pageScaleFactor: number;
+            /**
+             * Device screen width in DIP.
+             */
+            deviceWidth: number;
+            /**
+             * Device screen height in DIP.
+             */
+            deviceHeight: number;
+            /**
+             * Position of horizontal scroll in CSS pixels.
+             */
+            scrollOffsetX: number;
+            /**
+             * Position of vertical scroll in CSS pixels.
+             */
+            scrollOffsetY: number;
+            /**
+             * Frame swap timestamp.
+             */
+            timestamp?: Network.TimeSinceEpoch;
+        }
+        /**
+         * Javascript dialog type.
+         */
+        export type DialogType = "alert"|"confirm"|"prompt"|"beforeunload";
+        /**
+         * Error while paring app manifest.
+         */
+        export interface AppManifestError {
+            /**
+             * Error message.
+             */
+            message: string;
+            /**
+             * If criticial, this is a non-recoverable parse error.
+             */
+            critical: number;
+            /**
+             * Error line.
+             */
+            line: number;
+            /**
+             * Error column.
+             */
+            column: number;
+        }
+        /**
+         * Parsed app manifest properties.
+         */
+        export interface AppManifestParsedProperties {
+            /**
+             * Computed scope value
+             */
+            scope: string;
+        }
+        /**
+         * Layout viewport position and dimensions.
+         */
+        export interface LayoutViewport {
+            /**
+             * Horizontal offset relative to the document (CSS pixels).
+             */
+            pageX: number;
+            /**
+             * Vertical offset relative to the document (CSS pixels).
+             */
+            pageY: number;
+            /**
+             * Width (CSS pixels), excludes scrollbar if present.
+             */
+            clientWidth: number;
+            /**
+             * Height (CSS pixels), excludes scrollbar if present.
+             */
+            clientHeight: number;
+        }
+        /**
+         * Visual viewport position, dimensions, and scale.
+         */
+        export interface VisualViewport {
+            /**
+             * Horizontal offset relative to the layout viewport (CSS pixels).
+             */
+            offsetX: number;
+            /**
+             * Vertical offset relative to the layout viewport (CSS pixels).
+             */
+            offsetY: number;
+            /**
+             * Horizontal offset relative to the document (CSS pixels).
+             */
+            pageX: number;
+            /**
+             * Vertical offset relative to the document (CSS pixels).
+             */
+            pageY: number;
+            /**
+             * Width (CSS pixels), excludes scrollbar if present.
+             */
+            clientWidth: number;
+            /**
+             * Height (CSS pixels), excludes scrollbar if present.
+             */
+            clientHeight: number;
+            /**
+             * Scale relative to the ideal viewport (size at width=device-width).
+             */
+            scale: number;
+            /**
+             * Page zoom factor (CSS to device independent pixels ratio).
+             */
+            zoom?: number;
+        }
+        /**
+         * Viewport for capturing screenshot.
+         */
+        export interface Viewport {
+            /**
+             * X offset in device independent pixels (dip).
+             */
+            x: number;
+            /**
+             * Y offset in device independent pixels (dip).
+             */
+            y: number;
+            /**
+             * Rectangle width in device independent pixels (dip).
+             */
+            width: number;
+            /**
+             * Rectangle height in device independent pixels (dip).
+             */
+            height: number;
+            /**
+             * Page scale factor.
+             */
+            scale: number;
+        }
+        /**
+         * Generic font families collection.
+         */
+        export interface FontFamilies {
+            /**
+             * The standard font-family.
+             */
+            standard?: string;
+            /**
+             * The fixed font-family.
+             */
+            fixed?: string;
+            /**
+             * The serif font-family.
+             */
+            serif?: string;
+            /**
+             * The sansSerif font-family.
+             */
+            sansSerif?: string;
+            /**
+             * The cursive font-family.
+             */
+            cursive?: string;
+            /**
+             * The fantasy font-family.
+             */
+            fantasy?: string;
+            /**
+             * The pictograph font-family.
+             */
+            pictograph?: string;
+        }
+        /**
+         * Default font sizes.
+         */
+        export interface FontSizes {
+            /**
+             * Default standard font size.
+             */
+            standard?: number;
+            /**
+             * Default fixed font size.
+             */
+            fixed?: number;
+        }
+        export type ClientNavigationReason = "formSubmissionGet"|"formSubmissionPost"|"httpHeaderRefresh"|"scriptInitiated"|"metaTagRefresh"|"pageBlockInterstitial"|"reload"|"anchorClick";
+        export interface InstallabilityErrorArgument {
+            /**
+             * Argument name (e.g. name:'minimum-icon-size-in-pixels').
+             */
+            name: string;
+            /**
+             * Argument value (e.g. value:'64').
+             */
+            value: string;
+        }
+        /**
+         * The installability error
+         */
+        export interface InstallabilityError {
+            /**
+             * The error id (e.g. 'manifest-missing-suitable-icon').
+             */
+            errorId: string;
+            /**
+             * The list of error arguments (e.g. {name:'minimum-icon-size-in-pixels', value:'64'}).
+             */
+            errorArguments: InstallabilityErrorArgument[];
+        }
+        
+        export type domContentEventFiredPayload = {
+            timestamp: Network.MonotonicTime;
+        }
+        /**
+         * Emitted only when `page.interceptFileChooser` is enabled.
+         */
+        export type fileChooserOpenedPayload = {
+            /**
+             * Id of the frame containing input node.
+             */
+            frameId: FrameId;
+            /**
+             * Input node id.
+             */
+            backendNodeId: DOM.BackendNodeId;
+            /**
+             * Input mode.
+             */
+            mode: "selectSingle"|"selectMultiple";
+        }
+        /**
+         * Fired when frame has been attached to its parent.
+         */
+        export type frameAttachedPayload = {
+            /**
+             * Id of the frame that has been attached.
+             */
+            frameId: FrameId;
+            /**
+             * Parent frame identifier.
+             */
+            parentFrameId: FrameId;
+            /**
+             * JavaScript stack trace of when frame was attached, only set if frame initiated from script.
+             */
+            stack?: Runtime.StackTrace;
+        }
+        /**
+         * Fired when frame no longer has a scheduled navigation.
+         */
+        export type frameClearedScheduledNavigationPayload = {
+            /**
+             * Id of the frame that has cleared its scheduled navigation.
+             */
+            frameId: FrameId;
+        }
+        /**
+         * Fired when frame has been detached from its parent.
+         */
+        export type frameDetachedPayload = {
+            /**
+             * Id of the frame that has been detached.
+             */
+            frameId: FrameId;
+        }
+        /**
+         * Fired once navigation of the frame has completed. Frame is now associated with the new loader.
+         */
+        export type frameNavigatedPayload = {
+            /**
+             * Frame object.
+             */
+            frame: Frame;
+        }
+        export type frameResizedPayload = void;
+        /**
+         * Fired when a renderer-initiated navigation is requested.
+Navigation may still be cancelled after the event is issued.
+         */
+        export type frameRequestedNavigationPayload = {
+            /**
+             * Id of the frame that is being navigated.
+             */
+            frameId: FrameId;
+            /**
+             * The reason for the navigation.
+             */
+            reason: ClientNavigationReason;
+            /**
+             * The destination URL for the requested navigation.
+             */
+            url: string;
+        }
+        /**
+         * Fired when frame schedules a potential navigation.
+         */
+        export type frameScheduledNavigationPayload = {
+            /**
+             * Id of the frame that has scheduled a navigation.
+             */
+            frameId: FrameId;
+            /**
+             * Delay (in seconds) until the navigation is scheduled to begin. The navigation is not
+guaranteed to start.
+             */
+            delay: number;
+            /**
+             * The reason for the navigation.
+             */
+            reason: ClientNavigationReason;
+            /**
+             * The destination URL for the scheduled navigation.
+             */
+            url: string;
+        }
+        /**
+         * Fired when frame has started loading.
+         */
+        export type frameStartedLoadingPayload = {
+            /**
+             * Id of the frame that has started loading.
+             */
+            frameId: FrameId;
+        }
+        /**
+         * Fired when frame has stopped loading.
+         */
+        export type frameStoppedLoadingPayload = {
+            /**
+             * Id of the frame that has stopped loading.
+             */
+            frameId: FrameId;
+        }
+        /**
+         * Fired when page is about to start a download.
+         */
+        export type downloadWillBeginPayload = {
+            /**
+             * Id of the frame that caused download to begin.
+             */
+            frameId: FrameId;
+            /**
+             * URL of the resource being downloaded.
+             */
+            url: string;
+        }
+        /**
+         * Fired when interstitial page was hidden
+         */
+        export type interstitialHiddenPayload = void;
+        /**
+         * Fired when interstitial page was shown
+         */
+        export type interstitialShownPayload = void;
+        /**
+         * Fired when a JavaScript initiated dialog (alert, confirm, prompt, or onbeforeunload) has been
+closed.
+         */
+        export type javascriptDialogClosedPayload = {
+            /**
+             * Whether dialog was confirmed.
+             */
+            result: boolean;
+            /**
+             * User input in case of prompt.
+             */
+            userInput: string;
+        }
+        /**
+         * Fired when a JavaScript initiated dialog (alert, confirm, prompt, or onbeforeunload) is about to
+open.
+         */
+        export type javascriptDialogOpeningPayload = {
+            /**
+             * Frame url.
+             */
+            url: string;
+            /**
+             * Message that will be displayed by the dialog.
+             */
+            message: string;
+            /**
+             * Dialog type.
+             */
+            type: DialogType;
+            /**
+             * True iff browser is capable showing or acting on the given dialog. When browser has no
+dialog handler for given target, calling alert while Page domain is engaged will stall
+the page execution. Execution can be resumed via calling Page.handleJavaScriptDialog.
+             */
+            hasBrowserHandler: boolean;
+            /**
+             * Default dialog prompt.
+             */
+            defaultPrompt?: string;
+        }
+        /**
+         * Fired for top level page lifecycle events such as navigation, load, paint, etc.
+         */
+        export type lifecycleEventPayload = {
+            /**
+             * Id of the frame.
+             */
+            frameId: FrameId;
+            /**
+             * Loader identifier. Empty string if the request is fetched from worker.
+             */
+            loaderId: Network.LoaderId;
+            name: string;
+            timestamp: Network.MonotonicTime;
+        }
+        export type loadEventFiredPayload = {
+            timestamp: Network.MonotonicTime;
+        }
+        /**
+         * Fired when same-document navigation happens, e.g. due to history API usage or anchor navigation.
+         */
+        export type navigatedWithinDocumentPayload = {
+            /**
+             * Id of the frame.
+             */
+            frameId: FrameId;
+            /**
+             * Frame's new url.
+             */
+            url: string;
+        }
+        /**
+         * Compressed image data requested by the `startScreencast`.
+         */
+        export type screencastFramePayload = {
+            /**
+             * Base64-encoded compressed image.
+             */
+            data: binary;
+            /**
+             * Screencast frame metadata.
+             */
+            metadata: ScreencastFrameMetadata;
+            /**
+             * Frame number.
+             */
+            sessionId: number;
+        }
+        /**
+         * Fired when the page with currently enabled screencast was shown or hidden `.
+         */
+        export type screencastVisibilityChangedPayload = {
+            /**
+             * True if the page is visible.
+             */
+            visible: boolean;
+        }
+        /**
+         * Fired when a new window is going to be opened, via window.open(), link click, form submission,
+etc.
+         */
+        export type windowOpenPayload = {
+            /**
+             * The URL for the new window.
+             */
+            url: string;
+            /**
+             * Window name.
+             */
+            windowName: string;
+            /**
+             * An array of enabled window features.
+             */
+            windowFeatures: string[];
+            /**
+             * Whether or not it was triggered by user gesture.
+             */
+            userGesture: boolean;
+        }
+        /**
+         * Issued for every compilation cache generated. Is only available
+if Page.setGenerateCompilationCache is enabled.
+         */
+        export type compilationCacheProducedPayload = {
+            url: string;
+            /**
+             * Base64-encoded data
+             */
+            data: binary;
+        }
+        
+        /**
+         * Deprecated, please use addScriptToEvaluateOnNewDocument instead.
+         */
+        export type addScriptToEvaluateOnLoadParameters = {
+            scriptSource: string;
+        }
+        export type addScriptToEvaluateOnLoadReturnValue = {
+            /**
+             * Identifier of the added script.
+             */
+            identifier: ScriptIdentifier;
+        }
+        /**
+         * Evaluates given script in every frame upon creation (before loading frame's scripts).
+         */
+        export type addScriptToEvaluateOnNewDocumentParameters = {
+            source: string;
+            /**
+             * If specified, creates an isolated world with the given name and evaluates given script in it.
+This world name will be used as the ExecutionContextDescription::name when the corresponding
+event is emitted.
+             */
+            worldName?: string;
+        }
+        export type addScriptToEvaluateOnNewDocumentReturnValue = {
+            /**
+             * Identifier of the added script.
+             */
+            identifier: ScriptIdentifier;
+        }
+        /**
+         * Brings page to front (activates tab).
+         */
+        export type bringToFrontParameters = {
+        }
+        export type bringToFrontReturnValue = {
+        }
+        /**
+         * Capture page screenshot.
+         */
+        export type captureScreenshotParameters = {
+            /**
+             * Image compression format (defaults to png).
+             */
+            format?: "jpeg"|"png";
+            /**
+             * Compression quality from range [0..100] (jpeg only).
+             */
+            quality?: number;
+            /**
+             * Capture the screenshot of a given region only.
+             */
+            clip?: Viewport;
+            /**
+             * Capture the screenshot from the surface, rather than the view. Defaults to true.
+             */
+            fromSurface?: boolean;
+        }
+        export type captureScreenshotReturnValue = {
+            /**
+             * Base64-encoded image data.
+             */
+            data: binary;
+        }
+        /**
+         * Returns a snapshot of the page as a string. For MHTML format, the serialization includes
+iframes, shadow DOM, external resources, and element-inline styles.
+         */
+        export type captureSnapshotParameters = {
+            /**
+             * Format (defaults to mhtml).
+             */
+            format?: "mhtml";
+        }
+        export type captureSnapshotReturnValue = {
+            /**
+             * Serialized page data.
+             */
+            data: string;
+        }
+        /**
+         * Clears the overriden device metrics.
+         */
+        export type clearDeviceMetricsOverrideParameters = {
+        }
+        export type clearDeviceMetricsOverrideReturnValue = {
+        }
+        /**
+         * Clears the overridden Device Orientation.
+         */
+        export type clearDeviceOrientationOverrideParameters = {
+        }
+        export type clearDeviceOrientationOverrideReturnValue = {
+        }
+        /**
+         * Clears the overriden Geolocation Position and Error.
+         */
+        export type clearGeolocationOverrideParameters = {
+        }
+        export type clearGeolocationOverrideReturnValue = {
+        }
+        /**
+         * Creates an isolated world for the given frame.
+         */
+        export type createIsolatedWorldParameters = {
+            /**
+             * Id of the frame in which the isolated world should be created.
+             */
+            frameId: FrameId;
+            /**
+             * An optional name which is reported in the Execution Context.
+             */
+            worldName?: string;
+            /**
+             * Whether or not universal access should be granted to the isolated world. This is a powerful
+option, use with caution.
+             */
+            grantUniveralAccess?: boolean;
+        }
+        export type createIsolatedWorldReturnValue = {
+            /**
+             * Execution context of the isolated world.
+             */
+            executionContextId: Runtime.ExecutionContextId;
+        }
+        /**
+         * Deletes browser cookie with given name, domain and path.
+         */
+        export type deleteCookieParameters = {
+            /**
+             * Name of the cookie to remove.
+             */
+            cookieName: string;
+            /**
+             * URL to match cooke domain and path.
+             */
+            url: string;
+        }
+        export type deleteCookieReturnValue = {
+        }
+        /**
+         * Disables page domain notifications.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables page domain notifications.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        export type getAppManifestParameters = {
+        }
+        export type getAppManifestReturnValue = {
+            /**
+             * Manifest location.
+             */
+            url: string;
+            errors: AppManifestError[];
+            /**
+             * Manifest content.
+             */
+            data?: string;
+            /**
+             * Parsed manifest properties
+             */
+            parsed?: AppManifestParsedProperties;
+        }
+        export type getInstallabilityErrorsParameters = {
+        }
+        export type getInstallabilityErrorsReturnValue = {
+            errors: string[];
+            installabilityErrors: InstallabilityError[];
+        }
+        export type getManifestIconsParameters = {
+        }
+        export type getManifestIconsReturnValue = {
+            primaryIcon?: binary;
+        }
+        /**
+         * Returns all browser cookies. Depending on the backend support, will return detailed cookie
+information in the `cookies` field.
+         */
+        export type getCookiesParameters = {
+        }
+        export type getCookiesReturnValue = {
+            /**
+             * Array of cookie objects.
+             */
+            cookies: Network.Cookie[];
+        }
+        /**
+         * Returns present frame tree structure.
+         */
+        export type getFrameTreeParameters = {
+        }
+        export type getFrameTreeReturnValue = {
+            /**
+             * Present frame tree structure.
+             */
+            frameTree: FrameTree;
+        }
+        /**
+         * Returns metrics relating to the layouting of the page, such as viewport bounds/scale.
+         */
+        export type getLayoutMetricsParameters = {
+        }
+        export type getLayoutMetricsReturnValue = {
+            /**
+             * Metrics relating to the layout viewport.
+             */
+            layoutViewport: LayoutViewport;
+            /**
+             * Metrics relating to the visual viewport.
+             */
+            visualViewport: VisualViewport;
+            /**
+             * Size of scrollable area.
+             */
+            contentSize: DOM.Rect;
+        }
+        /**
+         * Returns navigation history for the current page.
+         */
+        export type getNavigationHistoryParameters = {
+        }
+        export type getNavigationHistoryReturnValue = {
+            /**
+             * Index of the current navigation history entry.
+             */
+            currentIndex: number;
+            /**
+             * Array of navigation history entries.
+             */
+            entries: NavigationEntry[];
+        }
+        /**
+         * Resets navigation history for the current page.
+         */
+        export type resetNavigationHistoryParameters = {
+        }
+        export type resetNavigationHistoryReturnValue = {
+        }
+        /**
+         * Returns content of the given resource.
+         */
+        export type getResourceContentParameters = {
+            /**
+             * Frame id to get resource for.
+             */
+            frameId: FrameId;
+            /**
+             * URL of the resource to get content for.
+             */
+            url: string;
+        }
+        export type getResourceContentReturnValue = {
+            /**
+             * Resource content.
+             */
+            content: string;
+            /**
+             * True, if content was served as base64.
+             */
+            base64Encoded: boolean;
+        }
+        /**
+         * Returns present frame / resource tree structure.
+         */
+        export type getResourceTreeParameters = {
+        }
+        export type getResourceTreeReturnValue = {
+            /**
+             * Present frame / resource tree structure.
+             */
+            frameTree: FrameResourceTree;
+        }
+        /**
+         * Accepts or dismisses a JavaScript initiated dialog (alert, confirm, prompt, or onbeforeunload).
+         */
+        export type handleJavaScriptDialogParameters = {
+            /**
+             * Whether to accept or dismiss the dialog.
+             */
+            accept: boolean;
+            /**
+             * The text to enter into the dialog prompt before accepting. Used only if this is a prompt
+dialog.
+             */
+            promptText?: string;
+        }
+        export type handleJavaScriptDialogReturnValue = {
+        }
+        /**
+         * Navigates current page to the given URL.
+         */
+        export type navigateParameters = {
+            /**
+             * URL to navigate the page to.
+             */
+            url: string;
+            /**
+             * Referrer URL.
+             */
+            referrer?: string;
+            /**
+             * Intended transition type.
+             */
+            transitionType?: TransitionType;
+            /**
+             * Frame id to navigate, if not specified navigates the top frame.
+             */
+            frameId?: FrameId;
+        }
+        export type navigateReturnValue = {
+            /**
+             * Frame id that has navigated (or failed to navigate)
+             */
+            frameId: FrameId;
+            /**
+             * Loader identifier.
+             */
+            loaderId?: Network.LoaderId;
+            /**
+             * User friendly error message, present if and only if navigation has failed.
+             */
+            errorText?: string;
+        }
+        /**
+         * Navigates current page to the given history entry.
+         */
+        export type navigateToHistoryEntryParameters = {
+            /**
+             * Unique id of the entry to navigate to.
+             */
+            entryId: number;
+        }
+        export type navigateToHistoryEntryReturnValue = {
+        }
+        /**
+         * Print page as PDF.
+         */
+        export type printToPDFParameters = {
+            /**
+             * Paper orientation. Defaults to false.
+             */
+            landscape?: boolean;
+            /**
+             * Display header and footer. Defaults to false.
+             */
+            displayHeaderFooter?: boolean;
+            /**
+             * Print background graphics. Defaults to false.
+             */
+            printBackground?: boolean;
+            /**
+             * Scale of the webpage rendering. Defaults to 1.
+             */
+            scale?: number;
+            /**
+             * Paper width in inches. Defaults to 8.5 inches.
+             */
+            paperWidth?: number;
+            /**
+             * Paper height in inches. Defaults to 11 inches.
+             */
+            paperHeight?: number;
+            /**
+             * Top margin in inches. Defaults to 1cm (~0.4 inches).
+             */
+            marginTop?: number;
+            /**
+             * Bottom margin in inches. Defaults to 1cm (~0.4 inches).
+             */
+            marginBottom?: number;
+            /**
+             * Left margin in inches. Defaults to 1cm (~0.4 inches).
+             */
+            marginLeft?: number;
+            /**
+             * Right margin in inches. Defaults to 1cm (~0.4 inches).
+             */
+            marginRight?: number;
+            /**
+             * Paper ranges to print, e.g., '1-5, 8, 11-13'. Defaults to the empty string, which means
+print all pages.
+             */
+            pageRanges?: string;
+            /**
+             * Whether to silently ignore invalid but successfully parsed page ranges, such as '3-2'.
+Defaults to false.
+             */
+            ignoreInvalidPageRanges?: boolean;
+            /**
+             * HTML template for the print header. Should be valid HTML markup with following
+classes used to inject printing values into them:
+- `date`: formatted print date
+- `title`: document title
+- `url`: document location
+- `pageNumber`: current page number
+- `totalPages`: total pages in the document
+
+For example, `<span class=title></span>` would generate span containing the title.
+             */
+            headerTemplate?: string;
+            /**
+             * HTML template for the print footer. Should use the same format as the `headerTemplate`.
+             */
+            footerTemplate?: string;
+            /**
+             * Whether or not to prefer page size as defined by css. Defaults to false,
+in which case the content will be scaled to fit the paper size.
+             */
+            preferCSSPageSize?: boolean;
+            /**
+             * return as stream
+             */
+            transferMode?: "ReturnAsBase64"|"ReturnAsStream";
+        }
+        export type printToPDFReturnValue = {
+            /**
+             * Base64-encoded pdf data. Empty if |returnAsStream| is specified.
+             */
+            data: binary;
+            /**
+             * A handle of the stream that holds resulting PDF data.
+             */
+            stream?: IO.StreamHandle;
+        }
+        /**
+         * Reloads given page optionally ignoring the cache.
+         */
+        export type reloadParameters = {
+            /**
+             * If true, browser cache is ignored (as if the user pressed Shift+refresh).
+             */
+            ignoreCache?: boolean;
+            /**
+             * If set, the script will be injected into all frames of the inspected page after reload.
+Argument will be ignored if reloading dataURL origin.
+             */
+            scriptToEvaluateOnLoad?: string;
+        }
+        export type reloadReturnValue = {
+        }
+        /**
+         * Deprecated, please use removeScriptToEvaluateOnNewDocument instead.
+         */
+        export type removeScriptToEvaluateOnLoadParameters = {
+            identifier: ScriptIdentifier;
+        }
+        export type removeScriptToEvaluateOnLoadReturnValue = {
+        }
+        /**
+         * Removes given script from the list.
+         */
+        export type removeScriptToEvaluateOnNewDocumentParameters = {
+            identifier: ScriptIdentifier;
+        }
+        export type removeScriptToEvaluateOnNewDocumentReturnValue = {
+        }
+        /**
+         * Acknowledges that a screencast frame has been received by the frontend.
+         */
+        export type screencastFrameAckParameters = {
+            /**
+             * Frame number.
+             */
+            sessionId: number;
+        }
+        export type screencastFrameAckReturnValue = {
+        }
+        /**
+         * Searches for given string in resource content.
+         */
+        export type searchInResourceParameters = {
+            /**
+             * Frame id for resource to search in.
+             */
+            frameId: FrameId;
+            /**
+             * URL of the resource to search in.
+             */
+            url: string;
+            /**
+             * String to search for.
+             */
+            query: string;
+            /**
+             * If true, search is case sensitive.
+             */
+            caseSensitive?: boolean;
+            /**
+             * If true, treats string parameter as regex.
+             */
+            isRegex?: boolean;
+        }
+        export type searchInResourceReturnValue = {
+            /**
+             * List of search matches.
+             */
+            result: Debugger.SearchMatch[];
+        }
+        /**
+         * Enable Chrome's experimental ad filter on all sites.
+         */
+        export type setAdBlockingEnabledParameters = {
+            /**
+             * Whether to block ads.
+             */
+            enabled: boolean;
+        }
+        export type setAdBlockingEnabledReturnValue = {
+        }
+        /**
+         * Enable page Content Security Policy by-passing.
+         */
+        export type setBypassCSPParameters = {
+            /**
+             * Whether to bypass page CSP.
+             */
+            enabled: boolean;
+        }
+        export type setBypassCSPReturnValue = {
+        }
+        /**
+         * Overrides the values of device screen dimensions (window.screen.width, window.screen.height,
+window.innerWidth, window.innerHeight, and "device-width"/"device-height"-related CSS media
+query results).
+         */
+        export type setDeviceMetricsOverrideParameters = {
+            /**
+             * Overriding width value in pixels (minimum 0, maximum 10000000). 0 disables the override.
+             */
+            width: number;
+            /**
+             * Overriding height value in pixels (minimum 0, maximum 10000000). 0 disables the override.
+             */
+            height: number;
+            /**
+             * Overriding device scale factor value. 0 disables the override.
+             */
+            deviceScaleFactor: number;
+            /**
+             * Whether to emulate mobile device. This includes viewport meta tag, overlay scrollbars, text
+autosizing and more.
+             */
+            mobile: boolean;
+            /**
+             * Scale to apply to resulting view image.
+             */
+            scale?: number;
+            /**
+             * Overriding screen width value in pixels (minimum 0, maximum 10000000).
+             */
+            screenWidth?: number;
+            /**
+             * Overriding screen height value in pixels (minimum 0, maximum 10000000).
+             */
+            screenHeight?: number;
+            /**
+             * Overriding view X position on screen in pixels (minimum 0, maximum 10000000).
+             */
+            positionX?: number;
+            /**
+             * Overriding view Y position on screen in pixels (minimum 0, maximum 10000000).
+             */
+            positionY?: number;
+            /**
+             * Do not set visible view size, rely upon explicit setVisibleSize call.
+             */
+            dontSetVisibleSize?: boolean;
+            /**
+             * Screen orientation override.
+             */
+            screenOrientation?: Emulation.ScreenOrientation;
+            /**
+             * The viewport dimensions and scale. If not set, the override is cleared.
+             */
+            viewport?: Viewport;
+        }
+        export type setDeviceMetricsOverrideReturnValue = {
+        }
+        /**
+         * Overrides the Device Orientation.
+         */
+        export type setDeviceOrientationOverrideParameters = {
+            /**
+             * Mock alpha
+             */
+            alpha: number;
+            /**
+             * Mock beta
+             */
+            beta: number;
+            /**
+             * Mock gamma
+             */
+            gamma: number;
+        }
+        export type setDeviceOrientationOverrideReturnValue = {
+        }
+        /**
+         * Set generic font families.
+         */
+        export type setFontFamiliesParameters = {
+            /**
+             * Specifies font families to set. If a font family is not specified, it won't be changed.
+             */
+            fontFamilies: FontFamilies;
+        }
+        export type setFontFamiliesReturnValue = {
+        }
+        /**
+         * Set default font sizes.
+         */
+        export type setFontSizesParameters = {
+            /**
+             * Specifies font sizes to set. If a font size is not specified, it won't be changed.
+             */
+            fontSizes: FontSizes;
+        }
+        export type setFontSizesReturnValue = {
+        }
+        /**
+         * Sets given markup as the document's HTML.
+         */
+        export type setDocumentContentParameters = {
+            /**
+             * Frame id to set HTML for.
+             */
+            frameId: FrameId;
+            /**
+             * HTML content to set.
+             */
+            html: string;
+        }
+        export type setDocumentContentReturnValue = {
+        }
+        /**
+         * Set the behavior when downloading a file.
+         */
+        export type setDownloadBehaviorParameters = {
+            /**
+             * Whether to allow all or deny all download requests, or use default Chrome behavior if
+available (otherwise deny).
+             */
+            behavior: "deny"|"allow"|"default";
+            /**
+             * The default path to save downloaded files to. This is requred if behavior is set to 'allow'
+             */
+            downloadPath?: string;
+        }
+        export type setDownloadBehaviorReturnValue = {
+        }
+        /**
+         * Overrides the Geolocation Position or Error. Omitting any of the parameters emulates position
+unavailable.
+         */
+        export type setGeolocationOverrideParameters = {
+            /**
+             * Mock latitude
+             */
+            latitude?: number;
+            /**
+             * Mock longitude
+             */
+            longitude?: number;
+            /**
+             * Mock accuracy
+             */
+            accuracy?: number;
+        }
+        export type setGeolocationOverrideReturnValue = {
+        }
+        /**
+         * Controls whether page will emit lifecycle events.
+         */
+        export type setLifecycleEventsEnabledParameters = {
+            /**
+             * If true, starts emitting lifecycle events.
+             */
+            enabled: boolean;
+        }
+        export type setLifecycleEventsEnabledReturnValue = {
+        }
+        /**
+         * Toggles mouse event-based touch event emulation.
+         */
+        export type setTouchEmulationEnabledParameters = {
+            /**
+             * Whether the touch event emulation should be enabled.
+             */
+            enabled: boolean;
+            /**
+             * Touch/gesture events configuration. Default: current platform.
+             */
+            configuration?: "mobile"|"desktop";
+        }
+        export type setTouchEmulationEnabledReturnValue = {
+        }
+        /**
+         * Starts sending each frame using the `screencastFrame` event.
+         */
+        export type startScreencastParameters = {
+            /**
+             * Image compression format.
+             */
+            format?: "jpeg"|"png";
+            /**
+             * Compression quality from range [0..100].
+             */
+            quality?: number;
+            /**
+             * Maximum screenshot width.
+             */
+            maxWidth?: number;
+            /**
+             * Maximum screenshot height.
+             */
+            maxHeight?: number;
+            /**
+             * Send every n-th frame.
+             */
+            everyNthFrame?: number;
+        }
+        export type startScreencastReturnValue = {
+        }
+        /**
+         * Force the page stop all navigations and pending resource fetches.
+         */
+        export type stopLoadingParameters = {
+        }
+        export type stopLoadingReturnValue = {
+        }
+        /**
+         * Crashes renderer on the IO thread, generates minidumps.
+         */
+        export type crashParameters = {
+        }
+        export type crashReturnValue = {
+        }
+        /**
+         * Tries to close page, running its beforeunload hooks, if any.
+         */
+        export type closeParameters = {
+        }
+        export type closeReturnValue = {
+        }
+        /**
+         * Tries to update the web lifecycle state of the page.
+It will transition the page to the given state according to:
+https://github.com/WICG/web-lifecycle/
+         */
+        export type setWebLifecycleStateParameters = {
+            /**
+             * Target lifecycle state
+             */
+            state: "frozen"|"active";
+        }
+        export type setWebLifecycleStateReturnValue = {
+        }
+        /**
+         * Stops sending each frame in the `screencastFrame`.
+         */
+        export type stopScreencastParameters = {
+        }
+        export type stopScreencastReturnValue = {
+        }
+        /**
+         * Forces compilation cache to be generated for every subresource script.
+         */
+        export type setProduceCompilationCacheParameters = {
+            enabled: boolean;
+        }
+        export type setProduceCompilationCacheReturnValue = {
+        }
+        /**
+         * Seeds compilation cache for given url. Compilation cache does not survive
+cross-process navigation.
+         */
+        export type addCompilationCacheParameters = {
+            url: string;
+            /**
+             * Base64-encoded data
+             */
+            data: binary;
+        }
+        export type addCompilationCacheReturnValue = {
+        }
+        /**
+         * Clears seeded compilation cache.
+         */
+        export type clearCompilationCacheParameters = {
+        }
+        export type clearCompilationCacheReturnValue = {
+        }
+        /**
+         * Generates a report for testing.
+         */
+        export type generateTestReportParameters = {
+            /**
+             * Message to be displayed in the report.
+             */
+            message: string;
+            /**
+             * Specifies the endpoint group to deliver the report to.
+             */
+            group?: string;
+        }
+        export type generateTestReportReturnValue = {
+        }
+        /**
+         * Pauses page execution. Can be resumed using generic Runtime.runIfWaitingForDebugger.
+         */
+        export type waitForDebuggerParameters = {
+        }
+        export type waitForDebuggerReturnValue = {
+        }
+        /**
+         * Intercept file chooser requests and transfer control to protocol clients.
+When file chooser interception is enabled, native file chooser dialog is not shown.
+Instead, a protocol event `Page.fileChooserOpened` is emitted.
+         */
+        export type setInterceptFileChooserDialogParameters = {
+            enabled: boolean;
+        }
+        export type setInterceptFileChooserDialogReturnValue = {
+        }
+    }
+    
+    export module Performance {
+        /**
+         * Run-time execution metric.
+         */
+        export interface Metric {
+            /**
+             * Metric name.
+             */
+            name: string;
+            /**
+             * Metric value.
+             */
+            value: number;
+        }
+        
+        /**
+         * Current values of the metrics.
+         */
+        export type metricsPayload = {
+            /**
+             * Current values of the metrics.
+             */
+            metrics: Metric[];
+            /**
+             * Timestamp title.
+             */
+            title: string;
+        }
+        
+        /**
+         * Disable collecting and reporting metrics.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enable collecting and reporting metrics.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Sets time domain to use for collecting and reporting duration metrics.
+Note that this must be called before enabling metrics collection. Calling
+this method while metrics collection is enabled returns an error.
+         */
+        export type setTimeDomainParameters = {
+            /**
+             * Time domain
+             */
+            timeDomain: "timeTicks"|"threadTicks";
+        }
+        export type setTimeDomainReturnValue = {
+        }
+        /**
+         * Retrieve current values of run-time metrics.
+         */
+        export type getMetricsParameters = {
+        }
+        export type getMetricsReturnValue = {
+            /**
+             * Current values for run-time metrics.
+             */
+            metrics: Metric[];
+        }
+    }
+    
+    /**
+     * Security
+     */
+    export module Security {
+        /**
+         * An internal certificate ID value.
+         */
+        export type CertificateId = number;
+        /**
+         * A description of mixed content (HTTP resources on HTTPS pages), as defined by
+https://www.w3.org/TR/mixed-content/#categories
+         */
+        export type MixedContentType = "blockable"|"optionally-blockable"|"none";
+        /**
+         * The security level of a page or resource.
+         */
+        export type SecurityState = "unknown"|"neutral"|"insecure"|"secure"|"info"|"insecure-broken";
+        /**
+         * Details about the security state of the page certificate.
+         */
+        export interface CertificateSecurityState {
+            /**
+             * Protocol name (e.g. "TLS 1.2" or "QUIC").
+             */
+            protocol: string;
+            /**
+             * Key Exchange used by the connection, or the empty string if not applicable.
+             */
+            keyExchange: string;
+            /**
+             * (EC)DH group used by the connection, if applicable.
+             */
+            keyExchangeGroup?: string;
+            /**
+             * Cipher name.
+             */
+            cipher: string;
+            /**
+             * TLS MAC. Note that AEAD ciphers do not have separate MACs.
+             */
+            mac?: string;
+            /**
+             * Page certificate.
+             */
+            certificate: string[];
+            /**
+             * Certificate subject name.
+             */
+            subjectName: string;
+            /**
+             * Name of the issuing CA.
+             */
+            issuer: string;
+            /**
+             * Certificate valid from date.
+             */
+            validFrom: Network.TimeSinceEpoch;
+            /**
+             * Certificate valid to (expiration) date
+             */
+            validTo: Network.TimeSinceEpoch;
+            /**
+             * The highest priority network error code, if the certificate has an error.
+             */
+            certificateNetworkError?: string;
+            /**
+             * True if the certificate uses a weak signature aglorithm.
+             */
+            certificateHasWeakSignature: boolean;
+            /**
+             * True if the certificate has a SHA1 signature in the chain.
+             */
+            certificateHasSha1Signature: boolean;
+            /**
+             * True if modern SSL
+             */
+            modernSSL: boolean;
+            /**
+             * True if the connection is using an obsolete SSL protocol.
+             */
+            obsoleteSslProtocol: boolean;
+            /**
+             * True if the connection is using an obsolete SSL key exchange.
+             */
+            obsoleteSslKeyExchange: boolean;
+            /**
+             * True if the connection is using an obsolete SSL cipher.
+             */
+            obsoleteSslCipher: boolean;
+            /**
+             * True if the connection is using an obsolete SSL signature.
+             */
+            obsoleteSslSignature: boolean;
+        }
+        export type SafetyTipStatus = "badReputation"|"lookalike";
+        export interface SafetyTipInfo {
+            /**
+             * Describes whether the page triggers any safety tips or reputation warnings. Default is unknown.
+             */
+            safetyTipStatus: SafetyTipStatus;
+            /**
+             * The URL the safety tip suggested ("Did you mean?"). Only filled in for lookalike matches.
+             */
+            safeUrl?: string;
+        }
+        /**
+         * Security state information about the page.
+         */
+        export interface VisibleSecurityState {
+            /**
+             * The security level of the page.
+             */
+            securityState: SecurityState;
+            /**
+             * Security state details about the page certificate.
+             */
+            certificateSecurityState?: CertificateSecurityState;
+            /**
+             * The type of Safety Tip triggered on the page. Note that this field will be set even if the Safety Tip UI was not actually shown.
+             */
+            safetyTipInfo?: SafetyTipInfo;
+            /**
+             * Array of security state issues ids.
+             */
+            securityStateIssueIds: string[];
+        }
+        /**
+         * An explanation of an factor contributing to the security state.
+         */
+        export interface SecurityStateExplanation {
+            /**
+             * Security state representing the severity of the factor being explained.
+             */
+            securityState: SecurityState;
+            /**
+             * Title describing the type of factor.
+             */
+            title: string;
+            /**
+             * Short phrase describing the type of factor.
+             */
+            summary: string;
+            /**
+             * Full text explanation of the factor.
+             */
+            description: string;
+            /**
+             * The type of mixed content described by the explanation.
+             */
+            mixedContentType: MixedContentType;
+            /**
+             * Page certificate.
+             */
+            certificate: string[];
+            /**
+             * Recommendations to fix any issues.
+             */
+            recommendations?: string[];
+        }
+        /**
+         * Information about insecure content on the page.
+         */
+        export interface InsecureContentStatus {
+            /**
+             * Always false.
+             */
+            ranMixedContent: boolean;
+            /**
+             * Always false.
+             */
+            displayedMixedContent: boolean;
+            /**
+             * Always false.
+             */
+            containedMixedForm: boolean;
+            /**
+             * Always false.
+             */
+            ranContentWithCertErrors: boolean;
+            /**
+             * Always false.
+             */
+            displayedContentWithCertErrors: boolean;
+            /**
+             * Always set to unknown.
+             */
+            ranInsecureContentStyle: SecurityState;
+            /**
+             * Always set to unknown.
+             */
+            displayedInsecureContentStyle: SecurityState;
+        }
+        /**
+         * The action to take when a certificate error occurs. continue will continue processing the
+request and cancel will cancel the request.
+         */
+        export type CertificateErrorAction = "continue"|"cancel";
+        
+        /**
+         * There is a certificate error. If overriding certificate errors is enabled, then it should be
+handled with the `handleCertificateError` command. Note: this event does not fire if the
+certificate error has been allowed internally. Only one client per target should override
+certificate errors at the same time.
+         */
+        export type certificateErrorPayload = {
+            /**
+             * The ID of the event.
+             */
+            eventId: number;
+            /**
+             * The type of the error.
+             */
+            errorType: string;
+            /**
+             * The url that was requested.
+             */
+            requestURL: string;
+        }
+        /**
+         * The security state of the page changed.
+         */
+        export type visibleSecurityStateChangedPayload = {
+            /**
+             * Security state information about the page.
+             */
+            visibleSecurityState: VisibleSecurityState;
+        }
+        /**
+         * The security state of the page changed.
+         */
+        export type securityStateChangedPayload = {
+            /**
+             * Security state.
+             */
+            securityState: SecurityState;
+            /**
+             * True if the page was loaded over cryptographic transport such as HTTPS.
+             */
+            schemeIsCryptographic: boolean;
+            /**
+             * List of explanations for the security state. If the overall security state is `insecure` or
+`warning`, at least one corresponding explanation should be included.
+             */
+            explanations: SecurityStateExplanation[];
+            /**
+             * Information about insecure content on the page.
+             */
+            insecureContentStatus: InsecureContentStatus;
+            /**
+             * Overrides user-visible description of the state.
+             */
+            summary?: string;
+        }
+        
+        /**
+         * Disables tracking security state changes.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables tracking security state changes.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Enable/disable whether all certificate errors should be ignored.
+         */
+        export type setIgnoreCertificateErrorsParameters = {
+            /**
+             * If true, all certificate errors will be ignored.
+             */
+            ignore: boolean;
+        }
+        export type setIgnoreCertificateErrorsReturnValue = {
+        }
+        /**
+         * Handles a certificate error that fired a certificateError event.
+         */
+        export type handleCertificateErrorParameters = {
+            /**
+             * The ID of the event.
+             */
+            eventId: number;
+            /**
+             * The action to take on the certificate error.
+             */
+            action: CertificateErrorAction;
+        }
+        export type handleCertificateErrorReturnValue = {
+        }
+        /**
+         * Enable/disable overriding certificate errors. If enabled, all certificate error events need to
+be handled by the DevTools client and should be answered with `handleCertificateError` commands.
+         */
+        export type setOverrideCertificateErrorsParameters = {
+            /**
+             * If true, certificate errors will be overridden.
+             */
+            override: boolean;
+        }
+        export type setOverrideCertificateErrorsReturnValue = {
+        }
+    }
+    
+    export module ServiceWorker {
+        export type RegistrationID = string;
+        /**
+         * ServiceWorker registration.
+         */
+        export interface ServiceWorkerRegistration {
+            registrationId: RegistrationID;
+            scopeURL: string;
+            isDeleted: boolean;
+        }
+        export type ServiceWorkerVersionRunningStatus = "stopped"|"starting"|"running"|"stopping";
+        export type ServiceWorkerVersionStatus = "new"|"installing"|"installed"|"activating"|"activated"|"redundant";
+        /**
+         * ServiceWorker version.
+         */
+        export interface ServiceWorkerVersion {
+            versionId: string;
+            registrationId: RegistrationID;
+            scriptURL: string;
+            runningStatus: ServiceWorkerVersionRunningStatus;
+            status: ServiceWorkerVersionStatus;
+            /**
+             * The Last-Modified header value of the main script.
+             */
+            scriptLastModified?: number;
+            /**
+             * The time at which the response headers of the main script were received from the server.
+For cached script it is the last time the cache entry was validated.
+             */
+            scriptResponseTime?: number;
+            controlledClients?: Target.TargetID[];
+            targetId?: Target.TargetID;
+        }
+        /**
+         * ServiceWorker error message.
+         */
+        export interface ServiceWorkerErrorMessage {
+            errorMessage: string;
+            registrationId: RegistrationID;
+            versionId: string;
+            sourceURL: string;
+            lineNumber: number;
+            columnNumber: number;
+        }
+        
+        export type workerErrorReportedPayload = {
+            errorMessage: ServiceWorkerErrorMessage;
+        }
+        export type workerRegistrationUpdatedPayload = {
+            registrations: ServiceWorkerRegistration[];
+        }
+        export type workerVersionUpdatedPayload = {
+            versions: ServiceWorkerVersion[];
+        }
+        
+        export type deliverPushMessageParameters = {
+            origin: string;
+            registrationId: RegistrationID;
+            data: string;
+        }
+        export type deliverPushMessageReturnValue = {
+        }
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        export type dispatchSyncEventParameters = {
+            origin: string;
+            registrationId: RegistrationID;
+            tag: string;
+            lastChance: boolean;
+        }
+        export type dispatchSyncEventReturnValue = {
+        }
+        export type dispatchPeriodicSyncEventParameters = {
+            origin: string;
+            registrationId: RegistrationID;
+            tag: string;
+        }
+        export type dispatchPeriodicSyncEventReturnValue = {
+        }
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        export type inspectWorkerParameters = {
+            versionId: string;
+        }
+        export type inspectWorkerReturnValue = {
+        }
+        export type setForceUpdateOnPageLoadParameters = {
+            forceUpdateOnPageLoad: boolean;
+        }
+        export type setForceUpdateOnPageLoadReturnValue = {
+        }
+        export type skipWaitingParameters = {
+            scopeURL: string;
+        }
+        export type skipWaitingReturnValue = {
+        }
+        export type startWorkerParameters = {
+            scopeURL: string;
+        }
+        export type startWorkerReturnValue = {
+        }
+        export type stopAllWorkersParameters = {
+        }
+        export type stopAllWorkersReturnValue = {
+        }
+        export type stopWorkerParameters = {
+            versionId: string;
+        }
+        export type stopWorkerReturnValue = {
+        }
+        export type unregisterParameters = {
+            scopeURL: string;
+        }
+        export type unregisterReturnValue = {
+        }
+        export type updateRegistrationParameters = {
+            scopeURL: string;
+        }
+        export type updateRegistrationReturnValue = {
+        }
+    }
+    
+    export module Storage {
+        /**
+         * Enum of possible storage types.
+         */
+        export type StorageType = "appcache"|"cookies"|"file_systems"|"indexeddb"|"local_storage"|"shader_cache"|"websql"|"service_workers"|"cache_storage"|"all"|"other";
+        /**
+         * Usage for a storage type.
+         */
+        export interface UsageForType {
+            /**
+             * Name of storage type.
+             */
+            storageType: StorageType;
+            /**
+             * Storage usage (bytes).
+             */
+            usage: number;
+        }
+        
+        /**
+         * A cache's contents have been modified.
+         */
+        export type cacheStorageContentUpdatedPayload = {
+            /**
+             * Origin to update.
+             */
+            origin: string;
+            /**
+             * Name of cache in origin.
+             */
+            cacheName: string;
+        }
+        /**
+         * A cache has been added/deleted.
+         */
+        export type cacheStorageListUpdatedPayload = {
+            /**
+             * Origin to update.
+             */
+            origin: string;
+        }
+        /**
+         * The origin's IndexedDB object store has been modified.
+         */
+        export type indexedDBContentUpdatedPayload = {
+            /**
+             * Origin to update.
+             */
+            origin: string;
+            /**
+             * Database to update.
+             */
+            databaseName: string;
+            /**
+             * ObjectStore to update.
+             */
+            objectStoreName: string;
+        }
+        /**
+         * The origin's IndexedDB database list has been modified.
+         */
+        export type indexedDBListUpdatedPayload = {
+            /**
+             * Origin to update.
+             */
+            origin: string;
+        }
+        
+        /**
+         * Clears storage for origin.
+         */
+        export type clearDataForOriginParameters = {
+            /**
+             * Security origin.
+             */
+            origin: string;
+            /**
+             * Comma separated list of StorageType to clear.
+             */
+            storageTypes: string;
+        }
+        export type clearDataForOriginReturnValue = {
+        }
+        /**
+         * Returns all browser cookies.
+         */
+        export type getCookiesParameters = {
+            /**
+             * Browser context to use when called on the browser endpoint.
+             */
+            browserContextId?: Browser.BrowserContextID;
+        }
+        export type getCookiesReturnValue = {
+            /**
+             * Array of cookie objects.
+             */
+            cookies: Network.Cookie[];
+        }
+        /**
+         * Sets given cookies.
+         */
+        export type setCookiesParameters = {
+            /**
+             * Cookies to be set.
+             */
+            cookies: Network.CookieParam[];
+            /**
+             * Browser context to use when called on the browser endpoint.
+             */
+            browserContextId?: Browser.BrowserContextID;
+        }
+        export type setCookiesReturnValue = {
+        }
+        /**
+         * Clears cookies.
+         */
+        export type clearCookiesParameters = {
+            /**
+             * Browser context to use when called on the browser endpoint.
+             */
+            browserContextId?: Browser.BrowserContextID;
+        }
+        export type clearCookiesReturnValue = {
+        }
+        /**
+         * Returns usage and quota in bytes.
+         */
+        export type getUsageAndQuotaParameters = {
+            /**
+             * Security origin.
+             */
+            origin: string;
+        }
+        export type getUsageAndQuotaReturnValue = {
+            /**
+             * Storage usage (bytes).
+             */
+            usage: number;
+            /**
+             * Storage quota (bytes).
+             */
+            quota: number;
+            /**
+             * Storage usage per type (bytes).
+             */
+            usageBreakdown: UsageForType[];
+        }
+        /**
+         * Registers origin to be notified when an update occurs to its cache storage list.
+         */
+        export type trackCacheStorageForOriginParameters = {
+            /**
+             * Security origin.
+             */
+            origin: string;
+        }
+        export type trackCacheStorageForOriginReturnValue = {
+        }
+        /**
+         * Registers origin to be notified when an update occurs to its IndexedDB.
+         */
+        export type trackIndexedDBForOriginParameters = {
+            /**
+             * Security origin.
+             */
+            origin: string;
+        }
+        export type trackIndexedDBForOriginReturnValue = {
+        }
+        /**
+         * Unregisters origin from receiving notifications for cache storage.
+         */
+        export type untrackCacheStorageForOriginParameters = {
+            /**
+             * Security origin.
+             */
+            origin: string;
+        }
+        export type untrackCacheStorageForOriginReturnValue = {
+        }
+        /**
+         * Unregisters origin from receiving notifications for IndexedDB.
+         */
+        export type untrackIndexedDBForOriginParameters = {
+            /**
+             * Security origin.
+             */
+            origin: string;
+        }
+        export type untrackIndexedDBForOriginReturnValue = {
+        }
+    }
+    
+    /**
+     * The SystemInfo domain defines methods and events for querying low-level system information.
+     */
+    export module SystemInfo {
+        /**
+         * Describes a single graphics processor (GPU).
+         */
+        export interface GPUDevice {
+            /**
+             * PCI ID of the GPU vendor, if available; 0 otherwise.
+             */
+            vendorId: number;
+            /**
+             * PCI ID of the GPU device, if available; 0 otherwise.
+             */
+            deviceId: number;
+            /**
+             * Sub sys ID of the GPU, only available on Windows.
+             */
+            subSysId?: number;
+            /**
+             * Revision of the GPU, only available on Windows.
+             */
+            revision?: number;
+            /**
+             * String description of the GPU vendor, if the PCI ID is not available.
+             */
+            vendorString: string;
+            /**
+             * String description of the GPU device, if the PCI ID is not available.
+             */
+            deviceString: string;
+            /**
+             * String description of the GPU driver vendor.
+             */
+            driverVendor: string;
+            /**
+             * String description of the GPU driver version.
+             */
+            driverVersion: string;
+        }
+        /**
+         * Describes the width and height dimensions of an entity.
+         */
+        export interface Size {
+            /**
+             * Width in pixels.
+             */
+            width: number;
+            /**
+             * Height in pixels.
+             */
+            height: number;
+        }
+        /**
+         * Describes a supported video decoding profile with its associated minimum and
+maximum resolutions.
+         */
+        export interface VideoDecodeAcceleratorCapability {
+            /**
+             * Video codec profile that is supported, e.g. VP9 Profile 2.
+             */
+            profile: string;
+            /**
+             * Maximum video dimensions in pixels supported for this |profile|.
+             */
+            maxResolution: Size;
+            /**
+             * Minimum video dimensions in pixels supported for this |profile|.
+             */
+            minResolution: Size;
+        }
+        /**
+         * Describes a supported video encoding profile with its associated maximum
+resolution and maximum framerate.
+         */
+        export interface VideoEncodeAcceleratorCapability {
+            /**
+             * Video codec profile that is supported, e.g H264 Main.
+             */
+            profile: string;
+            /**
+             * Maximum video dimensions in pixels supported for this |profile|.
+             */
+            maxResolution: Size;
+            /**
+             * Maximum encoding framerate in frames per second supported for this
+|profile|, as fraction's numerator and denominator, e.g. 24/1 fps,
+24000/1001 fps, etc.
+             */
+            maxFramerateNumerator: number;
+            maxFramerateDenominator: number;
+        }
+        /**
+         * YUV subsampling type of the pixels of a given image.
+         */
+        export type SubsamplingFormat = "yuv420"|"yuv422"|"yuv444";
+        /**
+         * Image format of a given image.
+         */
+        export type ImageType = "jpeg"|"webp"|"unknown";
+        /**
+         * Describes a supported image decoding profile with its associated minimum and
+maximum resolutions and subsampling.
+         */
+        export interface ImageDecodeAcceleratorCapability {
+            /**
+             * Image coded, e.g. Jpeg.
+             */
+            imageType: ImageType;
+            /**
+             * Maximum supported dimensions of the image in pixels.
+             */
+            maxDimensions: Size;
+            /**
+             * Minimum supported dimensions of the image in pixels.
+             */
+            minDimensions: Size;
+            /**
+             * Optional array of supported subsampling formats, e.g. 4:2:0, if known.
+             */
+            subsamplings: SubsamplingFormat[];
+        }
+        /**
+         * Provides information about the GPU(s) on the system.
+         */
+        export interface GPUInfo {
+            /**
+             * The graphics devices on the system. Element 0 is the primary GPU.
+             */
+            devices: GPUDevice[];
+            /**
+             * An optional dictionary of additional GPU related attributes.
+             */
+            auxAttributes?: object;
+            /**
+             * An optional dictionary of graphics features and their status.
+             */
+            featureStatus?: object;
+            /**
+             * An optional array of GPU driver bug workarounds.
+             */
+            driverBugWorkarounds: string[];
+            /**
+             * Supported accelerated video decoding capabilities.
+             */
+            videoDecoding: VideoDecodeAcceleratorCapability[];
+            /**
+             * Supported accelerated video encoding capabilities.
+             */
+            videoEncoding: VideoEncodeAcceleratorCapability[];
+            /**
+             * Supported accelerated image decoding capabilities.
+             */
+            imageDecoding: ImageDecodeAcceleratorCapability[];
+        }
+        /**
+         * Represents process info.
+         */
+        export interface ProcessInfo {
+            /**
+             * Specifies process type.
+             */
+            type: string;
+            /**
+             * Specifies process id.
+             */
+            id: number;
+            /**
+             * Specifies cumulative CPU usage in seconds across all threads of the
+process since the process start.
+             */
+            cpuTime: number;
+        }
+        
+        
+        /**
+         * Returns information about the system.
+         */
+        export type getInfoParameters = {
+        }
+        export type getInfoReturnValue = {
+            /**
+             * Information about the GPUs on the system.
+             */
+            gpu: GPUInfo;
+            /**
+             * A platform-dependent description of the model of the machine. On Mac OS, this is, for
+example, 'MacBookPro'. Will be the empty string if not supported.
+             */
+            modelName: string;
+            /**
+             * A platform-dependent description of the version of the machine. On Mac OS, this is, for
+example, '10.1'. Will be the empty string if not supported.
+             */
+            modelVersion: string;
+            /**
+             * The command line string used to launch the browser. Will be the empty string if not
+supported.
+             */
+            commandLine: string;
+        }
+        /**
+         * Returns information about all running processes.
+         */
+        export type getProcessInfoParameters = {
+        }
+        export type getProcessInfoReturnValue = {
+            /**
+             * An array of process info blocks.
+             */
+            processInfo: ProcessInfo[];
+        }
+    }
+    
+    /**
+     * Supports additional targets discovery and allows to attach to them.
+     */
+    export module Target {
+        export type TargetID = string;
+        /**
+         * Unique identifier of attached debugging session.
+         */
+        export type SessionID = string;
+        export interface TargetInfo {
+            targetId: TargetID;
+            type: string;
+            title: string;
+            url: string;
+            /**
+             * Whether the target has an attached client.
+             */
+            attached: boolean;
+            /**
+             * Opener target Id
+             */
+            openerId?: TargetID;
+            browserContextId?: Browser.BrowserContextID;
+        }
+        export interface RemoteLocation {
+            host: string;
+            port: number;
+        }
+        
+        /**
+         * Issued when attached to target because of auto-attach or `attachToTarget` command.
+         */
+        export type attachedToTargetPayload = {
+            /**
+             * Identifier assigned to the session used to send/receive messages.
+             */
+            sessionId: SessionID;
+            targetInfo: TargetInfo;
+            waitingForDebugger: boolean;
+        }
+        /**
+         * Issued when detached from target for any reason (including `detachFromTarget` command). Can be
+issued multiple times per target if multiple sessions have been attached to it.
+         */
+        export type detachedFromTargetPayload = {
+            /**
+             * Detached session identifier.
+             */
+            sessionId: SessionID;
+            /**
+             * Deprecated.
+             */
+            targetId?: TargetID;
+        }
+        /**
+         * Notifies about a new protocol message received from the session (as reported in
+`attachedToTarget` event).
+         */
+        export type receivedMessageFromTargetPayload = {
+            /**
+             * Identifier of a session which sends a message.
+             */
+            sessionId: SessionID;
+            message: string;
+            /**
+             * Deprecated.
+             */
+            targetId?: TargetID;
+        }
+        /**
+         * Issued when a possible inspection target is created.
+         */
+        export type targetCreatedPayload = {
+            targetInfo: TargetInfo;
+        }
+        /**
+         * Issued when a target is destroyed.
+         */
+        export type targetDestroyedPayload = {
+            targetId: TargetID;
+        }
+        /**
+         * Issued when a target has crashed.
+         */
+        export type targetCrashedPayload = {
+            targetId: TargetID;
+            /**
+             * Termination status type.
+             */
+            status: string;
+            /**
+             * Termination error code.
+             */
+            errorCode: number;
+        }
+        /**
+         * Issued when some information about a target has changed. This only happens between
+`targetCreated` and `targetDestroyed`.
+         */
+        export type targetInfoChangedPayload = {
+            targetInfo: TargetInfo;
+        }
+        
+        /**
+         * Activates (focuses) the target.
+         */
+        export type activateTargetParameters = {
+            targetId: TargetID;
+        }
+        export type activateTargetReturnValue = {
+        }
+        /**
+         * Attaches to the target with given id.
+         */
+        export type attachToTargetParameters = {
+            targetId: TargetID;
+            /**
+             * Enables "flat" access to the session via specifying sessionId attribute in the commands.
+We plan to make this the default, deprecate non-flattened mode,
+and eventually retire it. See crbug.com/991325.
+             */
+            flatten?: boolean;
+        }
+        export type attachToTargetReturnValue = {
+            /**
+             * Id assigned to the session.
+             */
+            sessionId: SessionID;
+        }
+        /**
+         * Attaches to the browser target, only uses flat sessionId mode.
+         */
+        export type attachToBrowserTargetParameters = {
+        }
+        export type attachToBrowserTargetReturnValue = {
+            /**
+             * Id assigned to the session.
+             */
+            sessionId: SessionID;
+        }
+        /**
+         * Closes the target. If the target is a page that gets closed too.
+         */
+        export type closeTargetParameters = {
+            targetId: TargetID;
+        }
+        export type closeTargetReturnValue = {
+            success: boolean;
+        }
+        /**
+         * Inject object to the target's main frame that provides a communication
+channel with browser target.
+
+Injected object will be available as `window[bindingName]`.
+
+The object has the follwing API:
+- `binding.send(json)` - a method to send messages over the remote debugging protocol
+- `binding.onmessage = json => handleMessage(json)` - a callback that will be called for the protocol notifications and command responses.
+         */
+        export type exposeDevToolsProtocolParameters = {
+            targetId: TargetID;
+            /**
+             * Binding name, 'cdp' if not specified.
+             */
+            bindingName?: string;
+        }
+        export type exposeDevToolsProtocolReturnValue = {
+        }
+        /**
+         * Creates a new empty BrowserContext. Similar to an incognito profile but you can have more than
+one.
+         */
+        export type createBrowserContextParameters = {
+        }
+        export type createBrowserContextReturnValue = {
+            /**
+             * The id of the context created.
+             */
+            browserContextId: Browser.BrowserContextID;
+        }
+        /**
+         * Returns all browser contexts created with `Target.createBrowserContext` method.
+         */
+        export type getBrowserContextsParameters = {
+        }
+        export type getBrowserContextsReturnValue = {
+            /**
+             * An array of browser context ids.
+             */
+            browserContextIds: Browser.BrowserContextID[];
+        }
+        /**
+         * Creates a new page.
+         */
+        export type createTargetParameters = {
+            /**
+             * The initial URL the page will be navigated to.
+             */
+            url: string;
+            /**
+             * Frame width in DIP (headless chrome only).
+             */
+            width?: number;
+            /**
+             * Frame height in DIP (headless chrome only).
+             */
+            height?: number;
+            /**
+             * The browser context to create the page in.
+             */
+            browserContextId?: Browser.BrowserContextID;
+            /**
+             * Whether BeginFrames for this target will be controlled via DevTools (headless chrome only,
+not supported on MacOS yet, false by default).
+             */
+            enableBeginFrameControl?: boolean;
+            /**
+             * Whether to create a new Window or Tab (chrome-only, false by default).
+             */
+            newWindow?: boolean;
+            /**
+             * Whether to create the target in background or foreground (chrome-only,
+false by default).
+             */
+            background?: boolean;
+        }
+        export type createTargetReturnValue = {
+            /**
+             * The id of the page opened.
+             */
+            targetId: TargetID;
+        }
+        /**
+         * Detaches session with given id.
+         */
+        export type detachFromTargetParameters = {
+            /**
+             * Session to detach.
+             */
+            sessionId?: SessionID;
+            /**
+             * Deprecated.
+             */
+            targetId?: TargetID;
+        }
+        export type detachFromTargetReturnValue = {
+        }
+        /**
+         * Deletes a BrowserContext. All the belonging pages will be closed without calling their
+beforeunload hooks.
+         */
+        export type disposeBrowserContextParameters = {
+            browserContextId: Browser.BrowserContextID;
+        }
+        export type disposeBrowserContextReturnValue = {
+        }
+        /**
+         * Returns information about a target.
+         */
+        export type getTargetInfoParameters = {
+            targetId?: TargetID;
+        }
+        export type getTargetInfoReturnValue = {
+            targetInfo: TargetInfo;
+        }
+        /**
+         * Retrieves a list of available targets.
+         */
+        export type getTargetsParameters = {
+        }
+        export type getTargetsReturnValue = {
+            /**
+             * The list of targets.
+             */
+            targetInfos: TargetInfo[];
+        }
+        /**
+         * Sends protocol message over session with given id.
+Consider using flat mode instead; see commands attachToTarget, setAutoAttach,
+and crbug.com/991325.
+         */
+        export type sendMessageToTargetParameters = {
+            message: string;
+            /**
+             * Identifier of the session.
+             */
+            sessionId?: SessionID;
+            /**
+             * Deprecated.
+             */
+            targetId?: TargetID;
+        }
+        export type sendMessageToTargetReturnValue = {
+        }
+        /**
+         * Controls whether to automatically attach to new targets which are considered to be related to
+this one. When turned on, attaches to all existing related targets as well. When turned off,
+automatically detaches from all currently attached targets.
+         */
+        export type setAutoAttachParameters = {
+            /**
+             * Whether to auto-attach to related targets.
+             */
+            autoAttach: boolean;
+            /**
+             * Whether to pause new targets when attaching to them. Use `Runtime.runIfWaitingForDebugger`
+to run paused targets.
+             */
+            waitForDebuggerOnStart: boolean;
+            /**
+             * Enables "flat" access to the session via specifying sessionId attribute in the commands.
+We plan to make this the default, deprecate non-flattened mode,
+and eventually retire it. See crbug.com/991325.
+             */
+            flatten?: boolean;
+            /**
+             * Auto-attach to the targets created via window.open from current target.
+             */
+            windowOpen?: boolean;
+        }
+        export type setAutoAttachReturnValue = {
+        }
+        /**
+         * Controls whether to discover available targets and notify via
+`targetCreated/targetInfoChanged/targetDestroyed` events.
+         */
+        export type setDiscoverTargetsParameters = {
+            /**
+             * Whether to discover available targets.
+             */
+            discover: boolean;
+        }
+        export type setDiscoverTargetsReturnValue = {
+        }
+        /**
+         * Enables target discovery for the specified locations, when `setDiscoverTargets` was set to
+`true`.
+         */
+        export type setRemoteLocationsParameters = {
+            /**
+             * List of remote locations.
+             */
+            locations: RemoteLocation[];
+        }
+        export type setRemoteLocationsReturnValue = {
+        }
+    }
+    
+    /**
+     * The Tethering domain defines methods and events for browser port binding.
+     */
+    export module Tethering {
+        
+        /**
+         * Informs that port was successfully bound and got a specified connection id.
+         */
+        export type acceptedPayload = {
+            /**
+             * Port number that was successfully bound.
+             */
+            port: number;
+            /**
+             * Connection id to be used.
+             */
+            connectionId: string;
+        }
+        
+        /**
+         * Request browser port binding.
+         */
+        export type bindParameters = {
+            /**
+             * Port number to bind.
+             */
+            port: number;
+        }
+        export type bindReturnValue = {
+        }
+        /**
+         * Request browser port unbinding.
+         */
+        export type unbindParameters = {
+            /**
+             * Port number to unbind.
+             */
+            port: number;
+        }
+        export type unbindReturnValue = {
+        }
+    }
+    
+    export module Tracing {
+        /**
+         * Configuration for memory dump. Used only when "memory-infra" category is enabled.
+         */
+        export type MemoryDumpConfig = object;
+        export interface TraceConfig {
+            /**
+             * Controls how the trace buffer stores data.
+             */
+            recordMode?: "recordUntilFull"|"recordContinuously"|"recordAsMuchAsPossible"|"echoToConsole";
+            /**
+             * Turns on JavaScript stack sampling.
+             */
+            enableSampling?: boolean;
+            /**
+             * Turns on system tracing.
+             */
+            enableSystrace?: boolean;
+            /**
+             * Turns on argument filter.
+             */
+            enableArgumentFilter?: boolean;
+            /**
+             * Included category filters.
+             */
+            includedCategories?: string[];
+            /**
+             * Excluded category filters.
+             */
+            excludedCategories?: string[];
+            /**
+             * Configuration to synthesize the delays in tracing.
+             */
+            syntheticDelays?: string[];
+            /**
+             * Configuration for memory dump triggers. Used only when "memory-infra" category is enabled.
+             */
+            memoryDumpConfig?: MemoryDumpConfig;
+        }
+        /**
+         * Data format of a trace. Can be either the legacy JSON format or the
+protocol buffer format. Note that the JSON format will be deprecated soon.
+         */
+        export type StreamFormat = "json"|"proto";
+        /**
+         * Compression type to use for traces returned via streams.
+         */
+        export type StreamCompression = "none"|"gzip";
+        
+        export type bufferUsagePayload = {
+            /**
+             * A number in range [0..1] that indicates the used size of event buffer as a fraction of its
+total size.
+             */
+            percentFull?: number;
+            /**
+             * An approximate number of events in the trace log.
+             */
+            eventCount?: number;
+            /**
+             * A number in range [0..1] that indicates the used size of event buffer as a fraction of its
+total size.
+             */
+            value?: number;
+        }
+        /**
+         * Contains an bucket of collected trace events. When tracing is stopped collected events will be
+send as a sequence of dataCollected events followed by tracingComplete event.
+         */
+        export type dataCollectedPayload = {
+            value: object[];
+        }
+        /**
+         * Signals that tracing is stopped and there is no trace buffers pending flush, all data were
+delivered via dataCollected events.
+         */
+        export type tracingCompletePayload = {
+            /**
+             * Indicates whether some trace data is known to have been lost, e.g. because the trace ring
+buffer wrapped around.
+             */
+            dataLossOccurred: boolean;
+            /**
+             * A handle of the stream that holds resulting trace data.
+             */
+            stream?: IO.StreamHandle;
+            /**
+             * Trace data format of returned stream.
+             */
+            traceFormat?: StreamFormat;
+            /**
+             * Compression format of returned stream.
+             */
+            streamCompression?: StreamCompression;
+        }
+        
+        /**
+         * Stop trace events collection.
+         */
+        export type endParameters = {
+        }
+        export type endReturnValue = {
+        }
+        /**
+         * Gets supported tracing categories.
+         */
+        export type getCategoriesParameters = {
+        }
+        export type getCategoriesReturnValue = {
+            /**
+             * A list of supported tracing categories.
+             */
+            categories: string[];
+        }
+        /**
+         * Record a clock sync marker in the trace.
+         */
+        export type recordClockSyncMarkerParameters = {
+            /**
+             * The ID of this clock sync marker
+             */
+            syncId: string;
+        }
+        export type recordClockSyncMarkerReturnValue = {
+        }
+        /**
+         * Request a global memory dump.
+         */
+        export type requestMemoryDumpParameters = {
+            /**
+             * Enables more deterministic results by forcing garbage collection
+             */
+            deterministic?: boolean;
+        }
+        export type requestMemoryDumpReturnValue = {
+            /**
+             * GUID of the resulting global memory dump.
+             */
+            dumpGuid: string;
+            /**
+             * True iff the global memory dump succeeded.
+             */
+            success: boolean;
+        }
+        /**
+         * Start trace events collection.
+         */
+        export type startParameters = {
+            /**
+             * Category/tag filter
+             */
+            categories?: string;
+            /**
+             * Tracing options
+             */
+            options?: string;
+            /**
+             * If set, the agent will issue bufferUsage events at this interval, specified in milliseconds
+             */
+            bufferUsageReportingInterval?: number;
+            /**
+             * Whether to report trace events as series of dataCollected events or to save trace to a
+stream (defaults to `ReportEvents`).
+             */
+            transferMode?: "ReportEvents"|"ReturnAsStream";
+            /**
+             * Trace data format to use. This only applies when using `ReturnAsStream`
+transfer mode (defaults to `json`).
+             */
+            streamFormat?: StreamFormat;
+            /**
+             * Compression format to use. This only applies when using `ReturnAsStream`
+transfer mode (defaults to `none`)
+             */
+            streamCompression?: StreamCompression;
+            traceConfig?: TraceConfig;
+        }
+        export type startReturnValue = {
+        }
+    }
+    
+    /**
+     * A domain for letting clients substitute browser's network layer with client code.
+     */
+    export module Fetch {
+        /**
+         * Unique request identifier.
+         */
+        export type RequestId = string;
+        /**
+         * Stages of the request to handle. Request will intercept before the request is
+sent. Response will intercept after the response is received (but before response
+body is received.
+         */
+        export type RequestStage = "Request"|"Response";
+        export interface RequestPattern {
+            /**
+             * Wildcards ('*' -> zero or more, '?' -> exactly one) are allowed. Escape character is
+backslash. Omitting is equivalent to "*".
+             */
+            urlPattern?: string;
+            /**
+             * If set, only requests for matching resource types will be intercepted.
+             */
+            resourceType?: Network.ResourceType;
+            /**
+             * Stage at wich to begin intercepting requests. Default is Request.
+             */
+            requestStage?: RequestStage;
+        }
+        /**
+         * Response HTTP header entry
+         */
+        export interface HeaderEntry {
+            name: string;
+            value: string;
+        }
+        /**
+         * Authorization challenge for HTTP status code 401 or 407.
+         */
+        export interface AuthChallenge {
+            /**
+             * Source of the authentication challenge.
+             */
+            source?: "Server"|"Proxy";
+            /**
+             * Origin of the challenger.
+             */
+            origin: string;
+            /**
+             * The authentication scheme used, such as basic or digest
+             */
+            scheme: string;
+            /**
+             * The realm of the challenge. May be empty.
+             */
+            realm: string;
+        }
+        /**
+         * Response to an AuthChallenge.
+         */
+        export interface AuthChallengeResponse {
+            /**
+             * The decision on what to do in response to the authorization challenge.  Default means
+deferring to the default behavior of the net stack, which will likely either the Cancel
+authentication or display a popup dialog box.
+             */
+            response: "Default"|"CancelAuth"|"ProvideCredentials";
+            /**
+             * The username to provide, possibly empty. Should only be set if response is
+ProvideCredentials.
+             */
+            username?: string;
+            /**
+             * The password to provide, possibly empty. Should only be set if response is
+ProvideCredentials.
+             */
+            password?: string;
+        }
+        
+        /**
+         * Issued when the domain is enabled and the request URL matches the
+specified filter. The request is paused until the client responds
+with one of continueRequest, failRequest or fulfillRequest.
+The stage of the request can be determined by presence of responseErrorReason
+and responseStatusCode -- the request is at the response stage if either
+of these fields is present and in the request stage otherwise.
+         */
+        export type requestPausedPayload = {
+            /**
+             * Each request the page makes will have a unique id.
+             */
+            requestId: RequestId;
+            /**
+             * The details of the request.
+             */
+            request: Network.Request;
+            /**
+             * The id of the frame that initiated the request.
+             */
+            frameId: Page.FrameId;
+            /**
+             * How the requested resource will be used.
+             */
+            resourceType: Network.ResourceType;
+            /**
+             * Response error if intercepted at response stage.
+             */
+            responseErrorReason?: Network.ErrorReason;
+            /**
+             * Response code if intercepted at response stage.
+             */
+            responseStatusCode?: number;
+            /**
+             * Response headers if intercepted at the response stage.
+             */
+            responseHeaders?: HeaderEntry[];
+            /**
+             * If the intercepted request had a corresponding Network.requestWillBeSent event fired for it,
+then this networkId will be the same as the requestId present in the requestWillBeSent event.
+             */
+            networkId?: RequestId;
+        }
+        /**
+         * Issued when the domain is enabled with handleAuthRequests set to true.
+The request is paused until client responds with continueWithAuth.
+         */
+        export type authRequiredPayload = {
+            /**
+             * Each request the page makes will have a unique id.
+             */
+            requestId: RequestId;
+            /**
+             * The details of the request.
+             */
+            request: Network.Request;
+            /**
+             * The id of the frame that initiated the request.
+             */
+            frameId: Page.FrameId;
+            /**
+             * How the requested resource will be used.
+             */
+            resourceType: Network.ResourceType;
+            /**
+             * Details of the Authorization Challenge encountered.
+If this is set, client should respond with continueRequest that
+contains AuthChallengeResponse.
+             */
+            authChallenge: AuthChallenge;
+        }
+        
+        /**
+         * Disables the fetch domain.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables issuing of requestPaused events. A request will be paused until client
+calls one of failRequest, fulfillRequest or continueRequest/continueWithAuth.
+         */
+        export type enableParameters = {
+            /**
+             * If specified, only requests matching any of these patterns will produce
+fetchRequested event and will be paused until clients response. If not set,
+all requests will be affected.
+             */
+            patterns?: RequestPattern[];
+            /**
+             * If true, authRequired events will be issued and requests will be paused
+expecting a call to continueWithAuth.
+             */
+            handleAuthRequests?: boolean;
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Causes the request to fail with specified reason.
+         */
+        export type failRequestParameters = {
+            /**
+             * An id the client received in requestPaused event.
+             */
+            requestId: RequestId;
+            /**
+             * Causes the request to fail with the given reason.
+             */
+            errorReason: Network.ErrorReason;
+        }
+        export type failRequestReturnValue = {
+        }
+        /**
+         * Provides response to the request.
+         */
+        export type fulfillRequestParameters = {
+            /**
+             * An id the client received in requestPaused event.
+             */
+            requestId: RequestId;
+            /**
+             * An HTTP response code.
+             */
+            responseCode: number;
+            /**
+             * Response headers.
+             */
+            responseHeaders?: HeaderEntry[];
+            /**
+             * Alternative way of specifying response headers as a \0-separated
+series of name: value pairs. Prefer the above method unless you
+need to represent some non-UTF8 values that can't be transmitted
+over the protocol as text.
+             */
+            binaryResponseHeaders?: binary;
+            /**
+             * A response body.
+             */
+            body?: binary;
+            /**
+             * A textual representation of responseCode.
+If absent, a standard phrase matching responseCode is used.
+             */
+            responsePhrase?: string;
+        }
+        export type fulfillRequestReturnValue = {
+        }
+        /**
+         * Continues the request, optionally modifying some of its parameters.
+         */
+        export type continueRequestParameters = {
+            /**
+             * An id the client received in requestPaused event.
+             */
+            requestId: RequestId;
+            /**
+             * If set, the request url will be modified in a way that's not observable by page.
+             */
+            url?: string;
+            /**
+             * If set, the request method is overridden.
+             */
+            method?: string;
+            /**
+             * If set, overrides the post data in the request.
+             */
+            postData?: string;
+            /**
+             * If set, overrides the request headrts.
+             */
+            headers?: HeaderEntry[];
+        }
+        export type continueRequestReturnValue = {
+        }
+        /**
+         * Continues a request supplying authChallengeResponse following authRequired event.
+         */
+        export type continueWithAuthParameters = {
+            /**
+             * An id the client received in authRequired event.
+             */
+            requestId: RequestId;
+            /**
+             * Response to  with an authChallenge.
+             */
+            authChallengeResponse: AuthChallengeResponse;
+        }
+        export type continueWithAuthReturnValue = {
+        }
+        /**
+         * Causes the body of the response to be received from the server and
+returned as a single string. May only be issued for a request that
+is paused in the Response stage and is mutually exclusive with
+takeResponseBodyForInterceptionAsStream. Calling other methods that
+affect the request or disabling fetch domain before body is received
+results in an undefined behavior.
+         */
+        export type getResponseBodyParameters = {
+            /**
+             * Identifier for the intercepted request to get body for.
+             */
+            requestId: RequestId;
+        }
+        export type getResponseBodyReturnValue = {
+            /**
+             * Response body.
+             */
+            body: string;
+            /**
+             * True, if content was sent as base64.
+             */
+            base64Encoded: boolean;
+        }
+        /**
+         * Returns a handle to the stream representing the response body.
+The request must be paused in the HeadersReceived stage.
+Note that after this command the request can't be continued
+as is -- client either needs to cancel it or to provide the
+response body.
+The stream only supports sequential read, IO.read will fail if the position
+is specified.
+This method is mutually exclusive with getResponseBody.
+Calling other methods that affect the request or disabling fetch
+domain before body is received results in an undefined behavior.
+         */
+        export type takeResponseBodyAsStreamParameters = {
+            requestId: RequestId;
+        }
+        export type takeResponseBodyAsStreamReturnValue = {
+            stream: IO.StreamHandle;
+        }
+    }
+    
+    /**
+     * This domain allows inspection of Web Audio API.
+https://webaudio.github.io/web-audio-api/
+     */
+    export module WebAudio {
+        /**
+         * An unique ID for a graph object (AudioContext, AudioNode, AudioParam) in Web Audio API
+         */
+        export type GraphObjectId = string;
+        /**
+         * Enum of BaseAudioContext types
+         */
+        export type ContextType = "realtime"|"offline";
+        /**
+         * Enum of AudioContextState from the spec
+         */
+        export type ContextState = "suspended"|"running"|"closed";
+        /**
+         * Enum of AudioNode types
+         */
+        export type NodeType = string;
+        /**
+         * Enum of AudioNode::ChannelCountMode from the spec
+         */
+        export type ChannelCountMode = "clamped-max"|"explicit"|"max";
+        /**
+         * Enum of AudioNode::ChannelInterpretation from the spec
+         */
+        export type ChannelInterpretation = "discrete"|"speakers";
+        /**
+         * Enum of AudioParam types
+         */
+        export type ParamType = string;
+        /**
+         * Enum of AudioParam::AutomationRate from the spec
+         */
+        export type AutomationRate = "a-rate"|"k-rate";
+        /**
+         * Fields in AudioContext that change in real-time.
+         */
+        export interface ContextRealtimeData {
+            /**
+             * The current context time in second in BaseAudioContext.
+             */
+            currentTime: number;
+            /**
+             * The time spent on rendering graph divided by render qunatum duration,
+and multiplied by 100. 100 means the audio renderer reached the full
+capacity and glitch may occur.
+             */
+            renderCapacity: number;
+            /**
+             * A running mean of callback interval.
+             */
+            callbackIntervalMean: number;
+            /**
+             * A running variance of callback interval.
+             */
+            callbackIntervalVariance: number;
+        }
+        /**
+         * Protocol object for BaseAudioContext
+         */
+        export interface BaseAudioContext {
+            contextId: GraphObjectId;
+            contextType: ContextType;
+            contextState: ContextState;
+            realtimeData?: ContextRealtimeData;
+            /**
+             * Platform-dependent callback buffer size.
+             */
+            callbackBufferSize: number;
+            /**
+             * Number of output channels supported by audio hardware in use.
+             */
+            maxOutputChannelCount: number;
+            /**
+             * Context sample rate.
+             */
+            sampleRate: number;
+        }
+        /**
+         * Protocol object for AudioListner
+         */
+        export interface AudioListener {
+            listenerId: GraphObjectId;
+            contextId: GraphObjectId;
+        }
+        /**
+         * Protocol object for AudioNode
+         */
+        export interface AudioNode {
+            nodeId: GraphObjectId;
+            contextId: GraphObjectId;
+            nodeType: NodeType;
+            numberOfInputs: number;
+            numberOfOutputs: number;
+            channelCount: number;
+            channelCountMode: ChannelCountMode;
+            channelInterpretation: ChannelInterpretation;
+        }
+        /**
+         * Protocol object for AudioParam
+         */
+        export interface AudioParam {
+            paramId: GraphObjectId;
+            nodeId: GraphObjectId;
+            contextId: GraphObjectId;
+            paramType: ParamType;
+            rate: AutomationRate;
+            defaultValue: number;
+            minValue: number;
+            maxValue: number;
+        }
+        
+        /**
+         * Notifies that a new BaseAudioContext has been created.
+         */
+        export type contextCreatedPayload = {
+            context: BaseAudioContext;
+        }
+        /**
+         * Notifies that an existing BaseAudioContext will be destroyed.
+         */
+        export type contextWillBeDestroyedPayload = {
+            contextId: GraphObjectId;
+        }
+        /**
+         * Notifies that existing BaseAudioContext has changed some properties (id stays the same)..
+         */
+        export type contextChangedPayload = {
+            context: BaseAudioContext;
+        }
+        /**
+         * Notifies that the construction of an AudioListener has finished.
+         */
+        export type audioListenerCreatedPayload = {
+            listener: AudioListener;
+        }
+        /**
+         * Notifies that a new AudioListener has been created.
+         */
+        export type audioListenerWillBeDestroyedPayload = {
+            contextId: GraphObjectId;
+            listenerId: GraphObjectId;
+        }
+        /**
+         * Notifies that a new AudioNode has been created.
+         */
+        export type audioNodeCreatedPayload = {
+            node: AudioNode;
+        }
+        /**
+         * Notifies that an existing AudioNode has been destroyed.
+         */
+        export type audioNodeWillBeDestroyedPayload = {
+            contextId: GraphObjectId;
+            nodeId: GraphObjectId;
+        }
+        /**
+         * Notifies that a new AudioParam has been created.
+         */
+        export type audioParamCreatedPayload = {
+            param: AudioParam;
+        }
+        /**
+         * Notifies that an existing AudioParam has been destroyed.
+         */
+        export type audioParamWillBeDestroyedPayload = {
+            contextId: GraphObjectId;
+            nodeId: GraphObjectId;
+            paramId: GraphObjectId;
+        }
+        /**
+         * Notifies that two AudioNodes are connected.
+         */
+        export type nodesConnectedPayload = {
+            contextId: GraphObjectId;
+            sourceId: GraphObjectId;
+            destinationId: GraphObjectId;
+            sourceOutputIndex?: number;
+            destinationInputIndex?: number;
+        }
+        /**
+         * Notifies that AudioNodes are disconnected. The destination can be null, and it means all the outgoing connections from the source are disconnected.
+         */
+        export type nodesDisconnectedPayload = {
+            contextId: GraphObjectId;
+            sourceId: GraphObjectId;
+            destinationId: GraphObjectId;
+            sourceOutputIndex?: number;
+            destinationInputIndex?: number;
+        }
+        /**
+         * Notifies that an AudioNode is connected to an AudioParam.
+         */
+        export type nodeParamConnectedPayload = {
+            contextId: GraphObjectId;
+            sourceId: GraphObjectId;
+            destinationId: GraphObjectId;
+            sourceOutputIndex?: number;
+        }
+        /**
+         * Notifies that an AudioNode is disconnected to an AudioParam.
+         */
+        export type nodeParamDisconnectedPayload = {
+            contextId: GraphObjectId;
+            sourceId: GraphObjectId;
+            destinationId: GraphObjectId;
+            sourceOutputIndex?: number;
+        }
+        
+        /**
+         * Enables the WebAudio domain and starts sending context lifetime events.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Disables the WebAudio domain.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Fetch the realtime data from the registered contexts.
+         */
+        export type getRealtimeDataParameters = {
+            contextId: GraphObjectId;
+        }
+        export type getRealtimeDataReturnValue = {
+            realtimeData: ContextRealtimeData;
+        }
+    }
+    
+    /**
+     * This domain allows configuring virtual authenticators to test the WebAuthn
+API.
+     */
+    export module WebAuthn {
+        export type AuthenticatorId = string;
+        export type AuthenticatorProtocol = "u2f"|"ctap2";
+        export type AuthenticatorTransport = "usb"|"nfc"|"ble"|"cable"|"internal";
+        export interface VirtualAuthenticatorOptions {
+            protocol: AuthenticatorProtocol;
+            transport: AuthenticatorTransport;
+            /**
+             * Defaults to false.
+             */
+            hasResidentKey?: boolean;
+            /**
+             * Defaults to false.
+             */
+            hasUserVerification?: boolean;
+            /**
+             * If set to true, tests of user presence will succeed immediately.
+Otherwise, they will not be resolved. Defaults to true.
+             */
+            automaticPresenceSimulation?: boolean;
+            /**
+             * Sets whether User Verification succeeds or fails for an authenticator.
+Defaults to false.
+             */
+            isUserVerified?: boolean;
+        }
+        export interface Credential {
+            credentialId: binary;
+            isResidentCredential: boolean;
+            /**
+             * Relying Party ID the credential is scoped to. Must be set when adding a
+credential.
+             */
+            rpId?: string;
+            /**
+             * The ECDSA P-256 private key in PKCS#8 format.
+             */
+            privateKey: binary;
+            /**
+             * An opaque byte sequence with a maximum size of 64 bytes mapping the
+credential to a specific user.
+             */
+            userHandle?: binary;
+            /**
+             * Signature counter. This is incremented by one for each successful
+assertion.
+See https://w3c.github.io/webauthn/#signature-counter
+             */
+            signCount: number;
+        }
+        
+        
+        /**
+         * Enable the WebAuthn domain and start intercepting credential storage and
+retrieval with a virtual authenticator.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Disable the WebAuthn domain.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Creates and adds a virtual authenticator.
+         */
+        export type addVirtualAuthenticatorParameters = {
+            options: VirtualAuthenticatorOptions;
+        }
+        export type addVirtualAuthenticatorReturnValue = {
+            authenticatorId: AuthenticatorId;
+        }
+        /**
+         * Removes the given authenticator.
+         */
+        export type removeVirtualAuthenticatorParameters = {
+            authenticatorId: AuthenticatorId;
+        }
+        export type removeVirtualAuthenticatorReturnValue = {
+        }
+        /**
+         * Adds the credential to the specified authenticator.
+         */
+        export type addCredentialParameters = {
+            authenticatorId: AuthenticatorId;
+            credential: Credential;
+        }
+        export type addCredentialReturnValue = {
+        }
+        /**
+         * Returns a single credential stored in the given virtual authenticator that
+matches the credential ID.
+         */
+        export type getCredentialParameters = {
+            authenticatorId: AuthenticatorId;
+            credentialId: binary;
+        }
+        export type getCredentialReturnValue = {
+            credential: Credential;
+        }
+        /**
+         * Returns all the credentials stored in the given virtual authenticator.
+         */
+        export type getCredentialsParameters = {
+            authenticatorId: AuthenticatorId;
+        }
+        export type getCredentialsReturnValue = {
+            credentials: Credential[];
+        }
+        /**
+         * Removes a credential from the authenticator.
+         */
+        export type removeCredentialParameters = {
+            authenticatorId: AuthenticatorId;
+            credentialId: binary;
+        }
+        export type removeCredentialReturnValue = {
+        }
+        /**
+         * Clears all the credentials from the specified device.
+         */
+        export type clearCredentialsParameters = {
+            authenticatorId: AuthenticatorId;
+        }
+        export type clearCredentialsReturnValue = {
+        }
+        /**
+         * Sets whether User Verification succeeds or fails for an authenticator.
+The default is true.
+         */
+        export type setUserVerifiedParameters = {
+            authenticatorId: AuthenticatorId;
+            isUserVerified: boolean;
+        }
+        export type setUserVerifiedReturnValue = {
+        }
+    }
+    
+    /**
+     * This domain allows detailed inspection of media elements
+     */
+    export module Media {
+        /**
+         * Players will get an ID that is unique within the agent context.
+         */
+        export type PlayerId = string;
+        export type Timestamp = number;
+        /**
+         * Player Property type
+         */
+        export interface PlayerProperty {
+            name: string;
+            value?: string;
+        }
+        /**
+         * Break out events into different types
+         */
+        export type PlayerEventType = "errorEvent"|"triggeredEvent"|"messageEvent";
+        export interface PlayerEvent {
+            type: PlayerEventType;
+            /**
+             * Events are timestamped relative to the start of the player creation
+not relative to the start of playback.
+             */
+            timestamp: Timestamp;
+            name: string;
+            value: string;
+        }
+        
+        /**
+         * This can be called multiple times, and can be used to set / override /
+remove player properties. A null propValue indicates removal.
+         */
+        export type playerPropertiesChangedPayload = {
+            playerId: PlayerId;
+            properties: PlayerProperty[];
+        }
+        /**
+         * Send events as a list, allowing them to be batched on the browser for less
+congestion. If batched, events must ALWAYS be in chronological order.
+         */
+        export type playerEventsAddedPayload = {
+            playerId: PlayerId;
+            events: PlayerEvent[];
+        }
+        /**
+         * Called whenever a player is created, or when a new agent joins and recieves
+a list of active players. If an agent is restored, it will recieve the full
+list of player ids and all events again.
+         */
+        export type playersCreatedPayload = {
+            players: PlayerId[];
+        }
+        
+        /**
+         * Enables the Media domain
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Disables the Media domain.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+    }
+    
+    /**
+     * This domain is deprecated - use Runtime or Log instead.
+     */
+    export module Console {
+        /**
+         * Console message.
+         */
+        export interface ConsoleMessage {
+            /**
+             * Message source.
+             */
+            source: "xml"|"javascript"|"network"|"console-api"|"storage"|"appcache"|"rendering"|"security"|"other"|"deprecation"|"worker";
+            /**
+             * Message severity.
+             */
+            level: "log"|"warning"|"error"|"debug"|"info";
+            /**
+             * Message text.
+             */
+            text: string;
+            /**
+             * URL of the message origin.
+             */
+            url?: string;
+            /**
+             * Line number in the resource that generated this message (1-based).
+             */
+            line?: number;
+            /**
+             * Column number in the resource that generated this message (1-based).
+             */
+            column?: number;
+        }
+        
+        /**
+         * Issued when new console message is added.
+         */
+        export type messageAddedPayload = {
+            /**
+             * Console message that has been added.
+             */
+            message: ConsoleMessage;
+        }
+        
+        /**
+         * Does nothing.
+         */
+        export type clearMessagesParameters = {
+        }
+        export type clearMessagesReturnValue = {
+        }
+        /**
+         * Disables console domain, prevents further console messages from being reported to the client.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables console domain, sends the messages collected so far to the client by means of the
+`messageAdded` notification.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+    }
+    
+    /**
+     * Debugger domain exposes JavaScript debugging capabilities. It allows setting and removing
+breakpoints, stepping through execution, exploring stack traces, etc.
+     */
+    export module Debugger {
+        /**
+         * Breakpoint identifier.
+         */
+        export type BreakpointId = string;
+        /**
+         * Call frame identifier.
+         */
+        export type CallFrameId = string;
+        /**
+         * Location in the source code.
+         */
+        export interface Location {
+            /**
+             * Script identifier as reported in the `Debugger.scriptParsed`.
+             */
+            scriptId: Runtime.ScriptId;
+            /**
+             * Line number in the script (0-based).
+             */
+            lineNumber: number;
+            /**
+             * Column number in the script (0-based).
+             */
+            columnNumber?: number;
+        }
+        /**
+         * Location in the source code.
+         */
+        export interface ScriptPosition {
+            lineNumber: number;
+            columnNumber: number;
+        }
+        /**
+         * JavaScript call frame. Array of call frames form the call stack.
+         */
+        export interface CallFrame {
+            /**
+             * Call frame identifier. This identifier is only valid while the virtual machine is paused.
+             */
+            callFrameId: CallFrameId;
+            /**
+             * Name of the JavaScript function called on this call frame.
+             */
+            functionName: string;
+            /**
+             * Location in the source code.
+             */
+            functionLocation?: Location;
+            /**
+             * Location in the source code.
+             */
+            location: Location;
+            /**
+             * JavaScript script name or url.
+             */
+            url: string;
+            /**
+             * Scope chain for this call frame.
+             */
+            scopeChain: Scope[];
+            /**
+             * `this` object for this call frame.
+             */
+            this: Runtime.RemoteObject;
+            /**
+             * The value being returned, if the function is at return point.
+             */
+            returnValue?: Runtime.RemoteObject;
+        }
+        /**
+         * Scope description.
+         */
+        export interface Scope {
+            /**
+             * Scope type.
+             */
+            type: "global"|"local"|"with"|"closure"|"catch"|"block"|"script"|"eval"|"module";
+            /**
+             * Object representing the scope. For `global` and `with` scopes it represents the actual
+object; for the rest of the scopes, it is artificial transient object enumerating scope
+variables as its properties.
+             */
+            object: Runtime.RemoteObject;
+            name?: string;
+            /**
+             * Location in the source code where scope starts
+             */
+            startLocation?: Location;
+            /**
+             * Location in the source code where scope ends
+             */
+            endLocation?: Location;
+        }
+        /**
+         * Search match for resource.
+         */
+        export interface SearchMatch {
+            /**
+             * Line number in resource content.
+             */
+            lineNumber: number;
+            /**
+             * Line with match content.
+             */
+            lineContent: string;
+        }
+        export interface BreakLocation {
+            /**
+             * Script identifier as reported in the `Debugger.scriptParsed`.
+             */
+            scriptId: Runtime.ScriptId;
+            /**
+             * Line number in the script (0-based).
+             */
+            lineNumber: number;
+            /**
+             * Column number in the script (0-based).
+             */
+            columnNumber?: number;
+            type?: "debuggerStatement"|"call"|"return";
+        }
+        
+        /**
+         * Fired when breakpoint is resolved to an actual script and location.
+         */
+        export type breakpointResolvedPayload = {
+            /**
+             * Breakpoint unique identifier.
+             */
+            breakpointId: BreakpointId;
+            /**
+             * Actual breakpoint location.
+             */
+            location: Location;
+        }
+        /**
+         * Fired when the virtual machine stopped on breakpoint or exception or any other stop criteria.
+         */
+        export type pausedPayload = {
+            /**
+             * Call stack the virtual machine stopped on.
+             */
+            callFrames: CallFrame[];
+            /**
+             * Pause reason.
+             */
+            reason: "ambiguous"|"assert"|"debugCommand"|"DOM"|"EventListener"|"exception"|"instrumentation"|"OOM"|"other"|"promiseRejection"|"XHR";
+            /**
+             * Object containing break-specific auxiliary properties.
+             */
+            data?: object;
+            /**
+             * Hit breakpoints IDs
+             */
+            hitBreakpoints?: string[];
+            /**
+             * Async stack trace, if any.
+             */
+            asyncStackTrace?: Runtime.StackTrace;
+            /**
+             * Async stack trace, if any.
+             */
+            asyncStackTraceId?: Runtime.StackTraceId;
+            /**
+             * Never present, will be removed.
+             */
+            asyncCallStackTraceId?: Runtime.StackTraceId;
+        }
+        /**
+         * Fired when the virtual machine resumed execution.
+         */
+        export type resumedPayload = void;
+        /**
+         * Fired when virtual machine fails to parse the script.
+         */
+        export type scriptFailedToParsePayload = {
+            /**
+             * Identifier of the script parsed.
+             */
+            scriptId: Runtime.ScriptId;
+            /**
+             * URL or name of the script parsed (if any).
+             */
+            url: string;
+            /**
+             * Line offset of the script within the resource with given URL (for script tags).
+             */
+            startLine: number;
+            /**
+             * Column offset of the script within the resource with given URL.
+             */
+            startColumn: number;
+            /**
+             * Last line of the script.
+             */
+            endLine: number;
+            /**
+             * Length of the last line of the script.
+             */
+            endColumn: number;
+            /**
+             * Specifies script creation context.
+             */
+            executionContextId: Runtime.ExecutionContextId;
+            /**
+             * Content hash of the script.
+             */
+            hash: string;
+            /**
+             * Embedder-specific auxiliary data.
+             */
+            executionContextAuxData?: object;
+            /**
+             * URL of source map associated with script (if any).
+             */
+            sourceMapURL?: string;
+            /**
+             * True, if this script has sourceURL.
+             */
+            hasSourceURL?: boolean;
+            /**
+             * True, if this script is ES6 module.
+             */
+            isModule?: boolean;
+            /**
+             * This script length.
+             */
+            length?: number;
+            /**
+             * JavaScript top stack frame of where the script parsed event was triggered if available.
+             */
+            stackTrace?: Runtime.StackTrace;
+        }
+        /**
+         * Fired when virtual machine parses script. This event is also fired for all known and uncollected
+scripts upon enabling debugger.
+         */
+        export type scriptParsedPayload = {
+            /**
+             * Identifier of the script parsed.
+             */
+            scriptId: Runtime.ScriptId;
+            /**
+             * URL or name of the script parsed (if any).
+             */
+            url: string;
+            /**
+             * Line offset of the script within the resource with given URL (for script tags).
+             */
+            startLine: number;
+            /**
+             * Column offset of the script within the resource with given URL.
+             */
+            startColumn: number;
+            /**
+             * Last line of the script.
+             */
+            endLine: number;
+            /**
+             * Length of the last line of the script.
+             */
+            endColumn: number;
+            /**
+             * Specifies script creation context.
+             */
+            executionContextId: Runtime.ExecutionContextId;
+            /**
+             * Content hash of the script.
+             */
+            hash: string;
+            /**
+             * Embedder-specific auxiliary data.
+             */
+            executionContextAuxData?: object;
+            /**
+             * True, if this script is generated as a result of the live edit operation.
+             */
+            isLiveEdit?: boolean;
+            /**
+             * URL of source map associated with script (if any).
+             */
+            sourceMapURL?: string;
+            /**
+             * True, if this script has sourceURL.
+             */
+            hasSourceURL?: boolean;
+            /**
+             * True, if this script is ES6 module.
+             */
+            isModule?: boolean;
+            /**
+             * This script length.
+             */
+            length?: number;
+            /**
+             * JavaScript top stack frame of where the script parsed event was triggered if available.
+             */
+            stackTrace?: Runtime.StackTrace;
+        }
+        
+        /**
+         * Continues execution until specific location is reached.
+         */
+        export type continueToLocationParameters = {
+            /**
+             * Location to continue to.
+             */
+            location: Location;
+            targetCallFrames?: "any"|"current";
+        }
+        export type continueToLocationReturnValue = {
+        }
+        /**
+         * Disables debugger for given page.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Enables debugger for the given page. Clients should not assume that the debugging has been
+enabled until the result for this command is received.
+         */
+        export type enableParameters = {
+            /**
+             * The maximum size in bytes of collected scripts (not referenced by other heap objects)
+the debugger can hold. Puts no limit if paramter is omitted.
+             */
+            maxScriptsCacheSize?: number;
+        }
+        export type enableReturnValue = {
+            /**
+             * Unique identifier of the debugger.
+             */
+            debuggerId: Runtime.UniqueDebuggerId;
+        }
+        /**
+         * Evaluates expression on a given call frame.
+         */
+        export type evaluateOnCallFrameParameters = {
+            /**
+             * Call frame identifier to evaluate on.
+             */
+            callFrameId: CallFrameId;
+            /**
+             * Expression to evaluate.
+             */
+            expression: string;
+            /**
+             * String object group name to put result into (allows rapid releasing resulting object handles
+using `releaseObjectGroup`).
+             */
+            objectGroup?: string;
+            /**
+             * Specifies whether command line API should be available to the evaluated expression, defaults
+to false.
+             */
+            includeCommandLineAPI?: boolean;
+            /**
+             * In silent mode exceptions thrown during evaluation are not reported and do not pause
+execution. Overrides `setPauseOnException` state.
+             */
+            silent?: boolean;
+            /**
+             * Whether the result is expected to be a JSON object that should be sent by value.
+             */
+            returnByValue?: boolean;
+            /**
+             * Whether preview should be generated for the result.
+             */
+            generatePreview?: boolean;
+            /**
+             * Whether to throw an exception if side effect cannot be ruled out during evaluation.
+             */
+            throwOnSideEffect?: boolean;
+            /**
+             * Terminate execution after timing out (number of milliseconds).
+             */
+            timeout?: Runtime.TimeDelta;
+        }
+        export type evaluateOnCallFrameReturnValue = {
+            /**
+             * Object wrapper for the evaluation result.
+             */
+            result: Runtime.RemoteObject;
+            /**
+             * Exception details.
+             */
+            exceptionDetails?: Runtime.ExceptionDetails;
+        }
+        /**
+         * Returns possible locations for breakpoint. scriptId in start and end range locations should be
+the same.
+         */
+        export type getPossibleBreakpointsParameters = {
+            /**
+             * Start of range to search possible breakpoint locations in.
+             */
+            start: Location;
+            /**
+             * End of range to search possible breakpoint locations in (excluding). When not specified, end
+of scripts is used as end of range.
+             */
+            end?: Location;
+            /**
+             * Only consider locations which are in the same (non-nested) function as start.
+             */
+            restrictToFunction?: boolean;
+        }
+        export type getPossibleBreakpointsReturnValue = {
+            /**
+             * List of the possible breakpoint locations.
+             */
+            locations: BreakLocation[];
+        }
+        /**
+         * Returns source for the script with given id.
+         */
+        export type getScriptSourceParameters = {
+            /**
+             * Id of the script to get source for.
+             */
+            scriptId: Runtime.ScriptId;
+        }
+        export type getScriptSourceReturnValue = {
+            /**
+             * Script source (empty in case of Wasm bytecode).
+             */
+            scriptSource: string;
+            /**
+             * Wasm bytecode.
+             */
+            bytecode?: binary;
+        }
+        /**
+         * This command is deprecated. Use getScriptSource instead.
+         */
+        export type getWasmBytecodeParameters = {
+            /**
+             * Id of the Wasm script to get source for.
+             */
+            scriptId: Runtime.ScriptId;
+        }
+        export type getWasmBytecodeReturnValue = {
+            /**
+             * Script source.
+             */
+            bytecode: binary;
+        }
+        /**
+         * Returns stack trace with given `stackTraceId`.
+         */
+        export type getStackTraceParameters = {
+            stackTraceId: Runtime.StackTraceId;
+        }
+        export type getStackTraceReturnValue = {
+            stackTrace: Runtime.StackTrace;
+        }
+        /**
+         * Stops on the next JavaScript statement.
+         */
+        export type pauseParameters = {
+        }
+        export type pauseReturnValue = {
+        }
+        export type pauseOnAsyncCallParameters = {
+            /**
+             * Debugger will pause when async call with given stack trace is started.
+             */
+            parentStackTraceId: Runtime.StackTraceId;
+        }
+        export type pauseOnAsyncCallReturnValue = {
+        }
+        /**
+         * Removes JavaScript breakpoint.
+         */
+        export type removeBreakpointParameters = {
+            breakpointId: BreakpointId;
+        }
+        export type removeBreakpointReturnValue = {
+        }
+        /**
+         * Restarts particular call frame from the beginning.
+         */
+        export type restartFrameParameters = {
+            /**
+             * Call frame identifier to evaluate on.
+             */
+            callFrameId: CallFrameId;
+        }
+        export type restartFrameReturnValue = {
+            /**
+             * New stack trace.
+             */
+            callFrames: CallFrame[];
+            /**
+             * Async stack trace, if any.
+             */
+            asyncStackTrace?: Runtime.StackTrace;
+            /**
+             * Async stack trace, if any.
+             */
+            asyncStackTraceId?: Runtime.StackTraceId;
+        }
+        /**
+         * Resumes JavaScript execution.
+         */
+        export type resumeParameters = {
+        }
+        export type resumeReturnValue = {
+        }
+        /**
+         * Searches for given string in script content.
+         */
+        export type searchInContentParameters = {
+            /**
+             * Id of the script to search in.
+             */
+            scriptId: Runtime.ScriptId;
+            /**
+             * String to search for.
+             */
+            query: string;
+            /**
+             * If true, search is case sensitive.
+             */
+            caseSensitive?: boolean;
+            /**
+             * If true, treats string parameter as regex.
+             */
+            isRegex?: boolean;
+        }
+        export type searchInContentReturnValue = {
+            /**
+             * List of search matches.
+             */
+            result: SearchMatch[];
+        }
+        /**
+         * Enables or disables async call stacks tracking.
+         */
+        export type setAsyncCallStackDepthParameters = {
+            /**
+             * Maximum depth of async call stacks. Setting to `0` will effectively disable collecting async
+call stacks (default).
+             */
+            maxDepth: number;
+        }
+        export type setAsyncCallStackDepthReturnValue = {
+        }
+        /**
+         * Replace previous blackbox patterns with passed ones. Forces backend to skip stepping/pausing in
+scripts with url matching one of the patterns. VM will try to leave blackboxed script by
+performing 'step in' several times, finally resorting to 'step out' if unsuccessful.
+         */
+        export type setBlackboxPatternsParameters = {
+            /**
+             * Array of regexps that will be used to check script url for blackbox state.
+             */
+            patterns: string[];
+        }
+        export type setBlackboxPatternsReturnValue = {
+        }
+        /**
+         * Makes backend skip steps in the script in blackboxed ranges. VM will try leave blacklisted
+scripts by performing 'step in' several times, finally resorting to 'step out' if unsuccessful.
+Positions array contains positions where blackbox state is changed. First interval isn't
+blackboxed. Array should be sorted.
+         */
+        export type setBlackboxedRangesParameters = {
+            /**
+             * Id of the script.
+             */
+            scriptId: Runtime.ScriptId;
+            positions: ScriptPosition[];
+        }
+        export type setBlackboxedRangesReturnValue = {
+        }
+        /**
+         * Sets JavaScript breakpoint at a given location.
+         */
+        export type setBreakpointParameters = {
+            /**
+             * Location to set breakpoint in.
+             */
+            location: Location;
+            /**
+             * Expression to use as a breakpoint condition. When specified, debugger will only stop on the
+breakpoint if this expression evaluates to true.
+             */
+            condition?: string;
+        }
+        export type setBreakpointReturnValue = {
+            /**
+             * Id of the created breakpoint for further reference.
+             */
+            breakpointId: BreakpointId;
+            /**
+             * Location this breakpoint resolved into.
+             */
+            actualLocation: Location;
+        }
+        /**
+         * Sets instrumentation breakpoint.
+         */
+        export type setInstrumentationBreakpointParameters = {
+            /**
+             * Instrumentation name.
+             */
+            instrumentation: "beforeScriptExecution"|"beforeScriptWithSourceMapExecution";
+        }
+        export type setInstrumentationBreakpointReturnValue = {
+            /**
+             * Id of the created breakpoint for further reference.
+             */
+            breakpointId: BreakpointId;
+        }
+        /**
+         * Sets JavaScript breakpoint at given location specified either by URL or URL regex. Once this
+command is issued, all existing parsed scripts will have breakpoints resolved and returned in
+`locations` property. Further matching script parsing will result in subsequent
+`breakpointResolved` events issued. This logical breakpoint will survive page reloads.
+         */
+        export type setBreakpointByUrlParameters = {
+            /**
+             * Line number to set breakpoint at.
+             */
+            lineNumber: number;
+            /**
+             * URL of the resources to set breakpoint on.
+             */
+            url?: string;
+            /**
+             * Regex pattern for the URLs of the resources to set breakpoints on. Either `url` or
+`urlRegex` must be specified.
+             */
+            urlRegex?: string;
+            /**
+             * Script hash of the resources to set breakpoint on.
+             */
+            scriptHash?: string;
+            /**
+             * Offset in the line to set breakpoint at.
+             */
+            columnNumber?: number;
+            /**
+             * Expression to use as a breakpoint condition. When specified, debugger will only stop on the
+breakpoint if this expression evaluates to true.
+             */
+            condition?: string;
+        }
+        export type setBreakpointByUrlReturnValue = {
+            /**
+             * Id of the created breakpoint for further reference.
+             */
+            breakpointId: BreakpointId;
+            /**
+             * List of the locations this breakpoint resolved into upon addition.
+             */
+            locations: Location[];
+        }
+        /**
+         * Sets JavaScript breakpoint before each call to the given function.
+If another function was created from the same source as a given one,
+calling it will also trigger the breakpoint.
+         */
+        export type setBreakpointOnFunctionCallParameters = {
+            /**
+             * Function object id.
+             */
+            objectId: Runtime.RemoteObjectId;
+            /**
+             * Expression to use as a breakpoint condition. When specified, debugger will
+stop on the breakpoint if this expression evaluates to true.
+             */
+            condition?: string;
+        }
+        export type setBreakpointOnFunctionCallReturnValue = {
+            /**
+             * Id of the created breakpoint for further reference.
+             */
+            breakpointId: BreakpointId;
+        }
+        /**
+         * Activates / deactivates all breakpoints on the page.
+         */
+        export type setBreakpointsActiveParameters = {
+            /**
+             * New value for breakpoints active state.
+             */
+            active: boolean;
+        }
+        export type setBreakpointsActiveReturnValue = {
+        }
+        /**
+         * Defines pause on exceptions state. Can be set to stop on all exceptions, uncaught exceptions or
+no exceptions. Initial pause on exceptions state is `none`.
+         */
+        export type setPauseOnExceptionsParameters = {
+            /**
+             * Pause on exceptions mode.
+             */
+            state: "none"|"uncaught"|"all";
+        }
+        export type setPauseOnExceptionsReturnValue = {
+        }
+        /**
+         * Changes return value in top frame. Available only at return break position.
+         */
+        export type setReturnValueParameters = {
+            /**
+             * New return value.
+             */
+            newValue: Runtime.CallArgument;
+        }
+        export type setReturnValueReturnValue = {
+        }
+        /**
+         * Edits JavaScript source live.
+         */
+        export type setScriptSourceParameters = {
+            /**
+             * Id of the script to edit.
+             */
+            scriptId: Runtime.ScriptId;
+            /**
+             * New content of the script.
+             */
+            scriptSource: string;
+            /**
+             * If true the change will not actually be applied. Dry run may be used to get result
+description without actually modifying the code.
+             */
+            dryRun?: boolean;
+        }
+        export type setScriptSourceReturnValue = {
+            /**
+             * New stack trace in case editing has happened while VM was stopped.
+             */
+            callFrames?: CallFrame[];
+            /**
+             * Whether current call stack  was modified after applying the changes.
+             */
+            stackChanged?: boolean;
+            /**
+             * Async stack trace, if any.
+             */
+            asyncStackTrace?: Runtime.StackTrace;
+            /**
+             * Async stack trace, if any.
+             */
+            asyncStackTraceId?: Runtime.StackTraceId;
+            /**
+             * Exception details if any.
+             */
+            exceptionDetails?: Runtime.ExceptionDetails;
+        }
+        /**
+         * Makes page not interrupt on any pauses (breakpoint, exception, dom exception etc).
+         */
+        export type setSkipAllPausesParameters = {
+            /**
+             * New value for skip pauses state.
+             */
+            skip: boolean;
+        }
+        export type setSkipAllPausesReturnValue = {
+        }
+        /**
+         * Changes value of variable in a callframe. Object-based scopes are not supported and must be
+mutated manually.
+         */
+        export type setVariableValueParameters = {
+            /**
+             * 0-based number of scope as was listed in scope chain. Only 'local', 'closure' and 'catch'
+scope types are allowed. Other scopes could be manipulated manually.
+             */
+            scopeNumber: number;
+            /**
+             * Variable name.
+             */
+            variableName: string;
+            /**
+             * New variable value.
+             */
+            newValue: Runtime.CallArgument;
+            /**
+             * Id of callframe that holds variable.
+             */
+            callFrameId: CallFrameId;
+        }
+        export type setVariableValueReturnValue = {
+        }
+        /**
+         * Steps into the function call.
+         */
+        export type stepIntoParameters = {
+            /**
+             * Debugger will pause on the execution of the first async task which was scheduled
+before next pause.
+             */
+            breakOnAsyncCall?: boolean;
+        }
+        export type stepIntoReturnValue = {
+        }
+        /**
+         * Steps out of the function call.
+         */
+        export type stepOutParameters = {
+        }
+        export type stepOutReturnValue = {
+        }
+        /**
+         * Steps over the statement.
+         */
+        export type stepOverParameters = {
+        }
+        export type stepOverReturnValue = {
+        }
+    }
+    
+    export module HeapProfiler {
+        /**
+         * Heap snapshot object id.
+         */
+        export type HeapSnapshotObjectId = string;
+        /**
+         * Sampling Heap Profile node. Holds callsite information, allocation statistics and child nodes.
+         */
+        export interface SamplingHeapProfileNode {
+            /**
+             * Function location.
+             */
+            callFrame: Runtime.CallFrame;
+            /**
+             * Allocations size in bytes for the node excluding children.
+             */
+            selfSize: number;
+            /**
+             * Node id. Ids are unique across all profiles collected between startSampling and stopSampling.
+             */
+            id: number;
+            /**
+             * Child nodes.
+             */
+            children: SamplingHeapProfileNode[];
+        }
+        /**
+         * A single sample from a sampling profile.
+         */
+        export interface SamplingHeapProfileSample {
+            /**
+             * Allocation size in bytes attributed to the sample.
+             */
+            size: number;
+            /**
+             * Id of the corresponding profile tree node.
+             */
+            nodeId: number;
+            /**
+             * Time-ordered sample ordinal number. It is unique across all profiles retrieved
+between startSampling and stopSampling.
+             */
+            ordinal: number;
+        }
+        /**
+         * Sampling profile.
+         */
+        export interface SamplingHeapProfile {
+            head: SamplingHeapProfileNode;
+            samples: SamplingHeapProfileSample[];
+        }
+        
+        export type addHeapSnapshotChunkPayload = {
+            chunk: string;
+        }
+        /**
+         * If heap objects tracking has been started then backend may send update for one or more fragments
+         */
+        export type heapStatsUpdatePayload = {
+            /**
+             * An array of triplets. Each triplet describes a fragment. The first integer is the fragment
+index, the second integer is a total count of objects for the fragment, the third integer is
+a total size of the objects for the fragment.
+             */
+            statsUpdate: number[];
+        }
+        /**
+         * If heap objects tracking has been started then backend regularly sends a current value for last
+seen object id and corresponding timestamp. If the were changes in the heap since last event
+then one or more heapStatsUpdate events will be sent before a new lastSeenObjectId event.
+         */
+        export type lastSeenObjectIdPayload = {
+            lastSeenObjectId: number;
+            timestamp: number;
+        }
+        export type reportHeapSnapshotProgressPayload = {
+            done: number;
+            total: number;
+            finished?: boolean;
+        }
+        export type resetProfilesPayload = void;
+        
+        /**
+         * Enables console to refer to the node with given id via $x (see Command Line API for more details
+$x functions).
+         */
+        export type addInspectedHeapObjectParameters = {
+            /**
+             * Heap snapshot object id to be accessible by means of $x command line API.
+             */
+            heapObjectId: HeapSnapshotObjectId;
+        }
+        export type addInspectedHeapObjectReturnValue = {
+        }
+        export type collectGarbageParameters = {
+        }
+        export type collectGarbageReturnValue = {
+        }
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        export type getHeapObjectIdParameters = {
+            /**
+             * Identifier of the object to get heap object id for.
+             */
+            objectId: Runtime.RemoteObjectId;
+        }
+        export type getHeapObjectIdReturnValue = {
+            /**
+             * Id of the heap snapshot object corresponding to the passed remote object id.
+             */
+            heapSnapshotObjectId: HeapSnapshotObjectId;
+        }
+        export type getObjectByHeapObjectIdParameters = {
+            objectId: HeapSnapshotObjectId;
+            /**
+             * Symbolic group name that can be used to release multiple objects.
+             */
+            objectGroup?: string;
+        }
+        export type getObjectByHeapObjectIdReturnValue = {
+            /**
+             * Evaluation result.
+             */
+            result: Runtime.RemoteObject;
+        }
+        export type getSamplingProfileParameters = {
+        }
+        export type getSamplingProfileReturnValue = {
+            /**
+             * Return the sampling profile being collected.
+             */
+            profile: SamplingHeapProfile;
+        }
+        export type startSamplingParameters = {
+            /**
+             * Average sample interval in bytes. Poisson distribution is used for the intervals. The
+default value is 32768 bytes.
+             */
+            samplingInterval?: number;
+        }
+        export type startSamplingReturnValue = {
+        }
+        export type startTrackingHeapObjectsParameters = {
+            trackAllocations?: boolean;
+        }
+        export type startTrackingHeapObjectsReturnValue = {
+        }
+        export type stopSamplingParameters = {
+        }
+        export type stopSamplingReturnValue = {
+            /**
+             * Recorded sampling heap profile.
+             */
+            profile: SamplingHeapProfile;
+        }
+        export type stopTrackingHeapObjectsParameters = {
+            /**
+             * If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken
+when the tracking is stopped.
+             */
+            reportProgress?: boolean;
+            treatGlobalObjectsAsRoots?: boolean;
+        }
+        export type stopTrackingHeapObjectsReturnValue = {
+        }
+        export type takeHeapSnapshotParameters = {
+            /**
+             * If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken.
+             */
+            reportProgress?: boolean;
+            /**
+             * If true, a raw snapshot without artifical roots will be generated
+             */
+            treatGlobalObjectsAsRoots?: boolean;
+        }
+        export type takeHeapSnapshotReturnValue = {
+        }
+    }
+    
+    export module Profiler {
+        /**
+         * Profile node. Holds callsite information, execution statistics and child nodes.
+         */
+        export interface ProfileNode {
+            /**
+             * Unique id of the node.
+             */
+            id: number;
+            /**
+             * Function location.
+             */
+            callFrame: Runtime.CallFrame;
+            /**
+             * Number of samples where this node was on top of the call stack.
+             */
+            hitCount?: number;
+            /**
+             * Child node ids.
+             */
+            children?: number[];
+            /**
+             * The reason of being not optimized. The function may be deoptimized or marked as don't
+optimize.
+             */
+            deoptReason?: string;
+            /**
+             * An array of source position ticks.
+             */
+            positionTicks?: PositionTickInfo[];
+        }
+        /**
+         * Profile.
+         */
+        export interface Profile {
+            /**
+             * The list of profile nodes. First item is the root node.
+             */
+            nodes: ProfileNode[];
+            /**
+             * Profiling start timestamp in microseconds.
+             */
+            startTime: number;
+            /**
+             * Profiling end timestamp in microseconds.
+             */
+            endTime: number;
+            /**
+             * Ids of samples top nodes.
+             */
+            samples?: number[];
+            /**
+             * Time intervals between adjacent samples in microseconds. The first delta is relative to the
+profile startTime.
+             */
+            timeDeltas?: number[];
+        }
+        /**
+         * Specifies a number of samples attributed to a certain source position.
+         */
+        export interface PositionTickInfo {
+            /**
+             * Source line number (1-based).
+             */
+            line: number;
+            /**
+             * Number of samples attributed to the source line.
+             */
+            ticks: number;
+        }
+        /**
+         * Coverage data for a source range.
+         */
+        export interface CoverageRange {
+            /**
+             * JavaScript script source offset for the range start.
+             */
+            startOffset: number;
+            /**
+             * JavaScript script source offset for the range end.
+             */
+            endOffset: number;
+            /**
+             * Collected execution count of the source range.
+             */
+            count: number;
+        }
+        /**
+         * Coverage data for a JavaScript function.
+         */
+        export interface FunctionCoverage {
+            /**
+             * JavaScript function name.
+             */
+            functionName: string;
+            /**
+             * Source ranges inside the function with coverage data.
+             */
+            ranges: CoverageRange[];
+            /**
+             * Whether coverage data for this function has block granularity.
+             */
+            isBlockCoverage: boolean;
+        }
+        /**
+         * Coverage data for a JavaScript script.
+         */
+        export interface ScriptCoverage {
+            /**
+             * JavaScript script id.
+             */
+            scriptId: Runtime.ScriptId;
+            /**
+             * JavaScript script name or url.
+             */
+            url: string;
+            /**
+             * Functions contained in the script that has coverage data.
+             */
+            functions: FunctionCoverage[];
+        }
+        /**
+         * Describes a type collected during runtime.
+         */
+        export interface TypeObject {
+            /**
+             * Name of a type collected with type profiling.
+             */
+            name: string;
+        }
+        /**
+         * Source offset and types for a parameter or return value.
+         */
+        export interface TypeProfileEntry {
+            /**
+             * Source offset of the parameter or end of function for return values.
+             */
+            offset: number;
+            /**
+             * The types for this parameter or return value.
+             */
+            types: TypeObject[];
+        }
+        /**
+         * Type profile data collected during runtime for a JavaScript script.
+         */
+        export interface ScriptTypeProfile {
+            /**
+             * JavaScript script id.
+             */
+            scriptId: Runtime.ScriptId;
+            /**
+             * JavaScript script name or url.
+             */
+            url: string;
+            /**
+             * Type profile entries for parameters and return values of the functions in the script.
+             */
+            entries: TypeProfileEntry[];
+        }
+        /**
+         * Collected counter information.
+         */
+        export interface CounterInfo {
+            /**
+             * Counter name.
+             */
+            name: string;
+            /**
+             * Counter value.
+             */
+            value: number;
+        }
+        
+        export type consoleProfileFinishedPayload = {
+            id: string;
+            /**
+             * Location of console.profileEnd().
+             */
+            location: Debugger.Location;
+            profile: Profile;
+            /**
+             * Profile title passed as an argument to console.profile().
+             */
+            title?: string;
+        }
+        /**
+         * Sent when new profile recording is started using console.profile() call.
+         */
+        export type consoleProfileStartedPayload = {
+            id: string;
+            /**
+             * Location of console.profile().
+             */
+            location: Debugger.Location;
+            /**
+             * Profile title passed as an argument to console.profile().
+             */
+            title?: string;
+        }
+        /**
+         * Reports coverage delta since the last poll (either from an event like this, or from
+`takePreciseCoverage` for the current isolate. May only be sent if precise code
+coverage has been started. This event can be trigged by the embedder to, for example,
+trigger collection of coverage data immediatelly at a certain point in time.
+         */
+        export type preciseCoverageDeltaUpdatePayload = {
+            /**
+             * Monotonically increasing time (in seconds) when the coverage update was taken in the backend.
+             */
+            timestamp: number;
+            /**
+             * Identifier for distinguishing coverage events.
+             */
+            occassion: string;
+            /**
+             * Coverage data for the current isolate.
+             */
+            result: ScriptCoverage[];
+        }
+        
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Collect coverage data for the current isolate. The coverage data may be incomplete due to
+garbage collection.
+         */
+        export type getBestEffortCoverageParameters = {
+        }
+        export type getBestEffortCoverageReturnValue = {
+            /**
+             * Coverage data for the current isolate.
+             */
+            result: ScriptCoverage[];
+        }
+        /**
+         * Changes CPU profiler sampling interval. Must be called before CPU profiles recording started.
+         */
+        export type setSamplingIntervalParameters = {
+            /**
+             * New sampling interval in microseconds.
+             */
+            interval: number;
+        }
+        export type setSamplingIntervalReturnValue = {
+        }
+        export type startParameters = {
+        }
+        export type startReturnValue = {
+        }
+        /**
+         * Enable precise code coverage. Coverage data for JavaScript executed before enabling precise code
+coverage may be incomplete. Enabling prevents running optimized code and resets execution
+counters.
+         */
+        export type startPreciseCoverageParameters = {
+            /**
+             * Collect accurate call counts beyond simple 'covered' or 'not covered'.
+             */
+            callCount?: boolean;
+            /**
+             * Collect block-based coverage.
+             */
+            detailed?: boolean;
+        }
+        export type startPreciseCoverageReturnValue = {
+            /**
+             * Monotonically increasing time (in seconds) when the coverage update was taken in the backend.
+             */
+            timestamp: number;
+        }
+        /**
+         * Enable type profile.
+         */
+        export type startTypeProfileParameters = {
+        }
+        export type startTypeProfileReturnValue = {
+        }
+        export type stopParameters = {
+        }
+        export type stopReturnValue = {
+            /**
+             * Recorded profile.
+             */
+            profile: Profile;
+        }
+        /**
+         * Disable precise code coverage. Disabling releases unnecessary execution count records and allows
+executing optimized code.
+         */
+        export type stopPreciseCoverageParameters = {
+        }
+        export type stopPreciseCoverageReturnValue = {
+        }
+        /**
+         * Disable type profile. Disabling releases type profile data collected so far.
+         */
+        export type stopTypeProfileParameters = {
+        }
+        export type stopTypeProfileReturnValue = {
+        }
+        /**
+         * Collect coverage data for the current isolate, and resets execution counters. Precise code
+coverage needs to have started.
+         */
+        export type takePreciseCoverageParameters = {
+        }
+        export type takePreciseCoverageReturnValue = {
+            /**
+             * Coverage data for the current isolate.
+             */
+            result: ScriptCoverage[];
+            /**
+             * Monotonically increasing time (in seconds) when the coverage update was taken in the backend.
+             */
+            timestamp: number;
+        }
+        /**
+         * Collect type profile.
+         */
+        export type takeTypeProfileParameters = {
+        }
+        export type takeTypeProfileReturnValue = {
+            /**
+             * Type profile for all scripts since startTypeProfile() was turned on.
+             */
+            result: ScriptTypeProfile[];
+        }
+        /**
+         * Enable run time call stats collection.
+         */
+        export type enableRuntimeCallStatsParameters = {
+        }
+        export type enableRuntimeCallStatsReturnValue = {
+        }
+        /**
+         * Disable run time call stats collection.
+         */
+        export type disableRuntimeCallStatsParameters = {
+        }
+        export type disableRuntimeCallStatsReturnValue = {
+        }
+        /**
+         * Retrieve run time call stats.
+         */
+        export type getRuntimeCallStatsParameters = {
+        }
+        export type getRuntimeCallStatsReturnValue = {
+            /**
+             * Collected counter information.
+             */
+            result: CounterInfo[];
+        }
+    }
+    
+    /**
+     * Runtime domain exposes JavaScript runtime by means of remote evaluation and mirror objects.
+Evaluation results are returned as mirror object that expose object type, string representation
+and unique identifier that can be used for further object reference. Original objects are
+maintained in memory unless they are either explicitly released or are released along with the
+other objects in their object group.
+     */
+    export module Runtime {
+        /**
+         * Unique script identifier.
+         */
+        export type ScriptId = string;
+        /**
+         * Unique object identifier.
+         */
+        export type RemoteObjectId = string;
+        /**
+         * Primitive value which cannot be JSON-stringified. Includes values `-0`, `NaN`, `Infinity`,
+`-Infinity`, and bigint literals.
+         */
+        export type UnserializableValue = string;
+        /**
+         * Mirror object referencing original JavaScript object.
+         */
+        export interface RemoteObject {
+            /**
+             * Object type.
+             */
+            type: "object"|"function"|"undefined"|"string"|"number"|"boolean"|"symbol"|"bigint";
+            /**
+             * Object subtype hint. Specified for `object` type values only.
+             */
+            subtype?: "array"|"null"|"node"|"regexp"|"date"|"map"|"set"|"weakmap"|"weakset"|"iterator"|"generator"|"error"|"proxy"|"promise"|"typedarray"|"arraybuffer"|"dataview";
+            /**
+             * Object class (constructor) name. Specified for `object` type values only.
+             */
+            className?: string;
+            /**
+             * Remote object value in case of primitive values or JSON values (if it was requested).
+             */
+            value?: any;
+            /**
+             * Primitive value which can not be JSON-stringified does not have `value`, but gets this
+property.
+             */
+            unserializableValue?: UnserializableValue;
+            /**
+             * String representation of the object.
+             */
+            description?: string;
+            /**
+             * Unique object identifier (for non-primitive values).
+             */
+            objectId?: RemoteObjectId;
+            /**
+             * Preview containing abbreviated property values. Specified for `object` type values only.
+             */
+            preview?: ObjectPreview;
+            customPreview?: CustomPreview;
+        }
+        export interface CustomPreview {
+            /**
+             * The JSON-stringified result of formatter.header(object, config) call.
+It contains json ML array that represents RemoteObject.
+             */
+            header: string;
+            /**
+             * If formatter returns true as a result of formatter.hasBody call then bodyGetterId will
+contain RemoteObjectId for the function that returns result of formatter.body(object, config) call.
+The result value is json ML array.
+             */
+            bodyGetterId?: RemoteObjectId;
+        }
+        /**
+         * Object containing abbreviated remote object value.
+         */
+        export interface ObjectPreview {
+            /**
+             * Object type.
+             */
+            type: "object"|"function"|"undefined"|"string"|"number"|"boolean"|"symbol"|"bigint";
+            /**
+             * Object subtype hint. Specified for `object` type values only.
+             */
+            subtype?: "array"|"null"|"node"|"regexp"|"date"|"map"|"set"|"weakmap"|"weakset"|"iterator"|"generator"|"error";
+            /**
+             * String representation of the object.
+             */
+            description?: string;
+            /**
+             * True iff some of the properties or entries of the original object did not fit.
+             */
+            overflow: boolean;
+            /**
+             * List of the properties.
+             */
+            properties: PropertyPreview[];
+            /**
+             * List of the entries. Specified for `map` and `set` subtype values only.
+             */
+            entries?: EntryPreview[];
+        }
+        export interface PropertyPreview {
+            /**
+             * Property name.
+             */
+            name: string;
+            /**
+             * Object type. Accessor means that the property itself is an accessor property.
+             */
+            type: "object"|"function"|"undefined"|"string"|"number"|"boolean"|"symbol"|"accessor"|"bigint";
+            /**
+             * User-friendly property value string.
+             */
+            value?: string;
+            /**
+             * Nested value preview.
+             */
+            valuePreview?: ObjectPreview;
+            /**
+             * Object subtype hint. Specified for `object` type values only.
+             */
+            subtype?: "array"|"null"|"node"|"regexp"|"date"|"map"|"set"|"weakmap"|"weakset"|"iterator"|"generator"|"error";
+        }
+        export interface EntryPreview {
+            /**
+             * Preview of the key. Specified for map-like collection entries.
+             */
+            key?: ObjectPreview;
+            /**
+             * Preview of the value.
+             */
+            value: ObjectPreview;
+        }
+        /**
+         * Object property descriptor.
+         */
+        export interface PropertyDescriptor {
+            /**
+             * Property name or symbol description.
+             */
+            name: string;
+            /**
+             * The value associated with the property.
+             */
+            value?: RemoteObject;
+            /**
+             * True if the value associated with the property may be changed (data descriptors only).
+             */
+            writable?: boolean;
+            /**
+             * A function which serves as a getter for the property, or `undefined` if there is no getter
+(accessor descriptors only).
+             */
+            get?: RemoteObject;
+            /**
+             * A function which serves as a setter for the property, or `undefined` if there is no setter
+(accessor descriptors only).
+             */
+            set?: RemoteObject;
+            /**
+             * True if the type of this property descriptor may be changed and if the property may be
+deleted from the corresponding object.
+             */
+            configurable: boolean;
+            /**
+             * True if this property shows up during enumeration of the properties on the corresponding
+object.
+             */
+            enumerable: boolean;
+            /**
+             * True if the result was thrown during the evaluation.
+             */
+            wasThrown?: boolean;
+            /**
+             * True if the property is owned for the object.
+             */
+            isOwn?: boolean;
+            /**
+             * Property symbol object, if the property is of the `symbol` type.
+             */
+            symbol?: RemoteObject;
+        }
+        /**
+         * Object internal property descriptor. This property isn't normally visible in JavaScript code.
+         */
+        export interface InternalPropertyDescriptor {
+            /**
+             * Conventional property name.
+             */
+            name: string;
+            /**
+             * The value associated with the property.
+             */
+            value?: RemoteObject;
+        }
+        /**
+         * Object private field descriptor.
+         */
+        export interface PrivatePropertyDescriptor {
+            /**
+             * Private property name.
+             */
+            name: string;
+            /**
+             * The value associated with the private property.
+             */
+            value?: RemoteObject;
+            /**
+             * A function which serves as a getter for the private property,
+or `undefined` if there is no getter (accessor descriptors only).
+             */
+            get?: RemoteObject;
+            /**
+             * A function which serves as a setter for the private property,
+or `undefined` if there is no setter (accessor descriptors only).
+             */
+            set?: RemoteObject;
+        }
+        /**
+         * Represents function call argument. Either remote object id `objectId`, primitive `value`,
+unserializable primitive value or neither of (for undefined) them should be specified.
+         */
+        export interface CallArgument {
+            /**
+             * Primitive value or serializable javascript object.
+             */
+            value?: any;
+            /**
+             * Primitive value which can not be JSON-stringified.
+             */
+            unserializableValue?: UnserializableValue;
+            /**
+             * Remote object handle.
+             */
+            objectId?: RemoteObjectId;
+        }
+        /**
+         * Id of an execution context.
+         */
+        export type ExecutionContextId = number;
+        /**
+         * Description of an isolated world.
+         */
+        export interface ExecutionContextDescription {
+            /**
+             * Unique id of the execution context. It can be used to specify in which execution context
+script evaluation should be performed.
+             */
+            id: ExecutionContextId;
+            /**
+             * Execution context origin.
+             */
+            origin: string;
+            /**
+             * Human readable name describing given context.
+             */
+            name: string;
+            /**
+             * Embedder-specific auxiliary data.
+             */
+            auxData?: object;
+        }
+        /**
+         * Detailed information about exception (or error) that was thrown during script compilation or
+execution.
+         */
+        export interface ExceptionDetails {
+            /**
+             * Exception id.
+             */
+            exceptionId: number;
+            /**
+             * Exception text, which should be used together with exception object when available.
+             */
+            text: string;
+            /**
+             * Line number of the exception location (0-based).
+             */
+            lineNumber: number;
+            /**
+             * Column number of the exception location (0-based).
+             */
+            columnNumber: number;
+            /**
+             * Script ID of the exception location.
+             */
+            scriptId?: ScriptId;
+            /**
+             * URL of the exception location, to be used when the script was not reported.
+             */
+            url?: string;
+            /**
+             * JavaScript stack trace if available.
+             */
+            stackTrace?: StackTrace;
+            /**
+             * Exception object if available.
+             */
+            exception?: RemoteObject;
+            /**
+             * Identifier of the context where exception happened.
+             */
+            executionContextId?: ExecutionContextId;
+        }
+        /**
+         * Number of milliseconds since epoch.
+         */
+        export type Timestamp = number;
+        /**
+         * Number of milliseconds.
+         */
+        export type TimeDelta = number;
+        /**
+         * Stack entry for runtime errors and assertions.
+         */
+        export interface CallFrame {
+            /**
+             * JavaScript function name.
+             */
+            functionName: string;
+            /**
+             * JavaScript script id.
+             */
+            scriptId: ScriptId;
+            /**
+             * JavaScript script name or url.
+             */
+            url: string;
+            /**
+             * JavaScript script line number (0-based).
+             */
+            lineNumber: number;
+            /**
+             * JavaScript script column number (0-based).
+             */
+            columnNumber: number;
+        }
+        /**
+         * Call frames for assertions or error messages.
+         */
+        export interface StackTrace {
+            /**
+             * String label of this stack trace. For async traces this may be a name of the function that
+initiated the async call.
+             */
+            description?: string;
+            /**
+             * JavaScript function name.
+             */
+            callFrames: CallFrame[];
+            /**
+             * Asynchronous JavaScript stack trace that preceded this stack, if available.
+             */
+            parent?: StackTrace;
+            /**
+             * Asynchronous JavaScript stack trace that preceded this stack, if available.
+             */
+            parentId?: StackTraceId;
+        }
+        /**
+         * Unique identifier of current debugger.
+         */
+        export type UniqueDebuggerId = string;
+        /**
+         * If `debuggerId` is set stack trace comes from another debugger and can be resolved there. This
+allows to track cross-debugger calls. See `Runtime.StackTrace` and `Debugger.paused` for usages.
+         */
+        export interface StackTraceId {
+            id: string;
+            debuggerId?: UniqueDebuggerId;
+        }
+        
+        /**
+         * Notification is issued every time when binding is called.
+         */
+        export type bindingCalledPayload = {
+            name: string;
+            payload: string;
+            /**
+             * Identifier of the context where the call was made.
+             */
+            executionContextId: ExecutionContextId;
+        }
+        /**
+         * Issued when console API was called.
+         */
+        export type consoleAPICalledPayload = {
+            /**
+             * Type of the call.
+             */
+            type: "log"|"debug"|"info"|"error"|"warning"|"dir"|"dirxml"|"table"|"trace"|"clear"|"startGroup"|"startGroupCollapsed"|"endGroup"|"assert"|"profile"|"profileEnd"|"count"|"timeEnd";
+            /**
+             * Call arguments.
+             */
+            args: RemoteObject[];
+            /**
+             * Identifier of the context where the call was made.
+             */
+            executionContextId: ExecutionContextId;
+            /**
+             * Call timestamp.
+             */
+            timestamp: Timestamp;
+            /**
+             * Stack trace captured when the call was made. The async stack chain is automatically reported for
+the following call types: `assert`, `error`, `trace`, `warning`. For other types the async call
+chain can be retrieved using `Debugger.getStackTrace` and `stackTrace.parentId` field.
+             */
+            stackTrace?: StackTrace;
+            /**
+             * Console context descriptor for calls on non-default console context (not console.*):
+'anonymous#unique-logger-id' for call on unnamed context, 'name#unique-logger-id' for call
+on named context.
+             */
+            context?: string;
+        }
+        /**
+         * Issued when unhandled exception was revoked.
+         */
+        export type exceptionRevokedPayload = {
+            /**
+             * Reason describing why exception was revoked.
+             */
+            reason: string;
+            /**
+             * The id of revoked exception, as reported in `exceptionThrown`.
+             */
+            exceptionId: number;
+        }
+        /**
+         * Issued when exception was thrown and unhandled.
+         */
+        export type exceptionThrownPayload = {
+            /**
+             * Timestamp of the exception.
+             */
+            timestamp: Timestamp;
+            exceptionDetails: ExceptionDetails;
+        }
+        /**
+         * Issued when new execution context is created.
+         */
+        export type executionContextCreatedPayload = {
+            /**
+             * A newly created execution context.
+             */
+            context: ExecutionContextDescription;
+        }
+        /**
+         * Issued when execution context is destroyed.
+         */
+        export type executionContextDestroyedPayload = {
+            /**
+             * Id of the destroyed context
+             */
+            executionContextId: ExecutionContextId;
+        }
+        /**
+         * Issued when all executionContexts were cleared in browser
+         */
+        export type executionContextsClearedPayload = void;
+        /**
+         * Issued when object should be inspected (for example, as a result of inspect() command line API
+call).
+         */
+        export type inspectRequestedPayload = {
+            object: RemoteObject;
+            hints: object;
+        }
+        
+        /**
+         * Add handler to promise with given promise object id.
+         */
+        export type awaitPromiseParameters = {
+            /**
+             * Identifier of the promise.
+             */
+            promiseObjectId: RemoteObjectId;
+            /**
+             * Whether the result is expected to be a JSON object that should be sent by value.
+             */
+            returnByValue?: boolean;
+            /**
+             * Whether preview should be generated for the result.
+             */
+            generatePreview?: boolean;
+        }
+        export type awaitPromiseReturnValue = {
+            /**
+             * Promise result. Will contain rejected value if promise was rejected.
+             */
+            result: RemoteObject;
+            /**
+             * Exception details if stack strace is available.
+             */
+            exceptionDetails?: ExceptionDetails;
+        }
+        /**
+         * Calls function with given declaration on the given object. Object group of the result is
+inherited from the target object.
+         */
+        export type callFunctionOnParameters = {
+            /**
+             * Declaration of the function to call.
+             */
+            functionDeclaration: string;
+            /**
+             * Identifier of the object to call function on. Either objectId or executionContextId should
+be specified.
+             */
+            objectId?: RemoteObjectId;
+            /**
+             * Call arguments. All call arguments must belong to the same JavaScript world as the target
+object.
+             */
+            arguments?: CallArgument[];
+            /**
+             * In silent mode exceptions thrown during evaluation are not reported and do not pause
+execution. Overrides `setPauseOnException` state.
+             */
+            silent?: boolean;
+            /**
+             * Whether the result is expected to be a JSON object which should be sent by value.
+             */
+            returnByValue?: boolean;
+            /**
+             * Whether preview should be generated for the result.
+             */
+            generatePreview?: boolean;
+            /**
+             * Whether execution should be treated as initiated by user in the UI.
+             */
+            userGesture?: boolean;
+            /**
+             * Whether execution should `await` for resulting value and return once awaited promise is
+resolved.
+             */
+            awaitPromise?: boolean;
+            /**
+             * Specifies execution context which global object will be used to call function on. Either
+executionContextId or objectId should be specified.
+             */
+            executionContextId?: ExecutionContextId;
+            /**
+             * Symbolic group name that can be used to release multiple objects. If objectGroup is not
+specified and objectId is, objectGroup will be inherited from object.
+             */
+            objectGroup?: string;
+        }
+        export type callFunctionOnReturnValue = {
+            /**
+             * Call result.
+             */
+            result: RemoteObject;
+            /**
+             * Exception details.
+             */
+            exceptionDetails?: ExceptionDetails;
+        }
+        /**
+         * Compiles expression.
+         */
+        export type compileScriptParameters = {
+            /**
+             * Expression to compile.
+             */
+            expression: string;
+            /**
+             * Source url to be set for the script.
+             */
+            sourceURL: string;
+            /**
+             * Specifies whether the compiled script should be persisted.
+             */
+            persistScript: boolean;
+            /**
+             * Specifies in which execution context to perform script run. If the parameter is omitted the
+evaluation will be performed in the context of the inspected page.
+             */
+            executionContextId?: ExecutionContextId;
+        }
+        export type compileScriptReturnValue = {
+            /**
+             * Id of the script.
+             */
+            scriptId?: ScriptId;
+            /**
+             * Exception details.
+             */
+            exceptionDetails?: ExceptionDetails;
+        }
+        /**
+         * Disables reporting of execution contexts creation.
+         */
+        export type disableParameters = {
+        }
+        export type disableReturnValue = {
+        }
+        /**
+         * Discards collected exceptions and console API calls.
+         */
+        export type discardConsoleEntriesParameters = {
+        }
+        export type discardConsoleEntriesReturnValue = {
+        }
+        /**
+         * Enables reporting of execution contexts creation by means of `executionContextCreated` event.
+When the reporting gets enabled the event will be sent immediately for each existing execution
+context.
+         */
+        export type enableParameters = {
+        }
+        export type enableReturnValue = {
+        }
+        /**
+         * Evaluates expression on global object.
+         */
+        export type evaluateParameters = {
+            /**
+             * Expression to evaluate.
+             */
+            expression: string;
+            /**
+             * Symbolic group name that can be used to release multiple objects.
+             */
+            objectGroup?: string;
+            /**
+             * Determines whether Command Line API should be available during the evaluation.
+             */
+            includeCommandLineAPI?: boolean;
+            /**
+             * In silent mode exceptions thrown during evaluation are not reported and do not pause
+execution. Overrides `setPauseOnException` state.
+             */
+            silent?: boolean;
+            /**
+             * Specifies in which execution context to perform evaluation. If the parameter is omitted the
+evaluation will be performed in the context of the inspected page.
+             */
+            contextId?: ExecutionContextId;
+            /**
+             * Whether the result is expected to be a JSON object that should be sent by value.
+             */
+            returnByValue?: boolean;
+            /**
+             * Whether preview should be generated for the result.
+             */
+            generatePreview?: boolean;
+            /**
+             * Whether execution should be treated as initiated by user in the UI.
+             */
+            userGesture?: boolean;
+            /**
+             * Whether execution should `await` for resulting value and return once awaited promise is
+resolved.
+             */
+            awaitPromise?: boolean;
+            /**
+             * Whether to throw an exception if side effect cannot be ruled out during evaluation.
+This implies `disableBreaks` below.
+             */
+            throwOnSideEffect?: boolean;
+            /**
+             * Terminate execution after timing out (number of milliseconds).
+             */
+            timeout?: TimeDelta;
+            /**
+             * Disable breakpoints during execution.
+             */
+            disableBreaks?: boolean;
+            /**
+             * Reserved flag for future REPL mode support. Setting this flag has currently no effect.
+             */
+            replMode?: boolean;
+        }
+        export type evaluateReturnValue = {
+            /**
+             * Evaluation result.
+             */
+            result: RemoteObject;
+            /**
+             * Exception details.
+             */
+            exceptionDetails?: ExceptionDetails;
+        }
+        /**
+         * Returns the isolate id.
+         */
+        export type getIsolateIdParameters = {
+        }
+        export type getIsolateIdReturnValue = {
+            /**
+             * The isolate id.
+             */
+            id: string;
+        }
+        /**
+         * Returns the JavaScript heap usage.
+It is the total usage of the corresponding isolate not scoped to a particular Runtime.
+         */
+        export type getHeapUsageParameters = {
+        }
+        export type getHeapUsageReturnValue = {
+            /**
+             * Used heap size in bytes.
+             */
+            usedSize: number;
+            /**
+             * Allocated heap size in bytes.
+             */
+            totalSize: number;
+        }
+        /**
+         * Returns properties of a given object. Object group of the result is inherited from the target
+object.
+         */
+        export type getPropertiesParameters = {
+            /**
+             * Identifier of the object to return properties for.
+             */
+            objectId: RemoteObjectId;
+            /**
+             * If true, returns properties belonging only to the element itself, not to its prototype
+chain.
+             */
+            ownProperties?: boolean;
+            /**
+             * If true, returns accessor properties (with getter/setter) only; internal properties are not
+returned either.
+             */
+            accessorPropertiesOnly?: boolean;
+            /**
+             * Whether preview should be generated for the results.
+             */
+            generatePreview?: boolean;
+        }
+        export type getPropertiesReturnValue = {
+            /**
+             * Object properties.
+             */
+            result: PropertyDescriptor[];
+            /**
+             * Internal object properties (only of the element itself).
+             */
+            internalProperties?: InternalPropertyDescriptor[];
+            /**
+             * Object private properties.
+             */
+            privateProperties?: PrivatePropertyDescriptor[];
+            /**
+             * Exception details.
+             */
+            exceptionDetails?: ExceptionDetails;
+        }
+        /**
+         * Returns all let, const and class variables from global scope.
+         */
+        export type globalLexicalScopeNamesParameters = {
+            /**
+             * Specifies in which execution context to lookup global scope variables.
+             */
+            executionContextId?: ExecutionContextId;
+        }
+        export type globalLexicalScopeNamesReturnValue = {
+            names: string[];
+        }
+        export type queryObjectsParameters = {
+            /**
+             * Identifier of the prototype to return objects for.
+             */
+            prototypeObjectId: RemoteObjectId;
+            /**
+             * Symbolic group name that can be used to release the results.
+             */
+            objectGroup?: string;
+        }
+        export type queryObjectsReturnValue = {
+            /**
+             * Array with objects.
+             */
+            objects: RemoteObject;
+        }
+        /**
+         * Releases remote object with given id.
+         */
+        export type releaseObjectParameters = {
+            /**
+             * Identifier of the object to release.
+             */
+            objectId: RemoteObjectId;
+        }
+        export type releaseObjectReturnValue = {
+        }
+        /**
+         * Releases all remote objects that belong to a given group.
+         */
+        export type releaseObjectGroupParameters = {
+            /**
+             * Symbolic object group name.
+             */
+            objectGroup: string;
+        }
+        export type releaseObjectGroupReturnValue = {
+        }
+        /**
+         * Tells inspected instance to run if it was waiting for debugger to attach.
+         */
+        export type runIfWaitingForDebuggerParameters = {
+        }
+        export type runIfWaitingForDebuggerReturnValue = {
+        }
+        /**
+         * Runs script with given id in a given context.
+         */
+        export type runScriptParameters = {
+            /**
+             * Id of the script to run.
+             */
+            scriptId: ScriptId;
+            /**
+             * Specifies in which execution context to perform script run. If the parameter is omitted the
+evaluation will be performed in the context of the inspected page.
+             */
+            executionContextId?: ExecutionContextId;
+            /**
+             * Symbolic group name that can be used to release multiple objects.
+             */
+            objectGroup?: string;
+            /**
+             * In silent mode exceptions thrown during evaluation are not reported and do not pause
+execution. Overrides `setPauseOnException` state.
+             */
+            silent?: boolean;
+            /**
+             * Determines whether Command Line API should be available during the evaluation.
+             */
+            includeCommandLineAPI?: boolean;
+            /**
+             * Whether the result is expected to be a JSON object which should be sent by value.
+             */
+            returnByValue?: boolean;
+            /**
+             * Whether preview should be generated for the result.
+             */
+            generatePreview?: boolean;
+            /**
+             * Whether execution should `await` for resulting value and return once awaited promise is
+resolved.
+             */
+            awaitPromise?: boolean;
+        }
+        export type runScriptReturnValue = {
+            /**
+             * Run result.
+             */
+            result: RemoteObject;
+            /**
+             * Exception details.
+             */
+            exceptionDetails?: ExceptionDetails;
+        }
+        /**
+         * Enables or disables async call stacks tracking.
+         */
+        export type setAsyncCallStackDepthParameters = {
+            /**
+             * Maximum depth of async call stacks. Setting to `0` will effectively disable collecting async
+call stacks (default).
+             */
+            maxDepth: number;
+        }
+        export type setAsyncCallStackDepthReturnValue = {
+        }
+        export type setCustomObjectFormatterEnabledParameters = {
+            enabled: boolean;
+        }
+        export type setCustomObjectFormatterEnabledReturnValue = {
+        }
+        export type setMaxCallStackSizeToCaptureParameters = {
+            size: number;
+        }
+        export type setMaxCallStackSizeToCaptureReturnValue = {
+        }
+        /**
+         * Terminate current or next JavaScript execution.
+Will cancel the termination when the outer-most script execution ends.
+         */
+        export type terminateExecutionParameters = {
+        }
+        export type terminateExecutionReturnValue = {
+        }
+        /**
+         * If executionContextId is empty, adds binding with the given name on the
+global objects of all inspected contexts, including those created later,
+bindings survive reloads.
+If executionContextId is specified, adds binding only on global object of
+given execution context.
+Binding function takes exactly one argument, this argument should be string,
+in case of any other input, function throws an exception.
+Each binding function call produces Runtime.bindingCalled notification.
+         */
+        export type addBindingParameters = {
+            name: string;
+            executionContextId?: ExecutionContextId;
+        }
+        export type addBindingReturnValue = {
+        }
+        /**
+         * This method does not remove binding function from global object but
+unsubscribes current runtime agent from Runtime.bindingCalled notifications.
+         */
+        export type removeBindingParameters = {
+            name: string;
+        }
+        export type removeBindingReturnValue = {
+        }
+    }
+    
+    /**
+     * This domain is deprecated.
+     */
+    export module Schema {
+        /**
+         * Description of the protocol domain.
+         */
+        export interface Domain {
+            /**
+             * Domain name.
+             */
+            name: string;
+            /**
+             * Domain version.
+             */
+            version: string;
+        }
+        
+        
+        /**
+         * Returns supported domains.
+         */
+        export type getDomainsParameters = {
+        }
+        export type getDomainsReturnValue = {
+            /**
+             * List of supported domains.
+             */
+            domains: Domain[];
+        }
+    }
+    
+    export interface Events {
+      "Animation.animationCanceled": Animation.animationCanceledPayload;
+      "Animation.animationCreated": Animation.animationCreatedPayload;
+      "Animation.animationStarted": Animation.animationStartedPayload;
+      "ApplicationCache.applicationCacheStatusUpdated": ApplicationCache.applicationCacheStatusUpdatedPayload;
+      "ApplicationCache.networkStateUpdated": ApplicationCache.networkStateUpdatedPayload;
+      "BackgroundService.recordingStateChanged": BackgroundService.recordingStateChangedPayload;
+      "BackgroundService.backgroundServiceEventReceived": BackgroundService.backgroundServiceEventReceivedPayload;
+      "CSS.fontsUpdated": CSS.fontsUpdatedPayload;
+      "CSS.mediaQueryResultChanged": CSS.mediaQueryResultChangedPayload;
+      "CSS.styleSheetAdded": CSS.styleSheetAddedPayload;
+      "CSS.styleSheetChanged": CSS.styleSheetChangedPayload;
+      "CSS.styleSheetRemoved": CSS.styleSheetRemovedPayload;
+      "Cast.sinksUpdated": Cast.sinksUpdatedPayload;
+      "Cast.issueUpdated": Cast.issueUpdatedPayload;
+      "DOM.attributeModified": DOM.attributeModifiedPayload;
+      "DOM.attributeRemoved": DOM.attributeRemovedPayload;
+      "DOM.characterDataModified": DOM.characterDataModifiedPayload;
+      "DOM.childNodeCountUpdated": DOM.childNodeCountUpdatedPayload;
+      "DOM.childNodeInserted": DOM.childNodeInsertedPayload;
+      "DOM.childNodeRemoved": DOM.childNodeRemovedPayload;
+      "DOM.distributedNodesUpdated": DOM.distributedNodesUpdatedPayload;
+      "DOM.documentUpdated": DOM.documentUpdatedPayload;
+      "DOM.inlineStyleInvalidated": DOM.inlineStyleInvalidatedPayload;
+      "DOM.pseudoElementAdded": DOM.pseudoElementAddedPayload;
+      "DOM.pseudoElementRemoved": DOM.pseudoElementRemovedPayload;
+      "DOM.setChildNodes": DOM.setChildNodesPayload;
+      "DOM.shadowRootPopped": DOM.shadowRootPoppedPayload;
+      "DOM.shadowRootPushed": DOM.shadowRootPushedPayload;
+      "DOMStorage.domStorageItemAdded": DOMStorage.domStorageItemAddedPayload;
+      "DOMStorage.domStorageItemRemoved": DOMStorage.domStorageItemRemovedPayload;
+      "DOMStorage.domStorageItemUpdated": DOMStorage.domStorageItemUpdatedPayload;
+      "DOMStorage.domStorageItemsCleared": DOMStorage.domStorageItemsClearedPayload;
+      "Database.addDatabase": Database.addDatabasePayload;
+      "Emulation.virtualTimeBudgetExpired": Emulation.virtualTimeBudgetExpiredPayload;
+      "HeadlessExperimental.needsBeginFramesChanged": HeadlessExperimental.needsBeginFramesChangedPayload;
+      "Inspector.detached": Inspector.detachedPayload;
+      "Inspector.targetCrashed": Inspector.targetCrashedPayload;
+      "Inspector.targetReloadedAfterCrash": Inspector.targetReloadedAfterCrashPayload;
+      "LayerTree.layerPainted": LayerTree.layerPaintedPayload;
+      "LayerTree.layerTreeDidChange": LayerTree.layerTreeDidChangePayload;
+      "Log.entryAdded": Log.entryAddedPayload;
+      "Network.dataReceived": Network.dataReceivedPayload;
+      "Network.eventSourceMessageReceived": Network.eventSourceMessageReceivedPayload;
+      "Network.loadingFailed": Network.loadingFailedPayload;
+      "Network.loadingFinished": Network.loadingFinishedPayload;
+      "Network.requestIntercepted": Network.requestInterceptedPayload;
+      "Network.requestServedFromCache": Network.requestServedFromCachePayload;
+      "Network.requestWillBeSent": Network.requestWillBeSentPayload;
+      "Network.resourceChangedPriority": Network.resourceChangedPriorityPayload;
+      "Network.signedExchangeReceived": Network.signedExchangeReceivedPayload;
+      "Network.responseReceived": Network.responseReceivedPayload;
+      "Network.webSocketClosed": Network.webSocketClosedPayload;
+      "Network.webSocketCreated": Network.webSocketCreatedPayload;
+      "Network.webSocketFrameError": Network.webSocketFrameErrorPayload;
+      "Network.webSocketFrameReceived": Network.webSocketFrameReceivedPayload;
+      "Network.webSocketFrameSent": Network.webSocketFrameSentPayload;
+      "Network.webSocketHandshakeResponseReceived": Network.webSocketHandshakeResponseReceivedPayload;
+      "Network.webSocketWillSendHandshakeRequest": Network.webSocketWillSendHandshakeRequestPayload;
+      "Network.requestWillBeSentExtraInfo": Network.requestWillBeSentExtraInfoPayload;
+      "Network.responseReceivedExtraInfo": Network.responseReceivedExtraInfoPayload;
+      "Overlay.inspectNodeRequested": Overlay.inspectNodeRequestedPayload;
+      "Overlay.nodeHighlightRequested": Overlay.nodeHighlightRequestedPayload;
+      "Overlay.screenshotRequested": Overlay.screenshotRequestedPayload;
+      "Overlay.inspectModeCanceled": Overlay.inspectModeCanceledPayload;
+      "Page.domContentEventFired": Page.domContentEventFiredPayload;
+      "Page.fileChooserOpened": Page.fileChooserOpenedPayload;
+      "Page.frameAttached": Page.frameAttachedPayload;
+      "Page.frameClearedScheduledNavigation": Page.frameClearedScheduledNavigationPayload;
+      "Page.frameDetached": Page.frameDetachedPayload;
+      "Page.frameNavigated": Page.frameNavigatedPayload;
+      "Page.frameResized": Page.frameResizedPayload;
+      "Page.frameRequestedNavigation": Page.frameRequestedNavigationPayload;
+      "Page.frameScheduledNavigation": Page.frameScheduledNavigationPayload;
+      "Page.frameStartedLoading": Page.frameStartedLoadingPayload;
+      "Page.frameStoppedLoading": Page.frameStoppedLoadingPayload;
+      "Page.downloadWillBegin": Page.downloadWillBeginPayload;
+      "Page.interstitialHidden": Page.interstitialHiddenPayload;
+      "Page.interstitialShown": Page.interstitialShownPayload;
+      "Page.javascriptDialogClosed": Page.javascriptDialogClosedPayload;
+      "Page.javascriptDialogOpening": Page.javascriptDialogOpeningPayload;
+      "Page.lifecycleEvent": Page.lifecycleEventPayload;
+      "Page.loadEventFired": Page.loadEventFiredPayload;
+      "Page.navigatedWithinDocument": Page.navigatedWithinDocumentPayload;
+      "Page.screencastFrame": Page.screencastFramePayload;
+      "Page.screencastVisibilityChanged": Page.screencastVisibilityChangedPayload;
+      "Page.windowOpen": Page.windowOpenPayload;
+      "Page.compilationCacheProduced": Page.compilationCacheProducedPayload;
+      "Performance.metrics": Performance.metricsPayload;
+      "Security.certificateError": Security.certificateErrorPayload;
+      "Security.visibleSecurityStateChanged": Security.visibleSecurityStateChangedPayload;
+      "Security.securityStateChanged": Security.securityStateChangedPayload;
+      "ServiceWorker.workerErrorReported": ServiceWorker.workerErrorReportedPayload;
+      "ServiceWorker.workerRegistrationUpdated": ServiceWorker.workerRegistrationUpdatedPayload;
+      "ServiceWorker.workerVersionUpdated": ServiceWorker.workerVersionUpdatedPayload;
+      "Storage.cacheStorageContentUpdated": Storage.cacheStorageContentUpdatedPayload;
+      "Storage.cacheStorageListUpdated": Storage.cacheStorageListUpdatedPayload;
+      "Storage.indexedDBContentUpdated": Storage.indexedDBContentUpdatedPayload;
+      "Storage.indexedDBListUpdated": Storage.indexedDBListUpdatedPayload;
+      "Target.attachedToTarget": Target.attachedToTargetPayload;
+      "Target.detachedFromTarget": Target.detachedFromTargetPayload;
+      "Target.receivedMessageFromTarget": Target.receivedMessageFromTargetPayload;
+      "Target.targetCreated": Target.targetCreatedPayload;
+      "Target.targetDestroyed": Target.targetDestroyedPayload;
+      "Target.targetCrashed": Target.targetCrashedPayload;
+      "Target.targetInfoChanged": Target.targetInfoChangedPayload;
+      "Tethering.accepted": Tethering.acceptedPayload;
+      "Tracing.bufferUsage": Tracing.bufferUsagePayload;
+      "Tracing.dataCollected": Tracing.dataCollectedPayload;
+      "Tracing.tracingComplete": Tracing.tracingCompletePayload;
+      "Fetch.requestPaused": Fetch.requestPausedPayload;
+      "Fetch.authRequired": Fetch.authRequiredPayload;
+      "WebAudio.contextCreated": WebAudio.contextCreatedPayload;
+      "WebAudio.contextWillBeDestroyed": WebAudio.contextWillBeDestroyedPayload;
+      "WebAudio.contextChanged": WebAudio.contextChangedPayload;
+      "WebAudio.audioListenerCreated": WebAudio.audioListenerCreatedPayload;
+      "WebAudio.audioListenerWillBeDestroyed": WebAudio.audioListenerWillBeDestroyedPayload;
+      "WebAudio.audioNodeCreated": WebAudio.audioNodeCreatedPayload;
+      "WebAudio.audioNodeWillBeDestroyed": WebAudio.audioNodeWillBeDestroyedPayload;
+      "WebAudio.audioParamCreated": WebAudio.audioParamCreatedPayload;
+      "WebAudio.audioParamWillBeDestroyed": WebAudio.audioParamWillBeDestroyedPayload;
+      "WebAudio.nodesConnected": WebAudio.nodesConnectedPayload;
+      "WebAudio.nodesDisconnected": WebAudio.nodesDisconnectedPayload;
+      "WebAudio.nodeParamConnected": WebAudio.nodeParamConnectedPayload;
+      "WebAudio.nodeParamDisconnected": WebAudio.nodeParamDisconnectedPayload;
+      "Media.playerPropertiesChanged": Media.playerPropertiesChangedPayload;
+      "Media.playerEventsAdded": Media.playerEventsAddedPayload;
+      "Media.playersCreated": Media.playersCreatedPayload;
+      "Console.messageAdded": Console.messageAddedPayload;
+      "Debugger.breakpointResolved": Debugger.breakpointResolvedPayload;
+      "Debugger.paused": Debugger.pausedPayload;
+      "Debugger.resumed": Debugger.resumedPayload;
+      "Debugger.scriptFailedToParse": Debugger.scriptFailedToParsePayload;
+      "Debugger.scriptParsed": Debugger.scriptParsedPayload;
+      "HeapProfiler.addHeapSnapshotChunk": HeapProfiler.addHeapSnapshotChunkPayload;
+      "HeapProfiler.heapStatsUpdate": HeapProfiler.heapStatsUpdatePayload;
+      "HeapProfiler.lastSeenObjectId": HeapProfiler.lastSeenObjectIdPayload;
+      "HeapProfiler.reportHeapSnapshotProgress": HeapProfiler.reportHeapSnapshotProgressPayload;
+      "HeapProfiler.resetProfiles": HeapProfiler.resetProfilesPayload;
+      "Profiler.consoleProfileFinished": Profiler.consoleProfileFinishedPayload;
+      "Profiler.consoleProfileStarted": Profiler.consoleProfileStartedPayload;
+      "Profiler.preciseCoverageDeltaUpdate": Profiler.preciseCoverageDeltaUpdatePayload;
+      "Runtime.bindingCalled": Runtime.bindingCalledPayload;
+      "Runtime.consoleAPICalled": Runtime.consoleAPICalledPayload;
+      "Runtime.exceptionRevoked": Runtime.exceptionRevokedPayload;
+      "Runtime.exceptionThrown": Runtime.exceptionThrownPayload;
+      "Runtime.executionContextCreated": Runtime.executionContextCreatedPayload;
+      "Runtime.executionContextDestroyed": Runtime.executionContextDestroyedPayload;
+      "Runtime.executionContextsCleared": Runtime.executionContextsClearedPayload;
+      "Runtime.inspectRequested": Runtime.inspectRequestedPayload;
+    }
+    export interface CommandParameters {
+      "Accessibility.disable": Accessibility.disableParameters;
+      "Accessibility.enable": Accessibility.enableParameters;
+      "Accessibility.getPartialAXTree": Accessibility.getPartialAXTreeParameters;
+      "Accessibility.getFullAXTree": Accessibility.getFullAXTreeParameters;
+      "Animation.disable": Animation.disableParameters;
+      "Animation.enable": Animation.enableParameters;
+      "Animation.getCurrentTime": Animation.getCurrentTimeParameters;
+      "Animation.getPlaybackRate": Animation.getPlaybackRateParameters;
+      "Animation.releaseAnimations": Animation.releaseAnimationsParameters;
+      "Animation.resolveAnimation": Animation.resolveAnimationParameters;
+      "Animation.seekAnimations": Animation.seekAnimationsParameters;
+      "Animation.setPaused": Animation.setPausedParameters;
+      "Animation.setPlaybackRate": Animation.setPlaybackRateParameters;
+      "Animation.setTiming": Animation.setTimingParameters;
+      "ApplicationCache.enable": ApplicationCache.enableParameters;
+      "ApplicationCache.getApplicationCacheForFrame": ApplicationCache.getApplicationCacheForFrameParameters;
+      "ApplicationCache.getFramesWithManifests": ApplicationCache.getFramesWithManifestsParameters;
+      "ApplicationCache.getManifestForFrame": ApplicationCache.getManifestForFrameParameters;
+      "Audits.getEncodedResponse": Audits.getEncodedResponseParameters;
+      "BackgroundService.startObserving": BackgroundService.startObservingParameters;
+      "BackgroundService.stopObserving": BackgroundService.stopObservingParameters;
+      "BackgroundService.setRecording": BackgroundService.setRecordingParameters;
+      "BackgroundService.clearEvents": BackgroundService.clearEventsParameters;
+      "Browser.setPermission": Browser.setPermissionParameters;
+      "Browser.grantPermissions": Browser.grantPermissionsParameters;
+      "Browser.resetPermissions": Browser.resetPermissionsParameters;
+      "Browser.close": Browser.closeParameters;
+      "Browser.crash": Browser.crashParameters;
+      "Browser.crashGpuProcess": Browser.crashGpuProcessParameters;
+      "Browser.getVersion": Browser.getVersionParameters;
+      "Browser.getBrowserCommandLine": Browser.getBrowserCommandLineParameters;
+      "Browser.getHistograms": Browser.getHistogramsParameters;
+      "Browser.getHistogram": Browser.getHistogramParameters;
+      "Browser.getWindowBounds": Browser.getWindowBoundsParameters;
+      "Browser.getWindowForTarget": Browser.getWindowForTargetParameters;
+      "Browser.setWindowBounds": Browser.setWindowBoundsParameters;
+      "Browser.setDockTile": Browser.setDockTileParameters;
+      "CSS.addRule": CSS.addRuleParameters;
+      "CSS.collectClassNames": CSS.collectClassNamesParameters;
+      "CSS.createStyleSheet": CSS.createStyleSheetParameters;
+      "CSS.disable": CSS.disableParameters;
+      "CSS.enable": CSS.enableParameters;
+      "CSS.forcePseudoState": CSS.forcePseudoStateParameters;
+      "CSS.getBackgroundColors": CSS.getBackgroundColorsParameters;
+      "CSS.getComputedStyleForNode": CSS.getComputedStyleForNodeParameters;
+      "CSS.getInlineStylesForNode": CSS.getInlineStylesForNodeParameters;
+      "CSS.getMatchedStylesForNode": CSS.getMatchedStylesForNodeParameters;
+      "CSS.getMediaQueries": CSS.getMediaQueriesParameters;
+      "CSS.getPlatformFontsForNode": CSS.getPlatformFontsForNodeParameters;
+      "CSS.getStyleSheetText": CSS.getStyleSheetTextParameters;
+      "CSS.setEffectivePropertyValueForNode": CSS.setEffectivePropertyValueForNodeParameters;
+      "CSS.setKeyframeKey": CSS.setKeyframeKeyParameters;
+      "CSS.setMediaText": CSS.setMediaTextParameters;
+      "CSS.setRuleSelector": CSS.setRuleSelectorParameters;
+      "CSS.setStyleSheetText": CSS.setStyleSheetTextParameters;
+      "CSS.setStyleTexts": CSS.setStyleTextsParameters;
+      "CSS.startRuleUsageTracking": CSS.startRuleUsageTrackingParameters;
+      "CSS.stopRuleUsageTracking": CSS.stopRuleUsageTrackingParameters;
+      "CSS.takeCoverageDelta": CSS.takeCoverageDeltaParameters;
+      "CacheStorage.deleteCache": CacheStorage.deleteCacheParameters;
+      "CacheStorage.deleteEntry": CacheStorage.deleteEntryParameters;
+      "CacheStorage.requestCacheNames": CacheStorage.requestCacheNamesParameters;
+      "CacheStorage.requestCachedResponse": CacheStorage.requestCachedResponseParameters;
+      "CacheStorage.requestEntries": CacheStorage.requestEntriesParameters;
+      "Cast.enable": Cast.enableParameters;
+      "Cast.disable": Cast.disableParameters;
+      "Cast.setSinkToUse": Cast.setSinkToUseParameters;
+      "Cast.startTabMirroring": Cast.startTabMirroringParameters;
+      "Cast.stopCasting": Cast.stopCastingParameters;
+      "DOM.collectClassNamesFromSubtree": DOM.collectClassNamesFromSubtreeParameters;
+      "DOM.copyTo": DOM.copyToParameters;
+      "DOM.describeNode": DOM.describeNodeParameters;
+      "DOM.disable": DOM.disableParameters;
+      "DOM.discardSearchResults": DOM.discardSearchResultsParameters;
+      "DOM.enable": DOM.enableParameters;
+      "DOM.focus": DOM.focusParameters;
+      "DOM.getAttributes": DOM.getAttributesParameters;
+      "DOM.getBoxModel": DOM.getBoxModelParameters;
+      "DOM.getContentQuads": DOM.getContentQuadsParameters;
+      "DOM.getDocument": DOM.getDocumentParameters;
+      "DOM.getFlattenedDocument": DOM.getFlattenedDocumentParameters;
+      "DOM.getNodeForLocation": DOM.getNodeForLocationParameters;
+      "DOM.getOuterHTML": DOM.getOuterHTMLParameters;
+      "DOM.getRelayoutBoundary": DOM.getRelayoutBoundaryParameters;
+      "DOM.getSearchResults": DOM.getSearchResultsParameters;
+      "DOM.hideHighlight": DOM.hideHighlightParameters;
+      "DOM.highlightNode": DOM.highlightNodeParameters;
+      "DOM.highlightRect": DOM.highlightRectParameters;
+      "DOM.markUndoableState": DOM.markUndoableStateParameters;
+      "DOM.moveTo": DOM.moveToParameters;
+      "DOM.performSearch": DOM.performSearchParameters;
+      "DOM.pushNodeByPathToFrontend": DOM.pushNodeByPathToFrontendParameters;
+      "DOM.pushNodesByBackendIdsToFrontend": DOM.pushNodesByBackendIdsToFrontendParameters;
+      "DOM.querySelector": DOM.querySelectorParameters;
+      "DOM.querySelectorAll": DOM.querySelectorAllParameters;
+      "DOM.redo": DOM.redoParameters;
+      "DOM.removeAttribute": DOM.removeAttributeParameters;
+      "DOM.removeNode": DOM.removeNodeParameters;
+      "DOM.requestChildNodes": DOM.requestChildNodesParameters;
+      "DOM.requestNode": DOM.requestNodeParameters;
+      "DOM.resolveNode": DOM.resolveNodeParameters;
+      "DOM.setAttributeValue": DOM.setAttributeValueParameters;
+      "DOM.setAttributesAsText": DOM.setAttributesAsTextParameters;
+      "DOM.setFileInputFiles": DOM.setFileInputFilesParameters;
+      "DOM.setNodeStackTracesEnabled": DOM.setNodeStackTracesEnabledParameters;
+      "DOM.getNodeStackTraces": DOM.getNodeStackTracesParameters;
+      "DOM.getFileInfo": DOM.getFileInfoParameters;
+      "DOM.setInspectedNode": DOM.setInspectedNodeParameters;
+      "DOM.setNodeName": DOM.setNodeNameParameters;
+      "DOM.setNodeValue": DOM.setNodeValueParameters;
+      "DOM.setOuterHTML": DOM.setOuterHTMLParameters;
+      "DOM.undo": DOM.undoParameters;
+      "DOM.getFrameOwner": DOM.getFrameOwnerParameters;
+      "DOMDebugger.getEventListeners": DOMDebugger.getEventListenersParameters;
+      "DOMDebugger.removeDOMBreakpoint": DOMDebugger.removeDOMBreakpointParameters;
+      "DOMDebugger.removeEventListenerBreakpoint": DOMDebugger.removeEventListenerBreakpointParameters;
+      "DOMDebugger.removeInstrumentationBreakpoint": DOMDebugger.removeInstrumentationBreakpointParameters;
+      "DOMDebugger.removeXHRBreakpoint": DOMDebugger.removeXHRBreakpointParameters;
+      "DOMDebugger.setDOMBreakpoint": DOMDebugger.setDOMBreakpointParameters;
+      "DOMDebugger.setEventListenerBreakpoint": DOMDebugger.setEventListenerBreakpointParameters;
+      "DOMDebugger.setInstrumentationBreakpoint": DOMDebugger.setInstrumentationBreakpointParameters;
+      "DOMDebugger.setXHRBreakpoint": DOMDebugger.setXHRBreakpointParameters;
+      "DOMSnapshot.disable": DOMSnapshot.disableParameters;
+      "DOMSnapshot.enable": DOMSnapshot.enableParameters;
+      "DOMSnapshot.getSnapshot": DOMSnapshot.getSnapshotParameters;
+      "DOMSnapshot.captureSnapshot": DOMSnapshot.captureSnapshotParameters;
+      "DOMStorage.clear": DOMStorage.clearParameters;
+      "DOMStorage.disable": DOMStorage.disableParameters;
+      "DOMStorage.enable": DOMStorage.enableParameters;
+      "DOMStorage.getDOMStorageItems": DOMStorage.getDOMStorageItemsParameters;
+      "DOMStorage.removeDOMStorageItem": DOMStorage.removeDOMStorageItemParameters;
+      "DOMStorage.setDOMStorageItem": DOMStorage.setDOMStorageItemParameters;
+      "Database.disable": Database.disableParameters;
+      "Database.enable": Database.enableParameters;
+      "Database.executeSQL": Database.executeSQLParameters;
+      "Database.getDatabaseTableNames": Database.getDatabaseTableNamesParameters;
+      "DeviceOrientation.clearDeviceOrientationOverride": DeviceOrientation.clearDeviceOrientationOverrideParameters;
+      "DeviceOrientation.setDeviceOrientationOverride": DeviceOrientation.setDeviceOrientationOverrideParameters;
+      "Emulation.canEmulate": Emulation.canEmulateParameters;
+      "Emulation.clearDeviceMetricsOverride": Emulation.clearDeviceMetricsOverrideParameters;
+      "Emulation.clearGeolocationOverride": Emulation.clearGeolocationOverrideParameters;
+      "Emulation.resetPageScaleFactor": Emulation.resetPageScaleFactorParameters;
+      "Emulation.setFocusEmulationEnabled": Emulation.setFocusEmulationEnabledParameters;
+      "Emulation.setCPUThrottlingRate": Emulation.setCPUThrottlingRateParameters;
+      "Emulation.setDefaultBackgroundColorOverride": Emulation.setDefaultBackgroundColorOverrideParameters;
+      "Emulation.setDeviceMetricsOverride": Emulation.setDeviceMetricsOverrideParameters;
+      "Emulation.setScrollbarsHidden": Emulation.setScrollbarsHiddenParameters;
+      "Emulation.setDocumentCookieDisabled": Emulation.setDocumentCookieDisabledParameters;
+      "Emulation.setEmitTouchEventsForMouse": Emulation.setEmitTouchEventsForMouseParameters;
+      "Emulation.setEmulatedMedia": Emulation.setEmulatedMediaParameters;
+      "Emulation.setGeolocationOverride": Emulation.setGeolocationOverrideParameters;
+      "Emulation.setNavigatorOverrides": Emulation.setNavigatorOverridesParameters;
+      "Emulation.setPageScaleFactor": Emulation.setPageScaleFactorParameters;
+      "Emulation.setScriptExecutionDisabled": Emulation.setScriptExecutionDisabledParameters;
+      "Emulation.setTouchEmulationEnabled": Emulation.setTouchEmulationEnabledParameters;
+      "Emulation.setVirtualTimePolicy": Emulation.setVirtualTimePolicyParameters;
+      "Emulation.setTimezoneOverride": Emulation.setTimezoneOverrideParameters;
+      "Emulation.setVisibleSize": Emulation.setVisibleSizeParameters;
+      "Emulation.setUserAgentOverride": Emulation.setUserAgentOverrideParameters;
+      "HeadlessExperimental.beginFrame": HeadlessExperimental.beginFrameParameters;
+      "HeadlessExperimental.disable": HeadlessExperimental.disableParameters;
+      "HeadlessExperimental.enable": HeadlessExperimental.enableParameters;
+      "IO.close": IO.closeParameters;
+      "IO.read": IO.readParameters;
+      "IO.resolveBlob": IO.resolveBlobParameters;
+      "IndexedDB.clearObjectStore": IndexedDB.clearObjectStoreParameters;
+      "IndexedDB.deleteDatabase": IndexedDB.deleteDatabaseParameters;
+      "IndexedDB.deleteObjectStoreEntries": IndexedDB.deleteObjectStoreEntriesParameters;
+      "IndexedDB.disable": IndexedDB.disableParameters;
+      "IndexedDB.enable": IndexedDB.enableParameters;
+      "IndexedDB.requestData": IndexedDB.requestDataParameters;
+      "IndexedDB.getMetadata": IndexedDB.getMetadataParameters;
+      "IndexedDB.requestDatabase": IndexedDB.requestDatabaseParameters;
+      "IndexedDB.requestDatabaseNames": IndexedDB.requestDatabaseNamesParameters;
+      "Input.dispatchKeyEvent": Input.dispatchKeyEventParameters;
+      "Input.insertText": Input.insertTextParameters;
+      "Input.dispatchMouseEvent": Input.dispatchMouseEventParameters;
+      "Input.dispatchTouchEvent": Input.dispatchTouchEventParameters;
+      "Input.emulateTouchFromMouseEvent": Input.emulateTouchFromMouseEventParameters;
+      "Input.setIgnoreInputEvents": Input.setIgnoreInputEventsParameters;
+      "Input.synthesizePinchGesture": Input.synthesizePinchGestureParameters;
+      "Input.synthesizeScrollGesture": Input.synthesizeScrollGestureParameters;
+      "Input.synthesizeTapGesture": Input.synthesizeTapGestureParameters;
+      "Inspector.disable": Inspector.disableParameters;
+      "Inspector.enable": Inspector.enableParameters;
+      "LayerTree.compositingReasons": LayerTree.compositingReasonsParameters;
+      "LayerTree.disable": LayerTree.disableParameters;
+      "LayerTree.enable": LayerTree.enableParameters;
+      "LayerTree.loadSnapshot": LayerTree.loadSnapshotParameters;
+      "LayerTree.makeSnapshot": LayerTree.makeSnapshotParameters;
+      "LayerTree.profileSnapshot": LayerTree.profileSnapshotParameters;
+      "LayerTree.releaseSnapshot": LayerTree.releaseSnapshotParameters;
+      "LayerTree.replaySnapshot": LayerTree.replaySnapshotParameters;
+      "LayerTree.snapshotCommandLog": LayerTree.snapshotCommandLogParameters;
+      "Log.clear": Log.clearParameters;
+      "Log.disable": Log.disableParameters;
+      "Log.enable": Log.enableParameters;
+      "Log.startViolationsReport": Log.startViolationsReportParameters;
+      "Log.stopViolationsReport": Log.stopViolationsReportParameters;
+      "Memory.getDOMCounters": Memory.getDOMCountersParameters;
+      "Memory.prepareForLeakDetection": Memory.prepareForLeakDetectionParameters;
+      "Memory.forciblyPurgeJavaScriptMemory": Memory.forciblyPurgeJavaScriptMemoryParameters;
+      "Memory.setPressureNotificationsSuppressed": Memory.setPressureNotificationsSuppressedParameters;
+      "Memory.simulatePressureNotification": Memory.simulatePressureNotificationParameters;
+      "Memory.startSampling": Memory.startSamplingParameters;
+      "Memory.stopSampling": Memory.stopSamplingParameters;
+      "Memory.getAllTimeSamplingProfile": Memory.getAllTimeSamplingProfileParameters;
+      "Memory.getBrowserSamplingProfile": Memory.getBrowserSamplingProfileParameters;
+      "Memory.getSamplingProfile": Memory.getSamplingProfileParameters;
+      "Network.canClearBrowserCache": Network.canClearBrowserCacheParameters;
+      "Network.canClearBrowserCookies": Network.canClearBrowserCookiesParameters;
+      "Network.canEmulateNetworkConditions": Network.canEmulateNetworkConditionsParameters;
+      "Network.clearBrowserCache": Network.clearBrowserCacheParameters;
+      "Network.clearBrowserCookies": Network.clearBrowserCookiesParameters;
+      "Network.continueInterceptedRequest": Network.continueInterceptedRequestParameters;
+      "Network.deleteCookies": Network.deleteCookiesParameters;
+      "Network.disable": Network.disableParameters;
+      "Network.emulateNetworkConditions": Network.emulateNetworkConditionsParameters;
+      "Network.enable": Network.enableParameters;
+      "Network.getAllCookies": Network.getAllCookiesParameters;
+      "Network.getCertificate": Network.getCertificateParameters;
+      "Network.getCookies": Network.getCookiesParameters;
+      "Network.getResponseBody": Network.getResponseBodyParameters;
+      "Network.getRequestPostData": Network.getRequestPostDataParameters;
+      "Network.getResponseBodyForInterception": Network.getResponseBodyForInterceptionParameters;
+      "Network.takeResponseBodyForInterceptionAsStream": Network.takeResponseBodyForInterceptionAsStreamParameters;
+      "Network.replayXHR": Network.replayXHRParameters;
+      "Network.searchInResponseBody": Network.searchInResponseBodyParameters;
+      "Network.setBlockedURLs": Network.setBlockedURLsParameters;
+      "Network.setBypassServiceWorker": Network.setBypassServiceWorkerParameters;
+      "Network.setCacheDisabled": Network.setCacheDisabledParameters;
+      "Network.setCookie": Network.setCookieParameters;
+      "Network.setCookies": Network.setCookiesParameters;
+      "Network.setDataSizeLimitsForTest": Network.setDataSizeLimitsForTestParameters;
+      "Network.setExtraHTTPHeaders": Network.setExtraHTTPHeadersParameters;
+      "Network.setRequestInterception": Network.setRequestInterceptionParameters;
+      "Network.setUserAgentOverride": Network.setUserAgentOverrideParameters;
+      "Overlay.disable": Overlay.disableParameters;
+      "Overlay.enable": Overlay.enableParameters;
+      "Overlay.getHighlightObjectForTest": Overlay.getHighlightObjectForTestParameters;
+      "Overlay.hideHighlight": Overlay.hideHighlightParameters;
+      "Overlay.highlightFrame": Overlay.highlightFrameParameters;
+      "Overlay.highlightNode": Overlay.highlightNodeParameters;
+      "Overlay.highlightQuad": Overlay.highlightQuadParameters;
+      "Overlay.highlightRect": Overlay.highlightRectParameters;
+      "Overlay.setInspectMode": Overlay.setInspectModeParameters;
+      "Overlay.setShowAdHighlights": Overlay.setShowAdHighlightsParameters;
+      "Overlay.setPausedInDebuggerMessage": Overlay.setPausedInDebuggerMessageParameters;
+      "Overlay.setShowDebugBorders": Overlay.setShowDebugBordersParameters;
+      "Overlay.setShowFPSCounter": Overlay.setShowFPSCounterParameters;
+      "Overlay.setShowPaintRects": Overlay.setShowPaintRectsParameters;
+      "Overlay.setShowLayoutShiftRegions": Overlay.setShowLayoutShiftRegionsParameters;
+      "Overlay.setShowScrollBottleneckRects": Overlay.setShowScrollBottleneckRectsParameters;
+      "Overlay.setShowHitTestBorders": Overlay.setShowHitTestBordersParameters;
+      "Overlay.setShowViewportSizeOnResize": Overlay.setShowViewportSizeOnResizeParameters;
+      "Page.addScriptToEvaluateOnLoad": Page.addScriptToEvaluateOnLoadParameters;
+      "Page.addScriptToEvaluateOnNewDocument": Page.addScriptToEvaluateOnNewDocumentParameters;
+      "Page.bringToFront": Page.bringToFrontParameters;
+      "Page.captureScreenshot": Page.captureScreenshotParameters;
+      "Page.captureSnapshot": Page.captureSnapshotParameters;
+      "Page.clearDeviceMetricsOverride": Page.clearDeviceMetricsOverrideParameters;
+      "Page.clearDeviceOrientationOverride": Page.clearDeviceOrientationOverrideParameters;
+      "Page.clearGeolocationOverride": Page.clearGeolocationOverrideParameters;
+      "Page.createIsolatedWorld": Page.createIsolatedWorldParameters;
+      "Page.deleteCookie": Page.deleteCookieParameters;
+      "Page.disable": Page.disableParameters;
+      "Page.enable": Page.enableParameters;
+      "Page.getAppManifest": Page.getAppManifestParameters;
+      "Page.getInstallabilityErrors": Page.getInstallabilityErrorsParameters;
+      "Page.getManifestIcons": Page.getManifestIconsParameters;
+      "Page.getCookies": Page.getCookiesParameters;
+      "Page.getFrameTree": Page.getFrameTreeParameters;
+      "Page.getLayoutMetrics": Page.getLayoutMetricsParameters;
+      "Page.getNavigationHistory": Page.getNavigationHistoryParameters;
+      "Page.resetNavigationHistory": Page.resetNavigationHistoryParameters;
+      "Page.getResourceContent": Page.getResourceContentParameters;
+      "Page.getResourceTree": Page.getResourceTreeParameters;
+      "Page.handleJavaScriptDialog": Page.handleJavaScriptDialogParameters;
+      "Page.navigate": Page.navigateParameters;
+      "Page.navigateToHistoryEntry": Page.navigateToHistoryEntryParameters;
+      "Page.printToPDF": Page.printToPDFParameters;
+      "Page.reload": Page.reloadParameters;
+      "Page.removeScriptToEvaluateOnLoad": Page.removeScriptToEvaluateOnLoadParameters;
+      "Page.removeScriptToEvaluateOnNewDocument": Page.removeScriptToEvaluateOnNewDocumentParameters;
+      "Page.screencastFrameAck": Page.screencastFrameAckParameters;
+      "Page.searchInResource": Page.searchInResourceParameters;
+      "Page.setAdBlockingEnabled": Page.setAdBlockingEnabledParameters;
+      "Page.setBypassCSP": Page.setBypassCSPParameters;
+      "Page.setDeviceMetricsOverride": Page.setDeviceMetricsOverrideParameters;
+      "Page.setDeviceOrientationOverride": Page.setDeviceOrientationOverrideParameters;
+      "Page.setFontFamilies": Page.setFontFamiliesParameters;
+      "Page.setFontSizes": Page.setFontSizesParameters;
+      "Page.setDocumentContent": Page.setDocumentContentParameters;
+      "Page.setDownloadBehavior": Page.setDownloadBehaviorParameters;
+      "Page.setGeolocationOverride": Page.setGeolocationOverrideParameters;
+      "Page.setLifecycleEventsEnabled": Page.setLifecycleEventsEnabledParameters;
+      "Page.setTouchEmulationEnabled": Page.setTouchEmulationEnabledParameters;
+      "Page.startScreencast": Page.startScreencastParameters;
+      "Page.stopLoading": Page.stopLoadingParameters;
+      "Page.crash": Page.crashParameters;
+      "Page.close": Page.closeParameters;
+      "Page.setWebLifecycleState": Page.setWebLifecycleStateParameters;
+      "Page.stopScreencast": Page.stopScreencastParameters;
+      "Page.setProduceCompilationCache": Page.setProduceCompilationCacheParameters;
+      "Page.addCompilationCache": Page.addCompilationCacheParameters;
+      "Page.clearCompilationCache": Page.clearCompilationCacheParameters;
+      "Page.generateTestReport": Page.generateTestReportParameters;
+      "Page.waitForDebugger": Page.waitForDebuggerParameters;
+      "Page.setInterceptFileChooserDialog": Page.setInterceptFileChooserDialogParameters;
+      "Performance.disable": Performance.disableParameters;
+      "Performance.enable": Performance.enableParameters;
+      "Performance.setTimeDomain": Performance.setTimeDomainParameters;
+      "Performance.getMetrics": Performance.getMetricsParameters;
+      "Security.disable": Security.disableParameters;
+      "Security.enable": Security.enableParameters;
+      "Security.setIgnoreCertificateErrors": Security.setIgnoreCertificateErrorsParameters;
+      "Security.handleCertificateError": Security.handleCertificateErrorParameters;
+      "Security.setOverrideCertificateErrors": Security.setOverrideCertificateErrorsParameters;
+      "ServiceWorker.deliverPushMessage": ServiceWorker.deliverPushMessageParameters;
+      "ServiceWorker.disable": ServiceWorker.disableParameters;
+      "ServiceWorker.dispatchSyncEvent": ServiceWorker.dispatchSyncEventParameters;
+      "ServiceWorker.dispatchPeriodicSyncEvent": ServiceWorker.dispatchPeriodicSyncEventParameters;
+      "ServiceWorker.enable": ServiceWorker.enableParameters;
+      "ServiceWorker.inspectWorker": ServiceWorker.inspectWorkerParameters;
+      "ServiceWorker.setForceUpdateOnPageLoad": ServiceWorker.setForceUpdateOnPageLoadParameters;
+      "ServiceWorker.skipWaiting": ServiceWorker.skipWaitingParameters;
+      "ServiceWorker.startWorker": ServiceWorker.startWorkerParameters;
+      "ServiceWorker.stopAllWorkers": ServiceWorker.stopAllWorkersParameters;
+      "ServiceWorker.stopWorker": ServiceWorker.stopWorkerParameters;
+      "ServiceWorker.unregister": ServiceWorker.unregisterParameters;
+      "ServiceWorker.updateRegistration": ServiceWorker.updateRegistrationParameters;
+      "Storage.clearDataForOrigin": Storage.clearDataForOriginParameters;
+      "Storage.getCookies": Storage.getCookiesParameters;
+      "Storage.setCookies": Storage.setCookiesParameters;
+      "Storage.clearCookies": Storage.clearCookiesParameters;
+      "Storage.getUsageAndQuota": Storage.getUsageAndQuotaParameters;
+      "Storage.trackCacheStorageForOrigin": Storage.trackCacheStorageForOriginParameters;
+      "Storage.trackIndexedDBForOrigin": Storage.trackIndexedDBForOriginParameters;
+      "Storage.untrackCacheStorageForOrigin": Storage.untrackCacheStorageForOriginParameters;
+      "Storage.untrackIndexedDBForOrigin": Storage.untrackIndexedDBForOriginParameters;
+      "SystemInfo.getInfo": SystemInfo.getInfoParameters;
+      "SystemInfo.getProcessInfo": SystemInfo.getProcessInfoParameters;
+      "Target.activateTarget": Target.activateTargetParameters;
+      "Target.attachToTarget": Target.attachToTargetParameters;
+      "Target.attachToBrowserTarget": Target.attachToBrowserTargetParameters;
+      "Target.closeTarget": Target.closeTargetParameters;
+      "Target.exposeDevToolsProtocol": Target.exposeDevToolsProtocolParameters;
+      "Target.createBrowserContext": Target.createBrowserContextParameters;
+      "Target.getBrowserContexts": Target.getBrowserContextsParameters;
+      "Target.createTarget": Target.createTargetParameters;
+      "Target.detachFromTarget": Target.detachFromTargetParameters;
+      "Target.disposeBrowserContext": Target.disposeBrowserContextParameters;
+      "Target.getTargetInfo": Target.getTargetInfoParameters;
+      "Target.getTargets": Target.getTargetsParameters;
+      "Target.sendMessageToTarget": Target.sendMessageToTargetParameters;
+      "Target.setAutoAttach": Target.setAutoAttachParameters;
+      "Target.setDiscoverTargets": Target.setDiscoverTargetsParameters;
+      "Target.setRemoteLocations": Target.setRemoteLocationsParameters;
+      "Tethering.bind": Tethering.bindParameters;
+      "Tethering.unbind": Tethering.unbindParameters;
+      "Tracing.end": Tracing.endParameters;
+      "Tracing.getCategories": Tracing.getCategoriesParameters;
+      "Tracing.recordClockSyncMarker": Tracing.recordClockSyncMarkerParameters;
+      "Tracing.requestMemoryDump": Tracing.requestMemoryDumpParameters;
+      "Tracing.start": Tracing.startParameters;
+      "Fetch.disable": Fetch.disableParameters;
+      "Fetch.enable": Fetch.enableParameters;
+      "Fetch.failRequest": Fetch.failRequestParameters;
+      "Fetch.fulfillRequest": Fetch.fulfillRequestParameters;
+      "Fetch.continueRequest": Fetch.continueRequestParameters;
+      "Fetch.continueWithAuth": Fetch.continueWithAuthParameters;
+      "Fetch.getResponseBody": Fetch.getResponseBodyParameters;
+      "Fetch.takeResponseBodyAsStream": Fetch.takeResponseBodyAsStreamParameters;
+      "WebAudio.enable": WebAudio.enableParameters;
+      "WebAudio.disable": WebAudio.disableParameters;
+      "WebAudio.getRealtimeData": WebAudio.getRealtimeDataParameters;
+      "WebAuthn.enable": WebAuthn.enableParameters;
+      "WebAuthn.disable": WebAuthn.disableParameters;
+      "WebAuthn.addVirtualAuthenticator": WebAuthn.addVirtualAuthenticatorParameters;
+      "WebAuthn.removeVirtualAuthenticator": WebAuthn.removeVirtualAuthenticatorParameters;
+      "WebAuthn.addCredential": WebAuthn.addCredentialParameters;
+      "WebAuthn.getCredential": WebAuthn.getCredentialParameters;
+      "WebAuthn.getCredentials": WebAuthn.getCredentialsParameters;
+      "WebAuthn.removeCredential": WebAuthn.removeCredentialParameters;
+      "WebAuthn.clearCredentials": WebAuthn.clearCredentialsParameters;
+      "WebAuthn.setUserVerified": WebAuthn.setUserVerifiedParameters;
+      "Media.enable": Media.enableParameters;
+      "Media.disable": Media.disableParameters;
+      "Console.clearMessages": Console.clearMessagesParameters;
+      "Console.disable": Console.disableParameters;
+      "Console.enable": Console.enableParameters;
+      "Debugger.continueToLocation": Debugger.continueToLocationParameters;
+      "Debugger.disable": Debugger.disableParameters;
+      "Debugger.enable": Debugger.enableParameters;
+      "Debugger.evaluateOnCallFrame": Debugger.evaluateOnCallFrameParameters;
+      "Debugger.getPossibleBreakpoints": Debugger.getPossibleBreakpointsParameters;
+      "Debugger.getScriptSource": Debugger.getScriptSourceParameters;
+      "Debugger.getWasmBytecode": Debugger.getWasmBytecodeParameters;
+      "Debugger.getStackTrace": Debugger.getStackTraceParameters;
+      "Debugger.pause": Debugger.pauseParameters;
+      "Debugger.pauseOnAsyncCall": Debugger.pauseOnAsyncCallParameters;
+      "Debugger.removeBreakpoint": Debugger.removeBreakpointParameters;
+      "Debugger.restartFrame": Debugger.restartFrameParameters;
+      "Debugger.resume": Debugger.resumeParameters;
+      "Debugger.searchInContent": Debugger.searchInContentParameters;
+      "Debugger.setAsyncCallStackDepth": Debugger.setAsyncCallStackDepthParameters;
+      "Debugger.setBlackboxPatterns": Debugger.setBlackboxPatternsParameters;
+      "Debugger.setBlackboxedRanges": Debugger.setBlackboxedRangesParameters;
+      "Debugger.setBreakpoint": Debugger.setBreakpointParameters;
+      "Debugger.setInstrumentationBreakpoint": Debugger.setInstrumentationBreakpointParameters;
+      "Debugger.setBreakpointByUrl": Debugger.setBreakpointByUrlParameters;
+      "Debugger.setBreakpointOnFunctionCall": Debugger.setBreakpointOnFunctionCallParameters;
+      "Debugger.setBreakpointsActive": Debugger.setBreakpointsActiveParameters;
+      "Debugger.setPauseOnExceptions": Debugger.setPauseOnExceptionsParameters;
+      "Debugger.setReturnValue": Debugger.setReturnValueParameters;
+      "Debugger.setScriptSource": Debugger.setScriptSourceParameters;
+      "Debugger.setSkipAllPauses": Debugger.setSkipAllPausesParameters;
+      "Debugger.setVariableValue": Debugger.setVariableValueParameters;
+      "Debugger.stepInto": Debugger.stepIntoParameters;
+      "Debugger.stepOut": Debugger.stepOutParameters;
+      "Debugger.stepOver": Debugger.stepOverParameters;
+      "HeapProfiler.addInspectedHeapObject": HeapProfiler.addInspectedHeapObjectParameters;
+      "HeapProfiler.collectGarbage": HeapProfiler.collectGarbageParameters;
+      "HeapProfiler.disable": HeapProfiler.disableParameters;
+      "HeapProfiler.enable": HeapProfiler.enableParameters;
+      "HeapProfiler.getHeapObjectId": HeapProfiler.getHeapObjectIdParameters;
+      "HeapProfiler.getObjectByHeapObjectId": HeapProfiler.getObjectByHeapObjectIdParameters;
+      "HeapProfiler.getSamplingProfile": HeapProfiler.getSamplingProfileParameters;
+      "HeapProfiler.startSampling": HeapProfiler.startSamplingParameters;
+      "HeapProfiler.startTrackingHeapObjects": HeapProfiler.startTrackingHeapObjectsParameters;
+      "HeapProfiler.stopSampling": HeapProfiler.stopSamplingParameters;
+      "HeapProfiler.stopTrackingHeapObjects": HeapProfiler.stopTrackingHeapObjectsParameters;
+      "HeapProfiler.takeHeapSnapshot": HeapProfiler.takeHeapSnapshotParameters;
+      "Profiler.disable": Profiler.disableParameters;
+      "Profiler.enable": Profiler.enableParameters;
+      "Profiler.getBestEffortCoverage": Profiler.getBestEffortCoverageParameters;
+      "Profiler.setSamplingInterval": Profiler.setSamplingIntervalParameters;
+      "Profiler.start": Profiler.startParameters;
+      "Profiler.startPreciseCoverage": Profiler.startPreciseCoverageParameters;
+      "Profiler.startTypeProfile": Profiler.startTypeProfileParameters;
+      "Profiler.stop": Profiler.stopParameters;
+      "Profiler.stopPreciseCoverage": Profiler.stopPreciseCoverageParameters;
+      "Profiler.stopTypeProfile": Profiler.stopTypeProfileParameters;
+      "Profiler.takePreciseCoverage": Profiler.takePreciseCoverageParameters;
+      "Profiler.takeTypeProfile": Profiler.takeTypeProfileParameters;
+      "Profiler.enableRuntimeCallStats": Profiler.enableRuntimeCallStatsParameters;
+      "Profiler.disableRuntimeCallStats": Profiler.disableRuntimeCallStatsParameters;
+      "Profiler.getRuntimeCallStats": Profiler.getRuntimeCallStatsParameters;
+      "Runtime.awaitPromise": Runtime.awaitPromiseParameters;
+      "Runtime.callFunctionOn": Runtime.callFunctionOnParameters;
+      "Runtime.compileScript": Runtime.compileScriptParameters;
+      "Runtime.disable": Runtime.disableParameters;
+      "Runtime.discardConsoleEntries": Runtime.discardConsoleEntriesParameters;
+      "Runtime.enable": Runtime.enableParameters;
+      "Runtime.evaluate": Runtime.evaluateParameters;
+      "Runtime.getIsolateId": Runtime.getIsolateIdParameters;
+      "Runtime.getHeapUsage": Runtime.getHeapUsageParameters;
+      "Runtime.getProperties": Runtime.getPropertiesParameters;
+      "Runtime.globalLexicalScopeNames": Runtime.globalLexicalScopeNamesParameters;
+      "Runtime.queryObjects": Runtime.queryObjectsParameters;
+      "Runtime.releaseObject": Runtime.releaseObjectParameters;
+      "Runtime.releaseObjectGroup": Runtime.releaseObjectGroupParameters;
+      "Runtime.runIfWaitingForDebugger": Runtime.runIfWaitingForDebuggerParameters;
+      "Runtime.runScript": Runtime.runScriptParameters;
+      "Runtime.setAsyncCallStackDepth": Runtime.setAsyncCallStackDepthParameters;
+      "Runtime.setCustomObjectFormatterEnabled": Runtime.setCustomObjectFormatterEnabledParameters;
+      "Runtime.setMaxCallStackSizeToCapture": Runtime.setMaxCallStackSizeToCaptureParameters;
+      "Runtime.terminateExecution": Runtime.terminateExecutionParameters;
+      "Runtime.addBinding": Runtime.addBindingParameters;
+      "Runtime.removeBinding": Runtime.removeBindingParameters;
+      "Schema.getDomains": Schema.getDomainsParameters;
+    }
+    export interface CommandReturnValues {
+      "Accessibility.disable": Accessibility.disableReturnValue;
+      "Accessibility.enable": Accessibility.enableReturnValue;
+      "Accessibility.getPartialAXTree": Accessibility.getPartialAXTreeReturnValue;
+      "Accessibility.getFullAXTree": Accessibility.getFullAXTreeReturnValue;
+      "Animation.disable": Animation.disableReturnValue;
+      "Animation.enable": Animation.enableReturnValue;
+      "Animation.getCurrentTime": Animation.getCurrentTimeReturnValue;
+      "Animation.getPlaybackRate": Animation.getPlaybackRateReturnValue;
+      "Animation.releaseAnimations": Animation.releaseAnimationsReturnValue;
+      "Animation.resolveAnimation": Animation.resolveAnimationReturnValue;
+      "Animation.seekAnimations": Animation.seekAnimationsReturnValue;
+      "Animation.setPaused": Animation.setPausedReturnValue;
+      "Animation.setPlaybackRate": Animation.setPlaybackRateReturnValue;
+      "Animation.setTiming": Animation.setTimingReturnValue;
+      "ApplicationCache.enable": ApplicationCache.enableReturnValue;
+      "ApplicationCache.getApplicationCacheForFrame": ApplicationCache.getApplicationCacheForFrameReturnValue;
+      "ApplicationCache.getFramesWithManifests": ApplicationCache.getFramesWithManifestsReturnValue;
+      "ApplicationCache.getManifestForFrame": ApplicationCache.getManifestForFrameReturnValue;
+      "Audits.getEncodedResponse": Audits.getEncodedResponseReturnValue;
+      "BackgroundService.startObserving": BackgroundService.startObservingReturnValue;
+      "BackgroundService.stopObserving": BackgroundService.stopObservingReturnValue;
+      "BackgroundService.setRecording": BackgroundService.setRecordingReturnValue;
+      "BackgroundService.clearEvents": BackgroundService.clearEventsReturnValue;
+      "Browser.setPermission": Browser.setPermissionReturnValue;
+      "Browser.grantPermissions": Browser.grantPermissionsReturnValue;
+      "Browser.resetPermissions": Browser.resetPermissionsReturnValue;
+      "Browser.close": Browser.closeReturnValue;
+      "Browser.crash": Browser.crashReturnValue;
+      "Browser.crashGpuProcess": Browser.crashGpuProcessReturnValue;
+      "Browser.getVersion": Browser.getVersionReturnValue;
+      "Browser.getBrowserCommandLine": Browser.getBrowserCommandLineReturnValue;
+      "Browser.getHistograms": Browser.getHistogramsReturnValue;
+      "Browser.getHistogram": Browser.getHistogramReturnValue;
+      "Browser.getWindowBounds": Browser.getWindowBoundsReturnValue;
+      "Browser.getWindowForTarget": Browser.getWindowForTargetReturnValue;
+      "Browser.setWindowBounds": Browser.setWindowBoundsReturnValue;
+      "Browser.setDockTile": Browser.setDockTileReturnValue;
+      "CSS.addRule": CSS.addRuleReturnValue;
+      "CSS.collectClassNames": CSS.collectClassNamesReturnValue;
+      "CSS.createStyleSheet": CSS.createStyleSheetReturnValue;
+      "CSS.disable": CSS.disableReturnValue;
+      "CSS.enable": CSS.enableReturnValue;
+      "CSS.forcePseudoState": CSS.forcePseudoStateReturnValue;
+      "CSS.getBackgroundColors": CSS.getBackgroundColorsReturnValue;
+      "CSS.getComputedStyleForNode": CSS.getComputedStyleForNodeReturnValue;
+      "CSS.getInlineStylesForNode": CSS.getInlineStylesForNodeReturnValue;
+      "CSS.getMatchedStylesForNode": CSS.getMatchedStylesForNodeReturnValue;
+      "CSS.getMediaQueries": CSS.getMediaQueriesReturnValue;
+      "CSS.getPlatformFontsForNode": CSS.getPlatformFontsForNodeReturnValue;
+      "CSS.getStyleSheetText": CSS.getStyleSheetTextReturnValue;
+      "CSS.setEffectivePropertyValueForNode": CSS.setEffectivePropertyValueForNodeReturnValue;
+      "CSS.setKeyframeKey": CSS.setKeyframeKeyReturnValue;
+      "CSS.setMediaText": CSS.setMediaTextReturnValue;
+      "CSS.setRuleSelector": CSS.setRuleSelectorReturnValue;
+      "CSS.setStyleSheetText": CSS.setStyleSheetTextReturnValue;
+      "CSS.setStyleTexts": CSS.setStyleTextsReturnValue;
+      "CSS.startRuleUsageTracking": CSS.startRuleUsageTrackingReturnValue;
+      "CSS.stopRuleUsageTracking": CSS.stopRuleUsageTrackingReturnValue;
+      "CSS.takeCoverageDelta": CSS.takeCoverageDeltaReturnValue;
+      "CacheStorage.deleteCache": CacheStorage.deleteCacheReturnValue;
+      "CacheStorage.deleteEntry": CacheStorage.deleteEntryReturnValue;
+      "CacheStorage.requestCacheNames": CacheStorage.requestCacheNamesReturnValue;
+      "CacheStorage.requestCachedResponse": CacheStorage.requestCachedResponseReturnValue;
+      "CacheStorage.requestEntries": CacheStorage.requestEntriesReturnValue;
+      "Cast.enable": Cast.enableReturnValue;
+      "Cast.disable": Cast.disableReturnValue;
+      "Cast.setSinkToUse": Cast.setSinkToUseReturnValue;
+      "Cast.startTabMirroring": Cast.startTabMirroringReturnValue;
+      "Cast.stopCasting": Cast.stopCastingReturnValue;
+      "DOM.collectClassNamesFromSubtree": DOM.collectClassNamesFromSubtreeReturnValue;
+      "DOM.copyTo": DOM.copyToReturnValue;
+      "DOM.describeNode": DOM.describeNodeReturnValue;
+      "DOM.disable": DOM.disableReturnValue;
+      "DOM.discardSearchResults": DOM.discardSearchResultsReturnValue;
+      "DOM.enable": DOM.enableReturnValue;
+      "DOM.focus": DOM.focusReturnValue;
+      "DOM.getAttributes": DOM.getAttributesReturnValue;
+      "DOM.getBoxModel": DOM.getBoxModelReturnValue;
+      "DOM.getContentQuads": DOM.getContentQuadsReturnValue;
+      "DOM.getDocument": DOM.getDocumentReturnValue;
+      "DOM.getFlattenedDocument": DOM.getFlattenedDocumentReturnValue;
+      "DOM.getNodeForLocation": DOM.getNodeForLocationReturnValue;
+      "DOM.getOuterHTML": DOM.getOuterHTMLReturnValue;
+      "DOM.getRelayoutBoundary": DOM.getRelayoutBoundaryReturnValue;
+      "DOM.getSearchResults": DOM.getSearchResultsReturnValue;
+      "DOM.hideHighlight": DOM.hideHighlightReturnValue;
+      "DOM.highlightNode": DOM.highlightNodeReturnValue;
+      "DOM.highlightRect": DOM.highlightRectReturnValue;
+      "DOM.markUndoableState": DOM.markUndoableStateReturnValue;
+      "DOM.moveTo": DOM.moveToReturnValue;
+      "DOM.performSearch": DOM.performSearchReturnValue;
+      "DOM.pushNodeByPathToFrontend": DOM.pushNodeByPathToFrontendReturnValue;
+      "DOM.pushNodesByBackendIdsToFrontend": DOM.pushNodesByBackendIdsToFrontendReturnValue;
+      "DOM.querySelector": DOM.querySelectorReturnValue;
+      "DOM.querySelectorAll": DOM.querySelectorAllReturnValue;
+      "DOM.redo": DOM.redoReturnValue;
+      "DOM.removeAttribute": DOM.removeAttributeReturnValue;
+      "DOM.removeNode": DOM.removeNodeReturnValue;
+      "DOM.requestChildNodes": DOM.requestChildNodesReturnValue;
+      "DOM.requestNode": DOM.requestNodeReturnValue;
+      "DOM.resolveNode": DOM.resolveNodeReturnValue;
+      "DOM.setAttributeValue": DOM.setAttributeValueReturnValue;
+      "DOM.setAttributesAsText": DOM.setAttributesAsTextReturnValue;
+      "DOM.setFileInputFiles": DOM.setFileInputFilesReturnValue;
+      "DOM.setNodeStackTracesEnabled": DOM.setNodeStackTracesEnabledReturnValue;
+      "DOM.getNodeStackTraces": DOM.getNodeStackTracesReturnValue;
+      "DOM.getFileInfo": DOM.getFileInfoReturnValue;
+      "DOM.setInspectedNode": DOM.setInspectedNodeReturnValue;
+      "DOM.setNodeName": DOM.setNodeNameReturnValue;
+      "DOM.setNodeValue": DOM.setNodeValueReturnValue;
+      "DOM.setOuterHTML": DOM.setOuterHTMLReturnValue;
+      "DOM.undo": DOM.undoReturnValue;
+      "DOM.getFrameOwner": DOM.getFrameOwnerReturnValue;
+      "DOMDebugger.getEventListeners": DOMDebugger.getEventListenersReturnValue;
+      "DOMDebugger.removeDOMBreakpoint": DOMDebugger.removeDOMBreakpointReturnValue;
+      "DOMDebugger.removeEventListenerBreakpoint": DOMDebugger.removeEventListenerBreakpointReturnValue;
+      "DOMDebugger.removeInstrumentationBreakpoint": DOMDebugger.removeInstrumentationBreakpointReturnValue;
+      "DOMDebugger.removeXHRBreakpoint": DOMDebugger.removeXHRBreakpointReturnValue;
+      "DOMDebugger.setDOMBreakpoint": DOMDebugger.setDOMBreakpointReturnValue;
+      "DOMDebugger.setEventListenerBreakpoint": DOMDebugger.setEventListenerBreakpointReturnValue;
+      "DOMDebugger.setInstrumentationBreakpoint": DOMDebugger.setInstrumentationBreakpointReturnValue;
+      "DOMDebugger.setXHRBreakpoint": DOMDebugger.setXHRBreakpointReturnValue;
+      "DOMSnapshot.disable": DOMSnapshot.disableReturnValue;
+      "DOMSnapshot.enable": DOMSnapshot.enableReturnValue;
+      "DOMSnapshot.getSnapshot": DOMSnapshot.getSnapshotReturnValue;
+      "DOMSnapshot.captureSnapshot": DOMSnapshot.captureSnapshotReturnValue;
+      "DOMStorage.clear": DOMStorage.clearReturnValue;
+      "DOMStorage.disable": DOMStorage.disableReturnValue;
+      "DOMStorage.enable": DOMStorage.enableReturnValue;
+      "DOMStorage.getDOMStorageItems": DOMStorage.getDOMStorageItemsReturnValue;
+      "DOMStorage.removeDOMStorageItem": DOMStorage.removeDOMStorageItemReturnValue;
+      "DOMStorage.setDOMStorageItem": DOMStorage.setDOMStorageItemReturnValue;
+      "Database.disable": Database.disableReturnValue;
+      "Database.enable": Database.enableReturnValue;
+      "Database.executeSQL": Database.executeSQLReturnValue;
+      "Database.getDatabaseTableNames": Database.getDatabaseTableNamesReturnValue;
+      "DeviceOrientation.clearDeviceOrientationOverride": DeviceOrientation.clearDeviceOrientationOverrideReturnValue;
+      "DeviceOrientation.setDeviceOrientationOverride": DeviceOrientation.setDeviceOrientationOverrideReturnValue;
+      "Emulation.canEmulate": Emulation.canEmulateReturnValue;
+      "Emulation.clearDeviceMetricsOverride": Emulation.clearDeviceMetricsOverrideReturnValue;
+      "Emulation.clearGeolocationOverride": Emulation.clearGeolocationOverrideReturnValue;
+      "Emulation.resetPageScaleFactor": Emulation.resetPageScaleFactorReturnValue;
+      "Emulation.setFocusEmulationEnabled": Emulation.setFocusEmulationEnabledReturnValue;
+      "Emulation.setCPUThrottlingRate": Emulation.setCPUThrottlingRateReturnValue;
+      "Emulation.setDefaultBackgroundColorOverride": Emulation.setDefaultBackgroundColorOverrideReturnValue;
+      "Emulation.setDeviceMetricsOverride": Emulation.setDeviceMetricsOverrideReturnValue;
+      "Emulation.setScrollbarsHidden": Emulation.setScrollbarsHiddenReturnValue;
+      "Emulation.setDocumentCookieDisabled": Emulation.setDocumentCookieDisabledReturnValue;
+      "Emulation.setEmitTouchEventsForMouse": Emulation.setEmitTouchEventsForMouseReturnValue;
+      "Emulation.setEmulatedMedia": Emulation.setEmulatedMediaReturnValue;
+      "Emulation.setGeolocationOverride": Emulation.setGeolocationOverrideReturnValue;
+      "Emulation.setNavigatorOverrides": Emulation.setNavigatorOverridesReturnValue;
+      "Emulation.setPageScaleFactor": Emulation.setPageScaleFactorReturnValue;
+      "Emulation.setScriptExecutionDisabled": Emulation.setScriptExecutionDisabledReturnValue;
+      "Emulation.setTouchEmulationEnabled": Emulation.setTouchEmulationEnabledReturnValue;
+      "Emulation.setVirtualTimePolicy": Emulation.setVirtualTimePolicyReturnValue;
+      "Emulation.setTimezoneOverride": Emulation.setTimezoneOverrideReturnValue;
+      "Emulation.setVisibleSize": Emulation.setVisibleSizeReturnValue;
+      "Emulation.setUserAgentOverride": Emulation.setUserAgentOverrideReturnValue;
+      "HeadlessExperimental.beginFrame": HeadlessExperimental.beginFrameReturnValue;
+      "HeadlessExperimental.disable": HeadlessExperimental.disableReturnValue;
+      "HeadlessExperimental.enable": HeadlessExperimental.enableReturnValue;
+      "IO.close": IO.closeReturnValue;
+      "IO.read": IO.readReturnValue;
+      "IO.resolveBlob": IO.resolveBlobReturnValue;
+      "IndexedDB.clearObjectStore": IndexedDB.clearObjectStoreReturnValue;
+      "IndexedDB.deleteDatabase": IndexedDB.deleteDatabaseReturnValue;
+      "IndexedDB.deleteObjectStoreEntries": IndexedDB.deleteObjectStoreEntriesReturnValue;
+      "IndexedDB.disable": IndexedDB.disableReturnValue;
+      "IndexedDB.enable": IndexedDB.enableReturnValue;
+      "IndexedDB.requestData": IndexedDB.requestDataReturnValue;
+      "IndexedDB.getMetadata": IndexedDB.getMetadataReturnValue;
+      "IndexedDB.requestDatabase": IndexedDB.requestDatabaseReturnValue;
+      "IndexedDB.requestDatabaseNames": IndexedDB.requestDatabaseNamesReturnValue;
+      "Input.dispatchKeyEvent": Input.dispatchKeyEventReturnValue;
+      "Input.insertText": Input.insertTextReturnValue;
+      "Input.dispatchMouseEvent": Input.dispatchMouseEventReturnValue;
+      "Input.dispatchTouchEvent": Input.dispatchTouchEventReturnValue;
+      "Input.emulateTouchFromMouseEvent": Input.emulateTouchFromMouseEventReturnValue;
+      "Input.setIgnoreInputEvents": Input.setIgnoreInputEventsReturnValue;
+      "Input.synthesizePinchGesture": Input.synthesizePinchGestureReturnValue;
+      "Input.synthesizeScrollGesture": Input.synthesizeScrollGestureReturnValue;
+      "Input.synthesizeTapGesture": Input.synthesizeTapGestureReturnValue;
+      "Inspector.disable": Inspector.disableReturnValue;
+      "Inspector.enable": Inspector.enableReturnValue;
+      "LayerTree.compositingReasons": LayerTree.compositingReasonsReturnValue;
+      "LayerTree.disable": LayerTree.disableReturnValue;
+      "LayerTree.enable": LayerTree.enableReturnValue;
+      "LayerTree.loadSnapshot": LayerTree.loadSnapshotReturnValue;
+      "LayerTree.makeSnapshot": LayerTree.makeSnapshotReturnValue;
+      "LayerTree.profileSnapshot": LayerTree.profileSnapshotReturnValue;
+      "LayerTree.releaseSnapshot": LayerTree.releaseSnapshotReturnValue;
+      "LayerTree.replaySnapshot": LayerTree.replaySnapshotReturnValue;
+      "LayerTree.snapshotCommandLog": LayerTree.snapshotCommandLogReturnValue;
+      "Log.clear": Log.clearReturnValue;
+      "Log.disable": Log.disableReturnValue;
+      "Log.enable": Log.enableReturnValue;
+      "Log.startViolationsReport": Log.startViolationsReportReturnValue;
+      "Log.stopViolationsReport": Log.stopViolationsReportReturnValue;
+      "Memory.getDOMCounters": Memory.getDOMCountersReturnValue;
+      "Memory.prepareForLeakDetection": Memory.prepareForLeakDetectionReturnValue;
+      "Memory.forciblyPurgeJavaScriptMemory": Memory.forciblyPurgeJavaScriptMemoryReturnValue;
+      "Memory.setPressureNotificationsSuppressed": Memory.setPressureNotificationsSuppressedReturnValue;
+      "Memory.simulatePressureNotification": Memory.simulatePressureNotificationReturnValue;
+      "Memory.startSampling": Memory.startSamplingReturnValue;
+      "Memory.stopSampling": Memory.stopSamplingReturnValue;
+      "Memory.getAllTimeSamplingProfile": Memory.getAllTimeSamplingProfileReturnValue;
+      "Memory.getBrowserSamplingProfile": Memory.getBrowserSamplingProfileReturnValue;
+      "Memory.getSamplingProfile": Memory.getSamplingProfileReturnValue;
+      "Network.canClearBrowserCache": Network.canClearBrowserCacheReturnValue;
+      "Network.canClearBrowserCookies": Network.canClearBrowserCookiesReturnValue;
+      "Network.canEmulateNetworkConditions": Network.canEmulateNetworkConditionsReturnValue;
+      "Network.clearBrowserCache": Network.clearBrowserCacheReturnValue;
+      "Network.clearBrowserCookies": Network.clearBrowserCookiesReturnValue;
+      "Network.continueInterceptedRequest": Network.continueInterceptedRequestReturnValue;
+      "Network.deleteCookies": Network.deleteCookiesReturnValue;
+      "Network.disable": Network.disableReturnValue;
+      "Network.emulateNetworkConditions": Network.emulateNetworkConditionsReturnValue;
+      "Network.enable": Network.enableReturnValue;
+      "Network.getAllCookies": Network.getAllCookiesReturnValue;
+      "Network.getCertificate": Network.getCertificateReturnValue;
+      "Network.getCookies": Network.getCookiesReturnValue;
+      "Network.getResponseBody": Network.getResponseBodyReturnValue;
+      "Network.getRequestPostData": Network.getRequestPostDataReturnValue;
+      "Network.getResponseBodyForInterception": Network.getResponseBodyForInterceptionReturnValue;
+      "Network.takeResponseBodyForInterceptionAsStream": Network.takeResponseBodyForInterceptionAsStreamReturnValue;
+      "Network.replayXHR": Network.replayXHRReturnValue;
+      "Network.searchInResponseBody": Network.searchInResponseBodyReturnValue;
+      "Network.setBlockedURLs": Network.setBlockedURLsReturnValue;
+      "Network.setBypassServiceWorker": Network.setBypassServiceWorkerReturnValue;
+      "Network.setCacheDisabled": Network.setCacheDisabledReturnValue;
+      "Network.setCookie": Network.setCookieReturnValue;
+      "Network.setCookies": Network.setCookiesReturnValue;
+      "Network.setDataSizeLimitsForTest": Network.setDataSizeLimitsForTestReturnValue;
+      "Network.setExtraHTTPHeaders": Network.setExtraHTTPHeadersReturnValue;
+      "Network.setRequestInterception": Network.setRequestInterceptionReturnValue;
+      "Network.setUserAgentOverride": Network.setUserAgentOverrideReturnValue;
+      "Overlay.disable": Overlay.disableReturnValue;
+      "Overlay.enable": Overlay.enableReturnValue;
+      "Overlay.getHighlightObjectForTest": Overlay.getHighlightObjectForTestReturnValue;
+      "Overlay.hideHighlight": Overlay.hideHighlightReturnValue;
+      "Overlay.highlightFrame": Overlay.highlightFrameReturnValue;
+      "Overlay.highlightNode": Overlay.highlightNodeReturnValue;
+      "Overlay.highlightQuad": Overlay.highlightQuadReturnValue;
+      "Overlay.highlightRect": Overlay.highlightRectReturnValue;
+      "Overlay.setInspectMode": Overlay.setInspectModeReturnValue;
+      "Overlay.setShowAdHighlights": Overlay.setShowAdHighlightsReturnValue;
+      "Overlay.setPausedInDebuggerMessage": Overlay.setPausedInDebuggerMessageReturnValue;
+      "Overlay.setShowDebugBorders": Overlay.setShowDebugBordersReturnValue;
+      "Overlay.setShowFPSCounter": Overlay.setShowFPSCounterReturnValue;
+      "Overlay.setShowPaintRects": Overlay.setShowPaintRectsReturnValue;
+      "Overlay.setShowLayoutShiftRegions": Overlay.setShowLayoutShiftRegionsReturnValue;
+      "Overlay.setShowScrollBottleneckRects": Overlay.setShowScrollBottleneckRectsReturnValue;
+      "Overlay.setShowHitTestBorders": Overlay.setShowHitTestBordersReturnValue;
+      "Overlay.setShowViewportSizeOnResize": Overlay.setShowViewportSizeOnResizeReturnValue;
+      "Page.addScriptToEvaluateOnLoad": Page.addScriptToEvaluateOnLoadReturnValue;
+      "Page.addScriptToEvaluateOnNewDocument": Page.addScriptToEvaluateOnNewDocumentReturnValue;
+      "Page.bringToFront": Page.bringToFrontReturnValue;
+      "Page.captureScreenshot": Page.captureScreenshotReturnValue;
+      "Page.captureSnapshot": Page.captureSnapshotReturnValue;
+      "Page.clearDeviceMetricsOverride": Page.clearDeviceMetricsOverrideReturnValue;
+      "Page.clearDeviceOrientationOverride": Page.clearDeviceOrientationOverrideReturnValue;
+      "Page.clearGeolocationOverride": Page.clearGeolocationOverrideReturnValue;
+      "Page.createIsolatedWorld": Page.createIsolatedWorldReturnValue;
+      "Page.deleteCookie": Page.deleteCookieReturnValue;
+      "Page.disable": Page.disableReturnValue;
+      "Page.enable": Page.enableReturnValue;
+      "Page.getAppManifest": Page.getAppManifestReturnValue;
+      "Page.getInstallabilityErrors": Page.getInstallabilityErrorsReturnValue;
+      "Page.getManifestIcons": Page.getManifestIconsReturnValue;
+      "Page.getCookies": Page.getCookiesReturnValue;
+      "Page.getFrameTree": Page.getFrameTreeReturnValue;
+      "Page.getLayoutMetrics": Page.getLayoutMetricsReturnValue;
+      "Page.getNavigationHistory": Page.getNavigationHistoryReturnValue;
+      "Page.resetNavigationHistory": Page.resetNavigationHistoryReturnValue;
+      "Page.getResourceContent": Page.getResourceContentReturnValue;
+      "Page.getResourceTree": Page.getResourceTreeReturnValue;
+      "Page.handleJavaScriptDialog": Page.handleJavaScriptDialogReturnValue;
+      "Page.navigate": Page.navigateReturnValue;
+      "Page.navigateToHistoryEntry": Page.navigateToHistoryEntryReturnValue;
+      "Page.printToPDF": Page.printToPDFReturnValue;
+      "Page.reload": Page.reloadReturnValue;
+      "Page.removeScriptToEvaluateOnLoad": Page.removeScriptToEvaluateOnLoadReturnValue;
+      "Page.removeScriptToEvaluateOnNewDocument": Page.removeScriptToEvaluateOnNewDocumentReturnValue;
+      "Page.screencastFrameAck": Page.screencastFrameAckReturnValue;
+      "Page.searchInResource": Page.searchInResourceReturnValue;
+      "Page.setAdBlockingEnabled": Page.setAdBlockingEnabledReturnValue;
+      "Page.setBypassCSP": Page.setBypassCSPReturnValue;
+      "Page.setDeviceMetricsOverride": Page.setDeviceMetricsOverrideReturnValue;
+      "Page.setDeviceOrientationOverride": Page.setDeviceOrientationOverrideReturnValue;
+      "Page.setFontFamilies": Page.setFontFamiliesReturnValue;
+      "Page.setFontSizes": Page.setFontSizesReturnValue;
+      "Page.setDocumentContent": Page.setDocumentContentReturnValue;
+      "Page.setDownloadBehavior": Page.setDownloadBehaviorReturnValue;
+      "Page.setGeolocationOverride": Page.setGeolocationOverrideReturnValue;
+      "Page.setLifecycleEventsEnabled": Page.setLifecycleEventsEnabledReturnValue;
+      "Page.setTouchEmulationEnabled": Page.setTouchEmulationEnabledReturnValue;
+      "Page.startScreencast": Page.startScreencastReturnValue;
+      "Page.stopLoading": Page.stopLoadingReturnValue;
+      "Page.crash": Page.crashReturnValue;
+      "Page.close": Page.closeReturnValue;
+      "Page.setWebLifecycleState": Page.setWebLifecycleStateReturnValue;
+      "Page.stopScreencast": Page.stopScreencastReturnValue;
+      "Page.setProduceCompilationCache": Page.setProduceCompilationCacheReturnValue;
+      "Page.addCompilationCache": Page.addCompilationCacheReturnValue;
+      "Page.clearCompilationCache": Page.clearCompilationCacheReturnValue;
+      "Page.generateTestReport": Page.generateTestReportReturnValue;
+      "Page.waitForDebugger": Page.waitForDebuggerReturnValue;
+      "Page.setInterceptFileChooserDialog": Page.setInterceptFileChooserDialogReturnValue;
+      "Performance.disable": Performance.disableReturnValue;
+      "Performance.enable": Performance.enableReturnValue;
+      "Performance.setTimeDomain": Performance.setTimeDomainReturnValue;
+      "Performance.getMetrics": Performance.getMetricsReturnValue;
+      "Security.disable": Security.disableReturnValue;
+      "Security.enable": Security.enableReturnValue;
+      "Security.setIgnoreCertificateErrors": Security.setIgnoreCertificateErrorsReturnValue;
+      "Security.handleCertificateError": Security.handleCertificateErrorReturnValue;
+      "Security.setOverrideCertificateErrors": Security.setOverrideCertificateErrorsReturnValue;
+      "ServiceWorker.deliverPushMessage": ServiceWorker.deliverPushMessageReturnValue;
+      "ServiceWorker.disable": ServiceWorker.disableReturnValue;
+      "ServiceWorker.dispatchSyncEvent": ServiceWorker.dispatchSyncEventReturnValue;
+      "ServiceWorker.dispatchPeriodicSyncEvent": ServiceWorker.dispatchPeriodicSyncEventReturnValue;
+      "ServiceWorker.enable": ServiceWorker.enableReturnValue;
+      "ServiceWorker.inspectWorker": ServiceWorker.inspectWorkerReturnValue;
+      "ServiceWorker.setForceUpdateOnPageLoad": ServiceWorker.setForceUpdateOnPageLoadReturnValue;
+      "ServiceWorker.skipWaiting": ServiceWorker.skipWaitingReturnValue;
+      "ServiceWorker.startWorker": ServiceWorker.startWorkerReturnValue;
+      "ServiceWorker.stopAllWorkers": ServiceWorker.stopAllWorkersReturnValue;
+      "ServiceWorker.stopWorker": ServiceWorker.stopWorkerReturnValue;
+      "ServiceWorker.unregister": ServiceWorker.unregisterReturnValue;
+      "ServiceWorker.updateRegistration": ServiceWorker.updateRegistrationReturnValue;
+      "Storage.clearDataForOrigin": Storage.clearDataForOriginReturnValue;
+      "Storage.getCookies": Storage.getCookiesReturnValue;
+      "Storage.setCookies": Storage.setCookiesReturnValue;
+      "Storage.clearCookies": Storage.clearCookiesReturnValue;
+      "Storage.getUsageAndQuota": Storage.getUsageAndQuotaReturnValue;
+      "Storage.trackCacheStorageForOrigin": Storage.trackCacheStorageForOriginReturnValue;
+      "Storage.trackIndexedDBForOrigin": Storage.trackIndexedDBForOriginReturnValue;
+      "Storage.untrackCacheStorageForOrigin": Storage.untrackCacheStorageForOriginReturnValue;
+      "Storage.untrackIndexedDBForOrigin": Storage.untrackIndexedDBForOriginReturnValue;
+      "SystemInfo.getInfo": SystemInfo.getInfoReturnValue;
+      "SystemInfo.getProcessInfo": SystemInfo.getProcessInfoReturnValue;
+      "Target.activateTarget": Target.activateTargetReturnValue;
+      "Target.attachToTarget": Target.attachToTargetReturnValue;
+      "Target.attachToBrowserTarget": Target.attachToBrowserTargetReturnValue;
+      "Target.closeTarget": Target.closeTargetReturnValue;
+      "Target.exposeDevToolsProtocol": Target.exposeDevToolsProtocolReturnValue;
+      "Target.createBrowserContext": Target.createBrowserContextReturnValue;
+      "Target.getBrowserContexts": Target.getBrowserContextsReturnValue;
+      "Target.createTarget": Target.createTargetReturnValue;
+      "Target.detachFromTarget": Target.detachFromTargetReturnValue;
+      "Target.disposeBrowserContext": Target.disposeBrowserContextReturnValue;
+      "Target.getTargetInfo": Target.getTargetInfoReturnValue;
+      "Target.getTargets": Target.getTargetsReturnValue;
+      "Target.sendMessageToTarget": Target.sendMessageToTargetReturnValue;
+      "Target.setAutoAttach": Target.setAutoAttachReturnValue;
+      "Target.setDiscoverTargets": Target.setDiscoverTargetsReturnValue;
+      "Target.setRemoteLocations": Target.setRemoteLocationsReturnValue;
+      "Tethering.bind": Tethering.bindReturnValue;
+      "Tethering.unbind": Tethering.unbindReturnValue;
+      "Tracing.end": Tracing.endReturnValue;
+      "Tracing.getCategories": Tracing.getCategoriesReturnValue;
+      "Tracing.recordClockSyncMarker": Tracing.recordClockSyncMarkerReturnValue;
+      "Tracing.requestMemoryDump": Tracing.requestMemoryDumpReturnValue;
+      "Tracing.start": Tracing.startReturnValue;
+      "Fetch.disable": Fetch.disableReturnValue;
+      "Fetch.enable": Fetch.enableReturnValue;
+      "Fetch.failRequest": Fetch.failRequestReturnValue;
+      "Fetch.fulfillRequest": Fetch.fulfillRequestReturnValue;
+      "Fetch.continueRequest": Fetch.continueRequestReturnValue;
+      "Fetch.continueWithAuth": Fetch.continueWithAuthReturnValue;
+      "Fetch.getResponseBody": Fetch.getResponseBodyReturnValue;
+      "Fetch.takeResponseBodyAsStream": Fetch.takeResponseBodyAsStreamReturnValue;
+      "WebAudio.enable": WebAudio.enableReturnValue;
+      "WebAudio.disable": WebAudio.disableReturnValue;
+      "WebAudio.getRealtimeData": WebAudio.getRealtimeDataReturnValue;
+      "WebAuthn.enable": WebAuthn.enableReturnValue;
+      "WebAuthn.disable": WebAuthn.disableReturnValue;
+      "WebAuthn.addVirtualAuthenticator": WebAuthn.addVirtualAuthenticatorReturnValue;
+      "WebAuthn.removeVirtualAuthenticator": WebAuthn.removeVirtualAuthenticatorReturnValue;
+      "WebAuthn.addCredential": WebAuthn.addCredentialReturnValue;
+      "WebAuthn.getCredential": WebAuthn.getCredentialReturnValue;
+      "WebAuthn.getCredentials": WebAuthn.getCredentialsReturnValue;
+      "WebAuthn.removeCredential": WebAuthn.removeCredentialReturnValue;
+      "WebAuthn.clearCredentials": WebAuthn.clearCredentialsReturnValue;
+      "WebAuthn.setUserVerified": WebAuthn.setUserVerifiedReturnValue;
+      "Media.enable": Media.enableReturnValue;
+      "Media.disable": Media.disableReturnValue;
+      "Console.clearMessages": Console.clearMessagesReturnValue;
+      "Console.disable": Console.disableReturnValue;
+      "Console.enable": Console.enableReturnValue;
+      "Debugger.continueToLocation": Debugger.continueToLocationReturnValue;
+      "Debugger.disable": Debugger.disableReturnValue;
+      "Debugger.enable": Debugger.enableReturnValue;
+      "Debugger.evaluateOnCallFrame": Debugger.evaluateOnCallFrameReturnValue;
+      "Debugger.getPossibleBreakpoints": Debugger.getPossibleBreakpointsReturnValue;
+      "Debugger.getScriptSource": Debugger.getScriptSourceReturnValue;
+      "Debugger.getWasmBytecode": Debugger.getWasmBytecodeReturnValue;
+      "Debugger.getStackTrace": Debugger.getStackTraceReturnValue;
+      "Debugger.pause": Debugger.pauseReturnValue;
+      "Debugger.pauseOnAsyncCall": Debugger.pauseOnAsyncCallReturnValue;
+      "Debugger.removeBreakpoint": Debugger.removeBreakpointReturnValue;
+      "Debugger.restartFrame": Debugger.restartFrameReturnValue;
+      "Debugger.resume": Debugger.resumeReturnValue;
+      "Debugger.searchInContent": Debugger.searchInContentReturnValue;
+      "Debugger.setAsyncCallStackDepth": Debugger.setAsyncCallStackDepthReturnValue;
+      "Debugger.setBlackboxPatterns": Debugger.setBlackboxPatternsReturnValue;
+      "Debugger.setBlackboxedRanges": Debugger.setBlackboxedRangesReturnValue;
+      "Debugger.setBreakpoint": Debugger.setBreakpointReturnValue;
+      "Debugger.setInstrumentationBreakpoint": Debugger.setInstrumentationBreakpointReturnValue;
+      "Debugger.setBreakpointByUrl": Debugger.setBreakpointByUrlReturnValue;
+      "Debugger.setBreakpointOnFunctionCall": Debugger.setBreakpointOnFunctionCallReturnValue;
+      "Debugger.setBreakpointsActive": Debugger.setBreakpointsActiveReturnValue;
+      "Debugger.setPauseOnExceptions": Debugger.setPauseOnExceptionsReturnValue;
+      "Debugger.setReturnValue": Debugger.setReturnValueReturnValue;
+      "Debugger.setScriptSource": Debugger.setScriptSourceReturnValue;
+      "Debugger.setSkipAllPauses": Debugger.setSkipAllPausesReturnValue;
+      "Debugger.setVariableValue": Debugger.setVariableValueReturnValue;
+      "Debugger.stepInto": Debugger.stepIntoReturnValue;
+      "Debugger.stepOut": Debugger.stepOutReturnValue;
+      "Debugger.stepOver": Debugger.stepOverReturnValue;
+      "HeapProfiler.addInspectedHeapObject": HeapProfiler.addInspectedHeapObjectReturnValue;
+      "HeapProfiler.collectGarbage": HeapProfiler.collectGarbageReturnValue;
+      "HeapProfiler.disable": HeapProfiler.disableReturnValue;
+      "HeapProfiler.enable": HeapProfiler.enableReturnValue;
+      "HeapProfiler.getHeapObjectId": HeapProfiler.getHeapObjectIdReturnValue;
+      "HeapProfiler.getObjectByHeapObjectId": HeapProfiler.getObjectByHeapObjectIdReturnValue;
+      "HeapProfiler.getSamplingProfile": HeapProfiler.getSamplingProfileReturnValue;
+      "HeapProfiler.startSampling": HeapProfiler.startSamplingReturnValue;
+      "HeapProfiler.startTrackingHeapObjects": HeapProfiler.startTrackingHeapObjectsReturnValue;
+      "HeapProfiler.stopSampling": HeapProfiler.stopSamplingReturnValue;
+      "HeapProfiler.stopTrackingHeapObjects": HeapProfiler.stopTrackingHeapObjectsReturnValue;
+      "HeapProfiler.takeHeapSnapshot": HeapProfiler.takeHeapSnapshotReturnValue;
+      "Profiler.disable": Profiler.disableReturnValue;
+      "Profiler.enable": Profiler.enableReturnValue;
+      "Profiler.getBestEffortCoverage": Profiler.getBestEffortCoverageReturnValue;
+      "Profiler.setSamplingInterval": Profiler.setSamplingIntervalReturnValue;
+      "Profiler.start": Profiler.startReturnValue;
+      "Profiler.startPreciseCoverage": Profiler.startPreciseCoverageReturnValue;
+      "Profiler.startTypeProfile": Profiler.startTypeProfileReturnValue;
+      "Profiler.stop": Profiler.stopReturnValue;
+      "Profiler.stopPreciseCoverage": Profiler.stopPreciseCoverageReturnValue;
+      "Profiler.stopTypeProfile": Profiler.stopTypeProfileReturnValue;
+      "Profiler.takePreciseCoverage": Profiler.takePreciseCoverageReturnValue;
+      "Profiler.takeTypeProfile": Profiler.takeTypeProfileReturnValue;
+      "Profiler.enableRuntimeCallStats": Profiler.enableRuntimeCallStatsReturnValue;
+      "Profiler.disableRuntimeCallStats": Profiler.disableRuntimeCallStatsReturnValue;
+      "Profiler.getRuntimeCallStats": Profiler.getRuntimeCallStatsReturnValue;
+      "Runtime.awaitPromise": Runtime.awaitPromiseReturnValue;
+      "Runtime.callFunctionOn": Runtime.callFunctionOnReturnValue;
+      "Runtime.compileScript": Runtime.compileScriptReturnValue;
+      "Runtime.disable": Runtime.disableReturnValue;
+      "Runtime.discardConsoleEntries": Runtime.discardConsoleEntriesReturnValue;
+      "Runtime.enable": Runtime.enableReturnValue;
+      "Runtime.evaluate": Runtime.evaluateReturnValue;
+      "Runtime.getIsolateId": Runtime.getIsolateIdReturnValue;
+      "Runtime.getHeapUsage": Runtime.getHeapUsageReturnValue;
+      "Runtime.getProperties": Runtime.getPropertiesReturnValue;
+      "Runtime.globalLexicalScopeNames": Runtime.globalLexicalScopeNamesReturnValue;
+      "Runtime.queryObjects": Runtime.queryObjectsReturnValue;
+      "Runtime.releaseObject": Runtime.releaseObjectReturnValue;
+      "Runtime.releaseObjectGroup": Runtime.releaseObjectGroupReturnValue;
+      "Runtime.runIfWaitingForDebugger": Runtime.runIfWaitingForDebuggerReturnValue;
+      "Runtime.runScript": Runtime.runScriptReturnValue;
+      "Runtime.setAsyncCallStackDepth": Runtime.setAsyncCallStackDepthReturnValue;
+      "Runtime.setCustomObjectFormatterEnabled": Runtime.setCustomObjectFormatterEnabledReturnValue;
+      "Runtime.setMaxCallStackSizeToCapture": Runtime.setMaxCallStackSizeToCaptureReturnValue;
+      "Runtime.terminateExecution": Runtime.terminateExecutionReturnValue;
+      "Runtime.addBinding": Runtime.addBindingReturnValue;
+      "Runtime.removeBinding": Runtime.removeBindingReturnValue;
+      "Schema.getDomains": Schema.getDomainsReturnValue;
+    }
+  }
+}
+
+export default Protocol;
diff --git a/node_modules/puppeteer/node_modules/.bin/rimraf b/node_modules/puppeteer/node_modules/.bin/rimraf
deleted file mode 120000
index 4cd49a4..0000000
--- a/node_modules/puppeteer/node_modules/.bin/rimraf
+++ /dev/null
@@ -1 +0,0 @@
-../rimraf/bin.js
\ No newline at end of file
diff --git a/node_modules/puppeteer/node_modules/rimraf/README.md b/node_modules/puppeteer/node_modules/rimraf/README.md
deleted file mode 100644
index 423b8cf..0000000
--- a/node_modules/puppeteer/node_modules/rimraf/README.md
+++ /dev/null
@@ -1,101 +0,0 @@
-[![Build Status](https://travis-ci.org/isaacs/rimraf.svg?branch=master)](https://travis-ci.org/isaacs/rimraf) [![Dependency Status](https://david-dm.org/isaacs/rimraf.svg)](https://david-dm.org/isaacs/rimraf) [![devDependency Status](https://david-dm.org/isaacs/rimraf/dev-status.svg)](https://david-dm.org/isaacs/rimraf#info=devDependencies)
-
-The [UNIX command](http://en.wikipedia.org/wiki/Rm_(Unix)) `rm -rf` for node.
-
-Install with `npm install rimraf`, or just drop rimraf.js somewhere.
-
-## API
-
-`rimraf(f, [opts], callback)`
-
-The first parameter will be interpreted as a globbing pattern for files. If you
-want to disable globbing you can do so with `opts.disableGlob` (defaults to
-`false`). This might be handy, for instance, if you have filenames that contain
-globbing wildcard characters.
-
-The callback will be called with an error if there is one.  Certain
-errors are handled for you:
-
-* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of
-  `opts.maxBusyTries` times before giving up, adding 100ms of wait
-  between each attempt.  The default `maxBusyTries` is 3.
-* `ENOENT` - If the file doesn't exist, rimraf will return
-  successfully, since your desired outcome is already the case.
-* `EMFILE` - Since `readdir` requires opening a file descriptor, it's
-  possible to hit `EMFILE` if too many file descriptors are in use.
-  In the sync case, there's nothing to be done for this.  But in the
-  async case, rimraf will gradually back off with timeouts up to
-  `opts.emfileWait` ms, which defaults to 1000.
-
-## options
-
-* unlink, chmod, stat, lstat, rmdir, readdir,
-  unlinkSync, chmodSync, statSync, lstatSync, rmdirSync, readdirSync
-
-    In order to use a custom file system library, you can override
-    specific fs functions on the options object.
-
-    If any of these functions are present on the options object, then
-    the supplied function will be used instead of the default fs
-    method.
-
-    Sync methods are only relevant for `rimraf.sync()`, of course.
-
-    For example:
-
-    ```javascript
-    var myCustomFS = require('some-custom-fs')
-
-    rimraf('some-thing', myCustomFS, callback)
-    ```
-
-* maxBusyTries
-
-    If an `EBUSY`, `ENOTEMPTY`, or `EPERM` error code is encountered
-    on Windows systems, then rimraf will retry with a linear backoff
-    wait of 100ms longer on each try.  The default maxBusyTries is 3.
-
-    Only relevant for async usage.
-
-* emfileWait
-
-    If an `EMFILE` error is encountered, then rimraf will retry
-    repeatedly with a linear backoff of 1ms longer on each try, until
-    the timeout counter hits this max.  The default limit is 1000.
-
-    If you repeatedly encounter `EMFILE` errors, then consider using
-    [graceful-fs](http://npm.im/graceful-fs) in your program.
-
-    Only relevant for async usage.
-
-* glob
-
-    Set to `false` to disable [glob](http://npm.im/glob) pattern
-    matching.
-
-    Set to an object to pass options to the glob module.  The default
-    glob options are `{ nosort: true, silent: true }`.
-
-    Glob version 6 is used in this module.
-
-    Relevant for both sync and async usage.
-
-* disableGlob
-
-    Set to any non-falsey value to disable globbing entirely.
-    (Equivalent to setting `glob: false`.)
-
-## rimraf.sync
-
-It can remove stuff synchronously, too.  But that's not so good.  Use
-the async API.  It's better.
-
-## CLI
-
-If installed with `npm install rimraf -g` it can be used as a global
-command `rimraf <path> [<path> ...]` which is useful for cross platform support.
-
-## mkdirp
-
-If you need to create a directory recursively, check out
-[mkdirp](https://github.com/substack/node-mkdirp).
diff --git a/node_modules/puppeteer/node_modules/rimraf/bin.js b/node_modules/puppeteer/node_modules/rimraf/bin.js
deleted file mode 100755
index 0d1e17b..0000000
--- a/node_modules/puppeteer/node_modules/rimraf/bin.js
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env node
-
-var rimraf = require('./')
-
-var help = false
-var dashdash = false
-var noglob = false
-var args = process.argv.slice(2).filter(function(arg) {
-  if (dashdash)
-    return !!arg
-  else if (arg === '--')
-    dashdash = true
-  else if (arg === '--no-glob' || arg === '-G')
-    noglob = true
-  else if (arg === '--glob' || arg === '-g')
-    noglob = false
-  else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/))
-    help = true
-  else
-    return !!arg
-})
-
-if (help || args.length === 0) {
-  // If they didn't ask for help, then this is not a "success"
-  var log = help ? console.log : console.error
-  log('Usage: rimraf <path> [<path> ...]')
-  log('')
-  log('  Deletes all files and folders at "path" recursively.')
-  log('')
-  log('Options:')
-  log('')
-  log('  -h, --help     Display this usage info')
-  log('  -G, --no-glob  Do not expand glob patterns in arguments')
-  log('  -g, --glob     Expand glob patterns in arguments (default)')
-  process.exit(help ? 0 : 1)
-} else
-  go(0)
-
-function go (n) {
-  if (n >= args.length)
-    return
-  var options = {}
-  if (noglob)
-    options = { glob: false }
-  rimraf(args[n], options, function (er) {
-    if (er)
-      throw er
-    go(n+1)
-  })
-}
diff --git a/node_modules/puppeteer/node_modules/rimraf/package.json b/node_modules/puppeteer/node_modules/rimraf/package.json
deleted file mode 100644
index 438280e..0000000
--- a/node_modules/puppeteer/node_modules/rimraf/package.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
-  "bin": "./bin.js",
-  "dependencies": {
-    "glob": "^7.1.3"
-  },
-  "description": "A deep deletion module for node (like `rm -rf`)",
-  "devDependencies": {
-    "mkdirp": "^0.5.1",
-    "tap": "^12.1.1"
-  },
-  "files": [
-    "LICENSE",
-    "README.md",
-    "bin.js",
-    "rimraf.js"
-  ],
-  "license": "ISC",
-  "main": "rimraf.js",
-  "name": "rimraf",
-  "repository": "git://github.com/isaacs/rimraf.git",
-  "scripts": {
-    "postpublish": "git push origin --all; git push origin --tags",
-    "postversion": "npm publish",
-    "preversion": "npm test",
-    "test": "tap test/*.js"
-  },
-  "version": "2.7.1"
-}
\ No newline at end of file
diff --git a/node_modules/puppeteer/node_modules/rimraf/rimraf.js b/node_modules/puppeteer/node_modules/rimraf/rimraf.js
deleted file mode 100644
index a90ad02..0000000
--- a/node_modules/puppeteer/node_modules/rimraf/rimraf.js
+++ /dev/null
@@ -1,372 +0,0 @@
-module.exports = rimraf
-rimraf.sync = rimrafSync
-
-var assert = require("assert")
-var path = require("path")
-var fs = require("fs")
-var glob = undefined
-try {
-  glob = require("glob")
-} catch (_err) {
-  // treat glob as optional.
-}
-var _0666 = parseInt('666', 8)
-
-var defaultGlobOpts = {
-  nosort: true,
-  silent: true
-}
-
-// for EMFILE handling
-var timeout = 0
-
-var isWindows = (process.platform === "win32")
-
-function defaults (options) {
-  var methods = [
-    'unlink',
-    'chmod',
-    'stat',
-    'lstat',
-    'rmdir',
-    'readdir'
-  ]
-  methods.forEach(function(m) {
-    options[m] = options[m] || fs[m]
-    m = m + 'Sync'
-    options[m] = options[m] || fs[m]
-  })
-
-  options.maxBusyTries = options.maxBusyTries || 3
-  options.emfileWait = options.emfileWait || 1000
-  if (options.glob === false) {
-    options.disableGlob = true
-  }
-  if (options.disableGlob !== true && glob === undefined) {
-    throw Error('glob dependency not found, set `options.disableGlob = true` if intentional')
-  }
-  options.disableGlob = options.disableGlob || false
-  options.glob = options.glob || defaultGlobOpts
-}
-
-function rimraf (p, options, cb) {
-  if (typeof options === 'function') {
-    cb = options
-    options = {}
-  }
-
-  assert(p, 'rimraf: missing path')
-  assert.equal(typeof p, 'string', 'rimraf: path should be a string')
-  assert.equal(typeof cb, 'function', 'rimraf: callback function required')
-  assert(options, 'rimraf: invalid options argument provided')
-  assert.equal(typeof options, 'object', 'rimraf: options should be object')
-
-  defaults(options)
-
-  var busyTries = 0
-  var errState = null
-  var n = 0
-
-  if (options.disableGlob || !glob.hasMagic(p))
-    return afterGlob(null, [p])
-
-  options.lstat(p, function (er, stat) {
-    if (!er)
-      return afterGlob(null, [p])
-
-    glob(p, options.glob, afterGlob)
-  })
-
-  function next (er) {
-    errState = errState || er
-    if (--n === 0)
-      cb(errState)
-  }
-
-  function afterGlob (er, results) {
-    if (er)
-      return cb(er)
-
-    n = results.length
-    if (n === 0)
-      return cb()
-
-    results.forEach(function (p) {
-      rimraf_(p, options, function CB (er) {
-        if (er) {
-          if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") &&
-              busyTries < options.maxBusyTries) {
-            busyTries ++
-            var time = busyTries * 100
-            // try again, with the same exact callback as this one.
-            return setTimeout(function () {
-              rimraf_(p, options, CB)
-            }, time)
-          }
-
-          // this one won't happen if graceful-fs is used.
-          if (er.code === "EMFILE" && timeout < options.emfileWait) {
-            return setTimeout(function () {
-              rimraf_(p, options, CB)
-            }, timeout ++)
-          }
-
-          // already gone
-          if (er.code === "ENOENT") er = null
-        }
-
-        timeout = 0
-        next(er)
-      })
-    })
-  }
-}
-
-// Two possible strategies.
-// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
-// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
-//
-// Both result in an extra syscall when you guess wrong.  However, there
-// are likely far more normal files in the world than directories.  This
-// is based on the assumption that a the average number of files per
-// directory is >= 1.
-//
-// If anyone ever complains about this, then I guess the strategy could
-// be made configurable somehow.  But until then, YAGNI.
-function rimraf_ (p, options, cb) {
-  assert(p)
-  assert(options)
-  assert(typeof cb === 'function')
-
-  // sunos lets the root user unlink directories, which is... weird.
-  // so we have to lstat here and make sure it's not a dir.
-  options.lstat(p, function (er, st) {
-    if (er && er.code === "ENOENT")
-      return cb(null)
-
-    // Windows can EPERM on stat.  Life is suffering.
-    if (er && er.code === "EPERM" && isWindows)
-      fixWinEPERM(p, options, er, cb)
-
-    if (st && st.isDirectory())
-      return rmdir(p, options, er, cb)
-
-    options.unlink(p, function (er) {
-      if (er) {
-        if (er.code === "ENOENT")
-          return cb(null)
-        if (er.code === "EPERM")
-          return (isWindows)
-            ? fixWinEPERM(p, options, er, cb)
-            : rmdir(p, options, er, cb)
-        if (er.code === "EISDIR")
-          return rmdir(p, options, er, cb)
-      }
-      return cb(er)
-    })
-  })
-}
-
-function fixWinEPERM (p, options, er, cb) {
-  assert(p)
-  assert(options)
-  assert(typeof cb === 'function')
-  if (er)
-    assert(er instanceof Error)
-
-  options.chmod(p, _0666, function (er2) {
-    if (er2)
-      cb(er2.code === "ENOENT" ? null : er)
-    else
-      options.stat(p, function(er3, stats) {
-        if (er3)
-          cb(er3.code === "ENOENT" ? null : er)
-        else if (stats.isDirectory())
-          rmdir(p, options, er, cb)
-        else
-          options.unlink(p, cb)
-      })
-  })
-}
-
-function fixWinEPERMSync (p, options, er) {
-  assert(p)
-  assert(options)
-  if (er)
-    assert(er instanceof Error)
-
-  try {
-    options.chmodSync(p, _0666)
-  } catch (er2) {
-    if (er2.code === "ENOENT")
-      return
-    else
-      throw er
-  }
-
-  try {
-    var stats = options.statSync(p)
-  } catch (er3) {
-    if (er3.code === "ENOENT")
-      return
-    else
-      throw er
-  }
-
-  if (stats.isDirectory())
-    rmdirSync(p, options, er)
-  else
-    options.unlinkSync(p)
-}
-
-function rmdir (p, options, originalEr, cb) {
-  assert(p)
-  assert(options)
-  if (originalEr)
-    assert(originalEr instanceof Error)
-  assert(typeof cb === 'function')
-
-  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
-  // if we guessed wrong, and it's not a directory, then
-  // raise the original error.
-  options.rmdir(p, function (er) {
-    if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM"))
-      rmkids(p, options, cb)
-    else if (er && er.code === "ENOTDIR")
-      cb(originalEr)
-    else
-      cb(er)
-  })
-}
-
-function rmkids(p, options, cb) {
-  assert(p)
-  assert(options)
-  assert(typeof cb === 'function')
-
-  options.readdir(p, function (er, files) {
-    if (er)
-      return cb(er)
-    var n = files.length
-    if (n === 0)
-      return options.rmdir(p, cb)
-    var errState
-    files.forEach(function (f) {
-      rimraf(path.join(p, f), options, function (er) {
-        if (errState)
-          return
-        if (er)
-          return cb(errState = er)
-        if (--n === 0)
-          options.rmdir(p, cb)
-      })
-    })
-  })
-}
-
-// this looks simpler, and is strictly *faster*, but will
-// tie up the JavaScript thread and fail on excessively
-// deep directory trees.
-function rimrafSync (p, options) {
-  options = options || {}
-  defaults(options)
-
-  assert(p, 'rimraf: missing path')
-  assert.equal(typeof p, 'string', 'rimraf: path should be a string')
-  assert(options, 'rimraf: missing options')
-  assert.equal(typeof options, 'object', 'rimraf: options should be object')
-
-  var results
-
-  if (options.disableGlob || !glob.hasMagic(p)) {
-    results = [p]
-  } else {
-    try {
-      options.lstatSync(p)
-      results = [p]
-    } catch (er) {
-      results = glob.sync(p, options.glob)
-    }
-  }
-
-  if (!results.length)
-    return
-
-  for (var i = 0; i < results.length; i++) {
-    var p = results[i]
-
-    try {
-      var st = options.lstatSync(p)
-    } catch (er) {
-      if (er.code === "ENOENT")
-        return
-
-      // Windows can EPERM on stat.  Life is suffering.
-      if (er.code === "EPERM" && isWindows)
-        fixWinEPERMSync(p, options, er)
-    }
-
-    try {
-      // sunos lets the root user unlink directories, which is... weird.
-      if (st && st.isDirectory())
-        rmdirSync(p, options, null)
-      else
-        options.unlinkSync(p)
-    } catch (er) {
-      if (er.code === "ENOENT")
-        return
-      if (er.code === "EPERM")
-        return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
-      if (er.code !== "EISDIR")
-        throw er
-
-      rmdirSync(p, options, er)
-    }
-  }
-}
-
-function rmdirSync (p, options, originalEr) {
-  assert(p)
-  assert(options)
-  if (originalEr)
-    assert(originalEr instanceof Error)
-
-  try {
-    options.rmdirSync(p)
-  } catch (er) {
-    if (er.code === "ENOENT")
-      return
-    if (er.code === "ENOTDIR")
-      throw originalEr
-    if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")
-      rmkidsSync(p, options)
-  }
-}
-
-function rmkidsSync (p, options) {
-  assert(p)
-  assert(options)
-  options.readdirSync(p).forEach(function (f) {
-    rimrafSync(path.join(p, f), options)
-  })
-
-  // We only end up here once we got ENOTEMPTY at least once, and
-  // at this point, we are guaranteed to have removed all the kids.
-  // So, we know that it won't be ENOENT or ENOTDIR or anything else.
-  // try really hard to delete stuff on windows, because it has a
-  // PROFOUNDLY annoying habit of not closing handles promptly when
-  // files are deleted, resulting in spurious ENOTEMPTY errors.
-  var retries = isWindows ? 100 : 1
-  var i = 0
-  do {
-    var threw = true
-    try {
-      var ret = options.rmdirSync(p, options)
-      threw = false
-      return ret
-    } finally {
-      if (++i < retries && threw)
-        continue
-    }
-  } while (true)
-}
diff --git a/node_modules/puppeteer/node_modules/ws/README.md b/node_modules/puppeteer/node_modules/ws/README.md
index 2b5c611..3148d40 100644
--- a/node_modules/puppeteer/node_modules/ws/README.md
+++ b/node_modules/puppeteer/node_modules/ws/README.md
@@ -1,8 +1,8 @@
 # ws: a Node.js WebSocket library
 
 [![Version npm](https://img.shields.io/npm/v/ws.svg?logo=npm)](https://www.npmjs.com/package/ws)
-[![Linux Build](https://img.shields.io/travis/websockets/ws/master.svg?logo=travis)](https://travis-ci.org/websockets/ws)
-[![Windows Build](https://img.shields.io/appveyor/ci/lpinca/ws/master.svg?logo=appveyor)](https://ci.appveyor.com/project/lpinca/ws)
+[![Build](https://github.com/websockets/ws/workflows/.github/workflows/build/badge.svg)](https://github.com/websockets/ws/actions?workflow=build)
+[![Windows x86 Build](https://img.shields.io/appveyor/ci/lpinca/ws/master.svg?logo=appveyor)](https://ci.appveyor.com/project/lpinca/ws)
 [![Coverage Status](https://img.shields.io/coveralls/websockets/ws/master.svg)](https://coveralls.io/github/websockets/ws)
 
 ws is a simple to use, blazing fast, and thoroughly tested WebSocket client and
@@ -32,10 +32,11 @@
   - [Simple server](#simple-server)
   - [External HTTP/S server](#external-https-server)
   - [Multiple servers sharing a single HTTP/S server](#multiple-servers-sharing-a-single-https-server)
+  - [Client authentication](#client-authentication)
   - [Server broadcast](#server-broadcast)
   - [echo.websocket.org demo](#echowebsocketorg-demo)
+  - [Use the Node.js streams API](#use-the-nodejs-streams-api)
   - [Other examples](#other-examples)
-- [Error handling best practices](#error-handling-best-practices)
 - [FAQ](#faq)
   - [How to get the IP address of the client?](#how-to-get-the-ip-address-of-the-client)
   - [How to detect and close broken connections?](#how-to-detect-and-close-broken-connections)
@@ -70,7 +71,8 @@
 
 ## API docs
 
-See [`/doc/ws.md`](./doc/ws.md) for Node.js-like docs for the ws classes.
+See [`/doc/ws.md`](./doc/ws.md) for Node.js-like documentation of ws classes and
+utility functions.
 
 ## WebSocket compression
 
@@ -193,7 +195,7 @@
 const https = require('https');
 const WebSocket = require('ws');
 
-const server = new https.createServer({
+const server = https.createServer({
   cert: fs.readFileSync('/path/to/cert.pem'),
   key: fs.readFileSync('/path/to/key.pem')
 });
@@ -215,6 +217,7 @@
 ```js
 const http = require('http');
 const WebSocket = require('ws');
+const url = require('url');
 
 const server = http.createServer();
 const wss1 = new WebSocket.Server({ noServer: true });
@@ -247,25 +250,72 @@
 server.listen(8080);
 ```
 
+### Client authentication
+
+```js
+const http = require('http');
+const WebSocket = require('ws');
+
+const server = http.createServer();
+const wss = new WebSocket.Server({ noServer: true });
+
+wss.on('connection', function connection(ws, request, client) {
+  ws.on('message', function message(msg) {
+    console.log(`Received message ${msg} from user ${client}`);
+  });
+});
+
+server.on('upgrade', function upgrade(request, socket, head) {
+  // This function is not defined on purpose. Implement it with your own logic.
+  authenticate(request, (err, client) => {
+    if (err || !client) {
+      socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
+      socket.destroy();
+      return;
+    }
+
+    wss.handleUpgrade(request, socket, head, function done(ws) {
+      wss.emit('connection', ws, request, client);
+    });
+  });
+});
+
+server.listen(8080);
+```
+
+Also see the provided [example][session-parse-example] using `express-session`.
+
 ### Server broadcast
 
+A client WebSocket broadcasting to all connected WebSocket clients, including
+itself.
+
 ```js
 const WebSocket = require('ws');
 
 const wss = new WebSocket.Server({ port: 8080 });
 
-// Broadcast to all.
-wss.broadcast = function broadcast(data) {
-  wss.clients.forEach(function each(client) {
-    if (client.readyState === WebSocket.OPEN) {
-      client.send(data);
-    }
+wss.on('connection', function connection(ws) {
+  ws.on('message', function incoming(data) {
+    wss.clients.forEach(function each(client) {
+      if (client.readyState === WebSocket.OPEN) {
+        client.send(data);
+      }
+    });
   });
-};
+});
+```
+
+A client WebSocket broadcasting to every other connected WebSocket clients,
+excluding itself.
+
+```js
+const WebSocket = require('ws');
+
+const wss = new WebSocket.Server({ port: 8080 });
 
 wss.on('connection', function connection(ws) {
   ws.on('message', function incoming(data) {
-    // Broadcast to everyone else.
     wss.clients.forEach(function each(client) {
       if (client !== ws && client.readyState === WebSocket.OPEN) {
         client.send(data);
@@ -302,6 +352,21 @@
 });
 ```
 
+### Use the Node.js streams API
+
+```js
+const WebSocket = require('ws');
+
+const ws = new WebSocket('wss://echo.websocket.org/', {
+  origin: 'https://websocket.org'
+});
+
+const duplex = WebSocket.createWebSocketStream(ws, { encoding: 'utf8' });
+
+duplex.pipe(process.stdout);
+process.stdin.pipe(duplex);
+```
+
 ### Other examples
 
 For a full example with a browser client communicating with a ws server, see the
@@ -309,30 +374,6 @@
 
 Otherwise, see the test cases.
 
-## Error handling best practices
-
-```js
-// If the WebSocket is closed before the following send is attempted
-ws.send('something');
-
-// Errors (both immediate and async write errors) can be detected in an optional
-// callback. The callback is also the only way of being notified that data has
-// actually been sent.
-ws.send('something', function ack(error) {
-  // If error is not defined, the send has been completed, otherwise the error
-  // object will indicate what failed.
-});
-
-// Immediate errors can also be handled with `try...catch`, but **note** that
-// since sends are inherently asynchronous, socket write failures will *not* be
-// captured when this technique is used.
-try {
-  ws.send('something');
-} catch (e) {
-  /* handle error */
-}
-```
-
 ## FAQ
 
 ### How to get the IP address of the client?
@@ -345,7 +386,7 @@
 const wss = new WebSocket.Server({ port: 8080 });
 
 wss.on('connection', function connection(ws, req) {
-  const ip = req.connection.remoteAddress;
+  const ip = req.socket.remoteAddress;
 });
 ```
 
@@ -391,6 +432,10 @@
     ws.ping(noop);
   });
 }, 30000);
+
+wss.on('close', function close() {
+  clearInterval(interval);
+});
 ```
 
 Pong messages are automatically sent in response to ping messages as required by
@@ -406,9 +451,10 @@
 function heartbeat() {
   clearTimeout(this.pingTimeout);
 
-  // Use `WebSocket#terminate()` and not `WebSocket#close()`. Delay should be
-  // equal to the interval at which your server sends out pings plus a
-  // conservative assumption of the latency.
+  // Use `WebSocket#terminate()`, which immediately destroys the connection,
+  // instead of `WebSocket#close()`, which waits for the close timer.
+  // Delay should be equal to the interval at which your server
+  // sends out pings plus a conservative assumption of the latency.
   this.pingTimeout = setTimeout(() => {
     this.terminate();
   }, 30000 + 1000);
@@ -436,14 +482,15 @@
 
 [MIT](LICENSE)
 
-[https-proxy-agent]: https://github.com/TooTallNate/node-https-proxy-agent
-[socks-proxy-agent]: https://github.com/TooTallNate/node-socks-proxy-agent
-[client-report]: http://websockets.github.io/ws/autobahn/clients/
-[server-report]: http://websockets.github.io/ws/autobahn/servers/
-[permessage-deflate]: https://tools.ietf.org/html/rfc7692
 [changelog]: https://github.com/websockets/ws/releases
+[client-report]: http://websockets.github.io/ws/autobahn/clients/
+[https-proxy-agent]: https://github.com/TooTallNate/node-https-proxy-agent
 [node-zlib-bug]: https://github.com/nodejs/node/issues/8871
 [node-zlib-deflaterawdocs]:
   https://nodejs.org/api/zlib.html#zlib_zlib_createdeflateraw_options
+[permessage-deflate]: https://tools.ietf.org/html/rfc7692
+[server-report]: http://websockets.github.io/ws/autobahn/servers/
+[session-parse-example]: ./examples/express-session-parse
+[socks-proxy-agent]: https://github.com/TooTallNate/node-socks-proxy-agent
 [ws-server-options]:
   https://github.com/websockets/ws/blob/master/doc/ws.md#new-websocketserveroptions-callback
diff --git a/node_modules/puppeteer/node_modules/ws/index.js b/node_modules/puppeteer/node_modules/ws/index.js
index b8d6be1..722c786 100644
--- a/node_modules/puppeteer/node_modules/ws/index.js
+++ b/node_modules/puppeteer/node_modules/ws/index.js
@@ -2,6 +2,7 @@
 
 const WebSocket = require('./lib/websocket');
 
+WebSocket.createWebSocketStream = require('./lib/stream');
 WebSocket.Server = require('./lib/websocket-server');
 WebSocket.Receiver = require('./lib/receiver');
 WebSocket.Sender = require('./lib/sender');
diff --git a/node_modules/puppeteer/node_modules/ws/lib/buffer-util.js b/node_modules/puppeteer/node_modules/ws/lib/buffer-util.js
index 8fcb88f..6fd84c3 100644
--- a/node_modules/puppeteer/node_modules/ws/lib/buffer-util.js
+++ b/node_modules/puppeteer/node_modules/ws/lib/buffer-util.js
@@ -15,14 +15,16 @@
   if (list.length === 1) return list[0];
 
   const target = Buffer.allocUnsafe(totalLength);
-  var offset = 0;
+  let offset = 0;
 
-  for (var i = 0; i < list.length; i++) {
+  for (let i = 0; i < list.length; i++) {
     const buf = list[i];
-    buf.copy(target, offset);
+    target.set(buf, offset);
     offset += buf.length;
   }
 
+  if (offset < totalLength) return target.slice(0, offset);
+
   return target;
 }
 
@@ -37,7 +39,7 @@
  * @public
  */
 function _mask(source, mask, output, offset, length) {
-  for (var i = 0; i < length; i++) {
+  for (let i = 0; i < length; i++) {
     output[offset + i] = source[i] ^ mask[i & 3];
   }
 }
@@ -52,7 +54,7 @@
 function _unmask(buffer, mask) {
   // Required until https://github.com/nodejs/node/issues/9006 is resolved.
   const length = buffer.length;
-  for (var i = 0; i < length; i++) {
+  for (let i = 0; i < length; i++) {
     buffer[i] ^= mask[i & 3];
   }
 }
@@ -85,12 +87,12 @@
 
   if (Buffer.isBuffer(data)) return data;
 
-  var buf;
+  let buf;
 
   if (data instanceof ArrayBuffer) {
     buf = Buffer.from(data);
   } else if (ArrayBuffer.isView(data)) {
-    buf = viewToBuffer(data);
+    buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength);
   } else {
     buf = Buffer.from(data);
     toBuffer.readOnly = false;
@@ -99,23 +101,6 @@
   return buf;
 }
 
-/**
- * Converts an `ArrayBuffer` view into a buffer.
- *
- * @param {(DataView|TypedArray)} view The view to convert
- * @return {Buffer} Converted view
- * @private
- */
-function viewToBuffer(view) {
-  const buf = Buffer.from(view.buffer);
-
-  if (view.byteLength !== view.buffer.byteLength) {
-    return buf.slice(view.byteOffset, view.byteOffset + view.byteLength);
-  }
-
-  return buf;
-}
-
 try {
   const bufferUtil = require('bufferutil');
   const bu = bufferUtil.BufferUtil || bufferUtil;
diff --git a/node_modules/puppeteer/node_modules/ws/lib/event-target.js b/node_modules/puppeteer/node_modules/ws/lib/event-target.js
index 44c81d9..c060d63 100644
--- a/node_modules/puppeteer/node_modules/ws/lib/event-target.js
+++ b/node_modules/puppeteer/node_modules/ws/lib/event-target.js
@@ -159,7 +159,7 @@
   removeEventListener(method, listener) {
     const listeners = this.listeners(method);
 
-    for (var i = 0; i < listeners.length; i++) {
+    for (let i = 0; i < listeners.length; i++) {
       if (listeners[i] === listener || listeners[i]._listener === listener) {
         this.removeListener(method, listeners[i]);
       }
diff --git a/node_modules/puppeteer/node_modules/ws/lib/extension.js b/node_modules/puppeteer/node_modules/ws/lib/extension.js
index 47096b9..87a4213 100644
--- a/node_modules/puppeteer/node_modules/ws/lib/extension.js
+++ b/node_modules/puppeteer/node_modules/ws/lib/extension.js
@@ -34,8 +34,8 @@
  * @private
  */
 function push(dest, name, elem) {
-  if (Object.prototype.hasOwnProperty.call(dest, name)) dest[name].push(elem);
-  else dest[name] = [elem];
+  if (dest[name] === undefined) dest[name] = [elem];
+  else dest[name].push(elem);
 }
 
 /**
@@ -46,20 +46,21 @@
  * @public
  */
 function parse(header) {
-  const offers = {};
+  const offers = Object.create(null);
 
   if (header === undefined || header === '') return offers;
 
-  var params = {};
-  var mustUnescape = false;
-  var isEscaping = false;
-  var inQuotes = false;
-  var extensionName;
-  var paramName;
-  var start = -1;
-  var end = -1;
+  let params = Object.create(null);
+  let mustUnescape = false;
+  let isEscaping = false;
+  let inQuotes = false;
+  let extensionName;
+  let paramName;
+  let start = -1;
+  let end = -1;
+  let i = 0;
 
-  for (var i = 0; i < header.length; i++) {
+  for (; i < header.length; i++) {
     const code = header.charCodeAt(i);
 
     if (extensionName === undefined) {
@@ -76,7 +77,7 @@
         const name = header.slice(start, end);
         if (code === 0x2c) {
           push(offers, name, params);
-          params = {};
+          params = Object.create(null);
         } else {
           extensionName = name;
         }
@@ -99,7 +100,7 @@
         push(params, header.slice(start, end), true);
         if (code === 0x2c) {
           push(offers, extensionName, params);
-          params = {};
+          params = Object.create(null);
           extensionName = undefined;
         }
 
@@ -146,7 +147,7 @@
         }
 
         if (end === -1) end = i;
-        var value = header.slice(start, end);
+        let value = header.slice(start, end);
         if (mustUnescape) {
           value = value.replace(/\\/g, '');
           mustUnescape = false;
@@ -154,7 +155,7 @@
         push(params, paramName, value);
         if (code === 0x2c) {
           push(offers, extensionName, params);
-          params = {};
+          params = Object.create(null);
           extensionName = undefined;
         }
 
@@ -173,7 +174,7 @@
   if (end === -1) end = i;
   const token = header.slice(start, end);
   if (extensionName === undefined) {
-    push(offers, token, {});
+    push(offers, token, params);
   } else {
     if (paramName === undefined) {
       push(params, token, true);
@@ -198,14 +199,14 @@
 function format(extensions) {
   return Object.keys(extensions)
     .map((extension) => {
-      var configurations = extensions[extension];
+      let configurations = extensions[extension];
       if (!Array.isArray(configurations)) configurations = [configurations];
       return configurations
         .map((params) => {
           return [extension]
             .concat(
               Object.keys(params).map((k) => {
-                var values = params[k];
+                let values = params[k];
                 if (!Array.isArray(values)) values = [values];
                 return values
                   .map((v) => (v === true ? k : `${k}=${v}`))
diff --git a/node_modules/puppeteer/node_modules/ws/lib/limiter.js b/node_modules/puppeteer/node_modules/ws/lib/limiter.js
new file mode 100644
index 0000000..8e99086
--- /dev/null
+++ b/node_modules/puppeteer/node_modules/ws/lib/limiter.js
@@ -0,0 +1,54 @@
+'use strict';
+
+const kDone = Symbol('kDone');
+const kRun = Symbol('kRun');
+
+/**
+ * A very simple job queue with adjustable concurrency. Adapted from
+ * https://github.com/STRML/async-limiter
+ */
+class Limiter {
+  /**
+   * Creates a new `Limiter`.
+   *
+   * @param {Number} concurrency The maximum number of jobs allowed to run
+   *     concurrently
+   */
+  constructor(concurrency) {
+    this[kDone] = () => {
+      this.pending--;
+      this[kRun]();
+    };
+    this.concurrency = concurrency || Infinity;
+    this.jobs = [];
+    this.pending = 0;
+  }
+
+  /**
+   * Adds a job to the queue.
+   *
+   * @public
+   */
+  add(job) {
+    this.jobs.push(job);
+    this[kRun]();
+  }
+
+  /**
+   * Removes a job from the queue and runs it if possible.
+   *
+   * @private
+   */
+  [kRun]() {
+    if (this.pending === this.concurrency) return;
+
+    if (this.jobs.length) {
+      const job = this.jobs.shift();
+
+      this.pending++;
+      job(this[kDone]);
+    }
+  }
+}
+
+module.exports = Limiter;
diff --git a/node_modules/puppeteer/node_modules/ws/lib/permessage-deflate.js b/node_modules/puppeteer/node_modules/ws/lib/permessage-deflate.js
index 9c88764..7bb7c98 100644
--- a/node_modules/puppeteer/node_modules/ws/lib/permessage-deflate.js
+++ b/node_modules/puppeteer/node_modules/ws/lib/permessage-deflate.js
@@ -1,14 +1,12 @@
 'use strict';
 
-const Limiter = require('async-limiter');
 const zlib = require('zlib');
 
 const bufferUtil = require('./buffer-util');
+const Limiter = require('./limiter');
 const { kStatusCode, NOOP } = require('./constants');
 
 const TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);
-const EMPTY_BLOCK = Buffer.from([0x00]);
-
 const kPerMessageDeflate = Symbol('permessage-deflate');
 const kTotalLength = Symbol('total-length');
 const kCallback = Symbol('callback');
@@ -66,7 +64,7 @@
         this._options.concurrencyLimit !== undefined
           ? this._options.concurrencyLimit
           : 10;
-      zlibLimiter = new Limiter({ concurrency });
+      zlibLimiter = new Limiter(concurrency);
     }
   }
 
@@ -133,8 +131,18 @@
     }
 
     if (this._deflate) {
+      const callback = this._deflate[kCallback];
+
       this._deflate.close();
       this._deflate = null;
+
+      if (callback) {
+        callback(
+          new Error(
+            'The deflate stream was closed while data was being processed'
+          )
+        );
+      }
     }
   }
 
@@ -233,7 +241,7 @@
   normalizeParams(configurations) {
     configurations.forEach((params) => {
       Object.keys(params).forEach((key) => {
-        var value = params[key];
+        let value = params[key];
 
         if (value.length > 1) {
           throw new Error(`Parameter "${key}" must have only a single value`);
@@ -284,7 +292,7 @@
   }
 
   /**
-   * Decompress data. Concurrency limited by async-limiter.
+   * Decompress data. Concurrency limited.
    *
    * @param {Buffer} data Compressed data
    * @param {Boolean} fin Specifies whether or not this is the last fragment
@@ -292,7 +300,7 @@
    * @public
    */
   decompress(data, fin, callback) {
-    zlibLimiter.push((done) => {
+    zlibLimiter.add((done) => {
       this._decompress(data, fin, (err, result) => {
         done();
         callback(err, result);
@@ -301,7 +309,7 @@
   }
 
   /**
-   * Compress data. Concurrency limited by async-limiter.
+   * Compress data. Concurrency limited.
    *
    * @param {Buffer} data Data to compress
    * @param {Boolean} fin Specifies whether or not this is the last fragment
@@ -309,7 +317,7 @@
    * @public
    */
   compress(data, fin, callback) {
-    zlibLimiter.push((done) => {
+    zlibLimiter.add((done) => {
       this._compress(data, fin, (err, result) => {
         done();
         callback(err, result);
@@ -335,9 +343,10 @@
           ? zlib.Z_DEFAULT_WINDOWBITS
           : this.params[key];
 
-      this._inflate = zlib.createInflateRaw(
-        Object.assign({}, this._options.zlibInflateOptions, { windowBits })
-      );
+      this._inflate = zlib.createInflateRaw({
+        ...this._options.zlibInflateOptions,
+        windowBits
+      });
       this._inflate[kPerMessageDeflate] = this;
       this._inflate[kTotalLength] = 0;
       this._inflate[kBuffers] = [];
@@ -386,11 +395,6 @@
    * @private
    */
   _compress(data, fin, callback) {
-    if (!data || data.length === 0) {
-      process.nextTick(callback, null, EMPTY_BLOCK);
-      return;
-    }
-
     const endpoint = this._isServer ? 'server' : 'client';
 
     if (!this._deflate) {
@@ -400,9 +404,10 @@
           ? zlib.Z_DEFAULT_WINDOWBITS
           : this.params[key];
 
-      this._deflate = zlib.createDeflateRaw(
-        Object.assign({}, this._options.zlibDeflateOptions, { windowBits })
-      );
+      this._deflate = zlib.createDeflateRaw({
+        ...this._options.zlibDeflateOptions,
+        windowBits
+      });
 
       this._deflate[kTotalLength] = 0;
       this._deflate[kBuffers] = [];
@@ -417,25 +422,30 @@
       this._deflate.on('data', deflateOnData);
     }
 
+    this._deflate[kCallback] = callback;
+
     this._deflate.write(data);
     this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {
       if (!this._deflate) {
         //
-        // This `if` statement is only needed for Node.js < 10.0.0 because as of
-        // commit https://github.com/nodejs/node/commit/5e3f5164, the flush
-        // callback is no longer called if the deflate stream is closed while
-        // data is being processed.
+        // The deflate stream was closed while data was being processed.
         //
         return;
       }
 
-      var data = bufferUtil.concat(
+      let data = bufferUtil.concat(
         this._deflate[kBuffers],
         this._deflate[kTotalLength]
       );
 
       if (fin) data = data.slice(0, data.length - 4);
 
+      //
+      // Ensure that the callback will not be called again in
+      // `PerMessageDeflate#cleanup()`.
+      //
+      this._deflate[kCallback] = null;
+
       if (fin && this.params[`${endpoint}_no_context_takeover`]) {
         this._deflate.close();
         this._deflate = null;
diff --git a/node_modules/puppeteer/node_modules/ws/lib/receiver.js b/node_modules/puppeteer/node_modules/ws/lib/receiver.js
index 0a8d76d..57daa72 100644
--- a/node_modules/puppeteer/node_modules/ws/lib/receiver.js
+++ b/node_modules/puppeteer/node_modules/ws/lib/receiver.js
@@ -30,14 +30,17 @@
    *
    * @param {String} binaryType The type for binary data
    * @param {Object} extensions An object containing the negotiated extensions
+   * @param {Boolean} isServer Specifies whether to operate in client or server
+   *     mode
    * @param {Number} maxPayload The maximum allowed message length
    */
-  constructor(binaryType, extensions, maxPayload) {
+  constructor(binaryType, extensions, isServer, maxPayload) {
     super();
 
     this._binaryType = binaryType || BINARY_TYPES[0];
     this[kWebSocket] = undefined;
     this._extensions = extensions || {};
+    this._isServer = !!isServer;
     this._maxPayload = maxPayload | 0;
 
     this._bufferedBytes = 0;
@@ -96,11 +99,12 @@
 
     do {
       const buf = this._buffers[0];
+      const offset = dst.length - n;
 
       if (n >= buf.length) {
-        this._buffers.shift().copy(dst, dst.length - n);
+        dst.set(this._buffers.shift(), offset);
       } else {
-        buf.copy(dst, dst.length - n, 0, n);
+        dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);
         this._buffers[0] = buf.slice(n);
       }
 
@@ -117,7 +121,7 @@
    * @private
    */
   startLoop(cb) {
-    var err;
+    let err;
     this._loop = true;
 
     do {
@@ -224,6 +228,16 @@
     if (!this._fin && !this._fragmented) this._fragmented = this._opcode;
     this._masked = (buf[1] & 0x80) === 0x80;
 
+    if (this._isServer) {
+      if (!this._masked) {
+        this._loop = false;
+        return error(RangeError, 'MASK must be set', true, 1002);
+      }
+    } else if (this._masked) {
+      this._loop = false;
+      return error(RangeError, 'MASK must be clear', true, 1002);
+    }
+
     if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;
     else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;
     else return this.haveLength();
@@ -320,7 +334,7 @@
    * @private
    */
   getData(cb) {
-    var data = EMPTY_BUFFER;
+    let data = EMPTY_BUFFER;
 
     if (this._payloadLength) {
       if (this._bufferedBytes < this._payloadLength) {
@@ -400,7 +414,7 @@
       this._fragments = [];
 
       if (this._opcode === 2) {
-        var data;
+        let data;
 
         if (this._binaryType === 'nodebuffer') {
           data = concat(fragments, messageLength);
diff --git a/node_modules/puppeteer/node_modules/ws/lib/sender.js b/node_modules/puppeteer/node_modules/ws/lib/sender.js
index 51158b1..75c78fb 100644
--- a/node_modules/puppeteer/node_modules/ws/lib/sender.js
+++ b/node_modules/puppeteer/node_modules/ws/lib/sender.js
@@ -1,12 +1,14 @@
 'use strict';
 
-const { randomBytes } = require('crypto');
+const { randomFillSync } = require('crypto');
 
 const PerMessageDeflate = require('./permessage-deflate');
 const { EMPTY_BUFFER } = require('./constants');
 const { isValidStatusCode } = require('./validation');
 const { mask: applyMask, toBuffer } = require('./buffer-util');
 
+const mask = Buffer.alloc(4);
+
 /**
  * HyBi Sender implementation.
  */
@@ -44,8 +46,8 @@
    */
   static frame(data, options) {
     const merge = options.mask && options.readOnly;
-    var offset = options.mask ? 6 : 2;
-    var payloadLength = data.length;
+    let offset = options.mask ? 6 : 2;
+    let payloadLength = data.length;
 
     if (data.length >= 65536) {
       offset += 8;
@@ -71,7 +73,7 @@
 
     if (!options.mask) return [target, data];
 
-    const mask = randomBytes(4);
+    randomFillSync(mask, 0, 4);
 
     target[1] |= 0x80;
     target[offset - 4] = mask[0];
@@ -98,7 +100,7 @@
    * @public
    */
   close(code, data, mask, cb) {
-    var buf;
+    let buf;
 
     if (code === undefined) {
       buf = EMPTY_BUFFER;
@@ -108,7 +110,13 @@
       buf = Buffer.allocUnsafe(2);
       buf.writeUInt16BE(code, 0);
     } else {
-      buf = Buffer.allocUnsafe(2 + Buffer.byteLength(data));
+      const length = Buffer.byteLength(data);
+
+      if (length > 123) {
+        throw new RangeError('The message must not be greater than 123 bytes');
+      }
+
+      buf = Buffer.allocUnsafe(2 + length);
       buf.writeUInt16BE(code, 0);
       buf.write(data, 2);
     }
@@ -152,6 +160,10 @@
   ping(data, mask, cb) {
     const buf = toBuffer(data);
 
+    if (buf.length > 125) {
+      throw new RangeError('The data size must not be greater than 125 bytes');
+    }
+
     if (this._deflating) {
       this.enqueue([this.doPing, buf, mask, toBuffer.readOnly, cb]);
     } else {
@@ -192,6 +204,10 @@
   pong(data, mask, cb) {
     const buf = toBuffer(data);
 
+    if (buf.length > 125) {
+      throw new RangeError('The data size must not be greater than 125 bytes');
+    }
+
     if (this._deflating) {
       this.enqueue([this.doPong, buf, mask, toBuffer.readOnly, cb]);
     } else {
@@ -236,8 +252,8 @@
   send(data, options, cb) {
     const buf = toBuffer(data);
     const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];
-    var opcode = options.binary ? 2 : 1;
-    var rsv1 = options.compress;
+    let opcode = options.binary ? 2 : 1;
+    let rsv1 = options.compress;
 
     if (this._firstFragment) {
       this._firstFragment = false;
@@ -304,6 +320,22 @@
 
     this._deflating = true;
     perMessageDeflate.compress(data, options.fin, (_, buf) => {
+      if (this._socket.destroyed) {
+        const err = new Error(
+          'The socket was closed while data was being compressed'
+        );
+
+        if (typeof cb === 'function') cb(err);
+
+        for (let i = 0; i < this._queue.length; i++) {
+          const callback = this._queue[i][4];
+
+          if (typeof callback === 'function') callback(err);
+        }
+
+        return;
+      }
+
       this._deflating = false;
       options.readOnly = false;
       this.sendFrame(Sender.frame(buf, options), cb);
@@ -321,7 +353,7 @@
       const params = this._queue.shift();
 
       this._bufferedBytes -= params[1].length;
-      params[0].apply(this, params.slice(1));
+      Reflect.apply(params[0], this, params.slice(1));
     }
   }
 
diff --git a/node_modules/puppeteer/node_modules/ws/lib/stream.js b/node_modules/puppeteer/node_modules/ws/lib/stream.js
new file mode 100644
index 0000000..f8d410e
--- /dev/null
+++ b/node_modules/puppeteer/node_modules/ws/lib/stream.js
@@ -0,0 +1,164 @@
+'use strict';
+
+const { Duplex } = require('stream');
+
+/**
+ * Emits the `'close'` event on a stream.
+ *
+ * @param {stream.Duplex} The stream.
+ * @private
+ */
+function emitClose(stream) {
+  stream.emit('close');
+}
+
+/**
+ * The listener of the `'end'` event.
+ *
+ * @private
+ */
+function duplexOnEnd() {
+  if (!this.destroyed && this._writableState.finished) {
+    this.destroy();
+  }
+}
+
+/**
+ * The listener of the `'error'` event.
+ *
+ * @private
+ */
+function duplexOnError(err) {
+  this.removeListener('error', duplexOnError);
+  this.destroy();
+  if (this.listenerCount('error') === 0) {
+    // Do not suppress the throwing behavior.
+    this.emit('error', err);
+  }
+}
+
+/**
+ * Wraps a `WebSocket` in a duplex stream.
+ *
+ * @param {WebSocket} ws The `WebSocket` to wrap
+ * @param {Object} options The options for the `Duplex` constructor
+ * @return {stream.Duplex} The duplex stream
+ * @public
+ */
+function createWebSocketStream(ws, options) {
+  let resumeOnReceiverDrain = true;
+
+  function receiverOnDrain() {
+    if (resumeOnReceiverDrain) ws._socket.resume();
+  }
+
+  if (ws.readyState === ws.CONNECTING) {
+    ws.once('open', function open() {
+      ws._receiver.removeAllListeners('drain');
+      ws._receiver.on('drain', receiverOnDrain);
+    });
+  } else {
+    ws._receiver.removeAllListeners('drain');
+    ws._receiver.on('drain', receiverOnDrain);
+  }
+
+  const duplex = new Duplex({
+    ...options,
+    autoDestroy: false,
+    emitClose: false,
+    objectMode: false,
+    writableObjectMode: false
+  });
+
+  ws.on('message', function message(msg) {
+    if (!duplex.push(msg)) {
+      resumeOnReceiverDrain = false;
+      ws._socket.pause();
+    }
+  });
+
+  ws.once('error', function error(err) {
+    if (duplex.destroyed) return;
+
+    duplex.destroy(err);
+  });
+
+  ws.once('close', function close() {
+    if (duplex.destroyed) return;
+
+    duplex.push(null);
+  });
+
+  duplex._destroy = function(err, callback) {
+    if (ws.readyState === ws.CLOSED) {
+      callback(err);
+      process.nextTick(emitClose, duplex);
+      return;
+    }
+
+    let called = false;
+
+    ws.once('error', function error(err) {
+      called = true;
+      callback(err);
+    });
+
+    ws.once('close', function close() {
+      if (!called) callback(err);
+      process.nextTick(emitClose, duplex);
+    });
+    ws.terminate();
+  };
+
+  duplex._final = function(callback) {
+    if (ws.readyState === ws.CONNECTING) {
+      ws.once('open', function open() {
+        duplex._final(callback);
+      });
+      return;
+    }
+
+    // If the value of the `_socket` property is `null` it means that `ws` is a
+    // client websocket and the handshake failed. In fact, when this happens, a
+    // socket is never assigned to the websocket. Wait for the `'error'` event
+    // that will be emitted by the websocket.
+    if (ws._socket === null) return;
+
+    if (ws._socket._writableState.finished) {
+      callback();
+      if (duplex._readableState.endEmitted) duplex.destroy();
+    } else {
+      ws._socket.once('finish', function finish() {
+        // `duplex` is not destroyed here because the `'end'` event will be
+        // emitted on `duplex` after this `'finish'` event. The EOF signaling
+        // `null` chunk is, in fact, pushed when the websocket emits `'close'`.
+        callback();
+      });
+      ws.close();
+    }
+  };
+
+  duplex._read = function() {
+    if (ws.readyState === ws.OPEN && !resumeOnReceiverDrain) {
+      resumeOnReceiverDrain = true;
+      if (!ws._receiver._writableState.needDrain) ws._socket.resume();
+    }
+  };
+
+  duplex._write = function(chunk, encoding, callback) {
+    if (ws.readyState === ws.CONNECTING) {
+      ws.once('open', function open() {
+        duplex._write(chunk, encoding, callback);
+      });
+      return;
+    }
+
+    ws.send(chunk, callback);
+  };
+
+  duplex.on('end', duplexOnEnd);
+  duplex.on('error', duplexOnError);
+  return duplex;
+}
+
+module.exports = createWebSocketStream;
diff --git a/node_modules/puppeteer/node_modules/ws/lib/validation.js b/node_modules/puppeteer/node_modules/ws/lib/validation.js
index 479a7db..32db5a5 100644
--- a/node_modules/puppeteer/node_modules/ws/lib/validation.js
+++ b/node_modules/puppeteer/node_modules/ws/lib/validation.js
@@ -21,7 +21,7 @@
 exports.isValidStatusCode = (code) => {
   return (
     (code >= 1000 &&
-      code <= 1013 &&
+      code <= 1014 &&
       code !== 1004 &&
       code !== 1005 &&
       code !== 1006) ||
diff --git a/node_modules/puppeteer/node_modules/ws/lib/websocket-server.js b/node_modules/puppeteer/node_modules/ws/lib/websocket-server.js
index 9b061d9..0d3f395 100644
--- a/node_modules/puppeteer/node_modules/ws/lib/websocket-server.js
+++ b/node_modules/puppeteer/node_modules/ws/lib/websocket-server.js
@@ -1,13 +1,13 @@
 'use strict';
 
 const EventEmitter = require('events');
-const crypto = require('crypto');
-const http = require('http');
+const { createHash } = require('crypto');
+const { createServer, STATUS_CODES } = require('http');
 
 const PerMessageDeflate = require('./permessage-deflate');
-const extension = require('./extension');
 const WebSocket = require('./websocket');
-const { GUID } = require('./constants');
+const { format, parse } = require('./extension');
+const { GUID, kWebSocket } = require('./constants');
 
 const keyRegex = /^[+/0-9A-Za-z]{22}==$/;
 
@@ -25,7 +25,7 @@
    *     connections
    * @param {Boolean} options.clientTracking Specifies whether or not to track
    *     clients
-   * @param {Function} options.handleProtocols An hook to handle protocols
+   * @param {Function} options.handleProtocols A hook to handle protocols
    * @param {String} options.host The hostname where to bind the server
    * @param {Number} options.maxPayload The maximum allowed message size
    * @param {Boolean} options.noServer Enable no server mode
@@ -34,28 +34,26 @@
    *     permessage-deflate
    * @param {Number} options.port The port where to bind the server
    * @param {http.Server} options.server A pre-created HTTP/S server to use
-   * @param {Function} options.verifyClient An hook to reject connections
+   * @param {Function} options.verifyClient A hook to reject connections
    * @param {Function} callback A listener for the `listening` event
    */
   constructor(options, callback) {
     super();
 
-    options = Object.assign(
-      {
-        maxPayload: 100 * 1024 * 1024,
-        perMessageDeflate: false,
-        handleProtocols: null,
-        clientTracking: true,
-        verifyClient: null,
-        noServer: false,
-        backlog: null, // use default (511 as implemented in net.js)
-        server: null,
-        host: null,
-        path: null,
-        port: null
-      },
-      options
-    );
+    options = {
+      maxPayload: 100 * 1024 * 1024,
+      perMessageDeflate: false,
+      handleProtocols: null,
+      clientTracking: true,
+      verifyClient: null,
+      noServer: false,
+      backlog: null, // use default (511 as implemented in net.js)
+      server: null,
+      host: null,
+      path: null,
+      port: null,
+      ...options
+    };
 
     if (options.port == null && !options.server && !options.noServer) {
       throw new TypeError(
@@ -64,8 +62,8 @@
     }
 
     if (options.port != null) {
-      this._server = http.createServer((req, res) => {
-        const body = http.STATUS_CODES[426];
+      this._server = createServer((req, res) => {
+        const body = STATUS_CODES[426];
 
         res.writeHead(426, {
           'Content-Length': body.length,
@@ -208,7 +206,7 @@
       );
 
       try {
-        const offers = extension.parse(req.headers['sec-websocket-extensions']);
+        const offers = parse(req.headers['sec-websocket-extensions']);
 
         if (offers[PerMessageDeflate.extensionName]) {
           perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);
@@ -256,6 +254,7 @@
    * @param {net.Socket} socket The network socket between the server and client
    * @param {Buffer} head The first packet of the upgraded stream
    * @param {Function} cb Callback
+   * @throws {Error} If called more than once with the same socket
    * @private
    */
   completeUpgrade(key, extensions, req, socket, head, cb) {
@@ -264,8 +263,14 @@
     //
     if (!socket.readable || !socket.writable) return socket.destroy();
 
-    const digest = crypto
-      .createHash('sha1')
+    if (socket[kWebSocket]) {
+      throw new Error(
+        'server.handleUpgrade() was called more than once with the same ' +
+          'socket, possibly due to a misconfiguration'
+      );
+    }
+
+    const digest = createHash('sha1')
       .update(key + GUID)
       .digest('base64');
 
@@ -277,7 +282,7 @@
     ];
 
     const ws = new WebSocket(null);
-    var protocol = req.headers['sec-websocket-protocol'];
+    let protocol = req.headers['sec-websocket-protocol'];
 
     if (protocol) {
       protocol = protocol.trim().split(/ *, */);
@@ -299,7 +304,7 @@
 
     if (extensions[PerMessageDeflate.extensionName]) {
       const params = extensions[PerMessageDeflate.extensionName].params;
-      const value = extension.format({
+      const value = format({
         [PerMessageDeflate.extensionName]: [params]
       });
       headers.push(`Sec-WebSocket-Extensions: ${value}`);
@@ -376,18 +381,16 @@
  */
 function abortHandshake(socket, code, message, headers) {
   if (socket.writable) {
-    message = message || http.STATUS_CODES[code];
-    headers = Object.assign(
-      {
-        Connection: 'close',
-        'Content-type': 'text/html',
-        'Content-Length': Buffer.byteLength(message)
-      },
-      headers
-    );
+    message = message || STATUS_CODES[code];
+    headers = {
+      Connection: 'close',
+      'Content-Type': 'text/html',
+      'Content-Length': Buffer.byteLength(message),
+      ...headers
+    };
 
     socket.write(
-      `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\r\n` +
+      `HTTP/1.1 ${code} ${STATUS_CODES[code]}\r\n` +
         Object.keys(headers)
           .map((h) => `${h}: ${headers[h]}`)
           .join('\r\n') +
diff --git a/node_modules/puppeteer/node_modules/ws/lib/websocket.js b/node_modules/puppeteer/node_modules/ws/lib/websocket.js
index af81084..3e8e4af 100644
--- a/node_modules/puppeteer/node_modules/ws/lib/websocket.js
+++ b/node_modules/puppeteer/node_modules/ws/lib/websocket.js
@@ -1,16 +1,14 @@
 'use strict';
 
 const EventEmitter = require('events');
-const crypto = require('crypto');
 const https = require('https');
 const http = require('http');
 const net = require('net');
 const tls = require('tls');
-const url = require('url');
+const { randomBytes, createHash } = require('crypto');
+const { URL } = require('url');
 
 const PerMessageDeflate = require('./permessage-deflate');
-const EventTarget = require('./event-target');
-const extension = require('./extension');
 const Receiver = require('./receiver');
 const Sender = require('./sender');
 const {
@@ -21,6 +19,9 @@
   kWebSocket,
   NOOP
 } = require('./constants');
+const { addEventListener, removeEventListener } = require('./event-target');
+const { format, parse } = require('./extension');
+const { toBuffer } = require('./buffer-util');
 
 const readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];
 const protocolVersions = [8, 13];
@@ -35,7 +36,7 @@
   /**
    * Create a new `WebSocket`.
    *
-   * @param {(String|url.Url|url.URL)} address The URL to which to connect
+   * @param {(String|url.URL)} address The URL to which to connect
    * @param {(String|String[])} protocols The subprotocols
    * @param {Object} options Connection options
    */
@@ -57,6 +58,7 @@
     this._socket = null;
 
     if (address !== null) {
+      this._bufferedAmount = 0;
       this._isServer = false;
       this._redirects = 0;
 
@@ -112,7 +114,7 @@
    * @type {Number}
    */
   get bufferedAmount() {
-    if (!this._socket) return 0;
+    if (!this._socket) return this._bufferedAmount;
 
     //
     // `socket.bufferSize` is `undefined` if the socket is closed.
@@ -139,6 +141,7 @@
     const receiver = new Receiver(
       this._binaryType,
       this._extensions,
+      this._isServer,
       maxPayload
     );
 
@@ -176,9 +179,8 @@
    * @private
    */
   emitClose() {
-    this.readyState = WebSocket.CLOSED;
-
     if (!this._socket) {
+      this.readyState = WebSocket.CLOSED;
       this.emit('close', this._closeCode, this._closeMessage);
       return;
     }
@@ -188,6 +190,7 @@
     }
 
     this._receiver.removeAllListeners();
+    this.readyState = WebSocket.CLOSED;
     this.emit('close', this._closeCode, this._closeMessage);
   }
 
@@ -252,6 +255,10 @@
    * @public
    */
   ping(data, mask, cb) {
+    if (this.readyState === WebSocket.CONNECTING) {
+      throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');
+    }
+
     if (typeof data === 'function') {
       cb = data;
       data = mask = undefined;
@@ -260,17 +267,13 @@
       mask = undefined;
     }
 
-    if (this.readyState !== WebSocket.OPEN) {
-      const err = new Error(
-        `WebSocket is not open: readyState ${this.readyState} ` +
-          `(${readyStates[this.readyState]})`
-      );
+    if (typeof data === 'number') data = data.toString();
 
-      if (cb) return cb(err);
-      throw err;
+    if (this.readyState !== WebSocket.OPEN) {
+      sendAfterClose(this, data, cb);
+      return;
     }
 
-    if (typeof data === 'number') data = data.toString();
     if (mask === undefined) mask = !this._isServer;
     this._sender.ping(data || EMPTY_BUFFER, mask, cb);
   }
@@ -284,6 +287,10 @@
    * @public
    */
   pong(data, mask, cb) {
+    if (this.readyState === WebSocket.CONNECTING) {
+      throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');
+    }
+
     if (typeof data === 'function') {
       cb = data;
       data = mask = undefined;
@@ -292,17 +299,13 @@
       mask = undefined;
     }
 
-    if (this.readyState !== WebSocket.OPEN) {
-      const err = new Error(
-        `WebSocket is not open: readyState ${this.readyState} ` +
-          `(${readyStates[this.readyState]})`
-      );
+    if (typeof data === 'number') data = data.toString();
 
-      if (cb) return cb(err);
-      throw err;
+    if (this.readyState !== WebSocket.OPEN) {
+      sendAfterClose(this, data, cb);
+      return;
     }
 
-    if (typeof data === 'number') data = data.toString();
     if (mask === undefined) mask = !this._isServer;
     this._sender.pong(data || EMPTY_BUFFER, mask, cb);
   }
@@ -312,7 +315,8 @@
    *
    * @param {*} data The message to send
    * @param {Object} options Options object
-   * @param {Boolean} options.compress Specifies whether or not to compress `data`
+   * @param {Boolean} options.compress Specifies whether or not to compress
+   *     `data`
    * @param {Boolean} options.binary Specifies whether `data` is binary or text
    * @param {Boolean} options.fin Specifies whether the fragment is the last one
    * @param {Boolean} options.mask Specifies whether or not to mask `data`
@@ -320,32 +324,29 @@
    * @public
    */
   send(data, options, cb) {
+    if (this.readyState === WebSocket.CONNECTING) {
+      throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');
+    }
+
     if (typeof options === 'function') {
       cb = options;
       options = {};
     }
 
-    if (this.readyState !== WebSocket.OPEN) {
-      const err = new Error(
-        `WebSocket is not open: readyState ${this.readyState} ` +
-          `(${readyStates[this.readyState]})`
-      );
-
-      if (cb) return cb(err);
-      throw err;
-    }
-
     if (typeof data === 'number') data = data.toString();
 
-    const opts = Object.assign(
-      {
-        binary: typeof data !== 'string',
-        mask: !this._isServer,
-        compress: true,
-        fin: true
-      },
-      options
-    );
+    if (this.readyState !== WebSocket.OPEN) {
+      sendAfterClose(this, data, cb);
+      return;
+    }
+
+    const opts = {
+      binary: typeof data !== 'string',
+      mask: !this._isServer,
+      compress: true,
+      fin: true,
+      ...options
+    };
 
     if (!this._extensions[PerMessageDeflate.extensionName]) {
       opts.compress = false;
@@ -391,7 +392,7 @@
      */
     get() {
       const listeners = this.listeners(method);
-      for (var i = 0; i < listeners.length; i++) {
+      for (let i = 0; i < listeners.length; i++) {
         if (listeners[i]._listener) return listeners[i]._listener;
       }
 
@@ -405,7 +406,7 @@
      */
     set(listener) {
       const listeners = this.listeners(method);
-      for (var i = 0; i < listeners.length; i++) {
+      for (let i = 0; i < listeners.length; i++) {
         //
         // Remove only the listeners added via `addEventListener`.
         //
@@ -416,8 +417,8 @@
   });
 });
 
-WebSocket.prototype.addEventListener = EventTarget.addEventListener;
-WebSocket.prototype.removeEventListener = EventTarget.removeEventListener;
+WebSocket.prototype.addEventListener = addEventListener;
+WebSocket.prototype.removeEventListener = removeEventListener;
 
 module.exports = WebSocket;
 
@@ -425,7 +426,7 @@
  * Initialize a WebSocket client.
  *
  * @param {WebSocket} websocket The client to initialize
- * @param {(String|url.Url|url.URL)} address The URL to which to connect
+ * @param {(String|url.URL)} address The URL to which to connect
  * @param {String} protocols The subprotocols
  * @param {Object} options Connection options
  * @param {(Boolean|Object)} options.perMessageDeflate Enable/disable
@@ -442,28 +443,23 @@
  * @private
  */
 function initAsClient(websocket, address, protocols, options) {
-  const opts = Object.assign(
-    {
-      protocolVersion: protocolVersions[1],
-      maxPayload: 100 * 1024 * 1024,
-      perMessageDeflate: true,
-      followRedirects: false,
-      maxRedirects: 10
-    },
-    options,
-    {
-      createConnection: undefined,
-      socketPath: undefined,
-      hostname: undefined,
-      protocol: undefined,
-      timeout: undefined,
-      method: undefined,
-      auth: undefined,
-      host: undefined,
-      path: undefined,
-      port: undefined
-    }
-  );
+  const opts = {
+    protocolVersion: protocolVersions[1],
+    maxPayload: 100 * 1024 * 1024,
+    perMessageDeflate: true,
+    followRedirects: false,
+    maxRedirects: 10,
+    ...options,
+    createConnection: undefined,
+    socketPath: undefined,
+    hostname: undefined,
+    protocol: undefined,
+    timeout: undefined,
+    method: undefined,
+    host: undefined,
+    path: undefined,
+    port: undefined
+  };
 
   if (!protocolVersions.includes(opts.protocolVersion)) {
     throw new RangeError(
@@ -472,16 +468,13 @@
     );
   }
 
-  var parsedUrl;
+  let parsedUrl;
 
-  if (typeof address === 'object' && address.href !== undefined) {
+  if (address instanceof URL) {
     parsedUrl = address;
     websocket.url = address.href;
   } else {
-    //
-    // The WHATWG URL constructor is not available on Node.js < 6.13.0
-    //
-    parsedUrl = url.URL ? new url.URL(address) : url.parse(address);
+    parsedUrl = new URL(address);
     websocket.url = address;
   }
 
@@ -494,12 +487,9 @@
   const isSecure =
     parsedUrl.protocol === 'wss:' || parsedUrl.protocol === 'https:';
   const defaultPort = isSecure ? 443 : 80;
-  const key = crypto.randomBytes(16).toString('base64');
+  const key = randomBytes(16).toString('base64');
   const get = isSecure ? https.get : http.get;
-  const path = parsedUrl.search
-    ? `${parsedUrl.pathname || '/'}${parsedUrl.search}`
-    : parsedUrl.pathname || '/';
-  var perMessageDeflate;
+  let perMessageDeflate;
 
   opts.createConnection = isSecure ? tlsConnect : netConnect;
   opts.defaultPort = opts.defaultPort || defaultPort;
@@ -507,16 +497,14 @@
   opts.host = parsedUrl.hostname.startsWith('[')
     ? parsedUrl.hostname.slice(1, -1)
     : parsedUrl.hostname;
-  opts.headers = Object.assign(
-    {
-      'Sec-WebSocket-Version': opts.protocolVersion,
-      'Sec-WebSocket-Key': key,
-      Connection: 'Upgrade',
-      Upgrade: 'websocket'
-    },
-    opts.headers
-  );
-  opts.path = path;
+  opts.headers = {
+    'Sec-WebSocket-Version': opts.protocolVersion,
+    'Sec-WebSocket-Key': key,
+    Connection: 'Upgrade',
+    Upgrade: 'websocket',
+    ...opts.headers
+  };
+  opts.path = parsedUrl.pathname + parsedUrl.search;
   opts.timeout = opts.handshakeTimeout;
 
   if (opts.perMessageDeflate) {
@@ -525,7 +513,7 @@
       false,
       opts.maxPayload
     );
-    opts.headers['Sec-WebSocket-Extensions'] = extension.format({
+    opts.headers['Sec-WebSocket-Extensions'] = format({
       [PerMessageDeflate.extensionName]: perMessageDeflate.offer()
     });
   }
@@ -539,20 +527,18 @@
       opts.headers.Origin = opts.origin;
     }
   }
-  if (parsedUrl.auth) {
-    opts.auth = parsedUrl.auth;
-  } else if (parsedUrl.username || parsedUrl.password) {
+  if (parsedUrl.username || parsedUrl.password) {
     opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;
   }
 
   if (isUnixSocket) {
-    const parts = path.split(':');
+    const parts = opts.path.split(':');
 
     opts.socketPath = parts[0];
     opts.path = parts[1];
   }
 
-  var req = (websocket._req = get(opts));
+  let req = (websocket._req = get(opts));
 
   if (opts.timeout) {
     req.on('timeout', () => {
@@ -586,9 +572,7 @@
 
       req.abort();
 
-      const addr = url.URL
-        ? new url.URL(location, address)
-        : url.resolve(address, location);
+      const addr = new URL(location, address);
 
       initAsClient(websocket, addr, protocols, options);
     } else if (!websocket.emit('unexpected-response', req, res)) {
@@ -611,8 +595,7 @@
 
     req = websocket._req = null;
 
-    const digest = crypto
-      .createHash('sha1')
+    const digest = createHash('sha1')
       .update(key + GUID)
       .digest('base64');
 
@@ -623,7 +606,7 @@
 
     const serverProt = res.headers['sec-websocket-protocol'];
     const protList = (protocols || '').split(/, */);
-    var protError;
+    let protError;
 
     if (!protocols && serverProt) {
       protError = 'Server sent a subprotocol but none was requested';
@@ -642,9 +625,7 @@
 
     if (perMessageDeflate) {
       try {
-        const extensions = extension.parse(
-          res.headers['sec-websocket-extensions']
-        );
+        const extensions = parse(res.headers['sec-websocket-extensions']);
 
         if (extensions[PerMessageDeflate.extensionName]) {
           perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);
@@ -674,13 +655,7 @@
  * @private
  */
 function netConnect(options) {
-  //
-  // Override `options.path` only if `options` is a copy of the original options
-  // object. This is always true on Node.js >= 8 but not on Node.js 6 where
-  // `options.socketPath` might be `undefined` even if the `socketPath` option
-  // was originally set.
-  //
-  if (options.protocolVersion) options.path = options.socketPath;
+  options.path = options.socketPath;
   return net.connect(options);
 }
 
@@ -693,7 +668,11 @@
  */
 function tlsConnect(options) {
   options.path = undefined;
-  options.servername = options.servername || options.host;
+
+  if (!options.servername && options.servername !== '') {
+    options.servername = options.host;
+  }
+
   return tls.connect(options);
 }
 
@@ -724,6 +703,38 @@
 }
 
 /**
+ * Handle cases where the `ping()`, `pong()`, or `send()` methods are called
+ * when the `readyState` attribute is `CLOSING` or `CLOSED`.
+ *
+ * @param {WebSocket} websocket The WebSocket instance
+ * @param {*} data The data to send
+ * @param {Function} cb Callback
+ * @private
+ */
+function sendAfterClose(websocket, data, cb) {
+  if (data) {
+    const length = toBuffer(data).length;
+
+    //
+    // The `_bufferedAmount` property is used only when the peer is a client and
+    // the opening handshake fails. Under these circumstances, in fact, the
+    // `setSocket()` method is not called, so the `_socket` and `_sender`
+    // properties are set to `null`.
+    //
+    if (websocket._socket) websocket._sender._bufferedBytes += length;
+    else websocket._bufferedAmount += length;
+  }
+
+  if (cb) {
+    const err = new Error(
+      `WebSocket is not open: readyState ${websocket.readyState} ` +
+        `(${readyStates[websocket.readyState]})`
+    );
+    cb(err);
+  }
+}
+
+/**
  * The listener of the `Receiver` `'conclude'` event.
  *
  * @param {Number} code The status code
@@ -890,6 +901,8 @@
   this.removeListener('error', socketOnError);
   this.on('error', NOOP);
 
-  websocket.readyState = WebSocket.CLOSING;
-  this.destroy();
+  if (websocket) {
+    websocket.readyState = WebSocket.CLOSING;
+    this.destroy();
+  }
 }
diff --git a/node_modules/puppeteer/node_modules/ws/package.json b/node_modules/puppeteer/node_modules/ws/package.json
index 9b7ffb0..5ab7589 100644
--- a/node_modules/puppeteer/node_modules/ws/package.json
+++ b/node_modules/puppeteer/node_modules/ws/package.json
@@ -2,27 +2,32 @@
   "author": "Einar Otto Stangvik <einaros@gmail.com> (http://2x.io)",
   "browser": "browser.js",
   "bugs": "https://github.com/websockets/ws/issues",
-  "dependencies": {
-    "async-limiter": "~1.0.0"
-  },
   "description": "Simple to use, blazing fast and thoroughly tested websocket client and server for Node.js",
   "devDependencies": {
-    "benchmark": "~2.1.4",
-    "bufferutil": "~4.0.0",
-    "coveralls": "~3.0.3",
-    "eslint": "~5.15.0",
-    "eslint-config-prettier": "~4.1.0",
-    "eslint-plugin-prettier": "~3.0.0",
-    "mocha": "~6.0.0",
-    "nyc": "~13.3.0",
-    "prettier": "~1.16.1",
-    "utf-8-validate": "~5.0.0"
+    "benchmark": "^2.1.4",
+    "bufferutil": "^4.0.1",
+    "eslint": "^6.0.0",
+    "eslint-config-prettier": "^6.0.0",
+    "eslint-plugin-prettier": "^3.0.1",
+    "mocha": "^7.0.0",
+    "nyc": "^15.0.0",
+    "prettier": "^1.17.0",
+    "utf-8-validate": "^5.0.2"
+  },
+  "engines": {
+    "node": ">=8.3.0"
   },
   "files": [
     "browser.js",
     "index.js",
     "lib/*.js"
   ],
+  "greenkeeper": {
+    "commitMessages": {
+      "dependencyUpdate": "[pkg] Update ${dependency} to version ${version}",
+      "devDependencyUpdate": "[pkg] Update ${dependency} to version ${version}"
+    }
+  },
   "homepage": "https://github.com/websockets/ws",
   "keywords": [
     "HyBi",
@@ -35,11 +40,23 @@
   "license": "MIT",
   "main": "index.js",
   "name": "ws",
+  "peerDependencies": {
+    "bufferutil": "^4.0.1",
+    "utf-8-validate": "^5.0.2"
+  },
+  "peerDependenciesMeta": {
+    "bufferutil": {
+      "optional": true
+    },
+    "utf-8-validate": {
+      "optional": true
+    }
+  },
   "repository": "websockets/ws",
   "scripts": {
-    "integration": "npm run lint && mocha test/*.integration.js",
-    "lint": "eslint --ignore-path .gitignore . && prettier --check --ignore-path .gitignore \"**/*.{json,md,yml}\"",
-    "test": "npm run lint && nyc --reporter=html --reporter=text mocha test/*.test.js"
+    "integration": "npm run lint && mocha --throw-deprecation test/*.integration.js",
+    "lint": "eslint --ignore-path .gitignore . && prettier --check --ignore-path .gitignore \"**/*.{json,md,yaml,yml}\"",
+    "test": "npm run lint && nyc --reporter=lcov --reporter=text mocha --throw-deprecation test/*.test.js"
   },
-  "version": "6.2.1"
+  "version": "7.2.5"
 }
\ No newline at end of file
diff --git a/node_modules/puppeteer/package.json b/node_modules/puppeteer/package.json
index d4c6119..9ea3698 100644
--- a/node_modules/puppeteer/package.json
+++ b/node_modules/puppeteer/package.json
@@ -9,60 +9,85 @@
     "ws": "./utils/browser/WebSocket"
   },
   "dependencies": {
+    "@types/mime-types": "^2.1.0",
     "debug": "^4.1.0",
-    "extract-zip": "^1.6.6",
-    "https-proxy-agent": "^3.0.0",
+    "extract-zip": "^2.0.0",
+    "https-proxy-agent": "^4.0.0",
     "mime": "^2.0.3",
+    "mime-types": "^2.1.25",
     "progress": "^2.0.1",
     "proxy-from-env": "^1.0.0",
-    "rimraf": "^2.6.1",
-    "ws": "^6.1.0"
+    "rimraf": "^3.0.2",
+    "tar-fs": "^2.0.0",
+    "unbzip2-stream": "^1.3.3",
+    "ws": "^7.2.3"
   },
   "description": "A high-level API to control headless Chrome over the DevTools Protocol",
   "devDependencies": {
     "@types/debug": "0.0.31",
-    "@types/extract-zip": "^1.6.2",
     "@types/mime": "^2.0.0",
-    "@types/node": "^8.10.34",
+    "@types/node": "^10.17.14",
     "@types/rimraf": "^2.0.2",
-    "@types/ws": "^6.0.1",
+    "@types/tar-fs": "^1.16.2",
+    "@types/ws": "^7.2.4",
+    "@typescript-eslint/eslint-plugin": "^2.28.0",
+    "@typescript-eslint/parser": "^2.28.0",
     "commonmark": "^0.28.1",
     "cross-env": "^5.0.5",
-    "eslint": "^5.15.1",
+    "eslint": "^6.8.0",
+    "eslint-plugin-mocha": "^6.3.0",
+    "eslint-plugin-unicorn": "^19.0.1",
     "esprima": "^4.0.0",
-    "jpeg-js": "^0.3.4",
+    "expect": "^25.2.7",
+    "jpeg-js": "^0.3.7",
     "minimist": "^1.2.0",
+    "mocha": "^7.1.1",
     "ncp": "^2.0.0",
     "pixelmatch": "^4.0.2",
-    "pngjs": "^3.3.3",
+    "pngjs": "^5.0.0",
     "text-diff": "^1.0.1",
-    "typescript": "3.2.2"
+    "typescript": "3.8.3"
   },
   "engines": {
-    "node": ">=8.16.0"
+    "node": ">=10.18.1"
   },
+  "files": [
+    "lib/",
+    "Errors.js",
+    "DeviceDescriptors.js",
+    "index.js",
+    "install.js",
+    "typescript-if-required.js"
+  ],
   "license": "Apache-2.0",
   "main": "index.js",
   "name": "puppeteer",
   "puppeteer": {
-    "chromium_revision": "706915"
+    "chromium_revision": "737027",
+    "firefox_revision": "latest"
   },
-  "repository": "github:GoogleChrome/puppeteer",
+  "repository": "github:puppeteer/puppeteer",
   "scripts": {
     "apply-next-version": "node utils/apply_next_version.js",
-    "bundle": "npx browserify -r ./index.js:puppeteer -o utils/browser/puppeteer-web.js",
-    "coverage": "cross-env COVERAGE=true npm run unit",
+    "assert-unit-coverage": "cross-env COVERAGE=1 mocha --config mocha-config/coverage-tests.js",
+    "compare-protocol-d-ts": "node utils/protocol-types-generator compare",
     "debug-unit": "node --inspect-brk test/test.js",
+    "dev-install": "npm run tsc && node install.js",
     "doc": "node utils/doclint/cli.js",
-    "funit": "BROWSER=firefox node test/test.js",
+    "eslint": "([ \"$CI\" = true ] && eslint --ext js --ext ts --quiet -f codeframe . || eslint --ext js --ext ts .)",
+    "funit": "PUPPETEER_PRODUCT=firefox npm run unit",
     "install": "node install.js",
-    "lint": "([ \"$CI\" = true ] && eslint --quiet -f codeframe . || eslint .) && npm run tsc && npm run doc",
-    "test": "npm run lint --silent && npm run coverage && npm run test-doclint && npm run test-types && node utils/testrunner/test/test.js",
-    "test-doclint": "node utils/doclint/check_public_api/test/test.js && node utils/doclint/preprocessor/test.js",
-    "test-types": "node utils/doclint/generate_types && npx -p typescript@2.1 tsc -p utils/doclint/generate_types/test/",
-    "tsc": "tsc -p .",
-    "unit": "node test/test.js",
-    "unit-bundle": "node utils/browser/test.js"
+    "lint": "npm run eslint && npm run tsc && npm run doc",
+    "prepare": "node typescript-if-required.js",
+    "prepublishOnly": "npm run tsc",
+    "test": "npm run tsc && npm run lint --silent && npm run coverage && npm run test-doclint && npm run test-types",
+    "test-doclint": "mocha --config mocha-config/doclint-tests.js",
+    "test-install": "scripts/test-install.sh",
+    "test-types": "node utils/doclint/generate_types && tsc --version && tsc -p utils/doclint/generate_types/test/",
+    "tsc": "tsc --version && tsc -p . && cp src/protocol.d.ts lib/",
+    "unit": "mocha --config mocha-config/puppeteer-unit-tests.js",
+    "unit-with-coverage": "cross-env COVERAGE=1 npm run unit",
+    "update-protocol-d-ts": "node utils/protocol-types-generator update"
   },
-  "version": "2.0.0"
+  "version": "3.0.3"
 }
\ No newline at end of file
diff --git a/node_modules/puppeteer/typescript-if-required.js b/node_modules/puppeteer/typescript-if-required.js
new file mode 100644
index 0000000..a3da9d5
--- /dev/null
+++ b/node_modules/puppeteer/typescript-if-required.js
@@ -0,0 +1,59 @@
+/**
+ * Copyright 2020 Google Inc. All rights reserved.
+ *
+ * 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.
+ */
+
+const child_process = require('child_process');
+const path = require('path');
+const fs = require('fs');
+const {promisify} = require('util');
+
+const exec = promisify(child_process.exec);
+const fsAccess = promisify(fs.access);
+
+const fileExists = async filePath => fsAccess(filePath).then(() => true).catch(() => false);
+/*
+
+ * Now Puppeteer is built with TypeScript, we need to ensure that
+ * locally we have the generated output before trying to install.
+ *
+ * For users installing puppeteer this is fine, they will have the
+ * generated lib/ directory as we ship it when we publish to npm.
+ *
+ * However, if you're cloning the repo to contribute, you won't have the
+ * generated lib/ directory so this script checks if we need to run
+ * TypeScript first to ensure the output exists and is in the right
+ * place.
+ */
+async function compileTypeScript() {
+  return exec('npm run tsc').catch(error => {
+    console.error('Error running TypeScript', error);
+    process.exit(1);
+  });
+}
+
+async function compileTypeScriptIfRequired() {
+  const libPath = path.join(__dirname, 'lib');
+  const libExists = await fileExists(libPath);
+  if (libExists) return;
+
+  console.log('Puppeteer:', 'Compiling TypeScript...');
+  await compileTypeScript();
+}
+
+// It's being run as node typescript-if-required.js, not require('..')
+if (require.main === module)
+  compileTypeScriptIfRequired();
+
+module.exports = compileTypeScriptIfRequired;
diff --git a/node_modules/tar-fs/.travis.yml b/node_modules/tar-fs/.travis.yml
new file mode 100644
index 0000000..5911b74
--- /dev/null
+++ b/node_modules/tar-fs/.travis.yml
@@ -0,0 +1,5 @@
+language: node_js
+node_js:
+  - 6
+  - 8
+  - 10
diff --git a/node_modules/concat-stream/node_modules/safe-buffer/LICENSE b/node_modules/tar-fs/LICENSE
similarity index 96%
copy from node_modules/concat-stream/node_modules/safe-buffer/LICENSE
copy to node_modules/tar-fs/LICENSE
index 0c068ce..757562e 100644
--- a/node_modules/concat-stream/node_modules/safe-buffer/LICENSE
+++ b/node_modules/tar-fs/LICENSE
@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) Feross Aboukhadijeh
+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
@@ -18,4 +18,4 @@
 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.
+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..06ba046
--- /dev/null
+++ b/node_modules/tar-fs/README.md
@@ -0,0 +1,163 @@
+# 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) {
+    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..adf46f1
--- /dev/null
+++ b/node_modules/tar-fs/index.js
@@ -0,0 +1,348 @@
+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(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)), 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
+    chmod(name, mode, function (err) {
+      if (err) return cb(err)
+      if (!own) return cb()
+      if (!chown) return cb()
+      chown(name, header.uid, header.gid, 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..804cc08
--- /dev/null
+++ b/node_modules/tar-fs/package.json
@@ -0,0 +1,41 @@
+{
+  "author": "Mathias Buus",
+  "bugs": {
+    "url": "https://github.com/mafintosh/tar-fs/issues"
+  },
+  "dependencies": {
+    "chownr": "^1.1.1",
+    "mkdirp-classic": "^0.5.2",
+    "pump": "^3.0.0",
+    "tar-stream": "^2.0.0"
+  },
+  "description": "filesystem bindings for tar-stream",
+  "devDependencies": {
+    "rimraf": "^2.6.3",
+    "standard": "^12.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": "https://github.com/mafintosh/tar-fs.git"
+  },
+  "scripts": {
+    "test": "standard && tape test/index.js"
+  },
+  "version": "2.0.1"
+}
\ No newline at end of file
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
--- /dev/null
+++ b/node_modules/tar-fs/test/fixtures/d/file1
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
--- /dev/null
+++ b/node_modules/tar-fs/test/fixtures/d/file2
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
--- /dev/null
+++ b/node_modules/tar-fs/test/fixtures/d/sub-dir/file5
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
--- /dev/null
+++ b/node_modules/tar-fs/test/fixtures/d/sub-files/file3
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
--- /dev/null
+++ b/node_modules/tar-fs/test/fixtures/d/sub-files/file4
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
--- /dev/null
+++ b/node_modules/tar-fs/test/fixtures/e/directory/.ignore
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
--- /dev/null
+++ b/node_modules/tar-fs/test/fixtures/e/file
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 0000000..a645e9c
--- /dev/null
+++ b/node_modules/tar-fs/test/fixtures/invalid.tar
Binary files differ
diff --git a/node_modules/tar-fs/test/index.js b/node_modules/tar-fs/test/index.js
new file mode 100644
index 0000000..3f5e07b
--- /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/concat-stream/node_modules/safe-buffer/LICENSE b/node_modules/tar-stream/LICENSE
similarity index 96%
copy from node_modules/concat-stream/node_modules/safe-buffer/LICENSE
copy to node_modules/tar-stream/LICENSE
index 0c068ce..757562e 100644
--- a/node_modules/concat-stream/node_modules/safe-buffer/LICENSE
+++ b/node_modules/tar-stream/LICENSE
@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) Feross Aboukhadijeh
+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
@@ -18,4 +18,4 @@
 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.
+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..96abbca
--- /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: 0644,        // entry mode. defaults to to 0755 for dirs and 0644 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..1a2a445
--- /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)
+}
+
+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)
+    } 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..645fa3e
--- /dev/null
+++ b/node_modules/tar-stream/headers.js
@@ -0,0 +1,293 @@
+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) {
+  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 {
+    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: name,
+    mode: mode,
+    uid: uid,
+    gid: gid,
+    size: size,
+    mtime: new Date(1000 * mtime),
+    type: type,
+    linkname: linkname,
+    uname: uname,
+    gname: gname,
+    devmajor: devmajor,
+    devminor: 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/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..9039da0
--- /dev/null
+++ b/node_modules/tar-stream/package.json
@@ -0,0 +1,55 @@
+{
+  "author": "Mathias Buus <mathiasbuus@gmail.com>",
+  "bugs": {
+    "url": "https://github.com/mafintosh/tar-stream/issues"
+  },
+  "dependencies": {
+    "bl": "^4.0.1",
+    "end-of-stream": "^1.4.1",
+    "fs-constants": "^1.0.0",
+    "inherits": "^2.0.3",
+    "readable-stream": "^3.1.1"
+  },
+  "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"
+  },
+  "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.1.2"
+}
\ No newline at end of file
diff --git a/node_modules/typedarray/.travis.yml b/node_modules/typedarray/.travis.yml
deleted file mode 100644
index cc4dba2..0000000
--- a/node_modules/typedarray/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
-  - "0.8"
-  - "0.10"
diff --git a/node_modules/typedarray/LICENSE b/node_modules/typedarray/LICENSE
deleted file mode 100644
index 11adfae..0000000
--- a/node_modules/typedarray/LICENSE
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- Copyright (c) 2010, Linden Research, Inc.
- Copyright (c) 2012, Joshua Bell
-
- 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.
- $/LicenseInfo$
- */
-
-// Original can be found at:
-//   https://bitbucket.org/lindenlab/llsd
-// Modifications by Joshua Bell inexorabletash@gmail.com
-//   https://github.com/inexorabletash/polyfill
-
-// ES3/ES5 implementation of the Krhonos Typed Array Specification
-//   Ref: http://www.khronos.org/registry/typedarray/specs/latest/
-//   Date: 2011-02-01
-//
-// Variations:
-//  * Allows typed_array.get/set() as alias for subscripts (typed_array[])
diff --git a/node_modules/typedarray/example/tarray.js b/node_modules/typedarray/example/tarray.js
deleted file mode 100644
index 8423d7c..0000000
--- a/node_modules/typedarray/example/tarray.js
+++ /dev/null
@@ -1,4 +0,0 @@
-var Uint8Array = require('../').Uint8Array;
-var ua = new Uint8Array(5);
-ua[1] = 256 + 55;
-console.log(ua[1]);
diff --git a/node_modules/typedarray/index.js b/node_modules/typedarray/index.js
deleted file mode 100644
index 5e54084..0000000
--- a/node_modules/typedarray/index.js
+++ /dev/null
@@ -1,630 +0,0 @@
-var undefined = (void 0); // Paranoia
-
-// Beyond this value, index getters/setters (i.e. array[0], array[1]) are so slow to
-// create, and consume so much memory, that the browser appears frozen.
-var MAX_ARRAY_LENGTH = 1e5;
-
-// Approximations of internal ECMAScript conversion functions
-var ECMAScript = (function() {
-  // Stash a copy in case other scripts modify these
-  var opts = Object.prototype.toString,
-      ophop = Object.prototype.hasOwnProperty;
-
-  return {
-    // Class returns internal [[Class]] property, used to avoid cross-frame instanceof issues:
-    Class: function(v) { return opts.call(v).replace(/^\[object *|\]$/g, ''); },
-    HasProperty: function(o, p) { return p in o; },
-    HasOwnProperty: function(o, p) { return ophop.call(o, p); },
-    IsCallable: function(o) { return typeof o === 'function'; },
-    ToInt32: function(v) { return v >> 0; },
-    ToUint32: function(v) { return v >>> 0; }
-  };
-}());
-
-// Snapshot intrinsics
-var LN2 = Math.LN2,
-    abs = Math.abs,
-    floor = Math.floor,
-    log = Math.log,
-    min = Math.min,
-    pow = Math.pow,
-    round = Math.round;
-
-// ES5: lock down object properties
-function configureProperties(obj) {
-  if (getOwnPropNames && defineProp) {
-    var props = getOwnPropNames(obj), i;
-    for (i = 0; i < props.length; i += 1) {
-      defineProp(obj, props[i], {
-        value: obj[props[i]],
-        writable: false,
-        enumerable: false,
-        configurable: false
-      });
-    }
-  }
-}
-
-// emulate ES5 getter/setter API using legacy APIs
-// http://blogs.msdn.com/b/ie/archive/2010/09/07/transitioning-existing-code-to-the-es5-getter-setter-apis.aspx
-// (second clause tests for Object.defineProperty() in IE<9 that only supports extending DOM prototypes, but
-// note that IE<9 does not support __defineGetter__ or __defineSetter__ so it just renders the method harmless)
-var defineProp
-if (Object.defineProperty && (function() {
-      try {
-        Object.defineProperty({}, 'x', {});
-        return true;
-      } catch (e) {
-        return false;
-      }
-    })()) {
-  defineProp = Object.defineProperty;
-} else {
-  defineProp = function(o, p, desc) {
-    if (!o === Object(o)) throw new TypeError("Object.defineProperty called on non-object");
-    if (ECMAScript.HasProperty(desc, 'get') && Object.prototype.__defineGetter__) { Object.prototype.__defineGetter__.call(o, p, desc.get); }
-    if (ECMAScript.HasProperty(desc, 'set') && Object.prototype.__defineSetter__) { Object.prototype.__defineSetter__.call(o, p, desc.set); }
-    if (ECMAScript.HasProperty(desc, 'value')) { o[p] = desc.value; }
-    return o;
-  };
-}
-
-var getOwnPropNames = Object.getOwnPropertyNames || function (o) {
-  if (o !== Object(o)) throw new TypeError("Object.getOwnPropertyNames called on non-object");
-  var props = [], p;
-  for (p in o) {
-    if (ECMAScript.HasOwnProperty(o, p)) {
-      props.push(p);
-    }
-  }
-  return props;
-};
-
-// ES5: Make obj[index] an alias for obj._getter(index)/obj._setter(index, value)
-// for index in 0 ... obj.length
-function makeArrayAccessors(obj) {
-  if (!defineProp) { return; }
-
-  if (obj.length > MAX_ARRAY_LENGTH) throw new RangeError("Array too large for polyfill");
-
-  function makeArrayAccessor(index) {
-    defineProp(obj, index, {
-      'get': function() { return obj._getter(index); },
-      'set': function(v) { obj._setter(index, v); },
-      enumerable: true,
-      configurable: false
-    });
-  }
-
-  var i;
-  for (i = 0; i < obj.length; i += 1) {
-    makeArrayAccessor(i);
-  }
-}
-
-// Internal conversion functions:
-//    pack<Type>()   - take a number (interpreted as Type), output a byte array
-//    unpack<Type>() - take a byte array, output a Type-like number
-
-function as_signed(value, bits) { var s = 32 - bits; return (value << s) >> s; }
-function as_unsigned(value, bits) { var s = 32 - bits; return (value << s) >>> s; }
-
-function packI8(n) { return [n & 0xff]; }
-function unpackI8(bytes) { return as_signed(bytes[0], 8); }
-
-function packU8(n) { return [n & 0xff]; }
-function unpackU8(bytes) { return as_unsigned(bytes[0], 8); }
-
-function packU8Clamped(n) { n = round(Number(n)); return [n < 0 ? 0 : n > 0xff ? 0xff : n & 0xff]; }
-
-function packI16(n) { return [(n >> 8) & 0xff, n & 0xff]; }
-function unpackI16(bytes) { return as_signed(bytes[0] << 8 | bytes[1], 16); }
-
-function packU16(n) { return [(n >> 8) & 0xff, n & 0xff]; }
-function unpackU16(bytes) { return as_unsigned(bytes[0] << 8 | bytes[1], 16); }
-
-function packI32(n) { return [(n >> 24) & 0xff, (n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff]; }
-function unpackI32(bytes) { return as_signed(bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], 32); }
-
-function packU32(n) { return [(n >> 24) & 0xff, (n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff]; }
-function unpackU32(bytes) { return as_unsigned(bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], 32); }
-
-function packIEEE754(v, ebits, fbits) {
-
-  var bias = (1 << (ebits - 1)) - 1,
-      s, e, f, ln,
-      i, bits, str, bytes;
-
-  function roundToEven(n) {
-    var w = floor(n), f = n - w;
-    if (f < 0.5)
-      return w;
-    if (f > 0.5)
-      return w + 1;
-    return w % 2 ? w + 1 : w;
-  }
-
-  // Compute sign, exponent, fraction
-  if (v !== v) {
-    // NaN
-    // http://dev.w3.org/2006/webapi/WebIDL/#es-type-mapping
-    e = (1 << ebits) - 1; f = pow(2, fbits - 1); s = 0;
-  } else if (v === Infinity || v === -Infinity) {
-    e = (1 << ebits) - 1; f = 0; s = (v < 0) ? 1 : 0;
-  } else if (v === 0) {
-    e = 0; f = 0; s = (1 / v === -Infinity) ? 1 : 0;
-  } else {
-    s = v < 0;
-    v = abs(v);
-
-    if (v >= pow(2, 1 - bias)) {
-      e = min(floor(log(v) / LN2), 1023);
-      f = roundToEven(v / pow(2, e) * pow(2, fbits));
-      if (f / pow(2, fbits) >= 2) {
-        e = e + 1;
-        f = 1;
-      }
-      if (e > bias) {
-        // Overflow
-        e = (1 << ebits) - 1;
-        f = 0;
-      } else {
-        // Normalized
-        e = e + bias;
-        f = f - pow(2, fbits);
-      }
-    } else {
-      // Denormalized
-      e = 0;
-      f = roundToEven(v / pow(2, 1 - bias - fbits));
-    }
-  }
-
-  // Pack sign, exponent, fraction
-  bits = [];
-  for (i = fbits; i; i -= 1) { bits.push(f % 2 ? 1 : 0); f = floor(f / 2); }
-  for (i = ebits; i; i -= 1) { bits.push(e % 2 ? 1 : 0); e = floor(e / 2); }
-  bits.push(s ? 1 : 0);
-  bits.reverse();
-  str = bits.join('');
-
-  // Bits to bytes
-  bytes = [];
-  while (str.length) {
-    bytes.push(parseInt(str.substring(0, 8), 2));
-    str = str.substring(8);
-  }
-  return bytes;
-}
-
-function unpackIEEE754(bytes, ebits, fbits) {
-
-  // Bytes to bits
-  var bits = [], i, j, b, str,
-      bias, s, e, f;
-
-  for (i = bytes.length; i; i -= 1) {
-    b = bytes[i - 1];
-    for (j = 8; j; j -= 1) {
-      bits.push(b % 2 ? 1 : 0); b = b >> 1;
-    }
-  }
-  bits.reverse();
-  str = bits.join('');
-
-  // Unpack sign, exponent, fraction
-  bias = (1 << (ebits - 1)) - 1;
-  s = parseInt(str.substring(0, 1), 2) ? -1 : 1;
-  e = parseInt(str.substring(1, 1 + ebits), 2);
-  f = parseInt(str.substring(1 + ebits), 2);
-
-  // Produce number
-  if (e === (1 << ebits) - 1) {
-    return f !== 0 ? NaN : s * Infinity;
-  } else if (e > 0) {
-    // Normalized
-    return s * pow(2, e - bias) * (1 + f / pow(2, fbits));
-  } else if (f !== 0) {
-    // Denormalized
-    return s * pow(2, -(bias - 1)) * (f / pow(2, fbits));
-  } else {
-    return s < 0 ? -0 : 0;
-  }
-}
-
-function unpackF64(b) { return unpackIEEE754(b, 11, 52); }
-function packF64(v) { return packIEEE754(v, 11, 52); }
-function unpackF32(b) { return unpackIEEE754(b, 8, 23); }
-function packF32(v) { return packIEEE754(v, 8, 23); }
-
-
-//
-// 3 The ArrayBuffer Type
-//
-
-(function() {
-
-  /** @constructor */
-  var ArrayBuffer = function ArrayBuffer(length) {
-    length = ECMAScript.ToInt32(length);
-    if (length < 0) throw new RangeError('ArrayBuffer size is not a small enough positive integer');
-
-    this.byteLength = length;
-    this._bytes = [];
-    this._bytes.length = length;
-
-    var i;
-    for (i = 0; i < this.byteLength; i += 1) {
-      this._bytes[i] = 0;
-    }
-
-    configureProperties(this);
-  };
-
-  exports.ArrayBuffer = exports.ArrayBuffer || ArrayBuffer;
-
-  //
-  // 4 The ArrayBufferView Type
-  //
-
-  // NOTE: this constructor is not exported
-  /** @constructor */
-  var ArrayBufferView = function ArrayBufferView() {
-    //this.buffer = null;
-    //this.byteOffset = 0;
-    //this.byteLength = 0;
-  };
-
-  //
-  // 5 The Typed Array View Types
-  //
-
-  function makeConstructor(bytesPerElement, pack, unpack) {
-    // Each TypedArray type requires a distinct constructor instance with
-    // identical logic, which this produces.
-
-    var ctor;
-    ctor = function(buffer, byteOffset, length) {
-      var array, sequence, i, s;
-
-      if (!arguments.length || typeof arguments[0] === 'number') {
-        // Constructor(unsigned long length)
-        this.length = ECMAScript.ToInt32(arguments[0]);
-        if (length < 0) throw new RangeError('ArrayBufferView size is not a small enough positive integer');
-
-        this.byteLength = this.length * this.BYTES_PER_ELEMENT;
-        this.buffer = new ArrayBuffer(this.byteLength);
-        this.byteOffset = 0;
-      } else if (typeof arguments[0] === 'object' && arguments[0].constructor === ctor) {
-        // Constructor(TypedArray array)
-        array = arguments[0];
-
-        this.length = array.length;
-        this.byteLength = this.length * this.BYTES_PER_ELEMENT;
-        this.buffer = new ArrayBuffer(this.byteLength);
-        this.byteOffset = 0;
-
-        for (i = 0; i < this.length; i += 1) {
-          this._setter(i, array._getter(i));
-        }
-      } else if (typeof arguments[0] === 'object' &&
-                 !(arguments[0] instanceof ArrayBuffer || ECMAScript.Class(arguments[0]) === 'ArrayBuffer')) {
-        // Constructor(sequence<type> array)
-        sequence = arguments[0];
-
-        this.length = ECMAScript.ToUint32(sequence.length);
-        this.byteLength = this.length * this.BYTES_PER_ELEMENT;
-        this.buffer = new ArrayBuffer(this.byteLength);
-        this.byteOffset = 0;
-
-        for (i = 0; i < this.length; i += 1) {
-          s = sequence[i];
-          this._setter(i, Number(s));
-        }
-      } else if (typeof arguments[0] === 'object' &&
-                 (arguments[0] instanceof ArrayBuffer || ECMAScript.Class(arguments[0]) === 'ArrayBuffer')) {
-        // Constructor(ArrayBuffer buffer,
-        //             optional unsigned long byteOffset, optional unsigned long length)
-        this.buffer = buffer;
-
-        this.byteOffset = ECMAScript.ToUint32(byteOffset);
-        if (this.byteOffset > this.buffer.byteLength) {
-          throw new RangeError("byteOffset out of range");
-        }
-
-        if (this.byteOffset % this.BYTES_PER_ELEMENT) {
-          // The given byteOffset must be a multiple of the element
-          // size of the specific type, otherwise an exception is raised.
-          throw new RangeError("ArrayBuffer length minus the byteOffset is not a multiple of the element size.");
-        }
-
-        if (arguments.length < 3) {
-          this.byteLength = this.buffer.byteLength - this.byteOffset;
-
-          if (this.byteLength % this.BYTES_PER_ELEMENT) {
-            throw new RangeError("length of buffer minus byteOffset not a multiple of the element size");
-          }
-          this.length = this.byteLength / this.BYTES_PER_ELEMENT;
-        } else {
-          this.length = ECMAScript.ToUint32(length);
-          this.byteLength = this.length * this.BYTES_PER_ELEMENT;
-        }
-
-        if ((this.byteOffset + this.byteLength) > this.buffer.byteLength) {
-          throw new RangeError("byteOffset and length reference an area beyond the end of the buffer");
-        }
-      } else {
-        throw new TypeError("Unexpected argument type(s)");
-      }
-
-      this.constructor = ctor;
-
-      configureProperties(this);
-      makeArrayAccessors(this);
-    };
-
-    ctor.prototype = new ArrayBufferView();
-    ctor.prototype.BYTES_PER_ELEMENT = bytesPerElement;
-    ctor.prototype._pack = pack;
-    ctor.prototype._unpack = unpack;
-    ctor.BYTES_PER_ELEMENT = bytesPerElement;
-
-    // getter type (unsigned long index);
-    ctor.prototype._getter = function(index) {
-      if (arguments.length < 1) throw new SyntaxError("Not enough arguments");
-
-      index = ECMAScript.ToUint32(index);
-      if (index >= this.length) {
-        return undefined;
-      }
-
-      var bytes = [], i, o;
-      for (i = 0, o = this.byteOffset + index * this.BYTES_PER_ELEMENT;
-           i < this.BYTES_PER_ELEMENT;
-           i += 1, o += 1) {
-        bytes.push(this.buffer._bytes[o]);
-      }
-      return this._unpack(bytes);
-    };
-
-    // NONSTANDARD: convenience alias for getter: type get(unsigned long index);
-    ctor.prototype.get = ctor.prototype._getter;
-
-    // setter void (unsigned long index, type value);
-    ctor.prototype._setter = function(index, value) {
-      if (arguments.length < 2) throw new SyntaxError("Not enough arguments");
-
-      index = ECMAScript.ToUint32(index);
-      if (index >= this.length) {
-        return undefined;
-      }
-
-      var bytes = this._pack(value), i, o;
-      for (i = 0, o = this.byteOffset + index * this.BYTES_PER_ELEMENT;
-           i < this.BYTES_PER_ELEMENT;
-           i += 1, o += 1) {
-        this.buffer._bytes[o] = bytes[i];
-      }
-    };
-
-    // void set(TypedArray array, optional unsigned long offset);
-    // void set(sequence<type> array, optional unsigned long offset);
-    ctor.prototype.set = function(index, value) {
-      if (arguments.length < 1) throw new SyntaxError("Not enough arguments");
-      var array, sequence, offset, len,
-          i, s, d,
-          byteOffset, byteLength, tmp;
-
-      if (typeof arguments[0] === 'object' && arguments[0].constructor === this.constructor) {
-        // void set(TypedArray array, optional unsigned long offset);
-        array = arguments[0];
-        offset = ECMAScript.ToUint32(arguments[1]);
-
-        if (offset + array.length > this.length) {
-          throw new RangeError("Offset plus length of array is out of range");
-        }
-
-        byteOffset = this.byteOffset + offset * this.BYTES_PER_ELEMENT;
-        byteLength = array.length * this.BYTES_PER_ELEMENT;
-
-        if (array.buffer === this.buffer) {
-          tmp = [];
-          for (i = 0, s = array.byteOffset; i < byteLength; i += 1, s += 1) {
-            tmp[i] = array.buffer._bytes[s];
-          }
-          for (i = 0, d = byteOffset; i < byteLength; i += 1, d += 1) {
-            this.buffer._bytes[d] = tmp[i];
-          }
-        } else {
-          for (i = 0, s = array.byteOffset, d = byteOffset;
-               i < byteLength; i += 1, s += 1, d += 1) {
-            this.buffer._bytes[d] = array.buffer._bytes[s];
-          }
-        }
-      } else if (typeof arguments[0] === 'object' && typeof arguments[0].length !== 'undefined') {
-        // void set(sequence<type> array, optional unsigned long offset);
-        sequence = arguments[0];
-        len = ECMAScript.ToUint32(sequence.length);
-        offset = ECMAScript.ToUint32(arguments[1]);
-
-        if (offset + len > this.length) {
-          throw new RangeError("Offset plus length of array is out of range");
-        }
-
-        for (i = 0; i < len; i += 1) {
-          s = sequence[i];
-          this._setter(offset + i, Number(s));
-        }
-      } else {
-        throw new TypeError("Unexpected argument type(s)");
-      }
-    };
-
-    // TypedArray subarray(long begin, optional long end);
-    ctor.prototype.subarray = function(start, end) {
-      function clamp(v, min, max) { return v < min ? min : v > max ? max : v; }
-
-      start = ECMAScript.ToInt32(start);
-      end = ECMAScript.ToInt32(end);
-
-      if (arguments.length < 1) { start = 0; }
-      if (arguments.length < 2) { end = this.length; }
-
-      if (start < 0) { start = this.length + start; }
-      if (end < 0) { end = this.length + end; }
-
-      start = clamp(start, 0, this.length);
-      end = clamp(end, 0, this.length);
-
-      var len = end - start;
-      if (len < 0) {
-        len = 0;
-      }
-
-      return new this.constructor(
-        this.buffer, this.byteOffset + start * this.BYTES_PER_ELEMENT, len);
-    };
-
-    return ctor;
-  }
-
-  var Int8Array = makeConstructor(1, packI8, unpackI8);
-  var Uint8Array = makeConstructor(1, packU8, unpackU8);
-  var Uint8ClampedArray = makeConstructor(1, packU8Clamped, unpackU8);
-  var Int16Array = makeConstructor(2, packI16, unpackI16);
-  var Uint16Array = makeConstructor(2, packU16, unpackU16);
-  var Int32Array = makeConstructor(4, packI32, unpackI32);
-  var Uint32Array = makeConstructor(4, packU32, unpackU32);
-  var Float32Array = makeConstructor(4, packF32, unpackF32);
-  var Float64Array = makeConstructor(8, packF64, unpackF64);
-
-  exports.Int8Array = exports.Int8Array || Int8Array;
-  exports.Uint8Array = exports.Uint8Array || Uint8Array;
-  exports.Uint8ClampedArray = exports.Uint8ClampedArray || Uint8ClampedArray;
-  exports.Int16Array = exports.Int16Array || Int16Array;
-  exports.Uint16Array = exports.Uint16Array || Uint16Array;
-  exports.Int32Array = exports.Int32Array || Int32Array;
-  exports.Uint32Array = exports.Uint32Array || Uint32Array;
-  exports.Float32Array = exports.Float32Array || Float32Array;
-  exports.Float64Array = exports.Float64Array || Float64Array;
-}());
-
-//
-// 6 The DataView View Type
-//
-
-(function() {
-  function r(array, index) {
-    return ECMAScript.IsCallable(array.get) ? array.get(index) : array[index];
-  }
-
-  var IS_BIG_ENDIAN = (function() {
-    var u16array = new(exports.Uint16Array)([0x1234]),
-        u8array = new(exports.Uint8Array)(u16array.buffer);
-    return r(u8array, 0) === 0x12;
-  }());
-
-  // Constructor(ArrayBuffer buffer,
-  //             optional unsigned long byteOffset,
-  //             optional unsigned long byteLength)
-  /** @constructor */
-  var DataView = function DataView(buffer, byteOffset, byteLength) {
-    if (arguments.length === 0) {
-      buffer = new exports.ArrayBuffer(0);
-    } else if (!(buffer instanceof exports.ArrayBuffer || ECMAScript.Class(buffer) === 'ArrayBuffer')) {
-      throw new TypeError("TypeError");
-    }
-
-    this.buffer = buffer || new exports.ArrayBuffer(0);
-
-    this.byteOffset = ECMAScript.ToUint32(byteOffset);
-    if (this.byteOffset > this.buffer.byteLength) {
-      throw new RangeError("byteOffset out of range");
-    }
-
-    if (arguments.length < 3) {
-      this.byteLength = this.buffer.byteLength - this.byteOffset;
-    } else {
-      this.byteLength = ECMAScript.ToUint32(byteLength);
-    }
-
-    if ((this.byteOffset + this.byteLength) > this.buffer.byteLength) {
-      throw new RangeError("byteOffset and length reference an area beyond the end of the buffer");
-    }
-
-    configureProperties(this);
-  };
-
-  function makeGetter(arrayType) {
-    return function(byteOffset, littleEndian) {
-
-      byteOffset = ECMAScript.ToUint32(byteOffset);
-
-      if (byteOffset + arrayType.BYTES_PER_ELEMENT > this.byteLength) {
-        throw new RangeError("Array index out of range");
-      }
-      byteOffset += this.byteOffset;
-
-      var uint8Array = new exports.Uint8Array(this.buffer, byteOffset, arrayType.BYTES_PER_ELEMENT),
-          bytes = [], i;
-      for (i = 0; i < arrayType.BYTES_PER_ELEMENT; i += 1) {
-        bytes.push(r(uint8Array, i));
-      }
-
-      if (Boolean(littleEndian) === Boolean(IS_BIG_ENDIAN)) {
-        bytes.reverse();
-      }
-
-      return r(new arrayType(new exports.Uint8Array(bytes).buffer), 0);
-    };
-  }
-
-  DataView.prototype.getUint8 = makeGetter(exports.Uint8Array);
-  DataView.prototype.getInt8 = makeGetter(exports.Int8Array);
-  DataView.prototype.getUint16 = makeGetter(exports.Uint16Array);
-  DataView.prototype.getInt16 = makeGetter(exports.Int16Array);
-  DataView.prototype.getUint32 = makeGetter(exports.Uint32Array);
-  DataView.prototype.getInt32 = makeGetter(exports.Int32Array);
-  DataView.prototype.getFloat32 = makeGetter(exports.Float32Array);
-  DataView.prototype.getFloat64 = makeGetter(exports.Float64Array);
-
-  function makeSetter(arrayType) {
-    return function(byteOffset, value, littleEndian) {
-
-      byteOffset = ECMAScript.ToUint32(byteOffset);
-      if (byteOffset + arrayType.BYTES_PER_ELEMENT > this.byteLength) {
-        throw new RangeError("Array index out of range");
-      }
-
-      // Get bytes
-      var typeArray = new arrayType([value]),
-          byteArray = new exports.Uint8Array(typeArray.buffer),
-          bytes = [], i, byteView;
-
-      for (i = 0; i < arrayType.BYTES_PER_ELEMENT; i += 1) {
-        bytes.push(r(byteArray, i));
-      }
-
-      // Flip if necessary
-      if (Boolean(littleEndian) === Boolean(IS_BIG_ENDIAN)) {
-        bytes.reverse();
-      }
-
-      // Write them
-      byteView = new exports.Uint8Array(this.buffer, byteOffset, arrayType.BYTES_PER_ELEMENT);
-      byteView.set(bytes);
-    };
-  }
-
-  DataView.prototype.setUint8 = makeSetter(exports.Uint8Array);
-  DataView.prototype.setInt8 = makeSetter(exports.Int8Array);
-  DataView.prototype.setUint16 = makeSetter(exports.Uint16Array);
-  DataView.prototype.setInt16 = makeSetter(exports.Int16Array);
-  DataView.prototype.setUint32 = makeSetter(exports.Uint32Array);
-  DataView.prototype.setInt32 = makeSetter(exports.Int32Array);
-  DataView.prototype.setFloat32 = makeSetter(exports.Float32Array);
-  DataView.prototype.setFloat64 = makeSetter(exports.Float64Array);
-
-  exports.DataView = exports.DataView || DataView;
-
-}());
diff --git a/node_modules/typedarray/package.json b/node_modules/typedarray/package.json
deleted file mode 100644
index 60c2d75..0000000
--- a/node_modules/typedarray/package.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
-  "author": {
-    "email": "mail@substack.net",
-    "name": "James Halliday",
-    "url": "http://substack.net"
-  },
-  "description": "TypedArray polyfill for old browsers",
-  "devDependencies": {
-    "tape": "~2.3.2"
-  },
-  "homepage": "https://github.com/substack/typedarray",
-  "keywords": [
-    "ArrayBuffer",
-    "DataView",
-    "Float32Array",
-    "Float64Array",
-    "Int8Array",
-    "Int16Array",
-    "Int32Array",
-    "Uint8Array",
-    "Uint8ClampedArray",
-    "Uint16Array",
-    "Uint32Array",
-    "typed",
-    "array",
-    "polyfill"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "typedarray",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/substack/typedarray.git"
-  },
-  "scripts": {
-    "test": "tape test/*.js test/server/*.js"
-  },
-  "testling": {
-    "browsers": [
-      "ie/6..latest",
-      "firefox/16..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"
-    ],
-    "files": "test/*.js"
-  },
-  "version": "0.0.6"
-}
\ No newline at end of file
diff --git a/node_modules/typedarray/readme.markdown b/node_modules/typedarray/readme.markdown
deleted file mode 100644
index d18f6f7..0000000
--- a/node_modules/typedarray/readme.markdown
+++ /dev/null
@@ -1,61 +0,0 @@
-# typedarray
-
-TypedArray polyfill ripped from [this
-module](https://raw.github.com/inexorabletash/polyfill).
-
-[![build status](https://secure.travis-ci.org/substack/typedarray.png)](http://travis-ci.org/substack/typedarray)
-
-[![testling badge](https://ci.testling.com/substack/typedarray.png)](https://ci.testling.com/substack/typedarray)
-
-# example
-
-``` js
-var Uint8Array = require('typedarray').Uint8Array;
-var ua = new Uint8Array(5);
-ua[1] = 256 + 55;
-console.log(ua[1]);
-```
-
-output:
-
-```
-55
-```
-
-# methods
-
-``` js
-var TA = require('typedarray')
-```
-
-The `TA` object has the following constructors:
-
-* TA.ArrayBuffer
-* TA.DataView
-* TA.Float32Array
-* TA.Float64Array
-* TA.Int8Array
-* TA.Int16Array
-* TA.Int32Array
-* TA.Uint8Array
-* TA.Uint8ClampedArray
-* TA.Uint16Array
-* TA.Uint32Array
-
-# install
-
-With [npm](https://npmjs.org) do:
-
-```
-npm install typedarray
-```
-
-To use this module in the browser, compile with
-[browserify](http://browserify.org)
-or download a UMD build from browserify CDN:
-
-http://wzrd.in/standalone/typedarray@latest
-
-# license
-
-MIT
diff --git a/node_modules/typedarray/test/server/undef_globals.js b/node_modules/typedarray/test/server/undef_globals.js
deleted file mode 100644
index 425950f..0000000
--- a/node_modules/typedarray/test/server/undef_globals.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var test = require('tape');
-var vm = require('vm');
-var fs = require('fs');
-var src = fs.readFileSync(__dirname + '/../../index.js', 'utf8');
-
-test('u8a without globals', function (t) {
-    var c = {
-        module: { exports: {} },
-    };
-    c.exports = c.module.exports;
-    vm.runInNewContext(src, c);
-    var TA = c.module.exports;
-    var ua = new(TA.Uint8Array)(5);
-    
-    t.equal(ua.length, 5);
-    ua[1] = 256 + 55;
-    t.equal(ua[1], 55);
-    t.end();
-});
diff --git a/node_modules/typedarray/test/tarray.js b/node_modules/typedarray/test/tarray.js
deleted file mode 100644
index df596a3..0000000
--- a/node_modules/typedarray/test/tarray.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var TA = require('../');
-var test = require('tape');
-
-test('tiny u8a test', function (t) {
-    var ua = new(TA.Uint8Array)(5);
-    t.equal(ua.length, 5);
-    ua[1] = 256 + 55;
-    t.equal(ua[1], 55);
-    t.end();
-});
diff --git a/node_modules/unbzip2-stream/LICENSE b/node_modules/unbzip2-stream/LICENSE
new file mode 100644
index 0000000..0983ec1
--- /dev/null
+++ b/node_modules/unbzip2-stream/LICENSE
@@ -0,0 +1,24 @@
+Copyright (c) 2017 by Jan Boelsche (jan@lagomorph.de)
+
+based on bzip2.js - a small bzip2 decompression implementation
+Copyright 2011 by antimatter15 (antimatter15@gmail.com)
+
+Based on micro-bunzip by Rob Landley (rob@landley.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/unbzip2-stream/README.md b/node_modules/unbzip2-stream/README.md
new file mode 100644
index 0000000..db4a03c
--- /dev/null
+++ b/node_modules/unbzip2-stream/README.md
@@ -0,0 +1,59 @@
+[![npm version](https://badge.fury.io/js/unbzip2-stream.svg)](http://badge.fury.io/js/unbzip2-stream)
+
+unbzip2-stream
+===
+streaming bzip2 decompressor in pure JS for Node and browserify.
+
+Buffers
+---
+When browserified, the stream emits instances of [feross/buffer](https://github.com/feross/buffer) instead of raw Uint8Arrays to have a consistant API across browsers and Node.
+
+Usage
+---
+``` js
+var bz2 = require('unbzip2-stream');
+var fs = require('fs');
+
+// decompress test.bz2 and output the result
+fs.createReadStream('./test.bz2').pipe(bz2()).pipe(process.stdout);
+```
+
+Also see [test/browser/download.js](https://github.com/regular/unbzip2-stream/blob/master/test/browser/download.js) for an example of decompressing a file while downloading.
+
+Or, using a &lt;script&gt; tag
+---
+
+```
+<script src="https://npm-cdn.info/unbzip2-stream/dist/unbzip2-stream.min.js"></script>
+<script>
+    var myStream = window.unbzip2Stream();
+    // now pipe stuff through it (see above)
+</script>
+```
+
+Tests
+---
+To run tests in Node:
+
+    npm run test
+
+To run tests in PhantomJS
+
+    npm run browser-test
+
+Additional Tests
+----------------
+There are two more tests that specifically test decompression of a very large file. Because I don't want to include large binary files in this repository, the files are created by running an npm script.
+
+    npm run prepare-long-test
+
+You can now
+
+    npm run long-test
+
+And to run a test in chrome that downloads and decompresses a large binary file
+
+    npm run download-test
+
+Open the browser's console to see the output.
+
diff --git a/node_modules/unbzip2-stream/index.js b/node_modules/unbzip2-stream/index.js
new file mode 100644
index 0000000..4333963
--- /dev/null
+++ b/node_modules/unbzip2-stream/index.js
@@ -0,0 +1,93 @@
+var through = require('through');
+var bz2 = require('./lib/bzip2');
+var bitIterator = require('./lib/bit_iterator');
+
+module.exports = unbzip2Stream;
+
+function unbzip2Stream() {
+    var bufferQueue = [];
+    var hasBytes = 0;
+    var blockSize = 0;
+    var broken = false;
+    var done = false;
+    var bitReader = null;
+    var streamCRC = null;
+
+    function decompressBlock(push){
+        if(!blockSize){
+            blockSize = bz2.header(bitReader);
+            //console.error("got header of", blockSize);
+            streamCRC = 0;
+            return true;
+        }else{
+            var bufsize = 100000 * blockSize;
+            var buf = new Int32Array(bufsize);
+            
+            var chunk = [];
+            var f = function(b) {
+                chunk.push(b);
+            };
+
+            streamCRC = bz2.decompress(bitReader, f, buf, bufsize, streamCRC);
+            if (streamCRC === null) {
+                // reset for next bzip2 header
+                blockSize = 0;
+                return false;
+            }else{
+                //console.error('decompressed', chunk.length,'bytes');
+                push(Buffer.from(chunk));
+                return true;
+            }
+        }
+    }
+
+    var outlength = 0;
+    function decompressAndQueue(stream) {
+        if (broken) return;
+        try {
+            return decompressBlock(function(d) {
+                stream.queue(d);
+                if (d !== null) {
+                    //console.error('write at', outlength.toString(16));
+                    outlength += d.length;
+                } else {
+                    //console.error('written EOS');
+                }
+            });
+        } catch(e) {
+            //console.error(e);
+            stream.emit('error', e);
+            broken = true;
+            return false;
+        }
+    }
+
+    return through(
+        function write(data) {
+            //console.error('received', data.length,'bytes in', typeof data);
+            bufferQueue.push(data);
+            hasBytes += data.length;
+            if (bitReader === null) {
+                bitReader = bitIterator(function() {
+                    return bufferQueue.shift();
+                });
+            }
+            while (!broken && hasBytes - bitReader.bytesRead + 1 >= ((25000 + 100000 * blockSize) || 4)){
+                //console.error('decompressing with', hasBytes - bitReader.bytesRead + 1, 'bytes in buffer');
+                decompressAndQueue(this);
+            }
+        },
+        function end(x) {
+            //console.error(x,'last compressing with', hasBytes, 'bytes in buffer');
+            while (!broken && bitReader && hasBytes > bitReader.bytesRead){
+                decompressAndQueue(this);
+            }
+            if (!broken) {
+                if (streamCRC !== null)
+                    this.emit('error', new Error("input stream ended prematurely"));
+                this.queue(null);
+            }
+        }
+    );
+}
+
diff --git a/node_modules/unbzip2-stream/lib/bit_iterator.js b/node_modules/unbzip2-stream/lib/bit_iterator.js
new file mode 100644
index 0000000..270e2d6
--- /dev/null
+++ b/node_modules/unbzip2-stream/lib/bit_iterator.js
@@ -0,0 +1,39 @@
+var BITMASK = [0, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF];
+
+// returns a function that reads bits.
+// takes a buffer iterator as input
+module.exports = function bitIterator(nextBuffer) {
+    var bit = 0, byte = 0;
+    var bytes = nextBuffer();
+    var f = function(n) {
+        if (n === null && bit != 0) {  // align to byte boundary
+            bit = 0
+            byte++;
+            return;
+        }
+        var result = 0;
+        while(n > 0) {
+            if (byte >= bytes.length) {
+                byte = 0;
+                bytes = nextBuffer();
+            }
+            var left = 8 - bit;
+            if (bit === 0 && n > 0)
+                f.bytesRead++;
+            if (n >= left) {
+                result <<= left;
+                result |= (BITMASK[left] & bytes[byte++]);
+                bit = 0;
+                n -= left;
+            } else {
+                result <<= n;
+                result |= ((bytes[byte] & (BITMASK[n] << (8 - n - bit))) >> (8 - n - bit));
+                bit += n;
+                n = 0;
+            }
+        }
+        return result;
+    };
+    f.bytesRead = 0;
+    return f;
+};
diff --git a/node_modules/unbzip2-stream/lib/bzip2.js b/node_modules/unbzip2-stream/lib/bzip2.js
new file mode 100644
index 0000000..61c8cee
--- /dev/null
+++ b/node_modules/unbzip2-stream/lib/bzip2.js
@@ -0,0 +1,365 @@
+/* 
+  bzip2.js - a small bzip2 decompression implementation
+  
+  Copyright 2011 by antimatter15 (antimatter15@gmail.com)
+  
+  Based on micro-bunzip by Rob Landley (rob@landley.net).
+
+  Copyright (c) 2011 by antimatter15 (antimatter15@gmail.com).
+
+  Permission is hereby granted, free of charge, to any person obtaining a
+  copy of this software and associated documentation files (the "Software"),
+  to deal in the Software without restriction, including without limitation
+  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+  and/or sell copies of the Software, and to permit persons to whom the
+  Software is furnished to do so, subject to the following conditions:
+  
+  The above copyright notice and this permission notice shall be included
+  in all copies or substantial portions of the Software.
+  
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+  DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
+  THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+function Bzip2Error(message) {
+    this.name = 'Bzip2Error';
+    this.message = message;
+    this.stack = (new Error()).stack;
+}
+Bzip2Error.prototype = new Error;
+ 
+var message = {
+    Error: function(message) {throw new Bzip2Error(message);}
+};
+
+var bzip2 = {};
+bzip2.Bzip2Error = Bzip2Error;
+
+bzip2.crcTable =
+[
+   0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
+   0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
+   0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
+   0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
+   0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
+   0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
+   0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
+   0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
+   0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
+   0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
+   0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
+   0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
+   0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
+   0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
+   0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
+   0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
+   0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
+   0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
+   0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
+   0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
+   0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
+   0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
+   0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
+   0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
+   0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
+   0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
+   0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
+   0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
+   0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
+   0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
+   0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
+   0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
+   0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
+   0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
+   0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
+   0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
+   0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
+   0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
+   0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
+   0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
+   0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
+   0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
+   0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
+   0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
+   0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
+   0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
+   0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
+   0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
+   0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
+   0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
+   0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
+   0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
+   0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
+   0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
+   0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
+   0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
+   0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
+   0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
+   0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
+   0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
+   0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
+   0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
+   0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
+   0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
+];
+
+bzip2.array = function(bytes) {
+    var bit = 0, byte = 0;
+    var BITMASK = [0, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF ];
+    return function(n) {
+        var result = 0;
+        while(n > 0) {
+            var left = 8 - bit;
+            if (n >= left) {
+                result <<= left;
+                result |= (BITMASK[left] & bytes[byte++]);
+                bit = 0;
+                n -= left;
+            } else {
+                result <<= n;
+                result |= ((bytes[byte] & (BITMASK[n] << (8 - n - bit))) >> (8 - n - bit));
+                bit += n;
+                n = 0;
+            }
+        }
+        return result;
+    }
+}
+
+    
+bzip2.simple = function(srcbuffer, stream) {
+    var bits = bzip2.array(srcbuffer);
+    var size = bzip2.header(bits);
+    var ret = false;
+    var bufsize = 100000 * size;
+    var buf = new Int32Array(bufsize);
+    
+    do {
+        ret = bzip2.decompress(bits, stream, buf, bufsize);        
+    } while(!ret);
+}
+
+bzip2.header = function(bits) {
+    this.byteCount = new Int32Array(256);
+    this.symToByte = new Uint8Array(256);
+    this.mtfSymbol = new Int32Array(256);
+    this.selectors = new Uint8Array(0x8000);
+
+    if (bits(8*3) != 4348520) message.Error("No magic number found");
+
+    var i = bits(8) - 48;
+    if (i < 1 || i > 9) message.Error("Not a BZIP archive");
+    return i;
+};
+
+
+//takes a function for reading the block data (starting with 0x314159265359)
+//a block size (0-9) (optional, defaults to 9)
+//a length at which to stop decompressing and return the output
+bzip2.decompress = function(bits, stream, buf, bufsize, streamCRC) {
+    var MAX_HUFCODE_BITS = 20;
+    var MAX_SYMBOLS = 258;
+    var SYMBOL_RUNA = 0;
+    var SYMBOL_RUNB = 1;
+    var GROUP_SIZE = 50;
+    var crc = 0 ^ (-1);
+    
+    for(var h = '', i = 0; i < 6; i++) h += bits(8).toString(16);
+    if (h == "177245385090") {
+      var finalCRC = bits(32)|0;
+      if (finalCRC !== streamCRC) message.Error("Error in bzip2: crc32 do not match");
+      // align stream to byte
+      bits(null);
+      return null; // reset streamCRC for next call
+    }
+    if (h != "314159265359") message.Error("eek not valid bzip data");
+    var crcblock = bits(32)|0; // CRC code
+    if (bits(1)) message.Error("unsupported obsolete version");
+    var origPtr = bits(24);
+    if (origPtr > bufsize) message.Error("Initial position larger than buffer size");
+    var t = bits(16);
+    var symTotal = 0;
+    for (i = 0; i < 16; i++) {
+        if (t & (1 << (15 - i))) {
+            var k = bits(16);
+            for(j = 0; j < 16; j++) {
+                if (k & (1 << (15 - j))) {
+                    this.symToByte[symTotal++] = (16 * i) + j;
+                }
+            }
+        }
+    }
+
+    var groupCount = bits(3);
+    if (groupCount < 2 || groupCount > 6) message.Error("another error");
+    var nSelectors = bits(15);
+    if (nSelectors == 0) message.Error("meh");
+    for(var i = 0; i < groupCount; i++) this.mtfSymbol[i] = i;
+
+    for(var i = 0; i < nSelectors; i++) {
+        for(var j = 0; bits(1); j++) if (j >= groupCount) message.Error("whoops another error");
+        var uc = this.mtfSymbol[j];
+        for(var k = j-1; k>=0; k--) {
+            this.mtfSymbol[k+1] = this.mtfSymbol[k];
+        }
+        this.mtfSymbol[0] = uc;
+        this.selectors[i] = uc;
+    }
+
+    var symCount = symTotal + 2;
+    var groups = [];
+    var length = new Uint8Array(MAX_SYMBOLS),
+    temp = new Uint16Array(MAX_HUFCODE_BITS+1);
+
+    var hufGroup;
+
+    for(var j = 0; j < groupCount; j++) {
+        t = bits(5); //lengths
+        for(var i = 0; i < symCount; i++) {
+            while(true){
+                if (t < 1 || t > MAX_HUFCODE_BITS) message.Error("I gave up a while ago on writing error messages");
+                if (!bits(1)) break;
+                if (!bits(1)) t++;
+                else t--;
+            }
+            length[i] = t;
+        }
+        var  minLen,  maxLen;
+        minLen = maxLen = length[0];
+        for(var i = 1; i < symCount; i++) {
+            if (length[i] > maxLen) maxLen = length[i];
+            else if (length[i] < minLen) minLen = length[i];
+        }
+        hufGroup = groups[j] = {};
+        hufGroup.permute = new Int32Array(MAX_SYMBOLS);
+        hufGroup.limit = new Int32Array(MAX_HUFCODE_BITS + 1);
+        hufGroup.base = new Int32Array(MAX_HUFCODE_BITS + 1);
+
+        hufGroup.minLen = minLen;
+        hufGroup.maxLen = maxLen;
+        var base = hufGroup.base;
+        var limit = hufGroup.limit;
+        var pp = 0;
+        for(var i = minLen; i <= maxLen; i++)
+        for(var t = 0; t < symCount; t++)
+        if (length[t] == i) hufGroup.permute[pp++] = t;
+        for(i = minLen; i <= maxLen; i++) temp[i] = limit[i] = 0;
+        for(i = 0; i < symCount; i++) temp[length[i]]++;
+        pp = t = 0;
+        for(i = minLen; i < maxLen; i++) {
+            pp += temp[i];
+            limit[i] = pp - 1;
+            pp <<= 1;
+            base[i+1] = pp - (t += temp[i]);
+        }
+        limit[maxLen] = pp + temp[maxLen] - 1;
+        base[minLen] = 0;
+    }
+
+    for(var i = 0; i < 256; i++) { 
+        this.mtfSymbol[i] = i;
+        this.byteCount[i] = 0;
+    }
+    var runPos, count, symCount, selector;
+    runPos = count = symCount = selector = 0;    
+    while(true) {
+        if (!(symCount--)) {
+            symCount = GROUP_SIZE - 1;
+            if (selector >= nSelectors) message.Error("meow i'm a kitty, that's an error");
+            hufGroup = groups[this.selectors[selector++]];
+            base = hufGroup.base;
+            limit = hufGroup.limit;
+        }
+        i = hufGroup.minLen;
+        j = bits(i);
+        while(true) {
+            if (i > hufGroup.maxLen) message.Error("rawr i'm a dinosaur");
+            if (j <= limit[i]) break;
+            i++;
+            j = (j << 1) | bits(1);
+        }
+        j -= base[i];
+        if (j < 0 || j >= MAX_SYMBOLS) message.Error("moo i'm a cow");
+        var nextSym = hufGroup.permute[j];
+        if (nextSym == SYMBOL_RUNA || nextSym == SYMBOL_RUNB) {
+            if (!runPos){
+                runPos = 1;
+                t = 0;
+            }
+            if (nextSym == SYMBOL_RUNA) t += runPos;
+            else t += 2 * runPos;
+            runPos <<= 1;
+            continue;
+        }
+        if (runPos) {
+            runPos = 0;
+            if (count + t > bufsize) message.Error("Boom.");
+            uc = this.symToByte[this.mtfSymbol[0]];
+            this.byteCount[uc] += t;
+            while(t--) buf[count++] = uc;
+        }
+        if (nextSym > symTotal) break;
+        if (count >= bufsize) message.Error("I can't think of anything. Error");
+        i = nextSym - 1;
+        uc = this.mtfSymbol[i];
+        for(var k = i-1; k>=0; k--) {
+            this.mtfSymbol[k+1] = this.mtfSymbol[k];
+        }
+        this.mtfSymbol[0] = uc
+        uc = this.symToByte[uc];
+        this.byteCount[uc]++;
+        buf[count++] = uc;
+    }
+    if (origPtr < 0 || origPtr >= count) message.Error("I'm a monkey and I'm throwing something at someone, namely you");
+    var j = 0;
+    for(var i = 0; i < 256; i++) {
+        k = j + this.byteCount[i];
+        this.byteCount[i] = j;
+        j = k;
+    }
+    for(var i = 0; i < count; i++) {
+        uc = buf[i] & 0xff;
+        buf[this.byteCount[uc]] |= (i << 8);
+        this.byteCount[uc]++;
+    }
+    var pos = 0, current = 0, run = 0;
+    if (count) {
+        pos = buf[origPtr];
+        current = (pos & 0xff);
+        pos >>= 8;
+        run = -1;
+    }
+    count = count;
+    var copies, previous, outbyte;
+    while(count) {
+        count--;
+        previous = current;
+        pos = buf[pos];
+        current = pos & 0xff;
+        pos >>= 8;
+        if (run++ == 3) {
+            copies = current;
+            outbyte = previous;
+            current = -1;
+        } else {
+            copies = 1;
+            outbyte = current;
+        }
+        while(copies--) {
+            crc = ((crc << 8) ^ this.crcTable[((crc>>24) ^ outbyte) & 0xFF])&0xFFFFFFFF; // crc32
+            stream(outbyte);
+        }
+        if (current != previous) run = 0;
+    }
+
+    crc = (crc ^ (-1)) >>> 0;
+    if ((crc|0) != (crcblock|0)) message.Error("Error in bzip2: crc32 do not match");
+    streamCRC = (crc ^ ((streamCRC << 1) | (streamCRC >>> 31))) & 0xFFFFFFFF;
+    return streamCRC;
+}
+
+module.exports = bzip2;
diff --git a/node_modules/unbzip2-stream/package.json b/node_modules/unbzip2-stream/package.json
new file mode 100644
index 0000000..7b4e7f0
--- /dev/null
+++ b/node_modules/unbzip2-stream/package.json
@@ -0,0 +1,51 @@
+{
+  "author": "Jan B\u00f6lsche <jan@lagomorph.de>",
+  "bugs": {
+    "url": "https://github.com/regular/unbzip2-stream/issues"
+  },
+  "dependencies": {
+    "buffer": "^5.2.1",
+    "through": "^2.3.8"
+  },
+  "description": "streaming unbzip2 implementation in pure javascript for node and browsers",
+  "devDependencies": {
+    "beefy": "^2.1.8",
+    "brfs": "^1.2.0",
+    "browserify": "^16.2.3",
+    "concat-stream": "^1.4.7",
+    "stream-equal": "^1.1.1",
+    "tape": "^4.9.2",
+    "tape-run": "^4.0.0",
+    "uglify-js": "^3.0.10"
+  },
+  "files": [
+    "index.js",
+    "lib",
+    "dist/unbzip2-stream.min.js"
+  ],
+  "keywords": [
+    "bzip",
+    "bzip2",
+    "bz2",
+    "stream",
+    "streaming",
+    "decompress",
+    "through"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "unbzip2-stream",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/regular/unbzip2-stream.git"
+  },
+  "scripts": {
+    "browser-test": "browserify -t brfs test/simple.js | tape-run",
+    "download-test": "beefy test/browser/long.js --open -- -t brfs",
+    "long-test": "tape test/extra/long.js",
+    "prepare": "mkdir -p dist && browserify -s unbzip2Stream index.js | uglifyjs > dist/unbzip2-stream.min.js",
+    "prepare-long-test": "head -c 104857600 < /dev/urandom | tee test/fixtures/vmlinux.bin | bzip2 > test/fixtures/vmlinux.bin.bz2",
+    "test": "tape test/*.js"
+  },
+  "version": "1.4.2"
+}
\ No newline at end of file