diff --git a/node_modules/.bin/cdl b/node_modules/.bin/cdl
deleted file mode 100644
index 7c99649175b7a3953d922a3dcdd65a1bb05f2d45..0000000000000000000000000000000000000000
--- a/node_modules/.bin/cdl
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
-
-case `uname` in
-    *CYGWIN*|*MINGW*|*MSYS*)
-        if command -v cygpath > /dev/null 2>&1; then
-            basedir=`cygpath -w "$basedir"`
-        fi
-    ;;
-esac
-
-if [ -x "$basedir/node" ]; then
-  exec "$basedir/node"  "$basedir/../cardinal/bin/cdl.js" "$@"
-else 
-  exec node  "$basedir/../cardinal/bin/cdl.js" "$@"
-fi
diff --git a/node_modules/.bin/cdl.cmd b/node_modules/.bin/cdl.cmd
deleted file mode 100644
index b44765681f04ea8aa94d4cedd0590faff107b246..0000000000000000000000000000000000000000
--- a/node_modules/.bin/cdl.cmd
+++ /dev/null
@@ -1,17 +0,0 @@
-@ECHO off
-GOTO start
-:find_dp0
-SET dp0=%~dp0
-EXIT /b
-:start
-SETLOCAL
-CALL :find_dp0
-
-IF EXIST "%dp0%\node.exe" (
-  SET "_prog=%dp0%\node.exe"
-) ELSE (
-  SET "_prog=node"
-  SET PATHEXT=%PATHEXT:;.JS;=;%
-)
-
-endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%"  "%dp0%\..\cardinal\bin\cdl.js" %*
diff --git a/node_modules/.bin/cdl.ps1 b/node_modules/.bin/cdl.ps1
deleted file mode 100644
index caaa97727590bc379446fffc2d327d8464417e96..0000000000000000000000000000000000000000
--- a/node_modules/.bin/cdl.ps1
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env pwsh
-$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
-
-$exe=""
-if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
-  # Fix case when both the Windows and Linux builds of Node
-  # are installed in the same directory
-  $exe=".exe"
-}
-$ret=0
-if (Test-Path "$basedir/node$exe") {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "$basedir/node$exe"  "$basedir/../cardinal/bin/cdl.js" $args
-  } else {
-    & "$basedir/node$exe"  "$basedir/../cardinal/bin/cdl.js" $args
-  }
-  $ret=$LASTEXITCODE
-} else {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "node$exe"  "$basedir/../cardinal/bin/cdl.js" $args
-  } else {
-    & "node$exe"  "$basedir/../cardinal/bin/cdl.js" $args
-  }
-  $ret=$LASTEXITCODE
-}
-exit $ret
diff --git a/node_modules/.bin/esparse b/node_modules/.bin/esparse
deleted file mode 100644
index 601762cefbe13be5c1436be07066efc0331332da..0000000000000000000000000000000000000000
--- a/node_modules/.bin/esparse
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
-
-case `uname` in
-    *CYGWIN*|*MINGW*|*MSYS*)
-        if command -v cygpath > /dev/null 2>&1; then
-            basedir=`cygpath -w "$basedir"`
-        fi
-    ;;
-esac
-
-if [ -x "$basedir/node" ]; then
-  exec "$basedir/node"  "$basedir/../esprima/bin/esparse.js" "$@"
-else 
-  exec node  "$basedir/../esprima/bin/esparse.js" "$@"
-fi
diff --git a/node_modules/.bin/esparse.cmd b/node_modules/.bin/esparse.cmd
deleted file mode 100644
index 2ca6d502e8f05830f7ecce61e81fa466c72eda88..0000000000000000000000000000000000000000
--- a/node_modules/.bin/esparse.cmd
+++ /dev/null
@@ -1,17 +0,0 @@
-@ECHO off
-GOTO start
-:find_dp0
-SET dp0=%~dp0
-EXIT /b
-:start
-SETLOCAL
-CALL :find_dp0
-
-IF EXIST "%dp0%\node.exe" (
-  SET "_prog=%dp0%\node.exe"
-) ELSE (
-  SET "_prog=node"
-  SET PATHEXT=%PATHEXT:;.JS;=;%
-)
-
-endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%"  "%dp0%\..\esprima\bin\esparse.js" %*
diff --git a/node_modules/.bin/esparse.ps1 b/node_modules/.bin/esparse.ps1
deleted file mode 100644
index f19ed7301976b8e3b40bc7eb818b04a1958b50a1..0000000000000000000000000000000000000000
--- a/node_modules/.bin/esparse.ps1
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env pwsh
-$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
-
-$exe=""
-if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
-  # Fix case when both the Windows and Linux builds of Node
-  # are installed in the same directory
-  $exe=".exe"
-}
-$ret=0
-if (Test-Path "$basedir/node$exe") {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "$basedir/node$exe"  "$basedir/../esprima/bin/esparse.js" $args
-  } else {
-    & "$basedir/node$exe"  "$basedir/../esprima/bin/esparse.js" $args
-  }
-  $ret=$LASTEXITCODE
-} else {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "node$exe"  "$basedir/../esprima/bin/esparse.js" $args
-  } else {
-    & "node$exe"  "$basedir/../esprima/bin/esparse.js" $args
-  }
-  $ret=$LASTEXITCODE
-}
-exit $ret
diff --git a/node_modules/.bin/esvalidate b/node_modules/.bin/esvalidate
deleted file mode 100644
index e2fee1f12c07b80a8652b2fc3fd205d022082be7..0000000000000000000000000000000000000000
--- a/node_modules/.bin/esvalidate
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
-
-case `uname` in
-    *CYGWIN*|*MINGW*|*MSYS*)
-        if command -v cygpath > /dev/null 2>&1; then
-            basedir=`cygpath -w "$basedir"`
-        fi
-    ;;
-esac
-
-if [ -x "$basedir/node" ]; then
-  exec "$basedir/node"  "$basedir/../esprima/bin/esvalidate.js" "$@"
-else 
-  exec node  "$basedir/../esprima/bin/esvalidate.js" "$@"
-fi
diff --git a/node_modules/.bin/esvalidate.cmd b/node_modules/.bin/esvalidate.cmd
deleted file mode 100644
index 4c41643ef5b75495b8a6a70864d84ed5b24e5576..0000000000000000000000000000000000000000
--- a/node_modules/.bin/esvalidate.cmd
+++ /dev/null
@@ -1,17 +0,0 @@
-@ECHO off
-GOTO start
-:find_dp0
-SET dp0=%~dp0
-EXIT /b
-:start
-SETLOCAL
-CALL :find_dp0
-
-IF EXIST "%dp0%\node.exe" (
-  SET "_prog=%dp0%\node.exe"
-) ELSE (
-  SET "_prog=node"
-  SET PATHEXT=%PATHEXT:;.JS;=;%
-)
-
-endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%"  "%dp0%\..\esprima\bin\esvalidate.js" %*
diff --git a/node_modules/.bin/esvalidate.ps1 b/node_modules/.bin/esvalidate.ps1
deleted file mode 100644
index 23699d11e09c2a5795ebb26a2f59f7c0beee3277..0000000000000000000000000000000000000000
--- a/node_modules/.bin/esvalidate.ps1
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env pwsh
-$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
-
-$exe=""
-if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
-  # Fix case when both the Windows and Linux builds of Node
-  # are installed in the same directory
-  $exe=".exe"
-}
-$ret=0
-if (Test-Path "$basedir/node$exe") {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "$basedir/node$exe"  "$basedir/../esprima/bin/esvalidate.js" $args
-  } else {
-    & "$basedir/node$exe"  "$basedir/../esprima/bin/esvalidate.js" $args
-  }
-  $ret=$LASTEXITCODE
-} else {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "node$exe"  "$basedir/../esprima/bin/esvalidate.js" $args
-  } else {
-    & "node$exe"  "$basedir/../esprima/bin/esvalidate.js" $args
-  }
-  $ret=$LASTEXITCODE
-}
-exit $ret
diff --git a/node_modules/.bin/mime b/node_modules/.bin/mime
deleted file mode 100644
index 7751de3cbb456deecd25fb22c6f575bc7a78554d..0000000000000000000000000000000000000000
--- a/node_modules/.bin/mime
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
-
-case `uname` in
-    *CYGWIN*|*MINGW*|*MSYS*)
-        if command -v cygpath > /dev/null 2>&1; then
-            basedir=`cygpath -w "$basedir"`
-        fi
-    ;;
-esac
-
-if [ -x "$basedir/node" ]; then
-  exec "$basedir/node"  "$basedir/../mime/cli.js" "$@"
-else 
-  exec node  "$basedir/../mime/cli.js" "$@"
-fi
diff --git a/node_modules/.bin/mime.cmd b/node_modules/.bin/mime.cmd
deleted file mode 100644
index 54491f12e08014083099d3a46bf7b99f0ec22b56..0000000000000000000000000000000000000000
--- a/node_modules/.bin/mime.cmd
+++ /dev/null
@@ -1,17 +0,0 @@
-@ECHO off
-GOTO start
-:find_dp0
-SET dp0=%~dp0
-EXIT /b
-:start
-SETLOCAL
-CALL :find_dp0
-
-IF EXIST "%dp0%\node.exe" (
-  SET "_prog=%dp0%\node.exe"
-) ELSE (
-  SET "_prog=node"
-  SET PATHEXT=%PATHEXT:;.JS;=;%
-)
-
-endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%"  "%dp0%\..\mime\cli.js" %*
diff --git a/node_modules/.bin/mime.ps1 b/node_modules/.bin/mime.ps1
deleted file mode 100644
index 2222f40bcf2aca56c70178225cfe21cc31e2773f..0000000000000000000000000000000000000000
--- a/node_modules/.bin/mime.ps1
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env pwsh
-$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
-
-$exe=""
-if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
-  # Fix case when both the Windows and Linux builds of Node
-  # are installed in the same directory
-  $exe=".exe"
-}
-$ret=0
-if (Test-Path "$basedir/node$exe") {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "$basedir/node$exe"  "$basedir/../mime/cli.js" $args
-  } else {
-    & "$basedir/node$exe"  "$basedir/../mime/cli.js" $args
-  }
-  $ret=$LASTEXITCODE
-} else {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "node$exe"  "$basedir/../mime/cli.js" $args
-  } else {
-    & "node$exe"  "$basedir/../mime/cli.js" $args
-  }
-  $ret=$LASTEXITCODE
-}
-exit $ret
diff --git a/node_modules/.bin/nodemon b/node_modules/.bin/nodemon
deleted file mode 100644
index c477a189899137f10792f38527c7adbe27d14bca..0000000000000000000000000000000000000000
--- a/node_modules/.bin/nodemon
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
-
-case `uname` in
-    *CYGWIN*|*MINGW*|*MSYS*)
-        if command -v cygpath > /dev/null 2>&1; then
-            basedir=`cygpath -w "$basedir"`
-        fi
-    ;;
-esac
-
-if [ -x "$basedir/node" ]; then
-  exec "$basedir/node"  "$basedir/../nodemon/bin/nodemon.js" "$@"
-else 
-  exec node  "$basedir/../nodemon/bin/nodemon.js" "$@"
-fi
diff --git a/node_modules/.bin/nodemon.cmd b/node_modules/.bin/nodemon.cmd
deleted file mode 100644
index 55acf8a4e2c06865515d061897ebf4a0f302a51c..0000000000000000000000000000000000000000
--- a/node_modules/.bin/nodemon.cmd
+++ /dev/null
@@ -1,17 +0,0 @@
-@ECHO off
-GOTO start
-:find_dp0
-SET dp0=%~dp0
-EXIT /b
-:start
-SETLOCAL
-CALL :find_dp0
-
-IF EXIST "%dp0%\node.exe" (
-  SET "_prog=%dp0%\node.exe"
-) ELSE (
-  SET "_prog=node"
-  SET PATHEXT=%PATHEXT:;.JS;=;%
-)
-
-endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%"  "%dp0%\..\nodemon\bin\nodemon.js" %*
diff --git a/node_modules/.bin/nodemon.ps1 b/node_modules/.bin/nodemon.ps1
deleted file mode 100644
index d4e3f5d40b8a79c87033f11123c404ba3e441499..0000000000000000000000000000000000000000
--- a/node_modules/.bin/nodemon.ps1
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env pwsh
-$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
-
-$exe=""
-if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
-  # Fix case when both the Windows and Linux builds of Node
-  # are installed in the same directory
-  $exe=".exe"
-}
-$ret=0
-if (Test-Path "$basedir/node$exe") {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "$basedir/node$exe"  "$basedir/../nodemon/bin/nodemon.js" $args
-  } else {
-    & "$basedir/node$exe"  "$basedir/../nodemon/bin/nodemon.js" $args
-  }
-  $ret=$LASTEXITCODE
-} else {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "node$exe"  "$basedir/../nodemon/bin/nodemon.js" $args
-  } else {
-    & "node$exe"  "$basedir/../nodemon/bin/nodemon.js" $args
-  }
-  $ret=$LASTEXITCODE
-}
-exit $ret
diff --git a/node_modules/.bin/nodetouch b/node_modules/.bin/nodetouch
deleted file mode 100644
index 3e146b4134b05d0581d57f0907ae876f6e4f1f4d..0000000000000000000000000000000000000000
--- a/node_modules/.bin/nodetouch
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
-
-case `uname` in
-    *CYGWIN*|*MINGW*|*MSYS*)
-        if command -v cygpath > /dev/null 2>&1; then
-            basedir=`cygpath -w "$basedir"`
-        fi
-    ;;
-esac
-
-if [ -x "$basedir/node" ]; then
-  exec "$basedir/node"  "$basedir/../touch/bin/nodetouch.js" "$@"
-else 
-  exec node  "$basedir/../touch/bin/nodetouch.js" "$@"
-fi
diff --git a/node_modules/.bin/nodetouch.cmd b/node_modules/.bin/nodetouch.cmd
deleted file mode 100644
index 8298b91832d2f70a6089e2a1cb57a2c7c14780ee..0000000000000000000000000000000000000000
--- a/node_modules/.bin/nodetouch.cmd
+++ /dev/null
@@ -1,17 +0,0 @@
-@ECHO off
-GOTO start
-:find_dp0
-SET dp0=%~dp0
-EXIT /b
-:start
-SETLOCAL
-CALL :find_dp0
-
-IF EXIST "%dp0%\node.exe" (
-  SET "_prog=%dp0%\node.exe"
-) ELSE (
-  SET "_prog=node"
-  SET PATHEXT=%PATHEXT:;.JS;=;%
-)
-
-endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%"  "%dp0%\..\touch\bin\nodetouch.js" %*
diff --git a/node_modules/.bin/nodetouch.ps1 b/node_modules/.bin/nodetouch.ps1
deleted file mode 100644
index 5f68b4cb3a4dc3a8b31bf5d9da12987fabc9a238..0000000000000000000000000000000000000000
--- a/node_modules/.bin/nodetouch.ps1
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env pwsh
-$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
-
-$exe=""
-if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
-  # Fix case when both the Windows and Linux builds of Node
-  # are installed in the same directory
-  $exe=".exe"
-}
-$ret=0
-if (Test-Path "$basedir/node$exe") {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "$basedir/node$exe"  "$basedir/../touch/bin/nodetouch.js" $args
-  } else {
-    & "$basedir/node$exe"  "$basedir/../touch/bin/nodetouch.js" $args
-  }
-  $ret=$LASTEXITCODE
-} else {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "node$exe"  "$basedir/../touch/bin/nodetouch.js" $args
-  } else {
-    & "node$exe"  "$basedir/../touch/bin/nodetouch.js" $args
-  }
-  $ret=$LASTEXITCODE
-}
-exit $ret
diff --git a/node_modules/.bin/semver b/node_modules/.bin/semver
deleted file mode 100644
index 97c53279f43c10400b9195b128164a5418d77659..0000000000000000000000000000000000000000
--- a/node_modules/.bin/semver
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
-
-case `uname` in
-    *CYGWIN*|*MINGW*|*MSYS*)
-        if command -v cygpath > /dev/null 2>&1; then
-            basedir=`cygpath -w "$basedir"`
-        fi
-    ;;
-esac
-
-if [ -x "$basedir/node" ]; then
-  exec "$basedir/node"  "$basedir/../semver/bin/semver.js" "$@"
-else 
-  exec node  "$basedir/../semver/bin/semver.js" "$@"
-fi
diff --git a/node_modules/.bin/semver.cmd b/node_modules/.bin/semver.cmd
deleted file mode 100644
index 9913fa9d0812ac0bcdccc80d2805c013cf2237b7..0000000000000000000000000000000000000000
--- a/node_modules/.bin/semver.cmd
+++ /dev/null
@@ -1,17 +0,0 @@
-@ECHO off
-GOTO start
-:find_dp0
-SET dp0=%~dp0
-EXIT /b
-:start
-SETLOCAL
-CALL :find_dp0
-
-IF EXIST "%dp0%\node.exe" (
-  SET "_prog=%dp0%\node.exe"
-) ELSE (
-  SET "_prog=node"
-  SET PATHEXT=%PATHEXT:;.JS;=;%
-)
-
-endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%"  "%dp0%\..\semver\bin\semver.js" %*
diff --git a/node_modules/.bin/semver.ps1 b/node_modules/.bin/semver.ps1
deleted file mode 100644
index 314717ad4828ba2866c75d51292fcd0254701070..0000000000000000000000000000000000000000
--- a/node_modules/.bin/semver.ps1
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env pwsh
-$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
-
-$exe=""
-if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
-  # Fix case when both the Windows and Linux builds of Node
-  # are installed in the same directory
-  $exe=".exe"
-}
-$ret=0
-if (Test-Path "$basedir/node$exe") {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "$basedir/node$exe"  "$basedir/../semver/bin/semver.js" $args
-  } else {
-    & "$basedir/node$exe"  "$basedir/../semver/bin/semver.js" $args
-  }
-  $ret=$LASTEXITCODE
-} else {
-  # Support pipeline input
-  if ($MyInvocation.ExpectingInput) {
-    $input | & "node$exe"  "$basedir/../semver/bin/semver.js" $args
-  } else {
-    & "node$exe"  "$basedir/../semver/bin/semver.js" $args
-  }
-  $ret=$LASTEXITCODE
-}
-exit $ret
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
index f5c87d80b3aaae62910c2731f4a15a079530cb25..e611a044a33c31e01f1a5e20acb1d6dbc7386845 100644
--- a/node_modules/.package-lock.json
+++ b/node_modules/.package-lock.json
@@ -4,47 +4,14 @@
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
-    "node_modules/accepts": {
-      "version": "1.3.8",
-      "license": "MIT",
-      "dependencies": {
-        "mime-types": "~2.1.34",
-        "negotiator": "0.6.3"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/ansicolors": {
-      "version": "0.2.1",
-      "license": "MIT"
-    },
-    "node_modules/anymatch": {
-      "version": "3.1.3",
-      "license": "ISC",
-      "dependencies": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/array-flatten": {
-      "version": "1.1.1",
-      "license": "MIT"
-    },
     "node_modules/aws-ssl-profiles": {
       "version": "1.1.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
+      "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",
       "engines": {
         "node": ">= 6.0.0"
       }
     },
-    "node_modules/balanced-match": {
-      "version": "1.0.2",
-      "license": "MIT"
-    },
     "node_modules/bcryptjs": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz",
@@ -53,20 +20,6 @@
         "bcrypt": "bin/bcrypt"
       }
     },
-    "node_modules/binary-extensions": {
-      "version": "2.3.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/bn.js": {
-      "version": "2.0.0",
-      "license": "MIT"
-    },
     "node_modules/body-parser": {
       "version": "1.20.3",
       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
@@ -90,34 +43,18 @@
         "npm": "1.2.8000 || >= 1.4.16"
       }
     },
-    "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/braces": {
-      "version": "3.0.3",
-      "license": "MIT",
-      "dependencies": {
-        "fill-range": "^7.1.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/bytes": {
       "version": "3.1.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
       "engines": {
         "node": ">= 0.8"
       }
     },
     "node_modules/call-bind-apply-helpers": {
       "version": "1.0.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
       "dependencies": {
         "es-errors": "^1.3.0",
         "function-bind": "^1.1.2"
@@ -128,7 +65,8 @@
     },
     "node_modules/call-bound": {
       "version": "1.0.4",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
       "dependencies": {
         "call-bind-apply-helpers": "^1.0.2",
         "get-intrinsic": "^1.3.0"
@@ -140,99 +78,55 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/cardinal": {
-      "version": "0.4.4",
-      "license": "MIT",
-      "dependencies": {
-        "ansicolors": "~0.2.1",
-        "redeyed": "~0.4.0"
-      },
-      "bin": {
-        "cdl": "bin/cdl.js"
-      }
-    },
-    "node_modules/chokidar": {
-      "version": "3.6.0",
-      "license": "MIT",
-      "dependencies": {
-        "anymatch": "~3.1.2",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.2",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.6.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "funding": {
-        "url": "https://paulmillr.com/funding/"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "license": "MIT"
-    },
-    "node_modules/content-disposition": {
-      "version": "0.5.4",
-      "license": "MIT",
-      "dependencies": {
-        "safe-buffer": "5.2.1"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
     "node_modules/content-type": {
       "version": "1.0.5",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
       "engines": {
         "node": ">= 0.6"
       }
     },
     "node_modules/cookie": {
-      "version": "0.7.1",
-      "license": "MIT",
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+      "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
       "engines": {
         "node": ">= 0.6"
       }
     },
     "node_modules/cookie-signature": {
-      "version": "1.0.6",
-      "license": "MIT"
-    },
-    "node_modules/core-util-is": {
-      "version": "1.0.3",
-      "license": "MIT"
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
+      "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA=="
     },
     "node_modules/debug": {
       "version": "2.6.9",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dependencies": {
         "ms": "2.0.0"
       }
     },
     "node_modules/denque": {
       "version": "2.1.0",
-      "license": "Apache-2.0",
+      "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+      "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
       "engines": {
         "node": ">=0.10"
       }
     },
     "node_modules/depd": {
       "version": "2.0.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
       "engines": {
         "node": ">= 0.8"
       }
     },
     "node_modules/destroy": {
       "version": "1.2.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
       "engines": {
         "node": ">= 0.8",
         "npm": "1.2.8000 || >= 1.4.16"
@@ -249,13 +143,10 @@
         "url": "https://dotenvx.com"
       }
     },
-    "node_modules/double-ended-queue": {
-      "version": "2.0.0-0",
-      "license": "MIT"
-    },
     "node_modules/dunder-proto": {
       "version": "1.0.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
       "dependencies": {
         "call-bind-apply-helpers": "^1.0.1",
         "es-errors": "^1.3.0",
@@ -267,32 +158,29 @@
     },
     "node_modules/ee-first": {
       "version": "1.1.1",
-      "license": "MIT"
-    },
-    "node_modules/encodeurl": {
-      "version": "2.0.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
     },
     "node_modules/es-define-property": {
       "version": "1.0.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/es-errors": {
       "version": "1.3.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/es-object-atoms": {
       "version": "1.1.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
       "dependencies": {
         "es-errors": "^1.3.0"
       },
@@ -300,72 +188,6 @@
         "node": ">= 0.4"
       }
     },
-    "node_modules/escape-html": {
-      "version": "1.0.3",
-      "license": "MIT"
-    },
-    "node_modules/esprima": {
-      "version": "1.0.4",
-      "bin": {
-        "esparse": "bin/esparse.js",
-        "esvalidate": "bin/esvalidate.js"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/etag": {
-      "version": "1.8.1",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/express": {
-      "version": "4.21.2",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
-      "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
-      "dependencies": {
-        "accepts": "~1.3.8",
-        "array-flatten": "1.1.1",
-        "body-parser": "1.20.3",
-        "content-disposition": "0.5.4",
-        "content-type": "~1.0.4",
-        "cookie": "0.7.1",
-        "cookie-signature": "1.0.6",
-        "debug": "2.6.9",
-        "depd": "2.0.0",
-        "encodeurl": "~2.0.0",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "finalhandler": "1.3.1",
-        "fresh": "0.5.2",
-        "http-errors": "2.0.0",
-        "merge-descriptors": "1.0.3",
-        "methods": "~1.1.2",
-        "on-finished": "2.4.1",
-        "parseurl": "~1.3.3",
-        "path-to-regexp": "0.1.12",
-        "proxy-addr": "~2.0.7",
-        "qs": "6.13.0",
-        "range-parser": "~1.2.1",
-        "safe-buffer": "5.2.1",
-        "send": "0.19.0",
-        "serve-static": "1.16.2",
-        "setprototypeof": "1.2.0",
-        "statuses": "2.0.1",
-        "type-is": "~1.6.18",
-        "utils-merge": "1.0.1",
-        "vary": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.10.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/express"
-      }
-    },
     "node_modules/express-session": {
       "version": "1.18.1",
       "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.1.tgz",
@@ -384,76 +206,26 @@
         "node": ">= 0.8.0"
       }
     },
-    "node_modules/express-session/node_modules/cookie": {
-      "version": "0.7.2",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
-      "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/express-session/node_modules/cookie-signature": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
-      "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA=="
-    },
-    "node_modules/fill-range": {
-      "version": "7.1.1",
-      "license": "MIT",
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/finalhandler": {
-      "version": "1.3.1",
-      "license": "MIT",
-      "dependencies": {
-        "debug": "2.6.9",
-        "encodeurl": "~2.0.0",
-        "escape-html": "~1.0.3",
-        "on-finished": "2.4.1",
-        "parseurl": "~1.3.3",
-        "statuses": "2.0.1",
-        "unpipe": "~1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/forwarded": {
-      "version": "0.2.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/fresh": {
-      "version": "0.5.2",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
     "node_modules/function-bind": {
       "version": "1.1.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/generate-function": {
       "version": "2.3.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
+      "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
       "dependencies": {
         "is-property": "^1.0.2"
       }
     },
     "node_modules/get-intrinsic": {
       "version": "1.3.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
       "dependencies": {
         "call-bind-apply-helpers": "^1.0.2",
         "es-define-property": "^1.0.1",
@@ -475,7 +247,8 @@
     },
     "node_modules/get-proto": {
       "version": "1.0.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
       "dependencies": {
         "dunder-proto": "^1.0.1",
         "es-object-atoms": "^1.0.0"
@@ -484,19 +257,10 @@
         "node": ">= 0.4"
       }
     },
-    "node_modules/glob-parent": {
-      "version": "5.1.2",
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/gopd": {
       "version": "1.2.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
       "engines": {
         "node": ">= 0.4"
       },
@@ -506,7 +270,8 @@
     },
     "node_modules/has-symbols": {
       "version": "1.1.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
       "engines": {
         "node": ">= 0.4"
       },
@@ -516,7 +281,8 @@
     },
     "node_modules/hasown": {
       "version": "2.0.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
       "dependencies": {
         "function-bind": "^1.1.2"
       },
@@ -526,7 +292,8 @@
     },
     "node_modules/http-errors": {
       "version": "2.0.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
       "dependencies": {
         "depd": "2.0.0",
         "inherits": "2.0.4",
@@ -540,7 +307,8 @@
     },
     "node_modules/iconv-lite": {
       "version": "0.4.24",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
       "dependencies": {
         "safer-buffer": ">= 2.1.2 < 3"
       },
@@ -548,77 +316,33 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/ignore-by-default": {
-      "version": "1.0.1",
-      "license": "ISC"
-    },
     "node_modules/inherits": {
       "version": "2.0.4",
-      "license": "ISC"
-    },
-    "node_modules/ipaddr.js": {
-      "version": "1.9.1",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/is-binary-path": {
-      "version": "2.1.0",
-      "license": "MIT",
-      "dependencies": {
-        "binary-extensions": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-number": {
-      "version": "7.0.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.12.0"
-      }
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "node_modules/is-property": {
       "version": "1.0.2",
-      "license": "MIT"
-    },
-    "node_modules/isarray": {
-      "version": "0.0.1",
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+      "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
     },
     "node_modules/long": {
       "version": "5.3.1",
-      "license": "Apache-2.0"
+      "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz",
+      "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng=="
     },
     "node_modules/lru-cache": {
       "version": "7.18.3",
-      "license": "ISC",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/lru.min": {
       "version": "1.1.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz",
+      "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==",
       "engines": {
         "bun": ">=1.0.0",
         "deno": ">=1.30.0",
@@ -631,52 +355,32 @@
     },
     "node_modules/math-intrinsics": {
       "version": "1.1.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/media-typer": {
       "version": "0.3.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/merge-descriptors": {
-      "version": "1.0.3",
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/methods": {
-      "version": "1.1.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
       "engines": {
         "node": ">= 0.6"
       }
     },
-    "node_modules/mime": {
-      "version": "1.6.0",
-      "license": "MIT",
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/mime-db": {
       "version": "1.52.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
       "engines": {
         "node": ">= 0.6"
       }
     },
     "node_modules/mime-types": {
       "version": "2.1.35",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
       "dependencies": {
         "mime-db": "1.52.0"
       },
@@ -684,19 +388,10 @@
         "node": ">= 0.6"
       }
     },
-    "node_modules/minimatch": {
-      "version": "3.1.2",
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
     "node_modules/ms": {
       "version": "2.0.0",
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
     },
     "node_modules/mysql2": {
       "version": "3.13.0",
@@ -717,45 +412,10 @@
         "node": ">= 8.0"
       }
     },
-    "node_modules/mysql2-promise": {
-      "version": "0.1.4",
-      "license": "MIT",
-      "dependencies": {
-        "mysql2": "^0.15.7",
-        "q": "^1.3.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/mysql2-promise/node_modules/lru-cache": {
-      "version": "2.5.0",
-      "license": "MIT"
-    },
-    "node_modules/mysql2-promise/node_modules/mysql2": {
-      "version": "0.15.8",
-      "license": "MIT",
-      "dependencies": {
-        "bn.js": "2.0.0",
-        "cardinal": "0.4.4",
-        "double-ended-queue": "2.0.0-0",
-        "named-placeholders": "0.1.3",
-        "readable-stream": "1.0.33"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/mysql2-promise/node_modules/named-placeholders": {
-      "version": "0.1.3",
-      "license": "MIT",
-      "dependencies": {
-        "lru-cache": "2.5.0"
-      }
-    },
     "node_modules/mysql2/node_modules/iconv-lite": {
       "version": "0.6.3",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
       "dependencies": {
         "safer-buffer": ">= 2.1.2 < 3.0.0"
       },
@@ -765,7 +425,8 @@
     },
     "node_modules/named-placeholders": {
       "version": "1.1.3",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
+      "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
       "dependencies": {
         "lru-cache": "^7.14.1"
       },
@@ -773,86 +434,10 @@
         "node": ">=12.0.0"
       }
     },
-    "node_modules/negotiator": {
-      "version": "0.6.3",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/nodemon": {
-      "version": "3.1.9",
-      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz",
-      "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==",
-      "dependencies": {
-        "chokidar": "^3.5.2",
-        "debug": "^4",
-        "ignore-by-default": "^1.0.1",
-        "minimatch": "^3.1.2",
-        "pstree.remy": "^1.1.8",
-        "semver": "^7.5.3",
-        "simple-update-notifier": "^2.0.0",
-        "supports-color": "^5.5.0",
-        "touch": "^3.1.0",
-        "undefsafe": "^2.0.5"
-      },
-      "bin": {
-        "nodemon": "bin/nodemon.js"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/nodemon"
-      }
-    },
-    "node_modules/nodemon/node_modules/debug": {
-      "version": "4.4.0",
-      "license": "MIT",
-      "dependencies": {
-        "ms": "^2.1.3"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/nodemon/node_modules/has-flag": {
-      "version": "3.0.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/nodemon/node_modules/ms": {
-      "version": "2.1.3",
-      "license": "MIT"
-    },
-    "node_modules/nodemon/node_modules/supports-color": {
-      "version": "5.5.0",
-      "license": "MIT",
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/normalize-path": {
-      "version": "3.0.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/object-inspect": {
       "version": "1.13.4",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
       "engines": {
         "node": ">= 0.4"
       },
@@ -862,7 +447,8 @@
     },
     "node_modules/on-finished": {
       "version": "2.4.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
       "dependencies": {
         "ee-first": "1.1.1"
       },
@@ -880,51 +466,16 @@
     },
     "node_modules/parseurl": {
       "version": "1.3.3",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
       "engines": {
         "node": ">= 0.8"
       }
     },
-    "node_modules/path-to-regexp": {
-      "version": "0.1.12",
-      "license": "MIT"
-    },
-    "node_modules/picomatch": {
-      "version": "2.3.1",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/proxy-addr": {
-      "version": "2.0.7",
-      "license": "MIT",
-      "dependencies": {
-        "forwarded": "0.2.0",
-        "ipaddr.js": "1.9.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/pstree.remy": {
-      "version": "1.1.8",
-      "license": "MIT"
-    },
-    "node_modules/q": {
-      "version": "1.5.1",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.6.0",
-        "teleport": ">=0.2.0"
-      }
-    },
     "node_modules/qs": {
       "version": "6.13.0",
-      "license": "BSD-3-Clause",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+      "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
       "dependencies": {
         "side-channel": "^1.0.6"
       },
@@ -943,16 +494,10 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/range-parser": {
-      "version": "1.2.1",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
     "node_modules/raw-body": {
       "version": "2.5.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+      "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
       "dependencies": {
         "bytes": "3.1.2",
         "http-errors": "2.0.0",
@@ -963,35 +508,10 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/readable-stream": {
-      "version": "1.0.33",
-      "license": "MIT",
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.1",
-        "isarray": "0.0.1",
-        "string_decoder": "~0.10.x"
-      }
-    },
-    "node_modules/readdirp": {
-      "version": "3.6.0",
-      "license": "MIT",
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/redeyed": {
-      "version": "0.4.4",
-      "license": "MIT",
-      "dependencies": {
-        "esprima": "~1.0.4"
-      }
-    },
     "node_modules/safe-buffer": {
       "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
       "funding": [
         {
           "type": "github",
@@ -1005,79 +525,27 @@
           "type": "consulting",
           "url": "https://feross.org/support"
         }
-      ],
-      "license": "MIT"
+      ]
     },
     "node_modules/safer-buffer": {
       "version": "2.1.2",
-      "license": "MIT"
-    },
-    "node_modules/semver": {
-      "version": "7.7.1",
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/send": {
-      "version": "0.19.0",
-      "license": "MIT",
-      "dependencies": {
-        "debug": "2.6.9",
-        "depd": "2.0.0",
-        "destroy": "1.2.0",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "fresh": "0.5.2",
-        "http-errors": "2.0.0",
-        "mime": "1.6.0",
-        "ms": "2.1.3",
-        "on-finished": "2.4.1",
-        "range-parser": "~1.2.1",
-        "statuses": "2.0.1"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/send/node_modules/encodeurl": {
-      "version": "1.0.2",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/send/node_modules/ms": {
-      "version": "2.1.3",
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "node_modules/seq-queue": {
-      "version": "0.0.5"
-    },
-    "node_modules/serve-static": {
-      "version": "1.16.2",
-      "license": "MIT",
-      "dependencies": {
-        "encodeurl": "~2.0.0",
-        "escape-html": "~1.0.3",
-        "parseurl": "~1.3.3",
-        "send": "0.19.0"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
+      "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
     },
     "node_modules/setprototypeof": {
       "version": "1.2.0",
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
     },
     "node_modules/side-channel": {
       "version": "1.1.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
       "dependencies": {
         "es-errors": "^1.3.0",
         "object-inspect": "^1.13.3",
@@ -1094,7 +562,8 @@
     },
     "node_modules/side-channel-list": {
       "version": "1.0.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
       "dependencies": {
         "es-errors": "^1.3.0",
         "object-inspect": "^1.13.3"
@@ -1108,7 +577,8 @@
     },
     "node_modules/side-channel-map": {
       "version": "1.0.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
       "dependencies": {
         "call-bound": "^1.0.2",
         "es-errors": "^1.3.0",
@@ -1124,7 +594,8 @@
     },
     "node_modules/side-channel-weakmap": {
       "version": "1.0.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
       "dependencies": {
         "call-bound": "^1.0.2",
         "es-errors": "^1.3.0",
@@ -1139,61 +610,34 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/simple-update-notifier": {
-      "version": "2.0.0",
-      "license": "MIT",
-      "dependencies": {
-        "semver": "^7.5.3"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/sqlstring": {
       "version": "2.3.3",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
+      "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
       "engines": {
         "node": ">= 0.6"
       }
     },
     "node_modules/statuses": {
       "version": "2.0.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
       "engines": {
         "node": ">= 0.8"
       }
     },
-    "node_modules/string_decoder": {
-      "version": "0.10.31",
-      "license": "MIT"
-    },
-    "node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
     "node_modules/toidentifier": {
       "version": "1.0.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
       "engines": {
         "node": ">=0.6"
       }
     },
-    "node_modules/touch": {
-      "version": "3.1.1",
-      "license": "ISC",
-      "bin": {
-        "nodetouch": "bin/nodetouch.js"
-      }
-    },
     "node_modules/type-is": {
       "version": "1.6.18",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
       "dependencies": {
         "media-typer": "0.3.0",
         "mime-types": "~2.1.24"
@@ -1213,27 +657,10 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/undefsafe": {
-      "version": "2.0.5",
-      "license": "MIT"
-    },
     "node_modules/unpipe": {
       "version": "1.0.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/utils-merge": {
-      "version": "1.0.1",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/vary": {
-      "version": "1.1.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
       "engines": {
         "node": ">= 0.8"
       }
diff --git a/node_modules/accepts/HISTORY.md b/node_modules/accepts/HISTORY.md
deleted file mode 100644
index cb5990c7c3620f4936a3ac42b3bf335c95eef7e8..0000000000000000000000000000000000000000
--- a/node_modules/accepts/HISTORY.md
+++ /dev/null
@@ -1,243 +0,0 @@
-1.3.8 / 2022-02-02
-==================
-
-  * deps: mime-types@~2.1.34
-    - deps: mime-db@~1.51.0
-  * deps: negotiator@0.6.3
-
-1.3.7 / 2019-04-29
-==================
-
-  * deps: negotiator@0.6.2
-    - Fix sorting charset, encoding, and language with extra parameters
-
-1.3.6 / 2019-04-28
-==================
-
-  * deps: mime-types@~2.1.24
-    - deps: mime-db@~1.40.0
-
-1.3.5 / 2018-02-28
-==================
-
-  * deps: mime-types@~2.1.18
-    - deps: mime-db@~1.33.0
-
-1.3.4 / 2017-08-22
-==================
-
-  * deps: mime-types@~2.1.16
-    - deps: mime-db@~1.29.0
-
-1.3.3 / 2016-05-02
-==================
-
-  * deps: mime-types@~2.1.11
-    - deps: mime-db@~1.23.0
-  * deps: negotiator@0.6.1
-    - perf: improve `Accept` parsing speed
-    - perf: improve `Accept-Charset` parsing speed
-    - perf: improve `Accept-Encoding` parsing speed
-    - perf: improve `Accept-Language` parsing speed
-
-1.3.2 / 2016-03-08
-==================
-
-  * deps: mime-types@~2.1.10
-    - Fix extension of `application/dash+xml`
-    - Update primary extension for `audio/mp4`
-    - deps: mime-db@~1.22.0
-
-1.3.1 / 2016-01-19
-==================
-
-  * deps: mime-types@~2.1.9
-    - deps: mime-db@~1.21.0
-
-1.3.0 / 2015-09-29
-==================
-
-  * deps: mime-types@~2.1.7
-    - deps: mime-db@~1.19.0
-  * deps: negotiator@0.6.0
-    - Fix including type extensions in parameters in `Accept` parsing
-    - Fix parsing `Accept` parameters with quoted equals
-    - Fix parsing `Accept` parameters with quoted semicolons
-    - Lazy-load modules from main entry point
-    - perf: delay type concatenation until needed
-    - perf: enable strict mode
-    - perf: hoist regular expressions
-    - perf: remove closures getting spec properties
-    - perf: remove a closure from media type parsing
-    - perf: remove property delete from media type parsing
-
-1.2.13 / 2015-09-06
-===================
-
-  * deps: mime-types@~2.1.6
-    - deps: mime-db@~1.18.0
-
-1.2.12 / 2015-07-30
-===================
-
-  * deps: mime-types@~2.1.4
-    - deps: mime-db@~1.16.0
-
-1.2.11 / 2015-07-16
-===================
-
-  * deps: mime-types@~2.1.3
-    - deps: mime-db@~1.15.0
-
-1.2.10 / 2015-07-01
-===================
-
-  * deps: mime-types@~2.1.2
-    - deps: mime-db@~1.14.0
-
-1.2.9 / 2015-06-08
-==================
-
-  * deps: mime-types@~2.1.1
-    - perf: fix deopt during mapping
-
-1.2.8 / 2015-06-07
-==================
-
-  * deps: mime-types@~2.1.0
-    - deps: mime-db@~1.13.0
-  * perf: avoid argument reassignment & argument slice
-  * perf: avoid negotiator recursive construction
-  * perf: enable strict mode
-  * perf: remove unnecessary bitwise operator
-
-1.2.7 / 2015-05-10
-==================
-
-  * deps: negotiator@0.5.3
-    - Fix media type parameter matching to be case-insensitive
-
-1.2.6 / 2015-05-07
-==================
-
-  * deps: mime-types@~2.0.11
-    - deps: mime-db@~1.9.1
-  * deps: negotiator@0.5.2
-    - Fix comparing media types with quoted values
-    - Fix splitting media types with quoted commas
-
-1.2.5 / 2015-03-13
-==================
-
-  * deps: mime-types@~2.0.10
-    - deps: mime-db@~1.8.0
-
-1.2.4 / 2015-02-14
-==================
-
-  * Support Node.js 0.6
-  * deps: mime-types@~2.0.9
-    - deps: mime-db@~1.7.0
-  * deps: negotiator@0.5.1
-    - Fix preference sorting to be stable for long acceptable lists
-
-1.2.3 / 2015-01-31
-==================
-
-  * deps: mime-types@~2.0.8
-    - deps: mime-db@~1.6.0
-
-1.2.2 / 2014-12-30
-==================
-
-  * deps: mime-types@~2.0.7
-    - deps: mime-db@~1.5.0
-
-1.2.1 / 2014-12-30
-==================
-
-  * deps: mime-types@~2.0.5
-    - deps: mime-db@~1.3.1
-
-1.2.0 / 2014-12-19
-==================
-
-  * deps: negotiator@0.5.0
-    - Fix list return order when large accepted list
-    - Fix missing identity encoding when q=0 exists
-    - Remove dynamic building of Negotiator class
-
-1.1.4 / 2014-12-10
-==================
-
-  * deps: mime-types@~2.0.4
-    - deps: mime-db@~1.3.0
-
-1.1.3 / 2014-11-09
-==================
-
-  * deps: mime-types@~2.0.3
-    - deps: mime-db@~1.2.0
-
-1.1.2 / 2014-10-14
-==================
-
-  * deps: negotiator@0.4.9
-    - Fix error when media type has invalid parameter
-
-1.1.1 / 2014-09-28
-==================
-
-  * deps: mime-types@~2.0.2
-    - deps: mime-db@~1.1.0
-  * deps: negotiator@0.4.8
-    - Fix all negotiations to be case-insensitive
-    - Stable sort preferences of same quality according to client order
-
-1.1.0 / 2014-09-02
-==================
-
-  * update `mime-types`
-
-1.0.7 / 2014-07-04
-==================
-
-  * Fix wrong type returned from `type` when match after unknown extension
-
-1.0.6 / 2014-06-24
-==================
-
-  * deps: negotiator@0.4.7
-
-1.0.5 / 2014-06-20
-==================
-
- * fix crash when unknown extension given
-
-1.0.4 / 2014-06-19
-==================
-
-  * use `mime-types`
-
-1.0.3 / 2014-06-11
-==================
-
-  * deps: negotiator@0.4.6
-    - Order by specificity when quality is the same
-
-1.0.2 / 2014-05-29
-==================
-
-  * Fix interpretation when header not in request
-  * deps: pin negotiator@0.4.5
-
-1.0.1 / 2014-01-18
-==================
-
-  * Identity encoding isn't always acceptable
-  * deps: negotiator@~0.4.0
-
-1.0.0 / 2013-12-27
-==================
-
-  * Genesis
diff --git a/node_modules/accepts/LICENSE b/node_modules/accepts/LICENSE
deleted file mode 100644
index 06166077be4d1f620d89b9eb33c76d89e75857da..0000000000000000000000000000000000000000
--- a/node_modules/accepts/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
-Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.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/accepts/README.md b/node_modules/accepts/README.md
deleted file mode 100644
index 82680c530c3886540f630f643990e2ec707319d1..0000000000000000000000000000000000000000
--- a/node_modules/accepts/README.md
+++ /dev/null
@@ -1,140 +0,0 @@
-# accepts
-
-[![NPM Version][npm-version-image]][npm-url]
-[![NPM Downloads][npm-downloads-image]][npm-url]
-[![Node.js Version][node-version-image]][node-version-url]
-[![Build Status][github-actions-ci-image]][github-actions-ci-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator).
-Extracted from [koa](https://www.npmjs.com/package/koa) for general use.
-
-In addition to negotiator, it allows:
-
-- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])`
-  as well as `('text/html', 'application/json')`.
-- Allows type shorthands such as `json`.
-- Returns `false` when no types match
-- Treats non-existent headers as `*`
-
-## Installation
-
-This is a [Node.js](https://nodejs.org/en/) module available through the
-[npm registry](https://www.npmjs.com/). Installation is done using the
-[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
-
-```sh
-$ npm install accepts
-```
-
-## API
-
-```js
-var accepts = require('accepts')
-```
-
-### accepts(req)
-
-Create a new `Accepts` object for the given `req`.
-
-#### .charset(charsets)
-
-Return the first accepted charset. If nothing in `charsets` is accepted,
-then `false` is returned.
-
-#### .charsets()
-
-Return the charsets that the request accepts, in the order of the client's
-preference (most preferred first).
-
-#### .encoding(encodings)
-
-Return the first accepted encoding. If nothing in `encodings` is accepted,
-then `false` is returned.
-
-#### .encodings()
-
-Return the encodings that the request accepts, in the order of the client's
-preference (most preferred first).
-
-#### .language(languages)
-
-Return the first accepted language. If nothing in `languages` is accepted,
-then `false` is returned.
-
-#### .languages()
-
-Return the languages that the request accepts, in the order of the client's
-preference (most preferred first).
-
-#### .type(types)
-
-Return the first accepted type (and it is returned as the same text as what
-appears in the `types` array). If nothing in `types` is accepted, then `false`
-is returned.
-
-The `types` array can contain full MIME types or file extensions. Any value
-that is not a full MIME types is passed to `require('mime-types').lookup`.
-
-#### .types()
-
-Return the types that the request accepts, in the order of the client's
-preference (most preferred first).
-
-## Examples
-
-### Simple type negotiation
-
-This simple example shows how to use `accepts` to return a different typed
-respond body based on what the client wants to accept. The server lists it's
-preferences in order and will get back the best match between the client and
-server.
-
-```js
-var accepts = require('accepts')
-var http = require('http')
-
-function app (req, res) {
-  var accept = accepts(req)
-
-  // the order of this list is significant; should be server preferred order
-  switch (accept.type(['json', 'html'])) {
-    case 'json':
-      res.setHeader('Content-Type', 'application/json')
-      res.write('{"hello":"world!"}')
-      break
-    case 'html':
-      res.setHeader('Content-Type', 'text/html')
-      res.write('<b>hello, world!</b>')
-      break
-    default:
-      // the fallback is text/plain, so no need to specify it above
-      res.setHeader('Content-Type', 'text/plain')
-      res.write('hello, world!')
-      break
-  }
-
-  res.end()
-}
-
-http.createServer(app).listen(3000)
-```
-
-You can test this out with the cURL program:
-```sh
-curl -I -H'Accept: text/html' http://localhost:3000/
-```
-
-## License
-
-[MIT](LICENSE)
-
-[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/accepts/master
-[coveralls-url]: https://coveralls.io/r/jshttp/accepts?branch=master
-[github-actions-ci-image]: https://badgen.net/github/checks/jshttp/accepts/master?label=ci
-[github-actions-ci-url]: https://github.com/jshttp/accepts/actions/workflows/ci.yml
-[node-version-image]: https://badgen.net/npm/node/accepts
-[node-version-url]: https://nodejs.org/en/download
-[npm-downloads-image]: https://badgen.net/npm/dm/accepts
-[npm-url]: https://npmjs.org/package/accepts
-[npm-version-image]: https://badgen.net/npm/v/accepts
diff --git a/node_modules/accepts/index.js b/node_modules/accepts/index.js
deleted file mode 100644
index e9b2f63fb16f8ecdeb16c8eced302612794ccf65..0000000000000000000000000000000000000000
--- a/node_modules/accepts/index.js
+++ /dev/null
@@ -1,238 +0,0 @@
-/*!
- * accepts
- * Copyright(c) 2014 Jonathan Ong
- * Copyright(c) 2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module dependencies.
- * @private
- */
-
-var Negotiator = require('negotiator')
-var mime = require('mime-types')
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = Accepts
-
-/**
- * Create a new Accepts object for the given req.
- *
- * @param {object} req
- * @public
- */
-
-function Accepts (req) {
-  if (!(this instanceof Accepts)) {
-    return new Accepts(req)
-  }
-
-  this.headers = req.headers
-  this.negotiator = new Negotiator(req)
-}
-
-/**
- * Check if the given `type(s)` is acceptable, returning
- * the best match when true, otherwise `undefined`, in which
- * case you should respond with 406 "Not Acceptable".
- *
- * The `type` value may be a single mime type string
- * such as "application/json", the extension name
- * such as "json" or an array `["json", "html", "text/plain"]`. When a list
- * or array is given the _best_ match, if any is returned.
- *
- * Examples:
- *
- *     // Accept: text/html
- *     this.types('html');
- *     // => "html"
- *
- *     // Accept: text/*, application/json
- *     this.types('html');
- *     // => "html"
- *     this.types('text/html');
- *     // => "text/html"
- *     this.types('json', 'text');
- *     // => "json"
- *     this.types('application/json');
- *     // => "application/json"
- *
- *     // Accept: text/*, application/json
- *     this.types('image/png');
- *     this.types('png');
- *     // => undefined
- *
- *     // Accept: text/*;q=.5, application/json
- *     this.types(['html', 'json']);
- *     this.types('html', 'json');
- *     // => "json"
- *
- * @param {String|Array} types...
- * @return {String|Array|Boolean}
- * @public
- */
-
-Accepts.prototype.type =
-Accepts.prototype.types = function (types_) {
-  var types = types_
-
-  // support flattened arguments
-  if (types && !Array.isArray(types)) {
-    types = new Array(arguments.length)
-    for (var i = 0; i < types.length; i++) {
-      types[i] = arguments[i]
-    }
-  }
-
-  // no types, return all requested types
-  if (!types || types.length === 0) {
-    return this.negotiator.mediaTypes()
-  }
-
-  // no accept header, return first given type
-  if (!this.headers.accept) {
-    return types[0]
-  }
-
-  var mimes = types.map(extToMime)
-  var accepts = this.negotiator.mediaTypes(mimes.filter(validMime))
-  var first = accepts[0]
-
-  return first
-    ? types[mimes.indexOf(first)]
-    : false
-}
-
-/**
- * Return accepted encodings or best fit based on `encodings`.
- *
- * Given `Accept-Encoding: gzip, deflate`
- * an array sorted by quality is returned:
- *
- *     ['gzip', 'deflate']
- *
- * @param {String|Array} encodings...
- * @return {String|Array}
- * @public
- */
-
-Accepts.prototype.encoding =
-Accepts.prototype.encodings = function (encodings_) {
-  var encodings = encodings_
-
-  // support flattened arguments
-  if (encodings && !Array.isArray(encodings)) {
-    encodings = new Array(arguments.length)
-    for (var i = 0; i < encodings.length; i++) {
-      encodings[i] = arguments[i]
-    }
-  }
-
-  // no encodings, return all requested encodings
-  if (!encodings || encodings.length === 0) {
-    return this.negotiator.encodings()
-  }
-
-  return this.negotiator.encodings(encodings)[0] || false
-}
-
-/**
- * Return accepted charsets or best fit based on `charsets`.
- *
- * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5`
- * an array sorted by quality is returned:
- *
- *     ['utf-8', 'utf-7', 'iso-8859-1']
- *
- * @param {String|Array} charsets...
- * @return {String|Array}
- * @public
- */
-
-Accepts.prototype.charset =
-Accepts.prototype.charsets = function (charsets_) {
-  var charsets = charsets_
-
-  // support flattened arguments
-  if (charsets && !Array.isArray(charsets)) {
-    charsets = new Array(arguments.length)
-    for (var i = 0; i < charsets.length; i++) {
-      charsets[i] = arguments[i]
-    }
-  }
-
-  // no charsets, return all requested charsets
-  if (!charsets || charsets.length === 0) {
-    return this.negotiator.charsets()
-  }
-
-  return this.negotiator.charsets(charsets)[0] || false
-}
-
-/**
- * Return accepted languages or best fit based on `langs`.
- *
- * Given `Accept-Language: en;q=0.8, es, pt`
- * an array sorted by quality is returned:
- *
- *     ['es', 'pt', 'en']
- *
- * @param {String|Array} langs...
- * @return {Array|String}
- * @public
- */
-
-Accepts.prototype.lang =
-Accepts.prototype.langs =
-Accepts.prototype.language =
-Accepts.prototype.languages = function (languages_) {
-  var languages = languages_
-
-  // support flattened arguments
-  if (languages && !Array.isArray(languages)) {
-    languages = new Array(arguments.length)
-    for (var i = 0; i < languages.length; i++) {
-      languages[i] = arguments[i]
-    }
-  }
-
-  // no languages, return all requested languages
-  if (!languages || languages.length === 0) {
-    return this.negotiator.languages()
-  }
-
-  return this.negotiator.languages(languages)[0] || false
-}
-
-/**
- * Convert extnames to mime.
- *
- * @param {String} type
- * @return {String}
- * @private
- */
-
-function extToMime (type) {
-  return type.indexOf('/') === -1
-    ? mime.lookup(type)
-    : type
-}
-
-/**
- * Check if mime is valid.
- *
- * @param {String} type
- * @return {String}
- * @private
- */
-
-function validMime (type) {
-  return typeof type === 'string'
-}
diff --git a/node_modules/accepts/package.json b/node_modules/accepts/package.json
deleted file mode 100644
index 0f2d15da92b29d328f4da484f494c5442c711b4d..0000000000000000000000000000000000000000
--- a/node_modules/accepts/package.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "name": "accepts",
-  "description": "Higher-level content negotiation",
-  "version": "1.3.8",
-  "contributors": [
-    "Douglas Christopher Wilson <doug@somethingdoug.com>",
-    "Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"
-  ],
-  "license": "MIT",
-  "repository": "jshttp/accepts",
-  "dependencies": {
-    "mime-types": "~2.1.34",
-    "negotiator": "0.6.3"
-  },
-  "devDependencies": {
-    "deep-equal": "1.0.1",
-    "eslint": "7.32.0",
-    "eslint-config-standard": "14.1.1",
-    "eslint-plugin-import": "2.25.4",
-    "eslint-plugin-markdown": "2.2.1",
-    "eslint-plugin-node": "11.1.0",
-    "eslint-plugin-promise": "4.3.1",
-    "eslint-plugin-standard": "4.1.0",
-    "mocha": "9.2.0",
-    "nyc": "15.1.0"
-  },
-  "files": [
-    "LICENSE",
-    "HISTORY.md",
-    "index.js"
-  ],
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "scripts": {
-    "lint": "eslint .",
-    "test": "mocha --reporter spec --check-leaks --bail test/",
-    "test-ci": "nyc --reporter=lcov --reporter=text npm test",
-    "test-cov": "nyc --reporter=html --reporter=text npm test"
-  },
-  "keywords": [
-    "content",
-    "negotiation",
-    "accept",
-    "accepts"
-  ]
-}
diff --git a/node_modules/ansicolors/.npmignore b/node_modules/ansicolors/.npmignore
deleted file mode 100644
index a72b52ebe897796e4a289cf95ff6270e04637aad..0000000000000000000000000000000000000000
--- a/node_modules/ansicolors/.npmignore
+++ /dev/null
@@ -1,15 +0,0 @@
-lib-cov
-*.seed
-*.log
-*.csv
-*.dat
-*.out
-*.pid
-*.gz
-
-pids
-logs
-results
-
-npm-debug.log
-node_modules
diff --git a/node_modules/ansicolors/.travis.yml b/node_modules/ansicolors/.travis.yml
deleted file mode 100644
index 895dbd36234210374d68a0f020b2d6e7abf736fa..0000000000000000000000000000000000000000
--- a/node_modules/ansicolors/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
-  - 0.6
-  - 0.8
diff --git a/node_modules/ansicolors/LICENSE b/node_modules/ansicolors/LICENSE
deleted file mode 100644
index 41702c5043478f994b93a4eb5edf5ec3db9ec1fd..0000000000000000000000000000000000000000
--- a/node_modules/ansicolors/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-Copyright 2013 Thorsten Lorenz. 
-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/ansicolors/README.md b/node_modules/ansicolors/README.md
deleted file mode 100644
index 30b6a52e6b38a489e481b8eb620462e0aca31edb..0000000000000000000000000000000000000000
--- a/node_modules/ansicolors/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# ansicolors [![build status](https://secure.travis-ci.org/thlorenz/ansicolors.png)](http://next.travis-ci.org/thlorenz/ansicolors)
-
-Functions that surround a string with ansicolor codes so it prints in color.
-
-## Installation
-
-    npm install ansicolors
-
-## Usage
-
-```js
-var colors = require('ansicolors');
-
-// foreground colors
-var redHerring = colors.red('herring');
-var blueMoon = colors.blue('moon');
-var brighBlueMoon = colors.brightBlue('moon');
-
-console.log(redHerring);      // this will print 'herring' in red
-console.log(blueMoon);        // this 'moon' in blue
-console.log(brightBlueMoon);  // I think you got the idea
-
-// background colors
-console.log(colors.bgYellow('printed on yellow background'));
-console.log(colors.bgBrightBlue('printed on bright blue background'));
-
-// mixing background and foreground colors
-// below two lines have same result (order in which bg and fg are combined doesn't matter)
-console.log(colors.bgYellow(colors.blue('printed on yellow background in blue')));
-console.log(colors.blue(colors.bgYellow('printed on yellow background in blue')));
-```
-
-## Tests
-
-Look at the [tests](https://github.com/thlorenz/ansicolors/blob/master/test/ansicolors.js) to see more examples and/or run them via: 
-
-    npm explore ansicolors && npm test
-
-## Alternatives
-
-**ansicolors** tries to meet simple use cases with a very simple API. However, if you need a more powerful ansi formatting tool, 
-I'd suggest to look at the [features](https://github.com/TooTallNate/ansi.js#features) of the [ansi module](https://github.com/TooTallNate/ansi.js).
diff --git a/node_modules/ansicolors/ansicolors.js b/node_modules/ansicolors/ansicolors.js
deleted file mode 100644
index b0e18f621a678ec0d0c0a5761aa1435228c9a9de..0000000000000000000000000000000000000000
--- a/node_modules/ansicolors/ansicolors.js
+++ /dev/null
@@ -1,55 +0,0 @@
-// ColorCodes explained: http://www.termsys.demon.co.uk/vtansi.htm
-'use strict';
-
-var colorNums = {
-      white         :  37
-    , black         :  30
-    , blue          :  34
-    , cyan          :  36
-    , green         :  32
-    , magenta       :  35
-    , red           :  31
-    , yellow        :  33
-    , brightBlack   :  90
-    , brightRed     :  91
-    , brightGreen   :  92
-    , brightYellow  :  93
-    , brightBlue    :  94
-    , brightMagenta :  95
-    , brightCyan    :  96
-    , brightWhite   :  97
-    }
-  , backgroundColorNums = {
-      bgBlack         :  40
-    , bgRed           :  41
-    , bgGreen         :  42
-    , bgYellow        :  43
-    , bgBlue          :  44
-    , bgMagenta       :  45
-    , bgCyan          :  46
-    , bgWhite         :  47
-    , bgBrightBlack   :  100
-    , bgBrightRed     :  101
-    , bgBrightGreen   :  102
-    , bgBrightYellow  :  103
-    , bgBrightBlue    :  104
-    , bgBrightMagenta :  105
-    , bgBrightCyan    :  106
-    , bgBrightWhite   :  107
-    } 
-  , colors = {};
-
-
-Object.keys(colorNums).forEach(function (k) {
-  colors[k] = function (s) { 
-    return '\u001b[' + colorNums[k] + 'm' + s + '\u001b[39m';
-  };
-});
-
-Object.keys(backgroundColorNums).forEach(function (k) {
-  colors[k] = function (s) { 
-    return '\u001b[' + backgroundColorNums[k] + 'm' + s + '\u001b[49m';
-  };
-});
-
-module.exports = colors;
diff --git a/node_modules/ansicolors/package.json b/node_modules/ansicolors/package.json
deleted file mode 100644
index b8bf12e5b41d08a1191746239211a543479b6269..0000000000000000000000000000000000000000
--- a/node_modules/ansicolors/package.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "name": "ansicolors",
-  "version": "0.2.1",
-  "description": "Functions that surround a string with ansicolor codes so it prints in color.",
-  "main": "ansicolors.js",
-  "scripts": {
-    "test": "node test/*.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/thlorenz/ansicolors.git"
-  },
-  "keywords": [
-    "ansi",
-    "colors",
-    "highlight",
-    "string"
-  ],
-  "author": "Thorsten Lorenz <thlorenz@gmx.de> (thlorenz.com)",
-  "license": "MIT",
-  "readmeFilename": "README.md",
-  "gitHead": "858847ca28e8b360d9b70eee0592700fa2ab087d"
-}
diff --git a/node_modules/ansicolors/test/ansicolors.js b/node_modules/ansicolors/test/ansicolors.js
deleted file mode 100644
index 46aec3e28065507bea09859d24129e8d2139d59d..0000000000000000000000000000000000000000
--- a/node_modules/ansicolors/test/ansicolors.js
+++ /dev/null
@@ -1,55 +0,0 @@
-'use strict';
-
-var assert = require('assert')
-  , colors = require('..');
-
-console.log('Foreground colors ..');
-
-assert.equal(colors.white('printed in white'), '\u001b[37mprinted in white\u001b[39m');
-
-assert.equal(colors.black('printed in black'), '\u001b[30mprinted in black\u001b[39m');
-assert.equal(colors.brightBlack('printed in bright black'), '\u001b[90mprinted in bright black\u001b[39m');
-
-assert.equal(colors.green('printed in green'), '\u001b[32mprinted in green\u001b[39m');
-assert.equal(colors.brightGreen('printed in bright green'), '\u001b[92mprinted in bright green\u001b[39m');
-
-assert.equal(colors.red('printed in red'), '\u001b[31mprinted in red\u001b[39m');
-assert.equal(colors.brightRed('printed in bright red'), '\u001b[91mprinted in bright red\u001b[39m');
-
-console.log('OK');
-
-console.log('Background colors ..');
-
-assert.equal(
-    colors.bgBlack('printed with black background')
-  , '\u001b[40mprinted with black background\u001b[49m'
-);
-
-assert.equal(
-    colors.bgYellow('printed with yellow background')
-  , '\u001b[43mprinted with yellow background\u001b[49m'
-);
-assert.equal(
-    colors.bgBrightYellow('printed with bright yellow background')
-  , '\u001b[103mprinted with bright yellow background\u001b[49m'
-);
-
-assert.equal(
-    colors.bgWhite('printed with white background')
-  , '\u001b[47mprinted with white background\u001b[49m'
-);
-
-console.log('OK');
-
-console.log('Mixing background and foreground colors ..');
-
-assert.equal(
-    colors.blue(colors.bgYellow('printed in blue with yellow background'))
-  , '\u001b[34m\u001b[43mprinted in blue with yellow background\u001b[49m\u001b[39m'
-);
-assert.equal(
-    colors.bgYellow(colors.blue('printed in blue with yellow background again'))
-  , '\u001b[43m\u001b[34mprinted in blue with yellow background again\u001b[39m\u001b[49m'
-);
-
-console.log('OK');
diff --git a/node_modules/anymatch/LICENSE b/node_modules/anymatch/LICENSE
deleted file mode 100644
index 491766ca79a0382e5fc4e370c853201bb641e0d8..0000000000000000000000000000000000000000
--- a/node_modules/anymatch/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com)
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/anymatch/README.md b/node_modules/anymatch/README.md
deleted file mode 100644
index 1dd67f53446ccbad8d17662fee69dd3c46531ba4..0000000000000000000000000000000000000000
--- a/node_modules/anymatch/README.md
+++ /dev/null
@@ -1,87 +0,0 @@
-anymatch [![Build Status](https://travis-ci.org/micromatch/anymatch.svg?branch=master)](https://travis-ci.org/micromatch/anymatch) [![Coverage Status](https://img.shields.io/coveralls/micromatch/anymatch.svg?branch=master)](https://coveralls.io/r/micromatch/anymatch?branch=master)
-======
-Javascript module to match a string against a regular expression, glob, string,
-or function that takes the string as an argument and returns a truthy or falsy
-value. The matcher can also be an array of any or all of these. Useful for
-allowing a very flexible user-defined config to define things like file paths.
-
-__Note: This module has Bash-parity, please be aware that Windows-style backslashes are not supported as separators. See https://github.com/micromatch/micromatch#backslashes for more information.__
-
-
-Usage
------
-```sh
-npm install anymatch
-```
-
-#### anymatch(matchers, testString, [returnIndex], [options])
-* __matchers__: (_Array|String|RegExp|Function_)
-String to be directly matched, string with glob patterns, regular expression
-test, function that takes the testString as an argument and returns a truthy
-value if it should be matched, or an array of any number and mix of these types.
-* __testString__: (_String|Array_) The string to test against the matchers. If
-passed as an array, the first element of the array will be used as the
-`testString` for non-function matchers, while the entire array will be applied
-as the arguments for function matchers.
-* __options__: (_Object_ [optional]_) Any of the [picomatch](https://github.com/micromatch/picomatch#options) options.
-    * __returnIndex__: (_Boolean [optional]_) If true, return the array index of
-the first matcher that that testString matched, or -1 if no match, instead of a
-boolean result.
-
-```js
-const anymatch = require('anymatch');
-
-const matchers = [ 'path/to/file.js', 'path/anyjs/**/*.js', /foo.js$/, string => string.includes('bar') && string.length > 10 ] ;
-
-anymatch(matchers, 'path/to/file.js'); // true
-anymatch(matchers, 'path/anyjs/baz.js'); // true
-anymatch(matchers, 'path/to/foo.js'); // true
-anymatch(matchers, 'path/to/bar.js'); // true
-anymatch(matchers, 'bar.js'); // false
-
-// returnIndex = true
-anymatch(matchers, 'foo.js', {returnIndex: true}); // 2
-anymatch(matchers, 'path/anyjs/foo.js', {returnIndex: true}); // 1
-
-// any picomatc
-
-// using globs to match directories and their children
-anymatch('node_modules', 'node_modules'); // true
-anymatch('node_modules', 'node_modules/somelib/index.js'); // false
-anymatch('node_modules/**', 'node_modules/somelib/index.js'); // true
-anymatch('node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // false
-anymatch('**/node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // true
-
-const matcher = anymatch(matchers);
-['foo.js', 'bar.js'].filter(matcher);  // [ 'foo.js' ]
-anymatch master* ❯
-
-```
-
-#### anymatch(matchers)
-You can also pass in only your matcher(s) to get a curried function that has
-already been bound to the provided matching criteria. This can be used as an
-`Array#filter` callback.
-
-```js
-var matcher = anymatch(matchers);
-
-matcher('path/to/file.js'); // true
-matcher('path/anyjs/baz.js', true); // 1
-
-['foo.js', 'bar.js'].filter(matcher); // ['foo.js']
-```
-
-Changelog
-----------
-[See release notes page on GitHub](https://github.com/micromatch/anymatch/releases)
-
-- **v3.0:** Removed `startIndex` and `endIndex` arguments. Node 8.x-only.
-- **v2.0:** [micromatch](https://github.com/jonschlinkert/micromatch) moves away from minimatch-parity and inline with Bash. This includes handling backslashes differently (see https://github.com/micromatch/micromatch#backslashes for more information).
-- **v1.2:** anymatch uses [micromatch](https://github.com/jonschlinkert/micromatch)
-for glob pattern matching. Issues with glob pattern matching should be
-reported directly to the [micromatch issue tracker](https://github.com/jonschlinkert/micromatch/issues).
-
-License
--------
-[ISC](https://raw.github.com/micromatch/anymatch/master/LICENSE)
diff --git a/node_modules/anymatch/index.d.ts b/node_modules/anymatch/index.d.ts
deleted file mode 100644
index 3ef7eaaddd8b5f479aeae707206d8163f82ada94..0000000000000000000000000000000000000000
--- a/node_modules/anymatch/index.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-type AnymatchFn = (testString: string) => boolean;
-type AnymatchPattern = string|RegExp|AnymatchFn;
-type AnymatchMatcher = AnymatchPattern|AnymatchPattern[]
-type AnymatchTester = {
-  (testString: string|any[], returnIndex: true): number;
-  (testString: string|any[]): boolean;
-}
-
-type PicomatchOptions = {dot: boolean};
-
-declare const anymatch: {
-  (matchers: AnymatchMatcher): AnymatchTester;
-  (matchers: AnymatchMatcher, testString: null, returnIndex: true | PicomatchOptions): AnymatchTester;
-  (matchers: AnymatchMatcher, testString: string|any[], returnIndex: true | PicomatchOptions): number;
-  (matchers: AnymatchMatcher, testString: string|any[]): boolean;
-}
-
-export {AnymatchMatcher as Matcher}
-export {AnymatchTester as Tester}
-export default anymatch
diff --git a/node_modules/anymatch/index.js b/node_modules/anymatch/index.js
deleted file mode 100644
index 8eb73e9c9a61d2c642d3c5f44a2fe4cd6cd04615..0000000000000000000000000000000000000000
--- a/node_modules/anymatch/index.js
+++ /dev/null
@@ -1,104 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", { value: true });
-
-const picomatch = require('picomatch');
-const normalizePath = require('normalize-path');
-
-/**
- * @typedef {(testString: string) => boolean} AnymatchFn
- * @typedef {string|RegExp|AnymatchFn} AnymatchPattern
- * @typedef {AnymatchPattern|AnymatchPattern[]} AnymatchMatcher
- */
-const BANG = '!';
-const DEFAULT_OPTIONS = {returnIndex: false};
-const arrify = (item) => Array.isArray(item) ? item : [item];
-
-/**
- * @param {AnymatchPattern} matcher
- * @param {object} options
- * @returns {AnymatchFn}
- */
-const createPattern = (matcher, options) => {
-  if (typeof matcher === 'function') {
-    return matcher;
-  }
-  if (typeof matcher === 'string') {
-    const glob = picomatch(matcher, options);
-    return (string) => matcher === string || glob(string);
-  }
-  if (matcher instanceof RegExp) {
-    return (string) => matcher.test(string);
-  }
-  return (string) => false;
-};
-
-/**
- * @param {Array<Function>} patterns
- * @param {Array<Function>} negPatterns
- * @param {String|Array} args
- * @param {Boolean} returnIndex
- * @returns {boolean|number}
- */
-const matchPatterns = (patterns, negPatterns, args, returnIndex) => {
-  const isList = Array.isArray(args);
-  const _path = isList ? args[0] : args;
-  if (!isList && typeof _path !== 'string') {
-    throw new TypeError('anymatch: second argument must be a string: got ' +
-      Object.prototype.toString.call(_path))
-  }
-  const path = normalizePath(_path, false);
-
-  for (let index = 0; index < negPatterns.length; index++) {
-    const nglob = negPatterns[index];
-    if (nglob(path)) {
-      return returnIndex ? -1 : false;
-    }
-  }
-
-  const applied = isList && [path].concat(args.slice(1));
-  for (let index = 0; index < patterns.length; index++) {
-    const pattern = patterns[index];
-    if (isList ? pattern(...applied) : pattern(path)) {
-      return returnIndex ? index : true;
-    }
-  }
-
-  return returnIndex ? -1 : false;
-};
-
-/**
- * @param {AnymatchMatcher} matchers
- * @param {Array|string} testString
- * @param {object} options
- * @returns {boolean|number|Function}
- */
-const anymatch = (matchers, testString, options = DEFAULT_OPTIONS) => {
-  if (matchers == null) {
-    throw new TypeError('anymatch: specify first argument');
-  }
-  const opts = typeof options === 'boolean' ? {returnIndex: options} : options;
-  const returnIndex = opts.returnIndex || false;
-
-  // Early cache for matchers.
-  const mtchers = arrify(matchers);
-  const negatedGlobs = mtchers
-    .filter(item => typeof item === 'string' && item.charAt(0) === BANG)
-    .map(item => item.slice(1))
-    .map(item => picomatch(item, opts));
-  const patterns = mtchers
-    .filter(item => typeof item !== 'string' || (typeof item === 'string' && item.charAt(0) !== BANG))
-    .map(matcher => createPattern(matcher, opts));
-
-  if (testString == null) {
-    return (testString, ri = false) => {
-      const returnIndex = typeof ri === 'boolean' ? ri : false;
-      return matchPatterns(patterns, negatedGlobs, testString, returnIndex);
-    }
-  }
-
-  return matchPatterns(patterns, negatedGlobs, testString, returnIndex);
-};
-
-anymatch.default = anymatch;
-module.exports = anymatch;
diff --git a/node_modules/anymatch/package.json b/node_modules/anymatch/package.json
deleted file mode 100644
index 2cb2307e49efc4770c0e8364e4387105162956dd..0000000000000000000000000000000000000000
--- a/node_modules/anymatch/package.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
-  "name": "anymatch",
-  "version": "3.1.3",
-  "description": "Matches strings against configurable strings, globs, regular expressions, and/or functions",
-  "files": [
-    "index.js",
-    "index.d.ts"
-  ],
-  "dependencies": {
-    "normalize-path": "^3.0.0",
-    "picomatch": "^2.0.4"
-  },
-  "author": {
-    "name": "Elan Shanker",
-    "url": "https://github.com/es128"
-  },
-  "license": "ISC",
-  "homepage": "https://github.com/micromatch/anymatch",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/micromatch/anymatch"
-  },
-  "keywords": [
-    "match",
-    "any",
-    "string",
-    "file",
-    "fs",
-    "list",
-    "glob",
-    "regex",
-    "regexp",
-    "regular",
-    "expression",
-    "function"
-  ],
-  "scripts": {
-    "test": "nyc mocha",
-    "mocha": "mocha"
-  },
-  "devDependencies": {
-    "mocha": "^6.1.3",
-    "nyc": "^14.0.0"
-  },
-  "engines": {
-    "node": ">= 8"
-  }
-}
diff --git a/node_modules/array-flatten/LICENSE b/node_modules/array-flatten/LICENSE
deleted file mode 100644
index 983fbe8aec3f4e2d4add592bb1083b00d7366f66..0000000000000000000000000000000000000000
--- a/node_modules/array-flatten/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Blake Embrey (hello@blakeembrey.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/array-flatten/README.md b/node_modules/array-flatten/README.md
deleted file mode 100644
index 91fa5b637ec2d2a492d6b5c4bf9ba2e76ff2f352..0000000000000000000000000000000000000000
--- a/node_modules/array-flatten/README.md
+++ /dev/null
@@ -1,43 +0,0 @@
-# Array Flatten
-
-[![NPM version][npm-image]][npm-url]
-[![NPM downloads][downloads-image]][downloads-url]
-[![Build status][travis-image]][travis-url]
-[![Test coverage][coveralls-image]][coveralls-url]
-
-> Flatten an array of nested arrays into a single flat array. Accepts an optional depth.
-
-## Installation
-
-```
-npm install array-flatten --save
-```
-
-## Usage
-
-```javascript
-var flatten = require('array-flatten')
-
-flatten([1, [2, [3, [4, [5], 6], 7], 8], 9])
-//=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
-
-flatten([1, [2, [3, [4, [5], 6], 7], 8], 9], 2)
-//=> [1, 2, 3, [4, [5], 6], 7, 8, 9]
-
-(function () {
-  flatten(arguments) //=> [1, 2, 3]
-})(1, [2, 3])
-```
-
-## License
-
-MIT
-
-[npm-image]: https://img.shields.io/npm/v/array-flatten.svg?style=flat
-[npm-url]: https://npmjs.org/package/array-flatten
-[downloads-image]: https://img.shields.io/npm/dm/array-flatten.svg?style=flat
-[downloads-url]: https://npmjs.org/package/array-flatten
-[travis-image]: https://img.shields.io/travis/blakeembrey/array-flatten.svg?style=flat
-[travis-url]: https://travis-ci.org/blakeembrey/array-flatten
-[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/array-flatten.svg?style=flat
-[coveralls-url]: https://coveralls.io/r/blakeembrey/array-flatten?branch=master
diff --git a/node_modules/array-flatten/array-flatten.js b/node_modules/array-flatten/array-flatten.js
deleted file mode 100644
index 089117b322f5857b8bb6bccf7a659686aca067c0..0000000000000000000000000000000000000000
--- a/node_modules/array-flatten/array-flatten.js
+++ /dev/null
@@ -1,64 +0,0 @@
-'use strict'
-
-/**
- * Expose `arrayFlatten`.
- */
-module.exports = arrayFlatten
-
-/**
- * Recursive flatten function with depth.
- *
- * @param  {Array}  array
- * @param  {Array}  result
- * @param  {Number} depth
- * @return {Array}
- */
-function flattenWithDepth (array, result, depth) {
-  for (var i = 0; i < array.length; i++) {
-    var value = array[i]
-
-    if (depth > 0 && Array.isArray(value)) {
-      flattenWithDepth(value, result, depth - 1)
-    } else {
-      result.push(value)
-    }
-  }
-
-  return result
-}
-
-/**
- * Recursive flatten function. Omitting depth is slightly faster.
- *
- * @param  {Array} array
- * @param  {Array} result
- * @return {Array}
- */
-function flattenForever (array, result) {
-  for (var i = 0; i < array.length; i++) {
-    var value = array[i]
-
-    if (Array.isArray(value)) {
-      flattenForever(value, result)
-    } else {
-      result.push(value)
-    }
-  }
-
-  return result
-}
-
-/**
- * Flatten an array, with the ability to define a depth.
- *
- * @param  {Array}  array
- * @param  {Number} depth
- * @return {Array}
- */
-function arrayFlatten (array, depth) {
-  if (depth == null) {
-    return flattenForever(array, [])
-  }
-
-  return flattenWithDepth(array, [], depth)
-}
diff --git a/node_modules/array-flatten/package.json b/node_modules/array-flatten/package.json
deleted file mode 100644
index 1a24e2a1a1d3fbd694b77bf6673ab1e1c2fd5043..0000000000000000000000000000000000000000
--- a/node_modules/array-flatten/package.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
-  "name": "array-flatten",
-  "version": "1.1.1",
-  "description": "Flatten an array of nested arrays into a single flat array",
-  "main": "array-flatten.js",
-  "files": [
-    "array-flatten.js",
-    "LICENSE"
-  ],
-  "scripts": {
-    "test": "istanbul cover _mocha -- -R spec"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/blakeembrey/array-flatten.git"
-  },
-  "keywords": [
-    "array",
-    "flatten",
-    "arguments",
-    "depth"
-  ],
-  "author": {
-    "name": "Blake Embrey",
-    "email": "hello@blakeembrey.com",
-    "url": "http://blakeembrey.me"
-  },
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/blakeembrey/array-flatten/issues"
-  },
-  "homepage": "https://github.com/blakeembrey/array-flatten",
-  "devDependencies": {
-    "istanbul": "^0.3.13",
-    "mocha": "^2.2.4",
-    "pre-commit": "^1.0.7",
-    "standard": "^3.7.3"
-  }
-}
diff --git a/node_modules/balanced-match/.github/FUNDING.yml b/node_modules/balanced-match/.github/FUNDING.yml
deleted file mode 100644
index cea8b16e9edc40b78b839e97f7d4b174ada0b41f..0000000000000000000000000000000000000000
--- a/node_modules/balanced-match/.github/FUNDING.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-tidelift: "npm/balanced-match"
-patreon: juliangruber
diff --git a/node_modules/balanced-match/LICENSE.md b/node_modules/balanced-match/LICENSE.md
deleted file mode 100644
index 2cdc8e4148cc0aa1f788b25dbec4b22878644cdf..0000000000000000000000000000000000000000
--- a/node_modules/balanced-match/LICENSE.md
+++ /dev/null
@@ -1,21 +0,0 @@
-(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/balanced-match/README.md b/node_modules/balanced-match/README.md
deleted file mode 100644
index d2a48b6b49f2cf17358262f911b997121d1c2a31..0000000000000000000000000000000000000000
--- a/node_modules/balanced-match/README.md
+++ /dev/null
@@ -1,97 +0,0 @@
-# balanced-match
-
-Match balanced string pairs, like `{` and `}` or `<b>` and `</b>`. Supports regular expressions as well!
-
-[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match)
-[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match)
-
-[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match)
-
-## Example
-
-Get the first matching pair of braces:
-
-```js
-var balanced = require('balanced-match');
-
-console.log(balanced('{', '}', 'pre{in{nested}}post'));
-console.log(balanced('{', '}', 'pre{first}between{second}post'));
-console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre  {   in{nest}   }  post'));
-```
-
-The matches are:
-
-```bash
-$ node example.js
-{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' }
-{ start: 3,
-  end: 9,
-  pre: 'pre',
-  body: 'first',
-  post: 'between{second}post' }
-{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' }
-```
-
-## API
-
-### var m = balanced(a, b, str)
-
-For the first non-nested matching pair of `a` and `b` in `str`, return an
-object with those keys:
-
-* **start** the index of the first match of `a`
-* **end** the index of the matching `b`
-* **pre** the preamble, `a` and `b` not included
-* **body** the match, `a` and `b` not included
-* **post** the postscript, `a` and `b` not included
-
-If there's no match, `undefined` will be returned.
-
-If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`.
-
-### var r = balanced.range(a, b, str)
-
-For the first non-nested matching pair of `a` and `b` in `str`, return an
-array with indexes: `[ <a index>, <b index> ]`.
-
-If there's no match, `undefined` will be returned.
-
-If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`.
-
-## Installation
-
-With [npm](https://npmjs.org) do:
-
-```bash
-npm install balanced-match
-```
-
-## Security contact information
-
-To report a security vulnerability, please use the
-[Tidelift security contact](https://tidelift.com/security).
-Tidelift will coordinate the fix and disclosure.
-
-## 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/balanced-match/index.js b/node_modules/balanced-match/index.js
deleted file mode 100644
index c67a64608df7f4d8e126c0a8eff2cc4a3d837e71..0000000000000000000000000000000000000000
--- a/node_modules/balanced-match/index.js
+++ /dev/null
@@ -1,62 +0,0 @@
-'use strict';
-module.exports = balanced;
-function balanced(a, b, str) {
-  if (a instanceof RegExp) a = maybeMatch(a, str);
-  if (b instanceof RegExp) b = maybeMatch(b, str);
-
-  var r = range(a, b, str);
-
-  return r && {
-    start: r[0],
-    end: r[1],
-    pre: str.slice(0, r[0]),
-    body: str.slice(r[0] + a.length, r[1]),
-    post: str.slice(r[1] + b.length)
-  };
-}
-
-function maybeMatch(reg, str) {
-  var m = str.match(reg);
-  return m ? m[0] : null;
-}
-
-balanced.range = range;
-function range(a, b, str) {
-  var begs, beg, left, right, result;
-  var ai = str.indexOf(a);
-  var bi = str.indexOf(b, ai + 1);
-  var i = ai;
-
-  if (ai >= 0 && bi > 0) {
-    if(a===b) {
-      return [ai, bi];
-    }
-    begs = [];
-    left = str.length;
-
-    while (i >= 0 && !result) {
-      if (i == ai) {
-        begs.push(i);
-        ai = str.indexOf(a, i + 1);
-      } else if (begs.length == 1) {
-        result = [ begs.pop(), bi ];
-      } else {
-        beg = begs.pop();
-        if (beg < left) {
-          left = beg;
-          right = bi;
-        }
-
-        bi = str.indexOf(b, i + 1);
-      }
-
-      i = ai < bi && ai >= 0 ? ai : bi;
-    }
-
-    if (begs.length) {
-      result = [ left, right ];
-    }
-  }
-
-  return result;
-}
diff --git a/node_modules/balanced-match/package.json b/node_modules/balanced-match/package.json
deleted file mode 100644
index ce6073e0403b5a9aeef19a91624ad0256f5e61b8..0000000000000000000000000000000000000000
--- a/node_modules/balanced-match/package.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
-  "name": "balanced-match",
-  "description": "Match balanced character pairs, like \"{\" and \"}\"",
-  "version": "1.0.2",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/juliangruber/balanced-match.git"
-  },
-  "homepage": "https://github.com/juliangruber/balanced-match",
-  "main": "index.js",
-  "scripts": {
-    "test": "tape test/test.js",
-    "bench": "matcha test/bench.js"
-  },
-  "devDependencies": {
-    "matcha": "^0.7.0",
-    "tape": "^4.6.0"
-  },
-  "keywords": [
-    "match",
-    "regexp",
-    "test",
-    "balanced",
-    "parse"
-  ],
-  "author": {
-    "name": "Julian Gruber",
-    "email": "mail@juliangruber.com",
-    "url": "http://juliangruber.com"
-  },
-  "license": "MIT",
-  "testling": {
-    "files": "test/*.js",
-    "browsers": [
-      "ie/8..latest",
-      "firefox/20..latest",
-      "firefox/nightly",
-      "chrome/25..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"
-    ]
-  }
-}
diff --git a/node_modules/binary-extensions/binary-extensions.json b/node_modules/binary-extensions/binary-extensions.json
deleted file mode 100644
index ac08048e40e2df28fc71773efd5731e3d39778e2..0000000000000000000000000000000000000000
--- a/node_modules/binary-extensions/binary-extensions.json
+++ /dev/null
@@ -1,263 +0,0 @@
-[
-	"3dm",
-	"3ds",
-	"3g2",
-	"3gp",
-	"7z",
-	"a",
-	"aac",
-	"adp",
-	"afdesign",
-	"afphoto",
-	"afpub",
-	"ai",
-	"aif",
-	"aiff",
-	"alz",
-	"ape",
-	"apk",
-	"appimage",
-	"ar",
-	"arj",
-	"asf",
-	"au",
-	"avi",
-	"bak",
-	"baml",
-	"bh",
-	"bin",
-	"bk",
-	"bmp",
-	"btif",
-	"bz2",
-	"bzip2",
-	"cab",
-	"caf",
-	"cgm",
-	"class",
-	"cmx",
-	"cpio",
-	"cr2",
-	"cur",
-	"dat",
-	"dcm",
-	"deb",
-	"dex",
-	"djvu",
-	"dll",
-	"dmg",
-	"dng",
-	"doc",
-	"docm",
-	"docx",
-	"dot",
-	"dotm",
-	"dra",
-	"DS_Store",
-	"dsk",
-	"dts",
-	"dtshd",
-	"dvb",
-	"dwg",
-	"dxf",
-	"ecelp4800",
-	"ecelp7470",
-	"ecelp9600",
-	"egg",
-	"eol",
-	"eot",
-	"epub",
-	"exe",
-	"f4v",
-	"fbs",
-	"fh",
-	"fla",
-	"flac",
-	"flatpak",
-	"fli",
-	"flv",
-	"fpx",
-	"fst",
-	"fvt",
-	"g3",
-	"gh",
-	"gif",
-	"graffle",
-	"gz",
-	"gzip",
-	"h261",
-	"h263",
-	"h264",
-	"icns",
-	"ico",
-	"ief",
-	"img",
-	"ipa",
-	"iso",
-	"jar",
-	"jpeg",
-	"jpg",
-	"jpgv",
-	"jpm",
-	"jxr",
-	"key",
-	"ktx",
-	"lha",
-	"lib",
-	"lvp",
-	"lz",
-	"lzh",
-	"lzma",
-	"lzo",
-	"m3u",
-	"m4a",
-	"m4v",
-	"mar",
-	"mdi",
-	"mht",
-	"mid",
-	"midi",
-	"mj2",
-	"mka",
-	"mkv",
-	"mmr",
-	"mng",
-	"mobi",
-	"mov",
-	"movie",
-	"mp3",
-	"mp4",
-	"mp4a",
-	"mpeg",
-	"mpg",
-	"mpga",
-	"mxu",
-	"nef",
-	"npx",
-	"numbers",
-	"nupkg",
-	"o",
-	"odp",
-	"ods",
-	"odt",
-	"oga",
-	"ogg",
-	"ogv",
-	"otf",
-	"ott",
-	"pages",
-	"pbm",
-	"pcx",
-	"pdb",
-	"pdf",
-	"pea",
-	"pgm",
-	"pic",
-	"png",
-	"pnm",
-	"pot",
-	"potm",
-	"potx",
-	"ppa",
-	"ppam",
-	"ppm",
-	"pps",
-	"ppsm",
-	"ppsx",
-	"ppt",
-	"pptm",
-	"pptx",
-	"psd",
-	"pya",
-	"pyc",
-	"pyo",
-	"pyv",
-	"qt",
-	"rar",
-	"ras",
-	"raw",
-	"resources",
-	"rgb",
-	"rip",
-	"rlc",
-	"rmf",
-	"rmvb",
-	"rpm",
-	"rtf",
-	"rz",
-	"s3m",
-	"s7z",
-	"scpt",
-	"sgi",
-	"shar",
-	"snap",
-	"sil",
-	"sketch",
-	"slk",
-	"smv",
-	"snk",
-	"so",
-	"stl",
-	"suo",
-	"sub",
-	"swf",
-	"tar",
-	"tbz",
-	"tbz2",
-	"tga",
-	"tgz",
-	"thmx",
-	"tif",
-	"tiff",
-	"tlz",
-	"ttc",
-	"ttf",
-	"txz",
-	"udf",
-	"uvh",
-	"uvi",
-	"uvm",
-	"uvp",
-	"uvs",
-	"uvu",
-	"viv",
-	"vob",
-	"war",
-	"wav",
-	"wax",
-	"wbmp",
-	"wdp",
-	"weba",
-	"webm",
-	"webp",
-	"whl",
-	"wim",
-	"wm",
-	"wma",
-	"wmv",
-	"wmx",
-	"woff",
-	"woff2",
-	"wrm",
-	"wvx",
-	"xbm",
-	"xif",
-	"xla",
-	"xlam",
-	"xls",
-	"xlsb",
-	"xlsm",
-	"xlsx",
-	"xlt",
-	"xltm",
-	"xltx",
-	"xm",
-	"xmind",
-	"xpi",
-	"xpm",
-	"xwd",
-	"xz",
-	"z",
-	"zip",
-	"zipx"
-]
diff --git a/node_modules/binary-extensions/binary-extensions.json.d.ts b/node_modules/binary-extensions/binary-extensions.json.d.ts
deleted file mode 100644
index 94a248c2bcff7d66060ed1968cd12897d340b4a0..0000000000000000000000000000000000000000
--- a/node_modules/binary-extensions/binary-extensions.json.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-declare const binaryExtensionsJson: readonly string[];
-
-export = binaryExtensionsJson;
diff --git a/node_modules/binary-extensions/index.d.ts b/node_modules/binary-extensions/index.d.ts
deleted file mode 100644
index f469ac5fb0fe5fd6cbd8816db9257c718d8d2c85..0000000000000000000000000000000000000000
--- a/node_modules/binary-extensions/index.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
-List of binary file extensions.
-
-@example
-```
-import binaryExtensions = require('binary-extensions');
-
-console.log(binaryExtensions);
-//=> ['3ds', '3g2', …]
-```
-*/
-declare const binaryExtensions: readonly string[];
-
-export = binaryExtensions;
diff --git a/node_modules/binary-extensions/index.js b/node_modules/binary-extensions/index.js
deleted file mode 100644
index d46e46886711415a0a1064443c20e8a3704714c3..0000000000000000000000000000000000000000
--- a/node_modules/binary-extensions/index.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./binary-extensions.json');
diff --git a/node_modules/binary-extensions/license b/node_modules/binary-extensions/license
deleted file mode 100644
index 5493a1a6e3f9a54b9ed8da6b1c83df252204f753..0000000000000000000000000000000000000000
--- a/node_modules/binary-extensions/license
+++ /dev/null
@@ -1,10 +0,0 @@
-MIT License
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
-Copyright (c) Paul Miller (https://paulmillr.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/binary-extensions/package.json b/node_modules/binary-extensions/package.json
deleted file mode 100644
index 4710c339aeb2d5885d2df14567c614d83e820cc7..0000000000000000000000000000000000000000
--- a/node_modules/binary-extensions/package.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-	"name": "binary-extensions",
-	"version": "2.3.0",
-	"description": "List of binary file extensions",
-	"license": "MIT",
-	"repository": "sindresorhus/binary-extensions",
-	"funding": "https://github.com/sponsors/sindresorhus",
-	"author": {
-		"name": "Sindre Sorhus",
-		"email": "sindresorhus@gmail.com",
-		"url": "https://sindresorhus.com"
-	},
-	"sideEffects": false,
-	"engines": {
-		"node": ">=8"
-	},
-	"scripts": {
-		"test": "xo && ava && tsd"
-	},
-	"files": [
-		"index.js",
-		"index.d.ts",
-		"binary-extensions.json",
-		"binary-extensions.json.d.ts"
-	],
-	"keywords": [
-		"binary",
-		"extensions",
-		"extension",
-		"file",
-		"json",
-		"list",
-		"array"
-	],
-	"devDependencies": {
-		"ava": "^1.4.1",
-		"tsd": "^0.7.2",
-		"xo": "^0.24.0"
-	}
-}
diff --git a/node_modules/binary-extensions/readme.md b/node_modules/binary-extensions/readme.md
deleted file mode 100644
index 88519b3a6dacab294ec8ec61b1c706533c72f697..0000000000000000000000000000000000000000
--- a/node_modules/binary-extensions/readme.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# binary-extensions
-
-> List of binary file extensions
-
-The list is just a [JSON file](binary-extensions.json) and can be used anywhere.
-
-## Install
-
-```sh
-npm install binary-extensions
-```
-
-## Usage
-
-```js
-const binaryExtensions = require('binary-extensions');
-
-console.log(binaryExtensions);
-//=> ['3ds', '3g2', …]
-```
-
-## Related
-
-- [is-binary-path](https://github.com/sindresorhus/is-binary-path) - Check if a filepath is a binary file
-- [text-extensions](https://github.com/sindresorhus/text-extensions) - List of text file extensions
diff --git a/node_modules/bn.js/.jscsrc b/node_modules/bn.js/.jscsrc
deleted file mode 100644
index dbaae20574debf185058ae1ba189ee3d5adb4d93..0000000000000000000000000000000000000000
--- a/node_modules/bn.js/.jscsrc
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "disallowKeywordsOnNewLine": [ "else" ],
-  "disallowMixedSpacesAndTabs": true,
-  "disallowMultipleLineStrings": true,
-  "disallowMultipleVarDecl": true,
-  "disallowNewlineBeforeBlockStatements": true,
-  "disallowQuotedKeysInObjects": true,
-  "disallowSpaceAfterObjectKeys": true,
-  "disallowSpaceAfterPrefixUnaryOperators": true,
-  "disallowSpaceBeforePostfixUnaryOperators": true,
-  "disallowSpacesInCallExpression": true,
-  "disallowTrailingComma": true,
-  "disallowTrailingWhitespace": true,
-  "disallowYodaConditions": true,
-
-  "requireCommaBeforeLineBreak": true,
-  "requireOperatorBeforeLineBreak": true,
-  "requireSpaceAfterBinaryOperators": true,
-  "requireSpaceAfterKeywords": [ "if", "for", "while", "else", "try", "catch" ],
-  "requireSpaceAfterLineComment": true,
-  "requireSpaceBeforeBinaryOperators": true,
-  "requireSpaceBeforeBlockStatements": true,
-  "requireSpaceBeforeKeywords": [ "else", "catch" ],
-  "requireSpaceBeforeObjectValues": true,
-  "requireSpaceBetweenArguments": true,
-  "requireSpacesInAnonymousFunctionExpression": {
-    "beforeOpeningCurlyBrace": true
-  },
-  "requireSpacesInFunctionDeclaration": {
-    "beforeOpeningCurlyBrace": true
-  },
-  "requireSpacesInFunctionExpression": {
-    "beforeOpeningCurlyBrace": true
-  },
-  "requireSpacesInConditionalExpression": true,
-  "requireSpacesInForStatement": true,
-  "requireSpacesInsideArrayBrackets": "all",
-  "requireSpacesInsideObjectBrackets": "all",
-  "requireDotNotation": true,
-
-  "maximumLineLength": 80,
-  "validateIndentation": 2,
-  "validateLineBreaks": "LF",
-  "validateParameterSeparator": ", ",
-  "validateQuoteMarks": "'"
-}
diff --git a/node_modules/bn.js/.jshintrc b/node_modules/bn.js/.jshintrc
deleted file mode 100644
index 87f72f9aad011568e0b8d15e3e6350e4570691ad..0000000000000000000000000000000000000000
--- a/node_modules/bn.js/.jshintrc
+++ /dev/null
@@ -1,89 +0,0 @@
-{
-    // JSHint Default Configuration File (as on JSHint website)
-    // See http://jshint.com/docs/ for more details
-
-    "maxerr"        : 50,       // {int} Maximum error before stopping
-
-    // Enforcing
-    "bitwise"       : false,     // true: Prohibit bitwise operators (&, |, ^, etc.)
-    "camelcase"     : true,      // true: Identifiers must be in camelCase
-    "curly"         : false,     // true: Require {} for every new block or scope
-    "eqeqeq"        : true,     // true: Require triple equals (===) for comparison
-    "forin"         : true,     // true: Require filtering for..in loops with obj.hasOwnProperty()
-    "freeze"        : true,     // true: prohibits overwriting prototypes of native objects such as Array, Date etc.
-    "immed"         : false,    // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());`
-    "indent"        : 2,        // {int} Number of spaces to use for indentation
-    "latedef"       : true,     // true: Require variables/functions to be defined before being used
-    "newcap"        : true,     // true: Require capitalization of all constructor functions e.g. `new F()`
-    "noarg"         : true,     // true: Prohibit use of `arguments.caller` and `arguments.callee`
-    "noempty"       : false,    // true: Prohibit use of empty blocks
-    "nonbsp"        : true,     // true: Prohibit "non-breaking whitespace" characters.
-    "nonew"         : false,    // true: Prohibit use of constructors for side-effects (without assignment)
-    "plusplus"      : false,    // true: Prohibit use of `++` & `--`
-    "quotmark"      : "single", // Quotation mark consistency:
-                                //   false    : do nothing (default)
-                                //   true     : ensure whatever is used is consistent
-                                //   "single" : require single quotes
-                                //   "double" : require double quotes
-    "undef"         : true,     // true: Require all non-global variables to be declared (prevents global leaks)
-    "unused"        : true,     // true: Require all defined variables be used
-    "strict"        : true,     // true: Requires all functions run in ES5 Strict Mode
-    "maxparams"     : false,    // {int} Max number of formal params allowed per function
-    "maxdepth"      : 3,        // {int} Max depth of nested blocks (within functions)
-    "maxstatements" : false,    // {int} Max number statements per function
-    "maxcomplexity" : false,    // {int} Max cyclomatic complexity per function
-    "maxlen"        : false,    // {int} Max number of characters per line
-
-    // Relaxing
-    "asi"           : false,     // true: Tolerate Automatic Semicolon Insertion (no semicolons)
-    "boss"          : false,     // true: Tolerate assignments where comparisons would be expected
-    "debug"         : false,     // true: Allow debugger statements e.g. browser breakpoints.
-    "eqnull"        : false,     // true: Tolerate use of `== null`
-    "es5"           : false,     // true: Allow ES5 syntax (ex: getters and setters)
-    "esnext"        : false,     // true: Allow ES.next (ES6) syntax (ex: `const`)
-    "moz"           : false,     // true: Allow Mozilla specific syntax (extends and overrides esnext features)
-                                 // (ex: `for each`, multiple try/catch, function expression…)
-    "evil"          : false,     // true: Tolerate use of `eval` and `new Function()`
-    "expr"          : false,     // true: Tolerate `ExpressionStatement` as Programs
-    "funcscope"     : false,     // true: Tolerate defining variables inside control statements
-    "globalstrict"  : false,     // true: Allow global "use strict" (also enables 'strict')
-    "iterator"      : false,     // true: Tolerate using the `__iterator__` property
-    "lastsemic"     : false,     // true: Tolerate omitting a semicolon for the last statement of a 1-line block
-    "laxbreak"      : false,     // true: Tolerate possibly unsafe line breakings
-    "laxcomma"      : false,     // true: Tolerate comma-first style coding
-    "loopfunc"      : false,     // true: Tolerate functions being defined in loops
-    "multistr"      : false,     // true: Tolerate multi-line strings
-    "noyield"       : false,     // true: Tolerate generator functions with no yield statement in them.
-    "notypeof"      : false,     // true: Tolerate invalid typeof operator values
-    "proto"         : false,     // true: Tolerate using the `__proto__` property
-    "scripturl"     : false,     // true: Tolerate script-targeted URLs
-    "shadow"        : true,      // true: Allows re-define variables later in code e.g. `var x=1; x=2;`
-    "sub"           : false,     // true: Tolerate using `[]` notation when it can still be expressed in dot notation
-    "supernew"      : false,     // true: Tolerate `new function () { ... };` and `new Object;`
-    "validthis"     : false,     // true: Tolerate using this in a non-constructor function
-
-    // Environments
-    "browser"       : true,     // Web Browser (window, document, etc)
-    "browserify"    : true,     // Browserify (node.js code in the browser)
-    "couch"         : false,    // CouchDB
-    "devel"         : true,     // Development/debugging (alert, confirm, etc)
-    "dojo"          : false,    // Dojo Toolkit
-    "jasmine"       : false,    // Jasmine
-    "jquery"        : false,    // jQuery
-    "mocha"         : true,     // Mocha
-    "mootools"      : false,    // MooTools
-    "node"          : true,     // Node.js
-    "nonstandard"   : false,    // Widely adopted globals (escape, unescape, etc)
-    "prototypejs"   : false,    // Prototype and Scriptaculous
-    "qunit"         : false,    // QUnit
-    "rhino"         : false,    // Rhino
-    "shelljs"       : false,    // ShellJS
-    "worker"        : false,    // Web Workers
-    "wsh"           : false,    // Windows Scripting Host
-    "yui"           : false,    // Yahoo User Interface
-
-    // Custom Globals
-    "globals"       : {
-        "module": true
-    }        // additional predefined global variables
-}
diff --git a/node_modules/bn.js/.npmignore b/node_modules/bn.js/.npmignore
deleted file mode 100644
index de5c5a18e947be30ba57c3de920a1fc349d41e51..0000000000000000000000000000000000000000
--- a/node_modules/bn.js/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-benchmarks/
-coverage/
-node_modules/
-npm-debug.log
-1.js
diff --git a/node_modules/bn.js/.travis.yml b/node_modules/bn.js/.travis.yml
deleted file mode 100644
index 92a990f6797578b242b1b787a264d8ad07e2e75a..0000000000000000000000000000000000000000
--- a/node_modules/bn.js/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: node_js
-node_js:
-  - "0.10"
-  - "0.11"
-branches:
-  only:
-    - master
diff --git a/node_modules/bn.js/README.md b/node_modules/bn.js/README.md
deleted file mode 100644
index 0f3078e28d5233ef2bb6617e1980904bc6fa4051..0000000000000000000000000000000000000000
--- a/node_modules/bn.js/README.md
+++ /dev/null
@@ -1,124 +0,0 @@
-# bn.js [![Build Status](https://secure.travis-ci.org/indutny/bn.js.png)](http://travis-ci.org/indutny/bn.js)
-> BigNum in pure javascript
-
-## Install
-`npm install --save bn.js`
-
-## API
-
-```js
-const BN = require('bn.js');
-
-// Numbers
-new BN(12345);     // <BN: 3039>
-new BN(0x4123456); // <BN: 4123456>
-
-// Strings
-new BN('FF', 16); // <BN: 255>
-new BN('1A6B765D8CDF', 16); // <BN: 29048849665247>
-
-// Big endian
-new BN([1,2,3,4]); // <BN: 1020304>
-new BN([1,2,3,4]).toArray().join(','); // <BN: 1,2,3,4>
-
-// Little endian
-new BN([1,2,3], 10, 'le'); // <BN: 30201>
-new BN([1,2,3,4], 10, 'le'); // <BN: 4030201>
-
-// bitLength
-new BN(0x123456).bitLength(); // <BN: 21>
-new BN('123456789', 16).bitLength(); // <BN: 33>
-
-// zeroBits
-new BN('11000', 2).zeroBits(); // 3
-
-// iaddn
-new BN(-100).sign;  // true
-new BN(100).sign;   // false
-
-// isubn
-new BN(-100).isubn(200) // <BN: -300>
-
-// add
-new BN(14).add(new BN(26)); // <BN: 28>
-
-// mul
-new BN(0x1001).mul(new BN(0x1234)); // <BN: 1235234>
-
-// div
-new BN('-69527932928').div(new BN('16974594')); // <BN: -fff>
-
-// mod
-new BN('10').mod(new BN(256)); // <BN: a>
-
-// divRound
-new BN(9).divRound(new BN(20)).toString(10); // <BN: 0>
-
-// abs
-new BN(0x1001).abs(); // <BN: 4097>
-
-// modn
-new BN('10', 16).modn(256); // <BN: 10>
-
-// idivn
-new BN('10', 16).idivn(3); // <BN: 5>
-
-// shl
-new BN('69527932928').shln(13); // <BN: 2060602000000>
-
-// shrn
-new BN('69527932928').shrn(13); // <BN: 818180>
-
-// bincn
-new BN(0xffffff).bincn(1);  // <BN: 1000001>
-
-// imaskn
-new BN('123456789', 16).imaskn(4); // <BN: 9>
-
-// gcd
-new BN(-18).gcd(new BN(12)); // <BN: 6>
-
-// iand
-(new BN('1', 2)
-.iand(new BN('1000000000000000000000000000000000000001', 2))
-.toString(2); // '1'
-
-// ior
-new BN('1', 2)
-.ior(new BN('1000000000000000000000000000000000000000', 2));
-// <BN: 1000000000000000000000000000000000000001>
-
-// ixor
-new BN('1', 2)
-.ixor(new BN('11001100110011001100110011001100', 2));
-// <BN: '11001100110011001100110011001101'>
-
-// setn
-new BN(0).setn(2, true); // <BN: 100>
-
-```
-
-## LICENSE
-
-This software is licensed under the MIT License.
-
-Copyright Fedor Indutny, 2015.
-
-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/bn.js/lib/bn.js b/node_modules/bn.js/lib/bn.js
deleted file mode 100644
index caa8c5caba5546a8be24041e45ed130f7028415a..0000000000000000000000000000000000000000
--- a/node_modules/bn.js/lib/bn.js
+++ /dev/null
@@ -1,2266 +0,0 @@
-(function (module, exports) {
-
-'use strict';
-
-// Utils
-
-function assert(val, msg) {
-  if (!val)
-    throw new Error(msg || 'Assertion failed');
-}
-
-// Could use `inherits` module, but don't want to move from single file
-// architecture yet.
-function inherits(ctor, superCtor) {
-  ctor.super_ = superCtor;
-  var TempCtor = function () {};
-  TempCtor.prototype = superCtor.prototype;
-  ctor.prototype = new TempCtor();
-  ctor.prototype.constructor = ctor;
-}
-
-// BN
-
-function BN(number, base, endian) {
-  // May be `new BN(bn)` ?
-  if (number !== null &&
-      typeof number === 'object' &&
-      Array.isArray(number.words)) {
-    return number;
-  }
-
-  this.sign = false;
-  this.words = null;
-  this.length = 0;
-
-  // Reduction context
-  this.red = null;
-
-  if (base === 'le' || base === 'be') {
-    endian = base;
-    base = 10;
-  }
-
-  if (number !== null)
-    this._init(number || 0, base || 10, endian || 'be');
-}
-if (typeof module === 'object')
-  module.exports = BN;
-else
-  exports.BN = BN;
-
-BN.BN = BN;
-BN.wordSize = 26;
-
-BN.prototype._init = function init(number, base, endian) {
-  if (typeof number === 'number') {
-    if (number < 0) {
-      this.sign = true;
-      number = -number;
-    }
-    if (number < 0x4000000) {
-      this.words = [ number & 0x3ffffff ];
-      this.length = 1;
-    } else {
-      this.words = [
-        number & 0x3ffffff,
-        (number / 0x4000000) & 0x3ffffff
-      ];
-      this.length = 2;
-    }
-    return;
-  } else if (typeof number === 'object') {
-    return this._initArray(number, base, endian);
-  }
-  if (base === 'hex')
-    base = 16;
-  assert(base === (base | 0) && base >= 2 && base <= 36);
-
-  number = number.toString().replace(/\s+/g, '');
-  var start = 0;
-  if (number[0] === '-')
-    start++;
-
-  if (base === 16)
-    this._parseHex(number, start);
-  else
-    this._parseBase(number, base, start);
-
-  if (number[0] === '-')
-    this.sign = true;
-
-  this.strip();
-};
-
-BN.prototype._initArray = function _initArray(number, base, endian) {
-  // Perhaps a Uint8Array
-  assert(typeof number.length === 'number');
-  this.length = Math.ceil(number.length / 3);
-  this.words = new Array(this.length);
-  for (var i = 0; i < this.length; i++)
-    this.words[i] = 0;
-
-  var off = 0;
-  if (endian === 'be') {
-    for (var i = number.length - 1, j = 0; i >= 0; i -= 3) {
-      var w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);
-      this.words[j] |= (w << off) & 0x3ffffff;
-      this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
-      off += 24;
-      if (off >= 26) {
-        off -= 26;
-        j++;
-      }
-    }
-  } else if (endian === 'le') {
-    for (var i = 0, j = 0; i < number.length; i += 3) {
-      var w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);
-      this.words[j] |= (w << off) & 0x3ffffff;
-      this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
-      off += 24;
-      if (off >= 26) {
-        off -= 26;
-        j++;
-      }
-    }
-  }
-  return this.strip();
-};
-
-function parseHex(str, start, end) {
-  var r = 0;
-  var len = Math.min(str.length, end);
-  for (var i = start; i < len; i++) {
-    var c = str.charCodeAt(i) - 48;
-
-    r <<= 4;
-
-    // 'a' - 'f'
-    if (c >= 49 && c <= 54)
-      r |= c - 49 + 0xa;
-
-    // 'A' - 'F'
-    else if (c >= 17 && c <= 22)
-      r |= c - 17 + 0xa;
-
-    // '0' - '9'
-    else
-      r |= c & 0xf;
-  }
-  return r;
-}
-
-BN.prototype._parseHex = function _parseHex(number, start) {
-  // Create possibly bigger array to ensure that it fits the number
-  this.length = Math.ceil((number.length - start) / 6);
-  this.words = new Array(this.length);
-  for (var i = 0; i < this.length; i++)
-    this.words[i] = 0;
-
-  // Scan 24-bit chunks and add them to the number
-  var off = 0;
-  for (var i = number.length - 6, j = 0; i >= start; i -= 6) {
-    var w = parseHex(number, i, i + 6);
-    this.words[j] |= (w << off) & 0x3ffffff;
-    this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;
-    off += 24;
-    if (off >= 26) {
-      off -= 26;
-      j++;
-    }
-  }
-  if (i + 6 !== start) {
-    var w = parseHex(number, start, i + 6);
-    this.words[j] |= (w << off) & 0x3ffffff;
-    this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;
-  }
-  this.strip();
-};
-
-function parseBase(str, start, end, mul) {
-  var r = 0;
-  var len = Math.min(str.length, end);
-  for (var i = start; i < len; i++) {
-    var c = str.charCodeAt(i) - 48;
-
-    r *= mul;
-
-    // 'a'
-    if (c >= 49)
-      r += c - 49 + 0xa;
-
-    // 'A'
-    else if (c >= 17)
-      r += c - 17 + 0xa;
-
-    // '0' - '9'
-    else
-      r += c;
-  }
-  return r;
-}
-
-BN.prototype._parseBase = function _parseBase(number, base, start) {
-  // Initialize as zero
-  this.words = [ 0 ];
-  this.length = 1;
-
-  // Find length of limb in base
-  for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base)
-    limbLen++;
-  limbLen--;
-  limbPow = (limbPow / base) | 0;
-
-  var total = number.length - start;
-  var mod = total % limbLen;
-  var end = Math.min(total, total - mod) + start;
-
-  var word = 0;
-  for (var i = start; i < end; i += limbLen) {
-    word = parseBase(number, i, i + limbLen, base);
-
-    this.imuln(limbPow);
-    if (this.words[0] + word < 0x4000000)
-      this.words[0] += word;
-    else
-      this._iaddn(word);
-  }
-
-  if (mod !== 0) {
-    var pow = 1;
-    var word = parseBase(number, i, number.length, base);
-
-    for (var i = 0; i < mod; i++)
-      pow *= base;
-    this.imuln(pow);
-    if (this.words[0] + word < 0x4000000)
-      this.words[0] += word;
-    else
-      this._iaddn(word);
-  }
-};
-
-BN.prototype.copy = function copy(dest) {
-  dest.words = new Array(this.length);
-  for (var i = 0; i < this.length; i++)
-    dest.words[i] = this.words[i];
-  dest.length = this.length;
-  dest.sign = this.sign;
-  dest.red = this.red;
-};
-
-BN.prototype.clone = function clone() {
-  var r = new BN(null);
-  this.copy(r);
-  return r;
-};
-
-// Remove leading `0` from `this`
-BN.prototype.strip = function strip() {
-  while (this.length > 1 && this.words[this.length - 1] === 0)
-    this.length--;
-  return this._normSign();
-};
-
-BN.prototype._normSign = function _normSign() {
-  // -0 = 0
-  if (this.length === 1 && this.words[0] === 0)
-    this.sign = false;
-  return this;
-};
-
-BN.prototype.inspect = function inspect() {
-  return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';
-};
-
-/*
-
-var zeros = [];
-var groupSizes = [];
-var groupBases = [];
-
-var s = '';
-var i = -1;
-while (++i < BN.wordSize) {
-  zeros[i] = s;
-  s += '0';
-}
-groupSizes[0] = 0;
-groupSizes[1] = 0;
-groupBases[0] = 0;
-groupBases[1] = 0;
-var base = 2 - 1;
-while (++base < 36 + 1) {
-  var groupSize = 0;
-  var groupBase = 1;
-  while (groupBase < (1 << BN.wordSize) / base) {
-    groupBase *= base;
-    groupSize += 1;
-  }
-  groupSizes[base] = groupSize;
-  groupBases[base] = groupBase;
-}
-
-*/
-
-var zeros = [
-  '',
-  '0',
-  '00',
-  '000',
-  '0000',
-  '00000',
-  '000000',
-  '0000000',
-  '00000000',
-  '000000000',
-  '0000000000',
-  '00000000000',
-  '000000000000',
-  '0000000000000',
-  '00000000000000',
-  '000000000000000',
-  '0000000000000000',
-  '00000000000000000',
-  '000000000000000000',
-  '0000000000000000000',
-  '00000000000000000000',
-  '000000000000000000000',
-  '0000000000000000000000',
-  '00000000000000000000000',
-  '000000000000000000000000',
-  '0000000000000000000000000'
-];
-
-var groupSizes = [
-  0, 0,
-  25, 16, 12, 11, 10, 9, 8,
-  8, 7, 7, 7, 7, 6, 6,
-  6, 6, 6, 6, 6, 5, 5,
-  5, 5, 5, 5, 5, 5, 5,
-  5, 5, 5, 5, 5, 5, 5
-];
-
-var groupBases = [
-  0, 0,
-  33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,
-  43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,
-  16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,
-  6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,
-  24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176
-];
-
-BN.prototype.toString = function toString(base, padding) {
-  base = base || 10;
-  if (base === 16 || base === 'hex') {
-    var out = '';
-    var off = 0;
-    var padding = padding | 0 || 1;
-    var carry = 0;
-    for (var i = 0; i < this.length; i++) {
-      var w = this.words[i];
-      var word = (((w << off) | carry) & 0xffffff).toString(16);
-      carry = (w >>> (24 - off)) & 0xffffff;
-      if (carry !== 0 || i !== this.length - 1)
-        out = zeros[6 - word.length] + word + out;
-      else
-        out = word + out;
-      off += 2;
-      if (off >= 26) {
-        off -= 26;
-        i--;
-      }
-    }
-    if (carry !== 0)
-      out = carry.toString(16) + out;
-    while (out.length % padding !== 0)
-      out = '0' + out;
-    if (this.sign)
-      out = '-' + out;
-    return out;
-  } else if (base === (base | 0) && base >= 2 && base <= 36) {
-    // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));
-    var groupSize = groupSizes[base];
-    // var groupBase = Math.pow(base, groupSize);
-    var groupBase = groupBases[base];
-    var out = '';
-    var c = this.clone();
-    c.sign = false;
-    while (c.cmpn(0) !== 0) {
-      var r = c.modn(groupBase).toString(base);
-      c = c.idivn(groupBase);
-
-      if (c.cmpn(0) !== 0)
-        out = zeros[groupSize - r.length] + r + out;
-      else
-        out = r + out;
-    }
-    if (this.cmpn(0) === 0)
-      out = '0' + out;
-    if (this.sign)
-      out = '-' + out;
-    return out;
-  } else {
-    assert(false, 'Base should be between 2 and 36');
-  }
-};
-
-BN.prototype.toJSON = function toJSON() {
-  return this.toString(16);
-};
-
-BN.prototype.toArray = function toArray() {
-  this.strip();
-  var res = new Array(this.byteLength());
-  res[0] = 0;
-
-  var q = this.clone();
-  for (var i = 0; q.cmpn(0) !== 0; i++) {
-    var b = q.andln(0xff);
-    q.ishrn(8);
-
-    // Assume big-endian
-    res[res.length - i - 1] = b;
-  }
-
-  return res;
-};
-
-if (Math.clz32) {
-  BN.prototype._countBits = function _countBits(w) {
-    return 32 - Math.clz32(w);
-  };
-} else {
-  BN.prototype._countBits = function _countBits(w) {
-    var t = w;
-    var r = 0;
-    if (t >= 0x1000) {
-      r += 13;
-      t >>>= 13;
-    }
-    if (t >= 0x40) {
-      r += 7;
-      t >>>= 7;
-    }
-    if (t >= 0x8) {
-      r += 4;
-      t >>>= 4;
-    }
-    if (t >= 0x02) {
-      r += 2;
-      t >>>= 2;
-    }
-    return r + t;
-  };
-}
-
-BN.prototype._zeroBits = function _zeroBits(w) {
-  // Short-cut
-  if (w === 0)
-    return 26;
-
-  var t = w;
-  var r = 0;
-  if ((t & 0x1fff) === 0) {
-    r += 13;
-    t >>>= 13;
-  }
-  if ((t & 0x7f) === 0) {
-    r += 7;
-    t >>>= 7;
-  }
-  if ((t & 0xf) === 0) {
-    r += 4;
-    t >>>= 4;
-  }
-  if ((t & 0x3) === 0) {
-    r += 2;
-    t >>>= 2;
-  }
-  if ((t & 0x1) === 0)
-    r++;
-  return r;
-};
-
-// Return number of used bits in a BN
-BN.prototype.bitLength = function bitLength() {
-  var hi = 0;
-  var w = this.words[this.length - 1];
-  var hi = this._countBits(w);
-  return (this.length - 1) * 26 + hi;
-};
-
-// Number of trailing zero bits
-BN.prototype.zeroBits = function zeroBits() {
-  if (this.cmpn(0) === 0)
-    return 0;
-
-  var r = 0;
-  for (var i = 0; i < this.length; i++) {
-    var b = this._zeroBits(this.words[i]);
-    r += b;
-    if (b !== 26)
-      break;
-  }
-  return r;
-};
-
-BN.prototype.byteLength = function byteLength() {
-  return Math.ceil(this.bitLength() / 8);
-};
-
-// Return negative clone of `this`
-BN.prototype.neg = function neg() {
-  if (this.cmpn(0) === 0)
-    return this.clone();
-
-  var r = this.clone();
-  r.sign = !this.sign;
-  return r;
-};
-
-
-// Or `num` with `this` in-place
-BN.prototype.ior = function ior(num) {
-  this.sign = this.sign || num.sign;
-
-  while (this.length < num.length)
-    this.words[this.length++] = 0;
-
-  for (var i = 0; i < num.length; i++)
-    this.words[i] = this.words[i] | num.words[i];
-
-  return this.strip();
-};
-
-
-// Or `num` with `this`
-BN.prototype.or = function or(num) {
-  if (this.length > num.length)
-    return this.clone().ior(num);
-  else
-    return num.clone().ior(this);
-};
-
-
-// And `num` with `this` in-place
-BN.prototype.iand = function iand(num) {
-  this.sign = this.sign && num.sign;
-
-  // b = min-length(num, this)
-  var b;
-  if (this.length > num.length)
-    b = num;
-  else
-    b = this;
-
-  for (var i = 0; i < b.length; i++)
-    this.words[i] = this.words[i] & num.words[i];
-
-  this.length = b.length;
-
-  return this.strip();
-};
-
-
-// And `num` with `this`
-BN.prototype.and = function and(num) {
-  if (this.length > num.length)
-    return this.clone().iand(num);
-  else
-    return num.clone().iand(this);
-};
-
-
-// Xor `num` with `this` in-place
-BN.prototype.ixor = function ixor(num) {
-  this.sign = this.sign || num.sign;
-
-  // a.length > b.length
-  var a;
-  var b;
-  if (this.length > num.length) {
-    a = this;
-    b = num;
-  } else {
-    a = num;
-    b = this;
-  }
-
-  for (var i = 0; i < b.length; i++)
-    this.words[i] = a.words[i] ^ b.words[i];
-
-  if (this !== a)
-    for (; i < a.length; i++)
-      this.words[i] = a.words[i];
-
-  this.length = a.length;
-
-  return this.strip();
-};
-
-
-// Xor `num` with `this`
-BN.prototype.xor = function xor(num) {
-  if (this.length > num.length)
-    return this.clone().ixor(num);
-  else
-    return num.clone().ixor(this);
-};
-
-
-// Set `bit` of `this`
-BN.prototype.setn = function setn(bit, val) {
-  assert(typeof bit === 'number' && bit >= 0);
-
-  var off = (bit / 26) | 0;
-  var wbit = bit % 26;
-
-  while (this.length <= off)
-    this.words[this.length++] = 0;
-
-  if (val)
-    this.words[off] = this.words[off] | (1 << wbit);
-  else
-    this.words[off] = this.words[off] & ~(1 << wbit);
-
-  return this.strip();
-};
-
-
-// Add `num` to `this` in-place
-BN.prototype.iadd = function iadd(num) {
-  // negative + positive
-  if (this.sign && !num.sign) {
-    this.sign = false;
-    var r = this.isub(num);
-    this.sign = !this.sign;
-    return this._normSign();
-
-  // positive + negative
-  } else if (!this.sign && num.sign) {
-    num.sign = false;
-    var r = this.isub(num);
-    num.sign = true;
-    return r._normSign();
-  }
-
-  // a.length > b.length
-  var a;
-  var b;
-  if (this.length > num.length) {
-    a = this;
-    b = num;
-  } else {
-    a = num;
-    b = this;
-  }
-
-  var carry = 0;
-  for (var i = 0; i < b.length; i++) {
-    var r = a.words[i] + b.words[i] + carry;
-    this.words[i] = r & 0x3ffffff;
-    carry = r >>> 26;
-  }
-  for (; carry !== 0 && i < a.length; i++) {
-    var r = a.words[i] + carry;
-    this.words[i] = r & 0x3ffffff;
-    carry = r >>> 26;
-  }
-
-  this.length = a.length;
-  if (carry !== 0) {
-    this.words[this.length] = carry;
-    this.length++;
-  // Copy the rest of the words
-  } else if (a !== this) {
-    for (; i < a.length; i++)
-      this.words[i] = a.words[i];
-  }
-
-  return this;
-};
-
-// Add `num` to `this`
-BN.prototype.add = function add(num) {
-  if (num.sign && !this.sign) {
-    num.sign = false;
-    var res = this.sub(num);
-    num.sign = true;
-    return res;
-  } else if (!num.sign && this.sign) {
-    this.sign = false;
-    var res = num.sub(this);
-    this.sign = true;
-    return res;
-  }
-
-  if (this.length > num.length)
-    return this.clone().iadd(num);
-  else
-    return num.clone().iadd(this);
-};
-
-// Subtract `num` from `this` in-place
-BN.prototype.isub = function isub(num) {
-  // this - (-num) = this + num
-  if (num.sign) {
-    num.sign = false;
-    var r = this.iadd(num);
-    num.sign = true;
-    return r._normSign();
-
-  // -this - num = -(this + num)
-  } else if (this.sign) {
-    this.sign = false;
-    this.iadd(num);
-    this.sign = true;
-    return this._normSign();
-  }
-
-  // At this point both numbers are positive
-  var cmp = this.cmp(num);
-
-  // Optimization - zeroify
-  if (cmp === 0) {
-    this.sign = false;
-    this.length = 1;
-    this.words[0] = 0;
-    return this;
-  }
-
-  // a > b
-  var a;
-  var b;
-  if (cmp > 0) {
-    a = this;
-    b = num;
-  } else {
-    a = num;
-    b = this;
-  }
-
-  var carry = 0;
-  for (var i = 0; i < b.length; i++) {
-    var r = a.words[i] - b.words[i] + carry;
-    carry = r >> 26;
-    this.words[i] = r & 0x3ffffff;
-  }
-  for (; carry !== 0 && i < a.length; i++) {
-    var r = a.words[i] + carry;
-    carry = r >> 26;
-    this.words[i] = r & 0x3ffffff;
-  }
-
-  // Copy rest of the words
-  if (carry === 0 && i < a.length && a !== this)
-    for (; i < a.length; i++)
-      this.words[i] = a.words[i];
-  this.length = Math.max(this.length, i);
-
-  if (a !== this)
-    this.sign = true;
-
-  return this.strip();
-};
-
-// Subtract `num` from `this`
-BN.prototype.sub = function sub(num) {
-  return this.clone().isub(num);
-};
-
-/*
-// NOTE: This could be potentionally used to generate loop-less multiplications
-function _genCombMulTo(alen, blen) {
-  var len = alen + blen - 1;
-  var src = [
-    'var a = this.words, b = num.words, o = out.words, c = 0, w, ' +
-        'mask = 0x3ffffff, shift = 0x4000000;',
-    'out.length = ' + len + ';'
-  ];
-  for (var k = 0; k < len; k++) {
-    var minJ = Math.max(0, k - alen + 1);
-    var maxJ = Math.min(k, blen - 1);
-
-    for (var j = minJ; j <= maxJ; j++) {
-      var i = k - j;
-      var mul = 'a[' + i + '] * b[' + j + ']';
-
-      if (j === minJ) {
-        src.push('w = ' + mul + ' + c;');
-        src.push('c = (w / shift) | 0;');
-      } else {
-        src.push('w += ' + mul + ';');
-        src.push('c += (w / shift) | 0;');
-      }
-      src.push('w &= mask;');
-    }
-    src.push('o[' + k + '] = w;');
-  }
-  src.push('if (c !== 0) {',
-           '  o[' + k + '] = c;',
-           '  out.length++;',
-           '}',
-           'return out;');
-
-  return src.join('\n');
-}
-*/
-
-BN.prototype._smallMulTo = function _smallMulTo(num, out) {
-  out.sign = num.sign !== this.sign;
-  out.length = this.length + num.length;
-
-  var carry = 0;
-  for (var k = 0; k < out.length - 1; k++) {
-    // Sum all words with the same `i + j = k` and accumulate `ncarry`,
-    // note that ncarry could be >= 0x3ffffff
-    var ncarry = carry >>> 26;
-    var rword = carry & 0x3ffffff;
-    var maxJ = Math.min(k, num.length - 1);
-    for (var j = Math.max(0, k - this.length + 1); j <= maxJ; j++) {
-      var i = k - j;
-      var a = this.words[i] | 0;
-      var b = num.words[j] | 0;
-      var r = a * b;
-
-      var lo = r & 0x3ffffff;
-      ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;
-      lo = (lo + rword) | 0;
-      rword = lo & 0x3ffffff;
-      ncarry = (ncarry + (lo >>> 26)) | 0;
-    }
-    out.words[k] = rword;
-    carry = ncarry;
-  }
-  if (carry !== 0) {
-    out.words[k] = carry;
-  } else {
-    out.length--;
-  }
-
-  return out.strip();
-};
-
-BN.prototype._bigMulTo = function _bigMulTo(num, out) {
-  out.sign = num.sign !== this.sign;
-  out.length = this.length + num.length;
-
-  var carry = 0;
-  var hncarry = 0;
-  for (var k = 0; k < out.length - 1; k++) {
-    // Sum all words with the same `i + j = k` and accumulate `ncarry`,
-    // note that ncarry could be >= 0x3ffffff
-    var ncarry = hncarry;
-    hncarry = 0;
-    var rword = carry & 0x3ffffff;
-    var maxJ = Math.min(k, num.length - 1);
-    for (var j = Math.max(0, k - this.length + 1); j <= maxJ; j++) {
-      var i = k - j;
-      var a = this.words[i] | 0;
-      var b = num.words[j] | 0;
-      var r = a * b;
-
-      var lo = r & 0x3ffffff;
-      ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;
-      lo = (lo + rword) | 0;
-      rword = lo & 0x3ffffff;
-      ncarry = (ncarry + (lo >>> 26)) | 0;
-
-      hncarry += ncarry >>> 26;
-      ncarry &= 0x3ffffff;
-    }
-    out.words[k] = rword;
-    carry = ncarry;
-    ncarry = hncarry;
-  }
-  if (carry !== 0) {
-    out.words[k] = carry;
-  } else {
-    out.length--;
-  }
-
-  return out.strip();
-};
-
-BN.prototype.mulTo = function mulTo(num, out) {
-  var res;
-  if (this.length + num.length < 63)
-    res = this._smallMulTo(num, out);
-  else
-    res = this._bigMulTo(num, out);
-  return res;
-};
-
-// Multiply `this` by `num`
-BN.prototype.mul = function mul(num) {
-  var out = new BN(null);
-  out.words = new Array(this.length + num.length);
-  return this.mulTo(num, out);
-};
-
-// In-place Multiplication
-BN.prototype.imul = function imul(num) {
-  if (this.cmpn(0) === 0 || num.cmpn(0) === 0) {
-    this.words[0] = 0;
-    this.length = 1;
-    return this;
-  }
-
-  var tlen = this.length;
-  var nlen = num.length;
-
-  this.sign = num.sign !== this.sign;
-  this.length = this.length + num.length;
-  this.words[this.length - 1] = 0;
-
-  for (var k = this.length - 2; k >= 0; k--) {
-    // Sum all words with the same `i + j = k` and accumulate `carry`,
-    // note that carry could be >= 0x3ffffff
-    var carry = 0;
-    var rword = 0;
-    var maxJ = Math.min(k, nlen - 1);
-    for (var j = Math.max(0, k - tlen + 1); j <= maxJ; j++) {
-      var i = k - j;
-      var a = this.words[i];
-      var b = num.words[j];
-      var r = a * b;
-
-      var lo = r & 0x3ffffff;
-      carry += (r / 0x4000000) | 0;
-      lo += rword;
-      rword = lo & 0x3ffffff;
-      carry += lo >>> 26;
-    }
-    this.words[k] = rword;
-    this.words[k + 1] += carry;
-    carry = 0;
-  }
-
-  // Propagate overflows
-  var carry = 0;
-  for (var i = 1; i < this.length; i++) {
-    var w = this.words[i] + carry;
-    this.words[i] = w & 0x3ffffff;
-    carry = w >>> 26;
-  }
-
-  return this.strip();
-};
-
-BN.prototype.imuln = function imuln(num) {
-  assert(typeof num === 'number');
-
-  // Carry
-  var carry = 0;
-  for (var i = 0; i < this.length; i++) {
-    var w = this.words[i] * num;
-    var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);
-    carry >>= 26;
-    carry += (w / 0x4000000) | 0;
-    // NOTE: lo is 27bit maximum
-    carry += lo >>> 26;
-    this.words[i] = lo & 0x3ffffff;
-  }
-
-  if (carry !== 0) {
-    this.words[i] = carry;
-    this.length++;
-  }
-
-  return this;
-};
-
-// `this` * `this`
-BN.prototype.sqr = function sqr() {
-  return this.mul(this);
-};
-
-// `this` * `this` in-place
-BN.prototype.isqr = function isqr() {
-  return this.mul(this);
-};
-
-// Shift-left in-place
-BN.prototype.ishln = function ishln(bits) {
-  assert(typeof bits === 'number' && bits >= 0);
-  var r = bits % 26;
-  var s = (bits - r) / 26;
-  var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);
-
-  if (r !== 0) {
-    var carry = 0;
-    for (var i = 0; i < this.length; i++) {
-      var newCarry = this.words[i] & carryMask;
-      var c = (this.words[i] - newCarry) << r;
-      this.words[i] = c | carry;
-      carry = newCarry >>> (26 - r);
-    }
-    if (carry) {
-      this.words[i] = carry;
-      this.length++;
-    }
-  }
-
-  if (s !== 0) {
-    for (var i = this.length - 1; i >= 0; i--)
-      this.words[i + s] = this.words[i];
-    for (var i = 0; i < s; i++)
-      this.words[i] = 0;
-    this.length += s;
-  }
-
-  return this.strip();
-};
-
-// Shift-right in-place
-// NOTE: `hint` is a lowest bit before trailing zeroes
-// NOTE: if `extended` is present - it will be filled with destroyed bits
-BN.prototype.ishrn = function ishrn(bits, hint, extended) {
-  assert(typeof bits === 'number' && bits >= 0);
-  var h;
-  if (hint)
-    h = (hint - (hint % 26)) / 26;
-  else
-    h = 0;
-
-  var r = bits % 26;
-  var s = Math.min((bits - r) / 26, this.length);
-  var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
-  var maskedWords = extended;
-
-  h -= s;
-  h = Math.max(0, h);
-
-  // Extended mode, copy masked part
-  if (maskedWords) {
-    for (var i = 0; i < s; i++)
-      maskedWords.words[i] = this.words[i];
-    maskedWords.length = s;
-  }
-
-  if (s === 0) {
-    // No-op, we should not move anything at all
-  } else if (this.length > s) {
-    this.length -= s;
-    for (var i = 0; i < this.length; i++)
-      this.words[i] = this.words[i + s];
-  } else {
-    this.words[0] = 0;
-    this.length = 1;
-  }
-
-  var carry = 0;
-  for (var i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {
-    var word = this.words[i];
-    this.words[i] = (carry << (26 - r)) | (word >>> r);
-    carry = word & mask;
-  }
-
-  // Push carried bits as a mask
-  if (maskedWords && carry !== 0)
-    maskedWords.words[maskedWords.length++] = carry;
-
-  if (this.length === 0) {
-    this.words[0] = 0;
-    this.length = 1;
-  }
-
-  this.strip();
-
-  return this;
-};
-
-// Shift-left
-BN.prototype.shln = function shln(bits) {
-  return this.clone().ishln(bits);
-};
-
-// Shift-right
-BN.prototype.shrn = function shrn(bits) {
-  return this.clone().ishrn(bits);
-};
-
-// Test if n bit is set
-BN.prototype.testn = function testn(bit) {
-  assert(typeof bit === 'number' && bit >= 0);
-  var r = bit % 26;
-  var s = (bit - r) / 26;
-  var q = 1 << r;
-
-  // Fast case: bit is much higher than all existing words
-  if (this.length <= s) {
-    return false;
-  }
-
-  // Check bit and return
-  var w = this.words[s];
-
-  return !!(w & q);
-};
-
-// Return only lowers bits of number (in-place)
-BN.prototype.imaskn = function imaskn(bits) {
-  assert(typeof bits === 'number' && bits >= 0);
-  var r = bits % 26;
-  var s = (bits - r) / 26;
-
-  assert(!this.sign, 'imaskn works only with positive numbers');
-
-  if (r !== 0)
-    s++;
-  this.length = Math.min(s, this.length);
-
-  if (r !== 0) {
-    var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
-    this.words[this.length - 1] &= mask;
-  }
-
-  return this.strip();
-};
-
-// Return only lowers bits of number
-BN.prototype.maskn = function maskn(bits) {
-  return this.clone().imaskn(bits);
-};
-
-// Add plain number `num` to `this`
-BN.prototype.iaddn = function iaddn(num) {
-  assert(typeof num === 'number');
-  if (num < 0)
-    return this.isubn(-num);
-
-  // Possible sign change
-  if (this.sign) {
-    if (this.length === 1 && this.words[0] < num) {
-      this.words[0] = num - this.words[0];
-      this.sign = false;
-      return this;
-    }
-
-    this.sign = false;
-    this.isubn(num);
-    this.sign = true;
-    return this;
-  }
-
-  // Add without checks
-  return this._iaddn(num);
-};
-
-BN.prototype._iaddn = function _iaddn(num) {
-  this.words[0] += num;
-
-  // Carry
-  for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {
-    this.words[i] -= 0x4000000;
-    if (i === this.length - 1)
-      this.words[i + 1] = 1;
-    else
-      this.words[i + 1]++;
-  }
-  this.length = Math.max(this.length, i + 1);
-
-  return this;
-};
-
-// Subtract plain number `num` from `this`
-BN.prototype.isubn = function isubn(num) {
-  assert(typeof num === 'number');
-  if (num < 0)
-    return this.iaddn(-num);
-
-  if (this.sign) {
-    this.sign = false;
-    this.iaddn(num);
-    this.sign = true;
-    return this;
-  }
-
-  this.words[0] -= num;
-
-  // Carry
-  for (var i = 0; i < this.length && this.words[i] < 0; i++) {
-    this.words[i] += 0x4000000;
-    this.words[i + 1] -= 1;
-  }
-
-  return this.strip();
-};
-
-BN.prototype.addn = function addn(num) {
-  return this.clone().iaddn(num);
-};
-
-BN.prototype.subn = function subn(num) {
-  return this.clone().isubn(num);
-};
-
-BN.prototype.iabs = function iabs() {
-  this.sign = false;
-
-  return this;
-};
-
-BN.prototype.abs = function abs() {
-  return this.clone().iabs();
-};
-
-BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) {
-  // Bigger storage is needed
-  var len = num.length + shift;
-  var i;
-  if (this.words.length < len) {
-    var t = new Array(len);
-    for (var i = 0; i < this.length; i++)
-      t[i] = this.words[i];
-    this.words = t;
-  } else {
-    i = this.length;
-  }
-
-  // Zeroify rest
-  this.length = Math.max(this.length, len);
-  for (; i < this.length; i++)
-    this.words[i] = 0;
-
-  var carry = 0;
-  for (var i = 0; i < num.length; i++) {
-    var w = this.words[i + shift] + carry;
-    var right = num.words[i] * mul;
-    w -= right & 0x3ffffff;
-    carry = (w >> 26) - ((right / 0x4000000) | 0);
-    this.words[i + shift] = w & 0x3ffffff;
-  }
-  for (; i < this.length - shift; i++) {
-    var w = this.words[i + shift] + carry;
-    carry = w >> 26;
-    this.words[i + shift] = w & 0x3ffffff;
-  }
-
-  if (carry === 0)
-    return this.strip();
-
-  // Subtraction overflow
-  assert(carry === -1);
-  carry = 0;
-  for (var i = 0; i < this.length; i++) {
-    var w = -this.words[i] + carry;
-    carry = w >> 26;
-    this.words[i] = w & 0x3ffffff;
-  }
-  this.sign = true;
-
-  return this.strip();
-};
-
-BN.prototype._wordDiv = function _wordDiv(num, mode) {
-  var shift = this.length - num.length;
-
-  var a = this.clone();
-  var b = num;
-
-  // Normalize
-  var bhi = b.words[b.length - 1];
-  var bhiBits = this._countBits(bhi);
-  shift = 26 - bhiBits;
-  if (shift !== 0) {
-    b = b.shln(shift);
-    a.ishln(shift);
-    bhi = b.words[b.length - 1];
-  }
-
-  // Initialize quotient
-  var m = a.length - b.length;
-  var q;
-
-  if (mode !== 'mod') {
-    q = new BN(null);
-    q.length = m + 1;
-    q.words = new Array(q.length);
-    for (var i = 0; i < q.length; i++)
-      q.words[i] = 0;
-  }
-
-  var diff = a.clone()._ishlnsubmul(b, 1, m);
-  if (!diff.sign) {
-    a = diff;
-    if (q)
-      q.words[m] = 1;
-  }
-
-  for (var j = m - 1; j >= 0; j--) {
-    var qj = a.words[b.length + j] * 0x4000000 + a.words[b.length + j - 1];
-
-    // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max
-    // (0x7ffffff)
-    qj = Math.min((qj / bhi) | 0, 0x3ffffff);
-
-    a._ishlnsubmul(b, qj, j);
-    while (a.sign) {
-      qj--;
-      a.sign = false;
-      a._ishlnsubmul(b, 1, j);
-      a.sign = !a.sign;
-    }
-    if (q)
-      q.words[j] = qj;
-  }
-  if (q)
-    q.strip();
-  a.strip();
-
-  // Denormalize
-  if (mode !== 'div' && shift !== 0)
-    a.ishrn(shift);
-  return { div: q ? q : null, mod: a };
-};
-
-BN.prototype.divmod = function divmod(num, mode) {
-  assert(num.cmpn(0) !== 0);
-
-  if (this.sign && !num.sign) {
-    var res = this.neg().divmod(num, mode);
-    var div;
-    var mod;
-    if (mode !== 'mod')
-      div = res.div.neg();
-    if (mode !== 'div')
-      mod = res.mod.cmpn(0) === 0 ? res.mod : num.sub(res.mod);
-    return {
-      div: div,
-      mod: mod
-    };
-  } else if (!this.sign && num.sign) {
-    var res = this.divmod(num.neg(), mode);
-    var div;
-    if (mode !== 'mod')
-      div = res.div.neg();
-    return { div: div, mod: res.mod };
-  } else if (this.sign && num.sign) {
-    return this.neg().divmod(num.neg(), mode);
-  }
-
-  // Both numbers are positive at this point
-
-  // Strip both numbers to approximate shift value
-  if (num.length > this.length || this.cmp(num) < 0)
-    return { div: new BN(0), mod: this };
-
-  // Very short reduction
-  if (num.length === 1) {
-    if (mode === 'div')
-      return { div: this.divn(num.words[0]), mod: null };
-    else if (mode === 'mod')
-      return { div: null, mod: new BN(this.modn(num.words[0])) };
-    return {
-      div: this.divn(num.words[0]),
-      mod: new BN(this.modn(num.words[0]))
-    };
-  }
-
-  return this._wordDiv(num, mode);
-};
-
-// Find `this` / `num`
-BN.prototype.div = function div(num) {
-  return this.divmod(num, 'div').div;
-};
-
-// Find `this` % `num`
-BN.prototype.mod = function mod(num) {
-  return this.divmod(num, 'mod').mod;
-};
-
-// Find Round(`this` / `num`)
-BN.prototype.divRound = function divRound(num) {
-  var dm = this.divmod(num);
-
-  // Fast case - exact division
-  if (dm.mod.cmpn(0) === 0)
-    return dm.div;
-
-  var mod = dm.div.sign ? dm.mod.isub(num) : dm.mod;
-
-  var half = num.shrn(1);
-  var r2 = num.andln(1);
-  var cmp = mod.cmp(half);
-
-  // Round down
-  if (cmp < 0 || r2 === 1 && cmp === 0)
-    return dm.div;
-
-  // Round up
-  return dm.div.sign ? dm.div.isubn(1) : dm.div.iaddn(1);
-};
-
-BN.prototype.modn = function modn(num) {
-  assert(num <= 0x3ffffff);
-  var p = (1 << 26) % num;
-
-  var acc = 0;
-  for (var i = this.length - 1; i >= 0; i--)
-    acc = (p * acc + this.words[i]) % num;
-
-  return acc;
-};
-
-// In-place division by number
-BN.prototype.idivn = function idivn(num) {
-  assert(num <= 0x3ffffff);
-
-  var carry = 0;
-  for (var i = this.length - 1; i >= 0; i--) {
-    var w = this.words[i] + carry * 0x4000000;
-    this.words[i] = (w / num) | 0;
-    carry = w % num;
-  }
-
-  return this.strip();
-};
-
-BN.prototype.divn = function divn(num) {
-  return this.clone().idivn(num);
-};
-
-BN.prototype.egcd = function egcd(p) {
-  assert(!p.sign);
-  assert(p.cmpn(0) !== 0);
-
-  var x = this;
-  var y = p.clone();
-
-  if (x.sign)
-    x = x.mod(p);
-  else
-    x = x.clone();
-
-  // A * x + B * y = x
-  var A = new BN(1);
-  var B = new BN(0);
-
-  // C * x + D * y = y
-  var C = new BN(0);
-  var D = new BN(1);
-
-  var g = 0;
-
-  while (x.isEven() && y.isEven()) {
-    x.ishrn(1);
-    y.ishrn(1);
-    ++g;
-  }
-
-  var yp = y.clone();
-  var xp = x.clone();
-
-  while (x.cmpn(0) !== 0) {
-    while (x.isEven()) {
-      x.ishrn(1);
-      if (A.isEven() && B.isEven()) {
-        A.ishrn(1);
-        B.ishrn(1);
-      } else {
-        A.iadd(yp).ishrn(1);
-        B.isub(xp).ishrn(1);
-      }
-    }
-
-    while (y.isEven()) {
-      y.ishrn(1);
-      if (C.isEven() && D.isEven()) {
-        C.ishrn(1);
-        D.ishrn(1);
-      } else {
-        C.iadd(yp).ishrn(1);
-        D.isub(xp).ishrn(1);
-      }
-    }
-
-    if (x.cmp(y) >= 0) {
-      x.isub(y);
-      A.isub(C);
-      B.isub(D);
-    } else {
-      y.isub(x);
-      C.isub(A);
-      D.isub(B);
-    }
-  }
-
-  return {
-    a: C,
-    b: D,
-    gcd: y.ishln(g)
-  };
-};
-
-// This is reduced incarnation of the binary EEA
-// above, designated to invert members of the
-// _prime_ fields F(p) at a maximal speed
-BN.prototype._invmp = function _invmp(p) {
-  assert(!p.sign);
-  assert(p.cmpn(0) !== 0);
-
-  var a = this;
-  var b = p.clone();
-
-  if (a.sign)
-    a = a.mod(p);
-  else
-    a = a.clone();
-
-  var x1 = new BN(1);
-  var x2 = new BN(0);
-
-  var delta = b.clone();
-
-  while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
-    while (a.isEven()) {
-      a.ishrn(1);
-      if (x1.isEven())
-        x1.ishrn(1);
-      else
-        x1.iadd(delta).ishrn(1);
-    }
-    while (b.isEven()) {
-      b.ishrn(1);
-      if (x2.isEven())
-        x2.ishrn(1);
-      else
-        x2.iadd(delta).ishrn(1);
-    }
-    if (a.cmp(b) >= 0) {
-      a.isub(b);
-      x1.isub(x2);
-    } else {
-      b.isub(a);
-      x2.isub(x1);
-    }
-  }
-  if (a.cmpn(1) === 0)
-    return x1;
-  else
-    return x2;
-};
-
-BN.prototype.gcd = function gcd(num) {
-  if (this.cmpn(0) === 0)
-    return num.clone();
-  if (num.cmpn(0) === 0)
-    return this.clone();
-
-  var a = this.clone();
-  var b = num.clone();
-  a.sign = false;
-  b.sign = false;
-
-  // Remove common factor of two
-  for (var shift = 0; a.isEven() && b.isEven(); shift++) {
-    a.ishrn(1);
-    b.ishrn(1);
-  }
-
-  do {
-    while (a.isEven())
-      a.ishrn(1);
-    while (b.isEven())
-      b.ishrn(1);
-
-    var r = a.cmp(b);
-    if (r < 0) {
-      // Swap `a` and `b` to make `a` always bigger than `b`
-      var t = a;
-      a = b;
-      b = t;
-    } else if (r === 0 || b.cmpn(1) === 0) {
-      break;
-    }
-
-    a.isub(b);
-  } while (true);
-
-  return b.ishln(shift);
-};
-
-// Invert number in the field F(num)
-BN.prototype.invm = function invm(num) {
-  return this.egcd(num).a.mod(num);
-};
-
-BN.prototype.isEven = function isEven() {
-  return (this.words[0] & 1) === 0;
-};
-
-BN.prototype.isOdd = function isOdd() {
-  return (this.words[0] & 1) === 1;
-};
-
-// And first word and num
-BN.prototype.andln = function andln(num) {
-  return this.words[0] & num;
-};
-
-// Increment at the bit position in-line
-BN.prototype.bincn = function bincn(bit) {
-  assert(typeof bit === 'number');
-  var r = bit % 26;
-  var s = (bit - r) / 26;
-  var q = 1 << r;
-
-  // Fast case: bit is much higher than all existing words
-  if (this.length <= s) {
-    for (var i = this.length; i < s + 1; i++)
-      this.words[i] = 0;
-    this.words[s] |= q;
-    this.length = s + 1;
-    return this;
-  }
-
-  // Add bit and propagate, if needed
-  var carry = q;
-  for (var i = s; carry !== 0 && i < this.length; i++) {
-    var w = this.words[i];
-    w += carry;
-    carry = w >>> 26;
-    w &= 0x3ffffff;
-    this.words[i] = w;
-  }
-  if (carry !== 0) {
-    this.words[i] = carry;
-    this.length++;
-  }
-  return this;
-};
-
-BN.prototype.cmpn = function cmpn(num) {
-  var sign = num < 0;
-  if (sign)
-    num = -num;
-
-  if (this.sign && !sign)
-    return -1;
-  else if (!this.sign && sign)
-    return 1;
-
-  num &= 0x3ffffff;
-  this.strip();
-
-  var res;
-  if (this.length > 1) {
-    res = 1;
-  } else {
-    var w = this.words[0];
-    res = w === num ? 0 : w < num ? -1 : 1;
-  }
-  if (this.sign)
-    res = -res;
-  return res;
-};
-
-// Compare two numbers and return:
-// 1 - if `this` > `num`
-// 0 - if `this` == `num`
-// -1 - if `this` < `num`
-BN.prototype.cmp = function cmp(num) {
-  if (this.sign && !num.sign)
-    return -1;
-  else if (!this.sign && num.sign)
-    return 1;
-
-  var res = this.ucmp(num);
-  if (this.sign)
-    return -res;
-  else
-    return res;
-};
-
-// Unsigned comparison
-BN.prototype.ucmp = function ucmp(num) {
-  // At this point both numbers have the same sign
-  if (this.length > num.length)
-    return 1;
-  else if (this.length < num.length)
-    return -1;
-
-  var res = 0;
-  for (var i = this.length - 1; i >= 0; i--) {
-    var a = this.words[i];
-    var b = num.words[i];
-
-    if (a === b)
-      continue;
-    if (a < b)
-      res = -1;
-    else if (a > b)
-      res = 1;
-    break;
-  }
-  return res;
-};
-
-//
-// A reduce context, could be using montgomery or something better, depending
-// on the `m` itself.
-//
-BN.red = function red(num) {
-  return new Red(num);
-};
-
-BN.prototype.toRed = function toRed(ctx) {
-  assert(!this.red, 'Already a number in reduction context');
-  assert(!this.sign, 'red works only with positives');
-  return ctx.convertTo(this)._forceRed(ctx);
-};
-
-BN.prototype.fromRed = function fromRed() {
-  assert(this.red, 'fromRed works only with numbers in reduction context');
-  return this.red.convertFrom(this);
-};
-
-BN.prototype._forceRed = function _forceRed(ctx) {
-  this.red = ctx;
-  return this;
-};
-
-BN.prototype.forceRed = function forceRed(ctx) {
-  assert(!this.red, 'Already a number in reduction context');
-  return this._forceRed(ctx);
-};
-
-BN.prototype.redAdd = function redAdd(num) {
-  assert(this.red, 'redAdd works only with red numbers');
-  return this.red.add(this, num);
-};
-
-BN.prototype.redIAdd = function redIAdd(num) {
-  assert(this.red, 'redIAdd works only with red numbers');
-  return this.red.iadd(this, num);
-};
-
-BN.prototype.redSub = function redSub(num) {
-  assert(this.red, 'redSub works only with red numbers');
-  return this.red.sub(this, num);
-};
-
-BN.prototype.redISub = function redISub(num) {
-  assert(this.red, 'redISub works only with red numbers');
-  return this.red.isub(this, num);
-};
-
-BN.prototype.redShl = function redShl(num) {
-  assert(this.red, 'redShl works only with red numbers');
-  return this.red.shl(this, num);
-};
-
-BN.prototype.redMul = function redMul(num) {
-  assert(this.red, 'redMul works only with red numbers');
-  this.red._verify2(this, num);
-  return this.red.mul(this, num);
-};
-
-BN.prototype.redIMul = function redIMul(num) {
-  assert(this.red, 'redMul works only with red numbers');
-  this.red._verify2(this, num);
-  return this.red.imul(this, num);
-};
-
-BN.prototype.redSqr = function redSqr() {
-  assert(this.red, 'redSqr works only with red numbers');
-  this.red._verify1(this);
-  return this.red.sqr(this);
-};
-
-BN.prototype.redISqr = function redISqr() {
-  assert(this.red, 'redISqr works only with red numbers');
-  this.red._verify1(this);
-  return this.red.isqr(this);
-};
-
-// Square root over p
-BN.prototype.redSqrt = function redSqrt() {
-  assert(this.red, 'redSqrt works only with red numbers');
-  this.red._verify1(this);
-  return this.red.sqrt(this);
-};
-
-BN.prototype.redInvm = function redInvm() {
-  assert(this.red, 'redInvm works only with red numbers');
-  this.red._verify1(this);
-  return this.red.invm(this);
-};
-
-// Return negative clone of `this` % `red modulo`
-BN.prototype.redNeg = function redNeg() {
-  assert(this.red, 'redNeg works only with red numbers');
-  this.red._verify1(this);
-  return this.red.neg(this);
-};
-
-BN.prototype.redPow = function redPow(num) {
-  assert(this.red && !num.red, 'redPow(normalNum)');
-  this.red._verify1(this);
-  return this.red.pow(this, num);
-};
-
-// Prime numbers with efficient reduction
-var primes = {
-  k256: null,
-  p224: null,
-  p192: null,
-  p25519: null
-};
-
-// Pseudo-Mersenne prime
-function MPrime(name, p) {
-  // P = 2 ^ N - K
-  this.name = name;
-  this.p = new BN(p, 16);
-  this.n = this.p.bitLength();
-  this.k = new BN(1).ishln(this.n).isub(this.p);
-
-  this.tmp = this._tmp();
-}
-
-MPrime.prototype._tmp = function _tmp() {
-  var tmp = new BN(null);
-  tmp.words = new Array(Math.ceil(this.n / 13));
-  return tmp;
-};
-
-MPrime.prototype.ireduce = function ireduce(num) {
-  // Assumes that `num` is less than `P^2`
-  // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)
-  var r = num;
-  var rlen;
-
-  do {
-    this.split(r, this.tmp);
-    r = this.imulK(r);
-    r = r.iadd(this.tmp);
-    rlen = r.bitLength();
-  } while (rlen > this.n);
-
-  var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
-  if (cmp === 0) {
-    r.words[0] = 0;
-    r.length = 1;
-  } else if (cmp > 0) {
-    r.isub(this.p);
-  } else {
-    r.strip();
-  }
-
-  return r;
-};
-
-MPrime.prototype.split = function split(input, out) {
-  input.ishrn(this.n, 0, out);
-};
-
-MPrime.prototype.imulK = function imulK(num) {
-  return num.imul(this.k);
-};
-
-function K256() {
-  MPrime.call(
-    this,
-    'k256',
-    'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');
-}
-inherits(K256, MPrime);
-
-K256.prototype.split = function split(input, output) {
-  // 256 = 9 * 26 + 22
-  var mask = 0x3fffff;
-
-  var outLen = Math.min(input.length, 9);
-  for (var i = 0; i < outLen; i++)
-    output.words[i] = input.words[i];
-  output.length = outLen;
-
-  if (input.length <= 9) {
-    input.words[0] = 0;
-    input.length = 1;
-    return;
-  }
-
-  // Shift by 9 limbs
-  var prev = input.words[9];
-  output.words[output.length++] = prev & mask;
-
-  for (var i = 10; i < input.length; i++) {
-    var next = input.words[i];
-    input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);
-    prev = next;
-  }
-  input.words[i - 10] = prev >>> 22;
-  input.length -= 9;
-};
-
-K256.prototype.imulK = function imulK(num) {
-  // K = 0x1000003d1 = [ 0x40, 0x3d1 ]
-  num.words[num.length] = 0;
-  num.words[num.length + 1] = 0;
-  num.length += 2;
-
-  // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390
-  var hi;
-  var lo = 0;
-  for (var i = 0; i < num.length; i++) {
-    var w = num.words[i];
-    hi = w * 0x40;
-    lo += w * 0x3d1;
-    hi += (lo / 0x4000000) | 0;
-    lo &= 0x3ffffff;
-
-    num.words[i] = lo;
-
-    lo = hi;
-  }
-
-  // Fast length reduction
-  if (num.words[num.length - 1] === 0) {
-    num.length--;
-    if (num.words[num.length - 1] === 0)
-      num.length--;
-  }
-  return num;
-};
-
-function P224() {
-  MPrime.call(
-    this,
-    'p224',
-    'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');
-}
-inherits(P224, MPrime);
-
-function P192() {
-  MPrime.call(
-    this,
-    'p192',
-    'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');
-}
-inherits(P192, MPrime);
-
-function P25519() {
-  // 2 ^ 255 - 19
-  MPrime.call(
-    this,
-    '25519',
-    '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');
-}
-inherits(P25519, MPrime);
-
-P25519.prototype.imulK = function imulK(num) {
-  // K = 0x13
-  var carry = 0;
-  for (var i = 0; i < num.length; i++) {
-    var hi = num.words[i] * 0x13 + carry;
-    var lo = hi & 0x3ffffff;
-    hi >>>= 26;
-
-    num.words[i] = lo;
-    carry = hi;
-  }
-  if (carry !== 0)
-    num.words[num.length++] = carry;
-  return num;
-};
-
-// Exported mostly for testing purposes, use plain name instead
-BN._prime = function prime(name) {
-  // Cached version of prime
-  if (primes[name])
-    return primes[name];
-
-  var prime;
-  if (name === 'k256')
-    prime = new K256();
-  else if (name === 'p224')
-    prime = new P224();
-  else if (name === 'p192')
-    prime = new P192();
-  else if (name === 'p25519')
-    prime = new P25519();
-  else
-    throw new Error('Unknown prime ' + name);
-  primes[name] = prime;
-
-  return prime;
-};
-
-//
-// Base reduction engine
-//
-function Red(m) {
-  if (typeof m === 'string') {
-    var prime = BN._prime(m);
-    this.m = prime.p;
-    this.prime = prime;
-  } else {
-    this.m = m;
-    this.prime = null;
-  }
-}
-
-Red.prototype._verify1 = function _verify1(a) {
-  assert(!a.sign, 'red works only with positives');
-  assert(a.red, 'red works only with red numbers');
-};
-
-Red.prototype._verify2 = function _verify2(a, b) {
-  assert(!a.sign && !b.sign, 'red works only with positives');
-  assert(a.red && a.red === b.red,
-         'red works only with red numbers');
-};
-
-Red.prototype.imod = function imod(a) {
-  if (this.prime)
-    return this.prime.ireduce(a)._forceRed(this);
-  return a.mod(this.m)._forceRed(this);
-};
-
-Red.prototype.neg = function neg(a) {
-  var r = a.clone();
-  r.sign = !r.sign;
-  return r.iadd(this.m)._forceRed(this);
-};
-
-Red.prototype.add = function add(a, b) {
-  this._verify2(a, b);
-
-  var res = a.add(b);
-  if (res.cmp(this.m) >= 0)
-    res.isub(this.m);
-  return res._forceRed(this);
-};
-
-Red.prototype.iadd = function iadd(a, b) {
-  this._verify2(a, b);
-
-  var res = a.iadd(b);
-  if (res.cmp(this.m) >= 0)
-    res.isub(this.m);
-  return res;
-};
-
-Red.prototype.sub = function sub(a, b) {
-  this._verify2(a, b);
-
-  var res = a.sub(b);
-  if (res.cmpn(0) < 0)
-    res.iadd(this.m);
-  return res._forceRed(this);
-};
-
-Red.prototype.isub = function isub(a, b) {
-  this._verify2(a, b);
-
-  var res = a.isub(b);
-  if (res.cmpn(0) < 0)
-    res.iadd(this.m);
-  return res;
-};
-
-Red.prototype.shl = function shl(a, num) {
-  this._verify1(a);
-  return this.imod(a.shln(num));
-};
-
-Red.prototype.imul = function imul(a, b) {
-  this._verify2(a, b);
-  return this.imod(a.imul(b));
-};
-
-Red.prototype.mul = function mul(a, b) {
-  this._verify2(a, b);
-  return this.imod(a.mul(b));
-};
-
-Red.prototype.isqr = function isqr(a) {
-  return this.imul(a, a);
-};
-
-Red.prototype.sqr = function sqr(a) {
-  return this.mul(a, a);
-};
-
-Red.prototype.sqrt = function sqrt(a) {
-  if (a.cmpn(0) === 0)
-    return a.clone();
-
-  var mod3 = this.m.andln(3);
-  assert(mod3 % 2 === 1);
-
-  // Fast case
-  if (mod3 === 3) {
-    var pow = this.m.add(new BN(1)).ishrn(2);
-    var r = this.pow(a, pow);
-    return r;
-  }
-
-  // Tonelli-Shanks algorithm (Totally unoptimized and slow)
-  //
-  // Find Q and S, that Q * 2 ^ S = (P - 1)
-  var q = this.m.subn(1);
-  var s = 0;
-  while (q.cmpn(0) !== 0 && q.andln(1) === 0) {
-    s++;
-    q.ishrn(1);
-  }
-  assert(q.cmpn(0) !== 0);
-
-  var one = new BN(1).toRed(this);
-  var nOne = one.redNeg();
-
-  // Find quadratic non-residue
-  // NOTE: Max is such because of generalized Riemann hypothesis.
-  var lpow = this.m.subn(1).ishrn(1);
-  var z = this.m.bitLength();
-  z = new BN(2 * z * z).toRed(this);
-  while (this.pow(z, lpow).cmp(nOne) !== 0)
-    z.redIAdd(nOne);
-
-  var c = this.pow(z, q);
-  var r = this.pow(a, q.addn(1).ishrn(1));
-  var t = this.pow(a, q);
-  var m = s;
-  while (t.cmp(one) !== 0) {
-    var tmp = t;
-    for (var i = 0; tmp.cmp(one) !== 0; i++)
-      tmp = tmp.redSqr();
-    assert(i < m);
-    var b = this.pow(c, new BN(1).ishln(m - i - 1));
-
-    r = r.redMul(b);
-    c = b.redSqr();
-    t = t.redMul(c);
-    m = i;
-  }
-
-  return r;
-};
-
-Red.prototype.invm = function invm(a) {
-  var inv = a._invmp(this.m);
-  if (inv.sign) {
-    inv.sign = false;
-    return this.imod(inv).redNeg();
-  } else {
-    return this.imod(inv);
-  }
-};
-
-Red.prototype.pow = function pow(a, num) {
-  var w = [];
-  var q = num.clone();
-  while (q.cmpn(0) !== 0) {
-    w.push(q.andln(1));
-    q.ishrn(1);
-  }
-
-  // Skip leading zeroes
-  var res = a;
-  for (var i = 0; i < w.length; i++, res = this.sqr(res))
-    if (w[i] !== 0)
-      break;
-
-  if (++i < w.length) {
-    for (var q = this.sqr(res); i < w.length; i++, q = this.sqr(q)) {
-      if (w[i] === 0)
-        continue;
-      res = this.mul(res, q);
-    }
-  }
-
-  return res;
-};
-
-Red.prototype.convertTo = function convertTo(num) {
-  return num.clone();
-};
-
-Red.prototype.convertFrom = function convertFrom(num) {
-  var res = num.clone();
-  res.red = null;
-  return res;
-};
-
-//
-// Montgomery method engine
-//
-
-BN.mont = function mont(num) {
-  return new Mont(num);
-};
-
-function Mont(m) {
-  Red.call(this, m);
-
-  this.shift = this.m.bitLength();
-  if (this.shift % 26 !== 0)
-    this.shift += 26 - (this.shift % 26);
-  this.r = new BN(1).ishln(this.shift);
-  this.r2 = this.imod(this.r.sqr());
-  this.rinv = this.r._invmp(this.m);
-
-  this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);
-  this.minv.sign = true;
-  this.minv = this.minv.mod(this.r);
-}
-inherits(Mont, Red);
-
-Mont.prototype.convertTo = function convertTo(num) {
-  return this.imod(num.shln(this.shift));
-};
-
-Mont.prototype.convertFrom = function convertFrom(num) {
-  var r = this.imod(num.mul(this.rinv));
-  r.red = null;
-  return r;
-};
-
-Mont.prototype.imul = function imul(a, b) {
-  if (a.cmpn(0) === 0 || b.cmpn(0) === 0) {
-    a.words[0] = 0;
-    a.length = 1;
-    return a;
-  }
-
-  var t = a.imul(b);
-  var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
-  var u = t.isub(c).ishrn(this.shift);
-  var res = u;
-  if (u.cmp(this.m) >= 0)
-    res = u.isub(this.m);
-  else if (u.cmpn(0) < 0)
-    res = u.iadd(this.m);
-
-  return res._forceRed(this);
-};
-
-Mont.prototype.mul = function mul(a, b) {
-  if (a.cmpn(0) === 0 || b.cmpn(0) === 0)
-    return new BN(0)._forceRed(this);
-
-  var t = a.mul(b);
-  var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
-  var u = t.isub(c).ishrn(this.shift);
-  var res = u;
-  if (u.cmp(this.m) >= 0)
-    res = u.isub(this.m);
-  else if (u.cmpn(0) < 0)
-    res = u.iadd(this.m);
-
-  return res._forceRed(this);
-};
-
-Mont.prototype.invm = function invm(a) {
-  // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R
-  var res = this.imod(a._invmp(this.m).mul(this.r2));
-  return res._forceRed(this);
-};
-
-})(typeof module === 'undefined' || module, this);
diff --git a/node_modules/bn.js/package.json b/node_modules/bn.js/package.json
deleted file mode 100644
index a71cfac069a28121d6696d27900b5f6ee63c838d..0000000000000000000000000000000000000000
--- a/node_modules/bn.js/package.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "name": "bn.js",
-  "version": "2.0.0",
-  "description": "Big number implementation in pure javascript",
-  "main": "lib/bn.js",
-  "scripts": {
-    "test": "jscs lib/*.js test/*.js && jshint lib/*.js && mocha --reporter=spec test/*-test.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git@github.com:indutny/bn.js"
-  },
-  "keywords": [
-    "BN",
-    "BigNum",
-    "Big number",
-    "Modulo",
-    "Montgomery"
-  ],
-  "author": "Fedor Indutny <fedor@indutny.com>",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/indutny/bn.js/issues"
-  },
-  "homepage": "https://github.com/indutny/bn.js",
-  "devDependencies": {
-    "istanbul": "^0.3.5",
-    "jscs": "^1.11.1",
-    "jshint": "^2.6.0",
-    "mocha": "^2.1.0"
-  }
-}
diff --git a/node_modules/bn.js/test/arithmetic-test.js b/node_modules/bn.js/test/arithmetic-test.js
deleted file mode 100644
index ad012301c9fbaa5c1af9cd1dbe8829a05ef1fd7d..0000000000000000000000000000000000000000
--- a/node_modules/bn.js/test/arithmetic-test.js
+++ /dev/null
@@ -1,386 +0,0 @@
-var assert = require('assert');
-var BN = require('../').BN;
-var fixtures = require('./fixtures');
-
-describe('BN.js/Arithmetic', function() {
-  describe('.add()', function() {
-    it('should add numbers', function() {
-      assert.equal(new BN(14).add(new BN(26)).toString(16), '28');
-      var k = new BN(0x1234);
-      var r = k;
-      for (var i = 0; i < 257; i++)
-        r = r.add(k);
-      assert.equal(r.toString(16), '125868');
-    });
-
-    it('should handle carry properly (in-place)', function() {
-      var k = new BN('abcdefabcdefabcdef', 16);
-      var r = new BN('deadbeef', 16);
-      for (var i = 0; i < 257; i++)
-        r.iadd(k);
-      assert.equal(r.toString(16), 'ac79bd9b79be7a277bde');
-    });
-
-    it('should properly do positive + negative', function() {
-      var a = new BN('abcd', 16);
-      var b = new BN('-abce', 16);
-
-      assert.equal(a.iadd(b).toString(16), '-1');
-
-      var a = new BN('abcd', 16);
-      var b = new BN('-abce', 16);
-
-      assert.equal(a.add(b).toString(16), '-1');
-      assert.equal(b.add(a).toString(16), '-1');
-    });
-  });
-
-  describe('.iaddn()', function() {
-    it('should allow a sign change', function() {
-      var a = new BN(-100);
-      assert.equal(a.sign, true);
-
-      a.iaddn(200);
-
-      assert.equal(a.sign, false);
-      assert.equal(a.toString(), '100');
-    });
-
-    it('should add negative number', function() {
-      var a = new BN(-100);
-      assert.equal(a.sign, true);
-
-      a.iaddn(-200);
-
-      assert.equal(a.toString(), '-300');
-    });
-
-    it('should allow neg + pos with big number', function() {
-      var a = new BN('-1000000000', 10);
-      assert.equal(a.sign, true);
-
-      a.iaddn(200);
-
-      assert.equal(a.toString(), '-999999800');
-    });
-
-    it('should carry limb', function() {
-      var a = new BN('3ffffff', 16);
-
-      assert.equal(a.iaddn(1).toString(16), '4000000');
-    });
-  });
-
-  describe('.sub()', function() {
-    it('should subtract small numbers', function() {
-      assert.equal(new BN(26).sub(new BN(14)).toString(16), 'c');
-      assert.equal(new BN(14).sub(new BN(26)).toString(16), '-c');
-      assert.equal(new BN(26).sub(new BN(26)).toString(16), '0');
-      assert.equal(new BN(-26).sub(new BN(26)).toString(16), '-34');
-    });
-
-    var a = new BN(
-      '31ff3c61db2db84b9823d320907a573f6ad37c437abe458b1802cda041d6384' +
-          'a7d8daef41395491e2',
-      16);
-    var b = new BN(
-      '6f0e4d9f1d6071c183677f601af9305721c91d31b0bbbae8fb790000',
-      16);
-    var r = new BN(
-      '31ff3c61db2db84b9823d3208989726578fd75276287cd9516533a9acfb9a67' +
-          '76281f34583ddb91e2',
-      16);
-
-    it('should subtract big numbers', function() {
-      assert.equal(a.sub(b).cmp(r), 0);
-    });
-
-    it('should subtract numbers in place', function() {
-      assert.equal(b.clone().isub(a).neg().cmp(r), 0);
-    });
-
-    it('should subtract with carry', function() {
-      // Carry and copy
-      var a = new BN('12345', 16);
-      var b = new BN('1000000000000', 16);
-      assert.equal(a.isub(b).toString(16), '-fffffffedcbb');
-
-      var a = new BN('12345', 16);
-      var b = new BN('1000000000000', 16);
-      assert.equal(b.isub(a).toString(16), 'fffffffedcbb');
-    });
-  });
-
-  describe('.isubn()', function() {
-    it('should subtract negative number', function() {
-      var r = new BN(
-        '7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b', 16);
-      assert.equal(r.isubn(-1).toString(16),
-        '7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681c');
-    });
-
-    it('should work for positive numbers', function() {
-      var a = new BN(-100);
-      assert.equal(a.sign, true);
-
-      a.isubn(200);
-      assert.equal(a.sign, true);
-      assert.equal(a.toString(), '-300');
-    });
-
-    it('should not allow a sign change', function() {
-      var a = new BN(-100);
-      assert.equal(a.sign, true);
-
-      a.isubn(-200);
-      assert.equal(a.sign, false);
-      assert.equal(a.toString(), '100');
-    });
-  });
-
-  describe('.mul()', function() {
-    it('should multiply numbers of different signs', function() {
-      assert.equal(new BN(0x1001).mul(new BN(0x1234)).toString(16),
-                   '1235234');
-      assert.equal(new BN(-0x1001).mul(new BN(0x1234)).toString(16),
-                   '-1235234');
-      assert.equal(new BN(-0x1001).mul(new BN(-0x1234)).toString(16),
-                   '1235234');
-    });
-
-    it('should multiply with carry', function() {
-      var n = new BN(0x1001);
-      var r = n;
-      for (var i = 0; i < 4; i++)
-        r = r.mul(n);
-      assert.equal(r.toString(16),
-                   '100500a00a005001');
-    });
-
-    it('should correctly multiply big numbers', function() {
-      var n = new BN(
-        '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
-        16
-      );
-      assert.equal(
-        n.mul(n).toString(16),
-        '39e58a8055b6fb264b75ec8c646509784204ac15a8c24e05babc9729ab9' +
-            'b055c3a9458e4ce3289560a38e08ba8175a9446ce14e608245ab3a9' +
-            '978a8bd8acaa40');
-      assert.equal(
-        n.mul(n).mul(n).toString(16),
-        '1b888e01a06e974017a28a5b4da436169761c9730b7aeedf75fc60f687b' +
-            '46e0cf2cb11667f795d5569482640fe5f628939467a01a612b02350' +
-            '0d0161e9730279a7561043af6197798e41b7432458463e64fa81158' +
-            '907322dc330562697d0d600');
-    });
-
-    it('should multiply neg number on 0', function() {
-      assert.equal(
-        new BN('-100000000000').mul(new BN('3').div(new BN('4'))).toString(16),
-        '0'
-      );
-    });
-
-    it('should regress mul big numbers', function() {
-      var q = fixtures.dhGroups.p17.q;
-      var qs = fixtures.dhGroups.p17.qs;
-
-      var q = new BN(q, 16);
-      assert.equal(q.sqr().toString(16), qs);
-      assert.equal(q.isqr().toString(16), qs);
-    });
-  });
-
-  describe('.imul()', function() {
-    it('should multiply numbers in-place', function() {
-      var a = new BN('abcdef01234567890abcd', 16);
-      var b = new BN('deadbeefa551edebabba8', 16);
-      var c = a.mul(b);
-
-      assert.equal(a.imul(b).toString(16), c.toString(16));
-
-      var a = new BN('abcdef01234567890abcd214a25123f512361e6d236', 16);
-      var b = new BN('deadbeefa551edebabba8121234fd21bac0341324dd', 16);
-      var c = a.mul(b);
-
-      assert.equal(a.imul(b).toString(16), c.toString(16));
-    });
-
-    it('should multiply by 0', function() {
-      var a = new BN('abcdef01234567890abcd', 16);
-      var b = new BN('0', 16);
-      var c = a.mul(b);
-
-      assert.equal(a.imul(b).toString(16), c.toString(16));
-    });
-  });
-
-  describe('.div()', function() {
-    it('should divide numbers', function() {
-      assert.equal(new BN('10').div(new BN(256)).toString(16),
-                   '0');
-      assert.equal(new BN('69527932928').div(new BN('16974594')).toString(16),
-                   'fff');
-      assert.equal(new BN('-69527932928').div(new BN('16974594')).toString(16),
-                   '-fff');
-
-      var b = new BN(
-        '39e58a8055b6fb264b75ec8c646509784204ac15a8c24e05babc9729ab9' +
-            'b055c3a9458e4ce3289560a38e08ba8175a9446ce14e608245ab3a9' +
-            '978a8bd8acaa40',
-        16);
-      var n = new BN(
-        '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
-        16
-      );
-      assert.equal(b.div(n).toString(16), n.toString(16));
-
-      assert.equal(new BN('1').div(new BN('-5')).toString(10), '0');
-    });
-
-    it('should not fail on regression after moving to _wordDiv', function() {
-      // Regression after moving to word div
-      var p = new BN(
-        'fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f',
-        16);
-      var a = new BN(
-        '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',
-        16);
-      var as = a.sqr();
-      assert.equal(
-          as.div(p).toString(16),
-          '39e58a8055b6fb264b75ec8c646509784204ac15a8c24e05babc9729e58090b9');
-
-      var p = new BN(
-        'ffffffff00000001000000000000000000000000ffffffffffffffffffffffff',
-        16);
-      var a = new BN(
-        'fffffffe00000003fffffffd0000000200000001fffffffe00000002ffffffff' +
-        'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
-        16);
-      assert.equal(
-        a.div(p).toString(16),
-        'ffffffff00000002000000000000000000000001000000000000000000000001');
-    });
-  });
-
-  describe('.idivn()', function() {
-    it('should divide numbers in-place', function() {
-      assert.equal(new BN('10', 16).idivn(3).toString(16), '5');
-      assert.equal(new BN('12', 16).idivn(3).toString(16), '6');
-      assert.equal(new BN('10000000000000000').idivn(3).toString(10),
-                   '3333333333333333');
-      assert.equal(
-          new BN('100000000000000000000000000000').idivn(3).toString(10),
-          '33333333333333333333333333333');
-
-      var t = new BN(3);
-      assert.equal(
-          new BN('12345678901234567890123456', 16).idivn(3).toString(16),
-          new BN('12345678901234567890123456', 16).div(t).toString(16));
-    });
-  });
-
-  describe('.divRound()', function() {
-    it('should divide numbers with rounding', function() {
-      assert.equal(new BN(9).divRound(new BN(20)).toString(10),
-                   '0');
-      assert.equal(new BN(10).divRound(new BN(20)).toString(10),
-                   '1');
-      assert.equal(new BN(150).divRound(new BN(20)).toString(10),
-                   '8');
-      assert.equal(new BN(149).divRound(new BN(20)).toString(10),
-                   '7');
-      assert.equal(new BN(149).divRound(new BN(17)).toString(10),
-                   '9');
-      assert.equal(new BN(144).divRound(new BN(17)).toString(10),
-                   '8');
-      assert.equal(new BN(-144).divRound(new BN(17)).toString(10),
-                   '-8');
-    });
-
-    it('should return 1 on exact division', function() {
-      assert.equal(new BN(144).divRound(new BN(144)).toString(10), '1');
-    });
-  });
-
-  describe('.mod()', function() {
-    it('should mod numbers', function() {
-      assert.equal(new BN('10').mod(new BN(256)).toString(16),
-                   'a');
-      assert.equal(new BN('69527932928').mod(new BN('16974594')).toString(16),
-                   '102f302');
-      assert.equal(new BN('-69527932928').mod(new BN('16974594')).toString(16),
-                   '1000');
-
-      var p = new BN(
-        'ffffffff00000001000000000000000000000000ffffffffffffffffffffffff',
-        16);
-      var a = new BN(
-        'fffffffe00000003fffffffd0000000200000001fffffffe00000002ffffffff' +
-        'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
-        16);
-      assert.equal(
-        a.mod(p).toString(16),
-        '0');
-    });
-  });
-
-  describe('.modn()', function() {
-    it('should act like .mod() on small numbers', function() {
-      assert.equal(new BN('10', 16).modn(256).toString(16), '10');
-      assert.equal(new BN('100', 16).modn(256).toString(16), '0');
-      assert.equal(new BN('1001', 16).modn(256).toString(16), '1');
-      assert.equal(new BN('100000000001', 16).modn(256).toString(16), '1');
-      assert.equal(new BN('100000000001', 16).modn(257).toString(16),
-                   new BN('100000000001', 16).mod(new BN(257)).toString(16));
-      assert.equal(new BN('123456789012', 16).modn(3).toString(16),
-                   new BN('123456789012', 16).mod(new BN(3)).toString(16));
-    });
-  });
-
-  describe('.abs()', function() {
-    it('should return absolute value', function() {
-      assert.equal(new BN(0x1001).abs().toString(), '4097');
-      assert.equal(new BN(-0x1001).abs().toString(), '4097');
-      assert.equal(new BN('ffffffff', 16).abs().toString(), '4294967295');
-    })
-  });
-
-  describe('.invm()', function() {
-    it('should invert relatively-prime numbers', function() {
-      var p = new BN(257);
-      var a = new BN(3);
-      var b = a.invm(p);
-      assert.equal(a.mul(b).mod(p).toString(16), '1');
-
-      var p192 = new BN(
-          'fffffffffffffffffffffffffffffffeffffffffffffffff',
-          16);
-      var a = new BN('deadbeef', 16);
-      var b = a.invm(p192);
-      assert.equal(a.mul(b).mod(p192).toString(16), '1');
-
-      // Even base
-      var phi = new BN('872d9b030ba368706b68932cf07a0e0c', 16);
-      var e = new BN(65537);
-      var d = e.invm(phi);
-      assert.equal(e.mul(d).mod(phi).toString(16), '1');
-
-      // Even base (take #2)
-      var a = new BN('5');
-      var b = new BN('6');
-      var r = a.invm(b);
-      assert.equal(r.mul(a).mod(b).toString(16), '1');
-    });
-  });
-
-  describe('.gcd()', function() {
-    it('should return GCD', function() {
-      assert.equal(new BN(3).gcd(new BN(2)).toString(16), '1');
-      assert.equal(new BN(18).gcd(new BN(12)).toString(16), '6');
-      assert.equal(new BN(-18).gcd(new BN(12)).toString(16), '6');
-    });
-  });
-});
diff --git a/node_modules/bn.js/test/binary-test.js b/node_modules/bn.js/test/binary-test.js
deleted file mode 100644
index 9a0673a293cf2b818637911ea2fdcb0e121fa694..0000000000000000000000000000000000000000
--- a/node_modules/bn.js/test/binary-test.js
+++ /dev/null
@@ -1,182 +0,0 @@
-var assert = require('assert');
-var BN = require('../').BN;
-var fixtures = require('./fixtures');
-
-describe('BN.js/Binary', function() {
-  describe('.shl()', function() {
-    it('should shl numbers', function() {
-      assert.equal(new BN('69527932928').shln(13).toString(16),
-                   '2060602000000');
-      assert.equal(new BN('69527932928').shln(45).toString(16),
-                   '206060200000000000000');
-    });
-  });
-
-  describe('.shr()', function() {
-    it('should shr numbers', function() {
-      assert.equal(new BN('69527932928').shrn(13).toString(16),
-                   '818180');
-      assert.equal(new BN('69527932928').shrn(17).toString(16),
-                   '81818');
-      assert.equal(new BN('69527932928').shrn(256).toString(16),
-                   '0');
-    });
-  });
-
-  describe('.bincn()', function() {
-    it('should increment bit', function() {
-      assert.equal(new BN(0).bincn(1).toString(16), '2');
-      assert.equal(new BN(2).bincn(1).toString(16), '4');
-      assert.equal(new BN(2).bincn(1).bincn(1).toString(16),
-                   new BN(2).bincn(2).toString(16));
-      assert.equal(new BN(0xffffff).bincn(1).toString(16), '1000001');
-    });
-  });
-
-  describe('.imaskn()', function() {
-    it('should mask bits in-place', function() {
-      assert.equal(new BN(0).imaskn(1).toString(16), '0');
-      assert.equal(new BN(3).imaskn(1).toString(16), '1');
-      assert.equal(new BN('123456789', 16).imaskn(4).toString(16), '9');
-      assert.equal(new BN('123456789', 16).imaskn(16).toString(16), '6789');
-      assert.equal(new BN('123456789', 16).imaskn(28).toString(16), '3456789');
-    });
-  });
-
-  describe('.testn()', function() {
-    it('should support test specific bit', function() {
-      [
-        'ff',
-        'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
-      ].forEach(function(hex) {
-        var bn = new BN(hex, 16)
-        var bl = bn.bitLength()
-
-        for (var i = 0; i < bl; ++i) {
-          assert.equal(bn.testn(i), true);
-        }
-
-        // test off the end
-        assert.equal(bn.testn(bl), false);
-      })
-
-      var xbits = '01111001010111001001000100011101' +
-                  '11010011101100011000111001011101' +
-                  '10010100111000000001011000111101' +
-                  '01011111001111100100011110000010' +
-                  '01011010100111010001010011000100' +
-                  '01101001011110100001001111100110' +
-                  '001110010111';
-
-      var x = new BN(
-        '23478905234580795234378912401239784125643978256123048348957342'
-      )
-      for (var i = 0; i < x.bitLength(); ++i) {
-        assert.equal(x.testn(i), (xbits.charAt(i) === '1'), 'Failed @ bit ' + i)
-      }
-    });
-
-    it('should have short-cuts', function() {
-      var x = new BN('abcd', 16);
-      assert(!x.testn(128));
-    });
-  });
-
-  describe('.and()', function() {
-    it('should and numbers', function() {
-      assert.equal(new BN('1010101010101010101010101010101010101010', 2)
-                   .and(new BN('101010101010101010101010101010101010101', 2))
-                   .toString(2), '0');
-    });
-
-    it('should and numbers of different limb-length', function() {
-      assert.equal(
-          new BN('abcd0000ffff', 16)
-              .and(new BN('abcd', 16)).toString(16),
-          'abcd');
-    });
-  });
-
-  describe('.iand()', function() {
-    it('should iand numbers', function() {
-      assert.equal(new BN('1010101010101010101010101010101010101010', 2)
-                   .iand(new BN('101010101010101010101010101010101010101', 2))
-                   .toString(2), '0');
-      assert.equal(new BN('1000000000000000000000000000000000000001', 2)
-                   .iand(new BN('1', 2))
-                   .toString(2), '1')
-      assert.equal(new BN('1', 2)
-                   .iand(new BN('1000000000000000000000000000000000000001', 2))
-                   .toString(2), '1')
-    });
-  });
-
-  describe('.or()', function() {
-    it('should or numbers', function () {
-      assert.equal(new BN('1010101010101010101010101010101010101010', 2)
-                   .or(new BN('101010101010101010101010101010101010101', 2))
-                   .toString(2), '1111111111111111111111111111111111111111');
-    });
-
-    it('should or numbers of different limb-length', function() {
-      assert.equal(
-          new BN('abcd00000000', 16)
-              .or(new BN('abcd', 16)).toString(16),
-          'abcd0000abcd');
-    });
-  });
-
-  describe('.ior()', function() {
-    it('should ior numbers', function () {
-      assert.equal(new BN('1010101010101010101010101010101010101010', 2)
-                   .ior(new BN('101010101010101010101010101010101010101', 2))
-                   .toString(2), '1111111111111111111111111111111111111111');
-      assert.equal(new BN('1000000000000000000000000000000000000000', 2)
-                   .ior(new BN('1', 2))
-                   .toString(2), '1000000000000000000000000000000000000001');
-      assert.equal(new BN('1', 2)
-                   .ior(new BN('1000000000000000000000000000000000000000', 2))
-                   .toString(2), '1000000000000000000000000000000000000001');
-    });
-  });
-
-  describe('.xor()', function() {
-    it('should xor numbers', function () {
-      assert.equal(new BN('11001100110011001100110011001100', 2)
-                   .xor(new BN('1100110011001100110011001100110', 2))
-                   .toString(2), '10101010101010101010101010101010');
-    });
-  });
-
-  describe('.ixor()', function() {
-    it('should ixor numbers', function () {
-      assert.equal(new BN('11001100110011001100110011001100', 2)
-                   .ixor(new BN('1100110011001100110011001100110', 2))
-                   .toString(2), '10101010101010101010101010101010');
-      assert.equal(new BN('11001100110011001100110011001100', 2)
-                   .ixor(new BN('1', 2))
-                   .toString(2), '11001100110011001100110011001101');
-      assert.equal(new BN('1', 2)
-                   .ixor(new BN('11001100110011001100110011001100', 2))
-                   .toString(2), '11001100110011001100110011001101');
-    });
-
-    it('should and numbers of different limb-length', function() {
-      assert.equal(
-          new BN('abcd0000ffff', 16)
-              .xor(new BN('abcd', 16)).toString(16),
-          'abcd00005432');
-    });
-  });
-
-  describe('.setn()', function() {
-    it('should allow single bits to be set', function () {
-      assert.equal(new BN(0).setn(2, true).toString(2), '100');
-      assert.equal(new BN(0).setn(27, true).toString(2),
-                   '1000000000000000000000000000');
-      assert.equal(new BN('1000000000000000000000000001', 2).setn(27, false)
-                   .toString(2), '1');
-      assert.equal(new BN('101', 2).setn(2, false).toString(2), '1');
-    });
-  });
-});
diff --git a/node_modules/bn.js/test/constructor-test.js b/node_modules/bn.js/test/constructor-test.js
deleted file mode 100644
index 3790c0d8f23d6860f12a8eab8d04bfb3c20bb495..0000000000000000000000000000000000000000
--- a/node_modules/bn.js/test/constructor-test.js
+++ /dev/null
@@ -1,99 +0,0 @@
-var assert = require('assert');
-var BN = require('../').BN;
-var fixtures = require('./fixtures');
-
-describe('BN.js/Constructor', function() {
-  describe('with Smi input', function() {
-    it('should accept one limb number', function() {
-      assert.equal(new BN(12345).toString(16), '3039');
-    });
-
-    it('should accept two-limb number', function() {
-      assert.equal(new BN(0x4123456).toString(16), '4123456');
-    });
-  });
-
-  describe('with String input', function() {
-    it('should accept base-16', function() {
-      assert.equal(new BN('1A6B765D8CDF', 16).toString(16), '1a6b765d8cdf');
-      assert.equal(new BN('1A6B765D8CDF', 16).toString(), '29048849665247');
-    });
-
-    it('should accept base-hex', function() {
-      assert.equal(new BN('FF', 'hex').toString(), '255');
-    });
-
-    it('should accept base-16 with spaces', function() {
-      var num = 'a89c e5af8724 c0a23e0e 0ff77500';
-      assert.equal(new BN(num, 16).toString(16), num.replace(/ /g, ''));
-    });
-
-    it('should accept long base-16', function() {
-      var num = '123456789abcdef123456789abcdef123456789abcdef';
-      assert.equal(new BN(num, 16).toString(16), num);
-    });
-
-    it('should accept positive base-10', function() {
-      assert.equal(new BN('10654321').toString(), '10654321');
-      assert.equal(new BN('29048849665247').toString(16), '1a6b765d8cdf');
-    });
-
-    it('should accept negative base-10', function() {
-      assert.equal(new BN('-29048849665247').toString(16), '-1a6b765d8cdf');
-    });
-
-    it('should accept long base-10', function() {
-      var num = '10000000000000000';
-      assert.equal(new BN(num).toString(10), num);
-    });
-
-    it('should accept base-2', function() {
-      var base2 = '11111111111111111111111111111111111111111111111111111';
-      assert.equal(new BN(base2, 2).toString(2), base2);
-    });
-
-    it('should accept base-36', function() {
-      var base36 = 'zzZzzzZzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz';
-      assert.equal(new BN(base36, 36).toString(36), base36.toLowerCase());
-    });
-
-    it('should not overflow limbs during base-10', function() {
-      var num = '65820182292848241686198767302293' +
-                '20890292528855852623664389292032';
-      assert(new BN(num).words[0] < 0x4000000);
-    });
-  });
-
-  describe('with Array input', function() {
-    it('should import/export big endian', function() {
-      assert.equal(new BN([ 1, 2, 3 ]).toString(16), '10203');
-      assert.equal(new BN([ 1, 2, 3, 4 ]).toString(16), '1020304');
-      assert.equal(new BN([ 1, 2, 3, 4, 5 ]).toString(16), '102030405');
-      assert.equal(new BN([ 1, 2, 3, 4, 5, 6, 7, 8 ]).toString(16),
-                   '102030405060708');
-      assert.equal(new BN([ 1, 2, 3, 4 ]).toArray().join(','), '1,2,3,4');
-      assert.equal(new BN([ 1, 2, 3, 4, 5, 6, 7, 8 ]).toArray().join(','),
-                   '1,2,3,4,5,6,7,8');
-    });
-
-    it('should import little endian', function() {
-      assert.equal(new BN([ 1, 2, 3 ], 10, 'le').toString(16), '30201');
-      assert.equal(new BN([ 1, 2, 3, 4 ], 10, 'le').toString(16), '4030201');
-      assert.equal(new BN([ 1, 2, 3, 4, 5 ], 10, 'le').toString(16),
-                   '504030201');
-      assert.equal(new BN([ 1, 2, 3, 4, 5, 6, 7, 8 ], 'le').toString(16),
-                   '807060504030201');
-    });
-
-    it('should import big endian with implicit base', function() {
-      assert.equal(new BN([ 1, 2, 3, 4, 5 ], 'le').toString(16), '504030201');
-    });
-  });
-
-  describe('with BN input', function() {
-    it('should clone BN', function() {
-      var num = new BN(12345);
-      assert.equal(new BN(num).toString(10), '12345');
-    });
-  });
-});
diff --git a/node_modules/bn.js/test/fixtures.js b/node_modules/bn.js/test/fixtures.js
deleted file mode 100644
index 29442d929fe6be74dc2b2dbf5b3f5386ec6d4f32..0000000000000000000000000000000000000000
--- a/node_modules/bn.js/test/fixtures.js
+++ /dev/null
@@ -1,264 +0,0 @@
-exports.dhGroups = {
-  p16: {
-    prime: 'ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd1' +
-      '29024e088a67cc74020bbea63b139b22514a08798e3404dd' +
-      'ef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245' +
-      'e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7ed' +
-      'ee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3d' +
-      'c2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f' +
-      '83655d23dca3ad961c62f356208552bb9ed529077096966d' +
-      '670c354e4abc9804f1746c08ca18217c32905e462e36ce3b' +
-      'e39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9' +
-      'de2bcbf6955817183995497cea956ae515d2261898fa0510' +
-      '15728e5a8aaac42dad33170d04507a33a85521abdf1cba64' +
-      'ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7' +
-      'abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6b' +
-      'f12ffa06d98a0864d87602733ec86a64521f2b18177b200c' +
-      'bbe117577a615d6c770988c0bad946e208e24fa074e5ab31' +
-      '43db5bfce0fd108e4b82d120a92108011a723c12a787e6d7' +
-      '88719a10bdba5b2699c327186af4e23c1a946834b6150bda' +
-      '2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6' +
-      '287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed' +
-      '1f612970cee2d7afb81bdd762170481cd0069127d5b05aa9' +
-      '93b4ea988d8fddc186ffb7dc90a6c08f4df435c934063199' +
-      'ffffffffffffffff',
-    priv: '6d5923e6449122cbbcc1b96093e0b7e4fd3e469f58daddae' +
-      '53b49b20664f4132675df9ce98ae0cfdcac0f4181ccb643b' +
-      '625f98104dcf6f7d8e81961e2cab4b5014895260cb977c7d' +
-      '2f981f8532fb5da60b3676dfe57f293f05d525866053ac7e' +
-      '65abfd19241146e92e64f309a97ef3b529af4d6189fa416c' +
-      '9e1a816c3bdf88e5edf48fbd8233ef9038bb46faa95122c0' +
-      '5a426be72039639cd2d53d37254b3d258960dcb33c255ede' +
-      '20e9d7b4b123c8b4f4b986f53cdd510d042166f7dd7dca98' +
-      '7c39ab36381ba30a5fdd027eb6128d2ef8e5802a2194d422' +
-      'b05fe6e1cb4817789b923d8636c1ec4b7601c90da3ddc178' +
-      '52f59217ae070d87f2e75cbfb6ff92430ad26a71c8373452' +
-      'ae1cc5c93350e2d7b87e0acfeba401aaf518580937bf0b6c' +
-      '341f8c49165a47e49ce50853989d07171c00f43dcddddf72' +
-      '94fb9c3f4e1124e98ef656b797ef48974ddcd43a21fa06d0' +
-      '565ae8ce494747ce9e0ea0166e76eb45279e5c6471db7df8' +
-      'cc88764be29666de9c545e72da36da2f7a352fb17bdeb982' +
-      'a6dc0193ec4bf00b2e533efd6cd4d46e6fb237b775615576' +
-      'dd6c7c7bbc087a25e6909d1ebc6e5b38e5c8472c0fc429c6' +
-      'f17da1838cbcd9bbef57c5b5522fd6053e62ba21fe97c826' +
-      'd3889d0cc17e5fa00b54d8d9f0f46fb523698af965950f4b' +
-      '941369e180f0aece3870d9335f2301db251595d173902cad' +
-      '394eaa6ffef8be6c',
-    pub: 'd53703b7340bc89bfc47176d351e5cf86d5a18d9662eca3c' +
-      '9759c83b6ccda8859649a5866524d77f79e501db923416ca' +
-      '2636243836d3e6df752defc0fb19cc386e3ae48ad647753f' +
-      'bf415e2612f8a9fd01efe7aca249589590c7e6a0332630bb' +
-      '29c5b3501265d720213790556f0f1d114a9e2071be3620bd' +
-      '4ee1e8bb96689ac9e226f0a4203025f0267adc273a43582b' +
-      '00b70b490343529eaec4dcff140773cd6654658517f51193' +
-      '13f21f0a8e04fe7d7b21ffeca85ff8f87c42bb8d9cb13a72' +
-      'c00e9c6e9dfcedda0777af951cc8ccab90d35e915e707d8e' +
-      '4c2aca219547dd78e9a1a0730accdc9ad0b854e51edd1e91' +
-      '4756760bab156ca6e3cb9c625cf0870def34e9ac2e552800' +
-      'd6ce506d43dbbc75acfa0c8d8fb12daa3c783fb726f187d5' +
-      '58131779239c912d389d0511e0f3a81969d12aeee670e48f' +
-      'ba41f7ed9f10705543689c2506b976a8ffabed45e33795b0' +
-      '1df4f6b993a33d1deab1316a67419afa31fbb6fdd252ee8c' +
-      '7c7d1d016c44e3fcf6b41898d7f206aa33760b505e4eff2e' +
-      'c624bc7fe636b1d59e45d6f904fc391419f13d1f0cdb5b6c' +
-      '2378b09434159917dde709f8a6b5dc30994d056e3f964371' +
-      '11587ac7af0a442b8367a7bd940f752ddabf31cf01171e24' +
-      'd78df136e9681cd974ce4f858a5fb6efd3234a91857bb52d' +
-      '9e7b414a8bc66db4b5a73bbeccfb6eb764b4f0cbf0375136' +
-      'b024b04e698d54a5'
-  },
-  p17: {
-    prime: 'ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd1' +
-      '29024e088a67cc74020bbea63b139b22514a08798e3404dd' +
-      'ef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245' +
-      'e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7ed' +
-      'ee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3d' +
-      'c2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f' +
-      '83655d23dca3ad961c62f356208552bb9ed529077096966d' +
-      '670c354e4abc9804f1746c08ca18217c32905e462e36ce3b' +
-      'e39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9' +
-      'de2bcbf6955817183995497cea956ae515d2261898fa0510' +
-      '15728e5a8aaac42dad33170d04507a33a85521abdf1cba64' +
-      'ecfb850458dbef0a8aea71575d060c7db3970f85a6e1e4c7' +
-      'abf5ae8cdb0933d71e8c94e04a25619dcee3d2261ad2ee6b' +
-      'f12ffa06d98a0864d87602733ec86a64521f2b18177b200c' +
-      'bbe117577a615d6c770988c0bad946e208e24fa074e5ab31' +
-      '43db5bfce0fd108e4b82d120a92108011a723c12a787e6d7' +
-      '88719a10bdba5b2699c327186af4e23c1a946834b6150bda' +
-      '2583e9ca2ad44ce8dbbbc2db04de8ef92e8efc141fbecaa6' +
-      '287c59474e6bc05d99b2964fa090c3a2233ba186515be7ed' +
-      '1f612970cee2d7afb81bdd762170481cd0069127d5b05aa9' +
-      '93b4ea988d8fddc186ffb7dc90a6c08f4df435c934028492' +
-      '36c3fab4d27c7026c1d4dcb2602646dec9751e763dba37bd' +
-      'f8ff9406ad9e530ee5db382f413001aeb06a53ed9027d831' +
-      '179727b0865a8918da3edbebcf9b14ed44ce6cbaced4bb1b' +
-      'db7f1447e6cc254b332051512bd7af426fb8f401378cd2bf' +
-      '5983ca01c64b92ecf032ea15d1721d03f482d7ce6e74fef6' +
-      'd55e702f46980c82b5a84031900b1c9e59e7c97fbec7e8f3' +
-      '23a97a7e36cc88be0f1d45b7ff585ac54bd407b22b4154aa' +
-      'cc8f6d7ebf48e1d814cc5ed20f8037e0a79715eef29be328' +
-      '06a1d58bb7c5da76f550aa3d8a1fbff0eb19ccb1a313d55c' +
-      'da56c9ec2ef29632387fe8d76e3c0468043e8f663f4860ee' +
-      '12bf2d5b0b7474d6e694f91e6dcc4024ffffffffffffffff',
-    priv: '6017f2bc23e1caff5b0a8b4e1fc72422b5204415787801dc' +
-      '025762b8dbb98ab57603aaaa27c4e6bdf742b4a1726b9375' +
-      'a8ca3cf07771779589831d8bd18ddeb79c43e7e77d433950' +
-      'e652e49df35b11fa09644874d71d62fdaffb580816c2c88c' +
-      '2c4a2eefd4a660360316741b05a15a2e37f236692ad3c463' +
-      'fff559938fc6b77176e84e1bb47fb41af691c5eb7bb81bd8' +
-      'c918f52625a1128f754b08f5a1403b84667231c4dfe07ed4' +
-      '326234c113931ce606037e960f35a2dfdec38a5f057884d3' +
-      '0af8fab3be39c1eeb390205fd65982191fc21d5aa30ddf51' +
-      'a8e1c58c0c19fc4b4a7380ea9e836aaf671c90c29bc4bcc7' +
-      '813811aa436a7a9005de9b507957c56a9caa1351b6efc620' +
-      '7225a18f6e97f830fb6a8c4f03b82f4611e67ab9497b9271' +
-      'd6ac252793cc3e5538990dbd894d2dbc2d152801937d9f74' +
-      'da4b741b50b4d40e4c75e2ac163f7b397fd555648b249f97' +
-      'ffe58ffb6d096aa84534c4c5729cff137759bd34e80db4ab' +
-      '47e2b9c52064e7f0bf677f72ac9e5d0c6606943683f9d12f' +
-      '180cf065a5cb8ec3179a874f358847a907f8471d15f1e728' +
-      '7023249d6d13c82da52628654438f47b8b5cdf4761fbf6ad' +
-      '9219eceac657dbd06cf2ab776ad4c968f81c3d039367f0a4' +
-      'd77c7ec4435c27b6c147071665100063b5666e06eb2fb2cc' +
-      '3159ba34bc98ca346342195f6f1fb053ddc3bc1873564d40' +
-      '1c6738cdf764d6e1ff25ca5926f80102ea6593c17170966b' +
-      'b5d7352dd7fb821230237ea3ebed1f920feaadbd21be295a' +
-      '69f2083deae9c5cdf5f4830eb04b7c1f80cc61c17232d79f' +
-      '7ecc2cc462a7965f804001c89982734e5abba2d31df1b012' +
-      '152c6b226dff34510b54be8c2cd68d795def66c57a3abfb6' +
-      '896f1d139e633417f8c694764974d268f46ece3a8d6616ea' +
-      'a592144be48ee1e0a1595d3e5edfede5b27cec6c48ceb2ff' +
-      'b42cb44275851b0ebf87dfc9aa2d0cb0805e9454b051dfe8' +
-      'a29fadd82491a4b4c23f2d06ba45483ab59976da1433c9ce' +
-      '500164b957a04cf62dd67595319b512fc4b998424d1164dd' +
-      'bbe5d1a0f7257cbb04ec9b5ed92079a1502d98725023ecb2',
-    pub: '3bf836229c7dd874fe37c1790d201e82ed8e192ed61571ca' +
-      '7285264974eb2a0171f3747b2fc23969a916cbd21e14f7e2' +
-      'f0d72dcd2247affba926f9e7bb99944cb5609aed85e71b89' +
-      'e89d2651550cb5bd8281bd3144066af78f194032aa777739' +
-      'cccb7862a1af401f99f7e5c693f25ddce2dedd9686633820' +
-      'd28d0f5ed0c6b5a094f5fe6170b8e2cbc9dff118398baee6' +
-      'e895a6301cb6e881b3cae749a5bdf5c56fc897ff68bc73f2' +
-      '4811bb108b882872bade1f147d886a415cda2b93dd90190c' +
-      'be5c2dd53fe78add5960e97f58ff2506afe437f4cf4c912a' +
-      '397c1a2139ac6207d3ab76e6b7ffd23bb6866dd7f87a9ae5' +
-      '578789084ff2d06ea0d30156d7a10496e8ebe094f5703539' +
-      '730f5fdbebc066de417be82c99c7da59953071f49da7878d' +
-      'a588775ff2a7f0084de390f009f372af75cdeba292b08ea8' +
-      '4bd13a87e1ca678f9ad148145f7cef3620d69a891be46fbb' +
-      'cad858e2401ec0fd72abdea2f643e6d0197b7646fbb83220' +
-      '0f4cf7a7f6a7559f9fb0d0f1680822af9dbd8dec4cd1b5e1' +
-      '7bc799e902d9fe746ddf41da3b7020350d3600347398999a' +
-      'baf75d53e03ad2ee17de8a2032f1008c6c2e6618b62f225b' +
-      'a2f350179445debe68500fcbb6cae970a9920e321b468b74' +
-      '5fb524fb88abbcacdca121d737c44d30724227a99745c209' +
-      'b970d1ff93bbc9f28b01b4e714d6c9cbd9ea032d4e964d8e' +
-      '8fff01db095160c20b7646d9fcd314c4bc11bcc232aeccc0' +
-      'fbedccbc786951025597522eef283e3f56b44561a0765783' +
-      '420128638c257e54b972a76e4261892d81222b3e2039c61a' +
-      'ab8408fcaac3d634f848ab3ee65ea1bd13c6cd75d2e78060' +
-      'e13cf67fbef8de66d2049e26c0541c679fff3e6afc290efe' +
-      '875c213df9678e4a7ec484bc87dae5f0a1c26d7583e38941' +
-      'b7c68b004d4df8b004b666f9448aac1cc3ea21461f41ea5d' +
-      'd0f7a9e6161cfe0f58bcfd304bdc11d78c2e9d542e86c0b5' +
-      '6985cc83f693f686eaac17411a8247bf62f5ccc7782349b5' +
-      'cc1f20e312fa2acc0197154d1bfee507e8db77e8f2732f2d' +
-      '641440ccf248e8643b2bd1e1f9e8239356ab91098fcb431d',
-    q:  'a899c59999bf877d96442d284359783bdc64b5f878b688fe' +
-      '51407f0526e616553ad0aaaac4d5bed3046f10a1faaf42bb' +
-      '2342dc4b7908eea0c46e4c4576897675c2bfdc4467870d3d' +
-      'cd90adaed4359237a4bc6924bfb99aa6bf5f5ede15b574ea' +
-      'e977eac096f3c67d09bda574c6306c6123fa89d2f086b8dc' +
-      'ff92bc570c18d83fe6c810ccfd22ce4c749ef5e6ead3fffe' +
-      'c63d95e0e3fde1df9db6a35fa1d107058f37e41957769199' +
-      'd945dd7a373622c65f0af3fd9eb1ddc5c764bbfaf7a3dc37' +
-      '2548e683b970dac4aa4b9869080d2376c9adecebb84e172c' +
-      '09aeeb25fb8df23e60033260c4f8aac6b8b98ab894b1fb84' +
-      'ebb83c0fb2081c3f3eee07f44e24d8fabf76f19ed167b0d7' +
-      'ff971565aa4efa3625fce5a43ceeaa3eebb3ce88a00f597f' +
-      '048c69292b38dba2103ecdd5ec4ccfe3b2d87fa6202f334b' +
-      'c1cab83b608dfc875b650b69f2c7e23c0b2b4adf149a6100' +
-      'db1b6dbad4679ecb1ea95eafaba3bd00db11c2134f5a8686' +
-      '358b8b2ab49a1b2e85e1e45caeac5cd4dc0b3b5fffba8871' +
-      '1c6baf399edd48dad5e5c313702737a6dbdcede80ca358e5' +
-      '1d1c4fe42e8948a084403f61baed38aa9a1a5ce2918e9f33' +
-      '100050a430b47bc592995606440272a4994677577a6aaa1b' +
-      'a101045dbec5a4e9566dab5445d1af3ed19519f07ac4e2a8' +
-      'bd0a84b01978f203a9125a0be020f71fab56c2c9e344d4f4' +
-      '12d53d3cd8eb74ca5122002e931e3cb0bd4b7492436be17a' +
-      'd7ebe27148671f59432c36d8c56eb762655711cfc8471f70' +
-      '83a8b7283bcb3b1b1d47d37c23d030288cfcef05fbdb4e16' +
-      '652ee03ee7b77056a808cd700bc3d9ef826eca9a59be959c' +
-      '947c865d6b372a1ca2d503d7df6d7611b12111665438475a' +
-      '1c64145849b3da8c2d343410df892d958db232617f9896f1' +
-      'de95b8b5a47132be80dd65298c7f2047858409bf762dbc05' +
-      'a62ca392ac40cfb8201a0607a2cae07d99a307625f2b2d04' +
-      'fe83fbd3ab53602263410f143b73d5b46fc761882e78c782' +
-      'd2c36e716a770a7aefaf7f76cea872db7bffefdbc4c2f9e0' +
-      '39c19adac915e7a63dcb8c8c78c113f29a3e0bc10e100ce0',
-    qs: '6f0a2fb763eaeb8eb324d564f03d4a55fdcd709e5f1b65e9' +
-      '5702b0141182f9f945d71bc3e64a7dfdae7482a7dd5a4e58' +
-      'bc38f78de2013f2c468a621f08536969d2c8d011bb3bc259' +
-      '2124692c91140a5472cad224acdacdeae5751dadfdf068b8' +
-      '77bfa7374694c6a7be159fc3d24ff9eeeecaf62580427ad8' +
-      '622d48c51a1c4b1701d768c79d8c819776e096d2694107a2' +
-      'f3ec0c32224795b59d32894834039dacb369280afb221bc0' +
-      '90570a93cf409889b818bb30cccee98b2aa26dbba0f28499' +
-      '08e1a3cd43fa1f1fb71049e5c77c3724d74dc351d9989057' +
-      '37bbda3805bd6b1293da8774410fb66e3194e18cdb304dd9' +
-      'a0b59b583dcbc9fc045ac9d56aea5cfc9f8a0b95da1e11b7' +
-      '574d1f976e45fe12294997fac66ca0b83fc056183549e850' +
-      'a11413cc4abbe39a211e8c8cbf82f2a23266b3c10ab9e286' +
-      '07a1b6088909cddff856e1eb6b2cde8bdac53fa939827736' +
-      'ca1b892f6c95899613442bd02dbdb747f02487718e2d3f22' +
-      'f73734d29767ed8d0e346d0c4098b6fdcb4df7d0c4d29603' +
-      '5bffe80d6c65ae0a1b814150d349096baaf950f2caf298d2' +
-      'b292a1d48cf82b10734fe8cedfa16914076dfe3e9b51337b' +
-      'ed28ea1e6824bb717b641ca0e526e175d3e5ed7892aebab0' +
-      'f207562cc938a821e2956107c09b6ce4049adddcd0b7505d' +
-      '49ae6c69a20122461102d465d93dc03db026be54c303613a' +
-      'b8e5ce3fd4f65d0b6162ff740a0bf5469ffd442d8c509cd2' +
-      '3b40dab90f6776ca17fc0678774bd6eee1fa85ababa52ec1' +
-      'a15031eb677c6c488661dddd8b83d6031fe294489ded5f08' +
-      '8ad1689a14baeae7e688afa3033899c81f58de39b392ca94' +
-      'af6f15a46f19fa95c06f9493c8b96a9be25e78b9ea35013b' +
-      'caa76de6303939299d07426a88a334278fc3d0d9fa71373e' +
-      'be51d3c1076ab93a11d3d0d703366ff8cde4c11261d488e5' +
-      '60a2bdf3bfe2476032294800d6a4a39d306e65c6d7d8d66e' +
-      '5ec63eee94531e83a9bddc458a2b508285c0ee10b7bd94da' +
-      '2815a0c5bd5b2e15cbe66355e42f5af8955cdfc0b3a4996d' +
-      '288db1f4b32b15643b18193e378cb7491f3c3951cdd044b1' +
-      'a519571bffac2da986f5f1d506c66530a55f70751e24fa8e' +
-      'd83ac2347f4069fb561a5565e78c6f0207da24e889a93a96' +
-      '65f717d9fe8a2938a09ab5f81be7ccecf466c0397fc15a57' +
-      '469939793f302739765773c256a3ca55d0548afd117a7cae' +
-      '98ca7e0d749a130c7b743d376848e255f8fdbe4cb4480b63' +
-      'cd2c015d1020cf095d175f3ca9dcdfbaf1b2a6e6468eee4c' +
-      'c750f2132a77f376bd9782b9d0ff4da98621b898e251a263' +
-      '4301ba2214a8c430b2f7a79dbbfd6d7ff6e9b0c137b025ff' +
-      '587c0bf912f0b19d4fff96b1ecd2ca990c89b386055c60f2' +
-      '3b94214bd55096f17a7b2c0fa12b333235101cd6f28a128c' +
-      '782e8a72671adadebbd073ded30bd7f09fb693565dcf0bf3' +
-      '090c21d13e5b0989dd8956f18f17f4f69449a13549c9d80a' +
-      '77e5e61b5aeeee9528634100e7bc390672f0ded1ca53555b' +
-      'abddbcf700b9da6192255bddf50a76b709fbed251dce4c7e' +
-      '1ca36b85d1e97c1bc9d38c887a5adf140f9eeef674c31422' +
-      'e65f63cae719f8c1324e42fa5fd8500899ef5aa3f9856aa7' +
-      'ce10c85600a040343204f36bfeab8cfa6e9deb8a2edd2a8e' +
-      '018d00c7c9fa3a251ad0f57183c37e6377797653f382ec7a' +
-      '2b0145e16d3c856bc3634b46d90d7198aff12aff88a30e34' +
-      'e2bfaf62705f3382576a9d3eeb0829fca2387b5b654af46e' +
-      '5cf6316fb57d59e5ea6c369061ac64d99671b0e516529dd5' +
-      'd9c48ea0503e55fee090d36c5ea8b5954f6fcc0060794e1c' +
-      'b7bc24aa1e5c0142fd4ce6e8fd5aa92a7bf84317ea9e1642' +
-      'b6995bac6705adf93cbce72433ed0871139970d640f67b78' +
-      'e63a7a6d849db2567df69ac7d79f8c62664ac221df228289' +
-      'd0a4f9ebd9acb4f87d49da64e51a619fd3f3baccbd9feb12' +
-      '5abe0cc2c8d17ed1d8546da2b6c641f4d3020a5f9b9f26ac' +
-      '16546c2d61385505612275ea344c2bbf1ce890023738f715' +
-      '5e9eba6a071678c8ebd009c328c3eb643679de86e69a9fa5' +
-      '67a9e146030ff03d546310a0a568c5ba0070e0da22f2cef8' +
-      '54714b04d399bbc8fd261f9e8efcd0e83bdbc3f5cfb2d024' +
-      '3e398478cc598e000124eb8858f9df8f52946c2a1ca5c400'
-  }
-};
diff --git a/node_modules/bn.js/test/pummel/dh-group-test.js b/node_modules/bn.js/test/pummel/dh-group-test.js
deleted file mode 100644
index dd6481f02d05ff39c9cef1a7be4feefb1ed5fa67..0000000000000000000000000000000000000000
--- a/node_modules/bn.js/test/pummel/dh-group-test.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var assert = require('assert');
-var BN = require('../../').BN;
-var fixtures = require('../fixtures');
-
-describe('BN.js/Slow DH test', function() {
-  var groups = fixtures.dhGroups;
-  Object.keys(groups).forEach(function(name) {
-    it('should match public key for ' + name + ' group', function() {
-      var group = groups[name];
-
-      this.timeout(3600 * 1000);
-
-      var base = new BN(2);
-      var mont = BN.red(new BN(group.prime, 16));
-      var priv = new BN(group.priv, 16);
-      var multed = base.toRed(mont).redPow(priv).fromRed();
-      var actual = new Buffer(multed.toArray());
-      assert.equal(actual.toString('hex'), group.pub);
-    });
-  });
-});
diff --git a/node_modules/bn.js/test/red-test.js b/node_modules/bn.js/test/red-test.js
deleted file mode 100644
index 474679caa9da11283b0216664003aa50c3ef1a67..0000000000000000000000000000000000000000
--- a/node_modules/bn.js/test/red-test.js
+++ /dev/null
@@ -1,140 +0,0 @@
-var assert = require('assert');
-var BN = require('../').BN;
-var fixtures = require('./fixtures');
-
-describe('BN.js/Reduction context', function() {
-  function testMethod(name, fn) {
-    describe(name + ' method', function() {
-      it('should support add, iadd, sub, isub operations', function() {
-        var p = new BN(257);
-        var m = fn(p);
-        var a = new BN(123).toRed(m);
-        var b = new BN(231).toRed(m);
-
-        assert.equal(a.redAdd(b).fromRed().toString(10), '97');
-        assert.equal(a.redSub(b).fromRed().toString(10), '149');
-        assert.equal(b.redSub(a).fromRed().toString(10), '108');
-
-        assert.equal(a.clone().redIAdd(b).fromRed().toString(10), '97');
-        assert.equal(a.clone().redISub(b).fromRed().toString(10), '149');
-        assert.equal(b.clone().redISub(a).fromRed().toString(10), '108');
-      });
-
-      it('should support pow and mul operations', function() {
-        var p192 = new BN(
-            'fffffffffffffffffffffffffffffffeffffffffffffffff',
-            16);
-        var m = fn(p192);
-        var a = new BN(123);
-        var b = new BN(231);
-        var c = a.toRed(m).redMul(b.toRed(m)).fromRed();
-        assert(c.cmp(a.mul(b).mod(p192)) === 0);
-
-        assert.equal(a.toRed(m).redPow(new BN(3)).fromRed()
-                                .cmp(a.sqr().mul(a)), 0);
-        assert.equal(a.toRed(m).redPow(new BN(4)).fromRed()
-                                .cmp(a.sqr().sqr()), 0);
-        assert.equal(a.toRed(m).redPow(new BN(8)).fromRed()
-                                .cmp(a.sqr().sqr().sqr()), 0);
-        assert.equal(a.toRed(m).redPow(new BN(9)).fromRed()
-                                .cmp(a.sqr().sqr().sqr().mul(a)), 0);
-        assert.equal(a.toRed(m).redPow(new BN(17)).fromRed()
-                                .cmp(a.sqr().sqr().sqr().sqr().mul(a)), 0);
-      });
-
-      it('should sqrtm numbers', function() {
-        var p = new BN(263);
-        var m = fn(p);
-        var q = new BN(11).toRed(m);
-        var qr = q.redSqrt(true, p);
-        assert.equal(qr.redSqr().cmp(q), 0);
-        var qr = q.redSqrt(false, p);
-        assert.equal(qr.redSqr().cmp(q), 0);
-
-        var p = new BN(
-            'fffffffffffffffffffffffffffffffeffffffffffffffff',
-            16);
-        var m = fn(p);
-        var q = new BN(13).toRed(m);
-        var qr = q.redSqrt(true, p);
-        assert.equal(qr.redSqr().cmp(q), 0);
-        var qr = q.redSqrt(false, p);
-        assert.equal(qr.redSqr().cmp(q), 0);
-
-        // Tonelli-shanks
-        var p = new BN(13);
-        var m = fn(p);
-        var q = new BN(10).toRed(m);
-        assert.equal(q.redSqrt().fromRed().toString(10), '7');
-      });
-
-      it('should invm numbers', function() {
-        var p = new BN(257);
-        var m = fn(p);
-        var a = new BN(3).toRed(m);
-        var b = a.redInvm(p);
-        assert.equal(a.redMul(b).fromRed().toString(16), '1');
-      });
-
-      it('should imul numbers', function() {
-        var p = new BN(
-            'fffffffffffffffffffffffffffffffeffffffffffffffff',
-            16);
-        var m = fn(p);
-
-        var a = new BN('deadbeefabbadead', 16);
-        var b = new BN('abbadeadbeefdead', 16);
-        var c = a.mul(b).mod(p);
-
-        assert.equal(a.toRed(m).redIMul(b.toRed(m)).fromRed().toString(16),
-                     c.toString(16));
-      });
-    });
-  }
-
-  testMethod('Plain', BN.red);
-  testMethod('Montgomery', BN.mont);
-
-  describe('Pseudo-Mersenne Primes', function() {
-    it('should reduce numbers mod k256', function() {
-      var p = BN._prime('k256');
-
-      assert.equal(p.ireduce(new BN(0xdead)).toString(16), 'dead');
-      assert.equal(p.ireduce(new BN('deadbeef', 16)).toString(16), 'deadbeef');
-
-      var num = new BN('fedcba9876543210fedcba9876543210dead' +
-                           'fedcba9876543210fedcba9876543210dead',
-                       16);
-      var exp = num.mod(p.p).toString(16);
-      assert.equal(p.ireduce(num).toString(16), exp);
-
-      var regr = new BN('f7e46df64c1815962bf7bc9c56128798' +
-                            '3f4fcef9cb1979573163b477eab93959' +
-                            '335dfb29ef07a4d835d22aa3b6797760' +
-                            '70a8b8f59ba73d56d01a79af9',
-                        16);
-      var exp = regr.mod(p.p).toString(16);
-      assert.equal(p.ireduce(regr).toString(16), exp);
-    });
-
-    it('should not fail to invm number mod k256', function() {
-      var regr2 = new BN(
-        '6c150c4aa9a8cf1934485d40674d4a7cd494675537bda36d49405c5d2c6f496f', 16);
-      regr2 = regr2.toRed(BN.red('k256'));
-      assert.equal(regr2.redInvm().redMul(regr2).fromRed().cmpn(1), 0);
-    });
-
-    it('should correctly square the number', function() {
-      var p = BN._prime('k256').p;
-      var red = BN.red('k256');
-
-      var n = new BN('9cd8cb48c3281596139f147c1364a3ed' +
-                         'e88d3f310fdb0eb98c924e599ca1b3c9',
-                     16);
-      var expected = n.sqr().mod(p);
-      var actual = n.toRed(red).redSqr().fromRed();
-
-      assert.equal(actual.toString(16), expected.toString(16));
-    });
-  });
-});
diff --git a/node_modules/bn.js/test/utils-test.js b/node_modules/bn.js/test/utils-test.js
deleted file mode 100644
index c033aa7cd29e00f569e512728ed2e23e5775657c..0000000000000000000000000000000000000000
--- a/node_modules/bn.js/test/utils-test.js
+++ /dev/null
@@ -1,80 +0,0 @@
-var assert = require('assert');
-var BN = require('../').BN;
-var fixtures = require('./fixtures');
-
-describe('BN.js/Utils', function() {
-  describe('.toString()', function() {
-    describe('hex padding', function() {
-      it('should have length of 8 from leading 15', function() {
-        var a = new BN('ffb9602', 16);
-        var b = new Buffer(a.toString('hex', 2), 'hex');
-        assert.equal(a.toString('hex', 2).length, 8);
-      });
-
-      it('should have length of 8 from leading zero', function() {
-        var a = new BN('fb9604', 16);
-        var b = new Buffer(a.toString('hex', 8), 'hex');
-        assert.equal(a.toString('hex', 8).length, 8);
-      });
-
-      it('should have length of 8 from leading zeros', function() {
-        var a = new BN(0);
-        var b = new Buffer(a.toString('hex', 8), 'hex');
-        assert.equal(a.toString('hex', 8).length, 8);
-      });
-
-      it('should have length of 64 from leading 15', function() {
-        var a = new BN(
-            'ffb96ff654e61130ba8422f0debca77a0ea74ae5ea8bca9b54ab64aabf01003',
-            16);
-        var b = new Buffer(a.toString('hex', 2), 'hex');
-        assert.equal(a.toString('hex', 2).length, 64);
-      });
-
-      it('should have length of 64 from leading zero', function() {
-        var a = new BN(
-            'fb96ff654e61130ba8422f0debca77a0ea74ae5ea8bca9b54ab64aabf01003',
-            16);
-        var b = new Buffer(a.toString('hex', 64), 'hex');
-        assert.equal(a.toString('hex', 64).length, 64);
-      });
-    });
-  });
-
-  describe('.bitLength()', function() {
-    it('should return proper bitLength', function() {
-      assert.equal(new BN(0).bitLength(), 0);
-      assert.equal(new BN(0x1).bitLength(), 1);
-      assert.equal(new BN(0x2).bitLength(), 2);
-      assert.equal(new BN(0x3).bitLength(), 2);
-      assert.equal(new BN(0x4).bitLength(), 3);
-      assert.equal(new BN(0x8).bitLength(), 4);
-      assert.equal(new BN(0x10).bitLength(), 5);
-      assert.equal(new BN(0x100).bitLength(), 9);
-      assert.equal(new BN(0x123456).bitLength(), 21);
-      assert.equal(new BN('123456789', 16).bitLength(), 33);
-      assert.equal(new BN('8023456789', 16).bitLength(), 40);
-    });
-  });
-
-  describe('.zeroBits()', function() {
-    it('should return proper zeroBits', function() {
-      assert.equal(new BN(0).zeroBits(), 0);
-      assert.equal(new BN(0x1).zeroBits(), 0);
-      assert.equal(new BN(0x2).zeroBits(), 1);
-      assert.equal(new BN(0x3).zeroBits(), 0);
-      assert.equal(new BN(0x4).zeroBits(), 2);
-      assert.equal(new BN(0x8).zeroBits(), 3);
-      assert.equal(new BN(0x10).zeroBits(), 4);
-      assert.equal(new BN(0x100).zeroBits(), 8);
-      assert.equal(new BN(0x1000000).zeroBits(), 24);
-      assert.equal(new BN(0x123456).zeroBits(), 1);
-    });
-  });
-
-  describe('.toJSON', function() {
-    it('should return hex string', function() {
-      assert.equal(new BN(0x123).toJSON(), '123');
-    });
-  });
-});
diff --git a/node_modules/brace-expansion/LICENSE b/node_modules/brace-expansion/LICENSE
deleted file mode 100644
index de3226673c3874b1c6506db022393c753495655c..0000000000000000000000000000000000000000
--- a/node_modules/brace-expansion/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2013 Julian Gruber <julian@juliangruber.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/brace-expansion/README.md b/node_modules/brace-expansion/README.md
deleted file mode 100644
index 6b4e0e16409152451eb2b55e083a88e3396c23b1..0000000000000000000000000000000000000000
--- a/node_modules/brace-expansion/README.md
+++ /dev/null
@@ -1,129 +0,0 @@
-# brace-expansion
-
-[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), 
-as known from sh/bash, in JavaScript.
-
-[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion)
-[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion)
-[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/)
-
-[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion)
-
-## Example
-
-```js
-var expand = require('brace-expansion');
-
-expand('file-{a,b,c}.jpg')
-// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
-
-expand('-v{,,}')
-// => ['-v', '-v', '-v']
-
-expand('file{0..2}.jpg')
-// => ['file0.jpg', 'file1.jpg', 'file2.jpg']
-
-expand('file-{a..c}.jpg')
-// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
-
-expand('file{2..0}.jpg')
-// => ['file2.jpg', 'file1.jpg', 'file0.jpg']
-
-expand('file{0..4..2}.jpg')
-// => ['file0.jpg', 'file2.jpg', 'file4.jpg']
-
-expand('file-{a..e..2}.jpg')
-// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']
-
-expand('file{00..10..5}.jpg')
-// => ['file00.jpg', 'file05.jpg', 'file10.jpg']
-
-expand('{{A..C},{a..c}}')
-// => ['A', 'B', 'C', 'a', 'b', 'c']
-
-expand('ppp{,config,oe{,conf}}')
-// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']
-```
-
-## API
-
-```js
-var expand = require('brace-expansion');
-```
-
-### var expanded = expand(str)
-
-Return an array of all possible and valid expansions of `str`. If none are
-found, `[str]` is returned.
-
-Valid expansions are:
-
-```js
-/^(.*,)+(.+)?$/
-// {a,b,...}
-```
-
-A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.
-
-```js
-/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
-// {x..y[..incr]}
-```
-
-A numeric sequence from `x` to `y` inclusive, with optional increment.
-If `x` or `y` start with a leading `0`, all the numbers will be padded
-to have equal length. Negative numbers and backwards iteration work too.
-
-```js
-/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
-// {x..y[..incr]}
-```
-
-An alphabetic sequence from `x` to `y` inclusive, with optional increment.
-`x` and `y` must be exactly one character, and if given, `incr` must be a
-number.
-
-For compatibility reasons, the string `${` is not eligible for brace expansion.
-
-## Installation
-
-With [npm](https://npmjs.org) do:
-
-```bash
-npm install brace-expansion
-```
-
-## Contributors
-
-- [Julian Gruber](https://github.com/juliangruber)
-- [Isaac Z. Schlueter](https://github.com/isaacs)
-
-## Sponsors
-
-This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)!
-
-Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)!
-
-## 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/brace-expansion/index.js b/node_modules/brace-expansion/index.js
deleted file mode 100644
index 0478be81eabc2b140c2405999e46ba98214461eb..0000000000000000000000000000000000000000
--- a/node_modules/brace-expansion/index.js
+++ /dev/null
@@ -1,201 +0,0 @@
-var concatMap = require('concat-map');
-var balanced = require('balanced-match');
-
-module.exports = expandTop;
-
-var escSlash = '\0SLASH'+Math.random()+'\0';
-var escOpen = '\0OPEN'+Math.random()+'\0';
-var escClose = '\0CLOSE'+Math.random()+'\0';
-var escComma = '\0COMMA'+Math.random()+'\0';
-var escPeriod = '\0PERIOD'+Math.random()+'\0';
-
-function numeric(str) {
-  return parseInt(str, 10) == str
-    ? parseInt(str, 10)
-    : str.charCodeAt(0);
-}
-
-function escapeBraces(str) {
-  return str.split('\\\\').join(escSlash)
-            .split('\\{').join(escOpen)
-            .split('\\}').join(escClose)
-            .split('\\,').join(escComma)
-            .split('\\.').join(escPeriod);
-}
-
-function unescapeBraces(str) {
-  return str.split(escSlash).join('\\')
-            .split(escOpen).join('{')
-            .split(escClose).join('}')
-            .split(escComma).join(',')
-            .split(escPeriod).join('.');
-}
-
-
-// Basically just str.split(","), but handling cases
-// where we have nested braced sections, which should be
-// treated as individual members, like {a,{b,c},d}
-function parseCommaParts(str) {
-  if (!str)
-    return [''];
-
-  var parts = [];
-  var m = balanced('{', '}', str);
-
-  if (!m)
-    return str.split(',');
-
-  var pre = m.pre;
-  var body = m.body;
-  var post = m.post;
-  var p = pre.split(',');
-
-  p[p.length-1] += '{' + body + '}';
-  var postParts = parseCommaParts(post);
-  if (post.length) {
-    p[p.length-1] += postParts.shift();
-    p.push.apply(p, postParts);
-  }
-
-  parts.push.apply(parts, p);
-
-  return parts;
-}
-
-function expandTop(str) {
-  if (!str)
-    return [];
-
-  // I don't know why Bash 4.3 does this, but it does.
-  // Anything starting with {} will have the first two bytes preserved
-  // but *only* at the top level, so {},a}b will not expand to anything,
-  // but a{},b}c will be expanded to [a}c,abc].
-  // One could argue that this is a bug in Bash, but since the goal of
-  // this module is to match Bash's rules, we escape a leading {}
-  if (str.substr(0, 2) === '{}') {
-    str = '\\{\\}' + str.substr(2);
-  }
-
-  return expand(escapeBraces(str), true).map(unescapeBraces);
-}
-
-function identity(e) {
-  return e;
-}
-
-function embrace(str) {
-  return '{' + str + '}';
-}
-function isPadded(el) {
-  return /^-?0\d/.test(el);
-}
-
-function lte(i, y) {
-  return i <= y;
-}
-function gte(i, y) {
-  return i >= y;
-}
-
-function expand(str, isTop) {
-  var expansions = [];
-
-  var m = balanced('{', '}', str);
-  if (!m || /\$$/.test(m.pre)) return [str];
-
-  var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
-  var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
-  var isSequence = isNumericSequence || isAlphaSequence;
-  var isOptions = m.body.indexOf(',') >= 0;
-  if (!isSequence && !isOptions) {
-    // {a},b}
-    if (m.post.match(/,.*\}/)) {
-      str = m.pre + '{' + m.body + escClose + m.post;
-      return expand(str);
-    }
-    return [str];
-  }
-
-  var n;
-  if (isSequence) {
-    n = m.body.split(/\.\./);
-  } else {
-    n = parseCommaParts(m.body);
-    if (n.length === 1) {
-      // x{{a,b}}y ==> x{a}y x{b}y
-      n = expand(n[0], false).map(embrace);
-      if (n.length === 1) {
-        var post = m.post.length
-          ? expand(m.post, false)
-          : [''];
-        return post.map(function(p) {
-          return m.pre + n[0] + p;
-        });
-      }
-    }
-  }
-
-  // at this point, n is the parts, and we know it's not a comma set
-  // with a single entry.
-
-  // no need to expand pre, since it is guaranteed to be free of brace-sets
-  var pre = m.pre;
-  var post = m.post.length
-    ? expand(m.post, false)
-    : [''];
-
-  var N;
-
-  if (isSequence) {
-    var x = numeric(n[0]);
-    var y = numeric(n[1]);
-    var width = Math.max(n[0].length, n[1].length)
-    var incr = n.length == 3
-      ? Math.abs(numeric(n[2]))
-      : 1;
-    var test = lte;
-    var reverse = y < x;
-    if (reverse) {
-      incr *= -1;
-      test = gte;
-    }
-    var pad = n.some(isPadded);
-
-    N = [];
-
-    for (var i = x; test(i, y); i += incr) {
-      var c;
-      if (isAlphaSequence) {
-        c = String.fromCharCode(i);
-        if (c === '\\')
-          c = '';
-      } else {
-        c = String(i);
-        if (pad) {
-          var need = width - c.length;
-          if (need > 0) {
-            var z = new Array(need + 1).join('0');
-            if (i < 0)
-              c = '-' + z + c.slice(1);
-            else
-              c = z + c;
-          }
-        }
-      }
-      N.push(c);
-    }
-  } else {
-    N = concatMap(n, function(el) { return expand(el, false) });
-  }
-
-  for (var j = 0; j < N.length; j++) {
-    for (var k = 0; k < post.length; k++) {
-      var expansion = pre + N[j] + post[k];
-      if (!isTop || isSequence || expansion)
-        expansions.push(expansion);
-    }
-  }
-
-  return expansions;
-}
-
diff --git a/node_modules/brace-expansion/package.json b/node_modules/brace-expansion/package.json
deleted file mode 100644
index a18faa8fd67b8265a4c01909f8f16d55a46bec32..0000000000000000000000000000000000000000
--- a/node_modules/brace-expansion/package.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "name": "brace-expansion",
-  "description": "Brace expansion as known from sh/bash",
-  "version": "1.1.11",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/juliangruber/brace-expansion.git"
-  },
-  "homepage": "https://github.com/juliangruber/brace-expansion",
-  "main": "index.js",
-  "scripts": {
-    "test": "tape test/*.js",
-    "gentest": "bash test/generate.sh",
-    "bench": "matcha test/perf/bench.js"
-  },
-  "dependencies": {
-    "balanced-match": "^1.0.0",
-    "concat-map": "0.0.1"
-  },
-  "devDependencies": {
-    "matcha": "^0.7.0",
-    "tape": "^4.6.0"
-  },
-  "keywords": [],
-  "author": {
-    "name": "Julian Gruber",
-    "email": "mail@juliangruber.com",
-    "url": "http://juliangruber.com"
-  },
-  "license": "MIT",
-  "testling": {
-    "files": "test/*.js",
-    "browsers": [
-      "ie/8..latest",
-      "firefox/20..latest",
-      "firefox/nightly",
-      "chrome/25..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"
-    ]
-  }
-}
diff --git a/node_modules/braces/LICENSE b/node_modules/braces/LICENSE
deleted file mode 100644
index 9af4a67d206f24ecdbb5fdff2839041ca0bbd346..0000000000000000000000000000000000000000
--- a/node_modules/braces/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014-present, Jon Schlinkert.
-
-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/braces/README.md b/node_modules/braces/README.md
deleted file mode 100644
index f59dd604566f1239274c4caf6d88b90b4ddeb25d..0000000000000000000000000000000000000000
--- a/node_modules/braces/README.md
+++ /dev/null
@@ -1,586 +0,0 @@
-# braces [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![NPM version](https://img.shields.io/npm/v/braces.svg?style=flat)](https://www.npmjs.com/package/braces) [![NPM monthly downloads](https://img.shields.io/npm/dm/braces.svg?style=flat)](https://npmjs.org/package/braces) [![NPM total downloads](https://img.shields.io/npm/dt/braces.svg?style=flat)](https://npmjs.org/package/braces) [![Linux Build Status](https://img.shields.io/travis/micromatch/braces.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/braces)
-
-> Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed.
-
-Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-$ npm install --save braces
-```
-
-## v3.0.0 Released!!
-
-See the [changelog](CHANGELOG.md) for details.
-
-## Why use braces?
-
-Brace patterns make globs more powerful by adding the ability to match specific ranges and sequences of characters.
-
-- **Accurate** - complete support for the [Bash 4.3 Brace Expansion](www.gnu.org/software/bash/) specification (passes all of the Bash braces tests)
-- **[fast and performant](#benchmarks)** - Starts fast, runs fast and [scales well](#performance) as patterns increase in complexity.
-- **Organized code base** - The parser and compiler are easy to maintain and update when edge cases crop up.
-- **Well-tested** - Thousands of test assertions, and passes all of the Bash, minimatch, and [brace-expansion](https://github.com/juliangruber/brace-expansion) unit tests (as of the date this was written).
-- **Safer** - You shouldn't have to worry about users defining aggressive or malicious brace patterns that can break your application. Braces takes measures to prevent malicious regex that can be used for DDoS attacks (see [catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)).
-- [Supports lists](#lists) - (aka "sets") `a/{b,c}/d` => `['a/b/d', 'a/c/d']`
-- [Supports sequences](#sequences) - (aka "ranges") `{01..03}` => `['01', '02', '03']`
-- [Supports steps](#steps) - (aka "increments") `{2..10..2}` => `['2', '4', '6', '8', '10']`
-- [Supports escaping](#escaping) - To prevent evaluation of special characters.
-
-## Usage
-
-The main export is a function that takes one or more brace `patterns` and `options`.
-
-```js
-const braces = require('braces');
-// braces(patterns[, options]);
-
-console.log(braces(['{01..05}', '{a..e}']));
-//=> ['(0[1-5])', '([a-e])']
-
-console.log(braces(['{01..05}', '{a..e}'], { expand: true }));
-//=> ['01', '02', '03', '04', '05', 'a', 'b', 'c', 'd', 'e']
-```
-
-### Brace Expansion vs. Compilation
-
-By default, brace patterns are compiled into strings that are optimized for creating regular expressions and matching.
-
-**Compiled**
-
-```js
-console.log(braces('a/{x,y,z}/b'));
-//=> ['a/(x|y|z)/b']
-console.log(braces(['a/{01..20}/b', 'a/{1..5}/b']));
-//=> [ 'a/(0[1-9]|1[0-9]|20)/b', 'a/([1-5])/b' ]
-```
-
-**Expanded**
-
-Enable brace expansion by setting the `expand` option to true, or by using [braces.expand()](#expand) (returns an array similar to what you'd expect from Bash, or `echo {1..5}`, or [minimatch](https://github.com/isaacs/minimatch)):
-
-```js
-console.log(braces('a/{x,y,z}/b', { expand: true }));
-//=> ['a/x/b', 'a/y/b', 'a/z/b']
-
-console.log(braces.expand('{01..10}'));
-//=> ['01','02','03','04','05','06','07','08','09','10']
-```
-
-### Lists
-
-Expand lists (like Bash "sets"):
-
-```js
-console.log(braces('a/{foo,bar,baz}/*.js'));
-//=> ['a/(foo|bar|baz)/*.js']
-
-console.log(braces.expand('a/{foo,bar,baz}/*.js'));
-//=> ['a/foo/*.js', 'a/bar/*.js', 'a/baz/*.js']
-```
-
-### Sequences
-
-Expand ranges of characters (like Bash "sequences"):
-
-```js
-console.log(braces.expand('{1..3}')); // ['1', '2', '3']
-console.log(braces.expand('a/{1..3}/b')); // ['a/1/b', 'a/2/b', 'a/3/b']
-console.log(braces('{a..c}', { expand: true })); // ['a', 'b', 'c']
-console.log(braces('foo/{a..c}', { expand: true })); // ['foo/a', 'foo/b', 'foo/c']
-
-// supports zero-padded ranges
-console.log(braces('a/{01..03}/b')); //=> ['a/(0[1-3])/b']
-console.log(braces('a/{001..300}/b')); //=> ['a/(0{2}[1-9]|0[1-9][0-9]|[12][0-9]{2}|300)/b']
-```
-
-See [fill-range](https://github.com/jonschlinkert/fill-range) for all available range-expansion options.
-
-### Steppped ranges
-
-Steps, or increments, may be used with ranges:
-
-```js
-console.log(braces.expand('{2..10..2}'));
-//=> ['2', '4', '6', '8', '10']
-
-console.log(braces('{2..10..2}'));
-//=> ['(2|4|6|8|10)']
-```
-
-When the [.optimize](#optimize) method is used, or [options.optimize](#optionsoptimize) is set to true, sequences are passed to [to-regex-range](https://github.com/jonschlinkert/to-regex-range) for expansion.
-
-### Nesting
-
-Brace patterns may be nested. The results of each expanded string are not sorted, and left to right order is preserved.
-
-**"Expanded" braces**
-
-```js
-console.log(braces.expand('a{b,c,/{x,y}}/e'));
-//=> ['ab/e', 'ac/e', 'a/x/e', 'a/y/e']
-
-console.log(braces.expand('a/{x,{1..5},y}/c'));
-//=> ['a/x/c', 'a/1/c', 'a/2/c', 'a/3/c', 'a/4/c', 'a/5/c', 'a/y/c']
-```
-
-**"Optimized" braces**
-
-```js
-console.log(braces('a{b,c,/{x,y}}/e'));
-//=> ['a(b|c|/(x|y))/e']
-
-console.log(braces('a/{x,{1..5},y}/c'));
-//=> ['a/(x|([1-5])|y)/c']
-```
-
-### Escaping
-
-**Escaping braces**
-
-A brace pattern will not be expanded or evaluted if _either the opening or closing brace is escaped_:
-
-```js
-console.log(braces.expand('a\\{d,c,b}e'));
-//=> ['a{d,c,b}e']
-
-console.log(braces.expand('a{d,c,b\\}e'));
-//=> ['a{d,c,b}e']
-```
-
-**Escaping commas**
-
-Commas inside braces may also be escaped:
-
-```js
-console.log(braces.expand('a{b\\,c}d'));
-//=> ['a{b,c}d']
-
-console.log(braces.expand('a{d\\,c,b}e'));
-//=> ['ad,ce', 'abe']
-```
-
-**Single items**
-
-Following bash conventions, a brace pattern is also not expanded when it contains a single character:
-
-```js
-console.log(braces.expand('a{b}c'));
-//=> ['a{b}c']
-```
-
-## Options
-
-### options.maxLength
-
-**Type**: `Number`
-
-**Default**: `10,000`
-
-**Description**: Limit the length of the input string. Useful when the input string is generated or your application allows users to pass a string, et cetera.
-
-```js
-console.log(braces('a/{b,c}/d', { maxLength: 3 })); //=> throws an error
-```
-
-### options.expand
-
-**Type**: `Boolean`
-
-**Default**: `undefined`
-
-**Description**: Generate an "expanded" brace pattern (alternatively you can use the `braces.expand()` method, which does the same thing).
-
-```js
-console.log(braces('a/{b,c}/d', { expand: true }));
-//=> [ 'a/b/d', 'a/c/d' ]
-```
-
-### options.nodupes
-
-**Type**: `Boolean`
-
-**Default**: `undefined`
-
-**Description**: Remove duplicates from the returned array.
-
-### options.rangeLimit
-
-**Type**: `Number`
-
-**Default**: `1000`
-
-**Description**: To prevent malicious patterns from being passed by users, an error is thrown when `braces.expand()` is used or `options.expand` is true and the generated range will exceed the `rangeLimit`.
-
-You can customize `options.rangeLimit` or set it to `Inifinity` to disable this altogether.
-
-**Examples**
-
-```js
-// pattern exceeds the "rangeLimit", so it's optimized automatically
-console.log(braces.expand('{1..1000}'));
-//=> ['([1-9]|[1-9][0-9]{1,2}|1000)']
-
-// pattern does not exceed "rangeLimit", so it's NOT optimized
-console.log(braces.expand('{1..100}'));
-//=> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100']
-```
-
-### options.transform
-
-**Type**: `Function`
-
-**Default**: `undefined`
-
-**Description**: Customize range expansion.
-
-**Example: Transforming non-numeric values**
-
-```js
-const alpha = braces.expand('x/{a..e}/y', {
-  transform(value, index) {
-    // When non-numeric values are passed, "value" is a character code.
-    return 'foo/' + String.fromCharCode(value) + '-' + index;
-  },
-});
-console.log(alpha);
-//=> [ 'x/foo/a-0/y', 'x/foo/b-1/y', 'x/foo/c-2/y', 'x/foo/d-3/y', 'x/foo/e-4/y' ]
-```
-
-**Example: Transforming numeric values**
-
-```js
-const numeric = braces.expand('{1..5}', {
-  transform(value) {
-    // when numeric values are passed, "value" is a number
-    return 'foo/' + value * 2;
-  },
-});
-console.log(numeric);
-//=> [ 'foo/2', 'foo/4', 'foo/6', 'foo/8', 'foo/10' ]
-```
-
-### options.quantifiers
-
-**Type**: `Boolean`
-
-**Default**: `undefined`
-
-**Description**: In regular expressions, quanitifiers can be used to specify how many times a token can be repeated. For example, `a{1,3}` will match the letter `a` one to three times.
-
-Unfortunately, regex quantifiers happen to share the same syntax as [Bash lists](#lists)
-
-The `quantifiers` option tells braces to detect when [regex quantifiers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#quantifiers) are defined in the given pattern, and not to try to expand them as lists.
-
-**Examples**
-
-```js
-const braces = require('braces');
-console.log(braces('a/b{1,3}/{x,y,z}'));
-//=> [ 'a/b(1|3)/(x|y|z)' ]
-console.log(braces('a/b{1,3}/{x,y,z}', { quantifiers: true }));
-//=> [ 'a/b{1,3}/(x|y|z)' ]
-console.log(braces('a/b{1,3}/{x,y,z}', { quantifiers: true, expand: true }));
-//=> [ 'a/b{1,3}/x', 'a/b{1,3}/y', 'a/b{1,3}/z' ]
-```
-
-### options.keepEscaping
-
-**Type**: `Boolean`
-
-**Default**: `undefined`
-
-**Description**: Do not strip backslashes that were used for escaping from the result.
-
-## What is "brace expansion"?
-
-Brace expansion is a type of parameter expansion that was made popular by unix shells for generating lists of strings, as well as regex-like matching when used alongside wildcards (globs).
-
-In addition to "expansion", braces are also used for matching. In other words:
-
-- [brace expansion](#brace-expansion) is for generating new lists
-- [brace matching](#brace-matching) is for filtering existing lists
-
-<details>
-<summary><strong>More about brace expansion</strong> (click to expand)</summary>
-
-There are two main types of brace expansion:
-
-1. **lists**: which are defined using comma-separated values inside curly braces: `{a,b,c}`
-2. **sequences**: which are defined using a starting value and an ending value, separated by two dots: `a{1..3}b`. Optionally, a third argument may be passed to define a "step" or increment to use: `a{1..100..10}b`. These are also sometimes referred to as "ranges".
-
-Here are some example brace patterns to illustrate how they work:
-
-**Sets**
-
-```
-{a,b,c}       => a b c
-{a,b,c}{1,2}  => a1 a2 b1 b2 c1 c2
-```
-
-**Sequences**
-
-```
-{1..9}        => 1 2 3 4 5 6 7 8 9
-{4..-4}       => 4 3 2 1 0 -1 -2 -3 -4
-{1..20..3}    => 1 4 7 10 13 16 19
-{a..j}        => a b c d e f g h i j
-{j..a}        => j i h g f e d c b a
-{a..z..3}     => a d g j m p s v y
-```
-
-**Combination**
-
-Sets and sequences can be mixed together or used along with any other strings.
-
-```
-{a,b,c}{1..3}   => a1 a2 a3 b1 b2 b3 c1 c2 c3
-foo/{a,b,c}/bar => foo/a/bar foo/b/bar foo/c/bar
-```
-
-The fact that braces can be "expanded" from relatively simple patterns makes them ideal for quickly generating test fixtures, file paths, and similar use cases.
-
-## Brace matching
-
-In addition to _expansion_, brace patterns are also useful for performing regular-expression-like matching.
-
-For example, the pattern `foo/{1..3}/bar` would match any of following strings:
-
-```
-foo/1/bar
-foo/2/bar
-foo/3/bar
-```
-
-But not:
-
-```
-baz/1/qux
-baz/2/qux
-baz/3/qux
-```
-
-Braces can also be combined with [glob patterns](https://github.com/jonschlinkert/micromatch) to perform more advanced wildcard matching. For example, the pattern `*/{1..3}/*` would match any of following strings:
-
-```
-foo/1/bar
-foo/2/bar
-foo/3/bar
-baz/1/qux
-baz/2/qux
-baz/3/qux
-```
-
-## Brace matching pitfalls
-
-Although brace patterns offer a user-friendly way of matching ranges or sets of strings, there are also some major disadvantages and potential risks you should be aware of.
-
-### tldr
-
-**"brace bombs"**
-
-- brace expansion can eat up a huge amount of processing resources
-- as brace patterns increase _linearly in size_, the system resources required to expand the pattern increase exponentially
-- users can accidentally (or intentially) exhaust your system's resources resulting in the equivalent of a DoS attack (bonus: no programming knowledge is required!)
-
-For a more detailed explanation with examples, see the [geometric complexity](#geometric-complexity) section.
-
-### The solution
-
-Jump to the [performance section](#performance) to see how Braces solves this problem in comparison to other libraries.
-
-### Geometric complexity
-
-At minimum, brace patterns with sets limited to two elements have quadradic or `O(n^2)` complexity. But the complexity of the algorithm increases exponentially as the number of sets, _and elements per set_, increases, which is `O(n^c)`.
-
-For example, the following sets demonstrate quadratic (`O(n^2)`) complexity:
-
-```
-{1,2}{3,4}      => (2X2)    => 13 14 23 24
-{1,2}{3,4}{5,6} => (2X2X2)  => 135 136 145 146 235 236 245 246
-```
-
-But add an element to a set, and we get a n-fold Cartesian product with `O(n^c)` complexity:
-
-```
-{1,2,3}{4,5,6}{7,8,9} => (3X3X3) => 147 148 149 157 158 159 167 168 169 247 248
-                                    249 257 258 259 267 268 269 347 348 349 357
-                                    358 359 367 368 369
-```
-
-Now, imagine how this complexity grows given that each element is a n-tuple:
-
-```
-{1..100}{1..100}         => (100X100)     => 10,000 elements (38.4 kB)
-{1..100}{1..100}{1..100} => (100X100X100) => 1,000,000 elements (5.76 MB)
-```
-
-Although these examples are clearly contrived, they demonstrate how brace patterns can quickly grow out of control.
-
-**More information**
-
-Interested in learning more about brace expansion?
-
-- [linuxjournal/bash-brace-expansion](http://www.linuxjournal.com/content/bash-brace-expansion)
-- [rosettacode/Brace_expansion](https://rosettacode.org/wiki/Brace_expansion)
-- [cartesian product](https://en.wikipedia.org/wiki/Cartesian_product)
-
-</details>
-
-## Performance
-
-Braces is not only screaming fast, it's also more accurate the other brace expansion libraries.
-
-### Better algorithms
-
-Fortunately there is a solution to the ["brace bomb" problem](#brace-matching-pitfalls): _don't expand brace patterns into an array when they're used for matching_.
-
-Instead, convert the pattern into an optimized regular expression. This is easier said than done, and braces is the only library that does this currently.
-
-**The proof is in the numbers**
-
-Minimatch gets exponentially slower as patterns increase in complexity, braces does not. The following results were generated using `braces()` and `minimatch.braceExpand()`, respectively.
-
-| **Pattern**                 | **braces**          | **[minimatch][]**            |
-| --------------------------- | ------------------- | ---------------------------- |
-| `{1..9007199254740991}`[^1] | `298 B` (5ms 459μs) | N/A (freezes)                |
-| `{1..1000000000000000}`     | `41 B` (1ms 15μs)   | N/A (freezes)                |
-| `{1..100000000000000}`      | `40 B` (890μs)      | N/A (freezes)                |
-| `{1..10000000000000}`       | `39 B` (2ms 49μs)   | N/A (freezes)                |
-| `{1..1000000000000}`        | `38 B` (608μs)      | N/A (freezes)                |
-| `{1..100000000000}`         | `37 B` (397μs)      | N/A (freezes)                |
-| `{1..10000000000}`          | `35 B` (983μs)      | N/A (freezes)                |
-| `{1..1000000000}`           | `34 B` (798μs)      | N/A (freezes)                |
-| `{1..100000000}`            | `33 B` (733μs)      | N/A (freezes)                |
-| `{1..10000000}`             | `32 B` (5ms 632μs)  | `78.89 MB` (16s 388ms 569μs) |
-| `{1..1000000}`              | `31 B` (1ms 381μs)  | `6.89 MB` (1s 496ms 887μs)   |
-| `{1..100000}`               | `30 B` (950μs)      | `588.89 kB` (146ms 921μs)    |
-| `{1..10000}`                | `29 B` (1ms 114μs)  | `48.89 kB` (14ms 187μs)      |
-| `{1..1000}`                 | `28 B` (760μs)      | `3.89 kB` (1ms 453μs)        |
-| `{1..100}`                  | `22 B` (345μs)      | `291 B` (196μs)              |
-| `{1..10}`                   | `10 B` (533μs)      | `20 B` (37μs)                |
-| `{1..3}`                    | `7 B` (190μs)       | `5 B` (27μs)                 |
-
-### Faster algorithms
-
-When you need expansion, braces is still much faster.
-
-_(the following results were generated using `braces.expand()` and `minimatch.braceExpand()`, respectively)_
-
-| **Pattern**     | **braces**                  | **[minimatch][]**            |
-| --------------- | --------------------------- | ---------------------------- |
-| `{1..10000000}` | `78.89 MB` (2s 698ms 642μs) | `78.89 MB` (18s 601ms 974μs) |
-| `{1..1000000}`  | `6.89 MB` (458ms 576μs)     | `6.89 MB` (1s 491ms 621μs)   |
-| `{1..100000}`   | `588.89 kB` (20ms 728μs)    | `588.89 kB` (156ms 919μs)    |
-| `{1..10000}`    | `48.89 kB` (2ms 202μs)      | `48.89 kB` (13ms 641μs)      |
-| `{1..1000}`     | `3.89 kB` (1ms 796μs)       | `3.89 kB` (1ms 958μs)        |
-| `{1..100}`      | `291 B` (424μs)             | `291 B` (211μs)              |
-| `{1..10}`       | `20 B` (487μs)              | `20 B` (72μs)                |
-| `{1..3}`        | `5 B` (166μs)               | `5 B` (27μs)                 |
-
-If you'd like to run these comparisons yourself, see [test/support/generate.js](test/support/generate.js).
-
-## Benchmarks
-
-### Running benchmarks
-
-Install dev dependencies:
-
-```bash
-npm i -d && npm benchmark
-```
-
-### Latest results
-
-Braces is more accurate, without sacrificing performance.
-
-```bash
-● expand - range (expanded)
-     braces x 53,167 ops/sec ±0.12% (102 runs sampled)
-  minimatch x 11,378 ops/sec ±0.10% (102 runs sampled)
-● expand - range (optimized for regex)
-     braces x 373,442 ops/sec ±0.04% (100 runs sampled)
-  minimatch x 3,262 ops/sec ±0.18% (100 runs sampled)
-● expand - nested ranges (expanded)
-     braces x 33,921 ops/sec ±0.09% (99 runs sampled)
-  minimatch x 10,855 ops/sec ±0.28% (100 runs sampled)
-● expand - nested ranges (optimized for regex)
-     braces x 287,479 ops/sec ±0.52% (98 runs sampled)
-  minimatch x 3,219 ops/sec ±0.28% (101 runs sampled)
-● expand - set (expanded)
-     braces x 238,243 ops/sec ±0.19% (97 runs sampled)
-  minimatch x 538,268 ops/sec ±0.31% (96 runs sampled)
-● expand - set (optimized for regex)
-     braces x 321,844 ops/sec ±0.10% (97 runs sampled)
-  minimatch x 140,600 ops/sec ±0.15% (100 runs sampled)
-● expand - nested sets (expanded)
-     braces x 165,371 ops/sec ±0.42% (96 runs sampled)
-  minimatch x 337,720 ops/sec ±0.28% (100 runs sampled)
-● expand - nested sets (optimized for regex)
-     braces x 242,948 ops/sec ±0.12% (99 runs sampled)
-  minimatch x 87,403 ops/sec ±0.79% (96 runs sampled)
-```
-
-## About
-
-<details>
-<summary><strong>Contributing</strong></summary>
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-</details>
-
-<details>
-<summary><strong>Running Tests</strong></summary>
-
-Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
-
-```sh
-$ npm install && npm test
-```
-
-</details>
-
-<details>
-<summary><strong>Building docs</strong></summary>
-
-_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
-
-To generate the readme, run the following command:
-
-```sh
-$ npm install -g verbose/verb#dev verb-generate-readme && verb
-```
-
-</details>
-
-### Contributors
-
-| **Commits** | **Contributor**                                               |
-| ----------- | ------------------------------------------------------------- |
-| 197         | [jonschlinkert](https://github.com/jonschlinkert)             |
-| 4           | [doowb](https://github.com/doowb)                             |
-| 1           | [es128](https://github.com/es128)                             |
-| 1           | [eush77](https://github.com/eush77)                           |
-| 1           | [hemanth](https://github.com/hemanth)                         |
-| 1           | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) |
-
-### Author
-
-**Jon Schlinkert**
-
-- [GitHub Profile](https://github.com/jonschlinkert)
-- [Twitter Profile](https://twitter.com/jonschlinkert)
-- [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
-
-### License
-
-Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT License](LICENSE).
-
----
-
-_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 08, 2019._
diff --git a/node_modules/braces/index.js b/node_modules/braces/index.js
deleted file mode 100644
index d222c13b579d2d476dc26d692219dbaee1665b88..0000000000000000000000000000000000000000
--- a/node_modules/braces/index.js
+++ /dev/null
@@ -1,170 +0,0 @@
-'use strict';
-
-const stringify = require('./lib/stringify');
-const compile = require('./lib/compile');
-const expand = require('./lib/expand');
-const parse = require('./lib/parse');
-
-/**
- * Expand the given pattern or create a regex-compatible string.
- *
- * ```js
- * const braces = require('braces');
- * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)']
- * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c']
- * ```
- * @param {String} `str`
- * @param {Object} `options`
- * @return {String}
- * @api public
- */
-
-const braces = (input, options = {}) => {
-  let output = [];
-
-  if (Array.isArray(input)) {
-    for (const pattern of input) {
-      const result = braces.create(pattern, options);
-      if (Array.isArray(result)) {
-        output.push(...result);
-      } else {
-        output.push(result);
-      }
-    }
-  } else {
-    output = [].concat(braces.create(input, options));
-  }
-
-  if (options && options.expand === true && options.nodupes === true) {
-    output = [...new Set(output)];
-  }
-  return output;
-};
-
-/**
- * Parse the given `str` with the given `options`.
- *
- * ```js
- * // braces.parse(pattern, [, options]);
- * const ast = braces.parse('a/{b,c}/d');
- * console.log(ast);
- * ```
- * @param {String} pattern Brace pattern to parse
- * @param {Object} options
- * @return {Object} Returns an AST
- * @api public
- */
-
-braces.parse = (input, options = {}) => parse(input, options);
-
-/**
- * Creates a braces string from an AST, or an AST node.
- *
- * ```js
- * const braces = require('braces');
- * let ast = braces.parse('foo/{a,b}/bar');
- * console.log(stringify(ast.nodes[2])); //=> '{a,b}'
- * ```
- * @param {String} `input` Brace pattern or AST.
- * @param {Object} `options`
- * @return {Array} Returns an array of expanded values.
- * @api public
- */
-
-braces.stringify = (input, options = {}) => {
-  if (typeof input === 'string') {
-    return stringify(braces.parse(input, options), options);
-  }
-  return stringify(input, options);
-};
-
-/**
- * Compiles a brace pattern into a regex-compatible, optimized string.
- * This method is called by the main [braces](#braces) function by default.
- *
- * ```js
- * const braces = require('braces');
- * console.log(braces.compile('a/{b,c}/d'));
- * //=> ['a/(b|c)/d']
- * ```
- * @param {String} `input` Brace pattern or AST.
- * @param {Object} `options`
- * @return {Array} Returns an array of expanded values.
- * @api public
- */
-
-braces.compile = (input, options = {}) => {
-  if (typeof input === 'string') {
-    input = braces.parse(input, options);
-  }
-  return compile(input, options);
-};
-
-/**
- * Expands a brace pattern into an array. This method is called by the
- * main [braces](#braces) function when `options.expand` is true. Before
- * using this method it's recommended that you read the [performance notes](#performance))
- * and advantages of using [.compile](#compile) instead.
- *
- * ```js
- * const braces = require('braces');
- * console.log(braces.expand('a/{b,c}/d'));
- * //=> ['a/b/d', 'a/c/d'];
- * ```
- * @param {String} `pattern` Brace pattern
- * @param {Object} `options`
- * @return {Array} Returns an array of expanded values.
- * @api public
- */
-
-braces.expand = (input, options = {}) => {
-  if (typeof input === 'string') {
-    input = braces.parse(input, options);
-  }
-
-  let result = expand(input, options);
-
-  // filter out empty strings if specified
-  if (options.noempty === true) {
-    result = result.filter(Boolean);
-  }
-
-  // filter out duplicates if specified
-  if (options.nodupes === true) {
-    result = [...new Set(result)];
-  }
-
-  return result;
-};
-
-/**
- * Processes a brace pattern and returns either an expanded array
- * (if `options.expand` is true), a highly optimized regex-compatible string.
- * This method is called by the main [braces](#braces) function.
- *
- * ```js
- * const braces = require('braces');
- * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}'))
- * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)'
- * ```
- * @param {String} `pattern` Brace pattern
- * @param {Object} `options`
- * @return {Array} Returns an array of expanded values.
- * @api public
- */
-
-braces.create = (input, options = {}) => {
-  if (input === '' || input.length < 3) {
-    return [input];
-  }
-
-  return options.expand !== true
-    ? braces.compile(input, options)
-    : braces.expand(input, options);
-};
-
-/**
- * Expose "braces"
- */
-
-module.exports = braces;
diff --git a/node_modules/braces/lib/compile.js b/node_modules/braces/lib/compile.js
deleted file mode 100644
index dce69beb90ece5c3b0ca234a949418f9f34eedbc..0000000000000000000000000000000000000000
--- a/node_modules/braces/lib/compile.js
+++ /dev/null
@@ -1,60 +0,0 @@
-'use strict';
-
-const fill = require('fill-range');
-const utils = require('./utils');
-
-const compile = (ast, options = {}) => {
-  const walk = (node, parent = {}) => {
-    const invalidBlock = utils.isInvalidBrace(parent);
-    const invalidNode = node.invalid === true && options.escapeInvalid === true;
-    const invalid = invalidBlock === true || invalidNode === true;
-    const prefix = options.escapeInvalid === true ? '\\' : '';
-    let output = '';
-
-    if (node.isOpen === true) {
-      return prefix + node.value;
-    }
-
-    if (node.isClose === true) {
-      console.log('node.isClose', prefix, node.value);
-      return prefix + node.value;
-    }
-
-    if (node.type === 'open') {
-      return invalid ? prefix + node.value : '(';
-    }
-
-    if (node.type === 'close') {
-      return invalid ? prefix + node.value : ')';
-    }
-
-    if (node.type === 'comma') {
-      return node.prev.type === 'comma' ? '' : invalid ? node.value : '|';
-    }
-
-    if (node.value) {
-      return node.value;
-    }
-
-    if (node.nodes && node.ranges > 0) {
-      const args = utils.reduce(node.nodes);
-      const range = fill(...args, { ...options, wrap: false, toRegex: true, strictZeros: true });
-
-      if (range.length !== 0) {
-        return args.length > 1 && range.length > 1 ? `(${range})` : range;
-      }
-    }
-
-    if (node.nodes) {
-      for (const child of node.nodes) {
-        output += walk(child, node);
-      }
-    }
-
-    return output;
-  };
-
-  return walk(ast);
-};
-
-module.exports = compile;
diff --git a/node_modules/braces/lib/constants.js b/node_modules/braces/lib/constants.js
deleted file mode 100644
index 2bb3b8840382c56700869b3a9e1f958fcce01efd..0000000000000000000000000000000000000000
--- a/node_modules/braces/lib/constants.js
+++ /dev/null
@@ -1,57 +0,0 @@
-'use strict';
-
-module.exports = {
-  MAX_LENGTH: 10000,
-
-  // Digits
-  CHAR_0: '0', /* 0 */
-  CHAR_9: '9', /* 9 */
-
-  // Alphabet chars.
-  CHAR_UPPERCASE_A: 'A', /* A */
-  CHAR_LOWERCASE_A: 'a', /* a */
-  CHAR_UPPERCASE_Z: 'Z', /* Z */
-  CHAR_LOWERCASE_Z: 'z', /* z */
-
-  CHAR_LEFT_PARENTHESES: '(', /* ( */
-  CHAR_RIGHT_PARENTHESES: ')', /* ) */
-
-  CHAR_ASTERISK: '*', /* * */
-
-  // Non-alphabetic chars.
-  CHAR_AMPERSAND: '&', /* & */
-  CHAR_AT: '@', /* @ */
-  CHAR_BACKSLASH: '\\', /* \ */
-  CHAR_BACKTICK: '`', /* ` */
-  CHAR_CARRIAGE_RETURN: '\r', /* \r */
-  CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */
-  CHAR_COLON: ':', /* : */
-  CHAR_COMMA: ',', /* , */
-  CHAR_DOLLAR: '$', /* . */
-  CHAR_DOT: '.', /* . */
-  CHAR_DOUBLE_QUOTE: '"', /* " */
-  CHAR_EQUAL: '=', /* = */
-  CHAR_EXCLAMATION_MARK: '!', /* ! */
-  CHAR_FORM_FEED: '\f', /* \f */
-  CHAR_FORWARD_SLASH: '/', /* / */
-  CHAR_HASH: '#', /* # */
-  CHAR_HYPHEN_MINUS: '-', /* - */
-  CHAR_LEFT_ANGLE_BRACKET: '<', /* < */
-  CHAR_LEFT_CURLY_BRACE: '{', /* { */
-  CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */
-  CHAR_LINE_FEED: '\n', /* \n */
-  CHAR_NO_BREAK_SPACE: '\u00A0', /* \u00A0 */
-  CHAR_PERCENT: '%', /* % */
-  CHAR_PLUS: '+', /* + */
-  CHAR_QUESTION_MARK: '?', /* ? */
-  CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */
-  CHAR_RIGHT_CURLY_BRACE: '}', /* } */
-  CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */
-  CHAR_SEMICOLON: ';', /* ; */
-  CHAR_SINGLE_QUOTE: '\'', /* ' */
-  CHAR_SPACE: ' ', /*   */
-  CHAR_TAB: '\t', /* \t */
-  CHAR_UNDERSCORE: '_', /* _ */
-  CHAR_VERTICAL_LINE: '|', /* | */
-  CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\uFEFF' /* \uFEFF */
-};
diff --git a/node_modules/braces/lib/expand.js b/node_modules/braces/lib/expand.js
deleted file mode 100644
index 35b2c41d6afdb8f0197959e26079f266e48370d3..0000000000000000000000000000000000000000
--- a/node_modules/braces/lib/expand.js
+++ /dev/null
@@ -1,113 +0,0 @@
-'use strict';
-
-const fill = require('fill-range');
-const stringify = require('./stringify');
-const utils = require('./utils');
-
-const append = (queue = '', stash = '', enclose = false) => {
-  const result = [];
-
-  queue = [].concat(queue);
-  stash = [].concat(stash);
-
-  if (!stash.length) return queue;
-  if (!queue.length) {
-    return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash;
-  }
-
-  for (const item of queue) {
-    if (Array.isArray(item)) {
-      for (const value of item) {
-        result.push(append(value, stash, enclose));
-      }
-    } else {
-      for (let ele of stash) {
-        if (enclose === true && typeof ele === 'string') ele = `{${ele}}`;
-        result.push(Array.isArray(ele) ? append(item, ele, enclose) : item + ele);
-      }
-    }
-  }
-  return utils.flatten(result);
-};
-
-const expand = (ast, options = {}) => {
-  const rangeLimit = options.rangeLimit === undefined ? 1000 : options.rangeLimit;
-
-  const walk = (node, parent = {}) => {
-    node.queue = [];
-
-    let p = parent;
-    let q = parent.queue;
-
-    while (p.type !== 'brace' && p.type !== 'root' && p.parent) {
-      p = p.parent;
-      q = p.queue;
-    }
-
-    if (node.invalid || node.dollar) {
-      q.push(append(q.pop(), stringify(node, options)));
-      return;
-    }
-
-    if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) {
-      q.push(append(q.pop(), ['{}']));
-      return;
-    }
-
-    if (node.nodes && node.ranges > 0) {
-      const args = utils.reduce(node.nodes);
-
-      if (utils.exceedsLimit(...args, options.step, rangeLimit)) {
-        throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.');
-      }
-
-      let range = fill(...args, options);
-      if (range.length === 0) {
-        range = stringify(node, options);
-      }
-
-      q.push(append(q.pop(), range));
-      node.nodes = [];
-      return;
-    }
-
-    const enclose = utils.encloseBrace(node);
-    let queue = node.queue;
-    let block = node;
-
-    while (block.type !== 'brace' && block.type !== 'root' && block.parent) {
-      block = block.parent;
-      queue = block.queue;
-    }
-
-    for (let i = 0; i < node.nodes.length; i++) {
-      const child = node.nodes[i];
-
-      if (child.type === 'comma' && node.type === 'brace') {
-        if (i === 1) queue.push('');
-        queue.push('');
-        continue;
-      }
-
-      if (child.type === 'close') {
-        q.push(append(q.pop(), queue, enclose));
-        continue;
-      }
-
-      if (child.value && child.type !== 'open') {
-        queue.push(append(queue.pop(), child.value));
-        continue;
-      }
-
-      if (child.nodes) {
-        walk(child, node);
-      }
-    }
-
-    return queue;
-  };
-
-  return utils.flatten(walk(ast));
-};
-
-module.exports = expand;
diff --git a/node_modules/braces/lib/parse.js b/node_modules/braces/lib/parse.js
deleted file mode 100644
index 3a6988e629f52aee6609dc5ec290a5e9ff47cecb..0000000000000000000000000000000000000000
--- a/node_modules/braces/lib/parse.js
+++ /dev/null
@@ -1,331 +0,0 @@
-'use strict';
-
-const stringify = require('./stringify');
-
-/**
- * Constants
- */
-
-const {
-  MAX_LENGTH,
-  CHAR_BACKSLASH, /* \ */
-  CHAR_BACKTICK, /* ` */
-  CHAR_COMMA, /* , */
-  CHAR_DOT, /* . */
-  CHAR_LEFT_PARENTHESES, /* ( */
-  CHAR_RIGHT_PARENTHESES, /* ) */
-  CHAR_LEFT_CURLY_BRACE, /* { */
-  CHAR_RIGHT_CURLY_BRACE, /* } */
-  CHAR_LEFT_SQUARE_BRACKET, /* [ */
-  CHAR_RIGHT_SQUARE_BRACKET, /* ] */
-  CHAR_DOUBLE_QUOTE, /* " */
-  CHAR_SINGLE_QUOTE, /* ' */
-  CHAR_NO_BREAK_SPACE,
-  CHAR_ZERO_WIDTH_NOBREAK_SPACE
-} = require('./constants');
-
-/**
- * parse
- */
-
-const parse = (input, options = {}) => {
-  if (typeof input !== 'string') {
-    throw new TypeError('Expected a string');
-  }
-
-  const opts = options || {};
-  const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;
-  if (input.length > max) {
-    throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`);
-  }
-
-  const ast = { type: 'root', input, nodes: [] };
-  const stack = [ast];
-  let block = ast;
-  let prev = ast;
-  let brackets = 0;
-  const length = input.length;
-  let index = 0;
-  let depth = 0;
-  let value;
-
-  /**
-   * Helpers
-   */
-
-  const advance = () => input[index++];
-  const push = node => {
-    if (node.type === 'text' && prev.type === 'dot') {
-      prev.type = 'text';
-    }
-
-    if (prev && prev.type === 'text' && node.type === 'text') {
-      prev.value += node.value;
-      return;
-    }
-
-    block.nodes.push(node);
-    node.parent = block;
-    node.prev = prev;
-    prev = node;
-    return node;
-  };
-
-  push({ type: 'bos' });
-
-  while (index < length) {
-    block = stack[stack.length - 1];
-    value = advance();
-
-    /**
-     * Invalid chars
-     */
-
-    if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) {
-      continue;
-    }
-
-    /**
-     * Escaped chars
-     */
-
-    if (value === CHAR_BACKSLASH) {
-      push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() });
-      continue;
-    }
-
-    /**
-     * Right square bracket (literal): ']'
-     */
-
-    if (value === CHAR_RIGHT_SQUARE_BRACKET) {
-      push({ type: 'text', value: '\\' + value });
-      continue;
-    }
-
-    /**
-     * Left square bracket: '['
-     */
-
-    if (value === CHAR_LEFT_SQUARE_BRACKET) {
-      brackets++;
-
-      let next;
-
-      while (index < length && (next = advance())) {
-        value += next;
-
-        if (next === CHAR_LEFT_SQUARE_BRACKET) {
-          brackets++;
-          continue;
-        }
-
-        if (next === CHAR_BACKSLASH) {
-          value += advance();
-          continue;
-        }
-
-        if (next === CHAR_RIGHT_SQUARE_BRACKET) {
-          brackets--;
-
-          if (brackets === 0) {
-            break;
-          }
-        }
-      }
-
-      push({ type: 'text', value });
-      continue;
-    }
-
-    /**
-     * Parentheses
-     */
-
-    if (value === CHAR_LEFT_PARENTHESES) {
-      block = push({ type: 'paren', nodes: [] });
-      stack.push(block);
-      push({ type: 'text', value });
-      continue;
-    }
-
-    if (value === CHAR_RIGHT_PARENTHESES) {
-      if (block.type !== 'paren') {
-        push({ type: 'text', value });
-        continue;
-      }
-      block = stack.pop();
-      push({ type: 'text', value });
-      block = stack[stack.length - 1];
-      continue;
-    }
-
-    /**
-     * Quotes: '|"|`
-     */
-
-    if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) {
-      const open = value;
-      let next;
-
-      if (options.keepQuotes !== true) {
-        value = '';
-      }
-
-      while (index < length && (next = advance())) {
-        if (next === CHAR_BACKSLASH) {
-          value += next + advance();
-          continue;
-        }
-
-        if (next === open) {
-          if (options.keepQuotes === true) value += next;
-          break;
-        }
-
-        value += next;
-      }
-
-      push({ type: 'text', value });
-      continue;
-    }
-
-    /**
-     * Left curly brace: '{'
-     */
-
-    if (value === CHAR_LEFT_CURLY_BRACE) {
-      depth++;
-
-      const dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true;
-      const brace = {
-        type: 'brace',
-        open: true,
-        close: false,
-        dollar,
-        depth,
-        commas: 0,
-        ranges: 0,
-        nodes: []
-      };
-
-      block = push(brace);
-      stack.push(block);
-      push({ type: 'open', value });
-      continue;
-    }
-
-    /**
-     * Right curly brace: '}'
-     */
-
-    if (value === CHAR_RIGHT_CURLY_BRACE) {
-      if (block.type !== 'brace') {
-        push({ type: 'text', value });
-        continue;
-      }
-
-      const type = 'close';
-      block = stack.pop();
-      block.close = true;
-
-      push({ type, value });
-      depth--;
-
-      block = stack[stack.length - 1];
-      continue;
-    }
-
-    /**
-     * Comma: ','
-     */
-
-    if (value === CHAR_COMMA && depth > 0) {
-      if (block.ranges > 0) {
-        block.ranges = 0;
-        const open = block.nodes.shift();
-        block.nodes = [open, { type: 'text', value: stringify(block) }];
-      }
-
-      push({ type: 'comma', value });
-      block.commas++;
-      continue;
-    }
-
-    /**
-     * Dot: '.'
-     */
-
-    if (value === CHAR_DOT && depth > 0 && block.commas === 0) {
-      const siblings = block.nodes;
-
-      if (depth === 0 || siblings.length === 0) {
-        push({ type: 'text', value });
-        continue;
-      }
-
-      if (prev.type === 'dot') {
-        block.range = [];
-        prev.value += value;
-        prev.type = 'range';
-
-        if (block.nodes.length !== 3 && block.nodes.length !== 5) {
-          block.invalid = true;
-          block.ranges = 0;
-          prev.type = 'text';
-          continue;
-        }
-
-        block.ranges++;
-        block.args = [];
-        continue;
-      }
-
-      if (prev.type === 'range') {
-        siblings.pop();
-
-        const before = siblings[siblings.length - 1];
-        before.value += prev.value + value;
-        prev = before;
-        block.ranges--;
-        continue;
-      }
-
-      push({ type: 'dot', value });
-      continue;
-    }
-
-    /**
-     * Text
-     */
-
-    push({ type: 'text', value });
-  }
-
-  // Mark imbalanced braces and brackets as invalid
-  do {
-    block = stack.pop();
-
-    if (block.type !== 'root') {
-      block.nodes.forEach(node => {
-        if (!node.nodes) {
-          if (node.type === 'open') node.isOpen = true;
-          if (node.type === 'close') node.isClose = true;
-          if (!node.nodes) node.type = 'text';
-          node.invalid = true;
-        }
-      });
-
-      // get the location of the block on parent.nodes (block's siblings)
-      const parent = stack[stack.length - 1];
-      const index = parent.nodes.indexOf(block);
-      // replace the (invalid) block with it's nodes
-      parent.nodes.splice(index, 1, ...block.nodes);
-    }
-  } while (stack.length > 0);
-
-  push({ type: 'eos' });
-  return ast;
-};
-
-module.exports = parse;
diff --git a/node_modules/braces/lib/stringify.js b/node_modules/braces/lib/stringify.js
deleted file mode 100644
index 8bcf872c31894f81a8c64d9202fd607e4fd7ea2b..0000000000000000000000000000000000000000
--- a/node_modules/braces/lib/stringify.js
+++ /dev/null
@@ -1,32 +0,0 @@
-'use strict';
-
-const utils = require('./utils');
-
-module.exports = (ast, options = {}) => {
-  const stringify = (node, parent = {}) => {
-    const invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent);
-    const invalidNode = node.invalid === true && options.escapeInvalid === true;
-    let output = '';
-
-    if (node.value) {
-      if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) {
-        return '\\' + node.value;
-      }
-      return node.value;
-    }
-
-    if (node.value) {
-      return node.value;
-    }
-
-    if (node.nodes) {
-      for (const child of node.nodes) {
-        output += stringify(child);
-      }
-    }
-    return output;
-  };
-
-  return stringify(ast);
-};
-
diff --git a/node_modules/braces/lib/utils.js b/node_modules/braces/lib/utils.js
deleted file mode 100644
index d19311fe044ad5157624077670dc297e8b53da49..0000000000000000000000000000000000000000
--- a/node_modules/braces/lib/utils.js
+++ /dev/null
@@ -1,122 +0,0 @@
-'use strict';
-
-exports.isInteger = num => {
-  if (typeof num === 'number') {
-    return Number.isInteger(num);
-  }
-  if (typeof num === 'string' && num.trim() !== '') {
-    return Number.isInteger(Number(num));
-  }
-  return false;
-};
-
-/**
- * Find a node of the given type
- */
-
-exports.find = (node, type) => node.nodes.find(node => node.type === type);
-
-/**
- * Find a node of the given type
- */
-
-exports.exceedsLimit = (min, max, step = 1, limit) => {
-  if (limit === false) return false;
-  if (!exports.isInteger(min) || !exports.isInteger(max)) return false;
-  return ((Number(max) - Number(min)) / Number(step)) >= limit;
-};
-
-/**
- * Escape the given node with '\\' before node.value
- */
-
-exports.escapeNode = (block, n = 0, type) => {
-  const node = block.nodes[n];
-  if (!node) return;
-
-  if ((type && node.type === type) || node.type === 'open' || node.type === 'close') {
-    if (node.escaped !== true) {
-      node.value = '\\' + node.value;
-      node.escaped = true;
-    }
-  }
-};
-
-/**
- * Returns true if the given brace node should be enclosed in literal braces
- */
-
-exports.encloseBrace = node => {
-  if (node.type !== 'brace') return false;
-  if ((node.commas >> 0 + node.ranges >> 0) === 0) {
-    node.invalid = true;
-    return true;
-  }
-  return false;
-};
-
-/**
- * Returns true if a brace node is invalid.
- */
-
-exports.isInvalidBrace = block => {
-  if (block.type !== 'brace') return false;
-  if (block.invalid === true || block.dollar) return true;
-  if ((block.commas >> 0 + block.ranges >> 0) === 0) {
-    block.invalid = true;
-    return true;
-  }
-  if (block.open !== true || block.close !== true) {
-    block.invalid = true;
-    return true;
-  }
-  return false;
-};
-
-/**
- * Returns true if a node is an open or close node
- */
-
-exports.isOpenOrClose = node => {
-  if (node.type === 'open' || node.type === 'close') {
-    return true;
-  }
-  return node.open === true || node.close === true;
-};
-
-/**
- * Reduce an array of text nodes.
- */
-
-exports.reduce = nodes => nodes.reduce((acc, node) => {
-  if (node.type === 'text') acc.push(node.value);
-  if (node.type === 'range') node.type = 'text';
-  return acc;
-}, []);
-
-/**
- * Flatten an array
- */
-
-exports.flatten = (...args) => {
-  const result = [];
-
-  const flat = arr => {
-    for (let i = 0; i < arr.length; i++) {
-      const ele = arr[i];
-
-      if (Array.isArray(ele)) {
-        flat(ele);
-        continue;
-      }
-
-      if (ele !== undefined) {
-        result.push(ele);
-      }
-    }
-    return result;
-  };
-
-  flat(args);
-  return result;
-};
diff --git a/node_modules/braces/package.json b/node_modules/braces/package.json
deleted file mode 100644
index c3c056e469726cdb0d0cb6cec73b3f79abf0eb23..0000000000000000000000000000000000000000
--- a/node_modules/braces/package.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
-  "name": "braces",
-  "description": "Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed.",
-  "version": "3.0.3",
-  "homepage": "https://github.com/micromatch/braces",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "contributors": [
-    "Brian Woodward (https://twitter.com/doowb)",
-    "Elan Shanker (https://github.com/es128)",
-    "Eugene Sharygin (https://github.com/eush77)",
-    "hemanth.hm (http://h3manth.com)",
-    "Jon Schlinkert (http://twitter.com/jonschlinkert)"
-  ],
-  "repository": "micromatch/braces",
-  "bugs": {
-    "url": "https://github.com/micromatch/braces/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js",
-    "lib"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=8"
-  },
-  "scripts": {
-    "test": "mocha",
-    "benchmark": "node benchmark"
-  },
-  "dependencies": {
-    "fill-range": "^7.1.1"
-  },
-  "devDependencies": {
-    "ansi-colors": "^3.2.4",
-    "bash-path": "^2.0.1",
-    "gulp-format-md": "^2.0.0",
-    "mocha": "^6.1.1"
-  },
-  "keywords": [
-    "alpha",
-    "alphabetical",
-    "bash",
-    "brace",
-    "braces",
-    "expand",
-    "expansion",
-    "filepath",
-    "fill",
-    "fs",
-    "glob",
-    "globbing",
-    "letter",
-    "match",
-    "matches",
-    "matching",
-    "number",
-    "numerical",
-    "path",
-    "range",
-    "ranges",
-    "sh"
-  ],
-  "verb": {
-    "toc": false,
-    "layout": "default",
-    "tasks": [
-      "readme"
-    ],
-    "lint": {
-      "reflinks": true
-    },
-    "plugins": [
-      "gulp-format-md"
-    ]
-  }
-}
diff --git a/node_modules/cardinal/.npmignore b/node_modules/cardinal/.npmignore
deleted file mode 100644
index 7e2f179b52bfdb0e9106bcb5b92a123b3a347bd7..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-assets
diff --git a/node_modules/cardinal/.travis.yml b/node_modules/cardinal/.travis.yml
deleted file mode 100644
index 65488b07a9d244f95aeef1200d48bd9ea917e85d..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
-  - 0.8
-  - 0.10 
diff --git a/node_modules/cardinal/LICENSE b/node_modules/cardinal/LICENSE
deleted file mode 100644
index 19c037f3b9ccd64a734039fb973be4b72b944a55..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-Copyright 2012 Thorsten Lorenz. 
-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/cardinal/README.md b/node_modules/cardinal/README.md
deleted file mode 100644
index 5c3d5ad9d86837e7bd5551a5040fb1b5c6df3340..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/README.md
+++ /dev/null
@@ -1,132 +0,0 @@
-# cardinal [![Build Status](https://secure.travis-ci.org/thlorenz/cardinal.png)](http://travis-ci.org/thlorenz/cardinal)
-
-[![NPM](https://nodei.co/npm/cardinal.png?downloads=true&stars=true)](https://nodei.co/npm/cardinal/)
-
-**car·di·nal** *(kärdn-l, kärdnl)* - crested thick-billed North American finch having bright red plumage in the male.
-
-![screenshot](https://github.com/thlorenz/cardinal/raw/master/assets/screen-shot.png)
-
-## Features
-
-- highlights JavaScript code with ANSI colors to improve terminal output
-- theming support, see [custom color themes](https://github.com/thlorenz/cardinal/tree/master/themes)
-- optionally print line numbers
-- API and command line interface (`cdl`)
-- `.cardinalrc` config to customize settings
-- supports UNIX pipes
-
-***
-
-**Table of Contents**  *generated with [DocToc](http://doctoc.herokuapp.com/)*
-
-- [Installation](#installation)
-  - [As library](#as-library)
-  - [As Commandline Tool](#as-commandline-tool)
-- [Commandline](#commandline)
-  - [Highlight a file](#highlight-a-file)
-  - [As part of a UNIX pipe](#as-part-of-a-unix-pipe)
-  - [Theme](#theme)
-- [API](#api)
-  - [*highlight(code[, opts])*](#highlightcode-opts)
-  - [*highlightFileSync(fullPath[, opts])*](#highlightfilesyncfullpath-opts)
-  - [*highlightFile(fullPath[, opts], callback)*](#highlightfilefullpath-opts-callback)
-  - [opts](#opts)
-- [Examples ([*browse*](https://github.com/thlorenz/cardinal/tree/master/examples))](#examples-[browse]https://githubcom/thlorenz/cardinal/tree/master/examples)
-
-
-## Installation
-
-### As library
-
-    npm install cardinal
-
-### As Commandline Tool
-
-    [sudo] npm install -g cardinal
-
-**Note:** 
-
-When installed globally, cardinal exposes itself as the `cdl` command.
-
-## Commandline
-
-### Highlight a file
-
-    cdl <file.js> [options]
-
-**options**:
-  - `--nonum`: turns off line number printing (relevant if it is turned on inside `~/.cardinalrc`
-
-### As part of a UNIX pipe
-
-    cat file.js | grep console | cdl
-
-**Note:**
-
-Not all code lines may be parsable JavaScript. In these cases the line is printed to the terminal without
-highlighting it.
-
-### Theme
-
-The default theme will be used for highlighting.
-
-To use a different theme, include a `.cardinalrc` file in your `HOME` directory.
-
-This is a JSON file of the following form:
-
-```json
-{
-  "theme": "hide-semicolons",
-  "linenos": true|false
-}
-```
-
-- `theme` can be the name of any of the [built-in themes](https://github.com/thlorenz/cardinal/tree/master/themes) or the
-full path to a custom theme anywhere on your computer.
-- linenos toggles line number printing
-
-## API
-
-### *highlight(code[, opts])*
-
-- returns the highlighted version of the passed code ({String}) or throws an error if it was not able to parse it
-- opts (see below)
-
-### *highlightFileSync(fullPath[, opts])*
-
-- returns the highlighted version of the file whose fullPath ({String}) was passed or throws an error if it was not able
-  to parse it
-- opts (see below)
-
-### *highlightFile(fullPath[, opts], callback)*
-
-- calls back with the highlighted version of the file whose fullPath ({String}) was passed or with an error if it was not able
-  to parse it
-- opts (see below)
-- `callback` ({Function}) has the following signature: `function (err, highlighted) { .. }`
-
-### opts
-
-opts is an {Object} with the following properties:
-
-- `theme` {Object} is used to optionally override the theme used to highlight
-- `linenos` {Boolean} if `true` line numbers are included in the highlighted code
-- `firstline` {Integer} sets line number of the first line when line numbers are printed
-- `json` {Boolean} if `true` highlights JSON in addition to JavaScript (`true` by default if file extension is `.json`)
-
-## Examples ([*browse*](https://github.com/thlorenz/cardinal/tree/master/examples))
-
-- [sample .cardinalrc](https://github.com/thlorenz/cardinal/blob/master/examples/.cardinalrc)
-- [highlighting a code snippet](https://github.com/thlorenz/cardinal/blob/master/examples/highlight-string.js) via
-  ***highlight()***
-- [file that highlights itself](https://github.com/thlorenz/cardinal/blob/master/examples/highlight-self.js) via
-  ***highlightFile()*** including line numbers
-- [file that highlights itself hiding all
-  semicolons](https://github.com/thlorenz/cardinal/blob/master/examples/highlight-self-hide-semicolons.js) via
-  ***highlightFileSync()***
-
-
-
-
-[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/thlorenz/cardinal/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
-
diff --git a/node_modules/cardinal/bin/cdl.js b/node_modules/cardinal/bin/cdl.js
deleted file mode 100644
index c58eb08a6421881cc2f7f69ec8dcbd50ab418324..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/bin/cdl.js
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/env node
-var cardinal = require('..')
-  , utl = require('../utl')
-  , settings = require('../settings')
-  , args = process.argv
-  , theme = settings.resolveTheme()
-  , opts = settings.getSettings()
-  , highlighted
-  ;
-
-opts = opts || {};
-opts.theme = theme;
-
-function usage() {
-  var msg = [ 
-      'Usage: cdl <filename.js> [options]'
-    , ''
-    , 'Options (~/.cardinalrc overrides):'
-    , '  --nonum: turn off line printing'
-    , ''
-    , 'Unix Pipe Example: cat filename.js | grep console | cdl'
-    , ''
-  ].join('\n');
-  console.log(msg);
-}
-
-function highlightFile () {
-  try {
-    highlighted = cardinal.highlightFileSync(args[2], opts);
-    console.log(highlighted);
-  } catch (e) {
-    console.trace();
-    console.error(e);
-  }
-}
-
-// E.g., "cardinal myfile.js"
-if (args.length === 3) return highlightFile();
-
-var opt = args[3];
-
-// E.g., "cardinal myfile.js --nonum"
-if (opt && opt.indexOf('--') === 0 ) {
-  if ((/^--(nonum|noline)/i).test(opt)) opts.linenos = false;
-  else { 
-    usage();
-    return console.error('Unknown option: ', opt);
-  }
- 
-  return highlightFile();
-}
-
-
-// UNIX pipes e.g., "cat myfile.js | grep console | cardinal
-var stdin = process.stdin
-  , stdout = process.stdout;
-
-// line numbers don't make sense when we are printing line by line
-opts.linenos = false;
-
-stdin.setEncoding('utf-8');
-stdin.resume();
-stdin
-  .on('data', function (chunk) {
-    chunk.split('\n').forEach(function (line) {
-      try {
-        stdout.write(cardinal.highlight(line, opts) + '\n');
-      } catch (e) {
-        // line doesn't represent a valid js snippet and therefore cannot be parsed -> just print as is
-        stdout.write(line + '\n');
-      }
-    });
-  });
-
diff --git a/node_modules/cardinal/cardinal.js b/node_modules/cardinal/cardinal.js
deleted file mode 100644
index 4df4bb4a1984d9de26655c0bd2c69f993368c901..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/cardinal.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
-    highlight: require('./lib/highlight')
-  , highlightFile: require('./lib/highlightFile')
-  , highlightFileSync: require('./lib/highlightFileSync')
-};
diff --git a/node_modules/cardinal/examples/.cardinalrc b/node_modules/cardinal/examples/.cardinalrc
deleted file mode 100644
index 34be5cc31ab01dff95ad068b800827361d40ea2c..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/examples/.cardinalrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "theme": "hide-semicolons"
-}
diff --git a/node_modules/cardinal/examples/README.md b/node_modules/cardinal/examples/README.md
deleted file mode 100644
index a6c2cd98a5f2353bff2db1a697f14b8b7e81dfa3..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/examples/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Cardinal Examples
-
-You can run the examples individually or as a demo:
-
-- install cardinal: `npm install cardinal`
-- explore cardinal: `npm explore cardinal`
-- run the demo: `npm run demo`
diff --git a/node_modules/cardinal/examples/highlight-json.js b/node_modules/cardinal/examples/highlight-json.js
deleted file mode 100644
index 3c06e5d442128709ad229a837fec8bf8233b913a..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/examples/highlight-json.js
+++ /dev/null
@@ -1,10 +0,0 @@
-// This file will highlight the passed code using the custom theme when run via: "node highlight-json"
-
-var cardinal = require('..');
-
-var json = JSON.stringify({
-  foo: 'bar',
-  baz: 'quux'
-});
-
-console.log(cardinal.highlight(json, {json: true}));
diff --git a/node_modules/cardinal/examples/highlight-self-hide-semicolons.js b/node_modules/cardinal/examples/highlight-self-hide-semicolons.js
deleted file mode 100644
index bf2c7d6e6b6d896bdb82525874258bf2d7608215..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/examples/highlight-self-hide-semicolons.js
+++ /dev/null
@@ -1,22 +0,0 @@
- /*
-  * This file will highlight itself using a custom theme when run via: "node highlight-self-hide-semicolons"
-  * The custom theme highlights semicolons as 'black', thus hiding them.
-  */
-
-var cardinal = require('..')
-  , hideSemicolonsTheme = require('../themes/hide-semicolons');
-
-function highlight () {
-  
-  // Using the synchronous highlightFileSync()
-  // For asynchronous highlighting use: highlightFile() - see highlight-self.js
-  
-  try {
-    var highlighted = cardinal.highlightFileSync(__filename, hideSemicolonsTheme);
-    console.log(highlighted);
-  } catch (err) {
-    console.error(err);
-  }
-}
-
-highlight();
diff --git a/node_modules/cardinal/examples/highlight-self.js b/node_modules/cardinal/examples/highlight-self.js
deleted file mode 100644
index ceeb599eba02473f00b14a9eeb82492a68d3a9e4..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/examples/highlight-self.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// This file will highlight itself using the default theme when run via: "node highlight-self"
-
-var cardinal = require('..');
-
-function highlight () {
-  
-  // Using the asynchronous highlightFile()
-  // For synchronous highlighting use: highlightFileSync() - see highlight-self-hide-semicolons.js
-  
-  cardinal.highlightFile(__filename, { linenos: true }, function (err, res) {
-    if (err) return console.error(err);
-    console.log(res);
-  });
-}
-
-highlight();
diff --git a/node_modules/cardinal/examples/highlight-string.js b/node_modules/cardinal/examples/highlight-string.js
deleted file mode 100644
index dcc7b4ea613ffdfc0292f77d716869e9da808e7f..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/examples/highlight-string.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// This file will highlight the passed code using the custom theme when run via: "node highlight-string"
-
-var cardinal = require('..');
-
-var code = '' + 
-
-function add (a, b) {
-  var sum = a + b;
-  return sum;
-} + 
-  
-'';
-
-console.log(cardinal.highlight(code));
diff --git a/node_modules/cardinal/lib/highlight.js b/node_modules/cardinal/lib/highlight.js
deleted file mode 100644
index 9c55e2c275e852dd015007f0f45f502382059fb7..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/lib/highlight.js
+++ /dev/null
@@ -1,83 +0,0 @@
-var redeyed =  require('redeyed')
-  , theme   =  require('../themes/default')
-  , colors  =  require('ansicolors')
-
-  , colorSurround =  colors.brightBlack
-  , surroundClose =  '\u001b[39m'
-  ;
-
-function trimEmptyLines(lines) {
-
-  // remove lines from the end until we find a non-empy one
-  var line = lines.pop();
-  while(!line || !line.length)
-    line = lines.pop();
-
-  // put the non-empty line back
-  if (line) lines.push(line);
-}
-
-function addLinenos (highlightedCode, firstline) {
-  var highlightedLines = highlightedCode.split('\n');
-
-  trimEmptyLines(highlightedLines);
-
-  var linesLen = highlightedLines.length
-    , lines = []
-    , totalDigits
-    , lineno
-    ;
-
-  function getDigits (n) {
-    if (n < 10) return 1;
-    if (n < 100) return 2;
-    if (n < 1000) return 3;
-    if (n < 10000) return 4;
-    // this works for up to 99,999 lines - any questions?
-    return 5;
-  }
-
-  function pad (n, totalDigits) {
-    // not pretty, but simple and should perform quite well
-    var padDigits= totalDigits - getDigits(n);
-    switch(padDigits) {
-      case 0: return '' + n;
-      case 1: return ' ' + n;
-      case 2: return '  ' + n;
-      case 3: return '   ' + n;
-      case 4: return '    ' + n;
-      case 5: return '     ' + n;
-    }
-  }
-
-  totalDigits = getDigits(linesLen + firstline - 1);
-
-  for (var i = 0; i < linesLen; i++) {
-    // Don't close the escape sequence here in order to not break multi line code highlights like block comments
-    lineno = colorSurround(pad(i + firstline, totalDigits) + ': ').replace(surroundClose, '');
-    lines.push(lineno + highlightedLines[i]);
-  }
-
-  return lines.join('\n');
-}
-
-module.exports = function highlight (code, opts) {
-  opts = opts || { };
-  if (opts.json) {
-    code = '!\n' + code;
-  }
-  try {
-
-    var result = redeyed(code, opts.theme || theme)
-      , firstline = opts.firstline && !isNaN(opts.firstline) ? opts.firstline : 1;
-
-    if (opts.json) {
-      result.code = result.code.split('\n').slice(1).join('\n');
-    }
-
-    return opts.linenos ? addLinenos(result.code, firstline) : result.code;
-  } catch (e) {
-    e.message = 'Unable to perform highlight. The code contained syntax errors: ' + e.message;
-    throw e;
-  }
-};
diff --git a/node_modules/cardinal/lib/highlightFile.js b/node_modules/cardinal/lib/highlightFile.js
deleted file mode 100644
index bb3271dc14f8b8b0e3aa90b51fac6697314e3afe..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/lib/highlightFile.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var fs = require('fs')
-  , highlight = require('./highlight');
-
-function isFunction (obj) {
-  return toString.call(obj) == '[object Function]';
-}
-
-module.exports = function highlightFile (fullPath, opts, cb) {
-  if (isFunction(opts)) { 
-    cb = opts;
-    opts = { };
-  }
-  opts = opts || { };
-  if (opts.json !== false && fullPath.match(/\.json$/i)) {
-    opts.json = true;
-  }
-
-  fs.readFile(fullPath, 'utf-8', function (err, code) {
-    if (err) return cb(err);
-    try {
-      cb(null, highlight(code, opts));
-    } catch (e) {
-      cb(e);
-    }
-  });
-};
diff --git a/node_modules/cardinal/lib/highlightFileSync.js b/node_modules/cardinal/lib/highlightFileSync.js
deleted file mode 100644
index bc33dd4f09ddcde8975a7cd5b0e874aa688c897c..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/lib/highlightFileSync.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var fs = require('fs')
-  , highlight = require('./highlight');
-
-module.exports = function highlightFileSync (fullPath, opts) {
-  var code = fs.readFileSync(fullPath, 'utf-8');
-  opts = opts || { };
-  if (opts.json !== false && fullPath.match(/\.json$/i)) {
-    opts.json = true;
-  }
-  return highlight(code, opts);
-};
diff --git a/node_modules/cardinal/package.json b/node_modules/cardinal/package.json
deleted file mode 100644
index e69c9837085a3abce994c775bc5e7229ae58948f..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/package.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "name": "cardinal",
-  "version": "0.4.4",
-  "description": "Syntax highlights JavaScript code with ANSI colors to be printed to the terminal.",
-  "main": "cardinal.js",
-  "scripts": {
-    "test": "tap ./test/*.js",
-    "demo": "node examples/highlight-string.js; node examples/highlight-self; node examples/highlight-self-hide-semicolons;"
-  },
-  "bin": {
-    "cdl": "./bin/cdl.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/thlorenz/cardinal.git"
-  },
-  "keywords": [
-    "syntax",
-    "highlight",
-    "theme",
-    "javascript",
-    "json",
-    "terminal",
-    "console",
-    "print",
-    "output"
-  ],
-  "author": "Thorsten Lorenz <thlorenz@gmx.de> (thlorenz.com)",
-  "license": "MIT",
-  "dependencies": {
-    "redeyed": "~0.4.0",
-    "ansicolors": "~0.2.1"
-  },
-  "devDependencies": {
-    "tap": "~0.3.1",
-    "readdirp": "~0.2.1"
-  }
-}
diff --git a/node_modules/cardinal/settings.js b/node_modules/cardinal/settings.js
deleted file mode 100644
index f31817ac072b5416a36ca2cf4a5dc755cc7168f0..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/settings.js
+++ /dev/null
@@ -1,51 +0,0 @@
-var path =  require('path')
-  , util =  require('util')
-  , fs   =  require('fs')
-  , utl  =  require('./utl')
-  , home =  process.env.HOME
-  , settings;
-
-function getSettings (home_) {
-  if (settings) return settings;
-  try {
-    settingsJson = fs.readFileSync(path.join(home_ || home, '.cardinalrc'), 'utf-8');
-  } catch (_) {
-    // no .cardinalrc found - not a problem
-    return undefined;
-  }
-  try {
-    return JSON.parse(settingsJson);
-  } catch (e) {
-    // Have a .cardinalrc, but something about it is wrong - warn the user
-    // Coudn't parse the contained JSON
-    console.error(e);
-    return undefined;
-  }
-}
-
-// home_ mainly to be used during tests
-// Resolves the preferred theme from the .cardinalrc found in the HOME directory
-// If it couldn't be resolved, undefined is returned
-function resolveTheme (home_) {
-  var themePath
-    , settings = getSettings(home_);
-
-  if (!settings || !settings.theme) return undefined;
-
-  try {
-    // allow specifying just the name of a built-in theme or a full path to a custom theme
-    themePath = utl.isPath(settings.theme) ? settings.theme : path.join(__dirname, 'themes', settings.theme);
-
-    return require(themePath);
-  } catch (e) {
-    // Specified theme path is invalid
-    console.error(e);
-    return undefined;
-  }
-}
-
-module.exports = {
-    resolveTheme: resolveTheme
-  , getSettings: getSettings
-};
-
diff --git a/node_modules/cardinal/test/cardinal-highlight-block-comment.js b/node_modules/cardinal/test/cardinal-highlight-block-comment.js
deleted file mode 100644
index 6b99a1ba7b278d312465db821098b8992fda43da..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/cardinal-highlight-block-comment.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , fs = require('fs')
-  , customTheme = require('./fixtures/custom') 
-  , cardinal = require('..')
-
-function inspect(obj, depth) {
-  console.log(require('util').inspect(obj, false, depth || 5, true));
-}
-
-test('\nhighlighting a block comment without line numbers', function (t) {
-  var code = fs.readFileSync(__dirname + '/fixtures/block-comment.js', 'utf8');
-  var highlighted = cardinal.highlight(code, { theme: customTheme });
-  t.equal(highlighted, '\n\u001b[90m/**\n * This is a meaningless block jsdoc for a meaningless function.\n * Joins two strings, separating them to appear on two lines.\n * \n * @name foo\n * @function\n * @param uno {String} first string\n * @param dos {String} second string\n * @return {String} result of the join\n */\u001b[39m\n\u001b[96mmodule\u001b[39m\u001b[32m.\u001b[39m\u001b[96mexports\u001b[39m \u001b[93m=\u001b[39m \u001b[94mfunction\u001b[39m \u001b[96mfoo\u001b[39m \u001b[90m(\u001b[39m\u001b[96muno\u001b[39m\u001b[32m,\u001b[39m \u001b[96mdos\u001b[39m\u001b[90m)\u001b[39m \u001b[33m{\u001b[39m\n  \u001b[31mreturn\u001b[39m \u001b[96muno\u001b[39m \u001b[93m+\u001b[39m \u001b[92m\'\\n\'\u001b[39m \u001b[93m+\u001b[39m \u001b[96mdos\u001b[39m\u001b[90m;\u001b[39m\n\u001b[33m}\u001b[39m\n')
-  t.end()
-})
-
-test('\nhighlighting a block comment with line numbers', function (t) {
-  var code = fs.readFileSync(__dirname + '/fixtures/block-comment.js', 'utf8');
-  var highlighted = cardinal.highlight(code, { theme: customTheme, linenos: true });
-  t.equal(highlighted, '\u001b[90m 1: \n\u001b[90m 2: \u001b[90m/**\n\u001b[90m 3:  * This is a meaningless block jsdoc for a meaningless function.\n\u001b[90m 4:  * Joins two strings, separating them to appear on two lines.\n\u001b[90m 5:  * \n\u001b[90m 6:  * @name foo\n\u001b[90m 7:  * @function\n\u001b[90m 8:  * @param uno {String} first string\n\u001b[90m 9:  * @param dos {String} second string\n\u001b[90m10:  * @return {String} result of the join\n\u001b[90m11:  */\u001b[39m\n\u001b[90m12: \u001b[96mmodule\u001b[39m\u001b[32m.\u001b[39m\u001b[96mexports\u001b[39m \u001b[93m=\u001b[39m \u001b[94mfunction\u001b[39m \u001b[96mfoo\u001b[39m \u001b[90m(\u001b[39m\u001b[96muno\u001b[39m\u001b[32m,\u001b[39m \u001b[96mdos\u001b[39m\u001b[90m)\u001b[39m \u001b[33m{\u001b[39m\n\u001b[90m13:   \u001b[31mreturn\u001b[39m \u001b[96muno\u001b[39m \u001b[93m+\u001b[39m \u001b[92m\'\\n\'\u001b[39m \u001b[93m+\u001b[39m \u001b[96mdos\u001b[39m\u001b[90m;\u001b[39m\n\u001b[90m14: \u001b[33m}\u001b[39m')
-  t.end()
-})
diff --git a/node_modules/cardinal/test/cardinal-highlight-diff-spike.js b/node_modules/cardinal/test/cardinal-highlight-diff-spike.js
deleted file mode 100644
index eec53171e0a49e5689bad3c6ffb5f099b0623867..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/cardinal-highlight-diff-spike.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/*jshint asi:true */
-'use strict';
-
-var fs          =  require('fs')
-  , path        =  require('path')
-  , utl         =  require('../utl')
-  , highlighter =  require('..')
-  , colors      =  require('ansicolors')
-  , diffFile    =  path.join(__dirname, 'fixtures', 'git-diff.txt')
-  , diff        =  fs.readFileSync(diffFile, 'utf-8')
-
-
-// @@ is not a valid js token, so when we see it, we can be sure that we are dealing with a git or svn diff
-var diffRegex = /^@@[^@]+@@$/m;
-var diffIndRegex = /^(@@[^@]+@@)(.*)$/;
-var addRemRegex = /^[+\-]/;
-var lines = diff.split('\n');
-
-function isDiff(lines) {
-  return !!lines
-    .filter(function (line) { 
-      return diffRegex.test(line); 
-    })
-    .length;
-}
-
-var diff = isDiff(lines);
-
-function tryHighlight(code) {
-
-  // TODO: need to remove symbols added to get valid code
-  //       this should be done by getting the splits instead of the actual code from the highlighter
-  //       now we can remove first / last one after highlighting completed
-  function tryAppending(appended, tryNext) {
-    try {
-       return highlighter.highlight(code + appended);
-    } catch (e) {
-      return tryNext(code);
-    }
-  }
-
-  function tryRemoveLeadingComma(tryNext) {
-    var success;
-    try {
-       success = highlighter.highlight(code.replace(/^( +),(.+)$/, '$1 $2'));
-       return success;
-    } catch (e) {
-      return tryNext(code);
-    }
-  }
-
-  function tryPlain() { 
-    try {
-      return highlighter.highlight(code);
-    } catch (e) {
-      return tryCloseMustache();
-    }
-  }
-
-  function tryCloseMustache() { return tryAppending('}', tryCloseParen); }
-
-  function tryCloseParen() { return tryAppending('\\)', tryCloseMustacheParen); }
-
-  function tryCloseMustacheParen() { return tryAppending('})', tryRemovingCommas);}
-
-  function tryRemovingCommas() { return tryRemoveLeadingComma(giveUp); }
-
-  function giveUp() { return code; }
-
-  return tryPlain();
-}
-
-function highlightDiffInd(line, matches) {
-  var highlighted = colors.brightBlue(matches[1])
-    , code = matches[2];
-  return code ? highlighted + tryHighlight(code) : highlighted;
-}
-
-function colorsAddRemove(c) {
-  return addRemRegex.test(c) ? colors.yellow(c) : c;
-}
-
-function highlightDiff(line) {
-  var diffIndMatches = diffIndRegex.exec(line);
-
-  return diffIndMatches 
-    ? highlightDiffInd(line, diffIndMatches)
-    : colorsAddRemove(line[0]) + tryHighlight(line.slice(1));
-}
-
-var highlightFn = diff ? highlightDiff : tryHighlight;
-var highlightedLines = lines.map(highlightFn);
-
-console.log(highlightedLines.join('\n'));
-
diff --git a/node_modules/cardinal/test/cardinal-highlight-file-async.js b/node_modules/cardinal/test/cardinal-highlight-file-async.js
deleted file mode 100644
index 02b8d961ee26a8bbb364176a33676b52d5e03a9d..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/cardinal-highlight-file-async.js
+++ /dev/null
@@ -1,48 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , fs = require('fs')
-  , path = require('path')
-  , customTheme = require('./fixtures/custom') 
-  , cardinal = require('..')
-
-function inspect (obj) {
-  return console.log(util.inspect(obj, false, 5, false))
-}
-
-var file = path.join(__dirname, 'fixtures/foo.js')
-  , fileWithErrors = path.join(__dirname, 'fixtures/foo-with-errors.js')
-
-test('supplying custom theme', function (t) {
-  cardinal.highlightFile(file, { theme: customTheme }, function (err, highlighted) {
-
-    t.equals(null, err, 'no error')
-    t.equals(highlighted, '\u001b[94mfunction\u001b[39m \u001b[96mfoo\u001b[39m\u001b[90m(\u001b[39m\u001b[90m)\u001b[39m \u001b[33m{\u001b[39m \n  \u001b[32mvar\u001b[39m \u001b[96ma\u001b[39m \u001b[93m=\u001b[39m \u001b[34m3\u001b[39m\u001b[90m;\u001b[39m \u001b[31mreturn\u001b[39m \u001b[96ma\u001b[39m \u001b[93m>\u001b[39m \u001b[34m2\u001b[39m \u001b[93m?\u001b[39m \u001b[31mtrue\u001b[39m \u001b[93m:\u001b[39m \u001b[91mfalse\u001b[39m\u001b[90m;\u001b[39m \n\u001b[33m}\u001b[39m\n')
-    t.end()
-  })
-})
-
-test('not supplying custom theme', function (t) {
-  cardinal.highlightFile(file, function (err, highlighted) {
-
-    t.equals(null, err, 'no error')
-    t.equals(highlighted, '\u001b[94mfunction\u001b[39m \u001b[37mfoo\u001b[39m\u001b[90m(\u001b[39m\u001b[90m)\u001b[39m \u001b[33m{\u001b[39m \n  \u001b[32mvar\u001b[39m \u001b[37ma\u001b[39m \u001b[93m=\u001b[39m \u001b[34m3\u001b[39m\u001b[90m;\u001b[39m \u001b[31mreturn\u001b[39m \u001b[37ma\u001b[39m \u001b[93m>\u001b[39m \u001b[34m2\u001b[39m \u001b[93m?\u001b[39m \u001b[91mtrue\u001b[39m \u001b[93m:\u001b[39m \u001b[91mfalse\u001b[39m\u001b[90m;\u001b[39m \n\u001b[33m}\u001b[39m\n')
-    t.end()
-  })
-})
-
-test('errornous code', function (t) {
-  cardinal.highlightFile(fileWithErrors, function (err, highlighted) {
-    t.similar(err.message, /Unable to perform highlight. The code contained syntax errors.* Line 1: Unexpected token [(]/)
-    t.end()
-  })
-})
-
-test('non existing file', function (t) {
-  cardinal.highlightFile('./not/existing', function (err, highlighted) {
-    t.similar(err.message, /ENOENT, .*not.existing/)
-    t.end()
-  })
-})
diff --git a/node_modules/cardinal/test/cardinal-highlight-file-sync.js b/node_modules/cardinal/test/cardinal-highlight-file-sync.js
deleted file mode 100644
index 7b16e4eac6edfb056adea38d19c2b055c9feafff..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/cardinal-highlight-file-sync.js
+++ /dev/null
@@ -1,48 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , fs = require('fs')
-  , path = require('path')
-  , customTheme = require('./fixtures/custom') 
-  , cardinal = require('..')
-
-function inspect (obj) {
-  return console.log(util.inspect(obj, false, 5, false))
-}
-
-var file = path.join(__dirname, 'fixtures/foo.js')
-  , fileWithErrors = path.join(__dirname, 'fixtures/foo-with-errors.js')
-
-test('supplying custom theme', function (t) {
-  var highlighted = cardinal.highlightFileSync(file, { theme: customTheme });
-
-  t.equals(highlighted, '\u001b[94mfunction\u001b[39m \u001b[96mfoo\u001b[39m\u001b[90m(\u001b[39m\u001b[90m)\u001b[39m \u001b[33m{\u001b[39m \n  \u001b[32mvar\u001b[39m \u001b[96ma\u001b[39m \u001b[93m=\u001b[39m \u001b[34m3\u001b[39m\u001b[90m;\u001b[39m \u001b[31mreturn\u001b[39m \u001b[96ma\u001b[39m \u001b[93m>\u001b[39m \u001b[34m2\u001b[39m \u001b[93m?\u001b[39m \u001b[31mtrue\u001b[39m \u001b[93m:\u001b[39m \u001b[91mfalse\u001b[39m\u001b[90m;\u001b[39m \n\u001b[33m}\u001b[39m\n')
-  t.end()
-})
-
-test('not supplying custom theme', function (t) {
-  var highlighted = cardinal.highlightFileSync(file);
-
-  t.equals(highlighted, '\u001b[94mfunction\u001b[39m \u001b[37mfoo\u001b[39m\u001b[90m(\u001b[39m\u001b[90m)\u001b[39m \u001b[33m{\u001b[39m \n  \u001b[32mvar\u001b[39m \u001b[37ma\u001b[39m \u001b[93m=\u001b[39m \u001b[34m3\u001b[39m\u001b[90m;\u001b[39m \u001b[31mreturn\u001b[39m \u001b[37ma\u001b[39m \u001b[93m>\u001b[39m \u001b[34m2\u001b[39m \u001b[93m?\u001b[39m \u001b[91mtrue\u001b[39m \u001b[93m:\u001b[39m \u001b[91mfalse\u001b[39m\u001b[90m;\u001b[39m \n\u001b[33m}\u001b[39m\n')
-  t.end()
-})
-
-test('errornous code', function (t) {
-  try {
-    cardinal.highlightFileSync(fileWithErrors);
-  } catch (e) {
-    t.similar(e.message, /Unable to perform highlight. The code contained syntax errors.* Line 1: Unexpected token [(]/)
-    t.end()
-  }
-})
-
-test('non existing file', function (t) {
-  try {
-    cardinal.highlightFileSync('./not/existing');
-  } catch (e) {
-    t.similar(e.message, /ENOENT, .*not.existing/)
-    t.end()
-  }
-})
diff --git a/node_modules/cardinal/test/cardinal-highlight-git-diff.js b/node_modules/cardinal/test/cardinal-highlight-git-diff.js
deleted file mode 100644
index 9f7482d66e901721939ec567c55b7617801e5711..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/cardinal-highlight-git-diff.js
+++ /dev/null
@@ -1,3 +0,0 @@
-
-// Test Cases
-//  highlightDiff('@@ -25,22 +31,47 @@ function resolveTheme (config) { }')
diff --git a/node_modules/cardinal/test/cardinal-highlight-json-file-async.js b/node_modules/cardinal/test/cardinal-highlight-json-file-async.js
deleted file mode 100644
index 54fd16918acb5629ca9b8ed80022b1b75581325c..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/cardinal-highlight-json-file-async.js
+++ /dev/null
@@ -1,31 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , path = require('path')
-  , cardinal = require('..')
-
-function inspect (obj) {
-  return console.log(util.inspect(obj, false, 5, false))
-}
-
-var file = path.join(__dirname, 'fixtures/json.json');
-
-test('json option set from extension', function (t) {
-  cardinal.highlightFile(file, function (err, highlighted) {
-
-    t.equals(null, err, 'no error');
-    t.equals(highlighted, '\u001b[33m{\u001b[39m\u001b[32m"foo"\u001b[39m\u001b[93m:\u001b[39m\u001b[92m"bar"\u001b[39m\u001b[32m,\u001b[39m\u001b[32m"baz"\u001b[39m\u001b[93m:\u001b[39m\u001b[92m"quux"\u001b[39m\u001b[32m,\u001b[39m\u001b[32m"bam"\u001b[39m\u001b[93m:\u001b[39m\u001b[90mnull\u001b[39m\u001b[33m}\u001b[39m');
-    t.end();
-  });
-});
-
-test('json option respected if false', function (t) {
-  cardinal.highlightFile(file, { json: false }, function (err, highlighted) {
-
-    t.similar(err.message, /Unable to perform highlight. The code contained syntax errors.* Line 1: Unexpected token /);
-    t.end();
-
-  });
-});
diff --git a/node_modules/cardinal/test/cardinal-highlight-json-file-sync.js b/node_modules/cardinal/test/cardinal-highlight-json-file-sync.js
deleted file mode 100644
index 0f75077a31d885c8e1605d908c486a214b4bf16e..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/cardinal-highlight-json-file-sync.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , path = require('path')
-  , cardinal = require('..')
-
-function inspect (obj) {
-  return console.log(util.inspect(obj, false, 5, false))
-}
-
-var file = path.join(__dirname, 'fixtures/json.json');
-
-test('json option set from extension', function (t) {
-  var highlighted = cardinal.highlightFileSync(file);
-
-  t.equals(highlighted, '\u001b[33m{\u001b[39m\u001b[32m"foo"\u001b[39m\u001b[93m:\u001b[39m\u001b[92m"bar"\u001b[39m\u001b[32m,\u001b[39m\u001b[32m"baz"\u001b[39m\u001b[93m:\u001b[39m\u001b[92m"quux"\u001b[39m\u001b[32m,\u001b[39m\u001b[32m"bam"\u001b[39m\u001b[93m:\u001b[39m\u001b[90mnull\u001b[39m\u001b[33m}\u001b[39m');
-  t.end();
-});
-
-test('json option respected if false', function (t) {
-  try {
-    var highlighted = cardinal.highlightFileSync(file, { json: false });
-  } catch (e) {
-    t.similar(e.message, /Unable to perform highlight. The code contained syntax errors.* Line 1: Unexpected token /);
-    t.end();
-  }
-});
diff --git a/node_modules/cardinal/test/cardinal-highlight-json.js b/node_modules/cardinal/test/cardinal-highlight-json.js
deleted file mode 100644
index bbbe27da6a3bbd79c571749a789b63f274cda687..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/cardinal-highlight-json.js
+++ /dev/null
@@ -1,41 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , customTheme = require('./fixtures/custom') 
-  , cardinal = require('..')
-
-
-function inspect (obj) {
-  return console.log(util.inspect(obj, false, 5, false))
-}
-
-var json = JSON.stringify({
-  foo: 'bar',
-  baz: 'quux',
-  bam: null
-});
-
-test('supplying custom theme', function (t) {
-  var highlighted = cardinal.highlight(json, { json: true, theme: customTheme });
-
-  t.equals(highlighted, '\u001b[33m{\u001b[39m\u001b[92m"foo"\u001b[39m\u001b[93m:\u001b[39m\u001b[92m"bar"\u001b[39m\u001b[32m,\u001b[39m\u001b[92m"baz"\u001b[39m\u001b[93m:\u001b[39m\u001b[92m"quux"\u001b[39m\u001b[32m,\u001b[39m\u001b[92m"bam"\u001b[39m\u001b[93m:\u001b[39m\u001b[90mnull\u001b[39m\u001b[33m}\u001b[39m')
-  t.end();
-});
-
-test('not supplying custom theme', function (t) {
-  var highlighted = cardinal.highlight(json, { json: true });
-
-  t.equals(highlighted, '\u001b[33m{\u001b[39m\u001b[32m"foo"\u001b[39m\u001b[93m:\u001b[39m\u001b[92m"bar"\u001b[39m\u001b[32m,\u001b[39m\u001b[32m"baz"\u001b[39m\u001b[93m:\u001b[39m\u001b[92m"quux"\u001b[39m\u001b[32m,\u001b[39m\u001b[32m"bam"\u001b[39m\u001b[93m:\u001b[39m\u001b[90mnull\u001b[39m\u001b[33m}\u001b[39m')
-  t.end();
-});
-
-test('without json option', function (t) {
-  try {
-    cardinal.highlight(json);
-  } catch (e) {
-    t.similar(e.message, /Unable to perform highlight. The code contained syntax errors.* Line 1: Unexpected token /)
-    t.end();
-  }
-});
diff --git a/node_modules/cardinal/test/cardinal-highlight-string.js b/node_modules/cardinal/test/cardinal-highlight-string.js
deleted file mode 100644
index beefe0d6f8ef2fe51696bb28d97211171a6007b9..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/cardinal-highlight-string.js
+++ /dev/null
@@ -1,70 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , fs = require('fs')
-  , customTheme = require('./fixtures/custom') 
-  , cardinal = require('..')
-
-function inspect (obj) {
-  return console.log(util.inspect(obj, false, 5, false))
-}
-
-var code = 'function foo() { var a = 3; return a > 2 ? true : false; }'
-  , codeWithErrors = 'function () { var a = 3; return a > 2 ? true : false; }';
-
-test('supplying custom theme', function (t) {
-  var highlighted = cardinal.highlight(code, { theme: customTheme });
-
-  t.equals(highlighted, '\u001b[94mfunction\u001b[39m \u001b[96mfoo\u001b[39m\u001b[90m(\u001b[39m\u001b[90m)\u001b[39m \u001b[33m{\u001b[39m \u001b[32mvar\u001b[39m \u001b[96ma\u001b[39m \u001b[93m=\u001b[39m \u001b[34m3\u001b[39m\u001b[90m;\u001b[39m \u001b[31mreturn\u001b[39m \u001b[96ma\u001b[39m \u001b[93m>\u001b[39m \u001b[34m2\u001b[39m \u001b[93m?\u001b[39m \u001b[31mtrue\u001b[39m \u001b[93m:\u001b[39m \u001b[91mfalse\u001b[39m\u001b[90m;\u001b[39m \u001b[33m}\u001b[39m')
-  t.end()
-})
-
-test('not supplying custom theme', function (t) {
-  var highlighted = cardinal.highlight(code);
-
-  t.equals(highlighted, '\u001b[94mfunction\u001b[39m \u001b[37mfoo\u001b[39m\u001b[90m(\u001b[39m\u001b[90m)\u001b[39m \u001b[33m{\u001b[39m \u001b[32mvar\u001b[39m \u001b[37ma\u001b[39m \u001b[93m=\u001b[39m \u001b[34m3\u001b[39m\u001b[90m;\u001b[39m \u001b[31mreturn\u001b[39m \u001b[37ma\u001b[39m \u001b[93m>\u001b[39m \u001b[34m2\u001b[39m \u001b[93m?\u001b[39m \u001b[91mtrue\u001b[39m \u001b[93m:\u001b[39m \u001b[91mfalse\u001b[39m\u001b[90m;\u001b[39m \u001b[33m}\u001b[39m')
-  t.end()
-})
-
-test('errornous code', function (t) {
-  try {
-    cardinal.highlight(codeWithErrors);
-  } catch (e) {
-    t.similar(e.message, /Unable to perform highlight. The code contained syntax errors.* Line 1: Unexpected token [(]/)
-    t.end()
-  }
-})
-
-test('line numbers no firstline given', function (t) {
-  var highlighted = cardinal.highlight(code, { linenos: true });
-  t.equals(highlighted, '\u001b[90m1: \u001b[94mfunction\u001b[39m \u001b[37mfoo\u001b[39m\u001b[90m(\u001b[39m\u001b[90m)\u001b[39m \u001b[33m{\u001b[39m \u001b[32mvar\u001b[39m \u001b[37ma\u001b[39m \u001b[93m=\u001b[39m \u001b[34m3\u001b[39m\u001b[90m;\u001b[39m \u001b[31mreturn\u001b[39m \u001b[37ma\u001b[39m \u001b[93m>\u001b[39m \u001b[34m2\u001b[39m \u001b[93m?\u001b[39m \u001b[91mtrue\u001b[39m \u001b[93m:\u001b[39m \u001b[91mfalse\u001b[39m\u001b[90m;\u001b[39m \u001b[33m}\u001b[39m')
-  t.end()
-})
-
-test('line numbers firstline 99', function (t) {
-  var highlighted = cardinal.highlight(code, { linenos: true, firstline: 99 });
-  t.equals(highlighted, '\u001b[90m99: \u001b[94mfunction\u001b[39m \u001b[37mfoo\u001b[39m\u001b[90m(\u001b[39m\u001b[90m)\u001b[39m \u001b[33m{\u001b[39m \u001b[32mvar\u001b[39m \u001b[37ma\u001b[39m \u001b[93m=\u001b[39m \u001b[34m3\u001b[39m\u001b[90m;\u001b[39m \u001b[31mreturn\u001b[39m \u001b[37ma\u001b[39m \u001b[93m>\u001b[39m \u001b[34m2\u001b[39m \u001b[93m?\u001b[39m \u001b[91mtrue\u001b[39m \u001b[93m:\u001b[39m \u001b[91mfalse\u001b[39m\u001b[90m;\u001b[39m \u001b[33m}\u001b[39m')
-  t.end()
-})
-
-test('line numbers multi line no first line given', function (t) {
-  var multilineCode = '' + 
-    function foo () {
-      return 1;
-    };
-  var highlighted = cardinal.highlight(multilineCode, { linenos: true });
-  t.equals(highlighted,'\u001b[90m1: \u001b[94mfunction\u001b[39m \u001b[37mfoo\u001b[39m\u001b[90m(\u001b[39m\u001b[90m)\u001b[39m \u001b[33m{\u001b[39m\n\u001b[90m2:       \u001b[31mreturn\u001b[39m \u001b[34m1\u001b[39m\u001b[90m;\u001b[39m\n\u001b[90m3:     \u001b[33m}\u001b[39m')
-  t.end()
-})
-
-test('line numbers multi line first line 99', function (t) {
-  var multilineCode = '' + 
-    function foo () {
-      return 1;
-    };
-  var highlighted = cardinal.highlight(multilineCode, { linenos: true, firstline: 99 });
-  t.equals(highlighted,'\u001b[90m 99: \u001b[94mfunction\u001b[39m \u001b[37mfoo\u001b[39m\u001b[90m(\u001b[39m\u001b[90m)\u001b[39m \u001b[33m{\u001b[39m\n\u001b[90m100:       \u001b[31mreturn\u001b[39m \u001b[34m1\u001b[39m\u001b[90m;\u001b[39m\n\u001b[90m101:     \u001b[33m}\u001b[39m')
-  t.end()
-})
diff --git a/node_modules/cardinal/test/cardinal-smoke.js b/node_modules/cardinal/test/cardinal-smoke.js
deleted file mode 100644
index f2d0e18cbea070af1fba95e43472eb7f824fe8d5..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/cardinal-smoke.js
+++ /dev/null
@@ -1,44 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-// applying esprima to a bunch of files of contained libraries as a smoke test
-var test     =  require('tap').test
-  , path     =  require('path')
-  , fs       =  require('fs')
-  , readdirp =  require('readdirp')
-  , cardinal  =  require('..')
-  , node_modules =  path.join(__dirname, '..', 'node_modules')
-  , tapdir       =  path.join(node_modules, 'tap')
-  , redeyeddir   =  path.join(node_modules, 'redeyed')
-
-
-test('tap', function (t) {
-  var invalidTapFiles = [
-      'async-map-ordered.js'
-    , 'prof.js'
-  ]
-
-  readdirp({ root: tapdir, fileFilter: '*.js' })
-    .on('data', function (entry) {
-      
-      if (~invalidTapFiles.indexOf(entry.name)) return
-
-      var code = fs.readFileSync(entry.fullPath, 'utf-8')
-        , result = cardinal.highlight(code);
-
-      t.assert(~result.indexOf('[32mvar\u001b[39m') || !(~result.indexOf('var ')), 'highlighted ' + entry.path)
-    })
-    .on('end', t.end.bind(t))
-})
-
-test('redeyed', function (t) {
-  readdirp({ root: redeyeddir, fileFilter: 'redeyed.js' })
-    .on('data', function (entry) {
-      
-      var code = fs.readFileSync(entry.fullPath, 'utf-8')
-        , result = cardinal.highlight(code);
-
-      t.assert(~result.indexOf('[32mvar\u001b[39m') || !(~result.indexOf('var ')), 'highlighted ' + entry.path)
-    })
-    .on('end', t.end.bind(t))
-})
diff --git a/node_modules/cardinal/test/fixtures/block-comment.js b/node_modules/cardinal/test/fixtures/block-comment.js
deleted file mode 100644
index 597bc69d836aea481d59bcfe682a1fc93bee023a..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/fixtures/block-comment.js
+++ /dev/null
@@ -1,14 +0,0 @@
-
-/**
- * This is a meaningless block jsdoc for a meaningless function.
- * Joins two strings, separating them to appear on two lines.
- * 
- * @name foo
- * @function
- * @param uno {String} first string
- * @param dos {String} second string
- * @return {String} result of the join
- */
-module.exports = function foo (uno, dos) {
-  return uno + '\n' + dos;
-}
diff --git a/node_modules/cardinal/test/fixtures/custom.js b/node_modules/cardinal/test/fixtures/custom.js
deleted file mode 100644
index fc369fc2d3ff7a8925c4b2456385652609415f93..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/fixtures/custom.js
+++ /dev/null
@@ -1,144 +0,0 @@
-var colors = require('ansicolors');
-
-// Change the below definitions in order to tweak the color theme.
-module.exports = {
-
-    'Boolean': {
-      // changed from default
-      'true'   :  colors.red
-
-    , 'false'  :  undefined
-    , _default :  colors.brightRed
-    }
-
-  , 'Identifier': {
-      'undefined' :  colors.brightBlack
-    , 'self'      :  colors.brightRed
-    , 'console'   :  colors.blue
-    , 'log'       :  colors.blue
-    , 'warn'      :  colors.red
-    , 'error'     :  colors.brightRed
-    //
-      // changed from default
-    , _default    :  colors.brightCyan
-    }
-
-  , 'Null': {
-      _default: colors.brightBlack
-    }
-
-  , 'Numeric': {
-      _default: colors.blue
-    }
-
-  , 'String': {
-      _default: colors.brightGreen
-    }
-
-  , 'Keyword': {
-      'break'       :  undefined
-
-    , 'case'        :  undefined
-    , 'catch'       :  colors.cyan
-    , 'continue'    :  undefined
-
-    , 'debugger'    :  undefined
-    , 'default'     :  undefined
-    , 'delete'      :  colors.red
-    , 'do'          :  undefined
-
-    , 'else'        :  undefined
-
-    , 'finally'     :  colors.cyan
-    , 'for'         :  undefined
-    , 'function'    :  undefined
-
-    , 'if'          :  undefined
-    , 'in'          :  undefined
-    , 'instanceof'  :  undefined
-
-    , 'new'         :  colors.red
-    , 'return'      :  colors.red
-    , 'switch'      :  undefined
-
-    , 'this'        :  colors.brightRed
-    , 'throw'       :  undefined
-    , 'try'         :  colors.cyan
-    , 'typeof'      :  undefined
-
-    , 'var'         :  colors.green
-    , 'void'        :  undefined
-
-    , 'while'       :  undefined
-    , 'with'        :  undefined
-    , _default      :  colors.brightBlue
-  }
-  , 'Punctuator': {
-      ';': colors.brightBlack
-    , '.': colors.green  
-    , ',': colors.green  
-
-    , '{': colors.yellow
-    , '}': colors.yellow
-    , '(': colors.brightBlack  
-    , ')': colors.brightBlack  
-    , '[': colors.yellow
-    , ']': colors.yellow
-
-    , '<': undefined
-    , '>': undefined
-    , '+': undefined
-    , '-': undefined
-    , '*': undefined
-    , '%': undefined
-    , '&': undefined
-    , '|': undefined
-    , '^': undefined
-    , '!': undefined
-    , '~': undefined
-    , '?': undefined
-    , ':': undefined
-    , '=': undefined
-
-    , '<=': undefined
-    , '>=': undefined
-    , '==': undefined
-    , '!=': undefined
-    , '++': undefined
-    , '--': undefined
-    , '<<': undefined
-    , '>>': undefined
-    , '&&': undefined
-    , '||': undefined
-    , '+=': undefined
-    , '-=': undefined
-    , '*=': undefined
-    , '%=': undefined
-    , '&=': undefined
-    , '|=': undefined
-    , '^=': undefined
-    , '/=': undefined
-
-    , '===': undefined
-    , '!==': undefined
-    , '>>>': undefined
-    , '<<=': undefined
-    , '>>=': undefined
-    
-    , '>>>=': undefined
-
-    , _default: colors.brightYellow
-  }
-
-    // line comment
-  , Line: {
-     _default: colors.brightBlack
-    }
-
-    /* block comment */
-  , Block: {
-     _default: colors.brightBlack
-    }
-
-  , _default: undefined
-};
diff --git a/node_modules/cardinal/test/fixtures/foo-with-errors.js b/node_modules/cardinal/test/fixtures/foo-with-errors.js
deleted file mode 100644
index fefebe2bb29650cc055c53ec09bf7cff4942c4e0..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/fixtures/foo-with-errors.js
+++ /dev/null
@@ -1,3 +0,0 @@
-function () { 
-  var a = 3; return a > 2 ? true : false; 
-};
diff --git a/node_modules/cardinal/test/fixtures/foo.js b/node_modules/cardinal/test/fixtures/foo.js
deleted file mode 100644
index bd9a3e07d2a978473b65d7831b810794e7ec3c2b..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/fixtures/foo.js
+++ /dev/null
@@ -1,3 +0,0 @@
-function foo() { 
-  var a = 3; return a > 2 ? true : false; 
-}
diff --git a/node_modules/cardinal/test/fixtures/git-diff.txt b/node_modules/cardinal/test/fixtures/git-diff.txt
deleted file mode 100644
index e324b670fdedcc0d4f762add290148fafd3e12e8..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/fixtures/git-diff.txt
+++ /dev/null
@@ -1,78 +0,0 @@
-diff --git a/test/settings.js b/test/settings.js
-index 7b28d66..642688f 100644
---- a/test/settings.js
-+++ b/test/settings.js
-@@ -1,14 +1,20 @@
- 'use strict';
- /*jshint asi: true*/
- 
--var test     =  require('tap').test
--  , path     =  require('path')
--  , fs       =  require('fs')
--  , settings =  require('../settings')
--  , existsSync = fs.existsSync || path.existsSync
-+var test                =  require('tap').test
-+  , path                =  require('path')
-+  , fs                  =  require('fs')
-   , hideSemicolonsTheme =  require('../themes/hide-semicolons')
-   , home                =  path.join(__dirname, 'fixtures', 'home')
-   , rcpath              =  path.join(home, '.cardinalrc')
-+  , existsSync          =  fs.existsSync || path.existsSync
-+  , settingsResolve     =  require.resolve('../settings')
-+  , settings
-+
-+function setup () {
-+  delete require.cache[settingsResolve]
-+  settings = require(settingsResolve)
-+}
- 
- function writerc(config) {
-   fs.writeFileSync(rcpath, JSON.stringify(config), 'utf-8')
-@@ -25,22 +31,47 @@ function resolveTheme (config) {
-   return result;
- }
- 
-+function getSettings (config) {
-+  writerc(config)
-+  var result = settings.getSettings(home)
-+  removerc()
-+  return result;
-+}
-+
- if (!existsSync(home)) fs.mkdirSync(home);
- 
- test('no .cardinalrc in home', function (t) {
-+  setup()
-   var theme = settings.resolveTheme(home)
-   t.equals(theme, undefined, 'resolves no theme') 
-   t.end()
- })
- 
- test('.cardinalrc with theme "hide-semicolons" in home', function (t) {
-+  setup()
-   var theme = resolveTheme({ theme: "hide-semicolons" })
-   t.deepEquals(theme, hideSemicolonsTheme, 'resolves hide-semicolons theme') 
-   t.end()
- })
- 
- test('.cardinalrc with full path to "hide-semicolons.js" in home', function (t) {
-+  setup()
-   var theme = resolveTheme({ theme: path.join(__dirname, '..', 'themes', 'hide-semicolons.js') })
-   t.deepEquals(theme, hideSemicolonsTheme, 'resolves hide-semicolons theme') 
-   t.end()
- })
-+
-+test('.cardinalrc with linenos: true', function (t) {
-+  setup()
-+  var opts = { linenos: true }
-+  t.deepEquals(getSettings(opts), opts)
-+  t.end()
-+})
-+
-+test('.cardinalrc with linenos: true and theme', function (t) {
-+  setup()
-+  var opts = { linenos: true, theme: 'some theme' }
-+  t.deepEquals(getSettings(opts), opts)
-+  t.end()
-+})
-+
diff --git a/node_modules/cardinal/test/fixtures/json.json b/node_modules/cardinal/test/fixtures/json.json
deleted file mode 100644
index 0c39df44b5d2bcab2d6f260036a366f6eca18a91..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/fixtures/json.json
+++ /dev/null
@@ -1 +0,0 @@
-{"foo":"bar","baz":"quux","bam":null}
\ No newline at end of file
diff --git a/node_modules/cardinal/test/fixtures/svn-diff.txt b/node_modules/cardinal/test/fixtures/svn-diff.txt
deleted file mode 100644
index 635b056da0fff3a2b18cec61b34ada5afd8f724f..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/fixtures/svn-diff.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-Index: grunt.js
-===================================================================
---- grunt.js	(revision 31200)
-+++ grunt.js	(working copy)
-@@ -12,6 +12,7 @@
- 
- module.exports = function (grunt) {
- 
-+  console.log('hello world');
-   // Project configuration.
-   grunt.initConfig({
-     lint: {
-@@ -19,10 +20,6 @@
-         'packages/services.web/{!(test)/**/,}*.js',
-         'packages/error/**/*.js'
-       ],
--      scripts: [
--        'grunt.js',
--        'db/**/*.js'
--      ],
-       browser: [
-         'packages/web/server.js',
-         'packages/web/server/**/*.js',
diff --git a/node_modules/cardinal/test/settings.js b/node_modules/cardinal/test/settings.js
deleted file mode 100644
index 642688f148b932d4892da460450417d455767b46..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/settings.js
+++ /dev/null
@@ -1,77 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test                =  require('tap').test
-  , path                =  require('path')
-  , fs                  =  require('fs')
-  , hideSemicolonsTheme =  require('../themes/hide-semicolons')
-  , home                =  path.join(__dirname, 'fixtures', 'home')
-  , rcpath              =  path.join(home, '.cardinalrc')
-  , existsSync          =  fs.existsSync || path.existsSync
-  , settingsResolve     =  require.resolve('../settings')
-  , settings
-
-function setup () {
-  delete require.cache[settingsResolve]
-  settings = require(settingsResolve)
-}
-
-function writerc(config) {
-  fs.writeFileSync(rcpath, JSON.stringify(config), 'utf-8')
-}
-
-function removerc () {
-  fs.unlinkSync(rcpath)
-}
-
-function resolveTheme (config) {
-  writerc(config)
-  var result = settings.resolveTheme(home)
-  removerc()
-  return result;
-}
-
-function getSettings (config) {
-  writerc(config)
-  var result = settings.getSettings(home)
-  removerc()
-  return result;
-}
-
-if (!existsSync(home)) fs.mkdirSync(home);
-
-test('no .cardinalrc in home', function (t) {
-  setup()
-  var theme = settings.resolveTheme(home)
-  t.equals(theme, undefined, 'resolves no theme') 
-  t.end()
-})
-
-test('.cardinalrc with theme "hide-semicolons" in home', function (t) {
-  setup()
-  var theme = resolveTheme({ theme: "hide-semicolons" })
-  t.deepEquals(theme, hideSemicolonsTheme, 'resolves hide-semicolons theme') 
-  t.end()
-})
-
-test('.cardinalrc with full path to "hide-semicolons.js" in home', function (t) {
-  setup()
-  var theme = resolveTheme({ theme: path.join(__dirname, '..', 'themes', 'hide-semicolons.js') })
-  t.deepEquals(theme, hideSemicolonsTheme, 'resolves hide-semicolons theme') 
-  t.end()
-})
-
-test('.cardinalrc with linenos: true', function (t) {
-  setup()
-  var opts = { linenos: true }
-  t.deepEquals(getSettings(opts), opts)
-  t.end()
-})
-
-test('.cardinalrc with linenos: true and theme', function (t) {
-  setup()
-  var opts = { linenos: true, theme: 'some theme' }
-  t.deepEquals(getSettings(opts), opts)
-  t.end()
-})
-
diff --git a/node_modules/cardinal/test/themes.js b/node_modules/cardinal/test/themes.js
deleted file mode 100644
index 590cdcaf60582a0244b64e9a1b89d8002e538c32..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/test/themes.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test     =  require('tap').test
-  , path     =  require('path')
-  , fs       =  require('fs')
-  , themesdir = path.join(__dirname, '..', 'themes')
-  , allFiles = fs.readdirSync(themesdir)
-
-test('validate themes by requiring all of them', function (t) {
-  allFiles
-    .filter(function (file) { return path.extname(file) === '.js'; })
-    .forEach(function (theme) {
-      try {
-        t.ok(require(path.join(themesdir, theme)), theme + ' is valid')   
-      } catch (e) {
-        t.fail('theme: ' + theme + ' is invalid! ' + e.message)
-      }
-    })
-  t.end()
-})
-  
diff --git a/node_modules/cardinal/themes/README.md b/node_modules/cardinal/themes/README.md
deleted file mode 100644
index fe2a44342e700a7ea4d67ec2f5806f818aba8f05..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/themes/README.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# cardinal themes
-
-These are the built in themes that come with cardinal.
-
-You can create more themes by copying and then editing the [empty
-theme](https://github.com/thlorenz/cardinal/blob/master/themes/empty.js) which is provided for that purpose.
-
-The [hide semicolons theme](https://github.com/thlorenz/cardinal/blob/master/themes/hide-semicolons.js) has the added
-benefit of making all semicolons invisible. This makes code more readable at times.
-
-Find out how to change the theme used by cardinal [here](https://github.com/thlorenz/cardinal#theme).
-
-# sharing themes
-
-To add your theme to the cardinal built-in themes, follow the below steps:
-
-1. fork the cardinal repository
-2. add your theme to the themes folder and commit your changes
-3. create a pull request
-
-If you believe that your theme is better than the current default theme, let me know by creating an issue. 
-
-This will allow others to cast their vote. If enough people agree, your theme will be promoted to be the default.
-
-## Contributed Themes
-
-### tomorrow night
-
-[![tomorrow-night](https://github.com/thlorenz/cardinal/raw/master/assets/theme-tomorrow-night.png)](https://github.com/thlorenz/cardinal/blob/master/themes/tomorrow-night.js)
-
-*by [firede](https://github.com/firede)*
diff --git a/node_modules/cardinal/themes/default.js b/node_modules/cardinal/themes/default.js
deleted file mode 100644
index 86ee59ad46e97fb362e4733396e2994b567eb2f6..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/themes/default.js
+++ /dev/null
@@ -1,147 +0,0 @@
-var colors = require('ansicolors');
-
-// Change the below definitions in order to tweak the color theme.
-module.exports = {
-
-    'Boolean': {
-      'true'   :  undefined
-    , 'false'  :  undefined
-    , _default :  colors.brightRed
-    }
-
-  , 'Identifier': {
-      'undefined' :  colors.brightBlack
-    , 'self'      :  colors.brightRed
-    , 'console'   :  colors.blue
-    , 'log'       :  colors.blue
-    , 'warn'      :  colors.red
-    , 'error'     :  colors.brightRed
-    , _default    :  colors.white
-    }
-
-  , 'Null': {
-      _default: colors.brightBlack
-    }
-
-  , 'Numeric': {
-      _default: colors.blue
-    }
-
-  , 'String': {
-      _default: function (s, info) {
-        var nextToken = info.tokens[info.tokenIndex + 1];
-
-        // show keys of object literals and json in different color
-        return (nextToken && nextToken.type === 'Punctuator' && nextToken.value === ':') 
-          ? colors.green(s)
-          : colors.brightGreen(s);
-      }
-    }
-
-  , 'Keyword': {
-      'break'       :  undefined
-
-    , 'case'        :  undefined
-    , 'catch'       :  colors.cyan
-    , 'continue'    :  undefined
-
-    , 'debugger'    :  undefined
-    , 'default'     :  undefined
-    , 'delete'      :  colors.red
-    , 'do'          :  undefined
-
-    , 'else'        :  undefined
-
-    , 'finally'     :  colors.cyan
-    , 'for'         :  undefined
-    , 'function'    :  undefined
-
-    , 'if'          :  undefined
-    , 'in'          :  undefined
-    , 'instanceof'  :  undefined
-
-    , 'new'         :  colors.red
-    , 'return'      :  colors.red
-    , 'switch'      :  undefined
-
-    , 'this'        :  colors.brightRed
-    , 'throw'       :  undefined
-    , 'try'         :  colors.cyan
-    , 'typeof'      :  undefined
-
-    , 'var'         :  colors.green
-    , 'void'        :  undefined
-
-    , 'while'       :  undefined
-    , 'with'        :  undefined
-    , _default      :  colors.brightBlue
-  }
-  , 'Punctuator': {
-      ';': colors.brightBlack
-    , '.': colors.green  
-    , ',': colors.green  
-
-    , '{': colors.yellow
-    , '}': colors.yellow
-    , '(': colors.brightBlack  
-    , ')': colors.brightBlack  
-    , '[': colors.yellow
-    , ']': colors.yellow
-
-    , '<': undefined
-    , '>': undefined
-    , '+': undefined
-    , '-': undefined
-    , '*': undefined
-    , '%': undefined
-    , '&': undefined
-    , '|': undefined
-    , '^': undefined
-    , '!': undefined
-    , '~': undefined
-    , '?': undefined
-    , ':': undefined
-    , '=': undefined
-
-    , '<=': undefined
-    , '>=': undefined
-    , '==': undefined
-    , '!=': undefined
-    , '++': undefined
-    , '--': undefined
-    , '<<': undefined
-    , '>>': undefined
-    , '&&': undefined
-    , '||': undefined
-    , '+=': undefined
-    , '-=': undefined
-    , '*=': undefined
-    , '%=': undefined
-    , '&=': undefined
-    , '|=': undefined
-    , '^=': undefined
-    , '/=': undefined
-
-    , '===': undefined
-    , '!==': undefined
-    , '>>>': undefined
-    , '<<=': undefined
-    , '>>=': undefined
-    
-    , '>>>=': undefined
-
-    , _default: colors.brightYellow
-  }
-
-    // line comment
-  , Line: {
-     _default: colors.brightBlack
-    }
-
-    /* block comment */
-  , Block: {
-     _default: colors.brightBlack
-    }
-
-  , _default: undefined
-};
diff --git a/node_modules/cardinal/themes/empty.js b/node_modules/cardinal/themes/empty.js
deleted file mode 100644
index 3203aacbd343bea894d1295146fcf7d2a3ce96a2..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/themes/empty.js
+++ /dev/null
@@ -1,140 +0,0 @@
-/* 
- * Copy this file and use it as a starting point for your custom cardinal color theme.
- * Just fill in or change the entries for the tokens you want to color
- * Keep in mind that more specific configurations override less specific ones.
- */
-
-var colors = require('ansicolors');
-
-// Change the below definitions in order to tweak the color theme.
-module.exports = {
-
-    'Boolean': {
-      'true'   :  undefined
-    , 'false'  :  undefined
-    , _default :  undefined
-    }
-
-  , 'Identifier': {
-      _default: undefined
-    }
-
-  , 'Null': {
-      _default: undefined
-    }
-
-  , 'Numeric': {
-      _default: undefined
-    }
-
-  , 'String': {
-      _default: undefined
-    }
-
-  , 'Keyword': {
-      'break'       :  undefined
-
-    , 'case'        :  undefined
-    , 'catch'       :  undefined
-    , 'continue'    :  undefined
-
-    , 'debugger'    :  undefined
-    , 'default'     :  undefined
-    , 'delete'      :  undefined
-    , 'do'          :  undefined
-
-    , 'else'        :  undefined
-
-    , 'finally'     :  undefined
-    , 'for'         :  undefined
-    , 'function'    :  undefined
-
-    , 'if'          :  undefined
-    , 'in'          :  undefined
-    , 'instanceof'  :  undefined
-
-    , 'new'         :  undefined
-    , 'return'      :  undefined
-    , 'switch'      :  undefined
-
-    , 'this'        :  undefined
-    , 'throw'       :  undefined
-    , 'try'         :  undefined
-    , 'typeof'      :  undefined
-
-    , 'var'         :  undefined
-    , 'void'        :  undefined
-
-    , 'while'       :  undefined
-    , 'with'        :  undefined
-    , _default      :  undefined
-  }
-  , 'Punctuator': {
-      ';': undefined  
-    , '.': undefined  
-    , ',': undefined  
-
-    , '{': undefined  
-    , '}': undefined  
-    , '(': undefined  
-    , ')': undefined  
-    , '[': undefined
-    , ']': undefined
-
-    , '<': undefined
-    , '>': undefined
-    , '+': undefined
-    , '-': undefined
-    , '*': undefined
-    , '%': undefined
-    , '&': undefined
-    , '|': undefined
-    , '^': undefined
-    , '!': undefined
-    , '~': undefined
-    , '?': undefined
-    , ':': undefined
-    , '=': undefined
-
-    , '<=': undefined
-    , '>=': undefined
-    , '==': undefined
-    , '!=': undefined
-    , '++': undefined
-    , '--': undefined
-    , '<<': undefined
-    , '>>': undefined
-    , '&&': undefined
-    , '||': undefined
-    , '+=': undefined
-    , '-=': undefined
-    , '*=': undefined
-    , '%=': undefined
-    , '&=': undefined
-    , '|=': undefined
-    , '^=': undefined
-    , '/=': undefined
-
-    , '===': undefined
-    , '!==': undefined
-    , '>>>': undefined
-    , '<<=': undefined
-    , '>>=': undefined
-    
-    , '>>>=': undefined
-
-    , _default: undefined
-  }
-
-    // line comment
-  , Line: {
-     _default: undefined
-    }
-
-    /* block comment */
-  , Block: {
-     _default: undefined
-    }
-
-  , _default: undefined
-};
diff --git a/node_modules/cardinal/themes/hide-semicolons.js b/node_modules/cardinal/themes/hide-semicolons.js
deleted file mode 100644
index c1871ee705ffef24ddd0446ae4e27906cee181e4..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/themes/hide-semicolons.js
+++ /dev/null
@@ -1,149 +0,0 @@
-var colors = require('ansicolors');
-
-// Change the below definitions in order to tweak the color theme.
-module.exports = {
-
-    'Boolean': {
-      'true'   :  undefined
-    , 'false'  :  undefined
-    , _default :  colors.brightRed
-    }
-
-  , 'Identifier': {
-      'undefined' :  colors.brightBlack
-    , 'self'      :  colors.brightRed
-    , 'console'   :  colors.blue
-    , 'log'       :  colors.blue
-    , 'warn'      :  colors.red
-    , 'error'     :  colors.brightRed
-    , _default    :  colors.white
-    }
-
-  , 'Null': {
-      _default: colors.brightBlack
-    }
-
-  , 'Numeric': {
-      _default: colors.blue
-    }
-
-  , 'String': {
-      _default: function (s, info) {
-        var nextToken = info.tokens[info.tokenIndex + 1];
-
-        // show keys of object literals and json in different color
-        return (nextToken && nextToken.type === 'Punctuator' && nextToken.value === ':') 
-          ? colors.green(s)
-          : colors.brightGreen(s);
-      }
-    }
-
-  , 'Keyword': {
-      'break'       :  undefined
-
-    , 'case'        :  undefined
-    , 'catch'       :  colors.cyan
-    , 'continue'    :  undefined
-
-    , 'debugger'    :  undefined
-    , 'default'     :  undefined
-    , 'delete'      :  colors.red
-    , 'do'          :  undefined
-
-    , 'else'        :  undefined
-
-    , 'finally'     :  colors.cyan
-    , 'for'         :  undefined
-    , 'function'    :  undefined
-
-    , 'if'          :  undefined
-    , 'in'          :  undefined
-    , 'instanceof'  :  undefined
-
-    , 'new'         :  colors.red
-    , 'return'      :  colors.red
-    , 'switch'      :  undefined
-
-    , 'this'        :  colors.brightRed
-    , 'throw'       :  undefined
-    , 'try'         :  colors.cyan
-    , 'typeof'      :  undefined
-
-    , 'var'         :  colors.green
-    , 'void'        :  undefined
-
-    , 'while'       :  undefined
-    , 'with'        :  undefined
-    , _default      :  colors.brightBlue
-  }
-  , 'Punctuator': {
-      // setting semicolon's color to the same as the terminal background makes it invisible
-      ';': colors.black
-
-    , '.': colors.green  
-    , ',': colors.green  
-
-    , '{': colors.yellow
-    , '}': colors.yellow
-    , '(': colors.brightBlack  
-    , ')': colors.brightBlack  
-    , '[': colors.yellow
-    , ']': colors.yellow
-
-    , '<': undefined
-    , '>': undefined
-    , '+': undefined
-    , '-': undefined
-    , '*': undefined
-    , '%': undefined
-    , '&': undefined
-    , '|': undefined
-    , '^': undefined
-    , '!': undefined
-    , '~': undefined
-    , '?': undefined
-    , ':': undefined
-    , '=': undefined
-
-    , '<=': undefined
-    , '>=': undefined
-    , '==': undefined
-    , '!=': undefined
-    , '++': undefined
-    , '--': undefined
-    , '<<': undefined
-    , '>>': undefined
-    , '&&': undefined
-    , '||': undefined
-    , '+=': undefined
-    , '-=': undefined
-    , '*=': undefined
-    , '%=': undefined
-    , '&=': undefined
-    , '|=': undefined
-    , '^=': undefined
-    , '/=': undefined
-
-    , '===': undefined
-    , '!==': undefined
-    , '>>>': undefined
-    , '<<=': undefined
-    , '>>=': undefined
-    
-    , '>>>=': undefined
-
-    , _default: colors.brightYellow
-  }
-
-    // line comment
-  , Line: {
-     _default: colors.brightBlack
-    }
-
-    /* block comment */
-  , Block: {
-     _default: colors.brightBlack
-    }
-
-  , _default: undefined
-};
diff --git a/node_modules/cardinal/themes/tomorrow-night.js b/node_modules/cardinal/themes/tomorrow-night.js
deleted file mode 100644
index 9e0fc58433dbf4b0be41a73ad6acb83a47607731..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/themes/tomorrow-night.js
+++ /dev/null
@@ -1,161 +0,0 @@
-var colors = require('ansicolors');
-
-// Change the below definitions in order to tweak the color theme.
-module.exports = {
-
-    'Boolean': {
-      'true'   :  undefined
-    , 'false'  :  undefined
-    , _default :  colors.yellow
-    }
-
-  , 'Identifier': {
-      'undefined' :  colors.yellow
-    , 'self'      :  colors.yellow
-    , 'type'      :  colors.yellow
-    , 'value'     :  colors.yellow
-    , 'console'   :  undefined
-    , 'log'       :  colors.blue
-    , 'warn'      :  colors.blue
-    , 'error'     :  colors.blue
-    , 'join'      :  colors.blue
-    , _default    :  function (s, info) {
-        var prevToken = info.tokens[info.tokenIndex - 1];
-        var nextToken = info.tokens[info.tokenIndex + 1];
-
-        return (nextToken
-            && nextToken.type === 'Punctuator'
-            && nextToken.value === '('
-            && prevToken
-            && prevToken.type === 'Keyword'
-            && prevToken.value === 'function'
-          ) ? colors.blue(s) : colors.white(s);
-      }
-    }
-
-  , 'Null': {
-      _default: colors.yellow
-    }
-
-  , 'Numeric': {
-      _default: colors.yellow
-    }
-
-  , 'String': {
-      _default: function (s, info) {
-        var nextToken = info.tokens[info.tokenIndex + 1];
-
-        // show keys of object literals and json in different color
-        return (nextToken && nextToken.type === 'Punctuator' && nextToken.value === ':') 
-          ? colors.green(s)
-          : colors.brightGreen(s);
-      }
-    }
-
-  , 'Keyword': {
-      'break'       :  colors.magenta
-
-    , 'case'        :  colors.magenta
-    , 'catch'       :  colors.magenta
-    , 'continue'    :  colors.magenta
-
-    , 'debugger'    :  colors.magenta
-    , 'default'     :  colors.magenta
-    , 'delete'      :  colors.red
-    , 'do'          :  colors.magenta
-
-    , 'else'        :  colors.magenta
-
-    , 'finally'     :  colors.magenta
-    , 'for'         :  colors.magenta
-    , 'function'    :  colors.magenta
-
-    , 'if'          :  colors.magenta
-    , 'in'          :  colors.cyan
-    , 'instanceof'  :  colors.cyan
-
-    , 'new'         :  colors.cyan
-    , 'return'      :  colors.magenta
-    , 'switch'      :  colors.magenta
-
-    , 'this'        :  colors.red
-    , 'throw'       :  colors.magenta
-    , 'try'         :  colors.magenta
-    , 'typeof'      :  colors.cyan
-
-    , 'var'         :  colors.magenta
-    , 'void'        :  colors.magenta
-
-    , 'while'       :  colors.magenta
-    , 'with'        :  colors.cyan
-    , _default      :  colors.white
-  }
-  , 'Punctuator': {
-      ';': colors.white
-    , '.': colors.white
-    , ',': colors.white
-
-    , '{': colors.white
-    , '}': colors.white
-    , '(': colors.white
-    , ')': colors.white
-    , '[': colors.white
-    , ']': colors.white
-
-    , '<': undefined
-    , '>': undefined
-    , '+': undefined
-    , '-': undefined
-    , '*': undefined
-    , '%': undefined
-    , '&': undefined
-    , '|': colors.white
-    , '^': undefined
-    , '!': undefined
-    , '~': undefined
-    , '?': colors.white
-    , ':': colors.white
-    , '=': undefined
-
-    , '<=': undefined
-    , '>=': undefined
-    , '==': undefined
-    , '!=': undefined
-    , '++': undefined
-    , '--': undefined
-    , '<<': undefined
-    , '>>': undefined
-    , '&&': undefined
-    , '||': undefined
-    , '+=': undefined
-    , '-=': undefined
-    , '*=': undefined
-    , '%=': undefined
-    , '&=': undefined
-    , '|=': undefined
-    , '^=': undefined
-    , '/=': undefined
-
-    , '===': undefined
-    , '!==': undefined
-    , '>>>': undefined
-    , '<<=': undefined
-    , '>>=': undefined
-    
-    , '>>>=': undefined
-
-    , _default: colors.cyan
-  }
-
-    // line comment
-  , Line: {
-     _default: colors.brightBlack
-    }
-
-    /* block comment */
-  , Block: {
-     _default: colors.brightBlack
-    }
-
-  , _default: undefined
-};
diff --git a/node_modules/cardinal/utl.js b/node_modules/cardinal/utl.js
deleted file mode 100644
index 0f36e40b3bfca3679f0a45da1c92726d3be4fa2f..0000000000000000000000000000000000000000
--- a/node_modules/cardinal/utl.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var util = require('util');
-
-module.exports.isPath = function (s) {
-  return (/[\/\\]/).test(s);
-};
-
-module.exports.inspect = function(obj, depth) {
-  console.log(util.inspect(obj, false, depth || 5, true));
-};
-
-
diff --git a/node_modules/chokidar/LICENSE b/node_modules/chokidar/LICENSE
deleted file mode 100644
index fa9162b51acb582ac3b63c75552db2ca9b9d9bb2..0000000000000000000000000000000000000000
--- a/node_modules/chokidar/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2012-2019 Paul Miller (https://paulmillr.com), Elan Shanker
-
-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/chokidar/README.md b/node_modules/chokidar/README.md
deleted file mode 100644
index 8e25decb4701df4f49407f1ed1a1f94a9da727de..0000000000000000000000000000000000000000
--- a/node_modules/chokidar/README.md
+++ /dev/null
@@ -1,308 +0,0 @@
-# Chokidar [![Weekly downloads](https://img.shields.io/npm/dw/chokidar.svg)](https://github.com/paulmillr/chokidar) [![Yearly downloads](https://img.shields.io/npm/dy/chokidar.svg)](https://github.com/paulmillr/chokidar)
-
-> Minimal and efficient cross-platform file watching library
-
-[![NPM](https://nodei.co/npm/chokidar.png)](https://www.npmjs.com/package/chokidar)
-
-## Why?
-
-Node.js `fs.watch`:
-
-* Doesn't report filenames on MacOS.
-* Doesn't report events at all when using editors like Sublime on MacOS.
-* Often reports events twice.
-* Emits most changes as `rename`.
-* Does not provide an easy way to recursively watch file trees.
-* Does not support recursive watching on Linux.
-
-Node.js `fs.watchFile`:
-
-* Almost as bad at event handling.
-* Also does not provide any recursive watching.
-* Results in high CPU utilization.
-
-Chokidar resolves these problems.
-
-Initially made for **[Brunch](https://brunch.io/)** (an ultra-swift web app build tool), it is now used in
-[Microsoft's Visual Studio Code](https://github.com/microsoft/vscode),
-[gulp](https://github.com/gulpjs/gulp/),
-[karma](https://karma-runner.github.io/),
-[PM2](https://github.com/Unitech/PM2),
-[browserify](http://browserify.org/),
-[webpack](https://webpack.github.io/),
-[BrowserSync](https://www.browsersync.io/),
-and [many others](https://www.npmjs.com/browse/depended/chokidar).
-It has proven itself in production environments.
-
-Version 3 is out! Check out our blog post about it: [Chokidar 3: How to save 32TB of traffic every week](https://paulmillr.com/posts/chokidar-3-save-32tb-of-traffic/)
-
-## How?
-
-Chokidar does still rely on the Node.js core `fs` module, but when using
-`fs.watch` and `fs.watchFile` for watching, it normalizes the events it
-receives, often checking for truth by getting file stats and/or dir contents.
-
-On MacOS, chokidar by default uses a native extension exposing the Darwin
-`FSEvents` API. This provides very efficient recursive watching compared with
-implementations like `kqueue` available on most \*nix platforms. Chokidar still
-does have to do some work to normalize the events received that way as well.
-
-On most other platforms, the `fs.watch`-based implementation is the default, which
-avoids polling and keeps CPU usage down. Be advised that chokidar will initiate
-watchers recursively for everything within scope of the paths that have been
-specified, so be judicious about not wasting system resources by watching much
-more than needed.
-
-## Getting started
-
-Install with npm:
-
-```sh
-npm install chokidar
-```
-
-Then `require` and use it in your code:
-
-```javascript
-const chokidar = require('chokidar');
-
-// One-liner for current directory
-chokidar.watch('.').on('all', (event, path) => {
-  console.log(event, path);
-});
-```
-
-## API
-
-```javascript
-// Example of a more typical implementation structure
-
-// Initialize watcher.
-const watcher = chokidar.watch('file, dir, glob, or array', {
-  ignored: /(^|[\/\\])\../, // ignore dotfiles
-  persistent: true
-});
-
-// Something to use when events are received.
-const log = console.log.bind(console);
-// Add event listeners.
-watcher
-  .on('add', path => log(`File ${path} has been added`))
-  .on('change', path => log(`File ${path} has been changed`))
-  .on('unlink', path => log(`File ${path} has been removed`));
-
-// More possible events.
-watcher
-  .on('addDir', path => log(`Directory ${path} has been added`))
-  .on('unlinkDir', path => log(`Directory ${path} has been removed`))
-  .on('error', error => log(`Watcher error: ${error}`))
-  .on('ready', () => log('Initial scan complete. Ready for changes'))
-  .on('raw', (event, path, details) => { // internal
-    log('Raw event info:', event, path, details);
-  });
-
-// 'add', 'addDir' and 'change' events also receive stat() results as second
-// argument when available: https://nodejs.org/api/fs.html#fs_class_fs_stats
-watcher.on('change', (path, stats) => {
-  if (stats) console.log(`File ${path} changed size to ${stats.size}`);
-});
-
-// Watch new files.
-watcher.add('new-file');
-watcher.add(['new-file-2', 'new-file-3', '**/other-file*']);
-
-// Get list of actual paths being watched on the filesystem
-var watchedPaths = watcher.getWatched();
-
-// Un-watch some files.
-await watcher.unwatch('new-file*');
-
-// Stop watching.
-// The method is async!
-watcher.close().then(() => console.log('closed'));
-
-// Full list of options. See below for descriptions.
-// Do not use this example!
-chokidar.watch('file', {
-  persistent: true,
-
-  ignored: '*.txt',
-  ignoreInitial: false,
-  followSymlinks: true,
-  cwd: '.',
-  disableGlobbing: false,
-
-  usePolling: false,
-  interval: 100,
-  binaryInterval: 300,
-  alwaysStat: false,
-  depth: 99,
-  awaitWriteFinish: {
-    stabilityThreshold: 2000,
-    pollInterval: 100
-  },
-
-  ignorePermissionErrors: false,
-  atomic: true // or a custom 'atomicity delay', in milliseconds (default 100)
-});
-
-```
-
-`chokidar.watch(paths, [options])`
-
-* `paths` (string or array of strings). Paths to files, dirs to be watched
-recursively, or glob patterns.
-    - Note: globs must not contain windows separators (`\`),
-    because that's how they work by the standard —
-    you'll need to replace them with forward slashes (`/`).
-    - Note 2: for additional glob documentation, check out low-level
-    library: [picomatch](https://github.com/micromatch/picomatch).
-* `options` (object) Options object as defined below:
-
-#### Persistence
-
-* `persistent` (default: `true`). Indicates whether the process
-should continue to run as long as files are being watched. If set to
-`false` when using `fsevents` to watch, no more events will be emitted
-after `ready`, even if the process continues to run.
-
-#### Path filtering
-
-* `ignored` ([anymatch](https://github.com/es128/anymatch)-compatible definition)
-Defines files/paths to be ignored. The whole relative or absolute path is
-tested, not just filename. If a function with two arguments is provided, it
-gets called twice per path - once with a single argument (the path), second
-time with two arguments (the path and the
-[`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats)
-object of that path).
-* `ignoreInitial` (default: `false`). If set to `false` then `add`/`addDir` events are also emitted for matching paths while
-instantiating the watching as chokidar discovers these file paths (before the `ready` event).
-* `followSymlinks` (default: `true`). When `false`, only the
-symlinks themselves will be watched for changes instead of following
-the link references and bubbling events through the link's path.
-* `cwd` (no default). The base directory from which watch `paths` are to be
-derived. Paths emitted with events will be relative to this.
-* `disableGlobbing` (default: `false`). If set to `true` then the strings passed to `.watch()` and `.add()` are treated as
-literal path names, even if they look like globs.
-
-#### Performance
-
-* `usePolling` (default: `false`).
-Whether to use fs.watchFile (backed by polling), or fs.watch. If polling
-leads to high CPU utilization, consider setting this to `false`. It is
-typically necessary to **set this to `true` to successfully watch files over
-a network**, and it may be necessary to successfully watch files in other
-non-standard situations. Setting to `true` explicitly on MacOS overrides the
-`useFsEvents` default. You may also set the CHOKIDAR_USEPOLLING env variable
-to true (1) or false (0) in order to override this option.
-* _Polling-specific settings_ (effective when `usePolling: true`)
-  * `interval` (default: `100`). Interval of file system polling, in milliseconds. You may also
-    set the CHOKIDAR_INTERVAL env variable to override this option.
-  * `binaryInterval` (default: `300`). Interval of file system
-  polling for binary files.
-  ([see list of binary extensions](https://github.com/sindresorhus/binary-extensions/blob/master/binary-extensions.json))
-* `useFsEvents` (default: `true` on MacOS). Whether to use the
-`fsevents` watching interface if available. When set to `true` explicitly
-and `fsevents` is available this supercedes the `usePolling` setting. When
-set to `false` on MacOS, `usePolling: true` becomes the default.
-* `alwaysStat` (default: `false`). If relying upon the
-[`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats)
-object that may get passed with `add`, `addDir`, and `change` events, set
-this to `true` to ensure it is provided even in cases where it wasn't
-already available from the underlying watch events.
-* `depth` (default: `undefined`). If set, limits how many levels of
-subdirectories will be traversed.
-* `awaitWriteFinish` (default: `false`).
-By default, the `add` event will fire when a file first appears on disk, before
-the entire file has been written. Furthermore, in some cases some `change`
-events will be emitted while the file is being written. In some cases,
-especially when watching for large files there will be a need to wait for the
-write operation to finish before responding to a file creation or modification.
-Setting `awaitWriteFinish` to `true` (or a truthy value) will poll file size,
-holding its `add` and `change` events until the size does not change for a
-configurable amount of time. The appropriate duration setting is heavily
-dependent on the OS and hardware. For accurate detection this parameter should
-be relatively high, making file watching much less responsive.
-Use with caution.
-  * *`options.awaitWriteFinish` can be set to an object in order to adjust
-  timing params:*
-  * `awaitWriteFinish.stabilityThreshold` (default: 2000). Amount of time in
-  milliseconds for a file size to remain constant before emitting its event.
-  * `awaitWriteFinish.pollInterval` (default: 100). File size polling interval, in milliseconds.
-
-#### Errors
-
-* `ignorePermissionErrors` (default: `false`). Indicates whether to watch files
-that don't have read permissions if possible. If watching fails due to `EPERM`
-or `EACCES` with this set to `true`, the errors will be suppressed silently.
-* `atomic` (default: `true` if `useFsEvents` and `usePolling` are `false`).
-Automatically filters out artifacts that occur when using editors that use
-"atomic writes" instead of writing directly to the source file. If a file is
-re-added within 100 ms of being deleted, Chokidar emits a `change` event
-rather than `unlink` then `add`. If the default of 100 ms does not work well
-for you, you can override it by setting `atomic` to a custom value, in
-milliseconds.
-
-### Methods & Events
-
-`chokidar.watch()` produces an instance of `FSWatcher`. Methods of `FSWatcher`:
-
-* `.add(path / paths)`: Add files, directories, or glob patterns for tracking.
-Takes an array of strings or just one string.
-* `.on(event, callback)`: Listen for an FS event.
-Available events: `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `ready`,
-`raw`, `error`.
-Additionally `all` is available which gets emitted with the underlying event
-name and path for every event other than `ready`, `raw`, and `error`.  `raw` is internal, use it carefully.
-* `.unwatch(path / paths)`: Stop watching files, directories, or glob patterns.
-Takes an array of strings or just one string.
-* `.close()`: **async** Removes all listeners from watched files. Asynchronous, returns Promise. Use with `await` to ensure bugs don't happen.
-* `.getWatched()`: Returns an object representing all the paths on the file
-system being watched by this `FSWatcher` instance. The object's keys are all the
-directories (using absolute paths unless the `cwd` option was used), and the
-values are arrays of the names of the items contained in each directory.
-
-## CLI
-
-If you need a CLI interface for your file watching, check out
-[chokidar-cli](https://github.com/open-cli-tools/chokidar-cli), allowing you to
-execute a command on each change, or get a stdio stream of change events.
-
-## Install Troubleshooting
-
-* `npm WARN optional dep failed, continuing fsevents@n.n.n`
-  * This message is normal part of how `npm` handles optional dependencies and is
-    not indicative of a problem. Even if accompanied by other related error messages,
-    Chokidar should function properly.
-
-* `TypeError: fsevents is not a constructor`
-  * Update chokidar by doing `rm -rf node_modules package-lock.json yarn.lock && npm install`, or update your dependency that uses chokidar.
-
-* Chokidar is producing `ENOSP` error on Linux, like this:
-  * `bash: cannot set terminal process group (-1): Inappropriate ioctl for device bash: no job control in this shell`
-  `Error: watch /home/ ENOSPC`
-  * This means Chokidar ran out of file handles and you'll need to increase their count by executing the following command in Terminal:
-  `echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p`
-
-## Changelog
-
-For more detailed changelog, see [`full_changelog.md`](.github/full_changelog.md).
-- **v3.5 (Jan 6, 2021):** Support for ARM Macs with Apple Silicon. Fixes for deleted symlinks.
-- **v3.4 (Apr 26, 2020):** Support for directory-based symlinks. Fixes for macos file replacement.
-- **v3.3 (Nov 2, 2019):** `FSWatcher#close()` method became async. That fixes IO race conditions related to close method.
-- **v3.2 (Oct 1, 2019):** Improve Linux RAM usage by 50%. Race condition fixes. Windows glob fixes. Improve stability by using tight range of dependency versions.
-- **v3.1 (Sep 16, 2019):** dotfiles are no longer filtered out by default. Use `ignored` option if needed. Improve initial Linux scan time by 50%.
-- **v3 (Apr 30, 2019):** massive CPU & RAM consumption improvements; reduces deps / package size by a factor of 17x and bumps Node.js requirement to v8.16 and higher.
-- **v2 (Dec 29, 2017):** Globs are now posix-style-only; without windows support. Tons of bugfixes.
-- **v1 (Apr 7, 2015):** Glob support, symlink support, tons of bugfixes. Node 0.8+ is supported
-- **v0.1 (Apr 20, 2012):** Initial release, extracted from [Brunch](https://github.com/brunch/brunch/blob/9847a065aea300da99bd0753f90354cde9de1261/src/helpers.coffee#L66)
-
-## Also
-
-Why was chokidar named this way? What's the meaning behind it?
-
->Chowkidar is a transliteration of a Hindi word meaning 'watchman, gatekeeper', चौकीदार. This ultimately comes from Sanskrit _ चतुष्क_ (crossway, quadrangle, consisting-of-four). This word is also used in other languages like Urdu as (چوکیدار) which is widely used in Pakistan and India. 
-
-## License
-
-MIT (c) Paul Miller (<https://paulmillr.com>), see [LICENSE](LICENSE) file.
diff --git a/node_modules/chokidar/index.js b/node_modules/chokidar/index.js
deleted file mode 100644
index 8752893ca4986cf05103a46c438223b7ee4e1907..0000000000000000000000000000000000000000
--- a/node_modules/chokidar/index.js
+++ /dev/null
@@ -1,973 +0,0 @@
-'use strict';
-
-const { EventEmitter } = require('events');
-const fs = require('fs');
-const sysPath = require('path');
-const { promisify } = require('util');
-const readdirp = require('readdirp');
-const anymatch = require('anymatch').default;
-const globParent = require('glob-parent');
-const isGlob = require('is-glob');
-const braces = require('braces');
-const normalizePath = require('normalize-path');
-
-const NodeFsHandler = require('./lib/nodefs-handler');
-const FsEventsHandler = require('./lib/fsevents-handler');
-const {
-  EV_ALL,
-  EV_READY,
-  EV_ADD,
-  EV_CHANGE,
-  EV_UNLINK,
-  EV_ADD_DIR,
-  EV_UNLINK_DIR,
-  EV_RAW,
-  EV_ERROR,
-
-  STR_CLOSE,
-  STR_END,
-
-  BACK_SLASH_RE,
-  DOUBLE_SLASH_RE,
-  SLASH_OR_BACK_SLASH_RE,
-  DOT_RE,
-  REPLACER_RE,
-
-  SLASH,
-  SLASH_SLASH,
-  BRACE_START,
-  BANG,
-  ONE_DOT,
-  TWO_DOTS,
-  GLOBSTAR,
-  SLASH_GLOBSTAR,
-  ANYMATCH_OPTS,
-  STRING_TYPE,
-  FUNCTION_TYPE,
-  EMPTY_STR,
-  EMPTY_FN,
-
-  isWindows,
-  isMacos,
-  isIBMi
-} = require('./lib/constants');
-
-const stat = promisify(fs.stat);
-const readdir = promisify(fs.readdir);
-
-/**
- * @typedef {String} Path
- * @typedef {'all'|'add'|'addDir'|'change'|'unlink'|'unlinkDir'|'raw'|'error'|'ready'} EventName
- * @typedef {'readdir'|'watch'|'add'|'remove'|'change'} ThrottleType
- */
-
-/**
- *
- * @typedef {Object} WatchHelpers
- * @property {Boolean} followSymlinks
- * @property {'stat'|'lstat'} statMethod
- * @property {Path} path
- * @property {Path} watchPath
- * @property {Function} entryPath
- * @property {Boolean} hasGlob
- * @property {Object} globFilter
- * @property {Function} filterPath
- * @property {Function} filterDir
- */
-
-const arrify = (value = []) => Array.isArray(value) ? value : [value];
-const flatten = (list, result = []) => {
-  list.forEach(item => {
-    if (Array.isArray(item)) {
-      flatten(item, result);
-    } else {
-      result.push(item);
-    }
-  });
-  return result;
-};
-
-const unifyPaths = (paths_) => {
-  /**
-   * @type {Array<String>}
-   */
-  const paths = flatten(arrify(paths_));
-  if (!paths.every(p => typeof p === STRING_TYPE)) {
-    throw new TypeError(`Non-string provided as watch path: ${paths}`);
-  }
-  return paths.map(normalizePathToUnix);
-};
-
-// If SLASH_SLASH occurs at the beginning of path, it is not replaced
-//     because "//StoragePC/DrivePool/Movies" is a valid network path
-const toUnix = (string) => {
-  let str = string.replace(BACK_SLASH_RE, SLASH);
-  let prepend = false;
-  if (str.startsWith(SLASH_SLASH)) {
-    prepend = true;
-  }
-  while (str.match(DOUBLE_SLASH_RE)) {
-    str = str.replace(DOUBLE_SLASH_RE, SLASH);
-  }
-  if (prepend) {
-    str = SLASH + str;
-  }
-  return str;
-};
-
-// Our version of upath.normalize
-// TODO: this is not equal to path-normalize module - investigate why
-const normalizePathToUnix = (path) => toUnix(sysPath.normalize(toUnix(path)));
-
-const normalizeIgnored = (cwd = EMPTY_STR) => (path) => {
-  if (typeof path !== STRING_TYPE) return path;
-  return normalizePathToUnix(sysPath.isAbsolute(path) ? path : sysPath.join(cwd, path));
-};
-
-const getAbsolutePath = (path, cwd) => {
-  if (sysPath.isAbsolute(path)) {
-    return path;
-  }
-  if (path.startsWith(BANG)) {
-    return BANG + sysPath.join(cwd, path.slice(1));
-  }
-  return sysPath.join(cwd, path);
-};
-
-const undef = (opts, key) => opts[key] === undefined;
-
-/**
- * Directory entry.
- * @property {Path} path
- * @property {Set<Path>} items
- */
-class DirEntry {
-  /**
-   * @param {Path} dir
-   * @param {Function} removeWatcher
-   */
-  constructor(dir, removeWatcher) {
-    this.path = dir;
-    this._removeWatcher = removeWatcher;
-    /** @type {Set<Path>} */
-    this.items = new Set();
-  }
-
-  add(item) {
-    const {items} = this;
-    if (!items) return;
-    if (item !== ONE_DOT && item !== TWO_DOTS) items.add(item);
-  }
-
-  async remove(item) {
-    const {items} = this;
-    if (!items) return;
-    items.delete(item);
-    if (items.size > 0) return;
-
-    const dir = this.path;
-    try {
-      await readdir(dir);
-    } catch (err) {
-      if (this._removeWatcher) {
-        this._removeWatcher(sysPath.dirname(dir), sysPath.basename(dir));
-      }
-    }
-  }
-
-  has(item) {
-    const {items} = this;
-    if (!items) return;
-    return items.has(item);
-  }
-
-  /**
-   * @returns {Array<String>}
-   */
-  getChildren() {
-    const {items} = this;
-    if (!items) return;
-    return [...items.values()];
-  }
-
-  dispose() {
-    this.items.clear();
-    delete this.path;
-    delete this._removeWatcher;
-    delete this.items;
-    Object.freeze(this);
-  }
-}
-
-const STAT_METHOD_F = 'stat';
-const STAT_METHOD_L = 'lstat';
-class WatchHelper {
-  constructor(path, watchPath, follow, fsw) {
-    this.fsw = fsw;
-    this.path = path = path.replace(REPLACER_RE, EMPTY_STR);
-    this.watchPath = watchPath;
-    this.fullWatchPath = sysPath.resolve(watchPath);
-    this.hasGlob = watchPath !== path;
-    /** @type {object|boolean} */
-    if (path === EMPTY_STR) this.hasGlob = false;
-    this.globSymlink = this.hasGlob && follow ? undefined : false;
-    this.globFilter = this.hasGlob ? anymatch(path, undefined, ANYMATCH_OPTS) : false;
-    this.dirParts = this.getDirParts(path);
-    this.dirParts.forEach((parts) => {
-      if (parts.length > 1) parts.pop();
-    });
-    this.followSymlinks = follow;
-    this.statMethod = follow ? STAT_METHOD_F : STAT_METHOD_L;
-  }
-
-  checkGlobSymlink(entry) {
-    // only need to resolve once
-    // first entry should always have entry.parentDir === EMPTY_STR
-    if (this.globSymlink === undefined) {
-      this.globSymlink = entry.fullParentDir === this.fullWatchPath ?
-        false : {realPath: entry.fullParentDir, linkPath: this.fullWatchPath};
-    }
-
-    if (this.globSymlink) {
-      return entry.fullPath.replace(this.globSymlink.realPath, this.globSymlink.linkPath);
-    }
-
-    return entry.fullPath;
-  }
-
-  entryPath(entry) {
-    return sysPath.join(this.watchPath,
-      sysPath.relative(this.watchPath, this.checkGlobSymlink(entry))
-    );
-  }
-
-  filterPath(entry) {
-    const {stats} = entry;
-    if (stats && stats.isSymbolicLink()) return this.filterDir(entry);
-    const resolvedPath = this.entryPath(entry);
-    const matchesGlob = this.hasGlob && typeof this.globFilter === FUNCTION_TYPE ?
-      this.globFilter(resolvedPath) : true;
-    return matchesGlob &&
-      this.fsw._isntIgnored(resolvedPath, stats) &&
-      this.fsw._hasReadPermissions(stats);
-  }
-
-  getDirParts(path) {
-    if (!this.hasGlob) return [];
-    const parts = [];
-    const expandedPath = path.includes(BRACE_START) ? braces.expand(path) : [path];
-    expandedPath.forEach((path) => {
-      parts.push(sysPath.relative(this.watchPath, path).split(SLASH_OR_BACK_SLASH_RE));
-    });
-    return parts;
-  }
-
-  filterDir(entry) {
-    if (this.hasGlob) {
-      const entryParts = this.getDirParts(this.checkGlobSymlink(entry));
-      let globstar = false;
-      this.unmatchedGlob = !this.dirParts.some((parts) => {
-        return parts.every((part, i) => {
-          if (part === GLOBSTAR) globstar = true;
-          return globstar || !entryParts[0][i] || anymatch(part, entryParts[0][i], ANYMATCH_OPTS);
-        });
-      });
-    }
-    return !this.unmatchedGlob && this.fsw._isntIgnored(this.entryPath(entry), entry.stats);
-  }
-}
-
-/**
- * Watches files & directories for changes. Emitted events:
- * `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `all`, `error`
- *
- *     new FSWatcher()
- *       .add(directories)
- *       .on('add', path => log('File', path, 'was added'))
- */
-class FSWatcher extends EventEmitter {
-// Not indenting methods for history sake; for now.
-constructor(_opts) {
-  super();
-
-  const opts = {};
-  if (_opts) Object.assign(opts, _opts); // for frozen objects
-
-  /** @type {Map<String, DirEntry>} */
-  this._watched = new Map();
-  /** @type {Map<String, Array>} */
-  this._closers = new Map();
-  /** @type {Set<String>} */
-  this._ignoredPaths = new Set();
-
-  /** @type {Map<ThrottleType, Map>} */
-  this._throttled = new Map();
-
-  /** @type {Map<Path, String|Boolean>} */
-  this._symlinkPaths = new Map();
-
-  this._streams = new Set();
-  this.closed = false;
-
-  // Set up default options.
-  if (undef(opts, 'persistent')) opts.persistent = true;
-  if (undef(opts, 'ignoreInitial')) opts.ignoreInitial = false;
-  if (undef(opts, 'ignorePermissionErrors')) opts.ignorePermissionErrors = false;
-  if (undef(opts, 'interval')) opts.interval = 100;
-  if (undef(opts, 'binaryInterval')) opts.binaryInterval = 300;
-  if (undef(opts, 'disableGlobbing')) opts.disableGlobbing = false;
-  opts.enableBinaryInterval = opts.binaryInterval !== opts.interval;
-
-  // Enable fsevents on OS X when polling isn't explicitly enabled.
-  if (undef(opts, 'useFsEvents')) opts.useFsEvents = !opts.usePolling;
-
-  // If we can't use fsevents, ensure the options reflect it's disabled.
-  const canUseFsEvents = FsEventsHandler.canUse();
-  if (!canUseFsEvents) opts.useFsEvents = false;
-
-  // Use polling on Mac if not using fsevents.
-  // Other platforms use non-polling fs_watch.
-  if (undef(opts, 'usePolling') && !opts.useFsEvents) {
-    opts.usePolling = isMacos;
-  }
-
-  // Always default to polling on IBM i because fs.watch() is not available on IBM i.
-  if(isIBMi) {
-    opts.usePolling = true;
-  }
-
-  // Global override (useful for end-developers that need to force polling for all
-  // instances of chokidar, regardless of usage/dependency depth)
-  const envPoll = process.env.CHOKIDAR_USEPOLLING;
-  if (envPoll !== undefined) {
-    const envLower = envPoll.toLowerCase();
-
-    if (envLower === 'false' || envLower === '0') {
-      opts.usePolling = false;
-    } else if (envLower === 'true' || envLower === '1') {
-      opts.usePolling = true;
-    } else {
-      opts.usePolling = !!envLower;
-    }
-  }
-  const envInterval = process.env.CHOKIDAR_INTERVAL;
-  if (envInterval) {
-    opts.interval = Number.parseInt(envInterval, 10);
-  }
-
-  // Editor atomic write normalization enabled by default with fs.watch
-  if (undef(opts, 'atomic')) opts.atomic = !opts.usePolling && !opts.useFsEvents;
-  if (opts.atomic) this._pendingUnlinks = new Map();
-
-  if (undef(opts, 'followSymlinks')) opts.followSymlinks = true;
-
-  if (undef(opts, 'awaitWriteFinish')) opts.awaitWriteFinish = false;
-  if (opts.awaitWriteFinish === true) opts.awaitWriteFinish = {};
-  const awf = opts.awaitWriteFinish;
-  if (awf) {
-    if (!awf.stabilityThreshold) awf.stabilityThreshold = 2000;
-    if (!awf.pollInterval) awf.pollInterval = 100;
-    this._pendingWrites = new Map();
-  }
-  if (opts.ignored) opts.ignored = arrify(opts.ignored);
-
-  let readyCalls = 0;
-  this._emitReady = () => {
-    readyCalls++;
-    if (readyCalls >= this._readyCount) {
-      this._emitReady = EMPTY_FN;
-      this._readyEmitted = true;
-      // use process.nextTick to allow time for listener to be bound
-      process.nextTick(() => this.emit(EV_READY));
-    }
-  };
-  this._emitRaw = (...args) => this.emit(EV_RAW, ...args);
-  this._readyEmitted = false;
-  this.options = opts;
-
-  // Initialize with proper watcher.
-  if (opts.useFsEvents) {
-    this._fsEventsHandler = new FsEventsHandler(this);
-  } else {
-    this._nodeFsHandler = new NodeFsHandler(this);
-  }
-
-  // You’re frozen when your heart’s not open.
-  Object.freeze(opts);
-}
-
-// Public methods
-
-/**
- * Adds paths to be watched on an existing FSWatcher instance
- * @param {Path|Array<Path>} paths_
- * @param {String=} _origAdd private; for handling non-existent paths to be watched
- * @param {Boolean=} _internal private; indicates a non-user add
- * @returns {FSWatcher} for chaining
- */
-add(paths_, _origAdd, _internal) {
-  const {cwd, disableGlobbing} = this.options;
-  this.closed = false;
-  let paths = unifyPaths(paths_);
-  if (cwd) {
-    paths = paths.map((path) => {
-      const absPath = getAbsolutePath(path, cwd);
-
-      // Check `path` instead of `absPath` because the cwd portion can't be a glob
-      if (disableGlobbing || !isGlob(path)) {
-        return absPath;
-      }
-      return normalizePath(absPath);
-    });
-  }
-
-  // set aside negated glob strings
-  paths = paths.filter((path) => {
-    if (path.startsWith(BANG)) {
-      this._ignoredPaths.add(path.slice(1));
-      return false;
-    }
-
-    // if a path is being added that was previously ignored, stop ignoring it
-    this._ignoredPaths.delete(path);
-    this._ignoredPaths.delete(path + SLASH_GLOBSTAR);
-
-    // reset the cached userIgnored anymatch fn
-    // to make ignoredPaths changes effective
-    this._userIgnored = undefined;
-
-    return true;
-  });
-
-  if (this.options.useFsEvents && this._fsEventsHandler) {
-    if (!this._readyCount) this._readyCount = paths.length;
-    if (this.options.persistent) this._readyCount += paths.length;
-    paths.forEach((path) => this._fsEventsHandler._addToFsEvents(path));
-  } else {
-    if (!this._readyCount) this._readyCount = 0;
-    this._readyCount += paths.length;
-    Promise.all(
-      paths.map(async path => {
-        const res = await this._nodeFsHandler._addToNodeFs(path, !_internal, 0, 0, _origAdd);
-        if (res) this._emitReady();
-        return res;
-      })
-    ).then(results => {
-      if (this.closed) return;
-      results.filter(item => item).forEach(item => {
-        this.add(sysPath.dirname(item), sysPath.basename(_origAdd || item));
-      });
-    });
-  }
-
-  return this;
-}
-
-/**
- * Close watchers or start ignoring events from specified paths.
- * @param {Path|Array<Path>} paths_ - string or array of strings, file/directory paths and/or globs
- * @returns {FSWatcher} for chaining
-*/
-unwatch(paths_) {
-  if (this.closed) return this;
-  const paths = unifyPaths(paths_);
-  const {cwd} = this.options;
-
-  paths.forEach((path) => {
-    // convert to absolute path unless relative path already matches
-    if (!sysPath.isAbsolute(path) && !this._closers.has(path)) {
-      if (cwd) path = sysPath.join(cwd, path);
-      path = sysPath.resolve(path);
-    }
-
-    this._closePath(path);
-
-    this._ignoredPaths.add(path);
-    if (this._watched.has(path)) {
-      this._ignoredPaths.add(path + SLASH_GLOBSTAR);
-    }
-
-    // reset the cached userIgnored anymatch fn
-    // to make ignoredPaths changes effective
-    this._userIgnored = undefined;
-  });
-
-  return this;
-}
-
-/**
- * Close watchers and remove all listeners from watched paths.
- * @returns {Promise<void>}.
-*/
-close() {
-  if (this.closed) return this._closePromise;
-  this.closed = true;
-
-  // Memory management.
-  this.removeAllListeners();
-  const closers = [];
-  this._closers.forEach(closerList => closerList.forEach(closer => {
-    const promise = closer();
-    if (promise instanceof Promise) closers.push(promise);
-  }));
-  this._streams.forEach(stream => stream.destroy());
-  this._userIgnored = undefined;
-  this._readyCount = 0;
-  this._readyEmitted = false;
-  this._watched.forEach(dirent => dirent.dispose());
-  ['closers', 'watched', 'streams', 'symlinkPaths', 'throttled'].forEach(key => {
-    this[`_${key}`].clear();
-  });
-
-  this._closePromise = closers.length ? Promise.all(closers).then(() => undefined) : Promise.resolve();
-  return this._closePromise;
-}
-
-/**
- * Expose list of watched paths
- * @returns {Object} for chaining
-*/
-getWatched() {
-  const watchList = {};
-  this._watched.forEach((entry, dir) => {
-    const key = this.options.cwd ? sysPath.relative(this.options.cwd, dir) : dir;
-    watchList[key || ONE_DOT] = entry.getChildren().sort();
-  });
-  return watchList;
-}
-
-emitWithAll(event, args) {
-  this.emit(...args);
-  if (event !== EV_ERROR) this.emit(EV_ALL, ...args);
-}
-
-// Common helpers
-// --------------
-
-/**
- * Normalize and emit events.
- * Calling _emit DOES NOT MEAN emit() would be called!
- * @param {EventName} event Type of event
- * @param {Path} path File or directory path
- * @param {*=} val1 arguments to be passed with event
- * @param {*=} val2
- * @param {*=} val3
- * @returns the error if defined, otherwise the value of the FSWatcher instance's `closed` flag
- */
-async _emit(event, path, val1, val2, val3) {
-  if (this.closed) return;
-
-  const opts = this.options;
-  if (isWindows) path = sysPath.normalize(path);
-  if (opts.cwd) path = sysPath.relative(opts.cwd, path);
-  /** @type Array<any> */
-  const args = [event, path];
-  if (val3 !== undefined) args.push(val1, val2, val3);
-  else if (val2 !== undefined) args.push(val1, val2);
-  else if (val1 !== undefined) args.push(val1);
-
-  const awf = opts.awaitWriteFinish;
-  let pw;
-  if (awf && (pw = this._pendingWrites.get(path))) {
-    pw.lastChange = new Date();
-    return this;
-  }
-
-  if (opts.atomic) {
-    if (event === EV_UNLINK) {
-      this._pendingUnlinks.set(path, args);
-      setTimeout(() => {
-        this._pendingUnlinks.forEach((entry, path) => {
-          this.emit(...entry);
-          this.emit(EV_ALL, ...entry);
-          this._pendingUnlinks.delete(path);
-        });
-      }, typeof opts.atomic === 'number' ? opts.atomic : 100);
-      return this;
-    }
-    if (event === EV_ADD && this._pendingUnlinks.has(path)) {
-      event = args[0] = EV_CHANGE;
-      this._pendingUnlinks.delete(path);
-    }
-  }
-
-  if (awf && (event === EV_ADD || event === EV_CHANGE) && this._readyEmitted) {
-    const awfEmit = (err, stats) => {
-      if (err) {
-        event = args[0] = EV_ERROR;
-        args[1] = err;
-        this.emitWithAll(event, args);
-      } else if (stats) {
-        // if stats doesn't exist the file must have been deleted
-        if (args.length > 2) {
-          args[2] = stats;
-        } else {
-          args.push(stats);
-        }
-        this.emitWithAll(event, args);
-      }
-    };
-
-    this._awaitWriteFinish(path, awf.stabilityThreshold, event, awfEmit);
-    return this;
-  }
-
-  if (event === EV_CHANGE) {
-    const isThrottled = !this._throttle(EV_CHANGE, path, 50);
-    if (isThrottled) return this;
-  }
-
-  if (opts.alwaysStat && val1 === undefined &&
-    (event === EV_ADD || event === EV_ADD_DIR || event === EV_CHANGE)
-  ) {
-    const fullPath = opts.cwd ? sysPath.join(opts.cwd, path) : path;
-    let stats;
-    try {
-      stats = await stat(fullPath);
-    } catch (err) {}
-    // Suppress event when fs_stat fails, to avoid sending undefined 'stat'
-    if (!stats || this.closed) return;
-    args.push(stats);
-  }
-  this.emitWithAll(event, args);
-
-  return this;
-}
-
-/**
- * Common handler for errors
- * @param {Error} error
- * @returns {Error|Boolean} The error if defined, otherwise the value of the FSWatcher instance's `closed` flag
- */
-_handleError(error) {
-  const code = error && error.code;
-  if (error && code !== 'ENOENT' && code !== 'ENOTDIR' &&
-    (!this.options.ignorePermissionErrors || (code !== 'EPERM' && code !== 'EACCES'))
-  ) {
-    this.emit(EV_ERROR, error);
-  }
-  return error || this.closed;
-}
-
-/**
- * Helper utility for throttling
- * @param {ThrottleType} actionType type being throttled
- * @param {Path} path being acted upon
- * @param {Number} timeout duration of time to suppress duplicate actions
- * @returns {Object|false} tracking object or false if action should be suppressed
- */
-_throttle(actionType, path, timeout) {
-  if (!this._throttled.has(actionType)) {
-    this._throttled.set(actionType, new Map());
-  }
-
-  /** @type {Map<Path, Object>} */
-  const action = this._throttled.get(actionType);
-  /** @type {Object} */
-  const actionPath = action.get(path);
-
-  if (actionPath) {
-    actionPath.count++;
-    return false;
-  }
-
-  let timeoutObject;
-  const clear = () => {
-    const item = action.get(path);
-    const count = item ? item.count : 0;
-    action.delete(path);
-    clearTimeout(timeoutObject);
-    if (item) clearTimeout(item.timeoutObject);
-    return count;
-  };
-  timeoutObject = setTimeout(clear, timeout);
-  const thr = {timeoutObject, clear, count: 0};
-  action.set(path, thr);
-  return thr;
-}
-
-_incrReadyCount() {
-  return this._readyCount++;
-}
-
-/**
- * Awaits write operation to finish.
- * Polls a newly created file for size variations. When files size does not change for 'threshold' milliseconds calls callback.
- * @param {Path} path being acted upon
- * @param {Number} threshold Time in milliseconds a file size must be fixed before acknowledging write OP is finished
- * @param {EventName} event
- * @param {Function} awfEmit Callback to be called when ready for event to be emitted.
- */
-_awaitWriteFinish(path, threshold, event, awfEmit) {
-  let timeoutHandler;
-
-  let fullPath = path;
-  if (this.options.cwd && !sysPath.isAbsolute(path)) {
-    fullPath = sysPath.join(this.options.cwd, path);
-  }
-
-  const now = new Date();
-
-  const awaitWriteFinish = (prevStat) => {
-    fs.stat(fullPath, (err, curStat) => {
-      if (err || !this._pendingWrites.has(path)) {
-        if (err && err.code !== 'ENOENT') awfEmit(err);
-        return;
-      }
-
-      const now = Number(new Date());
-
-      if (prevStat && curStat.size !== prevStat.size) {
-        this._pendingWrites.get(path).lastChange = now;
-      }
-      const pw = this._pendingWrites.get(path);
-      const df = now - pw.lastChange;
-
-      if (df >= threshold) {
-        this._pendingWrites.delete(path);
-        awfEmit(undefined, curStat);
-      } else {
-        timeoutHandler = setTimeout(
-          awaitWriteFinish,
-          this.options.awaitWriteFinish.pollInterval,
-          curStat
-        );
-      }
-    });
-  };
-
-  if (!this._pendingWrites.has(path)) {
-    this._pendingWrites.set(path, {
-      lastChange: now,
-      cancelWait: () => {
-        this._pendingWrites.delete(path);
-        clearTimeout(timeoutHandler);
-        return event;
-      }
-    });
-    timeoutHandler = setTimeout(
-      awaitWriteFinish,
-      this.options.awaitWriteFinish.pollInterval
-    );
-  }
-}
-
-_getGlobIgnored() {
-  return [...this._ignoredPaths.values()];
-}
-
-/**
- * Determines whether user has asked to ignore this path.
- * @param {Path} path filepath or dir
- * @param {fs.Stats=} stats result of fs.stat
- * @returns {Boolean}
- */
-_isIgnored(path, stats) {
-  if (this.options.atomic && DOT_RE.test(path)) return true;
-  if (!this._userIgnored) {
-    const {cwd} = this.options;
-    const ign = this.options.ignored;
-
-    const ignored = ign && ign.map(normalizeIgnored(cwd));
-    const paths = arrify(ignored)
-      .filter((path) => typeof path === STRING_TYPE && !isGlob(path))
-      .map((path) => path + SLASH_GLOBSTAR);
-    const list = this._getGlobIgnored().map(normalizeIgnored(cwd)).concat(ignored, paths);
-    this._userIgnored = anymatch(list, undefined, ANYMATCH_OPTS);
-  }
-
-  return this._userIgnored([path, stats]);
-}
-
-_isntIgnored(path, stat) {
-  return !this._isIgnored(path, stat);
-}
-
-/**
- * Provides a set of common helpers and properties relating to symlink and glob handling.
- * @param {Path} path file, directory, or glob pattern being watched
- * @param {Number=} depth at any depth > 0, this isn't a glob
- * @returns {WatchHelper} object containing helpers for this path
- */
-_getWatchHelpers(path, depth) {
-  const watchPath = depth || this.options.disableGlobbing || !isGlob(path) ? path : globParent(path);
-  const follow = this.options.followSymlinks;
-
-  return new WatchHelper(path, watchPath, follow, this);
-}
-
-// Directory helpers
-// -----------------
-
-/**
- * Provides directory tracking objects
- * @param {String} directory path of the directory
- * @returns {DirEntry} the directory's tracking object
- */
-_getWatchedDir(directory) {
-  if (!this._boundRemove) this._boundRemove = this._remove.bind(this);
-  const dir = sysPath.resolve(directory);
-  if (!this._watched.has(dir)) this._watched.set(dir, new DirEntry(dir, this._boundRemove));
-  return this._watched.get(dir);
-}
-
-// File helpers
-// ------------
-
-/**
- * Check for read permissions.
- * Based on this answer on SO: https://stackoverflow.com/a/11781404/1358405
- * @param {fs.Stats} stats - object, result of fs_stat
- * @returns {Boolean} indicates whether the file can be read
-*/
-_hasReadPermissions(stats) {
-  if (this.options.ignorePermissionErrors) return true;
-
-  // stats.mode may be bigint
-  const md = stats && Number.parseInt(stats.mode, 10);
-  const st = md & 0o777;
-  const it = Number.parseInt(st.toString(8)[0], 10);
-  return Boolean(4 & it);
-}
-
-/**
- * Handles emitting unlink events for
- * files and directories, and via recursion, for
- * files and directories within directories that are unlinked
- * @param {String} directory within which the following item is located
- * @param {String} item      base path of item/directory
- * @returns {void}
-*/
-_remove(directory, item, isDirectory) {
-  // if what is being deleted is a directory, get that directory's paths
-  // for recursive deleting and cleaning of watched object
-  // if it is not a directory, nestedDirectoryChildren will be empty array
-  const path = sysPath.join(directory, item);
-  const fullPath = sysPath.resolve(path);
-  isDirectory = isDirectory != null
-    ? isDirectory
-    : this._watched.has(path) || this._watched.has(fullPath);
-
-  // prevent duplicate handling in case of arriving here nearly simultaneously
-  // via multiple paths (such as _handleFile and _handleDir)
-  if (!this._throttle('remove', path, 100)) return;
-
-  // if the only watched file is removed, watch for its return
-  if (!isDirectory && !this.options.useFsEvents && this._watched.size === 1) {
-    this.add(directory, item, true);
-  }
-
-  // This will create a new entry in the watched object in either case
-  // so we got to do the directory check beforehand
-  const wp = this._getWatchedDir(path);
-  const nestedDirectoryChildren = wp.getChildren();
-
-  // Recursively remove children directories / files.
-  nestedDirectoryChildren.forEach(nested => this._remove(path, nested));
-
-  // Check if item was on the watched list and remove it
-  const parent = this._getWatchedDir(directory);
-  const wasTracked = parent.has(item);
-  parent.remove(item);
-
-  // Fixes issue #1042 -> Relative paths were detected and added as symlinks
-  // (https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L612),
-  // but never removed from the map in case the path was deleted.
-  // This leads to an incorrect state if the path was recreated:
-  // https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L553
-  if (this._symlinkPaths.has(fullPath)) {
-    this._symlinkPaths.delete(fullPath);
-  }
-
-  // If we wait for this file to be fully written, cancel the wait.
-  let relPath = path;
-  if (this.options.cwd) relPath = sysPath.relative(this.options.cwd, path);
-  if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) {
-    const event = this._pendingWrites.get(relPath).cancelWait();
-    if (event === EV_ADD) return;
-  }
-
-  // The Entry will either be a directory that just got removed
-  // or a bogus entry to a file, in either case we have to remove it
-  this._watched.delete(path);
-  this._watched.delete(fullPath);
-  const eventName = isDirectory ? EV_UNLINK_DIR : EV_UNLINK;
-  if (wasTracked && !this._isIgnored(path)) this._emit(eventName, path);
-
-  // Avoid conflicts if we later create another file with the same name
-  if (!this.options.useFsEvents) {
-    this._closePath(path);
-  }
-}
-
-/**
- * Closes all watchers for a path
- * @param {Path} path
- */
-_closePath(path) {
-  this._closeFile(path)
-  const dir = sysPath.dirname(path);
-  this._getWatchedDir(dir).remove(sysPath.basename(path));
-}
-
-/**
- * Closes only file-specific watchers
- * @param {Path} path
- */
-_closeFile(path) {
-  const closers = this._closers.get(path);
-  if (!closers) return;
-  closers.forEach(closer => closer());
-  this._closers.delete(path);
-}
-
-/**
- *
- * @param {Path} path
- * @param {Function} closer
- */
-_addPathCloser(path, closer) {
-  if (!closer) return;
-  let list = this._closers.get(path);
-  if (!list) {
-    list = [];
-    this._closers.set(path, list);
-  }
-  list.push(closer);
-}
-
-_readdirp(root, opts) {
-  if (this.closed) return;
-  const options = {type: EV_ALL, alwaysStat: true, lstat: true, ...opts};
-  let stream = readdirp(root, options);
-  this._streams.add(stream);
-  stream.once(STR_CLOSE, () => {
-    stream = undefined;
-  });
-  stream.once(STR_END, () => {
-    if (stream) {
-      this._streams.delete(stream);
-      stream = undefined;
-    }
-  });
-  return stream;
-}
-
-}
-
-// Export FSWatcher class
-exports.FSWatcher = FSWatcher;
-
-/**
- * Instantiates watcher with paths to be tracked.
- * @param {String|Array<String>} paths file/directory paths and/or globs
- * @param {Object=} options chokidar opts
- * @returns an instance of FSWatcher for chaining.
- */
-const watch = (paths, options) => {
-  const watcher = new FSWatcher(options);
-  watcher.add(paths);
-  return watcher;
-};
-
-exports.watch = watch;
diff --git a/node_modules/chokidar/lib/constants.js b/node_modules/chokidar/lib/constants.js
deleted file mode 100644
index 4743865d6bd4095e73770a1bf005b0f8e453c2ee..0000000000000000000000000000000000000000
--- a/node_modules/chokidar/lib/constants.js
+++ /dev/null
@@ -1,66 +0,0 @@
-'use strict';
-
-const {sep} = require('path');
-const {platform} = process;
-const os = require('os');
-
-exports.EV_ALL = 'all';
-exports.EV_READY = 'ready';
-exports.EV_ADD = 'add';
-exports.EV_CHANGE = 'change';
-exports.EV_ADD_DIR = 'addDir';
-exports.EV_UNLINK = 'unlink';
-exports.EV_UNLINK_DIR = 'unlinkDir';
-exports.EV_RAW = 'raw';
-exports.EV_ERROR = 'error';
-
-exports.STR_DATA = 'data';
-exports.STR_END = 'end';
-exports.STR_CLOSE = 'close';
-
-exports.FSEVENT_CREATED = 'created';
-exports.FSEVENT_MODIFIED = 'modified';
-exports.FSEVENT_DELETED = 'deleted';
-exports.FSEVENT_MOVED = 'moved';
-exports.FSEVENT_CLONED = 'cloned';
-exports.FSEVENT_UNKNOWN = 'unknown';
-exports.FSEVENT_FLAG_MUST_SCAN_SUBDIRS = 1;
-exports.FSEVENT_TYPE_FILE = 'file';
-exports.FSEVENT_TYPE_DIRECTORY = 'directory';
-exports.FSEVENT_TYPE_SYMLINK = 'symlink';
-
-exports.KEY_LISTENERS = 'listeners';
-exports.KEY_ERR = 'errHandlers';
-exports.KEY_RAW = 'rawEmitters';
-exports.HANDLER_KEYS = [exports.KEY_LISTENERS, exports.KEY_ERR, exports.KEY_RAW];
-
-exports.DOT_SLASH = `.${sep}`;
-
-exports.BACK_SLASH_RE = /\\/g;
-exports.DOUBLE_SLASH_RE = /\/\//;
-exports.SLASH_OR_BACK_SLASH_RE = /[/\\]/;
-exports.DOT_RE = /\..*\.(sw[px])$|~$|\.subl.*\.tmp/;
-exports.REPLACER_RE = /^\.[/\\]/;
-
-exports.SLASH = '/';
-exports.SLASH_SLASH = '//';
-exports.BRACE_START = '{';
-exports.BANG = '!';
-exports.ONE_DOT = '.';
-exports.TWO_DOTS = '..';
-exports.STAR = '*';
-exports.GLOBSTAR = '**';
-exports.ROOT_GLOBSTAR = '/**/*';
-exports.SLASH_GLOBSTAR = '/**';
-exports.DIR_SUFFIX = 'Dir';
-exports.ANYMATCH_OPTS = {dot: true};
-exports.STRING_TYPE = 'string';
-exports.FUNCTION_TYPE = 'function';
-exports.EMPTY_STR = '';
-exports.EMPTY_FN = () => {};
-exports.IDENTITY_FN = val => val;
-
-exports.isWindows = platform === 'win32';
-exports.isMacos = platform === 'darwin';
-exports.isLinux = platform === 'linux';
-exports.isIBMi = os.type() === 'OS400';
diff --git a/node_modules/chokidar/lib/fsevents-handler.js b/node_modules/chokidar/lib/fsevents-handler.js
deleted file mode 100644
index fe29393c179d3d6673f996ca6f95bbc83f9a0699..0000000000000000000000000000000000000000
--- a/node_modules/chokidar/lib/fsevents-handler.js
+++ /dev/null
@@ -1,526 +0,0 @@
-'use strict';
-
-const fs = require('fs');
-const sysPath = require('path');
-const { promisify } = require('util');
-
-let fsevents;
-try {
-  fsevents = require('fsevents');
-} catch (error) {
-  if (process.env.CHOKIDAR_PRINT_FSEVENTS_REQUIRE_ERROR) console.error(error);
-}
-
-if (fsevents) {
-  // TODO: real check
-  const mtch = process.version.match(/v(\d+)\.(\d+)/);
-  if (mtch && mtch[1] && mtch[2]) {
-    const maj = Number.parseInt(mtch[1], 10);
-    const min = Number.parseInt(mtch[2], 10);
-    if (maj === 8 && min < 16) {
-      fsevents = undefined;
-    }
-  }
-}
-
-const {
-  EV_ADD,
-  EV_CHANGE,
-  EV_ADD_DIR,
-  EV_UNLINK,
-  EV_ERROR,
-  STR_DATA,
-  STR_END,
-  FSEVENT_CREATED,
-  FSEVENT_MODIFIED,
-  FSEVENT_DELETED,
-  FSEVENT_MOVED,
-  // FSEVENT_CLONED,
-  FSEVENT_UNKNOWN,
-  FSEVENT_FLAG_MUST_SCAN_SUBDIRS,
-  FSEVENT_TYPE_FILE,
-  FSEVENT_TYPE_DIRECTORY,
-  FSEVENT_TYPE_SYMLINK,
-
-  ROOT_GLOBSTAR,
-  DIR_SUFFIX,
-  DOT_SLASH,
-  FUNCTION_TYPE,
-  EMPTY_FN,
-  IDENTITY_FN
-} = require('./constants');
-
-const Depth = (value) => isNaN(value) ? {} : {depth: value};
-
-const stat = promisify(fs.stat);
-const lstat = promisify(fs.lstat);
-const realpath = promisify(fs.realpath);
-
-const statMethods = { stat, lstat };
-
-/**
- * @typedef {String} Path
- */
-
-/**
- * @typedef {Object} FsEventsWatchContainer
- * @property {Set<Function>} listeners
- * @property {Function} rawEmitter
- * @property {{stop: Function}} watcher
- */
-
-// fsevents instance helper functions
-/**
- * Object to hold per-process fsevents instances (may be shared across chokidar FSWatcher instances)
- * @type {Map<Path,FsEventsWatchContainer>}
- */
-const FSEventsWatchers = new Map();
-
-// Threshold of duplicate path prefixes at which to start
-// consolidating going forward
-const consolidateThreshhold = 10;
-
-const wrongEventFlags = new Set([
-  69888, 70400, 71424, 72704, 73472, 131328, 131840, 262912
-]);
-
-/**
- * Instantiates the fsevents interface
- * @param {Path} path path to be watched
- * @param {Function} callback called when fsevents is bound and ready
- * @returns {{stop: Function}} new fsevents instance
- */
-const createFSEventsInstance = (path, callback) => {
-  const stop = fsevents.watch(path, callback);
-  return {stop};
-};
-
-/**
- * Instantiates the fsevents interface or binds listeners to an existing one covering
- * the same file tree.
- * @param {Path} path           - to be watched
- * @param {Path} realPath       - real path for symlinks
- * @param {Function} listener   - called when fsevents emits events
- * @param {Function} rawEmitter - passes data to listeners of the 'raw' event
- * @returns {Function} closer
- */
-function setFSEventsListener(path, realPath, listener, rawEmitter) {
-  let watchPath = sysPath.extname(realPath) ? sysPath.dirname(realPath) : realPath;
-
-  const parentPath = sysPath.dirname(watchPath);
-  let cont = FSEventsWatchers.get(watchPath);
-
-  // If we've accumulated a substantial number of paths that
-  // could have been consolidated by watching one directory
-  // above the current one, create a watcher on the parent
-  // path instead, so that we do consolidate going forward.
-  if (couldConsolidate(parentPath)) {
-    watchPath = parentPath;
-  }
-
-  const resolvedPath = sysPath.resolve(path);
-  const hasSymlink = resolvedPath !== realPath;
-
-  const filteredListener = (fullPath, flags, info) => {
-    if (hasSymlink) fullPath = fullPath.replace(realPath, resolvedPath);
-    if (
-      fullPath === resolvedPath ||
-      !fullPath.indexOf(resolvedPath + sysPath.sep)
-    ) listener(fullPath, flags, info);
-  };
-
-  // check if there is already a watcher on a parent path
-  // modifies `watchPath` to the parent path when it finds a match
-  let watchedParent = false;
-  for (const watchedPath of FSEventsWatchers.keys()) {
-    if (realPath.indexOf(sysPath.resolve(watchedPath) + sysPath.sep) === 0) {
-      watchPath = watchedPath;
-      cont = FSEventsWatchers.get(watchPath);
-      watchedParent = true;
-      break;
-    }
-  }
-
-  if (cont || watchedParent) {
-    cont.listeners.add(filteredListener);
-  } else {
-    cont = {
-      listeners: new Set([filteredListener]),
-      rawEmitter,
-      watcher: createFSEventsInstance(watchPath, (fullPath, flags) => {
-        if (!cont.listeners.size) return;
-        if (flags & FSEVENT_FLAG_MUST_SCAN_SUBDIRS) return;
-        const info = fsevents.getInfo(fullPath, flags);
-        cont.listeners.forEach(list => {
-          list(fullPath, flags, info);
-        });
-
-        cont.rawEmitter(info.event, fullPath, info);
-      })
-    };
-    FSEventsWatchers.set(watchPath, cont);
-  }
-
-  // removes this instance's listeners and closes the underlying fsevents
-  // instance if there are no more listeners left
-  return () => {
-    const lst = cont.listeners;
-
-    lst.delete(filteredListener);
-    if (!lst.size) {
-      FSEventsWatchers.delete(watchPath);
-      if (cont.watcher) return cont.watcher.stop().then(() => {
-        cont.rawEmitter = cont.watcher = undefined;
-        Object.freeze(cont);
-      });
-    }
-  };
-}
-
-// Decide whether or not we should start a new higher-level
-// parent watcher
-const couldConsolidate = (path) => {
-  let count = 0;
-  for (const watchPath of FSEventsWatchers.keys()) {
-    if (watchPath.indexOf(path) === 0) {
-      count++;
-      if (count >= consolidateThreshhold) {
-        return true;
-      }
-    }
-  }
-
-  return false;
-};
-
-// returns boolean indicating whether fsevents can be used
-const canUse = () => fsevents && FSEventsWatchers.size < 128;
-
-// determines subdirectory traversal levels from root to path
-const calcDepth = (path, root) => {
-  let i = 0;
-  while (!path.indexOf(root) && (path = sysPath.dirname(path)) !== root) i++;
-  return i;
-};
-
-// returns boolean indicating whether the fsevents' event info has the same type
-// as the one returned by fs.stat
-const sameTypes = (info, stats) => (
-  info.type === FSEVENT_TYPE_DIRECTORY && stats.isDirectory() ||
-  info.type === FSEVENT_TYPE_SYMLINK && stats.isSymbolicLink() ||
-  info.type === FSEVENT_TYPE_FILE && stats.isFile()
-)
-
-/**
- * @mixin
- */
-class FsEventsHandler {
-
-/**
- * @param {import('../index').FSWatcher} fsw
- */
-constructor(fsw) {
-  this.fsw = fsw;
-}
-checkIgnored(path, stats) {
-  const ipaths = this.fsw._ignoredPaths;
-  if (this.fsw._isIgnored(path, stats)) {
-    ipaths.add(path);
-    if (stats && stats.isDirectory()) {
-      ipaths.add(path + ROOT_GLOBSTAR);
-    }
-    return true;
-  }
-
-  ipaths.delete(path);
-  ipaths.delete(path + ROOT_GLOBSTAR);
-}
-
-addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts) {
-  const event = watchedDir.has(item) ? EV_CHANGE : EV_ADD;
-  this.handleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts);
-}
-
-async checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts) {
-  try {
-    const stats = await stat(path)
-    if (this.fsw.closed) return;
-    if (sameTypes(info, stats)) {
-      this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts);
-    } else {
-      this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts);
-    }
-  } catch (error) {
-    if (error.code === 'EACCES') {
-      this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts);
-    } else {
-      this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts);
-    }
-  }
-}
-
-handleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts) {
-  if (this.fsw.closed || this.checkIgnored(path)) return;
-
-  if (event === EV_UNLINK) {
-    const isDirectory = info.type === FSEVENT_TYPE_DIRECTORY
-    // suppress unlink events on never before seen files
-    if (isDirectory || watchedDir.has(item)) {
-      this.fsw._remove(parent, item, isDirectory);
-    }
-  } else {
-    if (event === EV_ADD) {
-      // track new directories
-      if (info.type === FSEVENT_TYPE_DIRECTORY) this.fsw._getWatchedDir(path);
-
-      if (info.type === FSEVENT_TYPE_SYMLINK && opts.followSymlinks) {
-        // push symlinks back to the top of the stack to get handled
-        const curDepth = opts.depth === undefined ?
-          undefined : calcDepth(fullPath, realPath) + 1;
-        return this._addToFsEvents(path, false, true, curDepth);
-      }
-
-      // track new paths
-      // (other than symlinks being followed, which will be tracked soon)
-      this.fsw._getWatchedDir(parent).add(item);
-    }
-    /**
-     * @type {'add'|'addDir'|'unlink'|'unlinkDir'}
-     */
-    const eventName = info.type === FSEVENT_TYPE_DIRECTORY ? event + DIR_SUFFIX : event;
-    this.fsw._emit(eventName, path);
-    if (eventName === EV_ADD_DIR) this._addToFsEvents(path, false, true);
-  }
-}
-
-/**
- * Handle symlinks encountered during directory scan
- * @param {String} watchPath  - file/dir path to be watched with fsevents
- * @param {String} realPath   - real path (in case of symlinks)
- * @param {Function} transform  - path transformer
- * @param {Function} globFilter - path filter in case a glob pattern was provided
- * @returns {Function} closer for the watcher instance
-*/
-_watchWithFsEvents(watchPath, realPath, transform, globFilter) {
-  if (this.fsw.closed || this.fsw._isIgnored(watchPath)) return;
-  const opts = this.fsw.options;
-  const watchCallback = async (fullPath, flags, info) => {
-    if (this.fsw.closed) return;
-    if (
-      opts.depth !== undefined &&
-      calcDepth(fullPath, realPath) > opts.depth
-    ) return;
-    const path = transform(sysPath.join(
-      watchPath, sysPath.relative(watchPath, fullPath)
-    ));
-    if (globFilter && !globFilter(path)) return;
-    // ensure directories are tracked
-    const parent = sysPath.dirname(path);
-    const item = sysPath.basename(path);
-    const watchedDir = this.fsw._getWatchedDir(
-      info.type === FSEVENT_TYPE_DIRECTORY ? path : parent
-    );
-
-    // correct for wrong events emitted
-    if (wrongEventFlags.has(flags) || info.event === FSEVENT_UNKNOWN) {
-      if (typeof opts.ignored === FUNCTION_TYPE) {
-        let stats;
-        try {
-          stats = await stat(path);
-        } catch (error) {}
-        if (this.fsw.closed) return;
-        if (this.checkIgnored(path, stats)) return;
-        if (sameTypes(info, stats)) {
-          this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts);
-        } else {
-          this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts);
-        }
-      } else {
-        this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts);
-      }
-    } else {
-      switch (info.event) {
-      case FSEVENT_CREATED:
-      case FSEVENT_MODIFIED:
-        return this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts);
-      case FSEVENT_DELETED:
-      case FSEVENT_MOVED:
-        return this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts);
-      }
-    }
-  };
-
-  const closer = setFSEventsListener(
-    watchPath,
-    realPath,
-    watchCallback,
-    this.fsw._emitRaw
-  );
-
-  this.fsw._emitReady();
-  return closer;
-}
-
-/**
- * Handle symlinks encountered during directory scan
- * @param {String} linkPath path to symlink
- * @param {String} fullPath absolute path to the symlink
- * @param {Function} transform pre-existing path transformer
- * @param {Number} curDepth level of subdirectories traversed to where symlink is
- * @returns {Promise<void>}
- */
-async _handleFsEventsSymlink(linkPath, fullPath, transform, curDepth) {
-  // don't follow the same symlink more than once
-  if (this.fsw.closed || this.fsw._symlinkPaths.has(fullPath)) return;
-
-  this.fsw._symlinkPaths.set(fullPath, true);
-  this.fsw._incrReadyCount();
-
-  try {
-    const linkTarget = await realpath(linkPath);
-    if (this.fsw.closed) return;
-    if (this.fsw._isIgnored(linkTarget)) {
-      return this.fsw._emitReady();
-    }
-
-    this.fsw._incrReadyCount();
-
-    // add the linkTarget for watching with a wrapper for transform
-    // that causes emitted paths to incorporate the link's path
-    this._addToFsEvents(linkTarget || linkPath, (path) => {
-      let aliasedPath = linkPath;
-      if (linkTarget && linkTarget !== DOT_SLASH) {
-        aliasedPath = path.replace(linkTarget, linkPath);
-      } else if (path !== DOT_SLASH) {
-        aliasedPath = sysPath.join(linkPath, path);
-      }
-      return transform(aliasedPath);
-    }, false, curDepth);
-  } catch(error) {
-    if (this.fsw._handleError(error)) {
-      return this.fsw._emitReady();
-    }
-  }
-}
-
-/**
- *
- * @param {Path} newPath
- * @param {fs.Stats} stats
- */
-emitAdd(newPath, stats, processPath, opts, forceAdd) {
-  const pp = processPath(newPath);
-  const isDir = stats.isDirectory();
-  const dirObj = this.fsw._getWatchedDir(sysPath.dirname(pp));
-  const base = sysPath.basename(pp);
-
-  // ensure empty dirs get tracked
-  if (isDir) this.fsw._getWatchedDir(pp);
-  if (dirObj.has(base)) return;
-  dirObj.add(base);
-
-  if (!opts.ignoreInitial || forceAdd === true) {
-    this.fsw._emit(isDir ? EV_ADD_DIR : EV_ADD, pp, stats);
-  }
-}
-
-initWatch(realPath, path, wh, processPath) {
-  if (this.fsw.closed) return;
-  const closer = this._watchWithFsEvents(
-    wh.watchPath,
-    sysPath.resolve(realPath || wh.watchPath),
-    processPath,
-    wh.globFilter
-  );
-  this.fsw._addPathCloser(path, closer);
-}
-
-/**
- * Handle added path with fsevents
- * @param {String} path file/dir path or glob pattern
- * @param {Function|Boolean=} transform converts working path to what the user expects
- * @param {Boolean=} forceAdd ensure add is emitted
- * @param {Number=} priorDepth Level of subdirectories already traversed.
- * @returns {Promise<void>}
- */
-async _addToFsEvents(path, transform, forceAdd, priorDepth) {
-  if (this.fsw.closed) {
-    return;
-  }
-  const opts = this.fsw.options;
-  const processPath = typeof transform === FUNCTION_TYPE ? transform : IDENTITY_FN;
-
-  const wh = this.fsw._getWatchHelpers(path);
-
-  // evaluate what is at the path we're being asked to watch
-  try {
-    const stats = await statMethods[wh.statMethod](wh.watchPath);
-    if (this.fsw.closed) return;
-    if (this.fsw._isIgnored(wh.watchPath, stats)) {
-      throw null;
-    }
-    if (stats.isDirectory()) {
-      // emit addDir unless this is a glob parent
-      if (!wh.globFilter) this.emitAdd(processPath(path), stats, processPath, opts, forceAdd);
-
-      // don't recurse further if it would exceed depth setting
-      if (priorDepth && priorDepth > opts.depth) return;
-
-      // scan the contents of the dir
-      this.fsw._readdirp(wh.watchPath, {
-        fileFilter: entry => wh.filterPath(entry),
-        directoryFilter: entry => wh.filterDir(entry),
-        ...Depth(opts.depth - (priorDepth || 0))
-      }).on(STR_DATA, (entry) => {
-        // need to check filterPath on dirs b/c filterDir is less restrictive
-        if (this.fsw.closed) {
-          return;
-        }
-        if (entry.stats.isDirectory() && !wh.filterPath(entry)) return;
-
-        const joinedPath = sysPath.join(wh.watchPath, entry.path);
-        const {fullPath} = entry;
-
-        if (wh.followSymlinks && entry.stats.isSymbolicLink()) {
-          // preserve the current depth here since it can't be derived from
-          // real paths past the symlink
-          const curDepth = opts.depth === undefined ?
-            undefined : calcDepth(joinedPath, sysPath.resolve(wh.watchPath)) + 1;
-
-          this._handleFsEventsSymlink(joinedPath, fullPath, processPath, curDepth);
-        } else {
-          this.emitAdd(joinedPath, entry.stats, processPath, opts, forceAdd);
-        }
-      }).on(EV_ERROR, EMPTY_FN).on(STR_END, () => {
-        this.fsw._emitReady();
-      });
-    } else {
-      this.emitAdd(wh.watchPath, stats, processPath, opts, forceAdd);
-      this.fsw._emitReady();
-    }
-  } catch (error) {
-    if (!error || this.fsw._handleError(error)) {
-      // TODO: Strange thing: "should not choke on an ignored watch path" will be failed without 2 ready calls -__-
-      this.fsw._emitReady();
-      this.fsw._emitReady();
-    }
-  }
-
-  if (opts.persistent && forceAdd !== true) {
-    if (typeof transform === FUNCTION_TYPE) {
-      // realpath has already been resolved
-      this.initWatch(undefined, path, wh, processPath);
-    } else {
-      let realPath;
-      try {
-        realPath = await realpath(wh.watchPath);
-      } catch (e) {}
-      this.initWatch(realPath, path, wh, processPath);
-    }
-  }
-}
-
-}
-
-module.exports = FsEventsHandler;
-module.exports.canUse = canUse;
diff --git a/node_modules/chokidar/lib/nodefs-handler.js b/node_modules/chokidar/lib/nodefs-handler.js
deleted file mode 100644
index 199cfe9f9fff5a2f5267c67a004b1fa92ec56649..0000000000000000000000000000000000000000
--- a/node_modules/chokidar/lib/nodefs-handler.js
+++ /dev/null
@@ -1,654 +0,0 @@
-'use strict';
-
-const fs = require('fs');
-const sysPath = require('path');
-const { promisify } = require('util');
-const isBinaryPath = require('is-binary-path');
-const {
-  isWindows,
-  isLinux,
-  EMPTY_FN,
-  EMPTY_STR,
-  KEY_LISTENERS,
-  KEY_ERR,
-  KEY_RAW,
-  HANDLER_KEYS,
-  EV_CHANGE,
-  EV_ADD,
-  EV_ADD_DIR,
-  EV_ERROR,
-  STR_DATA,
-  STR_END,
-  BRACE_START,
-  STAR
-} = require('./constants');
-
-const THROTTLE_MODE_WATCH = 'watch';
-
-const open = promisify(fs.open);
-const stat = promisify(fs.stat);
-const lstat = promisify(fs.lstat);
-const close = promisify(fs.close);
-const fsrealpath = promisify(fs.realpath);
-
-const statMethods = { lstat, stat };
-
-// TODO: emit errors properly. Example: EMFILE on Macos.
-const foreach = (val, fn) => {
-  if (val instanceof Set) {
-    val.forEach(fn);
-  } else {
-    fn(val);
-  }
-};
-
-const addAndConvert = (main, prop, item) => {
-  let container = main[prop];
-  if (!(container instanceof Set)) {
-    main[prop] = container = new Set([container]);
-  }
-  container.add(item);
-};
-
-const clearItem = cont => key => {
-  const set = cont[key];
-  if (set instanceof Set) {
-    set.clear();
-  } else {
-    delete cont[key];
-  }
-};
-
-const delFromSet = (main, prop, item) => {
-  const container = main[prop];
-  if (container instanceof Set) {
-    container.delete(item);
-  } else if (container === item) {
-    delete main[prop];
-  }
-};
-
-const isEmptySet = (val) => val instanceof Set ? val.size === 0 : !val;
-
-/**
- * @typedef {String} Path
- */
-
-// fs_watch helpers
-
-// object to hold per-process fs_watch instances
-// (may be shared across chokidar FSWatcher instances)
-
-/**
- * @typedef {Object} FsWatchContainer
- * @property {Set} listeners
- * @property {Set} errHandlers
- * @property {Set} rawEmitters
- * @property {fs.FSWatcher=} watcher
- * @property {Boolean=} watcherUnusable
- */
-
-/**
- * @type {Map<String,FsWatchContainer>}
- */
-const FsWatchInstances = new Map();
-
-/**
- * Instantiates the fs_watch interface
- * @param {String} path to be watched
- * @param {Object} options to be passed to fs_watch
- * @param {Function} listener main event handler
- * @param {Function} errHandler emits info about errors
- * @param {Function} emitRaw emits raw event data
- * @returns {fs.FSWatcher} new fsevents instance
- */
-function createFsWatchInstance(path, options, listener, errHandler, emitRaw) {
-  const handleEvent = (rawEvent, evPath) => {
-    listener(path);
-    emitRaw(rawEvent, evPath, {watchedPath: path});
-
-    // emit based on events occurring for files from a directory's watcher in
-    // case the file's watcher misses it (and rely on throttling to de-dupe)
-    if (evPath && path !== evPath) {
-      fsWatchBroadcast(
-        sysPath.resolve(path, evPath), KEY_LISTENERS, sysPath.join(path, evPath)
-      );
-    }
-  };
-  try {
-    return fs.watch(path, options, handleEvent);
-  } catch (error) {
-    errHandler(error);
-  }
-}
-
-/**
- * Helper for passing fs_watch event data to a collection of listeners
- * @param {Path} fullPath absolute path bound to fs_watch instance
- * @param {String} type listener type
- * @param {*=} val1 arguments to be passed to listeners
- * @param {*=} val2
- * @param {*=} val3
- */
-const fsWatchBroadcast = (fullPath, type, val1, val2, val3) => {
-  const cont = FsWatchInstances.get(fullPath);
-  if (!cont) return;
-  foreach(cont[type], (listener) => {
-    listener(val1, val2, val3);
-  });
-};
-
-/**
- * Instantiates the fs_watch interface or binds listeners
- * to an existing one covering the same file system entry
- * @param {String} path
- * @param {String} fullPath absolute path
- * @param {Object} options to be passed to fs_watch
- * @param {Object} handlers container for event listener functions
- */
-const setFsWatchListener = (path, fullPath, options, handlers) => {
-  const {listener, errHandler, rawEmitter} = handlers;
-  let cont = FsWatchInstances.get(fullPath);
-
-  /** @type {fs.FSWatcher=} */
-  let watcher;
-  if (!options.persistent) {
-    watcher = createFsWatchInstance(
-      path, options, listener, errHandler, rawEmitter
-    );
-    return watcher.close.bind(watcher);
-  }
-  if (cont) {
-    addAndConvert(cont, KEY_LISTENERS, listener);
-    addAndConvert(cont, KEY_ERR, errHandler);
-    addAndConvert(cont, KEY_RAW, rawEmitter);
-  } else {
-    watcher = createFsWatchInstance(
-      path,
-      options,
-      fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS),
-      errHandler, // no need to use broadcast here
-      fsWatchBroadcast.bind(null, fullPath, KEY_RAW)
-    );
-    if (!watcher) return;
-    watcher.on(EV_ERROR, async (error) => {
-      const broadcastErr = fsWatchBroadcast.bind(null, fullPath, KEY_ERR);
-      cont.watcherUnusable = true; // documented since Node 10.4.1
-      // Workaround for https://github.com/joyent/node/issues/4337
-      if (isWindows && error.code === 'EPERM') {
-        try {
-          const fd = await open(path, 'r');
-          await close(fd);
-          broadcastErr(error);
-        } catch (err) {}
-      } else {
-        broadcastErr(error);
-      }
-    });
-    cont = {
-      listeners: listener,
-      errHandlers: errHandler,
-      rawEmitters: rawEmitter,
-      watcher
-    };
-    FsWatchInstances.set(fullPath, cont);
-  }
-  // const index = cont.listeners.indexOf(listener);
-
-  // removes this instance's listeners and closes the underlying fs_watch
-  // instance if there are no more listeners left
-  return () => {
-    delFromSet(cont, KEY_LISTENERS, listener);
-    delFromSet(cont, KEY_ERR, errHandler);
-    delFromSet(cont, KEY_RAW, rawEmitter);
-    if (isEmptySet(cont.listeners)) {
-      // Check to protect against issue gh-730.
-      // if (cont.watcherUnusable) {
-      cont.watcher.close();
-      // }
-      FsWatchInstances.delete(fullPath);
-      HANDLER_KEYS.forEach(clearItem(cont));
-      cont.watcher = undefined;
-      Object.freeze(cont);
-    }
-  };
-};
-
-// fs_watchFile helpers
-
-// object to hold per-process fs_watchFile instances
-// (may be shared across chokidar FSWatcher instances)
-const FsWatchFileInstances = new Map();
-
-/**
- * Instantiates the fs_watchFile interface or binds listeners
- * to an existing one covering the same file system entry
- * @param {String} path to be watched
- * @param {String} fullPath absolute path
- * @param {Object} options options to be passed to fs_watchFile
- * @param {Object} handlers container for event listener functions
- * @returns {Function} closer
- */
-const setFsWatchFileListener = (path, fullPath, options, handlers) => {
-  const {listener, rawEmitter} = handlers;
-  let cont = FsWatchFileInstances.get(fullPath);
-
-  /* eslint-disable no-unused-vars, prefer-destructuring */
-  let listeners = new Set();
-  let rawEmitters = new Set();
-
-  const copts = cont && cont.options;
-  if (copts && (copts.persistent < options.persistent || copts.interval > options.interval)) {
-    // "Upgrade" the watcher to persistence or a quicker interval.
-    // This creates some unlikely edge case issues if the user mixes
-    // settings in a very weird way, but solving for those cases
-    // doesn't seem worthwhile for the added complexity.
-    listeners = cont.listeners;
-    rawEmitters = cont.rawEmitters;
-    fs.unwatchFile(fullPath);
-    cont = undefined;
-  }
-
-  /* eslint-enable no-unused-vars, prefer-destructuring */
-
-  if (cont) {
-    addAndConvert(cont, KEY_LISTENERS, listener);
-    addAndConvert(cont, KEY_RAW, rawEmitter);
-  } else {
-    // TODO
-    // listeners.add(listener);
-    // rawEmitters.add(rawEmitter);
-    cont = {
-      listeners: listener,
-      rawEmitters: rawEmitter,
-      options,
-      watcher: fs.watchFile(fullPath, options, (curr, prev) => {
-        foreach(cont.rawEmitters, (rawEmitter) => {
-          rawEmitter(EV_CHANGE, fullPath, {curr, prev});
-        });
-        const currmtime = curr.mtimeMs;
-        if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) {
-          foreach(cont.listeners, (listener) => listener(path, curr));
-        }
-      })
-    };
-    FsWatchFileInstances.set(fullPath, cont);
-  }
-  // const index = cont.listeners.indexOf(listener);
-
-  // Removes this instance's listeners and closes the underlying fs_watchFile
-  // instance if there are no more listeners left.
-  return () => {
-    delFromSet(cont, KEY_LISTENERS, listener);
-    delFromSet(cont, KEY_RAW, rawEmitter);
-    if (isEmptySet(cont.listeners)) {
-      FsWatchFileInstances.delete(fullPath);
-      fs.unwatchFile(fullPath);
-      cont.options = cont.watcher = undefined;
-      Object.freeze(cont);
-    }
-  };
-};
-
-/**
- * @mixin
- */
-class NodeFsHandler {
-
-/**
- * @param {import("../index").FSWatcher} fsW
- */
-constructor(fsW) {
-  this.fsw = fsW;
-  this._boundHandleError = (error) => fsW._handleError(error);
-}
-
-/**
- * Watch file for changes with fs_watchFile or fs_watch.
- * @param {String} path to file or dir
- * @param {Function} listener on fs change
- * @returns {Function} closer for the watcher instance
- */
-_watchWithNodeFs(path, listener) {
-  const opts = this.fsw.options;
-  const directory = sysPath.dirname(path);
-  const basename = sysPath.basename(path);
-  const parent = this.fsw._getWatchedDir(directory);
-  parent.add(basename);
-  const absolutePath = sysPath.resolve(path);
-  const options = {persistent: opts.persistent};
-  if (!listener) listener = EMPTY_FN;
-
-  let closer;
-  if (opts.usePolling) {
-    options.interval = opts.enableBinaryInterval && isBinaryPath(basename) ?
-      opts.binaryInterval : opts.interval;
-    closer = setFsWatchFileListener(path, absolutePath, options, {
-      listener,
-      rawEmitter: this.fsw._emitRaw
-    });
-  } else {
-    closer = setFsWatchListener(path, absolutePath, options, {
-      listener,
-      errHandler: this._boundHandleError,
-      rawEmitter: this.fsw._emitRaw
-    });
-  }
-  return closer;
-}
-
-/**
- * Watch a file and emit add event if warranted.
- * @param {Path} file Path
- * @param {fs.Stats} stats result of fs_stat
- * @param {Boolean} initialAdd was the file added at watch instantiation?
- * @returns {Function} closer for the watcher instance
- */
-_handleFile(file, stats, initialAdd) {
-  if (this.fsw.closed) {
-    return;
-  }
-  const dirname = sysPath.dirname(file);
-  const basename = sysPath.basename(file);
-  const parent = this.fsw._getWatchedDir(dirname);
-  // stats is always present
-  let prevStats = stats;
-
-  // if the file is already being watched, do nothing
-  if (parent.has(basename)) return;
-
-  const listener = async (path, newStats) => {
-    if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5)) return;
-    if (!newStats || newStats.mtimeMs === 0) {
-      try {
-        const newStats = await stat(file);
-        if (this.fsw.closed) return;
-        // Check that change event was not fired because of changed only accessTime.
-        const at = newStats.atimeMs;
-        const mt = newStats.mtimeMs;
-        if (!at || at <= mt || mt !== prevStats.mtimeMs) {
-          this.fsw._emit(EV_CHANGE, file, newStats);
-        }
-        if (isLinux && prevStats.ino !== newStats.ino) {
-          this.fsw._closeFile(path)
-          prevStats = newStats;
-          this.fsw._addPathCloser(path, this._watchWithNodeFs(file, listener));
-        } else {
-          prevStats = newStats;
-        }
-      } catch (error) {
-        // Fix issues where mtime is null but file is still present
-        this.fsw._remove(dirname, basename);
-      }
-      // add is about to be emitted if file not already tracked in parent
-    } else if (parent.has(basename)) {
-      // Check that change event was not fired because of changed only accessTime.
-      const at = newStats.atimeMs;
-      const mt = newStats.mtimeMs;
-      if (!at || at <= mt || mt !== prevStats.mtimeMs) {
-        this.fsw._emit(EV_CHANGE, file, newStats);
-      }
-      prevStats = newStats;
-    }
-  }
-  // kick off the watcher
-  const closer = this._watchWithNodeFs(file, listener);
-
-  // emit an add event if we're supposed to
-  if (!(initialAdd && this.fsw.options.ignoreInitial) && this.fsw._isntIgnored(file)) {
-    if (!this.fsw._throttle(EV_ADD, file, 0)) return;
-    this.fsw._emit(EV_ADD, file, stats);
-  }
-
-  return closer;
-}
-
-/**
- * Handle symlinks encountered while reading a dir.
- * @param {Object} entry returned by readdirp
- * @param {String} directory path of dir being read
- * @param {String} path of this item
- * @param {String} item basename of this item
- * @returns {Promise<Boolean>} true if no more processing is needed for this entry.
- */
-async _handleSymlink(entry, directory, path, item) {
-  if (this.fsw.closed) {
-    return;
-  }
-  const full = entry.fullPath;
-  const dir = this.fsw._getWatchedDir(directory);
-
-  if (!this.fsw.options.followSymlinks) {
-    // watch symlink directly (don't follow) and detect changes
-    this.fsw._incrReadyCount();
-
-    let linkPath;
-    try {
-      linkPath = await fsrealpath(path);
-    } catch (e) {
-      this.fsw._emitReady();
-      return true;
-    }
-
-    if (this.fsw.closed) return;
-    if (dir.has(item)) {
-      if (this.fsw._symlinkPaths.get(full) !== linkPath) {
-        this.fsw._symlinkPaths.set(full, linkPath);
-        this.fsw._emit(EV_CHANGE, path, entry.stats);
-      }
-    } else {
-      dir.add(item);
-      this.fsw._symlinkPaths.set(full, linkPath);
-      this.fsw._emit(EV_ADD, path, entry.stats);
-    }
-    this.fsw._emitReady();
-    return true;
-  }
-
-  // don't follow the same symlink more than once
-  if (this.fsw._symlinkPaths.has(full)) {
-    return true;
-  }
-
-  this.fsw._symlinkPaths.set(full, true);
-}
-
-_handleRead(directory, initialAdd, wh, target, dir, depth, throttler) {
-  // Normalize the directory name on Windows
-  directory = sysPath.join(directory, EMPTY_STR);
-
-  if (!wh.hasGlob) {
-    throttler = this.fsw._throttle('readdir', directory, 1000);
-    if (!throttler) return;
-  }
-
-  const previous = this.fsw._getWatchedDir(wh.path);
-  const current = new Set();
-
-  let stream = this.fsw._readdirp(directory, {
-    fileFilter: entry => wh.filterPath(entry),
-    directoryFilter: entry => wh.filterDir(entry),
-    depth: 0
-  }).on(STR_DATA, async (entry) => {
-    if (this.fsw.closed) {
-      stream = undefined;
-      return;
-    }
-    const item = entry.path;
-    let path = sysPath.join(directory, item);
-    current.add(item);
-
-    if (entry.stats.isSymbolicLink() && await this._handleSymlink(entry, directory, path, item)) {
-      return;
-    }
-
-    if (this.fsw.closed) {
-      stream = undefined;
-      return;
-    }
-    // Files that present in current directory snapshot
-    // but absent in previous are added to watch list and
-    // emit `add` event.
-    if (item === target || !target && !previous.has(item)) {
-      this.fsw._incrReadyCount();
-
-      // ensure relativeness of path is preserved in case of watcher reuse
-      path = sysPath.join(dir, sysPath.relative(dir, path));
-
-      this._addToNodeFs(path, initialAdd, wh, depth + 1);
-    }
-  }).on(EV_ERROR, this._boundHandleError);
-
-  return new Promise(resolve =>
-    stream.once(STR_END, () => {
-      if (this.fsw.closed) {
-        stream = undefined;
-        return;
-      }
-      const wasThrottled = throttler ? throttler.clear() : false;
-
-      resolve();
-
-      // Files that absent in current directory snapshot
-      // but present in previous emit `remove` event
-      // and are removed from @watched[directory].
-      previous.getChildren().filter((item) => {
-        return item !== directory &&
-          !current.has(item) &&
-          // in case of intersecting globs;
-          // a path may have been filtered out of this readdir, but
-          // shouldn't be removed because it matches a different glob
-          (!wh.hasGlob || wh.filterPath({
-            fullPath: sysPath.resolve(directory, item)
-          }));
-      }).forEach((item) => {
-        this.fsw._remove(directory, item);
-      });
-
-      stream = undefined;
-
-      // one more time for any missed in case changes came in extremely quickly
-      if (wasThrottled) this._handleRead(directory, false, wh, target, dir, depth, throttler);
-    })
-  );
-}
-
-/**
- * Read directory to add / remove files from `@watched` list and re-read it on change.
- * @param {String} dir fs path
- * @param {fs.Stats} stats
- * @param {Boolean} initialAdd
- * @param {Number} depth relative to user-supplied path
- * @param {String} target child path targeted for watch
- * @param {Object} wh Common watch helpers for this path
- * @param {String} realpath
- * @returns {Promise<Function>} closer for the watcher instance.
- */
-async _handleDir(dir, stats, initialAdd, depth, target, wh, realpath) {
-  const parentDir = this.fsw._getWatchedDir(sysPath.dirname(dir));
-  const tracked = parentDir.has(sysPath.basename(dir));
-  if (!(initialAdd && this.fsw.options.ignoreInitial) && !target && !tracked) {
-    if (!wh.hasGlob || wh.globFilter(dir)) this.fsw._emit(EV_ADD_DIR, dir, stats);
-  }
-
-  // ensure dir is tracked (harmless if redundant)
-  parentDir.add(sysPath.basename(dir));
-  this.fsw._getWatchedDir(dir);
-  let throttler;
-  let closer;
-
-  const oDepth = this.fsw.options.depth;
-  if ((oDepth == null || depth <= oDepth) && !this.fsw._symlinkPaths.has(realpath)) {
-    if (!target) {
-      await this._handleRead(dir, initialAdd, wh, target, dir, depth, throttler);
-      if (this.fsw.closed) return;
-    }
-
-    closer = this._watchWithNodeFs(dir, (dirPath, stats) => {
-      // if current directory is removed, do nothing
-      if (stats && stats.mtimeMs === 0) return;
-
-      this._handleRead(dirPath, false, wh, target, dir, depth, throttler);
-    });
-  }
-  return closer;
-}
-
-/**
- * Handle added file, directory, or glob pattern.
- * Delegates call to _handleFile / _handleDir after checks.
- * @param {String} path to file or ir
- * @param {Boolean} initialAdd was the file added at watch instantiation?
- * @param {Object} priorWh depth relative to user-supplied path
- * @param {Number} depth Child path actually targeted for watch
- * @param {String=} target Child path actually targeted for watch
- * @returns {Promise}
- */
-async _addToNodeFs(path, initialAdd, priorWh, depth, target) {
-  const ready = this.fsw._emitReady;
-  if (this.fsw._isIgnored(path) || this.fsw.closed) {
-    ready();
-    return false;
-  }
-
-  const wh = this.fsw._getWatchHelpers(path, depth);
-  if (!wh.hasGlob && priorWh) {
-    wh.hasGlob = priorWh.hasGlob;
-    wh.globFilter = priorWh.globFilter;
-    wh.filterPath = entry => priorWh.filterPath(entry);
-    wh.filterDir = entry => priorWh.filterDir(entry);
-  }
-
-  // evaluate what is at the path we're being asked to watch
-  try {
-    const stats = await statMethods[wh.statMethod](wh.watchPath);
-    if (this.fsw.closed) return;
-    if (this.fsw._isIgnored(wh.watchPath, stats)) {
-      ready();
-      return false;
-    }
-
-    const follow = this.fsw.options.followSymlinks && !path.includes(STAR) && !path.includes(BRACE_START);
-    let closer;
-    if (stats.isDirectory()) {
-      const absPath = sysPath.resolve(path);
-      const targetPath = follow ? await fsrealpath(path) : path;
-      if (this.fsw.closed) return;
-      closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth, target, wh, targetPath);
-      if (this.fsw.closed) return;
-      // preserve this symlink's target path
-      if (absPath !== targetPath && targetPath !== undefined) {
-        this.fsw._symlinkPaths.set(absPath, targetPath);
-      }
-    } else if (stats.isSymbolicLink()) {
-      const targetPath = follow ? await fsrealpath(path) : path;
-      if (this.fsw.closed) return;
-      const parent = sysPath.dirname(wh.watchPath);
-      this.fsw._getWatchedDir(parent).add(wh.watchPath);
-      this.fsw._emit(EV_ADD, wh.watchPath, stats);
-      closer = await this._handleDir(parent, stats, initialAdd, depth, path, wh, targetPath);
-      if (this.fsw.closed) return;
-
-      // preserve this symlink's target path
-      if (targetPath !== undefined) {
-        this.fsw._symlinkPaths.set(sysPath.resolve(path), targetPath);
-      }
-    } else {
-      closer = this._handleFile(wh.watchPath, stats, initialAdd);
-    }
-    ready();
-
-    this.fsw._addPathCloser(path, closer);
-    return false;
-
-  } catch (error) {
-    if (this.fsw._handleError(error)) {
-      ready();
-      return path;
-    }
-  }
-}
-
-}
-
-module.exports = NodeFsHandler;
diff --git a/node_modules/chokidar/package.json b/node_modules/chokidar/package.json
deleted file mode 100644
index e8f8b3d995e8ffbff13e0a5b8728c9dc769786a5..0000000000000000000000000000000000000000
--- a/node_modules/chokidar/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "name": "chokidar",
-  "description": "Minimal and efficient cross-platform file watching library",
-  "version": "3.6.0",
-  "homepage": "https://github.com/paulmillr/chokidar",
-  "author": "Paul Miller (https://paulmillr.com)",
-  "contributors": [
-    "Paul Miller (https://paulmillr.com)",
-    "Elan Shanker"
-  ],
-  "engines": {
-    "node": ">= 8.10.0"
-  },
-  "main": "index.js",
-  "types": "./types/index.d.ts",
-  "dependencies": {
-    "anymatch": "~3.1.2",
-    "braces": "~3.0.2",
-    "glob-parent": "~5.1.2",
-    "is-binary-path": "~2.1.0",
-    "is-glob": "~4.0.1",
-    "normalize-path": "~3.0.0",
-    "readdirp": "~3.6.0"
-  },
-  "optionalDependencies": {
-    "fsevents": "~2.3.2"
-  },
-  "devDependencies": {
-    "@types/node": "^14",
-    "chai": "^4.3",
-    "dtslint": "^3.3.0",
-    "eslint": "^7.0.0",
-    "mocha": "^7.0.0",
-    "rimraf": "^3.0.0",
-    "sinon": "^9.0.1",
-    "sinon-chai": "^3.3.0",
-    "typescript": "^4.4.3",
-    "upath": "^1.2.0"
-  },
-  "files": [
-    "index.js",
-    "lib/*.js",
-    "types/index.d.ts"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/paulmillr/chokidar.git"
-  },
-  "bugs": {
-    "url": "https://github.com/paulmillr/chokidar/issues"
-  },
-  "license": "MIT",
-  "scripts": {
-    "dtslint": "dtslint types",
-    "lint": "eslint --report-unused-disable-directives --ignore-path .gitignore .",
-    "build": "npm ls",
-    "mocha": "mocha --exit --timeout 90000",
-    "test": "npm run lint && npm run mocha"
-  },
-  "keywords": [
-    "fs",
-    "watch",
-    "watchFile",
-    "watcher",
-    "watching",
-    "file",
-    "fsevents"
-  ],
-  "funding": "https://paulmillr.com/funding/"
-}
diff --git a/node_modules/chokidar/types/index.d.ts b/node_modules/chokidar/types/index.d.ts
deleted file mode 100644
index 455806638f66a19245cb7eb5dc9e416ec681a6bc..0000000000000000000000000000000000000000
--- a/node_modules/chokidar/types/index.d.ts
+++ /dev/null
@@ -1,192 +0,0 @@
-// TypeScript Version: 3.0
-
-/// <reference types="node" />
-
-import * as fs from "fs";
-import { EventEmitter } from "events";
-import { Matcher } from 'anymatch';
-
-export class FSWatcher extends EventEmitter implements fs.FSWatcher {
-  options: WatchOptions;
-
-  /**
-   * Constructs a new FSWatcher instance with optional WatchOptions parameter.
-   */
-  constructor(options?: WatchOptions);
-
-  /**
-   * Add files, directories, or glob patterns for tracking. Takes an array of strings or just one
-   * string.
-   */
-  add(paths: string | ReadonlyArray<string>): this;
-
-  /**
-   * Stop watching files, directories, or glob patterns. Takes an array of strings or just one
-   * string.
-   */
-  unwatch(paths: string | ReadonlyArray<string>): this;
-
-  /**
-   * Returns an object representing all the paths on the file system being watched by this
-   * `FSWatcher` instance. The object's keys are all the directories (using absolute paths unless
-   * the `cwd` option was used), and the values are arrays of the names of the items contained in
-   * each directory.
-   */
-  getWatched(): {
-    [directory: string]: string[];
-  };
-
-  /**
-   * Removes all listeners from watched files.
-   */
-  close(): Promise<void>;
-
-  on(event: 'add'|'addDir'|'change', listener: (path: string, stats?: fs.Stats) => void): this;
-
-  on(event: 'all', listener: (eventName: 'add'|'addDir'|'change'|'unlink'|'unlinkDir', path: string, stats?: fs.Stats) => void): this;
-
-  /**
-   * Error occurred
-   */
-  on(event: 'error', listener: (error: Error) => void): this;
-
-  /**
-   * Exposes the native Node `fs.FSWatcher events`
-   */
-  on(event: 'raw', listener: (eventName: string, path: string, details: any) => void): this;
-
-  /**
-   * Fires when the initial scan is complete
-   */
-  on(event: 'ready', listener: () => void): this;
-
-  on(event: 'unlink'|'unlinkDir', listener: (path: string) => void): this;
-
-  on(event: string, listener: (...args: any[]) => void): this;
-
-  ref(): this;
-  
-  unref(): this;
-}
-
-export interface WatchOptions {
-  /**
-   * Indicates whether the process should continue to run as long as files are being watched. If
-   * set to `false` when using `fsevents` to watch, no more events will be emitted after `ready`,
-   * even if the process continues to run.
-   */
-  persistent?: boolean;
-
-  /**
-   * ([anymatch](https://github.com/micromatch/anymatch)-compatible definition) Defines files/paths to
-   * be ignored. The whole relative or absolute path is tested, not just filename. If a function
-   * with two arguments is provided, it gets called twice per path - once with a single argument
-   * (the path), second time with two arguments (the path and the
-   * [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object of that path).
-   */
-  ignored?: Matcher;
-
-  /**
-   * If set to `false` then `add`/`addDir` events are also emitted for matching paths while
-   * instantiating the watching as chokidar discovers these file paths (before the `ready` event).
-   */
-  ignoreInitial?: boolean;
-
-  /**
-   * When `false`, only the symlinks themselves will be watched for changes instead of following
-   * the link references and bubbling events through the link's path.
-   */
-  followSymlinks?: boolean;
-
-  /**
-   * The base directory from which watch `paths` are to be derived. Paths emitted with events will
-   * be relative to this.
-   */
-  cwd?: string;
-
-  /**
-   *  If set to true then the strings passed to .watch() and .add() are treated as literal path
-   *  names, even if they look like globs. Default: false.
-   */
-  disableGlobbing?: boolean;
-
-  /**
-   * Whether to use fs.watchFile (backed by polling), or fs.watch. If polling leads to high CPU
-   * utilization, consider setting this to `false`. It is typically necessary to **set this to
-   * `true` to successfully watch files over a network**, and it may be necessary to successfully
-   * watch files in other non-standard situations. Setting to `true` explicitly on OS X overrides
-   * the `useFsEvents` default.
-   */
-  usePolling?: boolean;
-
-  /**
-   * Whether to use the `fsevents` watching interface if available. When set to `true` explicitly
-   * and `fsevents` is available this supercedes the `usePolling` setting. When set to `false` on
-   * OS X, `usePolling: true` becomes the default.
-   */
-  useFsEvents?: boolean;
-
-  /**
-   * If relying upon the [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object that
-   * may get passed with `add`, `addDir`, and `change` events, set this to `true` to ensure it is
-   * provided even in cases where it wasn't already available from the underlying watch events.
-   */
-  alwaysStat?: boolean;
-
-  /**
-   * If set, limits how many levels of subdirectories will be traversed.
-   */
-  depth?: number;
-
-  /**
-   * Interval of file system polling.
-   */
-  interval?: number;
-
-  /**
-   * Interval of file system polling for binary files. ([see list of binary extensions](https://gi
-   * thub.com/sindresorhus/binary-extensions/blob/master/binary-extensions.json))
-   */
-  binaryInterval?: number;
-
-  /**
-   *  Indicates whether to watch files that don't have read permissions if possible. If watching
-   *  fails due to `EPERM` or `EACCES` with this set to `true`, the errors will be suppressed
-   *  silently.
-   */
-  ignorePermissionErrors?: boolean;
-
-  /**
-   * `true` if `useFsEvents` and `usePolling` are `false`). Automatically filters out artifacts
-   * that occur when using editors that use "atomic writes" instead of writing directly to the
-   * source file. If a file is re-added within 100 ms of being deleted, Chokidar emits a `change`
-   * event rather than `unlink` then `add`. If the default of 100 ms does not work well for you,
-   * you can override it by setting `atomic` to a custom value, in milliseconds.
-   */
-  atomic?: boolean | number;
-
-  /**
-   * can be set to an object in order to adjust timing params:
-   */
-  awaitWriteFinish?: AwaitWriteFinishOptions | boolean;
-}
-
-export interface AwaitWriteFinishOptions {
-  /**
-   * Amount of time in milliseconds for a file size to remain constant before emitting its event.
-   */
-  stabilityThreshold?: number;
-
-  /**
-   * File size polling interval.
-   */
-  pollInterval?: number;
-}
-
-/**
- * produces an instance of `FSWatcher`.
- */
-export function watch(
-  paths: string | ReadonlyArray<string>,
-  options?: WatchOptions
-): FSWatcher;
diff --git a/node_modules/concat-map/.travis.yml b/node_modules/concat-map/.travis.yml
deleted file mode 100644
index f1d0f13c8a54d0f8d78f86a1f9348f3c59750694..0000000000000000000000000000000000000000
--- a/node_modules/concat-map/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
-  - 0.4
-  - 0.6
diff --git a/node_modules/concat-map/LICENSE b/node_modules/concat-map/LICENSE
deleted file mode 100644
index ee27ba4b4412b0e4a05af5e3d8a005bc6681fdf3..0000000000000000000000000000000000000000
--- a/node_modules/concat-map/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-This software is released under the MIT license:
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/concat-map/README.markdown b/node_modules/concat-map/README.markdown
deleted file mode 100644
index 408f70a1be473c86e729fe8cc1d5fb4e0e364ce9..0000000000000000000000000000000000000000
--- a/node_modules/concat-map/README.markdown
+++ /dev/null
@@ -1,62 +0,0 @@
-concat-map
-==========
-
-Concatenative mapdashery.
-
-[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map)
-
-[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map)
-
-example
-=======
-
-``` js
-var concatMap = require('concat-map');
-var xs = [ 1, 2, 3, 4, 5, 6 ];
-var ys = concatMap(xs, function (x) {
-    return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
-});
-console.dir(ys);
-```
-
-***
-
-```
-[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]
-```
-
-methods
-=======
-
-``` js
-var concatMap = require('concat-map')
-```
-
-concatMap(xs, fn)
------------------
-
-Return an array of concatenated elements by calling `fn(x, i)` for each element
-`x` and each index `i` in the array `xs`.
-
-When `fn(x, i)` returns an array, its result will be concatenated with the
-result array. If `fn(x, i)` returns anything else, that value will be pushed
-onto the end of the result array.
-
-install
-=======
-
-With [npm](http://npmjs.org) do:
-
-```
-npm install concat-map
-```
-
-license
-=======
-
-MIT
-
-notes
-=====
-
-This module was written while sitting high above the ground in a tree.
diff --git a/node_modules/concat-map/example/map.js b/node_modules/concat-map/example/map.js
deleted file mode 100644
index 33656217b61d8f06a55db4631ec95eea828495d2..0000000000000000000000000000000000000000
--- a/node_modules/concat-map/example/map.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var concatMap = require('../');
-var xs = [ 1, 2, 3, 4, 5, 6 ];
-var ys = concatMap(xs, function (x) {
-    return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
-});
-console.dir(ys);
diff --git a/node_modules/concat-map/index.js b/node_modules/concat-map/index.js
deleted file mode 100644
index b29a7812e5055ae915e771447e1380e01bf3bfdd..0000000000000000000000000000000000000000
--- a/node_modules/concat-map/index.js
+++ /dev/null
@@ -1,13 +0,0 @@
-module.exports = function (xs, fn) {
-    var res = [];
-    for (var i = 0; i < xs.length; i++) {
-        var x = fn(xs[i], i);
-        if (isArray(x)) res.push.apply(res, x);
-        else res.push(x);
-    }
-    return res;
-};
-
-var isArray = Array.isArray || function (xs) {
-    return Object.prototype.toString.call(xs) === '[object Array]';
-};
diff --git a/node_modules/concat-map/package.json b/node_modules/concat-map/package.json
deleted file mode 100644
index d3640e6b027b9ea87afbfd361ca12fc05cca0e9c..0000000000000000000000000000000000000000
--- a/node_modules/concat-map/package.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
-    "name" : "concat-map",
-    "description" : "concatenative mapdashery",
-    "version" : "0.0.1",
-    "repository" : {
-        "type" : "git",
-        "url" : "git://github.com/substack/node-concat-map.git"
-    },
-    "main" : "index.js",
-    "keywords" : [
-        "concat",
-        "concatMap",
-        "map",
-        "functional",
-        "higher-order"
-    ],
-    "directories" : {
-        "example" : "example",
-        "test" : "test"
-    },
-    "scripts" : {
-        "test" : "tape test/*.js"
-    },
-    "devDependencies" : {
-        "tape" : "~2.4.0"
-    },
-    "license" : "MIT",
-    "author" : {
-        "name" : "James Halliday",
-        "email" : "mail@substack.net",
-        "url" : "http://substack.net"
-    },
-    "testling" : {
-        "files" : "test/*.js",
-        "browsers" : {
-            "ie" : [ 6, 7, 8, 9 ],
-            "ff" : [ 3.5, 10, 15.0 ],
-            "chrome" : [ 10, 22 ],
-            "safari" : [ 5.1 ],
-            "opera" : [ 12 ]
-        }
-    }
-}
diff --git a/node_modules/concat-map/test/map.js b/node_modules/concat-map/test/map.js
deleted file mode 100644
index fdbd7022f6da17600dad4d477734115bf28287e0..0000000000000000000000000000000000000000
--- a/node_modules/concat-map/test/map.js
+++ /dev/null
@@ -1,39 +0,0 @@
-var concatMap = require('../');
-var test = require('tape');
-
-test('empty or not', function (t) {
-    var xs = [ 1, 2, 3, 4, 5, 6 ];
-    var ixes = [];
-    var ys = concatMap(xs, function (x, ix) {
-        ixes.push(ix);
-        return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
-    });
-    t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]);
-    t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]);
-    t.end();
-});
-
-test('always something', function (t) {
-    var xs = [ 'a', 'b', 'c', 'd' ];
-    var ys = concatMap(xs, function (x) {
-        return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ];
-    });
-    t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
-    t.end();
-});
-
-test('scalars', function (t) {
-    var xs = [ 'a', 'b', 'c', 'd' ];
-    var ys = concatMap(xs, function (x) {
-        return x === 'b' ? [ 'B', 'B', 'B' ] : x;
-    });
-    t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
-    t.end();
-});
-
-test('undefs', function (t) {
-    var xs = [ 'a', 'b', 'c', 'd' ];
-    var ys = concatMap(xs, function () {});
-    t.same(ys, [ undefined, undefined, undefined, undefined ]);
-    t.end();
-});
diff --git a/node_modules/content-disposition/HISTORY.md b/node_modules/content-disposition/HISTORY.md
deleted file mode 100644
index 488effa0c9440f4e214102980665781a62ba7059..0000000000000000000000000000000000000000
--- a/node_modules/content-disposition/HISTORY.md
+++ /dev/null
@@ -1,60 +0,0 @@
-0.5.4 / 2021-12-10
-==================
-
-  * deps: safe-buffer@5.2.1
-
-0.5.3 / 2018-12-17
-==================
-
-  * Use `safe-buffer` for improved Buffer API
-
-0.5.2 / 2016-12-08
-==================
-
-  * Fix `parse` to accept any linear whitespace character
-
-0.5.1 / 2016-01-17
-==================
-
-  * perf: enable strict mode
-
-0.5.0 / 2014-10-11
-==================
-
-  * Add `parse` function
-
-0.4.0 / 2014-09-21
-==================
-
-  * Expand non-Unicode `filename` to the full ISO-8859-1 charset
-
-0.3.0 / 2014-09-20
-==================
-
-  * Add `fallback` option
-  * Add `type` option
-
-0.2.0 / 2014-09-19
-==================
-
-  * Reduce ambiguity of file names with hex escape in buggy browsers
-
-0.1.2 / 2014-09-19
-==================
-
-  * Fix periodic invalid Unicode filename header
-
-0.1.1 / 2014-09-19
-==================
-
-  * Fix invalid characters appearing in `filename*` parameter
-
-0.1.0 / 2014-09-18
-==================
-
-  * Make the `filename` argument optional
-
-0.0.0 / 2014-09-18
-==================
-
-  * Initial release
diff --git a/node_modules/content-disposition/LICENSE b/node_modules/content-disposition/LICENSE
deleted file mode 100644
index 84441fbb5709262c2bfc9b5ff0166ad4f024a1b8..0000000000000000000000000000000000000000
--- a/node_modules/content-disposition/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014-2017 Douglas Christopher Wilson
-
-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/content-disposition/README.md b/node_modules/content-disposition/README.md
deleted file mode 100644
index 3a0bb055949cdaed008f0f85e111624214213873..0000000000000000000000000000000000000000
--- a/node_modules/content-disposition/README.md
+++ /dev/null
@@ -1,142 +0,0 @@
-# content-disposition
-
-[![NPM Version][npm-image]][npm-url]
-[![NPM Downloads][downloads-image]][downloads-url]
-[![Node.js Version][node-version-image]][node-version-url]
-[![Build Status][github-actions-ci-image]][github-actions-ci-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-Create and parse HTTP `Content-Disposition` header
-
-## Installation
-
-```sh
-$ npm install content-disposition
-```
-
-## API
-
-```js
-var contentDisposition = require('content-disposition')
-```
-
-### contentDisposition(filename, options)
-
-Create an attachment `Content-Disposition` header value using the given file name,
-if supplied. The `filename` is optional and if no file name is desired, but you
-want to specify `options`, set `filename` to `undefined`.
-
-```js
-res.setHeader('Content-Disposition', contentDisposition('∫ maths.pdf'))
-```
-
-**note** HTTP headers are of the ISO-8859-1 character set. If you are writing this
-header through a means different from `setHeader` in Node.js, you'll want to specify
-the `'binary'` encoding in Node.js.
-
-#### Options
-
-`contentDisposition` accepts these properties in the options object.
-
-##### fallback
-
-If the `filename` option is outside ISO-8859-1, then the file name is actually
-stored in a supplemental field for clients that support Unicode file names and
-a ISO-8859-1 version of the file name is automatically generated.
-
-This specifies the ISO-8859-1 file name to override the automatic generation or
-disables the generation all together, defaults to `true`.
-
-  - A string will specify the ISO-8859-1 file name to use in place of automatic
-    generation.
-  - `false` will disable including a ISO-8859-1 file name and only include the
-    Unicode version (unless the file name is already ISO-8859-1).
-  - `true` will enable automatic generation if the file name is outside ISO-8859-1.
-
-If the `filename` option is ISO-8859-1 and this option is specified and has a
-different value, then the `filename` option is encoded in the extended field
-and this set as the fallback field, even though they are both ISO-8859-1.
-
-##### type
-
-Specifies the disposition type, defaults to `"attachment"`. This can also be
-`"inline"`, or any other value (all values except inline are treated like
-`attachment`, but can convey additional information if both parties agree to
-it). The type is normalized to lower-case.
-
-### contentDisposition.parse(string)
-
-```js
-var disposition = contentDisposition.parse('attachment; filename="EURO rates.txt"; filename*=UTF-8\'\'%e2%82%ac%20rates.txt')
-```
-
-Parse a `Content-Disposition` header string. This automatically handles extended
-("Unicode") parameters by decoding them and providing them under the standard
-parameter name. This will return an object with the following properties (examples
-are shown for the string `'attachment; filename="EURO rates.txt"; filename*=UTF-8\'\'%e2%82%ac%20rates.txt'`):
-
- - `type`: The disposition type (always lower case). Example: `'attachment'`
-
- - `parameters`: An object of the parameters in the disposition (name of parameter
-   always lower case and extended versions replace non-extended versions). Example:
-   `{filename: "€ rates.txt"}`
-
-## Examples
-
-### Send a file for download
-
-```js
-var contentDisposition = require('content-disposition')
-var destroy = require('destroy')
-var fs = require('fs')
-var http = require('http')
-var onFinished = require('on-finished')
-
-var filePath = '/path/to/public/plans.pdf'
-
-http.createServer(function onRequest (req, res) {
-  // set headers
-  res.setHeader('Content-Type', 'application/pdf')
-  res.setHeader('Content-Disposition', contentDisposition(filePath))
-
-  // send file
-  var stream = fs.createReadStream(filePath)
-  stream.pipe(res)
-  onFinished(res, function () {
-    destroy(stream)
-  })
-})
-```
-
-## Testing
-
-```sh
-$ npm test
-```
-
-## References
-
-- [RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1][rfc-2616]
-- [RFC 5987: Character Set and Language Encoding for Hypertext Transfer Protocol (HTTP) Header Field Parameters][rfc-5987]
-- [RFC 6266: Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)][rfc-6266]
-- [Test Cases for HTTP Content-Disposition header field (RFC 6266) and the Encodings defined in RFCs 2047, 2231 and 5987][tc-2231]
-
-[rfc-2616]: https://tools.ietf.org/html/rfc2616
-[rfc-5987]: https://tools.ietf.org/html/rfc5987
-[rfc-6266]: https://tools.ietf.org/html/rfc6266
-[tc-2231]: http://greenbytes.de/tech/tc2231/
-
-## License
-
-[MIT](LICENSE)
-
-[npm-image]: https://img.shields.io/npm/v/content-disposition.svg
-[npm-url]: https://npmjs.org/package/content-disposition
-[node-version-image]: https://img.shields.io/node/v/content-disposition.svg
-[node-version-url]: https://nodejs.org/en/download
-[coveralls-image]: https://img.shields.io/coveralls/jshttp/content-disposition.svg
-[coveralls-url]: https://coveralls.io/r/jshttp/content-disposition?branch=master
-[downloads-image]: https://img.shields.io/npm/dm/content-disposition.svg
-[downloads-url]: https://npmjs.org/package/content-disposition
-[github-actions-ci-image]: https://img.shields.io/github/workflow/status/jshttp/content-disposition/ci/master?label=ci
-[github-actions-ci-url]: https://github.com/jshttp/content-disposition?query=workflow%3Aci
diff --git a/node_modules/content-disposition/index.js b/node_modules/content-disposition/index.js
deleted file mode 100644
index ecec899a992d46f2e903a87475b1c342f2ce4d30..0000000000000000000000000000000000000000
--- a/node_modules/content-disposition/index.js
+++ /dev/null
@@ -1,458 +0,0 @@
-/*!
- * content-disposition
- * Copyright(c) 2014-2017 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = contentDisposition
-module.exports.parse = parse
-
-/**
- * Module dependencies.
- * @private
- */
-
-var basename = require('path').basename
-var Buffer = require('safe-buffer').Buffer
-
-/**
- * RegExp to match non attr-char, *after* encodeURIComponent (i.e. not including "%")
- * @private
- */
-
-var ENCODE_URL_ATTR_CHAR_REGEXP = /[\x00-\x20"'()*,/:;<=>?@[\\\]{}\x7f]/g // eslint-disable-line no-control-regex
-
-/**
- * RegExp to match percent encoding escape.
- * @private
- */
-
-var HEX_ESCAPE_REGEXP = /%[0-9A-Fa-f]{2}/
-var HEX_ESCAPE_REPLACE_REGEXP = /%([0-9A-Fa-f]{2})/g
-
-/**
- * RegExp to match non-latin1 characters.
- * @private
- */
-
-var NON_LATIN1_REGEXP = /[^\x20-\x7e\xa0-\xff]/g
-
-/**
- * RegExp to match quoted-pair in RFC 2616
- *
- * quoted-pair = "\" CHAR
- * CHAR        = <any US-ASCII character (octets 0 - 127)>
- * @private
- */
-
-var QESC_REGEXP = /\\([\u0000-\u007f])/g // eslint-disable-line no-control-regex
-
-/**
- * RegExp to match chars that must be quoted-pair in RFC 2616
- * @private
- */
-
-var QUOTE_REGEXP = /([\\"])/g
-
-/**
- * RegExp for various RFC 2616 grammar
- *
- * parameter     = token "=" ( token | quoted-string )
- * token         = 1*<any CHAR except CTLs or separators>
- * separators    = "(" | ")" | "<" | ">" | "@"
- *               | "," | ";" | ":" | "\" | <">
- *               | "/" | "[" | "]" | "?" | "="
- *               | "{" | "}" | SP | HT
- * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> )
- * qdtext        = <any TEXT except <">>
- * quoted-pair   = "\" CHAR
- * CHAR          = <any US-ASCII character (octets 0 - 127)>
- * TEXT          = <any OCTET except CTLs, but including LWS>
- * LWS           = [CRLF] 1*( SP | HT )
- * CRLF          = CR LF
- * CR            = <US-ASCII CR, carriage return (13)>
- * LF            = <US-ASCII LF, linefeed (10)>
- * SP            = <US-ASCII SP, space (32)>
- * HT            = <US-ASCII HT, horizontal-tab (9)>
- * CTL           = <any US-ASCII control character (octets 0 - 31) and DEL (127)>
- * OCTET         = <any 8-bit sequence of data>
- * @private
- */
-
-var PARAM_REGEXP = /;[\x09\x20]*([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*=[\x09\x20]*("(?:[\x20!\x23-\x5b\x5d-\x7e\x80-\xff]|\\[\x20-\x7e])*"|[!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*/g // eslint-disable-line no-control-regex
-var TEXT_REGEXP = /^[\x20-\x7e\x80-\xff]+$/
-var TOKEN_REGEXP = /^[!#$%&'*+.0-9A-Z^_`a-z|~-]+$/
-
-/**
- * RegExp for various RFC 5987 grammar
- *
- * ext-value     = charset  "'" [ language ] "'" value-chars
- * charset       = "UTF-8" / "ISO-8859-1" / mime-charset
- * mime-charset  = 1*mime-charsetc
- * mime-charsetc = ALPHA / DIGIT
- *               / "!" / "#" / "$" / "%" / "&"
- *               / "+" / "-" / "^" / "_" / "`"
- *               / "{" / "}" / "~"
- * language      = ( 2*3ALPHA [ extlang ] )
- *               / 4ALPHA
- *               / 5*8ALPHA
- * extlang       = *3( "-" 3ALPHA )
- * value-chars   = *( pct-encoded / attr-char )
- * pct-encoded   = "%" HEXDIG HEXDIG
- * attr-char     = ALPHA / DIGIT
- *               / "!" / "#" / "$" / "&" / "+" / "-" / "."
- *               / "^" / "_" / "`" / "|" / "~"
- * @private
- */
-
-var EXT_VALUE_REGEXP = /^([A-Za-z0-9!#$%&+\-^_`{}~]+)'(?:[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}|[A-Za-z]{4,8}|)'((?:%[0-9A-Fa-f]{2}|[A-Za-z0-9!#$&+.^_`|~-])+)$/
-
-/**
- * RegExp for various RFC 6266 grammar
- *
- * disposition-type = "inline" | "attachment" | disp-ext-type
- * disp-ext-type    = token
- * disposition-parm = filename-parm | disp-ext-parm
- * filename-parm    = "filename" "=" value
- *                  | "filename*" "=" ext-value
- * disp-ext-parm    = token "=" value
- *                  | ext-token "=" ext-value
- * ext-token        = <the characters in token, followed by "*">
- * @private
- */
-
-var DISPOSITION_TYPE_REGEXP = /^([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*(?:$|;)/ // eslint-disable-line no-control-regex
-
-/**
- * Create an attachment Content-Disposition header.
- *
- * @param {string} [filename]
- * @param {object} [options]
- * @param {string} [options.type=attachment]
- * @param {string|boolean} [options.fallback=true]
- * @return {string}
- * @public
- */
-
-function contentDisposition (filename, options) {
-  var opts = options || {}
-
-  // get type
-  var type = opts.type || 'attachment'
-
-  // get parameters
-  var params = createparams(filename, opts.fallback)
-
-  // format into string
-  return format(new ContentDisposition(type, params))
-}
-
-/**
- * Create parameters object from filename and fallback.
- *
- * @param {string} [filename]
- * @param {string|boolean} [fallback=true]
- * @return {object}
- * @private
- */
-
-function createparams (filename, fallback) {
-  if (filename === undefined) {
-    return
-  }
-
-  var params = {}
-
-  if (typeof filename !== 'string') {
-    throw new TypeError('filename must be a string')
-  }
-
-  // fallback defaults to true
-  if (fallback === undefined) {
-    fallback = true
-  }
-
-  if (typeof fallback !== 'string' && typeof fallback !== 'boolean') {
-    throw new TypeError('fallback must be a string or boolean')
-  }
-
-  if (typeof fallback === 'string' && NON_LATIN1_REGEXP.test(fallback)) {
-    throw new TypeError('fallback must be ISO-8859-1 string')
-  }
-
-  // restrict to file base name
-  var name = basename(filename)
-
-  // determine if name is suitable for quoted string
-  var isQuotedString = TEXT_REGEXP.test(name)
-
-  // generate fallback name
-  var fallbackName = typeof fallback !== 'string'
-    ? fallback && getlatin1(name)
-    : basename(fallback)
-  var hasFallback = typeof fallbackName === 'string' && fallbackName !== name
-
-  // set extended filename parameter
-  if (hasFallback || !isQuotedString || HEX_ESCAPE_REGEXP.test(name)) {
-    params['filename*'] = name
-  }
-
-  // set filename parameter
-  if (isQuotedString || hasFallback) {
-    params.filename = hasFallback
-      ? fallbackName
-      : name
-  }
-
-  return params
-}
-
-/**
- * Format object to Content-Disposition header.
- *
- * @param {object} obj
- * @param {string} obj.type
- * @param {object} [obj.parameters]
- * @return {string}
- * @private
- */
-
-function format (obj) {
-  var parameters = obj.parameters
-  var type = obj.type
-
-  if (!type || typeof type !== 'string' || !TOKEN_REGEXP.test(type)) {
-    throw new TypeError('invalid type')
-  }
-
-  // start with normalized type
-  var string = String(type).toLowerCase()
-
-  // append parameters
-  if (parameters && typeof parameters === 'object') {
-    var param
-    var params = Object.keys(parameters).sort()
-
-    for (var i = 0; i < params.length; i++) {
-      param = params[i]
-
-      var val = param.substr(-1) === '*'
-        ? ustring(parameters[param])
-        : qstring(parameters[param])
-
-      string += '; ' + param + '=' + val
-    }
-  }
-
-  return string
-}
-
-/**
- * Decode a RFC 5987 field value (gracefully).
- *
- * @param {string} str
- * @return {string}
- * @private
- */
-
-function decodefield (str) {
-  var match = EXT_VALUE_REGEXP.exec(str)
-
-  if (!match) {
-    throw new TypeError('invalid extended field value')
-  }
-
-  var charset = match[1].toLowerCase()
-  var encoded = match[2]
-  var value
-
-  // to binary string
-  var binary = encoded.replace(HEX_ESCAPE_REPLACE_REGEXP, pdecode)
-
-  switch (charset) {
-    case 'iso-8859-1':
-      value = getlatin1(binary)
-      break
-    case 'utf-8':
-      value = Buffer.from(binary, 'binary').toString('utf8')
-      break
-    default:
-      throw new TypeError('unsupported charset in extended field')
-  }
-
-  return value
-}
-
-/**
- * Get ISO-8859-1 version of string.
- *
- * @param {string} val
- * @return {string}
- * @private
- */
-
-function getlatin1 (val) {
-  // simple Unicode -> ISO-8859-1 transformation
-  return String(val).replace(NON_LATIN1_REGEXP, '?')
-}
-
-/**
- * Parse Content-Disposition header string.
- *
- * @param {string} string
- * @return {object}
- * @public
- */
-
-function parse (string) {
-  if (!string || typeof string !== 'string') {
-    throw new TypeError('argument string is required')
-  }
-
-  var match = DISPOSITION_TYPE_REGEXP.exec(string)
-
-  if (!match) {
-    throw new TypeError('invalid type format')
-  }
-
-  // normalize type
-  var index = match[0].length
-  var type = match[1].toLowerCase()
-
-  var key
-  var names = []
-  var params = {}
-  var value
-
-  // calculate index to start at
-  index = PARAM_REGEXP.lastIndex = match[0].substr(-1) === ';'
-    ? index - 1
-    : index
-
-  // match parameters
-  while ((match = PARAM_REGEXP.exec(string))) {
-    if (match.index !== index) {
-      throw new TypeError('invalid parameter format')
-    }
-
-    index += match[0].length
-    key = match[1].toLowerCase()
-    value = match[2]
-
-    if (names.indexOf(key) !== -1) {
-      throw new TypeError('invalid duplicate parameter')
-    }
-
-    names.push(key)
-
-    if (key.indexOf('*') + 1 === key.length) {
-      // decode extended value
-      key = key.slice(0, -1)
-      value = decodefield(value)
-
-      // overwrite existing value
-      params[key] = value
-      continue
-    }
-
-    if (typeof params[key] === 'string') {
-      continue
-    }
-
-    if (value[0] === '"') {
-      // remove quotes and escapes
-      value = value
-        .substr(1, value.length - 2)
-        .replace(QESC_REGEXP, '$1')
-    }
-
-    params[key] = value
-  }
-
-  if (index !== -1 && index !== string.length) {
-    throw new TypeError('invalid parameter format')
-  }
-
-  return new ContentDisposition(type, params)
-}
-
-/**
- * Percent decode a single character.
- *
- * @param {string} str
- * @param {string} hex
- * @return {string}
- * @private
- */
-
-function pdecode (str, hex) {
-  return String.fromCharCode(parseInt(hex, 16))
-}
-
-/**
- * Percent encode a single character.
- *
- * @param {string} char
- * @return {string}
- * @private
- */
-
-function pencode (char) {
-  return '%' + String(char)
-    .charCodeAt(0)
-    .toString(16)
-    .toUpperCase()
-}
-
-/**
- * Quote a string for HTTP.
- *
- * @param {string} val
- * @return {string}
- * @private
- */
-
-function qstring (val) {
-  var str = String(val)
-
-  return '"' + str.replace(QUOTE_REGEXP, '\\$1') + '"'
-}
-
-/**
- * Encode a Unicode string for HTTP (RFC 5987).
- *
- * @param {string} val
- * @return {string}
- * @private
- */
-
-function ustring (val) {
-  var str = String(val)
-
-  // percent encode as UTF-8
-  var encoded = encodeURIComponent(str)
-    .replace(ENCODE_URL_ATTR_CHAR_REGEXP, pencode)
-
-  return 'UTF-8\'\'' + encoded
-}
-
-/**
- * Class for parsed Content-Disposition header for v8 optimization
- *
- * @public
- * @param {string} type
- * @param {object} parameters
- * @constructor
- */
-
-function ContentDisposition (type, parameters) {
-  this.type = type
-  this.parameters = parameters
-}
diff --git a/node_modules/content-disposition/package.json b/node_modules/content-disposition/package.json
deleted file mode 100644
index 43c70ce24a45a9a8f9eec7c6b6a30e0324d3078d..0000000000000000000000000000000000000000
--- a/node_modules/content-disposition/package.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "name": "content-disposition",
-  "description": "Create and parse Content-Disposition header",
-  "version": "0.5.4",
-  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
-  "license": "MIT",
-  "keywords": [
-    "content-disposition",
-    "http",
-    "rfc6266",
-    "res"
-  ],
-  "repository": "jshttp/content-disposition",
-  "dependencies": {
-    "safe-buffer": "5.2.1"
-  },
-  "devDependencies": {
-    "deep-equal": "1.0.1",
-    "eslint": "7.32.0",
-    "eslint-config-standard": "13.0.1",
-    "eslint-plugin-import": "2.25.3",
-    "eslint-plugin-markdown": "2.2.1",
-    "eslint-plugin-node": "11.1.0",
-    "eslint-plugin-promise": "5.2.0",
-    "eslint-plugin-standard": "4.1.0",
-    "istanbul": "0.4.5",
-    "mocha": "9.1.3"
-  },
-  "files": [
-    "LICENSE",
-    "HISTORY.md",
-    "README.md",
-    "index.js"
-  ],
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "scripts": {
-    "lint": "eslint .",
-    "test": "mocha --reporter spec --bail --check-leaks test/",
-    "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/",
-    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/"
-  }
-}
diff --git a/node_modules/cookie-signature/.npmignore b/node_modules/cookie-signature/.npmignore
deleted file mode 100644
index f1250e584c94b80208b61cf7cae29db8e486a5c7..0000000000000000000000000000000000000000
--- a/node_modules/cookie-signature/.npmignore
+++ /dev/null
@@ -1,4 +0,0 @@
-support
-test
-examples
-*.sock
diff --git a/node_modules/cookie-signature/History.md b/node_modules/cookie-signature/History.md
index 78513cc3d28ce3516c93b4d425f83df247486ae5..bcf8cc95604c9aa3254d148150494f566ddc0a79 100644
--- a/node_modules/cookie-signature/History.md
+++ b/node_modules/cookie-signature/History.md
@@ -1,10 +1,14 @@
+1.0.7 / 2023-04-12
+==================
+
+* backport the buffer support from the 1.2.x release branch (thanks @FadhiliNjagi!)
+
 1.0.6 / 2015-02-03
 ==================
 
 * use `npm test` instead of `make test` to run tests
 * clearer assertion messages when checking input
 
-
 1.0.5 / 2014-09-05
 ==================
 
diff --git a/node_modules/cookie-signature/index.js b/node_modules/cookie-signature/index.js
index b8c9463a238b7ec090ff9090234e3f34322a36df..336d487f827356b0934e09a4c618f05761af7136 100644
--- a/node_modules/cookie-signature/index.js
+++ b/node_modules/cookie-signature/index.js
@@ -8,14 +8,14 @@ var crypto = require('crypto');
  * Sign the given `val` with `secret`.
  *
  * @param {String} val
- * @param {String} secret
+ * @param {String|NodeJS.ArrayBufferView|crypto.KeyObject} secret
  * @return {String}
  * @api private
  */
 
 exports.sign = function(val, secret){
-  if ('string' != typeof val) throw new TypeError("Cookie value must be provided as a string.");
-  if ('string' != typeof secret) throw new TypeError("Secret string must be provided.");
+  if ('string' !== typeof val) throw new TypeError("Cookie value must be provided as a string.");
+  if (null == secret) throw new TypeError("Secret key must be provided.");
   return val + '.' + crypto
     .createHmac('sha256', secret)
     .update(val)
@@ -28,14 +28,14 @@ exports.sign = function(val, secret){
  * returning `false` if the signature is invalid.
  *
  * @param {String} val
- * @param {String} secret
+ * @param {String|NodeJS.ArrayBufferView|crypto.KeyObject} secret
  * @return {String|Boolean}
  * @api private
  */
 
 exports.unsign = function(val, secret){
-  if ('string' != typeof val) throw new TypeError("Signed cookie string must be provided.");
-  if ('string' != typeof secret) throw new TypeError("Secret string must be provided.");
+  if ('string' !== typeof val) throw new TypeError("Signed cookie string must be provided.");
+  if (null == secret) throw new TypeError("Secret key must be provided.");
   var str = val.slice(0, val.lastIndexOf('.'))
     , mac = exports.sign(str, secret);
   
diff --git a/node_modules/cookie-signature/package.json b/node_modules/cookie-signature/package.json
index 29c4498e07ab1ae43692d7a27f959771a459815c..738487b53c337d7ba1888d6b8e416853cb4940de 100644
--- a/node_modules/cookie-signature/package.json
+++ b/node_modules/cookie-signature/package.json
@@ -1,6 +1,6 @@
 {
   "name": "cookie-signature",
-  "version": "1.0.6",
+  "version": "1.0.7",
   "description": "Sign and unsign cookies",
   "keywords": ["cookie", "sign", "unsign"],
   "author": "TJ Holowaychuk <tj@learnboost.com>",
@@ -15,4 +15,4 @@
     "test": "mocha --require should --reporter spec"
   },
   "main": "index"
-}
+}
\ No newline at end of file
diff --git a/node_modules/cookie/index.js b/node_modules/cookie/index.js
index 51a58cbe953d5914b2c6151228763eb2e62ea26e..acd5acd6ab3cfd4441516573c5948db0ea6d7785 100644
--- a/node_modules/cookie/index.js
+++ b/node_modules/cookie/index.js
@@ -21,6 +21,7 @@ exports.serialize = serialize;
  */
 
 var __toString = Object.prototype.toString
+var __hasOwnProperty = Object.prototype.hasOwnProperty
 
 /**
  * RegExp to match cookie-name in RFC 6265 sec 4.1.1
@@ -130,7 +131,7 @@ function parse(str, opt) {
     var key = str.slice(keyStartIdx, keyEndIdx);
 
     // only assign once
-    if (!obj.hasOwnProperty(key)) {
+    if (!__hasOwnProperty.call(obj, key)) {
       var valStartIdx = startIndex(str, eqIdx + 1, endIdx);
       var valEndIdx = endIndex(str, endIdx, valStartIdx);
 
diff --git a/node_modules/cookie/package.json b/node_modules/cookie/package.json
index f498ea75ac513eac700adcb8ccd38a0528ef60f5..22e3f922ba048e5cd1a20ac6a5b77fbc3b155095 100644
--- a/node_modules/cookie/package.json
+++ b/node_modules/cookie/package.json
@@ -1,7 +1,7 @@
 {
   "name": "cookie",
   "description": "HTTP server cookie parsing and serialization",
-  "version": "0.7.1",
+  "version": "0.7.2",
   "author": "Roman Shtylman <shtylman@gmail.com>",
   "contributors": [
     "Douglas Christopher Wilson <doug@somethingdoug.com>"
diff --git a/node_modules/core-util-is/LICENSE b/node_modules/core-util-is/LICENSE
deleted file mode 100644
index d8d7f9437dbf5ad54701a187f05988bcf0006fd8..0000000000000000000000000000000000000000
--- a/node_modules/core-util-is/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright Node.js contributors. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
diff --git a/node_modules/core-util-is/README.md b/node_modules/core-util-is/README.md
deleted file mode 100644
index 5a76b4149c5eb5077c09578e349820bccbbd266e..0000000000000000000000000000000000000000
--- a/node_modules/core-util-is/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# core-util-is
-
-The `util.is*` functions introduced in Node v0.12.
diff --git a/node_modules/core-util-is/lib/util.js b/node_modules/core-util-is/lib/util.js
deleted file mode 100644
index 6e5a20d7dc09e280bf06302f4f872b8eb168aac0..0000000000000000000000000000000000000000
--- a/node_modules/core-util-is/lib/util.js
+++ /dev/null
@@ -1,107 +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.
-
-// NOTE: These type checking functions intentionally don't use `instanceof`
-// because it is fragile and can be easily faked with `Object.create()`.
-
-function isArray(arg) {
-  if (Array.isArray) {
-    return Array.isArray(arg);
-  }
-  return objectToString(arg) === '[object Array]';
-}
-exports.isArray = isArray;
-
-function isBoolean(arg) {
-  return typeof arg === 'boolean';
-}
-exports.isBoolean = isBoolean;
-
-function isNull(arg) {
-  return arg === null;
-}
-exports.isNull = isNull;
-
-function isNullOrUndefined(arg) {
-  return arg == null;
-}
-exports.isNullOrUndefined = isNullOrUndefined;
-
-function isNumber(arg) {
-  return typeof arg === 'number';
-}
-exports.isNumber = isNumber;
-
-function isString(arg) {
-  return typeof arg === 'string';
-}
-exports.isString = isString;
-
-function isSymbol(arg) {
-  return typeof arg === 'symbol';
-}
-exports.isSymbol = isSymbol;
-
-function isUndefined(arg) {
-  return arg === void 0;
-}
-exports.isUndefined = isUndefined;
-
-function isRegExp(re) {
-  return objectToString(re) === '[object RegExp]';
-}
-exports.isRegExp = isRegExp;
-
-function isObject(arg) {
-  return typeof arg === 'object' && arg !== null;
-}
-exports.isObject = isObject;
-
-function isDate(d) {
-  return objectToString(d) === '[object Date]';
-}
-exports.isDate = isDate;
-
-function isError(e) {
-  return (objectToString(e) === '[object Error]' || e instanceof Error);
-}
-exports.isError = isError;
-
-function isFunction(arg) {
-  return typeof arg === 'function';
-}
-exports.isFunction = isFunction;
-
-function isPrimitive(arg) {
-  return arg === null ||
-         typeof arg === 'boolean' ||
-         typeof arg === 'number' ||
-         typeof arg === 'string' ||
-         typeof arg === 'symbol' ||  // ES6 symbol
-         typeof arg === 'undefined';
-}
-exports.isPrimitive = isPrimitive;
-
-exports.isBuffer = require('buffer').Buffer.isBuffer;
-
-function objectToString(o) {
-  return Object.prototype.toString.call(o);
-}
diff --git a/node_modules/core-util-is/package.json b/node_modules/core-util-is/package.json
deleted file mode 100644
index b0c51f580be4cff40105d5b52a8a513bc0330e94..0000000000000000000000000000000000000000
--- a/node_modules/core-util-is/package.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "name": "core-util-is",
-  "version": "1.0.3",
-  "description": "The `util.is*` functions introduced in Node v0.12.",
-  "main": "lib/util.js",
-  "files": [
-    "lib"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/core-util-is"
-  },
-  "keywords": [
-    "util",
-    "isBuffer",
-    "isArray",
-    "isNumber",
-    "isString",
-    "isRegExp",
-    "isThis",
-    "isThat",
-    "polyfill"
-  ],
-  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/isaacs/core-util-is/issues"
-  },
-  "scripts": {
-    "test": "tap test.js",
-    "preversion": "npm test",
-    "postversion": "npm publish",
-    "prepublishOnly": "git push origin --follow-tags"
-  },
-  "devDependencies": {
-    "tap": "^15.0.9"
-  }
-}
diff --git a/node_modules/double-ended-queue/.npmignore b/node_modules/double-ended-queue/.npmignore
deleted file mode 100644
index bd236a0e87572a78aca7b84c078f5b3554022281..0000000000000000000000000000000000000000
--- a/node_modules/double-ended-queue/.npmignore
+++ /dev/null
@@ -1,31 +0,0 @@
-node_modules/*
-todo.txt
-npm-debug.log
-test/*
-benchmark/*
-browser/*
-src/*
-async
-sync
-mixed
-bench.json
-js/browser
-js/browser/*
-js/debug
-js/debug/*
-reader.js
-read.txt
-bench
-.editorconfig
-.jshintrc
-ast_passes.js
-mocharun.js
-throwaway.js
-throwaway.html
-deque.sublime-workspace
-deque.sublime-project
-changelog.js
-.travis.yml
-sauce_connect.log
-nodex64.exe
-bump.js
diff --git a/node_modules/double-ended-queue/Gruntfile.js b/node_modules/double-ended-queue/Gruntfile.js
deleted file mode 100644
index 7aed70d6a04a2369840aa9f07d1a2fb117366c24..0000000000000000000000000000000000000000
--- a/node_modules/double-ended-queue/Gruntfile.js
+++ /dev/null
@@ -1,188 +0,0 @@
-"use strict";
-Error.stackTraceLimit = 100;
-var astPasses = require("./ast_passes.js");
-
-module.exports = function( grunt ) {
-    var isCI = !!grunt.option("ci");
-
-    var license;
-    function getLicense() {
-        if( !license ) {
-            var fs = require("fs");
-            var text = fs.readFileSync("LICENSE", "utf8");
-            text = text.split("\n").map(function(line, index){
-                return " * " + line;
-            }).join("\n")
-            license = "/**\n" + text + "\n */\n";
-        }
-        return license
-    }
-
-    function writeFile( dest, content ) {
-        grunt.file.write( dest, content );
-        grunt.log.writeln('File "' + dest + '" created.');
-    }
-
-    var gruntConfig = {};
-
-    var getGlobals = function() {
-        var fs = require("fs");
-        var file = "./src/constants.js";
-        var contents = fs.readFileSync(file, "utf8");
-        var rconstantname = /CONSTANT\(\s*([^,]+)/g;
-        var m;
-        var globals = {
-            "console": false,
-            "require": false,
-            "module": false,
-            "define": false
-        };
-        while( ( m = rconstantname.exec( contents ) ) ) {
-            globals[m[1]] = false;
-        }
-        return globals;
-    }
-
-    gruntConfig.pkg = grunt.file.readJSON("package.json");
-
-    gruntConfig.jshint = {
-        all: {
-            options: {
-                globals: getGlobals(),
-
-                "bitwise": false,
-                "camelcase": true,
-                "curly": true,
-                "eqeqeq": true,
-                "es3": true,
-                "forin": true,
-                "immed": true,
-                "latedef": false,
-                "newcap": true,
-                "noarg": true,
-                "noempty": true,
-                "nonew": true,
-                "plusplus": false,
-                "quotmark": "double",
-                "undef": true,
-                "unused": true,
-                "strict": false,
-                "trailing": true,
-                "maxparams": 7,
-                "maxlen": 80,
-
-                "asi": false,
-                "boss": true,
-                "eqnull": true,
-                "evil": true,
-                "expr": false,
-                "funcscope": false,
-                "globalstrict": false,
-                "lastsemic": false,
-                "laxcomma": false,
-                "laxbreak": false,
-                "loopfunc": true,
-                "multistr": true,
-                "proto": false,
-                "scripturl": true,
-                "smarttabs": false,
-                "shadow": true,
-                "sub": true,
-                "supernew": false,
-                "validthis": true,
-
-                "browser": true,
-                "jquery": true,
-                "devel": true,
-
-
-                '-W014': true,
-                '-W116': true,
-                '-W106': true,
-                '-W064': true,
-                '-W097': true
-            },
-
-            files: {
-                src: [
-                    "./src/deque.js"
-                ]
-            }
-        }
-    };
-
-    if( !isCI ) {
-        gruntConfig.jshint.all.options.reporter = require("jshint-stylish");
-    }
-
-    gruntConfig.bump = {
-      options: {
-        files: ['package.json'],
-        updateConfigs: [],
-        commit: true,
-        commitMessage: 'Release v%VERSION%',
-        commitFiles: ['-a'],
-        createTag: true,
-        tagName: 'v%VERSION%',
-        tagMessage: 'Version %VERSION%',
-        false: true,
-        pushTo: 'master',
-        gitDescribeOptions: '--tags --always --abbrev=1 --dirty=-d' // options to use with '$ git describe'
-      }
-    };
-
-    grunt.initConfig(gruntConfig);
-    grunt.loadNpmTasks('grunt-contrib-jshint');
-    grunt.loadNpmTasks('grunt-bump');
-
-
-    grunt.registerTask( "build", function() {
-        var fs = require("fs");
-        var CONSTANTS_FILE = "./src/constants.js";
-
-        astPasses.readConstants(fs.readFileSync(CONSTANTS_FILE, "utf8"), CONSTANTS_FILE);
-        var fileNames = ["deque.js"];
-        fileNames.forEach(function(fileName){
-            var src = fs.readFileSync("./src/" + fileName, "utf8");
-            src = astPasses.removeComments(src, fileName);
-            src = astPasses.expandConstants(src, fileName);
-            src = getLicense() + src;
-            writeFile("./js/" + fileName, src);
-        });
-    });
-
-    grunt.registerTask( "testrun", function() {
-        var fs = require("fs");
-        var done = this.async();
-        var Mocha = require("mocha");
-
-        var mochaOpts = {
-            reporter: "spec",
-            timeout: 500,
-            slow: Infinity
-        };
-
-        var mocha = new Mocha(mochaOpts);
-
-        fs.readdirSync("./test").forEach(function(fileName) {
-            mocha.addFile("./test/" + fileName);
-        });
-
-        mocha.run(function(err){
-            if( err ) {
-                process.stderr.write(test.title + "\n" + err.stack + "\n");
-                done(err);
-            }
-            else {
-                done();
-            }
-        }).on( "fail", function( test, err ) {
-            process.stderr.write(test.title + "\n" + err.stack + "\n");
-            done(err);
-        });
-    });
-
-    grunt.registerTask( "test", ["jshint", "build", "testrun"] );
-    grunt.registerTask( "default", ["jshint", "build"] );
-
-};
diff --git a/node_modules/double-ended-queue/LICENSE b/node_modules/double-ended-queue/LICENSE
deleted file mode 100644
index abaadaa061ab0d19eb94303ba8945a33e1c69c48..0000000000000000000000000000000000000000
--- a/node_modules/double-ended-queue/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2013 Petka Antonov
-
-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:</p>
-
-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/double-ended-queue/README.md b/node_modules/double-ended-queue/README.md
deleted file mode 100644
index b1d115d2448163ef75da9357b62365c73ebc117d..0000000000000000000000000000000000000000
--- a/node_modules/double-ended-queue/README.md
+++ /dev/null
@@ -1,293 +0,0 @@
-#Introduction
-
-Extremely fast [double-ended queue](http://en.wikipedia.org/wiki/Double-ended_queue) implementation. Double-ended queue can also be used as a:
-
-- [Stack](http://en.wikipedia.org/wiki/Stack_\(abstract_data_type\))
-- [Queue](http://en.wikipedia.org/wiki/Queue_\(data_structure\))
-
-The implementation is GC and CPU cache friendly [circular buffer](http://en.wikipedia.org/wiki/Circular_buffer). [It will run circles around any "linked list" implementation](#performance).
-
-Every queue operation is done in constant `O(1)` - including random access from `.get()`.
-
-#Topics
-
-- [Quick start](#quick-start)
-- [Why not use an Array?](#why-not-use-an-array)
-- [Using double-ended queue as a normal queue](#using-double-ended-queue-as-a-normal-queue)
-- [API reference and examples](#api)
-- [Performance](#performance)
-
-#Quick start
-
-    npm install double-ended-queue
-
-```js
-var Deque = require("double-ended-queue");
-
-var deque = new Deque([1,2,3,4]);
-deque.shift(); //1
-deque.pop(); //4
-```
-
-#Why not use an Array?
-
-Arrays take linear `O(N)` time to do `shift` and `unshift` operations. That means in theory that an array with 1000 items is 1000x slower to do those operations than a deque with 1000 items. 10000x slower with 10000 items and so on.
-
-V8 implements [a trick for small arrays](https://code.google.com/p/v8/issues/detail?id=3059) where these operations are done in constant time, however even with this trick deque is still 4x faster.
-
-But arrays use "native" methods, they must be faster!
-
-In V8, there is almost no advantage for a method to be a built-in. In fact many times built-ins are at a severe disadvantage of having to implement far more complex semantics than is actually needed in practice. For example, sparse array handling punishes almost every built-in array method even though nobody uses sparse arrays as is evidenced by the popularity of the underscore library which doesn't handle sparse arrays in the same way across different browsers.
-
-#Using double-ended queue as a normal queue
-
-Queue is a more commonly needed data structure however a separate implementation does not provide any advantage in terms of performance. Aliases are provided specifically for the queue use-case. You may use `.enqueue(items...)` to enqueue item(s) and `.dequeue()` to dequeue an item.
-
-#API
-
-- [`new Deque()`](#new-deque---deque)
-- [`new Deque(Array items)`](#new-dequearray-items---deque)
-- [`new Deque(int capacity)`](#new-dequeint-capacity---deque)
-- [`push(dynamic items...)`](#pushdynamic-items---int)
-- [`unshift(dynamic items...)`](#unshiftdynamic-items---int)
-- [`pop()`](#pop---dynamic)
-- [`shift()`](#shift---dynamic)
-- [`toArray()`](#toarray---array)
-- [`peekBack()`](#peekback---dynamic)
-- [`peekFront()`](#peekfront---dynamic)
-- [`get(int index)`](#getint-index---dynamic)
-- [`isEmpty()`](#isempty---boolean)
-- [`clear()`](#clear---void)
-
-#####`new Deque()` -> `Deque`
-
-Creates an empty double-ended queue with initial capacity of 16. If you know the optimal size before-hand, use [`new Deque(int capacity)`](#new-dequeint-capacity---deque).
-
-```js
-var deque = new Deque();
-deque.push(1, 2, 3);
-deque.shift(); //1
-deque.pop(); //3
-```
-
-<hr>
-
-#####`new Deque(Array items)` -> `Deque`
-
-Creates a double-ended queue from `items`.
-
-```js
-var deque = new Deque([1,2,3,4]);
-deque.shift(); //1
-deque.pop(); //4
-```
-
-<hr>
-
-#####`new Deque(int capacity)` -> `Deque`
-
-Creates an empty double-ended queue with the given `capacity`. `Capacity` should be the maximum amount of items the queue will hold at a given time.
-
-The reason to give an initial capacity is to avoid potentially expensive resizing operations at runtime.
-
-```js
-var deque = new Deque(100);
-deque.push(1, 2, 3);
-deque.shift(); //1
-deque.pop(); //3
-```
-
-<hr>
-
-#####`push(dynamic items...)` -> `int`
-
-Push items to the back of this queue. Returns the amount of items currently in the queue after the operation.
-
-```js
-var deque = new Deque();
-deque.push(1);
-deque.pop(); //1
-deque.push(1, 2, 3);
-deque.shift(); //1
-deque.shift(); //2
-deque.shift(); //3
-```
-
-**Aliases:** `enqueue`, `insertBack`
-
-<hr>
-
-#####`unshift(dynamic items...)` -> `int`
-
-Unshift items to the front of this queue. Returns the amount of items currently in the queue after the operation.
-
-```js
-var deque = new Deque([2,3]);
-deque.unshift(1);
-deque.toString(); //"1,2,3"
-deque.unshift(-2, -1, 0);
-deque.toString(); //"-2,-1,0,1,2,3"
-```
-
-**Aliases:** `insertFront`
-
-<hr>
-
-
-#####`pop()` -> `dynamic`
-
-Pop off the item at the back of this queue.
-
-Note: The item will be removed from the queue. If you simply want to see what's at the back of the queue use [`peekBack()`](#peekback---dynamic) or [`.get(-1)`](#getint-index---dynamic).
-
-If the queue is empty, `undefined` is returned. If you need to differentiate between `undefined` values in the queue and `pop()` return value -
-check the queue `.length` before popping.
-
-```js
-var deque = new Deque([1,2,3]);
-deque.pop(); //3
-deque.pop(); //2
-deque.pop(); //1
-deque.pop(); //undefined
-```
-
-**Aliases:** `removeBack`
-
-<hr>
-
-#####`shift()` -> `dynamic`
-
-Shifts off the item at the front of this queue.
-
-Note: The item will be removed from the queue. If you simply want to see what's at the front of the queue use [`peekFront()`](#peekfront---dynamic) or [`.get(0)`](#getint-index---dynamic).
-
-If the queue is empty, `undefined` is returned. If you need to differentiate between `undefined` values in the queue and `shift()` return value -
-check the queue `.length` before shifting.
-
-```js
-var deque = new Deque([1,2,3]);
-deque.shift(); //1
-deque.shift(); //2
-deque.shift(); //3
-deque.shift(); //undefined
-```
-
-**Aliases:** `removeFront`, `dequeue`
-
-<hr>
-
-#####`toArray()` -> `Array`
-
-Returns the items in the queue as an array. Starting from the item in the front of the queue and ending to the item at the back of the queue.
-
-```js
-var deque = new Deque([1,2,3]);
-deque.push(4);
-deque.unshift(0);
-deque.toArray(); //[0,1,2,3,4]
-```
-
-**Aliases:** `toJSON`
-
-<hr>
-
-#####`peekBack()` -> `dynamic`
-
-Returns the item that is at the back of this queue without removing it.
-
-If the queue is empty, `undefined` is returned.
-
-```js
-var deque = new Deque([1,2,3]);
-deque.push(4);
-deque.peekBack(); //4
-```
-
-<hr>
-
-#####`peekFront()` -> `dynamic`
-
-Returns the item that is at the front of this queue without removing it.
-
-If the queue is empty, `undefined` is returned.
-
-```js
-var deque = new Deque([1,2,3]);
-deque.push(4);
-deque.peekFront(); //1
-```
-
-<hr>
-
-#####`get(int index)` -> `dynamic`
-
-Returns the item that is at the given `index` of this queue without removing it.
-
-The index is zero-based, so `.get(0)` will return the item that is at the front, `.get(1)` will return
-the item that comes after and so on.
-
-The index can be negative to read items at the back of the queue. `.get(-1)` returns the item that is at the back of the queue,
-`.get(-2)` will return the item that comes before and so on.
-
-Returns `undefined` if `index` is not a valid index into the queue.
-
-```js
-var deque = new Deque([1,2,3]);
-deque.get(0); //1
-deque.get(1); //2
-deque.get(2); //3
-
-deque.get(-1); //3
-deque.get(-2); //2
-deque.get(-3); //1
-```
-
-**Note**: Even though indexed accessor (e.g. `queue[0]`) could *appear* to return a correct value *sometimes*, this is completely unreliable. The numeric slots
-of the deque object are internally used as an optimization and have no meaningful order or meaning to outside. Always use `.get()`.
-
-**Note**: The implementation has O(1) random access using `.get()`.
-
-<hr>
-
-#####`isEmpty()` -> `boolean`
-
-Return `true` if this queue is empty, `false` otherwise.
-
-```js
-var deque = new Deque();
-deque.isEmpty(); //true
-deque.push(1);
-deque.isEmpty(); //false
-```
-
-<hr>
-
-#####`clear()` -> `void`
-
-Remove all items from this queue. Does not change the queue's capacity.
-
-```js
-var deque = new Deque([1,2,3]);
-deque.toString(); //"1,2,3"
-deque.clear();
-deque.toString(); //""
-```
-<hr>
-
-#Performance
-
-Clone the repo and `npm install`. Then run the `bench` script.
-
-##1000 items in the queue
-
-    double-ended-queue x 15,532,714 ops/sec ±0.19% (96 runs sampled)
-    built-in array x 6,501,398 ops/sec ±0.87% (95 runs sampled)
-    node-deque x 2,938,068 ops/sec ±3.50% (68 runs sampled)
-
-##2 million items in the queue
-
-    double-ended-queue x 14,425,547 ops/sec ±0.17% (94 runs sampled)
-    node-deque x 2,815,628 ops/sec ±10.56% (76 runs sampled)
-    built-in array x 19.23 ops/sec ±0.35% (51 runs sampled)
-
-Noteworthy is just how bad the degradation can be for built-in array when V8 cannot use the trick.
diff --git a/node_modules/double-ended-queue/js/deque.js b/node_modules/double-ended-queue/js/deque.js
deleted file mode 100644
index 90a355992e0f45aa5a5390ebb5f4d36a72601165..0000000000000000000000000000000000000000
--- a/node_modules/double-ended-queue/js/deque.js
+++ /dev/null
@@ -1,287 +0,0 @@
-/**
- * Copyright (c) 2013 Petka Antonov
- * 
- * 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:</p>
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-"use strict";
-function Deque(capacity) {
-    this._capacity = getCapacity(capacity);
-    this._length = 0;
-    this._front = 0;
-    this._makeCapacity();
-    if (isArray(capacity)) {
-        var len = capacity.length;
-        for (var i = 0; i < len; ++i) {
-            this[i] = capacity[i];
-        }
-        this._length = len;
-    }
-}
-
-Deque.prototype.toArray = function Deque$toArray() {
-    var len = this._length;
-    var ret = new Array(len);
-    var front = this._front;
-    var capacity = this._capacity;
-    for (var j = 0; j < len; ++j) {
-        ret[j] = this[(front + j) & (capacity - 1)];
-    }
-    return ret;
-};
-
-Deque.prototype.push = function Deque$push(item) {
-    var argsLength = arguments.length;
-    var length = this._length;
-    if (argsLength > 1) {
-        var capacity = this._capacity;
-        if (length + argsLength > capacity) {
-            for (var i = 0; i < argsLength; ++i) {
-                this._checkCapacity(length + 1);
-                var j = (this._front + length) & (this._capacity - 1);
-                this[j] = arguments[i];
-                length++;
-                this._length = length;
-            }
-            return length;
-        }
-        else {
-            var j = this._front;
-            for (var i = 0; i < argsLength; ++i) {
-                this[(j + length) & (capacity - 1)] = arguments[i];
-                j++;
-            }
-            this._length = length + argsLength;
-            return length + argsLength;
-        }
-
-    }
-
-    if (argsLength === 0) return length;
-
-    this._checkCapacity(length + 1);
-    var i = (this._front + length) & (this._capacity - 1);
-    this[i] = item;
-    this._length = length + 1;
-    return length + 1;
-};
-
-Deque.prototype.pop = function Deque$pop() {
-    var length = this._length;
-    if (length === 0) {
-        return void 0;
-    }
-    var i = (this._front + length - 1) & (this._capacity - 1);
-    var ret = this[i];
-    this[i] = void 0;
-    this._length = length - 1;
-    return ret;
-};
-
-Deque.prototype.shift = function Deque$shift() {
-    var length = this._length;
-    if (length === 0) {
-        return void 0;
-    }
-    var front = this._front;
-    var ret = this[front];
-    this[front] = void 0;
-    this._front = (front + 1) & (this._capacity - 1);
-    this._length = length - 1;
-    return ret;
-};
-
-Deque.prototype.unshift = function Deque$unshift(item) {
-    var length = this._length;
-    var argsLength = arguments.length;
-
-
-    if (argsLength > 1) {
-        var capacity = this._capacity;
-        if (length + argsLength > capacity) {
-            for (var i = argsLength - 1; i >= 0; i--) {
-                this._checkCapacity(length + 1);
-                var capacity = this._capacity;
-                var j = (((( this._front - 1 ) &
-                    ( capacity - 1) ) ^ capacity ) - capacity );
-                this[j] = arguments[i];
-                length++;
-                this._length = length;
-                this._front = j;
-            }
-            return length;
-        }
-        else {
-            var front = this._front;
-            for (var i = argsLength - 1; i >= 0; i--) {
-                var j = (((( front - 1 ) &
-                    ( capacity - 1) ) ^ capacity ) - capacity );
-                this[j] = arguments[i];
-                front = j;
-            }
-            this._front = front;
-            this._length = length + argsLength;
-            return length + argsLength;
-        }
-    }
-
-    if (argsLength === 0) return length;
-
-    this._checkCapacity(length + 1);
-    var capacity = this._capacity;
-    var i = (((( this._front - 1 ) &
-        ( capacity - 1) ) ^ capacity ) - capacity );
-    this[i] = item;
-    this._length = length + 1;
-    this._front = i;
-    return length + 1;
-};
-
-Deque.prototype.peekBack = function Deque$peekBack() {
-    var length = this._length;
-    if (length === 0) {
-        return void 0;
-    }
-    var index = (this._front + length - 1) & (this._capacity - 1);
-    return this[index];
-};
-
-Deque.prototype.peekFront = function Deque$peekFront() {
-    if (this._length === 0) {
-        return void 0;
-    }
-    return this[this._front];
-};
-
-Deque.prototype.get = function Deque$get(index) {
-    var i = index;
-    if ((i !== (i | 0))) {
-        return void 0;
-    }
-    var len = this._length;
-    if (i < 0) {
-        i = i + len;
-    }
-    if (i < 0 || i >= len) {
-        return void 0;
-    }
-    return this[(this._front + i) & (this._capacity - 1)];
-};
-
-Deque.prototype.isEmpty = function Deque$isEmpty() {
-    return this._length === 0;
-};
-
-Deque.prototype.clear = function Deque$clear() {
-    this._length = 0;
-    this._front = 0;
-    this._makeCapacity();
-};
-
-Deque.prototype.toString = function Deque$toString() {
-    return this.toArray().toString();
-};
-
-Deque.prototype.valueOf = Deque.prototype.toString;
-Deque.prototype.removeFront = Deque.prototype.shift;
-Deque.prototype.removeBack = Deque.prototype.pop;
-Deque.prototype.insertFront = Deque.prototype.unshift;
-Deque.prototype.insertBack = Deque.prototype.push;
-Deque.prototype.enqueue = Deque.prototype.push;
-Deque.prototype.dequeue = Deque.prototype.shift;
-Deque.prototype.toJSON = Deque.prototype.toArray;
-
-Object.defineProperty(Deque.prototype, "length", {
-    get: function() {
-        return this._length;
-    },
-    set: function() {
-        throw new RangeError("");
-    }
-});
-
-Deque.prototype._makeCapacity = function Deque$_makeCapacity() {
-    var len = this._capacity;
-    for (var i = 0; i < len; ++i) {
-        this[i] = void 0;
-    }
-};
-
-Deque.prototype._checkCapacity = function Deque$_checkCapacity(size) {
-    if (this._capacity < size) {
-        this._resizeTo(getCapacity(this._capacity * 1.5 + 16));
-    }
-};
-
-Deque.prototype._resizeTo = function Deque$_resizeTo(capacity) {
-    var oldFront = this._front;
-    var oldCapacity = this._capacity;
-    var oldDeque = new Array(oldCapacity);
-    var length = this._length;
-
-    arrayCopy(this, 0, oldDeque, 0, oldCapacity);
-    this._capacity = capacity;
-    this._makeCapacity();
-    this._front = 0;
-    if (oldFront + length <= oldCapacity) {
-        arrayCopy(oldDeque, oldFront, this, 0, length);
-    } else {        var lengthBeforeWrapping =
-            length - ((oldFront + length) & (oldCapacity - 1));
-
-        arrayCopy(oldDeque, oldFront, this, 0, lengthBeforeWrapping);
-        arrayCopy(oldDeque, 0, this, lengthBeforeWrapping,
-            length - lengthBeforeWrapping);
-    }
-};
-
-
-var isArray = Array.isArray;
-
-function arrayCopy(src, srcIndex, dst, dstIndex, len) {
-    for (var j = 0; j < len; ++j) {
-        dst[j + dstIndex] = src[j + srcIndex];
-    }
-}
-
-function pow2AtLeast(n) {
-    n = n >>> 0;
-    n = n - 1;
-    n = n | (n >> 1);
-    n = n | (n >> 2);
-    n = n | (n >> 4);
-    n = n | (n >> 8);
-    n = n | (n >> 16);
-    return n + 1;
-}
-
-function getCapacity(capacity) {
-    if (typeof capacity !== "number") {
-        if (isArray(capacity)) {
-            capacity = capacity.length;
-        }
-        else {
-            return 16;
-        }
-    }
-    return pow2AtLeast(
-        Math.min(
-            Math.max(16, capacity), 1073741824)
-    );
-}
-
-module.exports = Deque;
diff --git a/node_modules/double-ended-queue/package.json b/node_modules/double-ended-queue/package.json
deleted file mode 100644
index 27d83f960a971f83ba41b90f71e936c9308d52c2..0000000000000000000000000000000000000000
--- a/node_modules/double-ended-queue/package.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-    "name": "double-ended-queue",
-    "description": "Extremely fast double-ended queue implementation",
-    "version": "2.0.0-0",
-    "keywords": [
-        "data-structure",
-        "data-structures",
-        "queue",
-        "deque",
-        "double-ended-queue"
-    ],
-    "scripts": {
-        "test": "grunt test"
-    },
-    "homepage": "https://github.com/petkaantonov/deque",
-    "repository": {
-        "type": "git",
-        "url": "git://github.com/petkaantonov/deque.git"
-    },
-    "bugs": {
-        "url": "http://github.com/petkaantonov/deque/issues"
-    },
-    "license": "MIT",
-    "author": {
-        "name": "Petka Antonov",
-        "email": "petka_antonov@hotmail.com",
-        "url": "http://github.com/petkaantonov/"
-    },
-    "devDependencies": {
-        "grunt": "~0.4.1",
-        "grunt-contrib-jshint": "~0.6.4",
-        "jshint-stylish": "latest",
-        "acorn": "~0.3.1",
-        "mocha": "~1.12.1",
-        "grunt-cli": "~0.1.9",
-        "bluebird": "~0.11",
-        "benchmark": "~1.0.0",
-        "deque": "0.0.4",
-        "q": "~0.9.7",
-        "semver-utils": "~1.1.0"
-    },
-    "readmeFilename": "README.md",
-    "main": "./js/deque.js"
-}
\ No newline at end of file
diff --git a/node_modules/encodeurl/LICENSE b/node_modules/encodeurl/LICENSE
deleted file mode 100644
index 8812229bc59b5f365549fb3c799b32a4d4acdabc..0000000000000000000000000000000000000000
--- a/node_modules/encodeurl/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2016 Douglas Christopher Wilson
-
-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/encodeurl/README.md b/node_modules/encodeurl/README.md
deleted file mode 100644
index 3842493ec68e8eb5a5377fa4c3a33e454be4e882..0000000000000000000000000000000000000000
--- a/node_modules/encodeurl/README.md
+++ /dev/null
@@ -1,109 +0,0 @@
-# Encode URL
-
-Encode a URL to a percent-encoded form, excluding already-encoded sequences.
-
-## Installation
-
-```sh
-npm install encodeurl
-```
-
-## API
-
-```js
-var encodeUrl = require('encodeurl')
-```
-
-### encodeUrl(url)
-
-Encode a URL to a percent-encoded form, excluding already-encoded sequences.
-
-This function accepts a URL and encodes all the non-URL code points (as UTF-8 byte sequences). It will not encode the "%" character unless it is not part of a valid sequence (`%20` will be left as-is, but `%foo` will be encoded as `%25foo`).
-
-This encode is meant to be "safe" and does not throw errors. It will try as hard as it can to properly encode the given URL, including replacing any raw, unpaired surrogate pairs with the Unicode replacement character prior to encoding.
-
-## Examples
-
-### Encode a URL containing user-controlled data
-
-```js
-var encodeUrl = require('encodeurl')
-var escapeHtml = require('escape-html')
-
-http.createServer(function onRequest (req, res) {
-  // get encoded form of inbound url
-  var url = encodeUrl(req.url)
-
-  // create html message
-  var body = '<p>Location ' + escapeHtml(url) + ' not found</p>'
-
-  // send a 404
-  res.statusCode = 404
-  res.setHeader('Content-Type', 'text/html; charset=UTF-8')
-  res.setHeader('Content-Length', String(Buffer.byteLength(body, 'utf-8')))
-  res.end(body, 'utf-8')
-})
-```
-
-### Encode a URL for use in a header field
-
-```js
-var encodeUrl = require('encodeurl')
-var escapeHtml = require('escape-html')
-var url = require('url')
-
-http.createServer(function onRequest (req, res) {
-  // parse inbound url
-  var href = url.parse(req)
-
-  // set new host for redirect
-  href.host = 'localhost'
-  href.protocol = 'https:'
-  href.slashes = true
-
-  // create location header
-  var location = encodeUrl(url.format(href))
-
-  // create html message
-  var body = '<p>Redirecting to new site: ' + escapeHtml(location) + '</p>'
-
-  // send a 301
-  res.statusCode = 301
-  res.setHeader('Content-Type', 'text/html; charset=UTF-8')
-  res.setHeader('Content-Length', String(Buffer.byteLength(body, 'utf-8')))
-  res.setHeader('Location', location)
-  res.end(body, 'utf-8')
-})
-```
-
-## Similarities
-
-This function is _similar_ to the intrinsic function `encodeURI`. However, it will not encode:
-
-* The `\`, `^`, or `|` characters
-* The `%` character when it's part of a valid sequence
-* `[` and `]` (for IPv6 hostnames)
-* Replaces raw, unpaired surrogate pairs with the Unicode replacement character
-
-As a result, the encoding aligns closely with the behavior in the [WHATWG URL specification][whatwg-url]. However, this package only encodes strings and does not do any URL parsing or formatting.
-
-It is expected that any output from `new URL(url)` will not change when used with this package, as the output has already been encoded. Additionally, if we were to encode before `new URL(url)`, we do not expect the before and after encoded formats to be parsed any differently.
-
-## Testing
-
-```sh
-$ npm test
-$ npm run lint
-```
-
-## References
-
-- [RFC 3986: Uniform Resource Identifier (URI): Generic Syntax][rfc-3986]
-- [WHATWG URL Living Standard][whatwg-url]
-
-[rfc-3986]: https://tools.ietf.org/html/rfc3986
-[whatwg-url]: https://url.spec.whatwg.org/
-
-## License
-
-[MIT](LICENSE)
diff --git a/node_modules/encodeurl/index.js b/node_modules/encodeurl/index.js
deleted file mode 100644
index a49ee5a0b62136da6524703314e88b4199c4c208..0000000000000000000000000000000000000000
--- a/node_modules/encodeurl/index.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/*!
- * encodeurl
- * Copyright(c) 2016 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = encodeUrl
-
-/**
- * RegExp to match non-URL code points, *after* encoding (i.e. not including "%")
- * and including invalid escape sequences.
- * @private
- */
-
-var ENCODE_CHARS_REGEXP = /(?:[^\x21\x23-\x3B\x3D\x3F-\x5F\x61-\x7A\x7C\x7E]|%(?:[^0-9A-Fa-f]|[0-9A-Fa-f][^0-9A-Fa-f]|$))+/g
-
-/**
- * RegExp to match unmatched surrogate pair.
- * @private
- */
-
-var UNMATCHED_SURROGATE_PAIR_REGEXP = /(^|[^\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF]([^\uDC00-\uDFFF]|$)/g
-
-/**
- * String to replace unmatched surrogate pair with.
- * @private
- */
-
-var UNMATCHED_SURROGATE_PAIR_REPLACE = '$1\uFFFD$2'
-
-/**
- * Encode a URL to a percent-encoded form, excluding already-encoded sequences.
- *
- * This function will take an already-encoded URL and encode all the non-URL
- * code points. This function will not encode the "%" character unless it is
- * not part of a valid sequence (`%20` will be left as-is, but `%foo` will
- * be encoded as `%25foo`).
- *
- * This encode is meant to be "safe" and does not throw errors. It will try as
- * hard as it can to properly encode the given URL, including replacing any raw,
- * unpaired surrogate pairs with the Unicode replacement character prior to
- * encoding.
- *
- * @param {string} url
- * @return {string}
- * @public
- */
-
-function encodeUrl (url) {
-  return String(url)
-    .replace(UNMATCHED_SURROGATE_PAIR_REGEXP, UNMATCHED_SURROGATE_PAIR_REPLACE)
-    .replace(ENCODE_CHARS_REGEXP, encodeURI)
-}
diff --git a/node_modules/encodeurl/package.json b/node_modules/encodeurl/package.json
deleted file mode 100644
index 313382214599a9b52a408282b40c3f907407a30a..0000000000000000000000000000000000000000
--- a/node_modules/encodeurl/package.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "name": "encodeurl",
-  "description": "Encode a URL to a percent-encoded form, excluding already-encoded sequences",
-  "version": "2.0.0",
-  "contributors": [
-    "Douglas Christopher Wilson <doug@somethingdoug.com>"
-  ],
-  "license": "MIT",
-  "keywords": [
-    "encode",
-    "encodeurl",
-    "url"
-  ],
-  "repository": "pillarjs/encodeurl",
-  "devDependencies": {
-    "eslint": "5.11.1",
-    "eslint-config-standard": "12.0.0",
-    "eslint-plugin-import": "2.14.0",
-    "eslint-plugin-node": "7.0.1",
-    "eslint-plugin-promise": "4.0.1",
-    "eslint-plugin-standard": "4.0.0",
-    "istanbul": "0.4.5",
-    "mocha": "2.5.3"
-  },
-  "files": [
-    "LICENSE",
-    "HISTORY.md",
-    "README.md",
-    "index.js"
-  ],
-  "engines": {
-    "node": ">= 0.8"
-  },
-  "scripts": {
-    "lint": "eslint .",
-    "test": "mocha --reporter spec --bail --check-leaks test/",
-    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
-    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/"
-  }
-}
diff --git a/node_modules/escape-html/LICENSE b/node_modules/escape-html/LICENSE
deleted file mode 100644
index 2e70de9717e715b4fc05c7f8bdc4e8d63a33b859..0000000000000000000000000000000000000000
--- a/node_modules/escape-html/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2012-2013 TJ Holowaychuk
-Copyright (c) 2015 Andreas Lubbe
-Copyright (c) 2015 Tiancheng "Timothy" Gu
-
-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/escape-html/Readme.md b/node_modules/escape-html/Readme.md
deleted file mode 100644
index 653d9eaa793317827ce724c4a0756110e9356fc8..0000000000000000000000000000000000000000
--- a/node_modules/escape-html/Readme.md
+++ /dev/null
@@ -1,43 +0,0 @@
-
-# escape-html
-
-  Escape string for use in HTML
-
-## Example
-
-```js
-var escape = require('escape-html');
-var html = escape('foo & bar');
-// -> foo &amp; bar
-```
-
-## Benchmark
-
-```
-$ npm run-script bench
-
-> escape-html@1.0.3 bench nodejs-escape-html
-> node benchmark/index.js
-
-
-  http_parser@1.0
-  node@0.10.33
-  v8@3.14.5.9
-  ares@1.9.0-DEV
-  uv@0.10.29
-  zlib@1.2.3
-  modules@11
-  openssl@1.0.1j
-
-  1 test completed.
-  2 tests completed.
-  3 tests completed.
-
-  no special characters    x 19,435,271 ops/sec ±0.85% (187 runs sampled)
-  single special character x  6,132,421 ops/sec ±0.67% (194 runs sampled)
-  many special characters  x  3,175,826 ops/sec ±0.65% (193 runs sampled)
-```
-
-## License
-
-  MIT
\ No newline at end of file
diff --git a/node_modules/escape-html/index.js b/node_modules/escape-html/index.js
deleted file mode 100644
index bf9e226f4e872bee53a930739e5381d013c47568..0000000000000000000000000000000000000000
--- a/node_modules/escape-html/index.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/*!
- * escape-html
- * Copyright(c) 2012-2013 TJ Holowaychuk
- * Copyright(c) 2015 Andreas Lubbe
- * Copyright(c) 2015 Tiancheng "Timothy" Gu
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module variables.
- * @private
- */
-
-var matchHtmlRegExp = /["'&<>]/;
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = escapeHtml;
-
-/**
- * Escape special characters in the given string of html.
- *
- * @param  {string} string The string to escape for inserting into HTML
- * @return {string}
- * @public
- */
-
-function escapeHtml(string) {
-  var str = '' + string;
-  var match = matchHtmlRegExp.exec(str);
-
-  if (!match) {
-    return str;
-  }
-
-  var escape;
-  var html = '';
-  var index = 0;
-  var lastIndex = 0;
-
-  for (index = match.index; index < str.length; index++) {
-    switch (str.charCodeAt(index)) {
-      case 34: // "
-        escape = '&quot;';
-        break;
-      case 38: // &
-        escape = '&amp;';
-        break;
-      case 39: // '
-        escape = '&#39;';
-        break;
-      case 60: // <
-        escape = '&lt;';
-        break;
-      case 62: // >
-        escape = '&gt;';
-        break;
-      default:
-        continue;
-    }
-
-    if (lastIndex !== index) {
-      html += str.substring(lastIndex, index);
-    }
-
-    lastIndex = index + 1;
-    html += escape;
-  }
-
-  return lastIndex !== index
-    ? html + str.substring(lastIndex, index)
-    : html;
-}
diff --git a/node_modules/escape-html/package.json b/node_modules/escape-html/package.json
deleted file mode 100644
index 57ec7bd0754d50af9c5e96a208aed6d85c1e6d5e..0000000000000000000000000000000000000000
--- a/node_modules/escape-html/package.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-  "name": "escape-html",
-  "description": "Escape string for use in HTML",
-  "version": "1.0.3",
-  "license": "MIT",
-  "keywords": [
-    "escape",
-    "html",
-    "utility"
-  ],
-  "repository": "component/escape-html",
-  "devDependencies": {
-    "benchmark": "1.0.0",
-    "beautify-benchmark": "0.2.4"
-  },
-  "files": [
-    "LICENSE",
-    "Readme.md",
-    "index.js"
-  ],
-  "scripts": {
-    "bench": "node benchmark/index.js"
-  }
-}
diff --git a/node_modules/esprima/README.md b/node_modules/esprima/README.md
deleted file mode 100644
index a74bd12d6f1a3bedbe329a7981555762469942cd..0000000000000000000000000000000000000000
--- a/node_modules/esprima/README.md
+++ /dev/null
@@ -1,73 +0,0 @@
-**Esprima** ([esprima.org](http://esprima.org)) is a high performance,
-standard-compliant [ECMAScript](http://www.ecma-international.org/publications/standards/Ecma-262.htm)
-parser written in ECMAScript (also popularly known as
-[JavaScript](http://en.wikipedia.org/wiki/JavaScript>JavaScript)).
-Esprima is created and maintained by [Ariya Hidayat](http://twitter.com/ariyahidayat),
-with the help of [many contributors](https://github.com/ariya/esprima/contributors).
-
-Esprima runs on web browsers (IE 6+, Firefox 1+, Safari 3+, Chrome 1+, Konqueror 4.6+, Opera 8+) as well as
-[Node.js](http://nodejs.org).
-
-### Features
-
-- Full support for [ECMAScript 5.1](http://www.ecma-international.org/publications/standards/Ecma-262.htm)(ECMA-262)
-- Sensible [syntax tree format](http://esprima.org/doc/index.html#ast) compatible with Mozilla
-[Parser AST](https://developer.mozilla.org/en/SpiderMonkey/Parser_API)
-- Heavily tested (> 550 [unit tests](http://esprima.org/test/) with solid 100% statement coverage)
-- Optional tracking of syntax node location (index-based and line-column)
-- Experimental support for ES6/Harmony (module, class, destructuring, ...)
-
-Esprima is blazing fast (see the [benchmark suite](http://esprima.org/test/benchmarks.html)).
-It is up to 3x faster than UglifyJS v1 and it is still [competitive](http://esprima.org/test/compare.html)
-with the new generation of fast parsers.
-
-### Applications
-
-Esprima serves as the basis for many popular JavaScript development tools:
-
-- Code coverage analysis: [node-cover](https://github.com/itay/node-cover), [Istanbul](https://github.com/yahoo/Istanbul)
-- Documentation tool: [JFDoc](https://github.com/thejohnfreeman/jfdoc), [JSDuck](https://github.com/senchalabs/jsduck)
-- Language extension: [LLJS](http://mbebenita.github.com/LLJS/) (low-level JS),
-[Sweet.js](http://sweetjs.org/) (macro)
-- ES6/Harmony transpiler: [Six](https://github.com/matthewrobb/six), [Harmonizr](https://github.com/jdiamond/harmonizr)
-- Eclipse Orion smart editing ([outline view](https://github.com/aclement/esprima-outline), [content assist](http://contraptionsforprogramming.blogspot.com/2012/02/better-javascript-content-assist-in.html))
-- Source code modification: [Esmorph](https://github.com/ariya/esmorph), [Code Painter](https://github.com/fawek/codepainter),
-- Source transformation: [node-falafel](https://github.com/substack/node-falafel), [Esmangle](https://github.com/Constellation/esmangle), [escodegen](https://github.com/Constellation/escodegen)
-
-### Questions?
-- [Documentation](http://esprima.org/doc)
-- [Issue tracker](http://issues.esprima.org): [known problems](http://code.google.com/p/esprima/issues/list?q=Defect)
-and [future plans](http://code.google.com/p/esprima/issues/list?q=Enhancement)
-- [Mailing list](http://groups.google.com/group/esprima)
-- [Contribution guide](http://esprima.org/doc/index.html#contribution)
-
-Follow [@Esprima](http://twitter.com/Esprima) on Twitter to get the
-development updates.
-Feedback and contribution are welcomed!
-
-### License
-
-Copyright (C) 2012, 2011 [Ariya Hidayat](http://ariya.ofilabs.com/about)
- and other contributors.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-  * Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-
-  * Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
diff --git a/node_modules/esprima/bin/esparse.js b/node_modules/esprima/bin/esparse.js
deleted file mode 100644
index 3e7bb81ea30800f1f1dd9ce5eb42c4baf1961747..0000000000000000000000000000000000000000
--- a/node_modules/esprima/bin/esparse.js
+++ /dev/null
@@ -1,117 +0,0 @@
-#!/usr/bin/env node
-/*
-  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
-  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*jslint sloppy:true node:true rhino:true */
-
-var fs, esprima, fname, content, options, syntax;
-
-if (typeof require === 'function') {
-    fs = require('fs');
-    esprima = require('esprima');
-} else if (typeof load === 'function') {
-    try {
-        load('esprima.js');
-    } catch (e) {
-        load('../esprima.js');
-    }
-}
-
-// Shims to Node.js objects when running under Rhino.
-if (typeof console === 'undefined' && typeof process === 'undefined') {
-    console = { log: print };
-    fs = { readFileSync: readFile };
-    process = { argv: arguments, exit: quit };
-    process.argv.unshift('esparse.js');
-    process.argv.unshift('rhino');
-}
-
-function showUsage() {
-    console.log('Usage:');
-    console.log('   esparse [options] file.js');
-    console.log();
-    console.log('Available options:');
-    console.log();
-    console.log('  --comment      Gather all line and block comments in an array');
-    console.log('  --loc          Include line-column location info for each syntax node');
-    console.log('  --range        Include index-based range for each syntax node');
-    console.log('  --raw          Display the raw value of literals');
-    console.log('  --tokens       List all tokens in an array');
-    console.log('  --tolerant     Tolerate errors on a best-effort basis (experimental)');
-    console.log('  -v, --version  Shows program version');
-    console.log();
-    process.exit(1);
-}
-
-if (process.argv.length <= 2) {
-    showUsage();
-}
-
-options = {};
-
-process.argv.splice(2).forEach(function (entry) {
-
-    if (entry === '-h' || entry === '--help') {
-        showUsage();
-    } else if (entry === '-v' || entry === '--version') {
-        console.log('ECMAScript Parser (using Esprima version', esprima.version, ')');
-        console.log();
-        process.exit(0);
-    } else if (entry === '--comment') {
-        options.comment = true;
-    } else if (entry === '--loc') {
-        options.loc = true;
-    } else if (entry === '--range') {
-        options.range = true;
-    } else if (entry === '--raw') {
-        options.raw = true;
-    } else if (entry === '--tokens') {
-        options.tokens = true;
-    } else if (entry === '--tolerant') {
-        options.tolerant = true;
-    } else if (entry.slice(0, 2) === '--') {
-        console.log('Error: unknown option ' + entry + '.');
-        process.exit(1);
-    } else if (typeof fname === 'string') {
-        console.log('Error: more than one input file.');
-        process.exit(1);
-    } else {
-        fname = entry;
-    }
-});
-
-if (typeof fname !== 'string') {
-    console.log('Error: no input file.');
-    process.exit(1);
-}
-
-try {
-    content = fs.readFileSync(fname, 'utf-8');
-    syntax = esprima.parse(content, options);
-    console.log(JSON.stringify(syntax, null, 4));
-} catch (e) {
-    console.log('Error: ' + e.message);
-    process.exit(1);
-}
diff --git a/node_modules/esprima/bin/esvalidate.js b/node_modules/esprima/bin/esvalidate.js
deleted file mode 100644
index e0af3f70515695e49fc47e242cd112dd73f9b7c1..0000000000000000000000000000000000000000
--- a/node_modules/esprima/bin/esvalidate.js
+++ /dev/null
@@ -1,177 +0,0 @@
-#!/usr/bin/env node
-/*
-  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*jslint sloppy:true plusplus:true node:true rhino:true */
-
-var fs, esprima, options, fnames, count;
-
-if (typeof require === 'function') {
-    fs = require('fs');
-    esprima = require('esprima');
-} else if (typeof load === 'function') {
-    try {
-        load('esprima.js');
-    } catch (e) {
-        load('../esprima.js');
-    }
-}
-
-// Shims to Node.js objects when running under Rhino.
-if (typeof console === 'undefined' && typeof process === 'undefined') {
-    console = { log: print };
-    fs = { readFileSync: readFile };
-    process = { argv: arguments, exit: quit };
-    process.argv.unshift('esvalidate.js');
-    process.argv.unshift('rhino');
-}
-
-function showUsage() {
-    console.log('Usage:');
-    console.log('   esvalidate [options] file.js');
-    console.log();
-    console.log('Available options:');
-    console.log();
-    console.log('  --format=type  Set the report format, plain (default) or junit');
-    console.log('  -v, --version  Print program version');
-    console.log();
-    process.exit(1);
-}
-
-if (process.argv.length <= 2) {
-    showUsage();
-}
-
-options = {
-    format: 'plain'
-};
-
-fnames = [];
-
-process.argv.splice(2).forEach(function (entry) {
-
-    if (entry === '-h' || entry === '--help') {
-        showUsage();
-    } else if (entry === '-v' || entry === '--version') {
-        console.log('ECMAScript Validator (using Esprima version', esprima.version, ')');
-        console.log();
-        process.exit(0);
-    } else if (entry.slice(0, 9) === '--format=') {
-        options.format = entry.slice(9);
-        if (options.format !== 'plain' && options.format !== 'junit') {
-            console.log('Error: unknown report format ' + options.format + '.');
-            process.exit(1);
-        }
-    } else if (entry.slice(0, 2) === '--') {
-        console.log('Error: unknown option ' + entry + '.');
-        process.exit(1);
-    } else {
-        fnames.push(entry);
-    }
-});
-
-if (fnames.length === 0) {
-    console.log('Error: no input file.');
-    process.exit(1);
-}
-
-if (options.format === 'junit') {
-    console.log('<?xml version="1.0" encoding="UTF-8"?>');
-    console.log('<testsuites>');
-}
-
-count = 0;
-fnames.forEach(function (fname) {
-    var content, timestamp, syntax, name;
-    try {
-        content = fs.readFileSync(fname, 'utf-8');
-
-        if (content[0] === '#' && content[1] === '!') {
-            content = '//' + content.substr(2, content.length);
-        }
-
-        timestamp = Date.now();
-        syntax = esprima.parse(content, { tolerant: true });
-
-        if (options.format === 'junit') {
-
-            name = fname;
-            if (name.lastIndexOf('/') >= 0) {
-                name = name.slice(name.lastIndexOf('/') + 1);
-            }
-
-            console.log('<testsuite name="' + fname + '" errors="0" ' +
-                ' failures="' + syntax.errors.length + '" ' +
-                ' tests="' + syntax.errors.length + '" ' +
-                ' time="' + Math.round((Date.now() - timestamp) / 1000) +
-                '">');
-
-            syntax.errors.forEach(function (error) {
-                var msg = error.message;
-                msg = msg.replace(/^Line\ [0-9]*\:\ /, '');
-                console.log('  <testcase name="Line ' + error.lineNumber + ': ' + msg + '" ' +
-                    ' time="0">');
-                console.log('    <error type="SyntaxError" message="' + error.message + '">' +
-                    error.message + '(' + name + ':' + error.lineNumber + ')' +
-                    '</error>');
-                console.log('  </testcase>');
-            });
-
-            console.log('</testsuite>');
-
-        } else if (options.format === 'plain') {
-
-            syntax.errors.forEach(function (error) {
-                var msg = error.message;
-                msg = msg.replace(/^Line\ [0-9]*\:\ /, '');
-                msg = fname + ':' + error.lineNumber + ': ' + msg;
-                console.log(msg);
-                ++count;
-            });
-
-        }
-    } catch (e) {
-        ++count;
-        if (options.format === 'junit') {
-            console.log('<testsuite name="' + fname + '" errors="1" failures="0" tests="1" ' +
-                ' time="' + Math.round((Date.now() - timestamp) / 1000) + '">');
-            console.log(' <testcase name="' + e.message + '" ' + ' time="0">');
-            console.log(' <error type="ParseError" message="' + e.message + '">' +
-                e.message + '(' + fname + ((e.lineNumber) ? ':' + e.lineNumber : '') +
-                ')</error>');
-            console.log(' </testcase>');
-            console.log('</testsuite>');
-        } else {
-            console.log('Error: ' + e.message);
-        }
-    }
-});
-
-if (options.format === 'junit') {
-    console.log('</testsuites>');
-}
-
-if (count > 0) {
-    process.exit(1);
-}
diff --git a/node_modules/esprima/esprima.js b/node_modules/esprima/esprima.js
deleted file mode 100644
index f1320daf9bd1907f968525e2b3a27e42efc14f3d..0000000000000000000000000000000000000000
--- a/node_modules/esprima/esprima.js
+++ /dev/null
@@ -1,3908 +0,0 @@
-/*
-  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
-  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>
-  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>
-  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>
-  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>
-  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>
-  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*jslint bitwise:true plusplus:true */
-/*global esprima:true, define:true, exports:true, window: true,
-throwError: true, createLiteral: true, generateStatement: true,
-parseAssignmentExpression: true, parseBlock: true, parseExpression: true,
-parseFunctionDeclaration: true, parseFunctionExpression: true,
-parseFunctionSourceElements: true, parseVariableIdentifier: true,
-parseLeftHandSideExpression: true,
-parseStatement: true, parseSourceElement: true */
-
-(function (root, factory) {
-    'use strict';
-
-    // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js,
-    // Rhino, and plain browser loading.
-    if (typeof define === 'function' && define.amd) {
-        define(['exports'], factory);
-    } else if (typeof exports !== 'undefined') {
-        factory(exports);
-    } else {
-        factory((root.esprima = {}));
-    }
-}(this, function (exports) {
-    'use strict';
-
-    var Token,
-        TokenName,
-        Syntax,
-        PropertyKind,
-        Messages,
-        Regex,
-        source,
-        strict,
-        index,
-        lineNumber,
-        lineStart,
-        length,
-        buffer,
-        state,
-        extra;
-
-    Token = {
-        BooleanLiteral: 1,
-        EOF: 2,
-        Identifier: 3,
-        Keyword: 4,
-        NullLiteral: 5,
-        NumericLiteral: 6,
-        Punctuator: 7,
-        StringLiteral: 8
-    };
-
-    TokenName = {};
-    TokenName[Token.BooleanLiteral] = 'Boolean';
-    TokenName[Token.EOF] = '<end>';
-    TokenName[Token.Identifier] = 'Identifier';
-    TokenName[Token.Keyword] = 'Keyword';
-    TokenName[Token.NullLiteral] = 'Null';
-    TokenName[Token.NumericLiteral] = 'Numeric';
-    TokenName[Token.Punctuator] = 'Punctuator';
-    TokenName[Token.StringLiteral] = 'String';
-
-    Syntax = {
-        AssignmentExpression: 'AssignmentExpression',
-        ArrayExpression: 'ArrayExpression',
-        BlockStatement: 'BlockStatement',
-        BinaryExpression: 'BinaryExpression',
-        BreakStatement: 'BreakStatement',
-        CallExpression: 'CallExpression',
-        CatchClause: 'CatchClause',
-        ConditionalExpression: 'ConditionalExpression',
-        ContinueStatement: 'ContinueStatement',
-        DoWhileStatement: 'DoWhileStatement',
-        DebuggerStatement: 'DebuggerStatement',
-        EmptyStatement: 'EmptyStatement',
-        ExpressionStatement: 'ExpressionStatement',
-        ForStatement: 'ForStatement',
-        ForInStatement: 'ForInStatement',
-        FunctionDeclaration: 'FunctionDeclaration',
-        FunctionExpression: 'FunctionExpression',
-        Identifier: 'Identifier',
-        IfStatement: 'IfStatement',
-        Literal: 'Literal',
-        LabeledStatement: 'LabeledStatement',
-        LogicalExpression: 'LogicalExpression',
-        MemberExpression: 'MemberExpression',
-        NewExpression: 'NewExpression',
-        ObjectExpression: 'ObjectExpression',
-        Program: 'Program',
-        Property: 'Property',
-        ReturnStatement: 'ReturnStatement',
-        SequenceExpression: 'SequenceExpression',
-        SwitchStatement: 'SwitchStatement',
-        SwitchCase: 'SwitchCase',
-        ThisExpression: 'ThisExpression',
-        ThrowStatement: 'ThrowStatement',
-        TryStatement: 'TryStatement',
-        UnaryExpression: 'UnaryExpression',
-        UpdateExpression: 'UpdateExpression',
-        VariableDeclaration: 'VariableDeclaration',
-        VariableDeclarator: 'VariableDeclarator',
-        WhileStatement: 'WhileStatement',
-        WithStatement: 'WithStatement'
-    };
-
-    PropertyKind = {
-        Data: 1,
-        Get: 2,
-        Set: 4
-    };
-
-    // Error messages should be identical to V8.
-    Messages = {
-        UnexpectedToken:  'Unexpected token %0',
-        UnexpectedNumber:  'Unexpected number',
-        UnexpectedString:  'Unexpected string',
-        UnexpectedIdentifier:  'Unexpected identifier',
-        UnexpectedReserved:  'Unexpected reserved word',
-        UnexpectedEOS:  'Unexpected end of input',
-        NewlineAfterThrow:  'Illegal newline after throw',
-        InvalidRegExp: 'Invalid regular expression',
-        UnterminatedRegExp:  'Invalid regular expression: missing /',
-        InvalidLHSInAssignment:  'Invalid left-hand side in assignment',
-        InvalidLHSInForIn:  'Invalid left-hand side in for-in',
-        MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
-        NoCatchOrFinally:  'Missing catch or finally after try',
-        UnknownLabel: 'Undefined label \'%0\'',
-        Redeclaration: '%0 \'%1\' has already been declared',
-        IllegalContinue: 'Illegal continue statement',
-        IllegalBreak: 'Illegal break statement',
-        IllegalReturn: 'Illegal return statement',
-        StrictModeWith:  'Strict mode code may not include a with statement',
-        StrictCatchVariable:  'Catch variable may not be eval or arguments in strict mode',
-        StrictVarName:  'Variable name may not be eval or arguments in strict mode',
-        StrictParamName:  'Parameter name eval or arguments is not allowed in strict mode',
-        StrictParamDupe: 'Strict mode function may not have duplicate parameter names',
-        StrictFunctionName:  'Function name may not be eval or arguments in strict mode',
-        StrictOctalLiteral:  'Octal literals are not allowed in strict mode.',
-        StrictDelete:  'Delete of an unqualified identifier in strict mode.',
-        StrictDuplicateProperty:  'Duplicate data property in object literal not allowed in strict mode',
-        AccessorDataProperty:  'Object literal may not have data and accessor property with the same name',
-        AccessorGetSet:  'Object literal may not have multiple get/set accessors with the same name',
-        StrictLHSAssignment:  'Assignment to eval or arguments is not allowed in strict mode',
-        StrictLHSPostfix:  'Postfix increment/decrement may not have eval or arguments operand in strict mode',
-        StrictLHSPrefix:  'Prefix increment/decrement may not have eval or arguments operand in strict mode',
-        StrictReservedWord:  'Use of future reserved word in strict mode'
-    };
-
-    // See also tools/generate-unicode-regex.py.
-    Regex = {
-        NonAsciiIdentifierStart: new RegExp('[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]'),
-        NonAsciiIdentifierPart: new RegExp('[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u0800-\u082d\u0840-\u085b\u08a0\u08a2-\u08ac\u08e4-\u08fe\u0900-\u0963\u0966-\u096f\u0971-\u0977\u0979-\u097f\u0981-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2\u0d02\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17d3\u17d7\u17dc\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191c\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19d9\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1cd0-\u1cd2\u1cd4-\u1cf6\u1d00-\u1de6\u1dfc-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u200c\u200d\u203f\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua697\ua69f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua827\ua840-\ua873\ua880-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua900-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a\uaa7b\uaa80-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabea\uabec\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\ufe70-\ufe74\ufe76-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]')
-    };
-
-    // Ensure the condition is true, otherwise throw an error.
-    // This is only to have a better contract semantic, i.e. another safety net
-    // to catch a logic error. The condition shall be fulfilled in normal case.
-    // Do NOT use this to enforce a certain condition on any user input.
-
-    function assert(condition, message) {
-        if (!condition) {
-            throw new Error('ASSERT: ' + message);
-        }
-    }
-
-    function sliceSource(from, to) {
-        return source.slice(from, to);
-    }
-
-    if (typeof 'esprima'[0] === 'undefined') {
-        sliceSource = function sliceArraySource(from, to) {
-            return source.slice(from, to).join('');
-        };
-    }
-
-    function isDecimalDigit(ch) {
-        return '0123456789'.indexOf(ch) >= 0;
-    }
-
-    function isHexDigit(ch) {
-        return '0123456789abcdefABCDEF'.indexOf(ch) >= 0;
-    }
-
-    function isOctalDigit(ch) {
-        return '01234567'.indexOf(ch) >= 0;
-    }
-
-
-    // 7.2 White Space
-
-    function isWhiteSpace(ch) {
-        return (ch === ' ') || (ch === '\u0009') || (ch === '\u000B') ||
-            (ch === '\u000C') || (ch === '\u00A0') ||
-            (ch.charCodeAt(0) >= 0x1680 &&
-             '\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\uFEFF'.indexOf(ch) >= 0);
-    }
-
-    // 7.3 Line Terminators
-
-    function isLineTerminator(ch) {
-        return (ch === '\n' || ch === '\r' || ch === '\u2028' || ch === '\u2029');
-    }
-
-    // 7.6 Identifier Names and Identifiers
-
-    function isIdentifierStart(ch) {
-        return (ch === '$') || (ch === '_') || (ch === '\\') ||
-            (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
-            ((ch.charCodeAt(0) >= 0x80) && Regex.NonAsciiIdentifierStart.test(ch));
-    }
-
-    function isIdentifierPart(ch) {
-        return (ch === '$') || (ch === '_') || (ch === '\\') ||
-            (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
-            ((ch >= '0') && (ch <= '9')) ||
-            ((ch.charCodeAt(0) >= 0x80) && Regex.NonAsciiIdentifierPart.test(ch));
-    }
-
-    // 7.6.1.2 Future Reserved Words
-
-    function isFutureReservedWord(id) {
-        switch (id) {
-
-        // Future reserved words.
-        case 'class':
-        case 'enum':
-        case 'export':
-        case 'extends':
-        case 'import':
-        case 'super':
-            return true;
-        }
-
-        return false;
-    }
-
-    function isStrictModeReservedWord(id) {
-        switch (id) {
-
-        // Strict Mode reserved words.
-        case 'implements':
-        case 'interface':
-        case 'package':
-        case 'private':
-        case 'protected':
-        case 'public':
-        case 'static':
-        case 'yield':
-        case 'let':
-            return true;
-        }
-
-        return false;
-    }
-
-    function isRestrictedWord(id) {
-        return id === 'eval' || id === 'arguments';
-    }
-
-    // 7.6.1.1 Keywords
-
-    function isKeyword(id) {
-        var keyword = false;
-        switch (id.length) {
-        case 2:
-            keyword = (id === 'if') || (id === 'in') || (id === 'do');
-            break;
-        case 3:
-            keyword = (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try');
-            break;
-        case 4:
-            keyword = (id === 'this') || (id === 'else') || (id === 'case') || (id === 'void') || (id === 'with');
-            break;
-        case 5:
-            keyword = (id === 'while') || (id === 'break') || (id === 'catch') || (id === 'throw');
-            break;
-        case 6:
-            keyword = (id === 'return') || (id === 'typeof') || (id === 'delete') || (id === 'switch');
-            break;
-        case 7:
-            keyword = (id === 'default') || (id === 'finally');
-            break;
-        case 8:
-            keyword = (id === 'function') || (id === 'continue') || (id === 'debugger');
-            break;
-        case 10:
-            keyword = (id === 'instanceof');
-            break;
-        }
-
-        if (keyword) {
-            return true;
-        }
-
-        switch (id) {
-        // Future reserved words.
-        // 'const' is specialized as Keyword in V8.
-        case 'const':
-            return true;
-
-        // For compatiblity to SpiderMonkey and ES.next
-        case 'yield':
-        case 'let':
-            return true;
-        }
-
-        if (strict && isStrictModeReservedWord(id)) {
-            return true;
-        }
-
-        return isFutureReservedWord(id);
-    }
-
-    // 7.4 Comments
-
-    function skipComment() {
-        var ch, blockComment, lineComment;
-
-        blockComment = false;
-        lineComment = false;
-
-        while (index < length) {
-            ch = source[index];
-
-            if (lineComment) {
-                ch = source[index++];
-                if (isLineTerminator(ch)) {
-                    lineComment = false;
-                    if (ch === '\r' && source[index] === '\n') {
-                        ++index;
-                    }
-                    ++lineNumber;
-                    lineStart = index;
-                }
-            } else if (blockComment) {
-                if (isLineTerminator(ch)) {
-                    if (ch === '\r' && source[index + 1] === '\n') {
-                        ++index;
-                    }
-                    ++lineNumber;
-                    ++index;
-                    lineStart = index;
-                    if (index >= length) {
-                        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-                    }
-                } else {
-                    ch = source[index++];
-                    if (index >= length) {
-                        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-                    }
-                    if (ch === '*') {
-                        ch = source[index];
-                        if (ch === '/') {
-                            ++index;
-                            blockComment = false;
-                        }
-                    }
-                }
-            } else if (ch === '/') {
-                ch = source[index + 1];
-                if (ch === '/') {
-                    index += 2;
-                    lineComment = true;
-                } else if (ch === '*') {
-                    index += 2;
-                    blockComment = true;
-                    if (index >= length) {
-                        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-                    }
-                } else {
-                    break;
-                }
-            } else if (isWhiteSpace(ch)) {
-                ++index;
-            } else if (isLineTerminator(ch)) {
-                ++index;
-                if (ch ===  '\r' && source[index] === '\n') {
-                    ++index;
-                }
-                ++lineNumber;
-                lineStart = index;
-            } else {
-                break;
-            }
-        }
-    }
-
-    function scanHexEscape(prefix) {
-        var i, len, ch, code = 0;
-
-        len = (prefix === 'u') ? 4 : 2;
-        for (i = 0; i < len; ++i) {
-            if (index < length && isHexDigit(source[index])) {
-                ch = source[index++];
-                code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase());
-            } else {
-                return '';
-            }
-        }
-        return String.fromCharCode(code);
-    }
-
-    function scanIdentifier() {
-        var ch, start, id, restore;
-
-        ch = source[index];
-        if (!isIdentifierStart(ch)) {
-            return;
-        }
-
-        start = index;
-        if (ch === '\\') {
-            ++index;
-            if (source[index] !== 'u') {
-                return;
-            }
-            ++index;
-            restore = index;
-            ch = scanHexEscape('u');
-            if (ch) {
-                if (ch === '\\' || !isIdentifierStart(ch)) {
-                    return;
-                }
-                id = ch;
-            } else {
-                index = restore;
-                id = 'u';
-            }
-        } else {
-            id = source[index++];
-        }
-
-        while (index < length) {
-            ch = source[index];
-            if (!isIdentifierPart(ch)) {
-                break;
-            }
-            if (ch === '\\') {
-                ++index;
-                if (source[index] !== 'u') {
-                    return;
-                }
-                ++index;
-                restore = index;
-                ch = scanHexEscape('u');
-                if (ch) {
-                    if (ch === '\\' || !isIdentifierPart(ch)) {
-                        return;
-                    }
-                    id += ch;
-                } else {
-                    index = restore;
-                    id += 'u';
-                }
-            } else {
-                id += source[index++];
-            }
-        }
-
-        // There is no keyword or literal with only one character.
-        // Thus, it must be an identifier.
-        if (id.length === 1) {
-            return {
-                type: Token.Identifier,
-                value: id,
-                lineNumber: lineNumber,
-                lineStart: lineStart,
-                range: [start, index]
-            };
-        }
-
-        if (isKeyword(id)) {
-            return {
-                type: Token.Keyword,
-                value: id,
-                lineNumber: lineNumber,
-                lineStart: lineStart,
-                range: [start, index]
-            };
-        }
-
-        // 7.8.1 Null Literals
-
-        if (id === 'null') {
-            return {
-                type: Token.NullLiteral,
-                value: id,
-                lineNumber: lineNumber,
-                lineStart: lineStart,
-                range: [start, index]
-            };
-        }
-
-        // 7.8.2 Boolean Literals
-
-        if (id === 'true' || id === 'false') {
-            return {
-                type: Token.BooleanLiteral,
-                value: id,
-                lineNumber: lineNumber,
-                lineStart: lineStart,
-                range: [start, index]
-            };
-        }
-
-        return {
-            type: Token.Identifier,
-            value: id,
-            lineNumber: lineNumber,
-            lineStart: lineStart,
-            range: [start, index]
-        };
-    }
-
-    // 7.7 Punctuators
-
-    function scanPunctuator() {
-        var start = index,
-            ch1 = source[index],
-            ch2,
-            ch3,
-            ch4;
-
-        // Check for most common single-character punctuators.
-
-        if (ch1 === ';' || ch1 === '{' || ch1 === '}') {
-            ++index;
-            return {
-                type: Token.Punctuator,
-                value: ch1,
-                lineNumber: lineNumber,
-                lineStart: lineStart,
-                range: [start, index]
-            };
-        }
-
-        if (ch1 === ',' || ch1 === '(' || ch1 === ')') {
-            ++index;
-            return {
-                type: Token.Punctuator,
-                value: ch1,
-                lineNumber: lineNumber,
-                lineStart: lineStart,
-                range: [start, index]
-            };
-        }
-
-        // Dot (.) can also start a floating-point number, hence the need
-        // to check the next character.
-
-        ch2 = source[index + 1];
-        if (ch1 === '.' && !isDecimalDigit(ch2)) {
-            return {
-                type: Token.Punctuator,
-                value: source[index++],
-                lineNumber: lineNumber,
-                lineStart: lineStart,
-                range: [start, index]
-            };
-        }
-
-        // Peek more characters.
-
-        ch3 = source[index + 2];
-        ch4 = source[index + 3];
-
-        // 4-character punctuator: >>>=
-
-        if (ch1 === '>' && ch2 === '>' && ch3 === '>') {
-            if (ch4 === '=') {
-                index += 4;
-                return {
-                    type: Token.Punctuator,
-                    value: '>>>=',
-                    lineNumber: lineNumber,
-                    lineStart: lineStart,
-                    range: [start, index]
-                };
-            }
-        }
-
-        // 3-character punctuators: === !== >>> <<= >>=
-
-        if (ch1 === '=' && ch2 === '=' && ch3 === '=') {
-            index += 3;
-            return {
-                type: Token.Punctuator,
-                value: '===',
-                lineNumber: lineNumber,
-                lineStart: lineStart,
-                range: [start, index]
-            };
-        }
-
-        if (ch1 === '!' && ch2 === '=' && ch3 === '=') {
-            index += 3;
-            return {
-                type: Token.Punctuator,
-                value: '!==',
-                lineNumber: lineNumber,
-                lineStart: lineStart,
-                range: [start, index]
-            };
-        }
-
-        if (ch1 === '>' && ch2 === '>' && ch3 === '>') {
-            index += 3;
-            return {
-                type: Token.Punctuator,
-                value: '>>>',
-                lineNumber: lineNumber,
-                lineStart: lineStart,
-                range: [start, index]
-            };
-        }
-
-        if (ch1 === '<' && ch2 === '<' && ch3 === '=') {
-            index += 3;
-            return {
-                type: Token.Punctuator,
-                value: '<<=',
-                lineNumber: lineNumber,
-                lineStart: lineStart,
-                range: [start, index]
-            };
-        }
-
-        if (ch1 === '>' && ch2 === '>' && ch3 === '=') {
-            index += 3;
-            return {
-                type: Token.Punctuator,
-                value: '>>=',
-                lineNumber: lineNumber,
-                lineStart: lineStart,
-                range: [start, index]
-            };
-        }
-
-        // 2-character punctuators: <= >= == != ++ -- << >> && ||
-        // += -= *= %= &= |= ^= /=
-
-        if (ch2 === '=') {
-            if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {
-                index += 2;
-                return {
-                    type: Token.Punctuator,
-                    value: ch1 + ch2,
-                    lineNumber: lineNumber,
-                    lineStart: lineStart,
-                    range: [start, index]
-                };
-            }
-        }
-
-        if (ch1 === ch2 && ('+-<>&|'.indexOf(ch1) >= 0)) {
-            if ('+-<>&|'.indexOf(ch2) >= 0) {
-                index += 2;
-                return {
-                    type: Token.Punctuator,
-                    value: ch1 + ch2,
-                    lineNumber: lineNumber,
-                    lineStart: lineStart,
-                    range: [start, index]
-                };
-            }
-        }
-
-        // The remaining 1-character punctuators.
-
-        if ('[]<>+-*%&|^!~?:=/'.indexOf(ch1) >= 0) {
-            return {
-                type: Token.Punctuator,
-                value: source[index++],
-                lineNumber: lineNumber,
-                lineStart: lineStart,
-                range: [start, index]
-            };
-        }
-    }
-
-    // 7.8.3 Numeric Literals
-
-    function scanNumericLiteral() {
-        var number, start, ch;
-
-        ch = source[index];
-        assert(isDecimalDigit(ch) || (ch === '.'),
-            'Numeric literal must start with a decimal digit or a decimal point');
-
-        start = index;
-        number = '';
-        if (ch !== '.') {
-            number = source[index++];
-            ch = source[index];
-
-            // Hex number starts with '0x'.
-            // Octal number starts with '0'.
-            if (number === '0') {
-                if (ch === 'x' || ch === 'X') {
-                    number += source[index++];
-                    while (index < length) {
-                        ch = source[index];
-                        if (!isHexDigit(ch)) {
-                            break;
-                        }
-                        number += source[index++];
-                    }
-
-                    if (number.length <= 2) {
-                        // only 0x
-                        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-                    }
-
-                    if (index < length) {
-                        ch = source[index];
-                        if (isIdentifierStart(ch)) {
-                            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-                        }
-                    }
-                    return {
-                        type: Token.NumericLiteral,
-                        value: parseInt(number, 16),
-                        lineNumber: lineNumber,
-                        lineStart: lineStart,
-                        range: [start, index]
-                    };
-                } else if (isOctalDigit(ch)) {
-                    number += source[index++];
-                    while (index < length) {
-                        ch = source[index];
-                        if (!isOctalDigit(ch)) {
-                            break;
-                        }
-                        number += source[index++];
-                    }
-
-                    if (index < length) {
-                        ch = source[index];
-                        if (isIdentifierStart(ch) || isDecimalDigit(ch)) {
-                            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-                        }
-                    }
-                    return {
-                        type: Token.NumericLiteral,
-                        value: parseInt(number, 8),
-                        octal: true,
-                        lineNumber: lineNumber,
-                        lineStart: lineStart,
-                        range: [start, index]
-                    };
-                }
-
-                // decimal number starts with '0' such as '09' is illegal.
-                if (isDecimalDigit(ch)) {
-                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-                }
-            }
-
-            while (index < length) {
-                ch = source[index];
-                if (!isDecimalDigit(ch)) {
-                    break;
-                }
-                number += source[index++];
-            }
-        }
-
-        if (ch === '.') {
-            number += source[index++];
-            while (index < length) {
-                ch = source[index];
-                if (!isDecimalDigit(ch)) {
-                    break;
-                }
-                number += source[index++];
-            }
-        }
-
-        if (ch === 'e' || ch === 'E') {
-            number += source[index++];
-
-            ch = source[index];
-            if (ch === '+' || ch === '-') {
-                number += source[index++];
-            }
-
-            ch = source[index];
-            if (isDecimalDigit(ch)) {
-                number += source[index++];
-                while (index < length) {
-                    ch = source[index];
-                    if (!isDecimalDigit(ch)) {
-                        break;
-                    }
-                    number += source[index++];
-                }
-            } else {
-                ch = 'character ' + ch;
-                if (index >= length) {
-                    ch = '<end>';
-                }
-                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-            }
-        }
-
-        if (index < length) {
-            ch = source[index];
-            if (isIdentifierStart(ch)) {
-                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-            }
-        }
-
-        return {
-            type: Token.NumericLiteral,
-            value: parseFloat(number),
-            lineNumber: lineNumber,
-            lineStart: lineStart,
-            range: [start, index]
-        };
-    }
-
-    // 7.8.4 String Literals
-
-    function scanStringLiteral() {
-        var str = '', quote, start, ch, code, unescaped, restore, octal = false;
-
-        quote = source[index];
-        assert((quote === '\'' || quote === '"'),
-            'String literal must starts with a quote');
-
-        start = index;
-        ++index;
-
-        while (index < length) {
-            ch = source[index++];
-
-            if (ch === quote) {
-                quote = '';
-                break;
-            } else if (ch === '\\') {
-                ch = source[index++];
-                if (!isLineTerminator(ch)) {
-                    switch (ch) {
-                    case 'n':
-                        str += '\n';
-                        break;
-                    case 'r':
-                        str += '\r';
-                        break;
-                    case 't':
-                        str += '\t';
-                        break;
-                    case 'u':
-                    case 'x':
-                        restore = index;
-                        unescaped = scanHexEscape(ch);
-                        if (unescaped) {
-                            str += unescaped;
-                        } else {
-                            index = restore;
-                            str += ch;
-                        }
-                        break;
-                    case 'b':
-                        str += '\b';
-                        break;
-                    case 'f':
-                        str += '\f';
-                        break;
-                    case 'v':
-                        str += '\x0B';
-                        break;
-
-                    default:
-                        if (isOctalDigit(ch)) {
-                            code = '01234567'.indexOf(ch);
-
-                            // \0 is not octal escape sequence
-                            if (code !== 0) {
-                                octal = true;
-                            }
-
-                            if (index < length && isOctalDigit(source[index])) {
-                                octal = true;
-                                code = code * 8 + '01234567'.indexOf(source[index++]);
-
-                                // 3 digits are only allowed when string starts
-                                // with 0, 1, 2, 3
-                                if ('0123'.indexOf(ch) >= 0 &&
-                                        index < length &&
-                                        isOctalDigit(source[index])) {
-                                    code = code * 8 + '01234567'.indexOf(source[index++]);
-                                }
-                            }
-                            str += String.fromCharCode(code);
-                        } else {
-                            str += ch;
-                        }
-                        break;
-                    }
-                } else {
-                    ++lineNumber;
-                    if (ch ===  '\r' && source[index] === '\n') {
-                        ++index;
-                    }
-                }
-            } else if (isLineTerminator(ch)) {
-                break;
-            } else {
-                str += ch;
-            }
-        }
-
-        if (quote !== '') {
-            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-        }
-
-        return {
-            type: Token.StringLiteral,
-            value: str,
-            octal: octal,
-            lineNumber: lineNumber,
-            lineStart: lineStart,
-            range: [start, index]
-        };
-    }
-
-    function scanRegExp() {
-        var str, ch, start, pattern, flags, value, classMarker = false, restore, terminated = false;
-
-        buffer = null;
-        skipComment();
-
-        start = index;
-        ch = source[index];
-        assert(ch === '/', 'Regular expression literal must start with a slash');
-        str = source[index++];
-
-        while (index < length) {
-            ch = source[index++];
-            str += ch;
-            if (ch === '\\') {
-                ch = source[index++];
-                // ECMA-262 7.8.5
-                if (isLineTerminator(ch)) {
-                    throwError({}, Messages.UnterminatedRegExp);
-                }
-                str += ch;
-            } else if (classMarker) {
-                if (ch === ']') {
-                    classMarker = false;
-                }
-            } else {
-                if (ch === '/') {
-                    terminated = true;
-                    break;
-                } else if (ch === '[') {
-                    classMarker = true;
-                } else if (isLineTerminator(ch)) {
-                    throwError({}, Messages.UnterminatedRegExp);
-                }
-            }
-        }
-
-        if (!terminated) {
-            throwError({}, Messages.UnterminatedRegExp);
-        }
-
-        // Exclude leading and trailing slash.
-        pattern = str.substr(1, str.length - 2);
-
-        flags = '';
-        while (index < length) {
-            ch = source[index];
-            if (!isIdentifierPart(ch)) {
-                break;
-            }
-
-            ++index;
-            if (ch === '\\' && index < length) {
-                ch = source[index];
-                if (ch === 'u') {
-                    ++index;
-                    restore = index;
-                    ch = scanHexEscape('u');
-                    if (ch) {
-                        flags += ch;
-                        str += '\\u';
-                        for (; restore < index; ++restore) {
-                            str += source[restore];
-                        }
-                    } else {
-                        index = restore;
-                        flags += 'u';
-                        str += '\\u';
-                    }
-                } else {
-                    str += '\\';
-                }
-            } else {
-                flags += ch;
-                str += ch;
-            }
-        }
-
-        try {
-            value = new RegExp(pattern, flags);
-        } catch (e) {
-            throwError({}, Messages.InvalidRegExp);
-        }
-
-        return {
-            literal: str,
-            value: value,
-            range: [start, index]
-        };
-    }
-
-    function isIdentifierName(token) {
-        return token.type === Token.Identifier ||
-            token.type === Token.Keyword ||
-            token.type === Token.BooleanLiteral ||
-            token.type === Token.NullLiteral;
-    }
-
-    function advance() {
-        var ch, token;
-
-        skipComment();
-
-        if (index >= length) {
-            return {
-                type: Token.EOF,
-                lineNumber: lineNumber,
-                lineStart: lineStart,
-                range: [index, index]
-            };
-        }
-
-        token = scanPunctuator();
-        if (typeof token !== 'undefined') {
-            return token;
-        }
-
-        ch = source[index];
-
-        if (ch === '\'' || ch === '"') {
-            return scanStringLiteral();
-        }
-
-        if (ch === '.' || isDecimalDigit(ch)) {
-            return scanNumericLiteral();
-        }
-
-        token = scanIdentifier();
-        if (typeof token !== 'undefined') {
-            return token;
-        }
-
-        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-    }
-
-    function lex() {
-        var token;
-
-        if (buffer) {
-            index = buffer.range[1];
-            lineNumber = buffer.lineNumber;
-            lineStart = buffer.lineStart;
-            token = buffer;
-            buffer = null;
-            return token;
-        }
-
-        buffer = null;
-        return advance();
-    }
-
-    function lookahead() {
-        var pos, line, start;
-
-        if (buffer !== null) {
-            return buffer;
-        }
-
-        pos = index;
-        line = lineNumber;
-        start = lineStart;
-        buffer = advance();
-        index = pos;
-        lineNumber = line;
-        lineStart = start;
-
-        return buffer;
-    }
-
-    // Return true if there is a line terminator before the next token.
-
-    function peekLineTerminator() {
-        var pos, line, start, found;
-
-        pos = index;
-        line = lineNumber;
-        start = lineStart;
-        skipComment();
-        found = lineNumber !== line;
-        index = pos;
-        lineNumber = line;
-        lineStart = start;
-
-        return found;
-    }
-
-    // Throw an exception
-
-    function throwError(token, messageFormat) {
-        var error,
-            args = Array.prototype.slice.call(arguments, 2),
-            msg = messageFormat.replace(
-                /%(\d)/g,
-                function (whole, index) {
-                    return args[index] || '';
-                }
-            );
-
-        if (typeof token.lineNumber === 'number') {
-            error = new Error('Line ' + token.lineNumber + ': ' + msg);
-            error.index = token.range[0];
-            error.lineNumber = token.lineNumber;
-            error.column = token.range[0] - lineStart + 1;
-        } else {
-            error = new Error('Line ' + lineNumber + ': ' + msg);
-            error.index = index;
-            error.lineNumber = lineNumber;
-            error.column = index - lineStart + 1;
-        }
-
-        throw error;
-    }
-
-    function throwErrorTolerant() {
-        try {
-            throwError.apply(null, arguments);
-        } catch (e) {
-            if (extra.errors) {
-                extra.errors.push(e);
-            } else {
-                throw e;
-            }
-        }
-    }
-
-
-    // Throw an exception because of the token.
-
-    function throwUnexpected(token) {
-        if (token.type === Token.EOF) {
-            throwError(token, Messages.UnexpectedEOS);
-        }
-
-        if (token.type === Token.NumericLiteral) {
-            throwError(token, Messages.UnexpectedNumber);
-        }
-
-        if (token.type === Token.StringLiteral) {
-            throwError(token, Messages.UnexpectedString);
-        }
-
-        if (token.type === Token.Identifier) {
-            throwError(token, Messages.UnexpectedIdentifier);
-        }
-
-        if (token.type === Token.Keyword) {
-            if (isFutureReservedWord(token.value)) {
-                throwError(token, Messages.UnexpectedReserved);
-            } else if (strict && isStrictModeReservedWord(token.value)) {
-                throwErrorTolerant(token, Messages.StrictReservedWord);
-                return;
-            }
-            throwError(token, Messages.UnexpectedToken, token.value);
-        }
-
-        // BooleanLiteral, NullLiteral, or Punctuator.
-        throwError(token, Messages.UnexpectedToken, token.value);
-    }
-
-    // Expect the next token to match the specified punctuator.
-    // If not, an exception will be thrown.
-
-    function expect(value) {
-        var token = lex();
-        if (token.type !== Token.Punctuator || token.value !== value) {
-            throwUnexpected(token);
-        }
-    }
-
-    // Expect the next token to match the specified keyword.
-    // If not, an exception will be thrown.
-
-    function expectKeyword(keyword) {
-        var token = lex();
-        if (token.type !== Token.Keyword || token.value !== keyword) {
-            throwUnexpected(token);
-        }
-    }
-
-    // Return true if the next token matches the specified punctuator.
-
-    function match(value) {
-        var token = lookahead();
-        return token.type === Token.Punctuator && token.value === value;
-    }
-
-    // Return true if the next token matches the specified keyword
-
-    function matchKeyword(keyword) {
-        var token = lookahead();
-        return token.type === Token.Keyword && token.value === keyword;
-    }
-
-    // Return true if the next token is an assignment operator
-
-    function matchAssign() {
-        var token = lookahead(),
-            op = token.value;
-
-        if (token.type !== Token.Punctuator) {
-            return false;
-        }
-        return op === '=' ||
-            op === '*=' ||
-            op === '/=' ||
-            op === '%=' ||
-            op === '+=' ||
-            op === '-=' ||
-            op === '<<=' ||
-            op === '>>=' ||
-            op === '>>>=' ||
-            op === '&=' ||
-            op === '^=' ||
-            op === '|=';
-    }
-
-    function consumeSemicolon() {
-        var token, line;
-
-        // Catch the very common case first.
-        if (source[index] === ';') {
-            lex();
-            return;
-        }
-
-        line = lineNumber;
-        skipComment();
-        if (lineNumber !== line) {
-            return;
-        }
-
-        if (match(';')) {
-            lex();
-            return;
-        }
-
-        token = lookahead();
-        if (token.type !== Token.EOF && !match('}')) {
-            throwUnexpected(token);
-        }
-    }
-
-    // Return true if provided expression is LeftHandSideExpression
-
-    function isLeftHandSide(expr) {
-        return expr.type === Syntax.Identifier || expr.type === Syntax.MemberExpression;
-    }
-
-    // 11.1.4 Array Initialiser
-
-    function parseArrayInitialiser() {
-        var elements = [];
-
-        expect('[');
-
-        while (!match(']')) {
-            if (match(',')) {
-                lex();
-                elements.push(null);
-            } else {
-                elements.push(parseAssignmentExpression());
-
-                if (!match(']')) {
-                    expect(',');
-                }
-            }
-        }
-
-        expect(']');
-
-        return {
-            type: Syntax.ArrayExpression,
-            elements: elements
-        };
-    }
-
-    // 11.1.5 Object Initialiser
-
-    function parsePropertyFunction(param, first) {
-        var previousStrict, body;
-
-        previousStrict = strict;
-        body = parseFunctionSourceElements();
-        if (first && strict && isRestrictedWord(param[0].name)) {
-            throwErrorTolerant(first, Messages.StrictParamName);
-        }
-        strict = previousStrict;
-
-        return {
-            type: Syntax.FunctionExpression,
-            id: null,
-            params: param,
-            defaults: [],
-            body: body,
-            rest: null,
-            generator: false,
-            expression: false
-        };
-    }
-
-    function parseObjectPropertyKey() {
-        var token = lex();
-
-        // Note: This function is called only from parseObjectProperty(), where
-        // EOF and Punctuator tokens are already filtered out.
-
-        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {
-            if (strict && token.octal) {
-                throwErrorTolerant(token, Messages.StrictOctalLiteral);
-            }
-            return createLiteral(token);
-        }
-
-        return {
-            type: Syntax.Identifier,
-            name: token.value
-        };
-    }
-
-    function parseObjectProperty() {
-        var token, key, id, param;
-
-        token = lookahead();
-
-        if (token.type === Token.Identifier) {
-
-            id = parseObjectPropertyKey();
-
-            // Property Assignment: Getter and Setter.
-
-            if (token.value === 'get' && !match(':')) {
-                key = parseObjectPropertyKey();
-                expect('(');
-                expect(')');
-                return {
-                    type: Syntax.Property,
-                    key: key,
-                    value: parsePropertyFunction([]),
-                    kind: 'get'
-                };
-            } else if (token.value === 'set' && !match(':')) {
-                key = parseObjectPropertyKey();
-                expect('(');
-                token = lookahead();
-                if (token.type !== Token.Identifier) {
-                    expect(')');
-                    throwErrorTolerant(token, Messages.UnexpectedToken, token.value);
-                    return {
-                        type: Syntax.Property,
-                        key: key,
-                        value: parsePropertyFunction([]),
-                        kind: 'set'
-                    };
-                } else {
-                    param = [ parseVariableIdentifier() ];
-                    expect(')');
-                    return {
-                        type: Syntax.Property,
-                        key: key,
-                        value: parsePropertyFunction(param, token),
-                        kind: 'set'
-                    };
-                }
-            } else {
-                expect(':');
-                return {
-                    type: Syntax.Property,
-                    key: id,
-                    value: parseAssignmentExpression(),
-                    kind: 'init'
-                };
-            }
-        } else if (token.type === Token.EOF || token.type === Token.Punctuator) {
-            throwUnexpected(token);
-        } else {
-            key = parseObjectPropertyKey();
-            expect(':');
-            return {
-                type: Syntax.Property,
-                key: key,
-                value: parseAssignmentExpression(),
-                kind: 'init'
-            };
-        }
-    }
-
-    function parseObjectInitialiser() {
-        var properties = [], property, name, kind, map = {}, toString = String;
-
-        expect('{');
-
-        while (!match('}')) {
-            property = parseObjectProperty();
-
-            if (property.key.type === Syntax.Identifier) {
-                name = property.key.name;
-            } else {
-                name = toString(property.key.value);
-            }
-            kind = (property.kind === 'init') ? PropertyKind.Data : (property.kind === 'get') ? PropertyKind.Get : PropertyKind.Set;
-            if (Object.prototype.hasOwnProperty.call(map, name)) {
-                if (map[name] === PropertyKind.Data) {
-                    if (strict && kind === PropertyKind.Data) {
-                        throwErrorTolerant({}, Messages.StrictDuplicateProperty);
-                    } else if (kind !== PropertyKind.Data) {
-                        throwErrorTolerant({}, Messages.AccessorDataProperty);
-                    }
-                } else {
-                    if (kind === PropertyKind.Data) {
-                        throwErrorTolerant({}, Messages.AccessorDataProperty);
-                    } else if (map[name] & kind) {
-                        throwErrorTolerant({}, Messages.AccessorGetSet);
-                    }
-                }
-                map[name] |= kind;
-            } else {
-                map[name] = kind;
-            }
-
-            properties.push(property);
-
-            if (!match('}')) {
-                expect(',');
-            }
-        }
-
-        expect('}');
-
-        return {
-            type: Syntax.ObjectExpression,
-            properties: properties
-        };
-    }
-
-    // 11.1.6 The Grouping Operator
-
-    function parseGroupExpression() {
-        var expr;
-
-        expect('(');
-
-        expr = parseExpression();
-
-        expect(')');
-
-        return expr;
-    }
-
-
-    // 11.1 Primary Expressions
-
-    function parsePrimaryExpression() {
-        var token = lookahead(),
-            type = token.type;
-
-        if (type === Token.Identifier) {
-            return {
-                type: Syntax.Identifier,
-                name: lex().value
-            };
-        }
-
-        if (type === Token.StringLiteral || type === Token.NumericLiteral) {
-            if (strict && token.octal) {
-                throwErrorTolerant(token, Messages.StrictOctalLiteral);
-            }
-            return createLiteral(lex());
-        }
-
-        if (type === Token.Keyword) {
-            if (matchKeyword('this')) {
-                lex();
-                return {
-                    type: Syntax.ThisExpression
-                };
-            }
-
-            if (matchKeyword('function')) {
-                return parseFunctionExpression();
-            }
-        }
-
-        if (type === Token.BooleanLiteral) {
-            lex();
-            token.value = (token.value === 'true');
-            return createLiteral(token);
-        }
-
-        if (type === Token.NullLiteral) {
-            lex();
-            token.value = null;
-            return createLiteral(token);
-        }
-
-        if (match('[')) {
-            return parseArrayInitialiser();
-        }
-
-        if (match('{')) {
-            return parseObjectInitialiser();
-        }
-
-        if (match('(')) {
-            return parseGroupExpression();
-        }
-
-        if (match('/') || match('/=')) {
-            return createLiteral(scanRegExp());
-        }
-
-        return throwUnexpected(lex());
-    }
-
-    // 11.2 Left-Hand-Side Expressions
-
-    function parseArguments() {
-        var args = [];
-
-        expect('(');
-
-        if (!match(')')) {
-            while (index < length) {
-                args.push(parseAssignmentExpression());
-                if (match(')')) {
-                    break;
-                }
-                expect(',');
-            }
-        }
-
-        expect(')');
-
-        return args;
-    }
-
-    function parseNonComputedProperty() {
-        var token = lex();
-
-        if (!isIdentifierName(token)) {
-            throwUnexpected(token);
-        }
-
-        return {
-            type: Syntax.Identifier,
-            name: token.value
-        };
-    }
-
-    function parseNonComputedMember() {
-        expect('.');
-
-        return parseNonComputedProperty();
-    }
-
-    function parseComputedMember() {
-        var expr;
-
-        expect('[');
-
-        expr = parseExpression();
-
-        expect(']');
-
-        return expr;
-    }
-
-    function parseNewExpression() {
-        var expr;
-
-        expectKeyword('new');
-
-        expr = {
-            type: Syntax.NewExpression,
-            callee: parseLeftHandSideExpression(),
-            'arguments': []
-        };
-
-        if (match('(')) {
-            expr['arguments'] = parseArguments();
-        }
-
-        return expr;
-    }
-
-    function parseLeftHandSideExpressionAllowCall() {
-        var expr;
-
-        expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();
-
-        while (match('.') || match('[') || match('(')) {
-            if (match('(')) {
-                expr = {
-                    type: Syntax.CallExpression,
-                    callee: expr,
-                    'arguments': parseArguments()
-                };
-            } else if (match('[')) {
-                expr = {
-                    type: Syntax.MemberExpression,
-                    computed: true,
-                    object: expr,
-                    property: parseComputedMember()
-                };
-            } else {
-                expr = {
-                    type: Syntax.MemberExpression,
-                    computed: false,
-                    object: expr,
-                    property: parseNonComputedMember()
-                };
-            }
-        }
-
-        return expr;
-    }
-
-
-    function parseLeftHandSideExpression() {
-        var expr;
-
-        expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();
-
-        while (match('.') || match('[')) {
-            if (match('[')) {
-                expr = {
-                    type: Syntax.MemberExpression,
-                    computed: true,
-                    object: expr,
-                    property: parseComputedMember()
-                };
-            } else {
-                expr = {
-                    type: Syntax.MemberExpression,
-                    computed: false,
-                    object: expr,
-                    property: parseNonComputedMember()
-                };
-            }
-        }
-
-        return expr;
-    }
-
-    // 11.3 Postfix Expressions
-
-    function parsePostfixExpression() {
-        var expr = parseLeftHandSideExpressionAllowCall(), token;
-
-        token = lookahead();
-        if (token.type !== Token.Punctuator) {
-            return expr;
-        }
-
-        if ((match('++') || match('--')) && !peekLineTerminator()) {
-            // 11.3.1, 11.3.2
-            if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
-                throwErrorTolerant({}, Messages.StrictLHSPostfix);
-            }
-            if (!isLeftHandSide(expr)) {
-                throwErrorTolerant({}, Messages.InvalidLHSInAssignment);
-            }
-
-            expr = {
-                type: Syntax.UpdateExpression,
-                operator: lex().value,
-                argument: expr,
-                prefix: false
-            };
-        }
-
-        return expr;
-    }
-
-    // 11.4 Unary Operators
-
-    function parseUnaryExpression() {
-        var token, expr;
-
-        token = lookahead();
-        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {
-            return parsePostfixExpression();
-        }
-
-        if (match('++') || match('--')) {
-            token = lex();
-            expr = parseUnaryExpression();
-            // 11.4.4, 11.4.5
-            if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
-                throwErrorTolerant({}, Messages.StrictLHSPrefix);
-            }
-
-            if (!isLeftHandSide(expr)) {
-                throwErrorTolerant({}, Messages.InvalidLHSInAssignment);
-            }
-
-            expr = {
-                type: Syntax.UpdateExpression,
-                operator: token.value,
-                argument: expr,
-                prefix: true
-            };
-            return expr;
-        }
-
-        if (match('+') || match('-') || match('~') || match('!')) {
-            expr = {
-                type: Syntax.UnaryExpression,
-                operator: lex().value,
-                argument: parseUnaryExpression(),
-                prefix: true
-            };
-            return expr;
-        }
-
-        if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {
-            expr = {
-                type: Syntax.UnaryExpression,
-                operator: lex().value,
-                argument: parseUnaryExpression(),
-                prefix: true
-            };
-            if (strict && expr.operator === 'delete' && expr.argument.type === Syntax.Identifier) {
-                throwErrorTolerant({}, Messages.StrictDelete);
-            }
-            return expr;
-        }
-
-        return parsePostfixExpression();
-    }
-
-    // 11.5 Multiplicative Operators
-
-    function parseMultiplicativeExpression() {
-        var expr = parseUnaryExpression();
-
-        while (match('*') || match('/') || match('%')) {
-            expr = {
-                type: Syntax.BinaryExpression,
-                operator: lex().value,
-                left: expr,
-                right: parseUnaryExpression()
-            };
-        }
-
-        return expr;
-    }
-
-    // 11.6 Additive Operators
-
-    function parseAdditiveExpression() {
-        var expr = parseMultiplicativeExpression();
-
-        while (match('+') || match('-')) {
-            expr = {
-                type: Syntax.BinaryExpression,
-                operator: lex().value,
-                left: expr,
-                right: parseMultiplicativeExpression()
-            };
-        }
-
-        return expr;
-    }
-
-    // 11.7 Bitwise Shift Operators
-
-    function parseShiftExpression() {
-        var expr = parseAdditiveExpression();
-
-        while (match('<<') || match('>>') || match('>>>')) {
-            expr = {
-                type: Syntax.BinaryExpression,
-                operator: lex().value,
-                left: expr,
-                right: parseAdditiveExpression()
-            };
-        }
-
-        return expr;
-    }
-    // 11.8 Relational Operators
-
-    function parseRelationalExpression() {
-        var expr, previousAllowIn;
-
-        previousAllowIn = state.allowIn;
-        state.allowIn = true;
-
-        expr = parseShiftExpression();
-
-        while (match('<') || match('>') || match('<=') || match('>=') || (previousAllowIn && matchKeyword('in')) || matchKeyword('instanceof')) {
-            expr = {
-                type: Syntax.BinaryExpression,
-                operator: lex().value,
-                left: expr,
-                right: parseShiftExpression()
-            };
-        }
-
-        state.allowIn = previousAllowIn;
-        return expr;
-    }
-
-    // 11.9 Equality Operators
-
-    function parseEqualityExpression() {
-        var expr = parseRelationalExpression();
-
-        while (match('==') || match('!=') || match('===') || match('!==')) {
-            expr = {
-                type: Syntax.BinaryExpression,
-                operator: lex().value,
-                left: expr,
-                right: parseRelationalExpression()
-            };
-        }
-
-        return expr;
-    }
-
-    // 11.10 Binary Bitwise Operators
-
-    function parseBitwiseANDExpression() {
-        var expr = parseEqualityExpression();
-
-        while (match('&')) {
-            lex();
-            expr = {
-                type: Syntax.BinaryExpression,
-                operator: '&',
-                left: expr,
-                right: parseEqualityExpression()
-            };
-        }
-
-        return expr;
-    }
-
-    function parseBitwiseXORExpression() {
-        var expr = parseBitwiseANDExpression();
-
-        while (match('^')) {
-            lex();
-            expr = {
-                type: Syntax.BinaryExpression,
-                operator: '^',
-                left: expr,
-                right: parseBitwiseANDExpression()
-            };
-        }
-
-        return expr;
-    }
-
-    function parseBitwiseORExpression() {
-        var expr = parseBitwiseXORExpression();
-
-        while (match('|')) {
-            lex();
-            expr = {
-                type: Syntax.BinaryExpression,
-                operator: '|',
-                left: expr,
-                right: parseBitwiseXORExpression()
-            };
-        }
-
-        return expr;
-    }
-
-    // 11.11 Binary Logical Operators
-
-    function parseLogicalANDExpression() {
-        var expr = parseBitwiseORExpression();
-
-        while (match('&&')) {
-            lex();
-            expr = {
-                type: Syntax.LogicalExpression,
-                operator: '&&',
-                left: expr,
-                right: parseBitwiseORExpression()
-            };
-        }
-
-        return expr;
-    }
-
-    function parseLogicalORExpression() {
-        var expr = parseLogicalANDExpression();
-
-        while (match('||')) {
-            lex();
-            expr = {
-                type: Syntax.LogicalExpression,
-                operator: '||',
-                left: expr,
-                right: parseLogicalANDExpression()
-            };
-        }
-
-        return expr;
-    }
-
-    // 11.12 Conditional Operator
-
-    function parseConditionalExpression() {
-        var expr, previousAllowIn, consequent;
-
-        expr = parseLogicalORExpression();
-
-        if (match('?')) {
-            lex();
-            previousAllowIn = state.allowIn;
-            state.allowIn = true;
-            consequent = parseAssignmentExpression();
-            state.allowIn = previousAllowIn;
-            expect(':');
-
-            expr = {
-                type: Syntax.ConditionalExpression,
-                test: expr,
-                consequent: consequent,
-                alternate: parseAssignmentExpression()
-            };
-        }
-
-        return expr;
-    }
-
-    // 11.13 Assignment Operators
-
-    function parseAssignmentExpression() {
-        var token, expr;
-
-        token = lookahead();
-        expr = parseConditionalExpression();
-
-        if (matchAssign()) {
-            // LeftHandSideExpression
-            if (!isLeftHandSide(expr)) {
-                throwErrorTolerant({}, Messages.InvalidLHSInAssignment);
-            }
-
-            // 11.13.1
-            if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
-                throwErrorTolerant(token, Messages.StrictLHSAssignment);
-            }
-
-            expr = {
-                type: Syntax.AssignmentExpression,
-                operator: lex().value,
-                left: expr,
-                right: parseAssignmentExpression()
-            };
-        }
-
-        return expr;
-    }
-
-    // 11.14 Comma Operator
-
-    function parseExpression() {
-        var expr = parseAssignmentExpression();
-
-        if (match(',')) {
-            expr = {
-                type: Syntax.SequenceExpression,
-                expressions: [ expr ]
-            };
-
-            while (index < length) {
-                if (!match(',')) {
-                    break;
-                }
-                lex();
-                expr.expressions.push(parseAssignmentExpression());
-            }
-
-        }
-        return expr;
-    }
-
-    // 12.1 Block
-
-    function parseStatementList() {
-        var list = [],
-            statement;
-
-        while (index < length) {
-            if (match('}')) {
-                break;
-            }
-            statement = parseSourceElement();
-            if (typeof statement === 'undefined') {
-                break;
-            }
-            list.push(statement);
-        }
-
-        return list;
-    }
-
-    function parseBlock() {
-        var block;
-
-        expect('{');
-
-        block = parseStatementList();
-
-        expect('}');
-
-        return {
-            type: Syntax.BlockStatement,
-            body: block
-        };
-    }
-
-    // 12.2 Variable Statement
-
-    function parseVariableIdentifier() {
-        var token = lex();
-
-        if (token.type !== Token.Identifier) {
-            throwUnexpected(token);
-        }
-
-        return {
-            type: Syntax.Identifier,
-            name: token.value
-        };
-    }
-
-    function parseVariableDeclaration(kind) {
-        var id = parseVariableIdentifier(),
-            init = null;
-
-        // 12.2.1
-        if (strict && isRestrictedWord(id.name)) {
-            throwErrorTolerant({}, Messages.StrictVarName);
-        }
-
-        if (kind === 'const') {
-            expect('=');
-            init = parseAssignmentExpression();
-        } else if (match('=')) {
-            lex();
-            init = parseAssignmentExpression();
-        }
-
-        return {
-            type: Syntax.VariableDeclarator,
-            id: id,
-            init: init
-        };
-    }
-
-    function parseVariableDeclarationList(kind) {
-        var list = [];
-
-        do {
-            list.push(parseVariableDeclaration(kind));
-            if (!match(',')) {
-                break;
-            }
-            lex();
-        } while (index < length);
-
-        return list;
-    }
-
-    function parseVariableStatement() {
-        var declarations;
-
-        expectKeyword('var');
-
-        declarations = parseVariableDeclarationList();
-
-        consumeSemicolon();
-
-        return {
-            type: Syntax.VariableDeclaration,
-            declarations: declarations,
-            kind: 'var'
-        };
-    }
-
-    // kind may be `const` or `let`
-    // Both are experimental and not in the specification yet.
-    // see http://wiki.ecmascript.org/doku.php?id=harmony:const
-    // and http://wiki.ecmascript.org/doku.php?id=harmony:let
-    function parseConstLetDeclaration(kind) {
-        var declarations;
-
-        expectKeyword(kind);
-
-        declarations = parseVariableDeclarationList(kind);
-
-        consumeSemicolon();
-
-        return {
-            type: Syntax.VariableDeclaration,
-            declarations: declarations,
-            kind: kind
-        };
-    }
-
-    // 12.3 Empty Statement
-
-    function parseEmptyStatement() {
-        expect(';');
-
-        return {
-            type: Syntax.EmptyStatement
-        };
-    }
-
-    // 12.4 Expression Statement
-
-    function parseExpressionStatement() {
-        var expr = parseExpression();
-
-        consumeSemicolon();
-
-        return {
-            type: Syntax.ExpressionStatement,
-            expression: expr
-        };
-    }
-
-    // 12.5 If statement
-
-    function parseIfStatement() {
-        var test, consequent, alternate;
-
-        expectKeyword('if');
-
-        expect('(');
-
-        test = parseExpression();
-
-        expect(')');
-
-        consequent = parseStatement();
-
-        if (matchKeyword('else')) {
-            lex();
-            alternate = parseStatement();
-        } else {
-            alternate = null;
-        }
-
-        return {
-            type: Syntax.IfStatement,
-            test: test,
-            consequent: consequent,
-            alternate: alternate
-        };
-    }
-
-    // 12.6 Iteration Statements
-
-    function parseDoWhileStatement() {
-        var body, test, oldInIteration;
-
-        expectKeyword('do');
-
-        oldInIteration = state.inIteration;
-        state.inIteration = true;
-
-        body = parseStatement();
-
-        state.inIteration = oldInIteration;
-
-        expectKeyword('while');
-
-        expect('(');
-
-        test = parseExpression();
-
-        expect(')');
-
-        if (match(';')) {
-            lex();
-        }
-
-        return {
-            type: Syntax.DoWhileStatement,
-            body: body,
-            test: test
-        };
-    }
-
-    function parseWhileStatement() {
-        var test, body, oldInIteration;
-
-        expectKeyword('while');
-
-        expect('(');
-
-        test = parseExpression();
-
-        expect(')');
-
-        oldInIteration = state.inIteration;
-        state.inIteration = true;
-
-        body = parseStatement();
-
-        state.inIteration = oldInIteration;
-
-        return {
-            type: Syntax.WhileStatement,
-            test: test,
-            body: body
-        };
-    }
-
-    function parseForVariableDeclaration() {
-        var token = lex();
-
-        return {
-            type: Syntax.VariableDeclaration,
-            declarations: parseVariableDeclarationList(),
-            kind: token.value
-        };
-    }
-
-    function parseForStatement() {
-        var init, test, update, left, right, body, oldInIteration;
-
-        init = test = update = null;
-
-        expectKeyword('for');
-
-        expect('(');
-
-        if (match(';')) {
-            lex();
-        } else {
-            if (matchKeyword('var') || matchKeyword('let')) {
-                state.allowIn = false;
-                init = parseForVariableDeclaration();
-                state.allowIn = true;
-
-                if (init.declarations.length === 1 && matchKeyword('in')) {
-                    lex();
-                    left = init;
-                    right = parseExpression();
-                    init = null;
-                }
-            } else {
-                state.allowIn = false;
-                init = parseExpression();
-                state.allowIn = true;
-
-                if (matchKeyword('in')) {
-                    // LeftHandSideExpression
-                    if (!isLeftHandSide(init)) {
-                        throwErrorTolerant({}, Messages.InvalidLHSInForIn);
-                    }
-
-                    lex();
-                    left = init;
-                    right = parseExpression();
-                    init = null;
-                }
-            }
-
-            if (typeof left === 'undefined') {
-                expect(';');
-            }
-        }
-
-        if (typeof left === 'undefined') {
-
-            if (!match(';')) {
-                test = parseExpression();
-            }
-            expect(';');
-
-            if (!match(')')) {
-                update = parseExpression();
-            }
-        }
-
-        expect(')');
-
-        oldInIteration = state.inIteration;
-        state.inIteration = true;
-
-        body = parseStatement();
-
-        state.inIteration = oldInIteration;
-
-        if (typeof left === 'undefined') {
-            return {
-                type: Syntax.ForStatement,
-                init: init,
-                test: test,
-                update: update,
-                body: body
-            };
-        }
-
-        return {
-            type: Syntax.ForInStatement,
-            left: left,
-            right: right,
-            body: body,
-            each: false
-        };
-    }
-
-    // 12.7 The continue statement
-
-    function parseContinueStatement() {
-        var token, label = null;
-
-        expectKeyword('continue');
-
-        // Optimize the most common form: 'continue;'.
-        if (source[index] === ';') {
-            lex();
-
-            if (!state.inIteration) {
-                throwError({}, Messages.IllegalContinue);
-            }
-
-            return {
-                type: Syntax.ContinueStatement,
-                label: null
-            };
-        }
-
-        if (peekLineTerminator()) {
-            if (!state.inIteration) {
-                throwError({}, Messages.IllegalContinue);
-            }
-
-            return {
-                type: Syntax.ContinueStatement,
-                label: null
-            };
-        }
-
-        token = lookahead();
-        if (token.type === Token.Identifier) {
-            label = parseVariableIdentifier();
-
-            if (!Object.prototype.hasOwnProperty.call(state.labelSet, label.name)) {
-                throwError({}, Messages.UnknownLabel, label.name);
-            }
-        }
-
-        consumeSemicolon();
-
-        if (label === null && !state.inIteration) {
-            throwError({}, Messages.IllegalContinue);
-        }
-
-        return {
-            type: Syntax.ContinueStatement,
-            label: label
-        };
-    }
-
-    // 12.8 The break statement
-
-    function parseBreakStatement() {
-        var token, label = null;
-
-        expectKeyword('break');
-
-        // Optimize the most common form: 'break;'.
-        if (source[index] === ';') {
-            lex();
-
-            if (!(state.inIteration || state.inSwitch)) {
-                throwError({}, Messages.IllegalBreak);
-            }
-
-            return {
-                type: Syntax.BreakStatement,
-                label: null
-            };
-        }
-
-        if (peekLineTerminator()) {
-            if (!(state.inIteration || state.inSwitch)) {
-                throwError({}, Messages.IllegalBreak);
-            }
-
-            return {
-                type: Syntax.BreakStatement,
-                label: null
-            };
-        }
-
-        token = lookahead();
-        if (token.type === Token.Identifier) {
-            label = parseVariableIdentifier();
-
-            if (!Object.prototype.hasOwnProperty.call(state.labelSet, label.name)) {
-                throwError({}, Messages.UnknownLabel, label.name);
-            }
-        }
-
-        consumeSemicolon();
-
-        if (label === null && !(state.inIteration || state.inSwitch)) {
-            throwError({}, Messages.IllegalBreak);
-        }
-
-        return {
-            type: Syntax.BreakStatement,
-            label: label
-        };
-    }
-
-    // 12.9 The return statement
-
-    function parseReturnStatement() {
-        var token, argument = null;
-
-        expectKeyword('return');
-
-        if (!state.inFunctionBody) {
-            throwErrorTolerant({}, Messages.IllegalReturn);
-        }
-
-        // 'return' followed by a space and an identifier is very common.
-        if (source[index] === ' ') {
-            if (isIdentifierStart(source[index + 1])) {
-                argument = parseExpression();
-                consumeSemicolon();
-                return {
-                    type: Syntax.ReturnStatement,
-                    argument: argument
-                };
-            }
-        }
-
-        if (peekLineTerminator()) {
-            return {
-                type: Syntax.ReturnStatement,
-                argument: null
-            };
-        }
-
-        if (!match(';')) {
-            token = lookahead();
-            if (!match('}') && token.type !== Token.EOF) {
-                argument = parseExpression();
-            }
-        }
-
-        consumeSemicolon();
-
-        return {
-            type: Syntax.ReturnStatement,
-            argument: argument
-        };
-    }
-
-    // 12.10 The with statement
-
-    function parseWithStatement() {
-        var object, body;
-
-        if (strict) {
-            throwErrorTolerant({}, Messages.StrictModeWith);
-        }
-
-        expectKeyword('with');
-
-        expect('(');
-
-        object = parseExpression();
-
-        expect(')');
-
-        body = parseStatement();
-
-        return {
-            type: Syntax.WithStatement,
-            object: object,
-            body: body
-        };
-    }
-
-    // 12.10 The swith statement
-
-    function parseSwitchCase() {
-        var test,
-            consequent = [],
-            statement;
-
-        if (matchKeyword('default')) {
-            lex();
-            test = null;
-        } else {
-            expectKeyword('case');
-            test = parseExpression();
-        }
-        expect(':');
-
-        while (index < length) {
-            if (match('}') || matchKeyword('default') || matchKeyword('case')) {
-                break;
-            }
-            statement = parseStatement();
-            if (typeof statement === 'undefined') {
-                break;
-            }
-            consequent.push(statement);
-        }
-
-        return {
-            type: Syntax.SwitchCase,
-            test: test,
-            consequent: consequent
-        };
-    }
-
-    function parseSwitchStatement() {
-        var discriminant, cases, clause, oldInSwitch, defaultFound;
-
-        expectKeyword('switch');
-
-        expect('(');
-
-        discriminant = parseExpression();
-
-        expect(')');
-
-        expect('{');
-
-        cases = [];
-
-        if (match('}')) {
-            lex();
-            return {
-                type: Syntax.SwitchStatement,
-                discriminant: discriminant,
-                cases: cases
-            };
-        }
-
-        oldInSwitch = state.inSwitch;
-        state.inSwitch = true;
-        defaultFound = false;
-
-        while (index < length) {
-            if (match('}')) {
-                break;
-            }
-            clause = parseSwitchCase();
-            if (clause.test === null) {
-                if (defaultFound) {
-                    throwError({}, Messages.MultipleDefaultsInSwitch);
-                }
-                defaultFound = true;
-            }
-            cases.push(clause);
-        }
-
-        state.inSwitch = oldInSwitch;
-
-        expect('}');
-
-        return {
-            type: Syntax.SwitchStatement,
-            discriminant: discriminant,
-            cases: cases
-        };
-    }
-
-    // 12.13 The throw statement
-
-    function parseThrowStatement() {
-        var argument;
-
-        expectKeyword('throw');
-
-        if (peekLineTerminator()) {
-            throwError({}, Messages.NewlineAfterThrow);
-        }
-
-        argument = parseExpression();
-
-        consumeSemicolon();
-
-        return {
-            type: Syntax.ThrowStatement,
-            argument: argument
-        };
-    }
-
-    // 12.14 The try statement
-
-    function parseCatchClause() {
-        var param;
-
-        expectKeyword('catch');
-
-        expect('(');
-        if (match(')')) {
-            throwUnexpected(lookahead());
-        }
-
-        param = parseVariableIdentifier();
-        // 12.14.1
-        if (strict && isRestrictedWord(param.name)) {
-            throwErrorTolerant({}, Messages.StrictCatchVariable);
-        }
-
-        expect(')');
-
-        return {
-            type: Syntax.CatchClause,
-            param: param,
-            body: parseBlock()
-        };
-    }
-
-    function parseTryStatement() {
-        var block, handlers = [], finalizer = null;
-
-        expectKeyword('try');
-
-        block = parseBlock();
-
-        if (matchKeyword('catch')) {
-            handlers.push(parseCatchClause());
-        }
-
-        if (matchKeyword('finally')) {
-            lex();
-            finalizer = parseBlock();
-        }
-
-        if (handlers.length === 0 && !finalizer) {
-            throwError({}, Messages.NoCatchOrFinally);
-        }
-
-        return {
-            type: Syntax.TryStatement,
-            block: block,
-            guardedHandlers: [],
-            handlers: handlers,
-            finalizer: finalizer
-        };
-    }
-
-    // 12.15 The debugger statement
-
-    function parseDebuggerStatement() {
-        expectKeyword('debugger');
-
-        consumeSemicolon();
-
-        return {
-            type: Syntax.DebuggerStatement
-        };
-    }
-
-    // 12 Statements
-
-    function parseStatement() {
-        var token = lookahead(),
-            expr,
-            labeledBody;
-
-        if (token.type === Token.EOF) {
-            throwUnexpected(token);
-        }
-
-        if (token.type === Token.Punctuator) {
-            switch (token.value) {
-            case ';':
-                return parseEmptyStatement();
-            case '{':
-                return parseBlock();
-            case '(':
-                return parseExpressionStatement();
-            default:
-                break;
-            }
-        }
-
-        if (token.type === Token.Keyword) {
-            switch (token.value) {
-            case 'break':
-                return parseBreakStatement();
-            case 'continue':
-                return parseContinueStatement();
-            case 'debugger':
-                return parseDebuggerStatement();
-            case 'do':
-                return parseDoWhileStatement();
-            case 'for':
-                return parseForStatement();
-            case 'function':
-                return parseFunctionDeclaration();
-            case 'if':
-                return parseIfStatement();
-            case 'return':
-                return parseReturnStatement();
-            case 'switch':
-                return parseSwitchStatement();
-            case 'throw':
-                return parseThrowStatement();
-            case 'try':
-                return parseTryStatement();
-            case 'var':
-                return parseVariableStatement();
-            case 'while':
-                return parseWhileStatement();
-            case 'with':
-                return parseWithStatement();
-            default:
-                break;
-            }
-        }
-
-        expr = parseExpression();
-
-        // 12.12 Labelled Statements
-        if ((expr.type === Syntax.Identifier) && match(':')) {
-            lex();
-
-            if (Object.prototype.hasOwnProperty.call(state.labelSet, expr.name)) {
-                throwError({}, Messages.Redeclaration, 'Label', expr.name);
-            }
-
-            state.labelSet[expr.name] = true;
-            labeledBody = parseStatement();
-            delete state.labelSet[expr.name];
-
-            return {
-                type: Syntax.LabeledStatement,
-                label: expr,
-                body: labeledBody
-            };
-        }
-
-        consumeSemicolon();
-
-        return {
-            type: Syntax.ExpressionStatement,
-            expression: expr
-        };
-    }
-
-    // 13 Function Definition
-
-    function parseFunctionSourceElements() {
-        var sourceElement, sourceElements = [], token, directive, firstRestricted,
-            oldLabelSet, oldInIteration, oldInSwitch, oldInFunctionBody;
-
-        expect('{');
-
-        while (index < length) {
-            token = lookahead();
-            if (token.type !== Token.StringLiteral) {
-                break;
-            }
-
-            sourceElement = parseSourceElement();
-            sourceElements.push(sourceElement);
-            if (sourceElement.expression.type !== Syntax.Literal) {
-                // this is not directive
-                break;
-            }
-            directive = sliceSource(token.range[0] + 1, token.range[1] - 1);
-            if (directive === 'use strict') {
-                strict = true;
-                if (firstRestricted) {
-                    throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral);
-                }
-            } else {
-                if (!firstRestricted && token.octal) {
-                    firstRestricted = token;
-                }
-            }
-        }
-
-        oldLabelSet = state.labelSet;
-        oldInIteration = state.inIteration;
-        oldInSwitch = state.inSwitch;
-        oldInFunctionBody = state.inFunctionBody;
-
-        state.labelSet = {};
-        state.inIteration = false;
-        state.inSwitch = false;
-        state.inFunctionBody = true;
-
-        while (index < length) {
-            if (match('}')) {
-                break;
-            }
-            sourceElement = parseSourceElement();
-            if (typeof sourceElement === 'undefined') {
-                break;
-            }
-            sourceElements.push(sourceElement);
-        }
-
-        expect('}');
-
-        state.labelSet = oldLabelSet;
-        state.inIteration = oldInIteration;
-        state.inSwitch = oldInSwitch;
-        state.inFunctionBody = oldInFunctionBody;
-
-        return {
-            type: Syntax.BlockStatement,
-            body: sourceElements
-        };
-    }
-
-    function parseFunctionDeclaration() {
-        var id, param, params = [], body, token, stricted, firstRestricted, message, previousStrict, paramSet;
-
-        expectKeyword('function');
-        token = lookahead();
-        id = parseVariableIdentifier();
-        if (strict) {
-            if (isRestrictedWord(token.value)) {
-                throwErrorTolerant(token, Messages.StrictFunctionName);
-            }
-        } else {
-            if (isRestrictedWord(token.value)) {
-                firstRestricted = token;
-                message = Messages.StrictFunctionName;
-            } else if (isStrictModeReservedWord(token.value)) {
-                firstRestricted = token;
-                message = Messages.StrictReservedWord;
-            }
-        }
-
-        expect('(');
-
-        if (!match(')')) {
-            paramSet = {};
-            while (index < length) {
-                token = lookahead();
-                param = parseVariableIdentifier();
-                if (strict) {
-                    if (isRestrictedWord(token.value)) {
-                        stricted = token;
-                        message = Messages.StrictParamName;
-                    }
-                    if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) {
-                        stricted = token;
-                        message = Messages.StrictParamDupe;
-                    }
-                } else if (!firstRestricted) {
-                    if (isRestrictedWord(token.value)) {
-                        firstRestricted = token;
-                        message = Messages.StrictParamName;
-                    } else if (isStrictModeReservedWord(token.value)) {
-                        firstRestricted = token;
-                        message = Messages.StrictReservedWord;
-                    } else if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) {
-                        firstRestricted = token;
-                        message = Messages.StrictParamDupe;
-                    }
-                }
-                params.push(param);
-                paramSet[param.name] = true;
-                if (match(')')) {
-                    break;
-                }
-                expect(',');
-            }
-        }
-
-        expect(')');
-
-        previousStrict = strict;
-        body = parseFunctionSourceElements();
-        if (strict && firstRestricted) {
-            throwError(firstRestricted, message);
-        }
-        if (strict && stricted) {
-            throwErrorTolerant(stricted, message);
-        }
-        strict = previousStrict;
-
-        return {
-            type: Syntax.FunctionDeclaration,
-            id: id,
-            params: params,
-            defaults: [],
-            body: body,
-            rest: null,
-            generator: false,
-            expression: false
-        };
-    }
-
-    function parseFunctionExpression() {
-        var token, id = null, stricted, firstRestricted, message, param, params = [], body, previousStrict, paramSet;
-
-        expectKeyword('function');
-
-        if (!match('(')) {
-            token = lookahead();
-            id = parseVariableIdentifier();
-            if (strict) {
-                if (isRestrictedWord(token.value)) {
-                    throwErrorTolerant(token, Messages.StrictFunctionName);
-                }
-            } else {
-                if (isRestrictedWord(token.value)) {
-                    firstRestricted = token;
-                    message = Messages.StrictFunctionName;
-                } else if (isStrictModeReservedWord(token.value)) {
-                    firstRestricted = token;
-                    message = Messages.StrictReservedWord;
-                }
-            }
-        }
-
-        expect('(');
-
-        if (!match(')')) {
-            paramSet = {};
-            while (index < length) {
-                token = lookahead();
-                param = parseVariableIdentifier();
-                if (strict) {
-                    if (isRestrictedWord(token.value)) {
-                        stricted = token;
-                        message = Messages.StrictParamName;
-                    }
-                    if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) {
-                        stricted = token;
-                        message = Messages.StrictParamDupe;
-                    }
-                } else if (!firstRestricted) {
-                    if (isRestrictedWord(token.value)) {
-                        firstRestricted = token;
-                        message = Messages.StrictParamName;
-                    } else if (isStrictModeReservedWord(token.value)) {
-                        firstRestricted = token;
-                        message = Messages.StrictReservedWord;
-                    } else if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) {
-                        firstRestricted = token;
-                        message = Messages.StrictParamDupe;
-                    }
-                }
-                params.push(param);
-                paramSet[param.name] = true;
-                if (match(')')) {
-                    break;
-                }
-                expect(',');
-            }
-        }
-
-        expect(')');
-
-        previousStrict = strict;
-        body = parseFunctionSourceElements();
-        if (strict && firstRestricted) {
-            throwError(firstRestricted, message);
-        }
-        if (strict && stricted) {
-            throwErrorTolerant(stricted, message);
-        }
-        strict = previousStrict;
-
-        return {
-            type: Syntax.FunctionExpression,
-            id: id,
-            params: params,
-            defaults: [],
-            body: body,
-            rest: null,
-            generator: false,
-            expression: false
-        };
-    }
-
-    // 14 Program
-
-    function parseSourceElement() {
-        var token = lookahead();
-
-        if (token.type === Token.Keyword) {
-            switch (token.value) {
-            case 'const':
-            case 'let':
-                return parseConstLetDeclaration(token.value);
-            case 'function':
-                return parseFunctionDeclaration();
-            default:
-                return parseStatement();
-            }
-        }
-
-        if (token.type !== Token.EOF) {
-            return parseStatement();
-        }
-    }
-
-    function parseSourceElements() {
-        var sourceElement, sourceElements = [], token, directive, firstRestricted;
-
-        while (index < length) {
-            token = lookahead();
-            if (token.type !== Token.StringLiteral) {
-                break;
-            }
-
-            sourceElement = parseSourceElement();
-            sourceElements.push(sourceElement);
-            if (sourceElement.expression.type !== Syntax.Literal) {
-                // this is not directive
-                break;
-            }
-            directive = sliceSource(token.range[0] + 1, token.range[1] - 1);
-            if (directive === 'use strict') {
-                strict = true;
-                if (firstRestricted) {
-                    throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral);
-                }
-            } else {
-                if (!firstRestricted && token.octal) {
-                    firstRestricted = token;
-                }
-            }
-        }
-
-        while (index < length) {
-            sourceElement = parseSourceElement();
-            if (typeof sourceElement === 'undefined') {
-                break;
-            }
-            sourceElements.push(sourceElement);
-        }
-        return sourceElements;
-    }
-
-    function parseProgram() {
-        var program;
-        strict = false;
-        program = {
-            type: Syntax.Program,
-            body: parseSourceElements()
-        };
-        return program;
-    }
-
-    // The following functions are needed only when the option to preserve
-    // the comments is active.
-
-    function addComment(type, value, start, end, loc) {
-        assert(typeof start === 'number', 'Comment must have valid position');
-
-        // Because the way the actual token is scanned, often the comments
-        // (if any) are skipped twice during the lexical analysis.
-        // Thus, we need to skip adding a comment if the comment array already
-        // handled it.
-        if (extra.comments.length > 0) {
-            if (extra.comments[extra.comments.length - 1].range[1] > start) {
-                return;
-            }
-        }
-
-        extra.comments.push({
-            type: type,
-            value: value,
-            range: [start, end],
-            loc: loc
-        });
-    }
-
-    function scanComment() {
-        var comment, ch, loc, start, blockComment, lineComment;
-
-        comment = '';
-        blockComment = false;
-        lineComment = false;
-
-        while (index < length) {
-            ch = source[index];
-
-            if (lineComment) {
-                ch = source[index++];
-                if (isLineTerminator(ch)) {
-                    loc.end = {
-                        line: lineNumber,
-                        column: index - lineStart - 1
-                    };
-                    lineComment = false;
-                    addComment('Line', comment, start, index - 1, loc);
-                    if (ch === '\r' && source[index] === '\n') {
-                        ++index;
-                    }
-                    ++lineNumber;
-                    lineStart = index;
-                    comment = '';
-                } else if (index >= length) {
-                    lineComment = false;
-                    comment += ch;
-                    loc.end = {
-                        line: lineNumber,
-                        column: length - lineStart
-                    };
-                    addComment('Line', comment, start, length, loc);
-                } else {
-                    comment += ch;
-                }
-            } else if (blockComment) {
-                if (isLineTerminator(ch)) {
-                    if (ch === '\r' && source[index + 1] === '\n') {
-                        ++index;
-                        comment += '\r\n';
-                    } else {
-                        comment += ch;
-                    }
-                    ++lineNumber;
-                    ++index;
-                    lineStart = index;
-                    if (index >= length) {
-                        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-                    }
-                } else {
-                    ch = source[index++];
-                    if (index >= length) {
-                        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-                    }
-                    comment += ch;
-                    if (ch === '*') {
-                        ch = source[index];
-                        if (ch === '/') {
-                            comment = comment.substr(0, comment.length - 1);
-                            blockComment = false;
-                            ++index;
-                            loc.end = {
-                                line: lineNumber,
-                                column: index - lineStart
-                            };
-                            addComment('Block', comment, start, index, loc);
-                            comment = '';
-                        }
-                    }
-                }
-            } else if (ch === '/') {
-                ch = source[index + 1];
-                if (ch === '/') {
-                    loc = {
-                        start: {
-                            line: lineNumber,
-                            column: index - lineStart
-                        }
-                    };
-                    start = index;
-                    index += 2;
-                    lineComment = true;
-                    if (index >= length) {
-                        loc.end = {
-                            line: lineNumber,
-                            column: index - lineStart
-                        };
-                        lineComment = false;
-                        addComment('Line', comment, start, index, loc);
-                    }
-                } else if (ch === '*') {
-                    start = index;
-                    index += 2;
-                    blockComment = true;
-                    loc = {
-                        start: {
-                            line: lineNumber,
-                            column: index - lineStart - 2
-                        }
-                    };
-                    if (index >= length) {
-                        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
-                    }
-                } else {
-                    break;
-                }
-            } else if (isWhiteSpace(ch)) {
-                ++index;
-            } else if (isLineTerminator(ch)) {
-                ++index;
-                if (ch ===  '\r' && source[index] === '\n') {
-                    ++index;
-                }
-                ++lineNumber;
-                lineStart = index;
-            } else {
-                break;
-            }
-        }
-    }
-
-    function filterCommentLocation() {
-        var i, entry, comment, comments = [];
-
-        for (i = 0; i < extra.comments.length; ++i) {
-            entry = extra.comments[i];
-            comment = {
-                type: entry.type,
-                value: entry.value
-            };
-            if (extra.range) {
-                comment.range = entry.range;
-            }
-            if (extra.loc) {
-                comment.loc = entry.loc;
-            }
-            comments.push(comment);
-        }
-
-        extra.comments = comments;
-    }
-
-    function collectToken() {
-        var start, loc, token, range, value;
-
-        skipComment();
-        start = index;
-        loc = {
-            start: {
-                line: lineNumber,
-                column: index - lineStart
-            }
-        };
-
-        token = extra.advance();
-        loc.end = {
-            line: lineNumber,
-            column: index - lineStart
-        };
-
-        if (token.type !== Token.EOF) {
-            range = [token.range[0], token.range[1]];
-            value = sliceSource(token.range[0], token.range[1]);
-            extra.tokens.push({
-                type: TokenName[token.type],
-                value: value,
-                range: range,
-                loc: loc
-            });
-        }
-
-        return token;
-    }
-
-    function collectRegex() {
-        var pos, loc, regex, token;
-
-        skipComment();
-
-        pos = index;
-        loc = {
-            start: {
-                line: lineNumber,
-                column: index - lineStart
-            }
-        };
-
-        regex = extra.scanRegExp();
-        loc.end = {
-            line: lineNumber,
-            column: index - lineStart
-        };
-
-        // Pop the previous token, which is likely '/' or '/='
-        if (extra.tokens.length > 0) {
-            token = extra.tokens[extra.tokens.length - 1];
-            if (token.range[0] === pos && token.type === 'Punctuator') {
-                if (token.value === '/' || token.value === '/=') {
-                    extra.tokens.pop();
-                }
-            }
-        }
-
-        extra.tokens.push({
-            type: 'RegularExpression',
-            value: regex.literal,
-            range: [pos, index],
-            loc: loc
-        });
-
-        return regex;
-    }
-
-    function filterTokenLocation() {
-        var i, entry, token, tokens = [];
-
-        for (i = 0; i < extra.tokens.length; ++i) {
-            entry = extra.tokens[i];
-            token = {
-                type: entry.type,
-                value: entry.value
-            };
-            if (extra.range) {
-                token.range = entry.range;
-            }
-            if (extra.loc) {
-                token.loc = entry.loc;
-            }
-            tokens.push(token);
-        }
-
-        extra.tokens = tokens;
-    }
-
-    function createLiteral(token) {
-        return {
-            type: Syntax.Literal,
-            value: token.value
-        };
-    }
-
-    function createRawLiteral(token) {
-        return {
-            type: Syntax.Literal,
-            value: token.value,
-            raw: sliceSource(token.range[0], token.range[1])
-        };
-    }
-
-    function createLocationMarker() {
-        var marker = {};
-
-        marker.range = [index, index];
-        marker.loc = {
-            start: {
-                line: lineNumber,
-                column: index - lineStart
-            },
-            end: {
-                line: lineNumber,
-                column: index - lineStart
-            }
-        };
-
-        marker.end = function () {
-            this.range[1] = index;
-            this.loc.end.line = lineNumber;
-            this.loc.end.column = index - lineStart;
-        };
-
-        marker.applyGroup = function (node) {
-            if (extra.range) {
-                node.groupRange = [this.range[0], this.range[1]];
-            }
-            if (extra.loc) {
-                node.groupLoc = {
-                    start: {
-                        line: this.loc.start.line,
-                        column: this.loc.start.column
-                    },
-                    end: {
-                        line: this.loc.end.line,
-                        column: this.loc.end.column
-                    }
-                };
-            }
-        };
-
-        marker.apply = function (node) {
-            if (extra.range) {
-                node.range = [this.range[0], this.range[1]];
-            }
-            if (extra.loc) {
-                node.loc = {
-                    start: {
-                        line: this.loc.start.line,
-                        column: this.loc.start.column
-                    },
-                    end: {
-                        line: this.loc.end.line,
-                        column: this.loc.end.column
-                    }
-                };
-            }
-        };
-
-        return marker;
-    }
-
-    function trackGroupExpression() {
-        var marker, expr;
-
-        skipComment();
-        marker = createLocationMarker();
-        expect('(');
-
-        expr = parseExpression();
-
-        expect(')');
-
-        marker.end();
-        marker.applyGroup(expr);
-
-        return expr;
-    }
-
-    function trackLeftHandSideExpression() {
-        var marker, expr;
-
-        skipComment();
-        marker = createLocationMarker();
-
-        expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();
-
-        while (match('.') || match('[')) {
-            if (match('[')) {
-                expr = {
-                    type: Syntax.MemberExpression,
-                    computed: true,
-                    object: expr,
-                    property: parseComputedMember()
-                };
-                marker.end();
-                marker.apply(expr);
-            } else {
-                expr = {
-                    type: Syntax.MemberExpression,
-                    computed: false,
-                    object: expr,
-                    property: parseNonComputedMember()
-                };
-                marker.end();
-                marker.apply(expr);
-            }
-        }
-
-        return expr;
-    }
-
-    function trackLeftHandSideExpressionAllowCall() {
-        var marker, expr;
-
-        skipComment();
-        marker = createLocationMarker();
-
-        expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression();
-
-        while (match('.') || match('[') || match('(')) {
-            if (match('(')) {
-                expr = {
-                    type: Syntax.CallExpression,
-                    callee: expr,
-                    'arguments': parseArguments()
-                };
-                marker.end();
-                marker.apply(expr);
-            } else if (match('[')) {
-                expr = {
-                    type: Syntax.MemberExpression,
-                    computed: true,
-                    object: expr,
-                    property: parseComputedMember()
-                };
-                marker.end();
-                marker.apply(expr);
-            } else {
-                expr = {
-                    type: Syntax.MemberExpression,
-                    computed: false,
-                    object: expr,
-                    property: parseNonComputedMember()
-                };
-                marker.end();
-                marker.apply(expr);
-            }
-        }
-
-        return expr;
-    }
-
-    function filterGroup(node) {
-        var n, i, entry;
-
-        n = (Object.prototype.toString.apply(node) === '[object Array]') ? [] : {};
-        for (i in node) {
-            if (node.hasOwnProperty(i) && i !== 'groupRange' && i !== 'groupLoc') {
-                entry = node[i];
-                if (entry === null || typeof entry !== 'object' || entry instanceof RegExp) {
-                    n[i] = entry;
-                } else {
-                    n[i] = filterGroup(entry);
-                }
-            }
-        }
-        return n;
-    }
-
-    function wrapTrackingFunction(range, loc) {
-
-        return function (parseFunction) {
-
-            function isBinary(node) {
-                return node.type === Syntax.LogicalExpression ||
-                    node.type === Syntax.BinaryExpression;
-            }
-
-            function visit(node) {
-                var start, end;
-
-                if (isBinary(node.left)) {
-                    visit(node.left);
-                }
-                if (isBinary(node.right)) {
-                    visit(node.right);
-                }
-
-                if (range) {
-                    if (node.left.groupRange || node.right.groupRange) {
-                        start = node.left.groupRange ? node.left.groupRange[0] : node.left.range[0];
-                        end = node.right.groupRange ? node.right.groupRange[1] : node.right.range[1];
-                        node.range = [start, end];
-                    } else if (typeof node.range === 'undefined') {
-                        start = node.left.range[0];
-                        end = node.right.range[1];
-                        node.range = [start, end];
-                    }
-                }
-                if (loc) {
-                    if (node.left.groupLoc || node.right.groupLoc) {
-                        start = node.left.groupLoc ? node.left.groupLoc.start : node.left.loc.start;
-                        end = node.right.groupLoc ? node.right.groupLoc.end : node.right.loc.end;
-                        node.loc = {
-                            start: start,
-                            end: end
-                        };
-                    } else if (typeof node.loc === 'undefined') {
-                        node.loc = {
-                            start: node.left.loc.start,
-                            end: node.right.loc.end
-                        };
-                    }
-                }
-            }
-
-            return function () {
-                var marker, node;
-
-                skipComment();
-
-                marker = createLocationMarker();
-                node = parseFunction.apply(null, arguments);
-                marker.end();
-
-                if (range && typeof node.range === 'undefined') {
-                    marker.apply(node);
-                }
-
-                if (loc && typeof node.loc === 'undefined') {
-                    marker.apply(node);
-                }
-
-                if (isBinary(node)) {
-                    visit(node);
-                }
-
-                return node;
-            };
-        };
-    }
-
-    function patch() {
-
-        var wrapTracking;
-
-        if (extra.comments) {
-            extra.skipComment = skipComment;
-            skipComment = scanComment;
-        }
-
-        if (extra.raw) {
-            extra.createLiteral = createLiteral;
-            createLiteral = createRawLiteral;
-        }
-
-        if (extra.range || extra.loc) {
-
-            extra.parseGroupExpression = parseGroupExpression;
-            extra.parseLeftHandSideExpression = parseLeftHandSideExpression;
-            extra.parseLeftHandSideExpressionAllowCall = parseLeftHandSideExpressionAllowCall;
-            parseGroupExpression = trackGroupExpression;
-            parseLeftHandSideExpression = trackLeftHandSideExpression;
-            parseLeftHandSideExpressionAllowCall = trackLeftHandSideExpressionAllowCall;
-
-            wrapTracking = wrapTrackingFunction(extra.range, extra.loc);
-
-            extra.parseAdditiveExpression = parseAdditiveExpression;
-            extra.parseAssignmentExpression = parseAssignmentExpression;
-            extra.parseBitwiseANDExpression = parseBitwiseANDExpression;
-            extra.parseBitwiseORExpression = parseBitwiseORExpression;
-            extra.parseBitwiseXORExpression = parseBitwiseXORExpression;
-            extra.parseBlock = parseBlock;
-            extra.parseFunctionSourceElements = parseFunctionSourceElements;
-            extra.parseCatchClause = parseCatchClause;
-            extra.parseComputedMember = parseComputedMember;
-            extra.parseConditionalExpression = parseConditionalExpression;
-            extra.parseConstLetDeclaration = parseConstLetDeclaration;
-            extra.parseEqualityExpression = parseEqualityExpression;
-            extra.parseExpression = parseExpression;
-            extra.parseForVariableDeclaration = parseForVariableDeclaration;
-            extra.parseFunctionDeclaration = parseFunctionDeclaration;
-            extra.parseFunctionExpression = parseFunctionExpression;
-            extra.parseLogicalANDExpression = parseLogicalANDExpression;
-            extra.parseLogicalORExpression = parseLogicalORExpression;
-            extra.parseMultiplicativeExpression = parseMultiplicativeExpression;
-            extra.parseNewExpression = parseNewExpression;
-            extra.parseNonComputedProperty = parseNonComputedProperty;
-            extra.parseObjectProperty = parseObjectProperty;
-            extra.parseObjectPropertyKey = parseObjectPropertyKey;
-            extra.parsePostfixExpression = parsePostfixExpression;
-            extra.parsePrimaryExpression = parsePrimaryExpression;
-            extra.parseProgram = parseProgram;
-            extra.parsePropertyFunction = parsePropertyFunction;
-            extra.parseRelationalExpression = parseRelationalExpression;
-            extra.parseStatement = parseStatement;
-            extra.parseShiftExpression = parseShiftExpression;
-            extra.parseSwitchCase = parseSwitchCase;
-            extra.parseUnaryExpression = parseUnaryExpression;
-            extra.parseVariableDeclaration = parseVariableDeclaration;
-            extra.parseVariableIdentifier = parseVariableIdentifier;
-
-            parseAdditiveExpression = wrapTracking(extra.parseAdditiveExpression);
-            parseAssignmentExpression = wrapTracking(extra.parseAssignmentExpression);
-            parseBitwiseANDExpression = wrapTracking(extra.parseBitwiseANDExpression);
-            parseBitwiseORExpression = wrapTracking(extra.parseBitwiseORExpression);
-            parseBitwiseXORExpression = wrapTracking(extra.parseBitwiseXORExpression);
-            parseBlock = wrapTracking(extra.parseBlock);
-            parseFunctionSourceElements = wrapTracking(extra.parseFunctionSourceElements);
-            parseCatchClause = wrapTracking(extra.parseCatchClause);
-            parseComputedMember = wrapTracking(extra.parseComputedMember);
-            parseConditionalExpression = wrapTracking(extra.parseConditionalExpression);
-            parseConstLetDeclaration = wrapTracking(extra.parseConstLetDeclaration);
-            parseEqualityExpression = wrapTracking(extra.parseEqualityExpression);
-            parseExpression = wrapTracking(extra.parseExpression);
-            parseForVariableDeclaration = wrapTracking(extra.parseForVariableDeclaration);
-            parseFunctionDeclaration = wrapTracking(extra.parseFunctionDeclaration);
-            parseFunctionExpression = wrapTracking(extra.parseFunctionExpression);
-            parseLeftHandSideExpression = wrapTracking(parseLeftHandSideExpression);
-            parseLogicalANDExpression = wrapTracking(extra.parseLogicalANDExpression);
-            parseLogicalORExpression = wrapTracking(extra.parseLogicalORExpression);
-            parseMultiplicativeExpression = wrapTracking(extra.parseMultiplicativeExpression);
-            parseNewExpression = wrapTracking(extra.parseNewExpression);
-            parseNonComputedProperty = wrapTracking(extra.parseNonComputedProperty);
-            parseObjectProperty = wrapTracking(extra.parseObjectProperty);
-            parseObjectPropertyKey = wrapTracking(extra.parseObjectPropertyKey);
-            parsePostfixExpression = wrapTracking(extra.parsePostfixExpression);
-            parsePrimaryExpression = wrapTracking(extra.parsePrimaryExpression);
-            parseProgram = wrapTracking(extra.parseProgram);
-            parsePropertyFunction = wrapTracking(extra.parsePropertyFunction);
-            parseRelationalExpression = wrapTracking(extra.parseRelationalExpression);
-            parseStatement = wrapTracking(extra.parseStatement);
-            parseShiftExpression = wrapTracking(extra.parseShiftExpression);
-            parseSwitchCase = wrapTracking(extra.parseSwitchCase);
-            parseUnaryExpression = wrapTracking(extra.parseUnaryExpression);
-            parseVariableDeclaration = wrapTracking(extra.parseVariableDeclaration);
-            parseVariableIdentifier = wrapTracking(extra.parseVariableIdentifier);
-        }
-
-        if (typeof extra.tokens !== 'undefined') {
-            extra.advance = advance;
-            extra.scanRegExp = scanRegExp;
-
-            advance = collectToken;
-            scanRegExp = collectRegex;
-        }
-    }
-
-    function unpatch() {
-        if (typeof extra.skipComment === 'function') {
-            skipComment = extra.skipComment;
-        }
-
-        if (extra.raw) {
-            createLiteral = extra.createLiteral;
-        }
-
-        if (extra.range || extra.loc) {
-            parseAdditiveExpression = extra.parseAdditiveExpression;
-            parseAssignmentExpression = extra.parseAssignmentExpression;
-            parseBitwiseANDExpression = extra.parseBitwiseANDExpression;
-            parseBitwiseORExpression = extra.parseBitwiseORExpression;
-            parseBitwiseXORExpression = extra.parseBitwiseXORExpression;
-            parseBlock = extra.parseBlock;
-            parseFunctionSourceElements = extra.parseFunctionSourceElements;
-            parseCatchClause = extra.parseCatchClause;
-            parseComputedMember = extra.parseComputedMember;
-            parseConditionalExpression = extra.parseConditionalExpression;
-            parseConstLetDeclaration = extra.parseConstLetDeclaration;
-            parseEqualityExpression = extra.parseEqualityExpression;
-            parseExpression = extra.parseExpression;
-            parseForVariableDeclaration = extra.parseForVariableDeclaration;
-            parseFunctionDeclaration = extra.parseFunctionDeclaration;
-            parseFunctionExpression = extra.parseFunctionExpression;
-            parseGroupExpression = extra.parseGroupExpression;
-            parseLeftHandSideExpression = extra.parseLeftHandSideExpression;
-            parseLeftHandSideExpressionAllowCall = extra.parseLeftHandSideExpressionAllowCall;
-            parseLogicalANDExpression = extra.parseLogicalANDExpression;
-            parseLogicalORExpression = extra.parseLogicalORExpression;
-            parseMultiplicativeExpression = extra.parseMultiplicativeExpression;
-            parseNewExpression = extra.parseNewExpression;
-            parseNonComputedProperty = extra.parseNonComputedProperty;
-            parseObjectProperty = extra.parseObjectProperty;
-            parseObjectPropertyKey = extra.parseObjectPropertyKey;
-            parsePrimaryExpression = extra.parsePrimaryExpression;
-            parsePostfixExpression = extra.parsePostfixExpression;
-            parseProgram = extra.parseProgram;
-            parsePropertyFunction = extra.parsePropertyFunction;
-            parseRelationalExpression = extra.parseRelationalExpression;
-            parseStatement = extra.parseStatement;
-            parseShiftExpression = extra.parseShiftExpression;
-            parseSwitchCase = extra.parseSwitchCase;
-            parseUnaryExpression = extra.parseUnaryExpression;
-            parseVariableDeclaration = extra.parseVariableDeclaration;
-            parseVariableIdentifier = extra.parseVariableIdentifier;
-        }
-
-        if (typeof extra.scanRegExp === 'function') {
-            advance = extra.advance;
-            scanRegExp = extra.scanRegExp;
-        }
-    }
-
-    function stringToArray(str) {
-        var length = str.length,
-            result = [],
-            i;
-        for (i = 0; i < length; ++i) {
-            result[i] = str.charAt(i);
-        }
-        return result;
-    }
-
-    function parse(code, options) {
-        var program, toString;
-
-        toString = String;
-        if (typeof code !== 'string' && !(code instanceof String)) {
-            code = toString(code);
-        }
-
-        source = code;
-        index = 0;
-        lineNumber = (source.length > 0) ? 1 : 0;
-        lineStart = 0;
-        length = source.length;
-        buffer = null;
-        state = {
-            allowIn: true,
-            labelSet: {},
-            inFunctionBody: false,
-            inIteration: false,
-            inSwitch: false
-        };
-
-        extra = {};
-        if (typeof options !== 'undefined') {
-            extra.range = (typeof options.range === 'boolean') && options.range;
-            extra.loc = (typeof options.loc === 'boolean') && options.loc;
-            extra.raw = (typeof options.raw === 'boolean') && options.raw;
-            if (typeof options.tokens === 'boolean' && options.tokens) {
-                extra.tokens = [];
-            }
-            if (typeof options.comment === 'boolean' && options.comment) {
-                extra.comments = [];
-            }
-            if (typeof options.tolerant === 'boolean' && options.tolerant) {
-                extra.errors = [];
-            }
-        }
-
-        if (length > 0) {
-            if (typeof source[0] === 'undefined') {
-                // Try first to convert to a string. This is good as fast path
-                // for old IE which understands string indexing for string
-                // literals only and not for string object.
-                if (code instanceof String) {
-                    source = code.valueOf();
-                }
-
-                // Force accessing the characters via an array.
-                if (typeof source[0] === 'undefined') {
-                    source = stringToArray(code);
-                }
-            }
-        }
-
-        patch();
-        try {
-            program = parseProgram();
-            if (typeof extra.comments !== 'undefined') {
-                filterCommentLocation();
-                program.comments = extra.comments;
-            }
-            if (typeof extra.tokens !== 'undefined') {
-                filterTokenLocation();
-                program.tokens = extra.tokens;
-            }
-            if (typeof extra.errors !== 'undefined') {
-                program.errors = extra.errors;
-            }
-            if (extra.range || extra.loc) {
-                program.body = filterGroup(program.body);
-            }
-        } catch (e) {
-            throw e;
-        } finally {
-            unpatch();
-            extra = {};
-        }
-
-        return program;
-    }
-
-    // Sync with package.json.
-    exports.version = '1.0.4';
-
-    exports.parse = parse;
-
-    // Deep copy.
-    exports.Syntax = (function () {
-        var name, types = {};
-
-        if (typeof Object.create === 'function') {
-            types = Object.create(null);
-        }
-
-        for (name in Syntax) {
-            if (Syntax.hasOwnProperty(name)) {
-                types[name] = Syntax[name];
-            }
-        }
-
-        if (typeof Object.freeze === 'function') {
-            Object.freeze(types);
-        }
-
-        return types;
-    }());
-
-}));
-/* vim: set sw=4 ts=4 et tw=80 : */
diff --git a/node_modules/esprima/package.json b/node_modules/esprima/package.json
deleted file mode 100644
index 2956fd76df4c88140387a7e25dd3364ec2d640bb..0000000000000000000000000000000000000000
--- a/node_modules/esprima/package.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
-    "name": "esprima",
-    "description": "ECMAScript parsing infrastructure for multipurpose analysis",
-    "homepage": "http://esprima.org",
-    "main": "esprima.js",
-    "bin": {
-        "esparse": "./bin/esparse.js",
-        "esvalidate": "./bin/esvalidate.js"
-    },
-    "files": [
-        "bin",
-        "test/run.js",
-        "test/runner.js",
-        "test/test.js",
-        "test/compat.js",
-        "test/reflect.js",
-        "esprima.js"
-    ],
-    "version": "1.0.4",
-    "engines": {
-        "node": ">=0.4.0"
-    },
-    "maintainers": [{
-        "name": "Ariya Hidayat",
-        "email": "ariya.hidayat@gmail.com",
-        "web": "http://ariya.ofilabs.com"
-    }],
-    "repository": {
-        "type": "git",
-        "url": "http://github.com/ariya/esprima.git"
-    },
-    "licenses": [{
-        "type": "BSD",
-        "url": "http://github.com/ariya/esprima/raw/master/LICENSE.BSD"
-    }],
-    "keywords": [
-        "ast",
-        "ecmascript",
-        "javascript",
-        "parser",
-        "syntax"
-    ],
-    "scripts": {
-        "test": "node test/run.js",
-        "benchmark": "node test/benchmarks.js",
-        "benchmark-quick": "node test/benchmarks.js quick"
-    }
-}
diff --git a/node_modules/esprima/test/compat.js b/node_modules/esprima/test/compat.js
deleted file mode 100644
index ee3a6295eba7ae81536b8f57a99b26a43207e7ff..0000000000000000000000000000000000000000
--- a/node_modules/esprima/test/compat.js
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
-  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>
-  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*jslint node: true */
-/*global document: true, window:true, esprima: true, testReflect: true */
-
-var runTests;
-
-function getContext(esprima, reportCase, reportFailure) {
-    'use strict';
-
-    var Reflect, Pattern;
-
-    // Maps Mozilla Reflect object to our Esprima parser.
-    Reflect = {
-        parse: function (code) {
-            var result;
-
-            reportCase(code);
-
-            try {
-                result = esprima.parse(code);
-            } catch (error) {
-                result = error;
-            }
-
-            return result;
-        }
-    };
-
-    // This is used by Reflect test suite to match a syntax tree.
-    Pattern = function (obj) {
-        var pattern;
-
-        // Poor man's deep object cloning.
-        pattern = JSON.parse(JSON.stringify(obj));
-
-        // Special handling for regular expression literal since we need to
-        // convert it to a string literal, otherwise it will be decoded
-        // as object "{}" and the regular expression would be lost.
-        if (obj.type && obj.type === 'Literal') {
-            if (obj.value instanceof RegExp) {
-                pattern = {
-                    type: obj.type,
-                    value: obj.value.toString()
-                };
-            }
-        }
-
-        // Special handling for branch statement because SpiderMonkey
-        // prefers to put the 'alternate' property before 'consequent'.
-        if (obj.type && obj.type === 'IfStatement') {
-            pattern = {
-                type: pattern.type,
-                test: pattern.test,
-                consequent: pattern.consequent,
-                alternate: pattern.alternate
-            };
-        }
-
-        // Special handling for do while statement because SpiderMonkey
-        // prefers to put the 'test' property before 'body'.
-        if (obj.type && obj.type === 'DoWhileStatement') {
-            pattern = {
-                type: pattern.type,
-                body: pattern.body,
-                test: pattern.test
-            };
-        }
-
-        function adjustRegexLiteralAndRaw(key, value) {
-            if (key === 'value' && value instanceof RegExp) {
-                value = value.toString();
-            } else if (key === 'raw' && typeof value === "string") {
-                // Ignore Esprima-specific 'raw' property.
-                return undefined;
-            }
-            return value;
-        }
-
-        if (obj.type && (obj.type === 'Program')) {
-            pattern.assert = function (tree) {
-                var actual, expected;
-                actual = JSON.stringify(tree, adjustRegexLiteralAndRaw, 4);
-                expected = JSON.stringify(obj, null, 4);
-
-                if (expected !== actual) {
-                    reportFailure(expected, actual);
-                }
-            };
-        }
-
-        return pattern;
-    };
-
-    return {
-        Reflect: Reflect,
-        Pattern: Pattern
-    };
-}
-
-if (typeof window !== 'undefined') {
-    // Run all tests in a browser environment.
-    runTests = function () {
-        'use strict';
-
-        var total = 0,
-            failures = 0;
-
-        function setText(el, str) {
-            if (typeof el.innerText === 'string') {
-                el.innerText = str;
-            } else {
-                el.textContent = str;
-            }
-        }
-
-        function reportCase(code) {
-            var report, e;
-            report = document.getElementById('report');
-            e = document.createElement('pre');
-            e.setAttribute('class', 'code');
-            setText(e, code);
-            report.appendChild(e);
-            total += 1;
-        }
-
-        function reportFailure(expected, actual) {
-            var report, e;
-
-            failures += 1;
-
-            report = document.getElementById('report');
-
-            e = document.createElement('p');
-            setText(e, 'Expected');
-            report.appendChild(e);
-
-            e = document.createElement('pre');
-            e.setAttribute('class', 'expected');
-            setText(e, expected);
-            report.appendChild(e);
-
-            e = document.createElement('p');
-            setText(e, 'Actual');
-            report.appendChild(e);
-
-            e = document.createElement('pre');
-            e.setAttribute('class', 'actual');
-            setText(e, actual);
-            report.appendChild(e);
-        }
-
-        setText(document.getElementById('version'), esprima.version);
-
-        window.setTimeout(function () {
-            var tick, context = getContext(esprima, reportCase, reportFailure);
-
-            tick = new Date();
-            testReflect(context.Reflect, context.Pattern);
-            tick = (new Date()) - tick;
-
-            if (failures > 0) {
-                setText(document.getElementById('status'), total + ' tests. ' +
-                    'Failures: ' + failures + '. ' + tick + ' ms');
-            } else {
-                setText(document.getElementById('status'), total + ' tests. ' +
-                    'No failure. ' + tick + ' ms');
-            }
-        }, 513);
-    };
-} else {
-    (function (global) {
-        'use strict';
-        var esprima = require('../esprima'),
-            tick,
-            total = 0,
-            failures = [],
-            header,
-            current,
-            context;
-
-        function reportCase(code) {
-            total += 1;
-            current = code;
-        }
-
-        function reportFailure(expected, actual) {
-            failures.push({
-                source: current,
-                expected: expected.toString(),
-                actual: actual.toString()
-            });
-        }
-
-        context = getContext(esprima, reportCase, reportFailure);
-
-        tick = new Date();
-        require('./reflect').testReflect(context.Reflect, context.Pattern);
-        tick = (new Date()) - tick;
-
-        header = total + ' tests. ' + failures.length + ' failures. ' +
-            tick + ' ms';
-        if (failures.length) {
-            console.error(header);
-            failures.forEach(function (failure) {
-                console.error(failure.source + ': Expected\n    ' +
-                    failure.expected.split('\n').join('\n    ') +
-                    '\nto match\n    ' + failure.actual);
-            });
-        } else {
-            console.log(header);
-        }
-        process.exit(failures.length === 0 ? 0 : 1);
-    }(this));
-}
-/* vim: set sw=4 ts=4 et tw=80 : */
diff --git a/node_modules/esprima/test/reflect.js b/node_modules/esprima/test/reflect.js
deleted file mode 100644
index dba1ba8f1fe3b687840cc0274157ee38f4ef6ab5..0000000000000000000000000000000000000000
--- a/node_modules/esprima/test/reflect.js
+++ /dev/null
@@ -1,422 +0,0 @@
-// This is modified from Mozilla Reflect.parse test suite (the file is located
-// at js/src/tests/js1_8_5/extensions/reflect-parse.js in the source tree).
-//
-// Some notable changes:
-//   * Removed unsupported features (destructuring, let, comprehensions...).
-//   * Removed tests for E4X (ECMAScript for XML).
-//   * Removed everything related to builder.
-//   * Enclosed every 'Pattern' construct with a scope.
-//   * Tweaked some expected tree to remove generator field.
-//   * Removed the test for bug 632030 and bug 632024.
-
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/licenses/publicdomain/
- */
-
-(function (exports) {
-
-function testReflect(Reflect, Pattern) {
-
-function program(elts) { return Pattern({ type: "Program", body: elts }) }
-function exprStmt(expr) { return Pattern({ type: "ExpressionStatement", expression: expr }) }
-function throwStmt(expr) { return Pattern({ type: "ThrowStatement", argument: expr }) }
-function returnStmt(expr) { return Pattern({ type: "ReturnStatement", argument: expr }) }
-function yieldExpr(expr) { return Pattern({ type: "YieldExpression", argument: expr }) }
-function lit(val) { return Pattern({ type: "Literal", value: val }) }
-var thisExpr = Pattern({ type: "ThisExpression" });
-function funDecl(id, params, body) { return Pattern({ type: "FunctionDeclaration",
-                                             id: id,
-                                             params: params,
-                                             defaults: [],
-                                             body: body,
-                                             rest: null,
-                                             generator: false,
-                                             expression: false
-                                             }) }
-function genFunDecl(id, params, body) { return Pattern({ type: "FunctionDeclaration",
-                                                id: id,
-                                                params: params,
-                                                defaults: [],
-                                                body: body,
-                                                rest: null,
-                                                generator: false,
-                                                expression: false
-                                                }) }
-function declarator(id, init) { return Pattern({ type: "VariableDeclarator", id: id, init: init }) }
-function varDecl(decls) { return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "var" }) }
-function letDecl(decls) { return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "let" }) }
-function constDecl(decls) { return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "const" }) }
-function ident(name) { return Pattern({ type: "Identifier", name: name }) }
-function dotExpr(obj, id) { return Pattern({ type: "MemberExpression", computed: false, object: obj, property: id }) }
-function memExpr(obj, id) { return Pattern({ type: "MemberExpression", computed: true, object: obj, property: id }) }
-function forStmt(init, test, update, body) { return Pattern({ type: "ForStatement", init: init, test: test, update: update, body: body }) }
-function forInStmt(lhs, rhs, body) { return Pattern({ type: "ForInStatement", left: lhs, right: rhs, body: body, each: false }) }
-function forEachInStmt(lhs, rhs, body) { return Pattern({ type: "ForInStatement", left: lhs, right: rhs, body: body, each: true }) }
-function breakStmt(lab) { return Pattern({ type: "BreakStatement", label: lab }) }
-function continueStmt(lab) { return Pattern({ type: "ContinueStatement", label: lab }) }
-function blockStmt(body) { return Pattern({ type: "BlockStatement", body: body }) }
-var emptyStmt = Pattern({ type: "EmptyStatement" });
-function ifStmt(test, cons, alt) { return Pattern({ type: "IfStatement", test: test, alternate: alt, consequent: cons }) }
-function labStmt(lab, stmt) { return Pattern({ type: "LabeledStatement", label: lab, body: stmt }) }
-function withStmt(obj, stmt) { return Pattern({ type: "WithStatement", object: obj, body: stmt }) }
-function whileStmt(test, stmt) { return Pattern({ type: "WhileStatement", test: test, body: stmt }) }
-function doStmt(stmt, test) { return Pattern({ type: "DoWhileStatement", test: test, body: stmt }) }
-function switchStmt(disc, cases) { return Pattern({ type: "SwitchStatement", discriminant: disc, cases: cases }) }
-function caseClause(test, stmts) { return Pattern({ type: "SwitchCase", test: test, consequent: stmts }) }
-function defaultClause(stmts) { return Pattern({ type: "SwitchCase", test: null, consequent: stmts }) }
-function catchClause(id, guard, body) { if (guard) { return Pattern({ type: "GuardedCatchClause", param: id, guard: guard, body: body }) } else { return Pattern({ type: "CatchClause", param: id, body: body }) } }
-function tryStmt(body, guarded, catches, fin) { return Pattern({ type: "TryStatement", block: body, guardedHandlers: guarded, handlers: catches, finalizer: fin }) }
-function letStmt(head, body) { return Pattern({ type: "LetStatement", head: head, body: body }) }
-function funExpr(id, args, body, gen) { return Pattern({ type: "FunctionExpression",
-                                                id: id,
-                                                params: args,
-                                                defaults: [],
-                                                body: body,
-                                                rest: null,
-                                                generator: false,
-                                                expression: false
-                                                }) }
-function genFunExpr(id, args, body) { return Pattern({ type: "FunctionExpression",
-                                              id: id,
-                                              params: args,
-                                              defaults: [],
-                                              body: body,
-                                              rest: null,
-                                              generator: false,
-                                              expression: false
-                                              }) }
-
-function unExpr(op, arg) { return Pattern({ type: "UnaryExpression", operator: op, argument: arg, prefix: true }) }
-function binExpr(op, left, right) { return Pattern({ type: "BinaryExpression", operator: op, left: left, right: right }) }
-function aExpr(op, left, right) { return Pattern({ type: "AssignmentExpression", operator: op, left: left, right: right }) }
-function updExpr(op, arg, prefix) { return Pattern({ type: "UpdateExpression", operator: op, argument: arg, prefix: prefix }) }
-function logExpr(op, left, right) { return Pattern({ type: "LogicalExpression", operator: op, left: left, right: right }) }
-
-function condExpr(test, cons, alt) { return Pattern({ type: "ConditionalExpression", test: test, consequent: cons, alternate: alt }) }
-function seqExpr(exprs) { return Pattern({ type: "SequenceExpression", expressions: exprs }) }
-function newExpr(callee, args) { return Pattern({ type: "NewExpression", callee: callee, arguments: args }) }
-function callExpr(callee, args) { return Pattern({ type: "CallExpression", callee: callee, arguments: args }) }
-function arrExpr(elts) { return Pattern({ type: "ArrayExpression", elements: elts }) }
-function objExpr(elts) { return Pattern({ type: "ObjectExpression", properties: elts }) }
-function objProp(key, value, kind) { return Pattern({ type: "Property", key: key, value: value, kind: kind }) }
-
-function arrPatt(elts) { return Pattern({ type: "ArrayPattern", elements: elts }) }
-function objPatt(elts) { return Pattern({ type: "ObjectPattern", properties: elts }) }
-
-function localSrc(src) { return "(function(){ " + src + " })" }
-function localPatt(patt) { return program([exprStmt(funExpr(null, [], blockStmt([patt])))]) }
-function blockSrc(src) { return "(function(){ { " + src + " } })" }
-function blockPatt(patt) { return program([exprStmt(funExpr(null, [], blockStmt([blockStmt([patt])])))]) }
-
-function assertBlockStmt(src, patt) {
-    blockPatt(patt).assert(Reflect.parse(blockSrc(src)));
-}
-
-function assertBlockExpr(src, patt) {
-    assertBlockStmt(src, exprStmt(patt));
-}
-
-function assertBlockDecl(src, patt, builder) {
-    blockPatt(patt).assert(Reflect.parse(blockSrc(src), {builder: builder}));
-}
-
-function assertLocalStmt(src, patt) {
-    localPatt(patt).assert(Reflect.parse(localSrc(src)));
-}
-
-function assertLocalExpr(src, patt) {
-    assertLocalStmt(src, exprStmt(patt));
-}
-
-function assertLocalDecl(src, patt) {
-    localPatt(patt).assert(Reflect.parse(localSrc(src)));
-}
-
-function assertGlobalStmt(src, patt, builder) {
-    program([patt]).assert(Reflect.parse(src, {builder: builder}));
-}
-
-function assertGlobalExpr(src, patt, builder) {
-    program([exprStmt(patt)]).assert(Reflect.parse(src, {builder: builder}));
-    //assertStmt(src, exprStmt(patt));
-}
-
-function assertGlobalDecl(src, patt) {
-    program([patt]).assert(Reflect.parse(src));
-}
-
-function assertProg(src, patt) {
-    program(patt).assert(Reflect.parse(src));
-}
-
-function assertStmt(src, patt) {
-    assertLocalStmt(src, patt);
-    assertGlobalStmt(src, patt);
-    assertBlockStmt(src, patt);
-}
-
-function assertExpr(src, patt) {
-    assertLocalExpr(src, patt);
-    assertGlobalExpr(src, patt);
-    assertBlockExpr(src, patt);
-}
-
-function assertDecl(src, patt) {
-    assertLocalDecl(src, patt);
-    assertGlobalDecl(src, patt);
-    assertBlockDecl(src, patt);
-}
-
-function assertError(src, errorType) {
-    try {
-        Reflect.parse(src);
-    } catch (e) {
-        return;
-    }
-    throw new Error("expected " + errorType.name + " for " + uneval(src));
-}
-
-
-// general tests
-
-// NB: These are useful but for now jit-test doesn't do I/O reliably.
-
-//program(_).assert(Reflect.parse(snarf('data/flapjax.txt')));
-//program(_).assert(Reflect.parse(snarf('data/jquery-1.4.2.txt')));
-//program(_).assert(Reflect.parse(snarf('data/prototype.js')));
-//program(_).assert(Reflect.parse(snarf('data/dojo.js.uncompressed.js')));
-//program(_).assert(Reflect.parse(snarf('data/mootools-1.2.4-core-nc.js')));
-
-
-// declarations
-
-assertDecl("var x = 1, y = 2, z = 3",
-           varDecl([declarator(ident("x"), lit(1)),
-                    declarator(ident("y"), lit(2)),
-                    declarator(ident("z"), lit(3))]));
-assertDecl("var x, y, z",
-           varDecl([declarator(ident("x"), null),
-                    declarator(ident("y"), null),
-                    declarator(ident("z"), null)]));
-assertDecl("function foo() { }",
-           funDecl(ident("foo"), [], blockStmt([])));
-assertDecl("function foo() { return 42 }",
-           funDecl(ident("foo"), [], blockStmt([returnStmt(lit(42))])));
-
-
-// Bug 591437: rebound args have their defs turned into uses
-assertDecl("function f(a) { function a() { } }",
-           funDecl(ident("f"), [ident("a")], blockStmt([funDecl(ident("a"), [], blockStmt([]))])));
-assertDecl("function f(a,b,c) { function b() { } }",
-           funDecl(ident("f"), [ident("a"),ident("b"),ident("c")], blockStmt([funDecl(ident("b"), [], blockStmt([]))])));
-
-// expressions
-
-assertExpr("true", lit(true));
-assertExpr("false", lit(false));
-assertExpr("42", lit(42));
-assertExpr("(/asdf/)", lit(/asdf/));
-assertExpr("this", thisExpr);
-assertExpr("foo", ident("foo"));
-assertExpr("foo.bar", dotExpr(ident("foo"), ident("bar")));
-assertExpr("foo[bar]", memExpr(ident("foo"), ident("bar")));
-assertExpr("(function(){})", funExpr(null, [], blockStmt([])));
-assertExpr("(function f() {})", funExpr(ident("f"), [], blockStmt([])));
-assertExpr("(function f(x,y,z) {})", funExpr(ident("f"), [ident("x"),ident("y"),ident("z")], blockStmt([])));
-assertExpr("(++x)", updExpr("++", ident("x"), true));
-assertExpr("(x++)", updExpr("++", ident("x"), false));
-assertExpr("(+x)", unExpr("+", ident("x")));
-assertExpr("(-x)", unExpr("-", ident("x")));
-assertExpr("(!x)", unExpr("!", ident("x")));
-assertExpr("(~x)", unExpr("~", ident("x")));
-assertExpr("(delete x)", unExpr("delete", ident("x")));
-assertExpr("(typeof x)", unExpr("typeof", ident("x")));
-assertExpr("(void x)", unExpr("void", ident("x")));
-assertExpr("(x == y)", binExpr("==", ident("x"), ident("y")));
-assertExpr("(x != y)", binExpr("!=", ident("x"), ident("y")));
-assertExpr("(x === y)", binExpr("===", ident("x"), ident("y")));
-assertExpr("(x !== y)", binExpr("!==", ident("x"), ident("y")));
-assertExpr("(x < y)", binExpr("<", ident("x"), ident("y")));
-assertExpr("(x <= y)", binExpr("<=", ident("x"), ident("y")));
-assertExpr("(x > y)", binExpr(">", ident("x"), ident("y")));
-assertExpr("(x >= y)", binExpr(">=", ident("x"), ident("y")));
-assertExpr("(x << y)", binExpr("<<", ident("x"), ident("y")));
-assertExpr("(x >> y)", binExpr(">>", ident("x"), ident("y")));
-assertExpr("(x >>> y)", binExpr(">>>", ident("x"), ident("y")));
-assertExpr("(x + y)", binExpr("+", ident("x"), ident("y")));
-assertExpr("(w + x + y + z)", binExpr("+", binExpr("+", binExpr("+", ident("w"), ident("x")), ident("y")), ident("z")));
-assertExpr("(x - y)", binExpr("-", ident("x"), ident("y")));
-assertExpr("(w - x - y - z)", binExpr("-", binExpr("-", binExpr("-", ident("w"), ident("x")), ident("y")), ident("z")));
-assertExpr("(x * y)", binExpr("*", ident("x"), ident("y")));
-assertExpr("(x / y)", binExpr("/", ident("x"), ident("y")));
-assertExpr("(x % y)", binExpr("%", ident("x"), ident("y")));
-assertExpr("(x | y)", binExpr("|", ident("x"), ident("y")));
-assertExpr("(x ^ y)", binExpr("^", ident("x"), ident("y")));
-assertExpr("(x & y)", binExpr("&", ident("x"), ident("y")));
-assertExpr("(x in y)", binExpr("in", ident("x"), ident("y")));
-assertExpr("(x instanceof y)", binExpr("instanceof", ident("x"), ident("y")));
-assertExpr("(x = y)", aExpr("=", ident("x"), ident("y")));
-assertExpr("(x += y)", aExpr("+=", ident("x"), ident("y")));
-assertExpr("(x -= y)", aExpr("-=", ident("x"), ident("y")));
-assertExpr("(x *= y)", aExpr("*=", ident("x"), ident("y")));
-assertExpr("(x /= y)", aExpr("/=", ident("x"), ident("y")));
-assertExpr("(x %= y)", aExpr("%=", ident("x"), ident("y")));
-assertExpr("(x <<= y)", aExpr("<<=", ident("x"), ident("y")));
-assertExpr("(x >>= y)", aExpr(">>=", ident("x"), ident("y")));
-assertExpr("(x >>>= y)", aExpr(">>>=", ident("x"), ident("y")));
-assertExpr("(x |= y)", aExpr("|=", ident("x"), ident("y")));
-assertExpr("(x ^= y)", aExpr("^=", ident("x"), ident("y")));
-assertExpr("(x &= y)", aExpr("&=", ident("x"), ident("y")));
-assertExpr("(x || y)", logExpr("||", ident("x"), ident("y")));
-assertExpr("(x && y)", logExpr("&&", ident("x"), ident("y")));
-assertExpr("(w || x || y || z)", logExpr("||", logExpr("||", logExpr("||", ident("w"), ident("x")), ident("y")), ident("z")))
-assertExpr("(x ? y : z)", condExpr(ident("x"), ident("y"), ident("z")));
-assertExpr("(x,y)", seqExpr([ident("x"),ident("y")]))
-assertExpr("(x,y,z)", seqExpr([ident("x"),ident("y"),ident("z")]))
-assertExpr("(a,b,c,d,e,f,g)", seqExpr([ident("a"),ident("b"),ident("c"),ident("d"),ident("e"),ident("f"),ident("g")]));
-assertExpr("(new Object)", newExpr(ident("Object"), []));
-assertExpr("(new Object())", newExpr(ident("Object"), []));
-assertExpr("(new Object(42))", newExpr(ident("Object"), [lit(42)]));
-assertExpr("(new Object(1,2,3))", newExpr(ident("Object"), [lit(1),lit(2),lit(3)]));
-assertExpr("(String())", callExpr(ident("String"), []));
-assertExpr("(String(42))", callExpr(ident("String"), [lit(42)]));
-assertExpr("(String(1,2,3))", callExpr(ident("String"), [lit(1),lit(2),lit(3)]));
-assertExpr("[]", arrExpr([]));
-assertExpr("[1]", arrExpr([lit(1)]));
-assertExpr("[1,2]", arrExpr([lit(1),lit(2)]));
-assertExpr("[1,2,3]", arrExpr([lit(1),lit(2),lit(3)]));
-assertExpr("[1,,2,3]", arrExpr([lit(1),,lit(2),lit(3)]));
-assertExpr("[1,,,2,3]", arrExpr([lit(1),,,lit(2),lit(3)]));
-assertExpr("[1,,,2,,3]", arrExpr([lit(1),,,lit(2),,lit(3)]));
-assertExpr("[1,,,2,,,3]", arrExpr([lit(1),,,lit(2),,,lit(3)]));
-assertExpr("[,1,2,3]", arrExpr([,lit(1),lit(2),lit(3)]));
-assertExpr("[,,1,2,3]", arrExpr([,,lit(1),lit(2),lit(3)]));
-assertExpr("[,,,1,2,3]", arrExpr([,,,lit(1),lit(2),lit(3)]));
-assertExpr("[,,,1,2,3,]", arrExpr([,,,lit(1),lit(2),lit(3)]));
-assertExpr("[,,,1,2,3,,]", arrExpr([,,,lit(1),lit(2),lit(3),undefined]));
-assertExpr("[,,,1,2,3,,,]", arrExpr([,,,lit(1),lit(2),lit(3),undefined,undefined]));
-assertExpr("[,,,,,]", arrExpr([undefined,undefined,undefined,undefined,undefined]));
-assertExpr("({})", objExpr([]));
-assertExpr("({x:1})", objExpr([objProp(ident("x"), lit(1), "init")]));
-assertExpr("({x:1, y:2})", objExpr([objProp(ident("x"), lit(1), "init"),
-                                    objProp(ident("y"), lit(2), "init")]));
-assertExpr("({x:1, y:2, z:3})", objExpr([objProp(ident("x"), lit(1), "init"),
-                                         objProp(ident("y"), lit(2), "init"),
-                                         objProp(ident("z"), lit(3), "init") ]));
-assertExpr("({x:1, 'y':2, z:3})", objExpr([objProp(ident("x"), lit(1), "init"),
-                                           objProp(lit("y"), lit(2), "init"),
-                                           objProp(ident("z"), lit(3), "init") ]));
-assertExpr("({'x':1, 'y':2, z:3})", objExpr([objProp(lit("x"), lit(1), "init"),
-                                             objProp(lit("y"), lit(2), "init"),
-                                             objProp(ident("z"), lit(3), "init") ]));
-assertExpr("({'x':1, 'y':2, 3:3})", objExpr([objProp(lit("x"), lit(1), "init"),
-                                             objProp(lit("y"), lit(2), "init"),
-                                             objProp(lit(3), lit(3), "init") ]));
-
-// Bug 571617: eliminate constant-folding
-assertExpr("2 + 3", binExpr("+", lit(2), lit(3)));
-
-// Bug 632026: constant-folding
-assertExpr("typeof(0?0:a)", unExpr("typeof", condExpr(lit(0), lit(0), ident("a"))));
-
-// Bug 632056: constant-folding
-program([exprStmt(ident("f")),
-         ifStmt(lit(1),
-                funDecl(ident("f"), [], blockStmt([])),
-                null)]).assert(Reflect.parse("f; if (1) function f(){}"));
-
-// statements
-
-assertStmt("throw 42", throwStmt(lit(42)));
-assertStmt("for (;;) break", forStmt(null, null, null, breakStmt(null)));
-assertStmt("for (x; y; z) break", forStmt(ident("x"), ident("y"), ident("z"), breakStmt(null)));
-assertStmt("for (var x; y; z) break", forStmt(varDecl([declarator(ident("x"), null)]), ident("y"), ident("z"), breakStmt(null)));
-assertStmt("for (var x = 42; y; z) break", forStmt(varDecl([declarator(ident("x"), lit(42))]), ident("y"), ident("z"), breakStmt(null)));
-assertStmt("for (x; ; z) break", forStmt(ident("x"), null, ident("z"), breakStmt(null)));
-assertStmt("for (var x; ; z) break", forStmt(varDecl([declarator(ident("x"), null)]), null, ident("z"), breakStmt(null)));
-assertStmt("for (var x = 42; ; z) break", forStmt(varDecl([declarator(ident("x"), lit(42))]), null, ident("z"), breakStmt(null)));
-assertStmt("for (x; y; ) break", forStmt(ident("x"), ident("y"), null, breakStmt(null)));
-assertStmt("for (var x; y; ) break", forStmt(varDecl([declarator(ident("x"), null)]), ident("y"), null, breakStmt(null)));
-assertStmt("for (var x = 42; y; ) break", forStmt(varDecl([declarator(ident("x"),lit(42))]), ident("y"), null, breakStmt(null)));
-assertStmt("for (var x in y) break", forInStmt(varDecl([declarator(ident("x"),null)]), ident("y"), breakStmt(null)));
-assertStmt("for (x in y) break", forInStmt(ident("x"), ident("y"), breakStmt(null)));
-assertStmt("{ }", blockStmt([]));
-assertStmt("{ throw 1; throw 2; throw 3; }", blockStmt([ throwStmt(lit(1)), throwStmt(lit(2)), throwStmt(lit(3))]));
-assertStmt(";", emptyStmt);
-assertStmt("if (foo) throw 42;", ifStmt(ident("foo"), throwStmt(lit(42)), null));
-assertStmt("if (foo) throw 42; else true;", ifStmt(ident("foo"), throwStmt(lit(42)), exprStmt(lit(true))));
-assertStmt("if (foo) { throw 1; throw 2; throw 3; }",
-           ifStmt(ident("foo"),
-                  blockStmt([throwStmt(lit(1)), throwStmt(lit(2)), throwStmt(lit(3))]),
-                  null));
-assertStmt("if (foo) { throw 1; throw 2; throw 3; } else true;",
-           ifStmt(ident("foo"),
-                  blockStmt([throwStmt(lit(1)), throwStmt(lit(2)), throwStmt(lit(3))]),
-                  exprStmt(lit(true))));
-assertStmt("foo: for(;;) break foo;", labStmt(ident("foo"), forStmt(null, null, null, breakStmt(ident("foo")))));
-assertStmt("foo: for(;;) continue foo;", labStmt(ident("foo"), forStmt(null, null, null, continueStmt(ident("foo")))));
-assertStmt("with (obj) { }", withStmt(ident("obj"), blockStmt([])));
-assertStmt("with (obj) { obj; }", withStmt(ident("obj"), blockStmt([exprStmt(ident("obj"))])));
-assertStmt("while (foo) { }", whileStmt(ident("foo"), blockStmt([])));
-assertStmt("while (foo) { foo; }", whileStmt(ident("foo"), blockStmt([exprStmt(ident("foo"))])));
-assertStmt("do { } while (foo);", doStmt(blockStmt([]), ident("foo")));
-assertStmt("do { foo; } while (foo)", doStmt(blockStmt([exprStmt(ident("foo"))]), ident("foo")));
-assertStmt("switch (foo) { case 1: 1; break; case 2: 2; break; default: 3; }",
-           switchStmt(ident("foo"),
-                      [ caseClause(lit(1), [ exprStmt(lit(1)), breakStmt(null) ]),
-                        caseClause(lit(2), [ exprStmt(lit(2)), breakStmt(null) ]),
-                        defaultClause([ exprStmt(lit(3)) ]) ]));
-assertStmt("switch (foo) { case 1: 1; break; case 2: 2; break; default: 3; case 42: 42; }",
-           switchStmt(ident("foo"),
-                      [ caseClause(lit(1), [ exprStmt(lit(1)), breakStmt(null) ]),
-                        caseClause(lit(2), [ exprStmt(lit(2)), breakStmt(null) ]),
-                        defaultClause([ exprStmt(lit(3)) ]),
-                        caseClause(lit(42), [ exprStmt(lit(42)) ]) ]));
-assertStmt("try { } catch (e) { }",
-           tryStmt(blockStmt([]),
-                   [],
-                   [ catchClause(ident("e"), null, blockStmt([])) ],
-                   null));
-assertStmt("try { } catch (e) { } finally { }",
-           tryStmt(blockStmt([]),
-                   [],
-                   [ catchClause(ident("e"), null, blockStmt([])) ],
-                   blockStmt([])));
-assertStmt("try { } finally { }",
-           tryStmt(blockStmt([]),
-                   [],
-                   [],
-                   blockStmt([])));
-
-// redeclarations (TOK_NAME nodes with lexdef)
-
-assertStmt("function f() { function g() { } function g() { } }",
-           funDecl(ident("f"), [], blockStmt([funDecl(ident("g"), [], blockStmt([])),
-                                              funDecl(ident("g"), [], blockStmt([]))])));
-
-assertStmt("function f() { function g() { } function g() { return 42 } }",
-           funDecl(ident("f"), [], blockStmt([funDecl(ident("g"), [], blockStmt([])),
-                                              funDecl(ident("g"), [], blockStmt([returnStmt(lit(42))]))])));
-
-assertStmt("function f() { var x = 42; var x = 43; }",
-           funDecl(ident("f"), [], blockStmt([varDecl([declarator(ident("x"),lit(42))]),
-                                              varDecl([declarator(ident("x"),lit(43))])])));
-
-// getters and setters
-
- assertExpr("({ get x() { return 42 } })",
-            objExpr([ objProp(ident("x"),
-                              funExpr(null, [], blockStmt([returnStmt(lit(42))])),
-                              "get" ) ]));
- assertExpr("({ set x(v) { return 42 } })",
-            objExpr([ objProp(ident("x"),
-                              funExpr(null, [ident("v")], blockStmt([returnStmt(lit(42))])),
-                              "set" ) ]));
-
-}
-
-exports.testReflect = testReflect;
-
-}(typeof exports === 'undefined' ? this : exports));
diff --git a/node_modules/esprima/test/run.js b/node_modules/esprima/test/run.js
deleted file mode 100644
index 32ca3faa4f6581dc0f7824d3fb7199cdf666b5a1..0000000000000000000000000000000000000000
--- a/node_modules/esprima/test/run.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>
-  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*jslint node:true */
-
-(function () {
-    'use strict';
-
-    var child = require('child_process'),
-        nodejs = '"' + process.execPath + '"',
-        ret = 0,
-        suites,
-        index;
-
-    suites = [
-        'runner',
-        'compat'
-    ];
-
-    function nextTest() {
-        var suite = suites[index];
-
-        if (index < suites.length) {
-            child.exec(nodejs + ' ./test/' + suite + '.js', function (err, stdout, stderr) {
-                if (stdout) {
-                    process.stdout.write(suite + ': ' + stdout);
-                }
-                if (stderr) {
-                    process.stderr.write(suite + ': ' + stderr);
-                }
-                if (err) {
-                    ret = err.code;
-                }
-                index += 1;
-                nextTest();
-            });
-        } else {
-            process.exit(ret);
-        }
-    }
-
-    index = 0;
-    nextTest();
-}());
diff --git a/node_modules/esprima/test/runner.js b/node_modules/esprima/test/runner.js
deleted file mode 100644
index c1a3fc9bf05d489efa7ba13c00b6ba21756120db..0000000000000000000000000000000000000000
--- a/node_modules/esprima/test/runner.js
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
-  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
-  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>
-  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>
-  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>
-  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>
-  Copyright (C) 2011 Yusuke Suzuki <utatane.tea@gmail.com>
-  Copyright (C) 2011 Arpad Borsos <arpad.borsos@googlemail.com>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*jslint browser:true node:true */
-/*global esprima:true, testFixture:true */
-
-var runTests;
-
-// Special handling for regular expression literal since we need to
-// convert it to a string literal, otherwise it will be decoded
-// as object "{}" and the regular expression would be lost.
-function adjustRegexLiteral(key, value) {
-    'use strict';
-    if (key === 'value' && value instanceof RegExp) {
-        value = value.toString();
-    }
-    return value;
-}
-
-function NotMatchingError(expected, actual) {
-    'use strict';
-    Error.call(this, 'Expected ');
-    this.expected = expected;
-    this.actual = actual;
-}
-NotMatchingError.prototype = new Error();
-
-function errorToObject(e) {
-    'use strict';
-    var msg = e.toString();
-
-    // Opera 9.64 produces an non-standard string in toString().
-    if (msg.substr(0, 6) !== 'Error:') {
-        if (typeof e.message === 'string') {
-            msg = 'Error: ' + e.message;
-        }
-    }
-
-    return {
-        index: e.index,
-        lineNumber: e.lineNumber,
-        column: e.column,
-        message: msg
-    };
-}
-
-function testParse(esprima, code, syntax) {
-    'use strict';
-    var expected, tree, actual, options, StringObject, i, len, err;
-
-    // alias, so that JSLint does not complain.
-    StringObject = String;
-
-    options = {
-        comment: (typeof syntax.comments !== 'undefined'),
-        range: true,
-        loc: true,
-        tokens: (typeof syntax.tokens !== 'undefined'),
-        raw: true,
-        tolerant: (typeof syntax.errors !== 'undefined')
-    };
-
-    if (typeof syntax.tokens !== 'undefined') {
-        if (syntax.tokens.length > 0) {
-            options.range = (typeof syntax.tokens[0].range !== 'undefined');
-            options.loc = (typeof syntax.tokens[0].loc !== 'undefined');
-        }
-    }
-
-    if (typeof syntax.comments !== 'undefined') {
-        if (syntax.comments.length > 0) {
-            options.range = (typeof syntax.comments[0].range !== 'undefined');
-            options.loc = (typeof syntax.comments[0].loc !== 'undefined');
-        }
-    }
-
-    expected = JSON.stringify(syntax, null, 4);
-    try {
-        tree = esprima.parse(code, options);
-        tree = (options.comment || options.tokens || options.tolerant) ? tree : tree.body[0];
-
-        if (options.tolerant) {
-            for (i = 0, len = tree.errors.length; i < len; i += 1) {
-                tree.errors[i] = errorToObject(tree.errors[i]);
-            }
-        }
-
-        actual = JSON.stringify(tree, adjustRegexLiteral, 4);
-
-        // Only to ensure that there is no error when using string object.
-        esprima.parse(new StringObject(code), options);
-
-    } catch (e) {
-        throw new NotMatchingError(expected, e.toString());
-    }
-    if (expected !== actual) {
-        throw new NotMatchingError(expected, actual);
-    }
-
-    function filter(key, value) {
-        if (key === 'value' && value instanceof RegExp) {
-            value = value.toString();
-        }
-        return (key === 'loc' || key === 'range') ? undefined : value;
-    }
-
-    if (options.tolerant) {
-        return;
-    }
-
-
-    // Check again without any location info.
-    options.range = false;
-    options.loc = false;
-    expected = JSON.stringify(syntax, filter, 4);
-    try {
-        tree = esprima.parse(code, options);
-        tree = (options.comment || options.tokens) ? tree : tree.body[0];
-
-        if (options.tolerant) {
-            for (i = 0, len = tree.errors.length; i < len; i += 1) {
-                tree.errors[i] = errorToObject(tree.errors[i]);
-            }
-        }
-
-        actual = JSON.stringify(tree, filter, 4);
-    } catch (e) {
-        throw new NotMatchingError(expected, e.toString());
-    }
-    if (expected !== actual) {
-        throw new NotMatchingError(expected, actual);
-    }
-}
-
-function testError(esprima, code, exception) {
-    'use strict';
-    var i, options, expected, actual, handleInvalidRegexFlag;
-
-    // Different parsing options should give the same error.
-    options = [
-        {},
-        { comment: true },
-        { raw: true },
-        { raw: true, comment: true }
-    ];
-
-    // If handleInvalidRegexFlag is true, an invalid flag in a regular expression
-    // will throw an exception. In some old version V8, this is not the case
-    // and hence handleInvalidRegexFlag is false.
-    handleInvalidRegexFlag = false;
-    try {
-        'test'.match(new RegExp('[a-z]', 'x'));
-    } catch (e) {
-        handleInvalidRegexFlag = true;
-    }
-
-    expected = JSON.stringify(exception);
-
-    for (i = 0; i < options.length; i += 1) {
-
-        try {
-            esprima.parse(code, options[i]);
-        } catch (e) {
-            actual = JSON.stringify(errorToObject(e));
-        }
-
-        if (expected !== actual) {
-
-            // Compensate for old V8 which does not handle invalid flag.
-            if (exception.message.indexOf('Invalid regular expression') > 0) {
-                if (typeof actual === 'undefined' && !handleInvalidRegexFlag) {
-                    return;
-                }
-            }
-
-            throw new NotMatchingError(expected, actual);
-        }
-
-    }
-}
-
-function testAPI(esprima, code, result) {
-    'use strict';
-    var expected, res, actual;
-
-    expected = JSON.stringify(result.result, null, 4);
-    try {
-        if (typeof result.property !== 'undefined') {
-            res = esprima[result.property];
-        } else {
-            res = esprima[result.call].apply(esprima, result.args);
-        }
-        actual = JSON.stringify(res, adjustRegexLiteral, 4);
-    } catch (e) {
-        throw new NotMatchingError(expected, e.toString());
-    }
-    if (expected !== actual) {
-        throw new NotMatchingError(expected, actual);
-    }
-}
-
-function runTest(esprima, code, result) {
-    'use strict';
-    if (result.hasOwnProperty('lineNumber')) {
-        testError(esprima, code, result);
-    } else if (result.hasOwnProperty('result')) {
-        testAPI(esprima, code, result);
-    } else {
-        testParse(esprima, code, result);
-    }
-}
-
-if (typeof window !== 'undefined') {
-    // Run all tests in a browser environment.
-    runTests = function () {
-        'use strict';
-        var total = 0,
-            failures = 0,
-            category,
-            fixture,
-            source,
-            tick,
-            expected,
-            index,
-            len;
-
-        function setText(el, str) {
-            if (typeof el.innerText === 'string') {
-                el.innerText = str;
-            } else {
-                el.textContent = str;
-            }
-        }
-
-        function startCategory(category) {
-            var report, e;
-            report = document.getElementById('report');
-            e = document.createElement('h4');
-            setText(e, category);
-            report.appendChild(e);
-        }
-
-        function reportSuccess(code) {
-            var report, e;
-            report = document.getElementById('report');
-            e = document.createElement('pre');
-            e.setAttribute('class', 'code');
-            setText(e, code);
-            report.appendChild(e);
-        }
-
-        function reportFailure(code, expected, actual) {
-            var report, e;
-
-            report = document.getElementById('report');
-
-            e = document.createElement('p');
-            setText(e, 'Code:');
-            report.appendChild(e);
-
-            e = document.createElement('pre');
-            e.setAttribute('class', 'code');
-            setText(e, code);
-            report.appendChild(e);
-
-            e = document.createElement('p');
-            setText(e, 'Expected');
-            report.appendChild(e);
-
-            e = document.createElement('pre');
-            e.setAttribute('class', 'expected');
-            setText(e, expected);
-            report.appendChild(e);
-
-            e = document.createElement('p');
-            setText(e, 'Actual');
-            report.appendChild(e);
-
-            e = document.createElement('pre');
-            e.setAttribute('class', 'actual');
-            setText(e, actual);
-            report.appendChild(e);
-        }
-
-        setText(document.getElementById('version'), esprima.version);
-
-        tick = new Date();
-        for (category in testFixture) {
-            if (testFixture.hasOwnProperty(category)) {
-                startCategory(category);
-                fixture = testFixture[category];
-                for (source in fixture) {
-                    if (fixture.hasOwnProperty(source)) {
-                        expected = fixture[source];
-                        total += 1;
-                        try {
-                            runTest(esprima, source, expected);
-                            reportSuccess(source, JSON.stringify(expected, null, 4));
-                        } catch (e) {
-                            failures += 1;
-                            reportFailure(source, e.expected, e.actual);
-                        }
-                    }
-                }
-            }
-        }
-        tick = (new Date()) - tick;
-
-        if (failures > 0) {
-            setText(document.getElementById('status'), total + ' tests. ' +
-                'Failures: ' + failures + '. ' + tick + ' ms');
-        } else {
-            setText(document.getElementById('status'), total + ' tests. ' +
-                'No failure. ' + tick + ' ms');
-        }
-    };
-} else {
-    (function () {
-        'use strict';
-
-        var esprima = require('../esprima'),
-            vm = require('vm'),
-            fs = require('fs'),
-            total = 0,
-            failures = [],
-            tick = new Date(),
-            expected,
-            header;
-
-        vm.runInThisContext(fs.readFileSync(__dirname + '/test.js', 'utf-8'));
-
-        Object.keys(testFixture).forEach(function (category) {
-            Object.keys(testFixture[category]).forEach(function (source) {
-                total += 1;
-                expected = testFixture[category][source];
-                try {
-                    runTest(esprima, source, expected);
-                } catch (e) {
-                    e.source = source;
-                    failures.push(e);
-                }
-            });
-        });
-        tick = (new Date()) - tick;
-
-        header = total + ' tests. ' + failures.length + ' failures. ' +
-            tick + ' ms';
-        if (failures.length) {
-            console.error(header);
-            failures.forEach(function (failure) {
-                console.error(failure.source + ': Expected\n    ' +
-                    failure.expected.split('\n').join('\n    ') +
-                    '\nto match\n    ' + failure.actual);
-            });
-        } else {
-            console.log(header);
-        }
-        process.exit(failures.length === 0 ? 0 : 1);
-    }());
-}
diff --git a/node_modules/esprima/test/test.js b/node_modules/esprima/test/test.js
deleted file mode 100644
index 8ceee54b749716bac4b4e159ca4f5e01e88cdc67..0000000000000000000000000000000000000000
--- a/node_modules/esprima/test/test.js
+++ /dev/null
@@ -1,20238 +0,0 @@
-/*
-  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
-  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>
-  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>
-  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>
-  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>
-  Copyright (C) 2011 Yusuke Suzuki <utatane.tea@gmail.com>
-  Copyright (C) 2011 Arpad Borsos <arpad.borsos@googlemail.com>
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
-  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-var testFixture = {
-
-    'Primary Expression': {
-
-        'this\n': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'ThisExpression',
-                    range: [0, 4],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 4 }
-                    }
-                },
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 2, column: 0 }
-                }
-            }],
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 0 }
-            },
-            tokens: [{
-                type: 'Keyword',
-                value: 'this',
-                range: [0, 4],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 4 }
-                }
-            }]
-        },
-
-        'null\n': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: null,
-                    raw: 'null',
-                    range: [0, 4],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 4 }
-                    }
-                },
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 2, column: 0 }
-                }
-            }],
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 0 }
-            },
-            tokens: [{
-                type: 'Null',
-                value: 'null',
-                range: [0, 4],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 4 }
-                }
-            }]
-        },
-
-        '\n    42\n\n': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [5, 7],
-                    loc: {
-                        start: { line: 2, column: 4 },
-                        end: { line: 2, column: 6 }
-                    }
-                },
-                range: [5, 9],
-                loc: {
-                    start: { line: 2, column: 4 },
-                    end: { line: 4, column: 0 }
-                }
-            }],
-            range: [5, 9],
-            loc: {
-                start: { line: 2, column: 4 },
-                end: { line: 4, column: 0 }
-            },
-            tokens: [{
-                type: 'Numeric',
-                value: '42',
-                range: [5, 7],
-                loc: {
-                    start: { line: 2, column: 4 },
-                    end: { line: 2, column: 6 }
-                }
-            }]
-        },
-
-        '(1 + 2 ) * 3': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '*',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '+',
-                    left: {
-                        type: 'Literal',
-                        value: 1,
-                        raw: '1',
-                        range: [1, 2],
-                        loc: {
-                            start: { line: 1, column: 1 },
-                            end: { line: 1, column: 2 }
-                        }
-                    },
-                    right: {
-                        type: 'Literal',
-                        value: 2,
-                        raw: '2',
-                        range: [5, 6],
-                        loc: {
-                            start: { line: 1, column: 5 },
-                            end: { line: 1, column: 6 }
-                        }
-                    },
-                    range: [1, 6],
-                    loc: {
-                        start: { line: 1, column: 1 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 3,
-                    raw: '3',
-                    range: [11, 12],
-                    loc: {
-                        start: { line: 1, column: 11 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 12],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 12 }
-                }
-            },
-            range: [0, 12],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 12 }
-            }
-        }
-
-    },
-
-    'Grouping Operator': {
-
-        '(1) + (2  ) + 3': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '+',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '+',
-                    left: {
-                        type: 'Literal',
-                        value: 1,
-                        raw: '1',
-                        range: [1, 2],
-                        loc: {
-                            start: { line: 1, column: 1 },
-                            end: { line: 1, column: 2 }
-                        }
-                    },
-                    right: {
-                        type: 'Literal',
-                        value: 2,
-                        raw: '2',
-                        range: [7, 8],
-                        loc: {
-                            start: { line: 1, column: 7 },
-                            end: { line: 1, column: 8 }
-                        }
-                    },
-                    range: [0, 11],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 11 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 3,
-                    raw: '3',
-                    range: [14, 15],
-                    loc: {
-                        start: { line: 1, column: 14 },
-                        end: { line: 1, column: 15 }
-                    }
-                },
-                range: [0, 15],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 15 }
-                }
-            },
-            range: [0, 15],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 15 }
-            }
-        },
-
-        '4 + 5 << (6)': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '<<',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '+',
-                    left: {
-                        type: 'Literal',
-                        value: 4,
-                        raw: '4',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Literal',
-                        value: 5,
-                        raw: '5',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    range: [0, 5],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 6,
-                    raw: '6',
-                    range: [10, 11],
-                    loc: {
-                        start: { line: 1, column: 10 },
-                        end: { line: 1, column: 11 }
-                    }
-                },
-                range: [0, 12],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 12 }
-                }
-            },
-            range: [0, 12],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 12 }
-            }
-        }
-
-    },
-
-    'Array Initializer': {
-
-        'x = []': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'AssignmentExpression',
-                    operator: '=',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'ArrayExpression',
-                        elements: [],
-                        range: [4, 6],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 6 }
-                        }
-                    },
-                    range: [0, 6],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            }],
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            },
-            tokens: [{
-                type: 'Identifier',
-                value: 'x',
-                range: [0, 1],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 1 }
-                }
-            }, {
-                type: 'Punctuator',
-                value: '=',
-                range: [2, 3],
-                loc: {
-                    start: { line: 1, column: 2 },
-                    end: { line: 1, column: 3 }
-                }
-            }, {
-                type: 'Punctuator',
-                value: '[',
-                range: [4, 5],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 5 }
-                }
-            }, {
-                type: 'Punctuator',
-                value: ']',
-                range: [5, 6],
-                loc: {
-                    start: { line: 1, column: 5 },
-                    end: { line: 1, column: 6 }
-                }
-            }]
-        },
-
-        'x = [ ]': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ArrayExpression',
-                    elements: [],
-                    range: [4, 7],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        'x = [ 42 ]': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ArrayExpression',
-                    elements: [{
-                        type: 'Literal',
-                        value: 42,
-                        raw: '42',
-                        range: [6, 8],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 8 }
-                        }
-                    }],
-                    range: [4, 10],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 10 }
-                    }
-                },
-                range: [0, 10],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 10 }
-                }
-            },
-            range: [0, 10],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 10 }
-            }
-        },
-
-        'x = [ 42, ]': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ArrayExpression',
-                    elements: [{
-                        type: 'Literal',
-                        value: 42,
-                        raw: '42',
-                        range: [6, 8],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 8 }
-                        }
-                    }],
-                    range: [4, 11],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 11 }
-                    }
-                },
-                range: [0, 11],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            range: [0, 11],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 11 }
-            }
-        },
-
-        'x = [ ,, 42 ]': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ArrayExpression',
-                    elements: [
-                        null,
-                        null,
-                        {
-                            type: 'Literal',
-                            value: 42,
-                            raw: '42',
-                            range: [9, 11],
-                            loc: {
-                                start: { line: 1, column: 9 },
-                                end: { line: 1, column: 11 }
-                            }
-                        }],
-                    range: [4, 13],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 13 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            range: [0, 13],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 13 }
-            }
-        },
-
-        'x = [ 1, 2, 3, ]': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ArrayExpression',
-                    elements: [{
-                        type: 'Literal',
-                        value: 1,
-                        raw: '1',
-                        range: [6, 7],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 7 }
-                        }
-                    }, {
-                        type: 'Literal',
-                        value: 2,
-                        raw: '2',
-                        range: [9, 10],
-                        loc: {
-                            start: { line: 1, column: 9 },
-                            end: { line: 1, column: 10 }
-                        }
-                    }, {
-                        type: 'Literal',
-                        value: 3,
-                        raw: '3',
-                        range: [12, 13],
-                        loc: {
-                            start: { line: 1, column: 12 },
-                            end: { line: 1, column: 13 }
-                        }
-                    }],
-                    range: [4, 16],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 16 }
-                    }
-                },
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            },
-            range: [0, 16],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 16 }
-            }
-        },
-
-        'x = [ 1, 2,, 3, ]': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ArrayExpression',
-                    elements: [{
-                        type: 'Literal',
-                        value: 1,
-                        raw: '1',
-                        range: [6, 7],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 7 }
-                        }
-                    }, {
-                        type: 'Literal',
-                        value: 2,
-                        raw: '2',
-                        range: [9, 10],
-                        loc: {
-                            start: { line: 1, column: 9 },
-                            end: { line: 1, column: 10 }
-                        }
-                    }, null, {
-                        type: 'Literal',
-                        value: 3,
-                        raw: '3',
-                        range: [13, 14],
-                        loc: {
-                            start: { line: 1, column: 13 },
-                            end: { line: 1, column: 14 }
-                        }
-                    }],
-                    range: [4, 17],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 17 }
-                    }
-                },
-                range: [0, 17],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 17 }
-                }
-            },
-            range: [0, 17],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 17 }
-            }
-        },
-
-        '日本語 = []': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: '日本語',
-                    range: [0, 3],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 3 }
-                    }
-                },
-                right: {
-                    type: 'ArrayExpression',
-                    elements: [],
-                    range: [6, 8],
-                    loc: {
-                        start: { line: 1, column: 6 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                range: [0, 8],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 8 }
-                }
-            },
-            range: [0, 8],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 8 }
-            }
-        },
-
-        'T\u203F = []': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'T\u203F',
-                    range: [0, 2],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 2 }
-                    }
-                },
-                right: {
-                    type: 'ArrayExpression',
-                    elements: [],
-                    range: [5, 7],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        'T\u200C = []': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'T\u200C',
-                    range: [0, 2],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 2 }
-                    }
-                },
-                right: {
-                    type: 'ArrayExpression',
-                    elements: [],
-                    range: [5, 7],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        'T\u200D = []': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'T\u200D',
-                    range: [0, 2],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 2 }
-                    }
-                },
-                right: {
-                    type: 'ArrayExpression',
-                    elements: [],
-                    range: [5, 7],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        '\u2163\u2161 = []': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: '\u2163\u2161',
-                    range: [0, 2],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 2 }
-                    }
-                },
-                right: {
-                    type: 'ArrayExpression',
-                    elements: [],
-                    range: [5, 7],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        '\u2163\u2161\u200A=\u2009[]': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: '\u2163\u2161',
-                    range: [0, 2],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 2 }
-                    }
-                },
-                right: {
-                    type: 'ArrayExpression',
-                    elements: [],
-                    range: [5, 7],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        }
-
-    },
-
-    'Object Initializer': {
-
-        'x = {}': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [],
-                    range: [4, 6],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        'x = { }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [],
-                    range: [4, 7],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        'x = { answer: 42 }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'answer',
-                            range: [6, 12],
-                            loc: {
-                                start: { line: 1, column: 6 },
-                                end: { line: 1, column: 12 }
-                            }
-                        },
-                        value: {
-                            type: 'Literal',
-                            value: 42,
-                            raw: '42',
-                            range: [14, 16],
-                            loc: {
-                                start: { line: 1, column: 14 },
-                                end: { line: 1, column: 16 }
-                            }
-                        },
-                        kind: 'init',
-                        range: [6, 16],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 16 }
-                        }
-                    }],
-                    range: [4, 18],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 18 }
-                    }
-                },
-                range: [0, 18],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 18 }
-                }
-            },
-            range: [0, 18],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 18 }
-            }
-        },
-
-        'x = { if: 42 }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'if',
-                            range: [6, 8],
-                            loc: {
-                                start: { line: 1, column: 6 },
-                                end: { line: 1, column: 8 }
-                            }
-                        },
-                        value: {
-                            type: 'Literal',
-                            value: 42,
-                            raw: '42',
-                            range: [10, 12],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 12 }
-                            }
-                        },
-                        kind: 'init',
-                        range: [6, 12],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 12 }
-                        }
-                    }],
-                    range: [4, 14],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 14 }
-                    }
-                },
-                range: [0, 14],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 14 }
-                }
-            },
-            range: [0, 14],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 14 }
-            }
-        },
-
-        'x = { true: 42 }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'true',
-                            range: [6, 10],
-                            loc: {
-                                start: { line: 1, column: 6 },
-                                end: { line: 1, column: 10 }
-                            }
-                        },
-                        value: {
-                            type: 'Literal',
-                            value: 42,
-                            raw: '42',
-                            range: [12, 14],
-                            loc: {
-                                start: { line: 1, column: 12 },
-                                end: { line: 1, column: 14 }
-                            }
-                        },
-                        kind: 'init',
-                        range: [6, 14],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 14 }
-                        }
-                    }],
-                    range: [4, 16],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 16 }
-                    }
-                },
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            },
-            range: [0, 16],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 16 }
-            }
-        },
-
-        'x = { false: 42 }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'false',
-                            range: [6, 11],
-                            loc: {
-                                start: { line: 1, column: 6 },
-                                end: { line: 1, column: 11 }
-                            }
-                        },
-                        value: {
-                            type: 'Literal',
-                            value: 42,
-                            raw: '42',
-                            range: [13, 15],
-                            loc: {
-                                start: { line: 1, column: 13 },
-                                end: { line: 1, column: 15 }
-                            }
-                        },
-                        kind: 'init',
-                        range: [6, 15],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 15 }
-                        }
-                    }],
-                    range: [4, 17],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 17 }
-                    }
-                },
-                range: [0, 17],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 17 }
-                }
-            },
-            range: [0, 17],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 17 }
-            }
-        },
-
-        'x = { null: 42 }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'null',
-                            range: [6, 10],
-                            loc: {
-                                start: { line: 1, column: 6 },
-                                end: { line: 1, column: 10 }
-                            }
-                        },
-                        value: {
-                            type: 'Literal',
-                            value: 42,
-                            raw: '42',
-                            range: [12, 14],
-                            loc: {
-                                start: { line: 1, column: 12 },
-                                end: { line: 1, column: 14 }
-                            }
-                        },
-                        kind: 'init',
-                        range: [6, 14],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 14 }
-                        }
-                    }],
-                    range: [4, 16],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 16 }
-                    }
-                },
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            },
-            range: [0, 16],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 16 }
-            }
-        },
-
-        'x = { "answer": 42 }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Literal',
-                            value: 'answer',
-                            raw: '"answer"',
-                            range: [6, 14],
-                            loc: {
-                                start: { line: 1, column: 6 },
-                                end: { line: 1, column: 14 }
-                            }
-                        },
-                        value: {
-                            type: 'Literal',
-                            value: 42,
-                            raw: '42',
-                            range: [16, 18],
-                            loc: {
-                                start: { line: 1, column: 16 },
-                                end: { line: 1, column: 18 }
-                            }
-                        },
-                        kind: 'init',
-                        range: [6, 18],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 18 }
-                        }
-                    }],
-                    range: [4, 20],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 20 }
-                    }
-                },
-                range: [0, 20],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 20 }
-                }
-            },
-            range: [0, 20],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 20 }
-            }
-        },
-
-        'x = { x: 1, x: 2 }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [
-                        {
-                            type: 'Property',
-                            key: {
-                                type: 'Identifier',
-                                name: 'x',
-                                range: [6, 7],
-                                loc: {
-                                    start: { line: 1, column: 6 },
-                                    end: { line: 1, column: 7 }
-                                }
-                            },
-                            value: {
-                                type: 'Literal',
-                                value: 1,
-                                raw: '1',
-                                range: [9, 10],
-                                loc: {
-                                    start: { line: 1, column: 9 },
-                                    end: { line: 1, column: 10 }
-                                }
-                            },
-                            kind: 'init',
-                            range: [6, 10],
-                            loc: {
-                                start: { line: 1, column: 6 },
-                                end: { line: 1, column: 10 }
-                            }
-                        },
-                        {
-                            type: 'Property',
-                            key: {
-                                type: 'Identifier',
-                                name: 'x',
-                                range: [12, 13],
-                                loc: {
-                                    start: { line: 1, column: 12 },
-                                    end: { line: 1, column: 13 }
-                                }
-                            },
-                            value: {
-                                type: 'Literal',
-                                value: 2,
-                                raw: '2',
-                                range: [15, 16],
-                                loc: {
-                                    start: { line: 1, column: 15 },
-                                    end: { line: 1, column: 16 }
-                                }
-                            },
-                            kind: 'init',
-                            range: [12, 16],
-                            loc: {
-                                start: { line: 1, column: 12 },
-                                end: { line: 1, column: 16 }
-                            }
-                        }
-                    ],
-                    range: [4, 18],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 18 }
-                    }
-                },
-                range: [0, 18],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 18 }
-                }
-            },
-            range: [0, 18],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 18 }
-            }
-        },
-
-        'x = { get width() { return m_width } }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'width',
-                            range: [10, 15],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 15 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [{
-                                    type: 'ReturnStatement',
-                                    argument: {
-                                        type: 'Identifier',
-                                        name: 'm_width',
-                                        range: [27, 34],
-                                        loc: {
-                                            start: { line: 1, column: 27 },
-                                            end: { line: 1, column: 34 }
-                                        }
-                                    },
-                                    range: [20, 35],
-                                    loc: {
-                                        start: { line: 1, column: 20 },
-                                        end: { line: 1, column: 35 }
-                                    }
-                                }],
-                                range: [18, 36],
-                                loc: {
-                                    start: { line: 1, column: 18 },
-                                    end: { line: 1, column: 36 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [18, 36],
-                            loc: {
-                                start: { line: 1, column: 18 },
-                                end: { line: 1, column: 36 }
-                            }
-                        },
-                        kind: 'get',
-                        range: [6, 36],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 36 }
-                        }
-                    }],
-                    range: [4, 38],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 38 }
-                    }
-                },
-                range: [0, 38],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 38 }
-                }
-            },
-            range: [0, 38],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 38 }
-            }
-        },
-
-        'x = { get undef() {} }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'undef',
-                            range: [10, 15],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 15 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [],
-                                range: [18, 20],
-                                loc: {
-                                    start: { line: 1, column: 18 },
-                                    end: { line: 1, column: 20 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [18, 20],
-                            loc: {
-                                start: { line: 1, column: 18 },
-                                end: { line: 1, column: 20 }
-                            }
-                        },
-                        kind: 'get',
-                        range: [6, 20],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 20 }
-                        }
-                    }],
-                    range: [4, 22],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 22 }
-                    }
-                },
-                range: [0, 22],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 22 }
-                }
-            },
-            range: [0, 22],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 22 }
-            }
-        },
-
-        'x = { get if() {} }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'if',
-                            range: [10, 12],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 12 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [],
-                                range: [15, 17],
-                                loc: {
-                                    start: { line: 1, column: 15 },
-                                    end: { line: 1, column: 17 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [15, 17],
-                            loc: {
-                                start: { line: 1, column: 15 },
-                                end: { line: 1, column: 17 }
-                            }
-                        },
-                        kind: 'get',
-                        range: [6, 17],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 17 }
-                        }
-                    }],
-                    range: [4, 19],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 19 }
-                    }
-                },
-                range: [0, 19],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 19 }
-                }
-            },
-            range: [0, 19],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 19 }
-            }
-        },
-
-        'x = { get true() {} }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'true',
-                            range: [10, 14],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 14 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [],
-                                range: [17, 19],
-                                loc: {
-                                    start: { line: 1, column: 17 },
-                                    end: { line: 1, column: 19 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [17, 19],
-                            loc: {
-                                start: { line: 1, column: 17 },
-                                end: { line: 1, column: 19 }
-                            }
-                        },
-                        kind: 'get',
-                        range: [6, 19],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 19 }
-                        }
-                    }],
-                    range: [4, 21],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 21 }
-                    }
-                },
-                range: [0, 21],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 21 }
-                }
-            },
-            range: [0, 21],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 21 }
-            }
-        },
-
-        'x = { get false() {} }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'false',
-                            range: [10, 15],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 15 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [],
-                                range: [18, 20],
-                                loc: {
-                                    start: { line: 1, column: 18 },
-                                    end: { line: 1, column: 20 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [18, 20],
-                            loc: {
-                                start: { line: 1, column: 18 },
-                                end: { line: 1, column: 20 }
-                            }
-                        },
-                        kind: 'get',
-                        range: [6, 20],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 20 }
-                        }
-                    }],
-                    range: [4, 22],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 22 }
-                    }
-                },
-                range: [0, 22],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 22 }
-                }
-            },
-            range: [0, 22],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 22 }
-            }
-        },
-
-        'x = { get null() {} }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'null',
-                            range: [10, 14],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 14 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [],
-                                range: [17, 19],
-                                loc: {
-                                    start: { line: 1, column: 17 },
-                                    end: { line: 1, column: 19 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [17, 19],
-                            loc: {
-                                start: { line: 1, column: 17 },
-                                end: { line: 1, column: 19 }
-                            }
-                        },
-                        kind: 'get',
-                        range: [6, 19],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 19 }
-                        }
-                    }],
-                    range: [4, 21],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 21 }
-                    }
-                },
-                range: [0, 21],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 21 }
-                }
-            },
-            range: [0, 21],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 21 }
-            }
-        },
-
-        'x = { get "undef"() {} }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Literal',
-                            value: 'undef',
-                            raw: '"undef"',
-                            range: [10, 17],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 17 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [],
-                                range: [20, 22],
-                                loc: {
-                                    start: { line: 1, column: 20 },
-                                    end: { line: 1, column: 22 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [20, 22],
-                            loc: {
-                                start: { line: 1, column: 20 },
-                                end: { line: 1, column: 22 }
-                            }
-                        },
-                        kind: 'get',
-                        range: [6, 22],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 22 }
-                        }
-                    }],
-                    range: [4, 24],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 24 }
-                    }
-                },
-                range: [0, 24],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 24 }
-                }
-            },
-            range: [0, 24],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 24 }
-            }
-        },
-
-        'x = { get 10() {} }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Literal',
-                            value: 10,
-                            raw: '10',
-                            range: [10, 12],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 12 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [],
-                                range: [15, 17],
-                                loc: {
-                                    start: { line: 1, column: 15 },
-                                    end: { line: 1, column: 17 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [15, 17],
-                            loc: {
-                                start: { line: 1, column: 15 },
-                                end: { line: 1, column: 17 }
-                            }
-                        },
-                        kind: 'get',
-                        range: [6, 17],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 17 }
-                        }
-                    }],
-                    range: [4, 19],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 19 }
-                    }
-                },
-                range: [0, 19],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 19 }
-                }
-            },
-            range: [0, 19],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 19 }
-            }
-        },
-
-        'x = { set width(w) { m_width = w } }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'width',
-                            range: [10, 15],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 15 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [{
-                                type: 'Identifier',
-                                name: 'w',
-                                range: [16, 17],
-                                loc: {
-                                    start: { line: 1, column: 16 },
-                                    end: { line: 1, column: 17 }
-                                }
-                            }],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [{
-                                    type: 'ExpressionStatement',
-                                    expression: {
-                                        type: 'AssignmentExpression',
-                                        operator: '=',
-                                        left: {
-                                            type: 'Identifier',
-                                            name: 'm_width',
-                                            range: [21, 28],
-                                            loc: {
-                                                start: { line: 1, column: 21 },
-                                                end: { line: 1, column: 28 }
-                                            }
-                                        },
-                                        right: {
-                                            type: 'Identifier',
-                                            name: 'w',
-                                            range: [31, 32],
-                                            loc: {
-                                                start: { line: 1, column: 31 },
-                                                end: { line: 1, column: 32 }
-                                            }
-                                        },
-                                        range: [21, 32],
-                                        loc: {
-                                            start: { line: 1, column: 21 },
-                                            end: { line: 1, column: 32 }
-                                        }
-                                    },
-                                    range: [21, 33],
-                                    loc: {
-                                        start: { line: 1, column: 21 },
-                                        end: { line: 1, column: 33 }
-                                    }
-                                }],
-                                range: [19, 34],
-                                loc: {
-                                    start: { line: 1, column: 19 },
-                                    end: { line: 1, column: 34 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [19, 34],
-                            loc: {
-                                start: { line: 1, column: 19 },
-                                end: { line: 1, column: 34 }
-                            }
-                        },
-                        kind: 'set',
-                        range: [6, 34],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 34 }
-                        }
-                    }],
-                    range: [4, 36],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 36 }
-                    }
-                },
-                range: [0, 36],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 36 }
-                }
-            },
-            range: [0, 36],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 36 }
-            }
-        },
-
-        'x = { set if(w) { m_if = w } }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'if',
-                            range: [10, 12],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 12 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [{
-                                type: 'Identifier',
-                                name: 'w',
-                                range: [13, 14],
-                                loc: {
-                                    start: { line: 1, column: 13 },
-                                    end: { line: 1, column: 14 }
-                                }
-                            }],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [{
-                                    type: 'ExpressionStatement',
-                                    expression: {
-                                        type: 'AssignmentExpression',
-                                        operator: '=',
-                                        left: {
-                                            type: 'Identifier',
-                                            name: 'm_if',
-                                            range: [18, 22],
-                                            loc: {
-                                                start: { line: 1, column: 18 },
-                                                end: { line: 1, column: 22 }
-                                            }
-                                        },
-                                        right: {
-                                            type: 'Identifier',
-                                            name: 'w',
-                                            range: [25, 26],
-                                            loc: {
-                                                start: { line: 1, column: 25 },
-                                                end: { line: 1, column: 26 }
-                                            }
-                                        },
-                                        range: [18, 26],
-                                        loc: {
-                                            start: { line: 1, column: 18 },
-                                            end: { line: 1, column: 26 }
-                                        }
-                                    },
-                                    range: [18, 27],
-                                    loc: {
-                                        start: { line: 1, column: 18 },
-                                        end: { line: 1, column: 27 }
-                                    }
-                                }],
-                                range: [16, 28],
-                                loc: {
-                                    start: { line: 1, column: 16 },
-                                    end: { line: 1, column: 28 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [16, 28],
-                            loc: {
-                                start: { line: 1, column: 16 },
-                                end: { line: 1, column: 28 }
-                            }
-                        },
-                        kind: 'set',
-                        range: [6, 28],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 28 }
-                        }
-                    }],
-                    range: [4, 30],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 30 }
-                    }
-                },
-                range: [0, 30],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 30 }
-                }
-            },
-            range: [0, 30],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 30 }
-            }
-        },
-
-        'x = { set true(w) { m_true = w } }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'true',
-                            range: [10, 14],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 14 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [{
-                                type: 'Identifier',
-                                name: 'w',
-                                range: [15, 16],
-                                loc: {
-                                    start: { line: 1, column: 15 },
-                                    end: { line: 1, column: 16 }
-                                }
-                            }],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [{
-                                    type: 'ExpressionStatement',
-                                    expression: {
-                                        type: 'AssignmentExpression',
-                                        operator: '=',
-                                        left: {
-                                            type: 'Identifier',
-                                            name: 'm_true',
-                                            range: [20, 26],
-                                            loc: {
-                                                start: { line: 1, column: 20 },
-                                                end: { line: 1, column: 26 }
-                                            }
-                                        },
-                                        right: {
-                                            type: 'Identifier',
-                                            name: 'w',
-                                            range: [29, 30],
-                                            loc: {
-                                                start: { line: 1, column: 29 },
-                                                end: { line: 1, column: 30 }
-                                            }
-                                        },
-                                        range: [20, 30],
-                                        loc: {
-                                            start: { line: 1, column: 20 },
-                                            end: { line: 1, column: 30 }
-                                        }
-                                    },
-                                    range: [20, 31],
-                                    loc: {
-                                        start: { line: 1, column: 20 },
-                                        end: { line: 1, column: 31 }
-                                    }
-                                }],
-                                range: [18, 32],
-                                loc: {
-                                    start: { line: 1, column: 18 },
-                                    end: { line: 1, column: 32 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [18, 32],
-                            loc: {
-                                start: { line: 1, column: 18 },
-                                end: { line: 1, column: 32 }
-                            }
-                        },
-                        kind: 'set',
-                        range: [6, 32],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 32 }
-                        }
-                    }],
-                    range: [4, 34],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 34 }
-                    }
-                },
-                range: [0, 34],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 34 }
-                }
-            },
-            range: [0, 34],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 34 }
-            }
-        },
-
-        'x = { set false(w) { m_false = w } }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'false',
-                            range: [10, 15],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 15 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [{
-                                type: 'Identifier',
-                                name: 'w',
-                                range: [16, 17],
-                                loc: {
-                                    start: { line: 1, column: 16 },
-                                    end: { line: 1, column: 17 }
-                                }
-                            }],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [{
-                                    type: 'ExpressionStatement',
-                                    expression: {
-                                        type: 'AssignmentExpression',
-                                        operator: '=',
-                                        left: {
-                                            type: 'Identifier',
-                                            name: 'm_false',
-                                            range: [21, 28],
-                                            loc: {
-                                                start: { line: 1, column: 21 },
-                                                end: { line: 1, column: 28 }
-                                            }
-                                        },
-                                        right: {
-                                            type: 'Identifier',
-                                            name: 'w',
-                                            range: [31, 32],
-                                            loc: {
-                                                start: { line: 1, column: 31 },
-                                                end: { line: 1, column: 32 }
-                                            }
-                                        },
-                                        range: [21, 32],
-                                        loc: {
-                                            start: { line: 1, column: 21 },
-                                            end: { line: 1, column: 32 }
-                                        }
-                                    },
-                                    range: [21, 33],
-                                    loc: {
-                                        start: { line: 1, column: 21 },
-                                        end: { line: 1, column: 33 }
-                                    }
-                                }],
-                                range: [19, 34],
-                                loc: {
-                                    start: { line: 1, column: 19 },
-                                    end: { line: 1, column: 34 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [19, 34],
-                            loc: {
-                                start: { line: 1, column: 19 },
-                                end: { line: 1, column: 34 }
-                            }
-                        },
-                        kind: 'set',
-                        range: [6, 34],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 34 }
-                        }
-                    }],
-                    range: [4, 36],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 36 }
-                    }
-                },
-                range: [0, 36],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 36 }
-                }
-            },
-            range: [0, 36],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 36 }
-            }
-        },
-
-        'x = { set null(w) { m_null = w } }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'null',
-                            range: [10, 14],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 14 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [{
-                                type: 'Identifier',
-                                name: 'w',
-                                range: [15, 16],
-                                loc: {
-                                    start: { line: 1, column: 15 },
-                                    end: { line: 1, column: 16 }
-                                }
-                            }],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [{
-                                    type: 'ExpressionStatement',
-                                    expression: {
-                                        type: 'AssignmentExpression',
-                                        operator: '=',
-                                        left: {
-                                            type: 'Identifier',
-                                            name: 'm_null',
-                                            range: [20, 26],
-                                            loc: {
-                                                start: { line: 1, column: 20 },
-                                                end: { line: 1, column: 26 }
-                                            }
-                                        },
-                                        right: {
-                                            type: 'Identifier',
-                                            name: 'w',
-                                            range: [29, 30],
-                                            loc: {
-                                                start: { line: 1, column: 29 },
-                                                end: { line: 1, column: 30 }
-                                            }
-                                        },
-                                        range: [20, 30],
-                                        loc: {
-                                            start: { line: 1, column: 20 },
-                                            end: { line: 1, column: 30 }
-                                        }
-                                    },
-                                    range: [20, 31],
-                                    loc: {
-                                        start: { line: 1, column: 20 },
-                                        end: { line: 1, column: 31 }
-                                    }
-                                }],
-                                range: [18, 32],
-                                loc: {
-                                    start: { line: 1, column: 18 },
-                                    end: { line: 1, column: 32 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [18, 32],
-                            loc: {
-                                start: { line: 1, column: 18 },
-                                end: { line: 1, column: 32 }
-                            }
-                        },
-                        kind: 'set',
-                        range: [6, 32],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 32 }
-                        }
-                    }],
-                    range: [4, 34],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 34 }
-                    }
-                },
-                range: [0, 34],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 34 }
-                }
-            },
-            range: [0, 34],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 34 }
-            }
-        },
-
-        'x = { set "null"(w) { m_null = w } }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Literal',
-                            value: 'null',
-                            raw: '"null"',
-                            range: [10, 16],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 16 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [{
-                                type: 'Identifier',
-                                name: 'w',
-                                range: [17, 18],
-                                loc: {
-                                    start: { line: 1, column: 17 },
-                                    end: { line: 1, column: 18 }
-                                }
-                            }],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [{
-                                    type: 'ExpressionStatement',
-                                    expression: {
-                                        type: 'AssignmentExpression',
-                                        operator: '=',
-                                        left: {
-                                            type: 'Identifier',
-                                            name: 'm_null',
-                                            range: [22, 28],
-                                            loc: {
-                                                start: { line: 1, column: 22 },
-                                                end: { line: 1, column: 28 }
-                                            }
-                                        },
-                                        right: {
-                                            type: 'Identifier',
-                                            name: 'w',
-                                            range: [31, 32],
-                                            loc: {
-                                                start: { line: 1, column: 31 },
-                                                end: { line: 1, column: 32 }
-                                            }
-                                        },
-                                        range: [22, 32],
-                                        loc: {
-                                            start: { line: 1, column: 22 },
-                                            end: { line: 1, column: 32 }
-                                        }
-                                    },
-                                    range: [22, 33],
-                                    loc: {
-                                        start: { line: 1, column: 22 },
-                                        end: { line: 1, column: 33 }
-                                    }
-                                }],
-                                range: [20, 34],
-                                loc: {
-                                    start: { line: 1, column: 20 },
-                                    end: { line: 1, column: 34 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [20, 34],
-                            loc: {
-                                start: { line: 1, column: 20 },
-                                end: { line: 1, column: 34 }
-                            }
-                        },
-                        kind: 'set',
-                        range: [6, 34],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 34 }
-                        }
-                    }],
-                    range: [4, 36],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 36 }
-                    }
-                },
-                range: [0, 36],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 36 }
-                }
-            },
-            range: [0, 36],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 36 }
-            }
-        },
-
-        'x = { set 10(w) { m_null = w } }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Literal',
-                            value: 10,
-                            raw: '10',
-                            range: [10, 12],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 12 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [{
-                                type: 'Identifier',
-                                name: 'w',
-                                range: [13, 14],
-                                loc: {
-                                    start: { line: 1, column: 13 },
-                                    end: { line: 1, column: 14 }
-                                }
-                            }],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [{
-                                    type: 'ExpressionStatement',
-                                    expression: {
-                                        type: 'AssignmentExpression',
-                                        operator: '=',
-                                        left: {
-                                            type: 'Identifier',
-                                            name: 'm_null',
-                                            range: [18, 24],
-                                            loc: {
-                                                start: { line: 1, column: 18 },
-                                                end: { line: 1, column: 24 }
-                                            }
-                                        },
-                                        right: {
-                                            type: 'Identifier',
-                                            name: 'w',
-                                            range: [27, 28],
-                                            loc: {
-                                                start: { line: 1, column: 27 },
-                                                end: { line: 1, column: 28 }
-                                            }
-                                        },
-                                        range: [18, 28],
-                                        loc: {
-                                            start: { line: 1, column: 18 },
-                                            end: { line: 1, column: 28 }
-                                        }
-                                    },
-                                    range: [18, 29],
-                                    loc: {
-                                        start: { line: 1, column: 18 },
-                                        end: { line: 1, column: 29 }
-                                    }
-                                }],
-                                range: [16, 30],
-                                loc: {
-                                    start: { line: 1, column: 16 },
-                                    end: { line: 1, column: 30 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [16, 30],
-                            loc: {
-                                start: { line: 1, column: 16 },
-                                end: { line: 1, column: 30 }
-                            }
-                        },
-                        kind: 'set',
-                        range: [6, 30],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 30 }
-                        }
-                    }],
-                    range: [4, 32],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 32 }
-                    }
-                },
-                range: [0, 32],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 32 }
-                }
-            },
-            range: [0, 32],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 32 }
-            }
-        },
-
-        'x = { get: 42 }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'get',
-                            range: [6, 9],
-                            loc: {
-                                start: { line: 1, column: 6 },
-                                end: { line: 1, column: 9 }
-                            }
-                        },
-                        value: {
-                            type: 'Literal',
-                            value: 42,
-                            raw: '42',
-                            range: [11, 13],
-                            loc: {
-                                start: { line: 1, column: 11 },
-                                end: { line: 1, column: 13 }
-                            }
-                        },
-                        kind: 'init',
-                        range: [6, 13],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 13 }
-                        }
-                    }],
-                    range: [4, 15],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 15 }
-                    }
-                },
-                range: [0, 15],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 15 }
-                }
-            },
-            range: [0, 15],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 15 }
-            }
-        },
-
-        'x = { set: 43 }': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 'set',
-                            range: [6, 9],
-                            loc: {
-                                start: { line: 1, column: 6 },
-                                end: { line: 1, column: 9 }
-                            }
-                        },
-                        value: {
-                            type: 'Literal',
-                            value: 43,
-                            raw: '43',
-                            range: [11, 13],
-                            loc: {
-                                start: { line: 1, column: 11 },
-                                end: { line: 1, column: 13 }
-                            }
-                        },
-                        kind: 'init',
-                        range: [6, 13],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 13 }
-                        }
-                    }],
-                    range: [4, 15],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 15 }
-                    }
-                },
-                range: [0, 15],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 15 }
-                }
-            },
-            range: [0, 15],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 15 }
-            }
-        }
-
-    },
-
-    'Comments': {
-
-        '/* block comment */ 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 42,
-                raw: '42',
-                range: [20, 22],
-                loc: {
-                    start: { line: 1, column: 20 },
-                    end: { line: 1, column: 22 }
-                }
-            },
-            range: [20, 22],
-            loc: {
-                start: { line: 1, column: 20 },
-                end: { line: 1, column: 22 }
-            }
-        },
-
-        '42 /*The*/ /*Answer*/': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [0, 2],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 2 }
-                    }
-                },
-                range: [0, 21],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 21 }
-                }
-            }],
-            range: [0, 21],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 21 }
-            },
-            comments: [{
-                type: 'Block',
-                value: 'The',
-                range: [3, 10],
-                loc: {
-                    start: { line: 1, column: 3 },
-                    end: { line: 1, column: 10 }
-                }
-            }, {
-                type: 'Block',
-                value: 'Answer',
-                range: [11, 21],
-                loc: {
-                    start: { line: 1, column: 11 },
-                    end: { line: 1, column: 21 }
-                }
-            }]
-        },
-
-        '42 /*the*/ /*answer*/': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [0, 2]
-                },
-                range: [0, 21]
-            }],
-            range: [0, 21],
-            comments: [{
-                type: 'Block',
-                value: 'the',
-                range: [3, 10]
-            }, {
-                type: 'Block',
-                value: 'answer',
-                range: [11, 21]
-            }]
-        },
-
-        '/* multiline\ncomment\nshould\nbe\nignored */ 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 42,
-                raw: '42',
-                range: [42, 44],
-                loc: {
-                    start: { line: 5, column: 11 },
-                    end: { line: 5, column: 13 }
-                }
-            },
-            range: [42, 44],
-            loc: {
-                start: { line: 5, column: 11 },
-                end: { line: 5, column: 13 }
-            }
-        },
-
-        '/*a\r\nb*/ 42': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [9, 11],
-                    loc: {
-                        start: { line: 2, column: 4 },
-                        end: { line: 2, column: 6 }
-                    }
-                },
-                range: [9, 11],
-                loc: {
-                    start: { line: 2, column: 4 },
-                    end: { line: 2, column: 6 }
-                }
-            }],
-            range: [9, 11],
-            loc: {
-                start: { line: 2, column: 4 },
-                end: { line: 2, column: 6 }
-            },
-            comments: [{
-                type: 'Block',
-                value: 'a\r\nb',
-                range: [0, 8],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 2, column: 3 }
-                }
-            }]
-        },
-
-        '/*a\rb*/ 42': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [8, 10],
-                    loc: {
-                        start: { line: 2, column: 4 },
-                        end: { line: 2, column: 6 }
-                    }
-                },
-                range: [8, 10],
-                loc: {
-                    start: { line: 2, column: 4 },
-                    end: { line: 2, column: 6 }
-                }
-            }],
-            range: [8, 10],
-            loc: {
-                start: { line: 2, column: 4 },
-                end: { line: 2, column: 6 }
-            },
-            comments: [{
-                type: 'Block',
-                value: 'a\rb',
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 2, column: 3 }
-                }
-            }]
-        },
-
-        '/*a\nb*/ 42': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [8, 10],
-                    loc: {
-                        start: { line: 2, column: 4 },
-                        end: { line: 2, column: 6 }
-                    }
-                },
-                range: [8, 10],
-                loc: {
-                    start: { line: 2, column: 4 },
-                    end: { line: 2, column: 6 }
-                }
-            }],
-            range: [8, 10],
-            loc: {
-                start: { line: 2, column: 4 },
-                end: { line: 2, column: 6 }
-            },
-            comments: [{
-                type: 'Block',
-                value: 'a\nb',
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 2, column: 3 }
-                }
-            }]
-        },
-
-        '/*a\nc*/ 42': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    loc: {
-                        start: { line: 2, column: 4 },
-                        end: { line: 2, column: 6 }
-                    }
-                },
-                loc: {
-                    start: { line: 2, column: 4 },
-                    end: { line: 2, column: 6 }
-                }
-            }],
-            loc: {
-                start: { line: 2, column: 4 },
-                end: { line: 2, column: 6 }
-            },
-            comments: [{
-                type: 'Block',
-                value: 'a\nc',
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 2, column: 3 }
-                }
-            }]
-        },
-
-        '// line comment\n42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 42,
-                raw: '42',
-                range: [16, 18],
-                loc: {
-                    start: { line: 2, column: 0 },
-                    end: { line: 2, column: 2 }
-                }
-            },
-            range: [16, 18],
-            loc: {
-                start: { line: 2, column: 0 },
-                end: { line: 2, column: 2 }
-            }
-        },
-
-        '42 // line comment': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [0, 2],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 2 }
-                    }
-                },
-                range: [0, 18],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 18 }
-                }
-            }],
-            range: [0, 18],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 18 }
-            },
-            comments: [{
-                type: 'Line',
-                value: ' line comment',
-                range: [3, 18],
-                loc: {
-                    start: { line: 1, column: 3 },
-                    end: { line: 1, column: 18 }
-                }
-            }]
-        },
-
-        '// Hello, world!\n42': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [17, 19],
-                    loc: {
-                        start: { line: 2, column: 0 },
-                        end: { line: 2, column: 2 }
-                    }
-                },
-                range: [17, 19],
-                loc: {
-                    start: { line: 2, column: 0 },
-                    end: { line: 2, column: 2 }
-                }
-            }],
-            range: [17, 19],
-            loc: {
-                start: { line: 2, column: 0 },
-                end: { line: 2, column: 2 }
-            },
-            comments: [{
-                type: 'Line',
-                value: ' Hello, world!',
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            }]
-        },
-
-        '// Hello, world!\n': {
-            type: 'Program',
-            body: [],
-            range: [17, 17],
-            loc: {
-                start: { line: 2, column: 0 },
-                end: { line: 2, column: 0 }
-            },
-            comments: [{
-                type: 'Line',
-                value: ' Hello, world!',
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            }]
-        },
-
-        '// Hallo, world!\n': {
-            type: 'Program',
-            body: [],
-            loc: {
-                start: { line: 2, column: 0 },
-                end: { line: 2, column: 0 }
-            },
-            comments: [{
-                type: 'Line',
-                value: ' Hallo, world!',
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            }]
-        },
-
-        '//\n42': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [3, 5],
-                    loc: {
-                        start: { line: 2, column: 0 },
-                        end: { line: 2, column: 2 }
-                    }
-                },
-                range: [3, 5],
-                loc: {
-                    start: { line: 2, column: 0 },
-                    end: { line: 2, column: 2 }
-                }
-            }],
-            range: [3, 5],
-            loc: {
-                start: { line: 2, column: 0 },
-                end: { line: 2, column: 2 }
-            },
-            comments: [{
-                type: 'Line',
-                value: '',
-                range: [0, 2],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 2 }
-                }
-            }]
-        },
-
-        '//': {
-            type: 'Program',
-            body: [],
-            range: [2, 2],
-            loc: {
-                start: { line: 1, column: 2 },
-                end: { line: 1, column: 2 }
-            },
-            comments: [{
-                type: 'Line',
-                value: '',
-                range: [0, 2],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 2 }
-                }
-            }]
-        },
-
-        '// ': {
-            type: 'Program',
-            body: [],
-            range: [3, 3],
-            comments: [{
-                type: 'Line',
-                value: ' ',
-                range: [0, 3]
-            }]
-        },
-
-        '/**/42': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [4, 6],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                range: [4, 6],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 6 }
-                }
-            }],
-            range: [4, 6],
-            loc: {
-                start: { line: 1, column: 4 },
-                end: { line: 1, column: 6 }
-            },
-            comments: [{
-                type: 'Block',
-                value: '',
-                range: [0, 4],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 4 }
-                }
-            }]
-        },
-
-        '// Hello, world!\n\n//   Another hello\n42': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [37, 39],
-                    loc: {
-                        start: { line: 4, column: 0 },
-                        end: { line: 4, column: 2 }
-                    }
-                },
-                range: [37, 39],
-                loc: {
-                    start: { line: 4, column: 0 },
-                    end: { line: 4, column: 2 }
-                }
-            }],
-            range: [37, 39],
-            loc: {
-                start: { line: 4, column: 0 },
-                end: { line: 4, column: 2 }
-            },
-            comments: [{
-                type: 'Line',
-                value: ' Hello, world!',
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            }, {
-                type: 'Line',
-                value: '   Another hello',
-                range: [18, 36],
-                loc: {
-                    start: { line: 3, column: 0 },
-                    end: { line: 3, column: 18 }
-                }
-            }]
-        },
-
-        'if (x) { // Some comment\ndoThat(); }': {
-            type: 'Program',
-            body: [{
-                type: 'IfStatement',
-                test: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                consequent: {
-                    type: 'BlockStatement',
-                    body: [{
-                        type: 'ExpressionStatement',
-                        expression: {
-                            type: 'CallExpression',
-                            callee: {
-                                type: 'Identifier',
-                                name: 'doThat',
-                                range: [25, 31],
-                                loc: {
-                                    start: { line: 2, column: 0 },
-                                    end: { line: 2, column: 6 }
-                                }
-                            },
-                            'arguments': [],
-                            range: [25, 33],
-                            loc: {
-                                start: { line: 2, column: 0 },
-                                end: { line: 2, column: 8 }
-                            }
-                        },
-                        range: [25, 34],
-                        loc: {
-                            start: { line: 2, column: 0 },
-                            end: { line: 2, column: 9 }
-                        }
-                    }],
-                    range: [7, 36],
-                    loc: {
-                        start: { line: 1, column: 7 },
-                        end: { line: 2, column: 11 }
-                    }
-                },
-                alternate: null,
-                range: [0, 36],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 2, column: 11 }
-                }
-            }],
-            range: [0, 36],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 11 }
-            },
-            comments: [{
-                type: 'Line',
-                value: ' Some comment',
-                range: [9, 24],
-                loc: {
-                    start: { line: 1, column: 9 },
-                    end: { line: 1, column: 24 }
-                }
-            }]
-        },
-
-        'switch (answer) { case 42: /* perfect */ bingo() }': {
-            type: 'Program',
-            body: [{
-                type: 'SwitchStatement',
-                discriminant: {
-                    type: 'Identifier',
-                    name: 'answer',
-                    range: [8, 14],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 14 }
-                    }
-                },
-                cases: [{
-                    type: 'SwitchCase',
-                    test: {
-                        type: 'Literal',
-                        value: 42,
-                        raw: '42',
-                        range: [23, 25],
-                        loc: {
-                            start: { line: 1, column: 23 },
-                            end: { line: 1, column: 25 }
-                        }
-                    },
-                    consequent: [{
-                        type: 'ExpressionStatement',
-                        expression: {
-                            type: 'CallExpression',
-                            callee: {
-                                type: 'Identifier',
-                                name: 'bingo',
-                                range: [41, 46],
-                                loc: {
-                                    start: { line: 1, column: 41 },
-                                    end: { line: 1, column: 46 }
-                                }
-                            },
-                            'arguments': [],
-                            range: [41, 48],
-                            loc: {
-                                start: { line: 1, column: 41 },
-                                end: { line: 1, column: 48 }
-                            }
-                        },
-                        range: [41, 49],
-                        loc: {
-                            start: { line: 1, column: 41 },
-                            end: { line: 1, column: 49 }
-                        }
-                    }],
-                    range: [18, 49],
-                    loc: {
-                        start: { line: 1, column: 18 },
-                        end: { line: 1, column: 49 }
-                    }
-                }],
-                range: [0, 50],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 50 }
-                }
-            }],
-            range: [0, 50],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 50 }
-            },
-            comments: [{
-                type: 'Block',
-                value: ' perfect ',
-                range: [27, 40],
-                loc: {
-                    start: { line: 1, column: 27 },
-                    end: { line: 1, column: 40 }
-                }
-            }]
-        }
-
-    },
-
-    'Numeric Literals': {
-
-        '0': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 0,
-                raw: '0',
-                range: [0, 1],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 1 }
-                }
-            },
-            range: [0, 1],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 1 }
-            }
-        },
-
-        '42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 42,
-                raw: '42',
-                range: [0, 2],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 2 }
-                }
-            },
-            range: [0, 2],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 2 }
-            }
-        },
-
-        '3': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 3,
-                    raw: '3',
-                    range: [0, 1]
-                },
-                range: [0, 1]
-            }],
-            range: [0, 1],
-            tokens: [{
-                type: 'Numeric',
-                value: '3',
-                range: [0, 1]
-            }]
-        },
-
-        '5': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 5,
-                    raw: '5',
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 1 }
-                }
-            }],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 1 }
-            },
-            tokens: [{
-                type: 'Numeric',
-                value: '5',
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 1 }
-                }
-            }]
-        },
-
-        '.14': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 0.14,
-                raw: '.14',
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            },
-            range: [0, 3],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 3 }
-            }
-        },
-
-        '3.14159': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 3.14159,
-                raw: '3.14159',
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        '6.02214179e+23': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 6.02214179e+23,
-                raw: '6.02214179e+23',
-                range: [0, 14],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 14 }
-                }
-            },
-            range: [0, 14],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 14 }
-            }
-        },
-
-        '1.492417830e-10': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 1.49241783e-10,
-                raw: '1.492417830e-10',
-                range: [0, 15],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 15 }
-                }
-            },
-            range: [0, 15],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 15 }
-            }
-        },
-
-        '0x0': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 0,
-                raw: '0x0',
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            },
-            range: [0, 3],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 3 }
-            }
-        },
-
-        '0e+100': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 0,
-                raw: '0e+100',
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        '0xabc': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 0xabc,
-                raw: '0xabc',
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        },
-
-        '0xdef': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 0xdef,
-                raw: '0xdef',
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        },
-
-        '0X1A': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 0x1A,
-                raw: '0X1A',
-                range: [0, 4],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 4 }
-                }
-            },
-            range: [0, 4],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 4 }
-            }
-        },
-
-        '0x10': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 0x10,
-                raw: '0x10',
-                range: [0, 4],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 4 }
-                }
-            },
-            range: [0, 4],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 4 }
-            }
-        },
-
-        '0x100': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 0x100,
-                raw: '0x100',
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        },
-
-        '0X04': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 0X04,
-                raw: '0X04',
-                range: [0, 4],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 4 }
-                }
-            },
-            range: [0, 4],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 4 }
-            }
-        },
-
-        '02': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 2,
-                raw: '02',
-                range: [0, 2],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 2 }
-                }
-            },
-            range: [0, 2],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 2 }
-            }
-        },
-
-        '012': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 10,
-                raw: '012',
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            },
-            range: [0, 3],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 3 }
-            }
-        },
-
-        '0012': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 10,
-                raw: '0012',
-                range: [0, 4],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 4 }
-                }
-            },
-            range: [0, 4],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 4 }
-            }
-        }
-
-    },
-
-    'String Literals': {
-
-        '"Hello"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'Hello',
-                raw: '"Hello"',
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        '"\\n\\r\\t\\v\\b\\f\\\\\\\'\\"\\0"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: '\n\r\t\x0B\b\f\\\'"\x00',
-                raw: '"\\n\\r\\t\\v\\b\\f\\\\\\\'\\"\\0"',
-                range: [0, 22],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 22 }
-                }
-            },
-            range: [0, 22],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 22 }
-            }
-        },
-
-        '"\\u0061"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'a',
-                raw: '"\\u0061"',
-                range: [0, 8],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 8 }
-                }
-            },
-            range: [0, 8],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 8 }
-            }
-        },
-
-        '"\\x61"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'a',
-                raw: '"\\x61"',
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        '"\\u00"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'u00',
-                raw: '"\\u00"',
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        '"\\xt"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'xt',
-                raw: '"\\xt"',
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        },
-
-        '"Hello\\nworld"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'Hello\nworld',
-                raw: '"Hello\\nworld"',
-                range: [0, 14],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 14 }
-                }
-            },
-            range: [0, 14],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 14 }
-            }
-        },
-
-        '"Hello\\\nworld"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'Helloworld',
-                raw: '"Hello\\\nworld"',
-                range: [0, 14],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 2, column: 14 }
-                }
-            },
-            range: [0, 14],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 14 }
-            }
-        },
-
-        '"Hello\\02World"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'Hello\u0002World',
-                raw: '"Hello\\02World"',
-                range: [0, 15],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 15 }
-                }
-            },
-            range: [0, 15],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 15 }
-            }
-        },
-
-        '"Hello\\012World"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'Hello\u000AWorld',
-                raw: '"Hello\\012World"',
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            },
-            range: [0, 16],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 16 }
-            }
-        },
-
-        '"Hello\\122World"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'Hello\122World',
-                raw: '"Hello\\122World"',
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            },
-            range: [0, 16],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 16 }
-            }
-        },
-
-        '"Hello\\0122World"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'Hello\u000A2World',
-                raw: '"Hello\\0122World"',
-                range: [0, 17],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 17 }
-                }
-            },
-            range: [0, 17],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 17 }
-            }
-        },
-
-        '"Hello\\312World"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'Hello\u00CAWorld',
-                raw: '"Hello\\312World"',
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            },
-            range: [0, 16],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 16 }
-            }
-        },
-
-        '"Hello\\412World"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'Hello\412World',
-                raw: '"Hello\\412World"',
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            },
-            range: [0, 16],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 16 }
-            }
-        },
-
-        '"Hello\\812World"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'Hello812World',
-                raw: '"Hello\\812World"',
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            },
-            range: [0, 16],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 16 }
-            }
-        },
-
-        '"Hello\\712World"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'Hello\712World',
-                raw: '"Hello\\712World"',
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            },
-            range: [0, 16],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 16 }
-            }
-        },
-
-        '"Hello\\0World"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'Hello\u0000World',
-                raw: '"Hello\\0World"',
-                range: [0, 14],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 14 }
-                }
-            },
-            range: [0, 14],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 14 }
-            }
-        },
-
-        '"Hello\\\r\nworld"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'Helloworld',
-                raw: '"Hello\\\r\nworld"',
-                range: [0, 15],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 2, column: 15 }
-                }
-            },
-            range: [0, 15],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 15 }
-            }
-        },
-
-        '"Hello\\1World"': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Literal',
-                value: 'Hello\u0001World',
-                raw: '"Hello\\1World"',
-                range: [0, 14],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 14 }
-                }
-            },
-            range: [0, 14],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 14 }
-            }
-        }
-    },
-
-    'Regular Expression Literals': {
-
-        'var x = /[a-z]/i': {
-            type: 'Program',
-            body: [{
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: '/[a-z]/i',
-                        raw: '/[a-z]/i',
-                        range: [8, 16],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 16 }
-                        }
-                    },
-                    range: [4, 16],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 16 }
-                    }
-                }],
-                kind: 'var',
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            }],
-            range: [0, 16],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 16 }
-            },
-            tokens: [{
-                type: 'Keyword',
-                value: 'var',
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            }, {
-                type: 'Identifier',
-                value: 'x',
-                range: [4, 5],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 5 }
-                }
-            }, {
-                type: 'Punctuator',
-                value: '=',
-                range: [6, 7],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 7 }
-                }
-            }, {
-                type: 'RegularExpression',
-                value: '/[a-z]/i',
-                range: [8, 16],
-                loc: {
-                    start: { line: 1, column: 8 },
-                    end: { line: 1, column: 16 }
-                }
-            }]
-        },
-
-        'var x = /[x-z]/i': {
-            type: 'Program',
-            body: [{
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [4, 5]
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: '/[x-z]/i',
-                        raw: '/[x-z]/i',
-                        range: [8, 16]
-                    },
-                    range: [4, 16]
-                }],
-                kind: 'var',
-                range: [0, 16]
-            }],
-            range: [0, 16],
-            tokens: [{
-                type: 'Keyword',
-                value: 'var',
-                range: [0, 3]
-            }, {
-                type: 'Identifier',
-                value: 'x',
-                range: [4, 5]
-            }, {
-                type: 'Punctuator',
-                value: '=',
-                range: [6, 7]
-            }, {
-                type: 'RegularExpression',
-                value: '/[x-z]/i',
-                range: [8, 16]
-            }]
-        },
-
-        'var x = /[a-c]/i': {
-            type: 'Program',
-            body: [{
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: '/[a-c]/i',
-                        raw: '/[a-c]/i',
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 16 }
-                        }
-                    },
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 16 }
-                    }
-                }],
-                kind: 'var',
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            }],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 16 }
-            },
-            tokens: [{
-                type: 'Keyword',
-                value: 'var',
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            }, {
-                type: 'Identifier',
-                value: 'x',
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 5 }
-                }
-            }, {
-                type: 'Punctuator',
-                value: '=',
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 7 }
-                }
-            }, {
-                type: 'RegularExpression',
-                value: '/[a-c]/i',
-                loc: {
-                    start: { line: 1, column: 8 },
-                    end: { line: 1, column: 16 }
-                }
-            }]
-        },
-
-        'var x = /[P QR]/i': {
-            type: 'Program',
-            body: [{
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: '/[P QR]/i',
-                        raw: '/[P QR]/i',
-                        range: [8, 17],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 17 }
-                        }
-                    },
-                    range: [4, 17],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 17 }
-                    }
-                }],
-                kind: 'var',
-                range: [0, 17],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 17 }
-                }
-            }],
-            range: [0, 17],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 17 }
-            },
-            tokens: [{
-                type: 'Keyword',
-                value: 'var',
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            }, {
-                type: 'Identifier',
-                value: 'x',
-                range: [4, 5],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 5 }
-                }
-            }, {
-                type: 'Punctuator',
-                value: '=',
-                range: [6, 7],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 7 }
-                }
-            }, {
-                type: 'RegularExpression',
-                value: '/[P QR]/i',
-                range: [8, 17],
-                loc: {
-                    start: { line: 1, column: 8 },
-                    end: { line: 1, column: 17 }
-                }
-            }]
-        },
-
-        'var x = /[\\]/]/': {
-            type: 'Program',
-            body: [{
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: new RegExp('[\\]/]').toString(),
-                        raw: '/[\\]/]/',
-                        range: [8, 15],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 15 }
-                        }
-                    },
-                    range: [4, 15],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 15 }
-                    }
-                }],
-                kind: 'var',
-                range: [0, 15],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 15 }
-                }
-            }],
-            range: [0, 15],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 15 }
-            },
-            tokens: [{
-                type: 'Keyword',
-                value: 'var',
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            }, {
-                type: 'Identifier',
-                value: 'x',
-                range: [4, 5],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 5 }
-                }
-            }, {
-                type: 'Punctuator',
-                value: '=',
-                range: [6, 7],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 7 }
-                }
-            }, {
-                type: 'RegularExpression',
-                value: '/[\\]/]/',
-                range: [8, 15],
-                loc: {
-                    start: { line: 1, column: 8 },
-                    end: { line: 1, column: 15 }
-                }
-            }]
-        },
-
-        'var x = /foo\\/bar/': {
-            type: 'Program',
-            body: [{
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: '/foo\\/bar/',
-                        raw: '/foo\\/bar/',
-                        range: [8, 18],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 18 }
-                        }
-                    },
-                    range: [4, 18],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 18 }
-                    }
-                }],
-                kind: 'var',
-                range: [0, 18],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 18 }
-                }
-            }],
-            range: [0, 18],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 18 }
-            },
-            tokens: [{
-                type: 'Keyword',
-                value: 'var',
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            }, {
-                type: 'Identifier',
-                value: 'x',
-                range: [4, 5],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 5 }
-                }
-            }, {
-                type: 'Punctuator',
-                value: '=',
-                range: [6, 7],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 7 }
-                }
-            }, {
-                type: 'RegularExpression',
-                value: '/foo\\/bar/',
-                range: [8, 18],
-                loc: {
-                    start: { line: 1, column: 8 },
-                    end: { line: 1, column: 18 }
-                }
-            }]
-        },
-
-        'var x = /=([^=\\s])+/g': {
-            type: 'Program',
-            body: [{
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: '/=([^=\\s])+/g',
-                        raw: '/=([^=\\s])+/g',
-                        range: [8, 21],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 21 }
-                        }
-                    },
-                    range: [4, 21],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 21 }
-                    }
-                }],
-                kind: 'var',
-                range: [0, 21],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 21 }
-                }
-            }],
-            range: [0, 21],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 21 }
-            },
-            tokens: [{
-                type: 'Keyword',
-                value: 'var',
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            }, {
-                type: 'Identifier',
-                value: 'x',
-                range: [4, 5],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 5 }
-                }
-            }, {
-                type: 'Punctuator',
-                value: '=',
-                range: [6, 7],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 7 }
-                }
-            }, {
-                type: 'RegularExpression',
-                value: '/=([^=\\s])+/g',
-                range: [8, 21],
-                loc: {
-                    start: { line: 1, column: 8 },
-                    end: { line: 1, column: 21 }
-                }
-            }]
-        },
-
-        'var x = /[P QR]/\\u0067': {
-            type: 'Program',
-            body: [{
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: '/[P QR]/g',
-                        raw: '/[P QR]/\\u0067',
-                        range: [8, 22],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 22 }
-                        }
-                    },
-                    range: [4, 22],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 22 }
-                    }
-                }],
-                kind: 'var',
-                range: [0, 22],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 22 }
-                }
-            }],
-            range: [0, 22],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 22 }
-            },
-            tokens: [{
-                type: 'Keyword',
-                value: 'var',
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            }, {
-                type: 'Identifier',
-                value: 'x',
-                range: [4, 5],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 5 }
-                }
-            }, {
-                type: 'Punctuator',
-                value: '=',
-                range: [6, 7],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 7 }
-                }
-            }, {
-                type: 'RegularExpression',
-                value: '/[P QR]/\\u0067',
-                range: [8, 22],
-                loc: {
-                    start: { line: 1, column: 8 },
-                    end: { line: 1, column: 22 }
-                }
-            }]
-        },
-
-        'var x = /[P QR]/\\g': {
-            type: 'Program',
-            body: [{
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: '/[P QR]/g',
-                        raw: '/[P QR]/\\g',
-                        range: [8, 18],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 18 }
-                        }
-                    },
-                    range: [4, 18],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 18 }
-                    }
-                }],
-                kind: 'var',
-                range: [0, 18],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 18 }
-                }
-            }],
-            range: [0, 18],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 18 }
-            },
-            tokens: [{
-                type: 'Keyword',
-                value: 'var',
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            }, {
-                type: 'Identifier',
-                value: 'x',
-                range: [4, 5],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 5 }
-                }
-            }, {
-                type: 'Punctuator',
-                value: '=',
-                range: [6, 7],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 7 }
-                }
-            }, {
-                type: 'RegularExpression',
-                value: '/[P QR]/\\g',
-                range: [8, 18],
-                loc: {
-                    start: { line: 1, column: 8 },
-                    end: { line: 1, column: 18 }
-                }
-            }]
-        }
-
-    },
-
-    'Left-Hand-Side Expression': {
-
-        'new Button': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'NewExpression',
-                callee: {
-                    type: 'Identifier',
-                    name: 'Button',
-                    range: [4, 10],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 10 }
-                    }
-                },
-                'arguments': [],
-                range: [0, 10],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 10 }
-                }
-            },
-            range: [0, 10],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 10 }
-            }
-        },
-
-        'new Button()': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'NewExpression',
-                callee: {
-                    type: 'Identifier',
-                    name: 'Button',
-                    range: [4, 10],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 10 }
-                    }
-                },
-                'arguments': [],
-                range: [0, 12],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 12 }
-                }
-            },
-            range: [0, 12],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 12 }
-            }
-        },
-
-        'new new foo': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'NewExpression',
-                callee: {
-                    type: 'NewExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'foo',
-                        range: [8, 11],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 11 }
-                        }
-                    },
-                    'arguments': [],
-                    range: [4, 11],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 11 }
-                    }
-                },
-                'arguments': [],
-                range: [0, 11],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            range: [0, 11],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 11 }
-            }
-        },
-
-        'new new foo()': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'NewExpression',
-                callee: {
-                    type: 'NewExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'foo',
-                        range: [8, 11],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 11 }
-                        }
-                    },
-                    'arguments': [],
-                    range: [4, 13],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 13 }
-                    }
-                },
-                'arguments': [],
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            range: [0, 13],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 13 }
-            }
-        },
-
-        'new foo().bar()': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'CallExpression',
-                callee: {
-                    type: 'MemberExpression',
-                    computed: false,
-                    object: {
-                        type: 'NewExpression',
-                        callee: {
-                            type: 'Identifier',
-                            name: 'foo',
-                            range: [4, 7],
-                            loc: {
-                                start: { line: 1, column: 4 },
-                                end: { line: 1, column: 7 }
-                            }
-                        },
-                        'arguments': [],
-                        range: [0, 9],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 9 }
-                        }
-                    },
-                    property: {
-                        type: 'Identifier',
-                        name: 'bar',
-                        range: [10, 13],
-                        loc: {
-                            start: { line: 1, column: 10 },
-                            end: { line: 1, column: 13 }
-                        }
-                    },
-                    range: [0, 13],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 13 }
-                    }
-                },
-                'arguments': [],
-                range: [0, 15],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 15 }
-                }
-            },
-            range: [0, 15],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 15 }
-            }
-        },
-
-        'new foo[bar]': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'NewExpression',
-                callee: {
-                    type: 'MemberExpression',
-                    computed: true,
-                    object: {
-                        type: 'Identifier',
-                        name: 'foo',
-                        range: [4, 7],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 7 }
-                        }
-                    },
-                    property: {
-                        type: 'Identifier',
-                        name: 'bar',
-                        range: [8, 11],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 11 }
-                        }
-                    },
-                    range: [4, 12],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                'arguments': [],
-                range: [0, 12],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 12 }
-                }
-            },
-            range: [0, 12],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 12 }
-            }
-        },
-
-        'new foo.bar()': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'NewExpression',
-                callee: {
-                    type: 'MemberExpression',
-                    computed: false,
-                    object: {
-                        type: 'Identifier',
-                        name: 'foo',
-                        range: [4, 7],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 7 }
-                        }
-                    },
-                    property: {
-                        type: 'Identifier',
-                        name: 'bar',
-                        range: [8, 11],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 11 }
-                        }
-                    },
-                    range: [4, 11],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 11 }
-                    }
-                },
-                'arguments': [],
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            range: [0, 13],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 13 }
-            }
-        },
-
-        '( new foo).bar()': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'CallExpression',
-                callee: {
-                    type: 'MemberExpression',
-                    computed: false,
-                    object: {
-                        type: 'NewExpression',
-                        callee: {
-                            type: 'Identifier',
-                            name: 'foo',
-                            range: [6, 9],
-                            loc: {
-                                start: { line: 1, column: 6 },
-                                end: { line: 1, column: 9 }
-                            }
-                        },
-                        'arguments': [],
-                        range: [2, 9],
-                        loc: {
-                            start: { line: 1, column: 2 },
-                            end: { line: 1, column: 9 }
-                        }
-                    },
-                    property: {
-                        type: 'Identifier',
-                        name: 'bar',
-                        range: [11, 14],
-                        loc: {
-                            start: { line: 1, column: 11 },
-                            end: { line: 1, column: 14 }
-                        }
-                    },
-                    range: [0, 14],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 14 }
-                    }
-                },
-                'arguments': [],
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            },
-            range: [0, 16],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 16 }
-            }
-        },
-
-        'foo(bar, baz)': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'CallExpression',
-                callee: {
-                    type: 'Identifier',
-                    name: 'foo',
-                    range: [0, 3],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 3 }
-                    }
-                },
-                'arguments': [{
-                    type: 'Identifier',
-                    name: 'bar',
-                    range: [4, 7],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 7 }
-                    }
-                }, {
-                    type: 'Identifier',
-                    name: 'baz',
-                    range: [9, 12],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 12 }
-                    }
-                }],
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            range: [0, 13],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 13 }
-            }
-        },
-
-        '(    foo  )()': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'CallExpression',
-                callee: {
-                    type: 'Identifier',
-                    name: 'foo',
-                    range: [5, 8],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                'arguments': [],
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            range: [0, 13],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 13 }
-            }
-        },
-
-        'universe.milkyway': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'MemberExpression',
-                computed: false,
-                object: {
-                    type: 'Identifier',
-                    name: 'universe',
-                    range: [0, 8],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                property: {
-                    type: 'Identifier',
-                    name: 'milkyway',
-                    range: [9, 17],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 17 }
-                    }
-                },
-                range: [0, 17],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 17 }
-                }
-            },
-            range: [0, 17],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 17 }
-            }
-        },
-
-        'universe.milkyway.solarsystem': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'MemberExpression',
-                computed: false,
-                object: {
-                    type: 'MemberExpression',
-                    computed: false,
-                    object: {
-                        type: 'Identifier',
-                        name: 'universe',
-                        range: [0, 8],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 8 }
-                        }
-                    },
-                    property: {
-                        type: 'Identifier',
-                        name: 'milkyway',
-                        range: [9, 17],
-                        loc: {
-                            start: { line: 1, column: 9 },
-                            end: { line: 1, column: 17 }
-                        }
-                    },
-                    range: [0, 17],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 17 }
-                    }
-                },
-                property: {
-                    type: 'Identifier',
-                    name: 'solarsystem',
-                    range: [18, 29],
-                    loc: {
-                        start: { line: 1, column: 18 },
-                        end: { line: 1, column: 29 }
-                    }
-                },
-                range: [0, 29],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 29 }
-                }
-            },
-            range: [0, 29],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 29 }
-            }
-        },
-
-        'universe.milkyway.solarsystem.Earth': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'MemberExpression',
-                computed: false,
-                object: {
-                    type: 'MemberExpression',
-                    computed: false,
-                    object: {
-                        type: 'MemberExpression',
-                        computed: false,
-                        object: {
-                            type: 'Identifier',
-                            name: 'universe',
-                            range: [0, 8],
-                            loc: {
-                                start: { line: 1, column: 0 },
-                                end: { line: 1, column: 8 }
-                            }
-                        },
-                        property: {
-                            type: 'Identifier',
-                            name: 'milkyway',
-                            range: [9, 17],
-                            loc: {
-                                start: { line: 1, column: 9 },
-                                end: { line: 1, column: 17 }
-                            }
-                        },
-                        range: [0, 17],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 17 }
-                        }
-                    },
-                    property: {
-                        type: 'Identifier',
-                        name: 'solarsystem',
-                        range: [18, 29],
-                        loc: {
-                            start: { line: 1, column: 18 },
-                            end: { line: 1, column: 29 }
-                        }
-                    },
-                    range: [0, 29],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 29 }
-                    }
-                },
-                property: {
-                    type: 'Identifier',
-                    name: 'Earth',
-                    range: [30, 35],
-                    loc: {
-                        start: { line: 1, column: 30 },
-                        end: { line: 1, column: 35 }
-                    }
-                },
-                range: [0, 35],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 35 }
-                }
-            },
-            range: [0, 35],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 35 }
-            }
-        },
-
-        'universe[galaxyName, otherUselessName]': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'MemberExpression',
-                computed: true,
-                object: {
-                    type: 'Identifier',
-                    name: 'universe',
-                    range: [0, 8],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                property: {
-                    type: 'SequenceExpression',
-                    expressions: [{
-                        type: 'Identifier',
-                        name: 'galaxyName',
-                        range: [9, 19],
-                        loc: {
-                            start: { line: 1, column: 9 },
-                            end: { line: 1, column: 19 }
-                        }
-                    }, {
-                        type: 'Identifier',
-                        name: 'otherUselessName',
-                        range: [21, 37],
-                        loc: {
-                            start: { line: 1, column: 21 },
-                            end: { line: 1, column: 37 }
-                        }
-                    }],
-                    range: [9, 37],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 37 }
-                    }
-                },
-                range: [0, 38],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 38 }
-                }
-            },
-            range: [0, 38],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 38 }
-            }
-        },
-
-        'universe[galaxyName]': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'MemberExpression',
-                computed: true,
-                object: {
-                    type: 'Identifier',
-                    name: 'universe',
-                    range: [0, 8],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                property: {
-                    type: 'Identifier',
-                    name: 'galaxyName',
-                    range: [9, 19],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 19 }
-                    }
-                },
-                range: [0, 20],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 20 }
-                }
-            },
-            range: [0, 20],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 20 }
-            }
-        },
-
-        'universe[42].galaxies': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'MemberExpression',
-                computed: false,
-                object: {
-                    type: 'MemberExpression',
-                    computed: true,
-                    object: {
-                        type: 'Identifier',
-                        name: 'universe',
-                        range: [0, 8],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 8 }
-                        }
-                    },
-                    property: {
-                        type: 'Literal',
-                        value: 42,
-                        raw: '42',
-                        range: [9, 11],
-                        loc: {
-                            start: { line: 1, column: 9 },
-                            end: { line: 1, column: 11 }
-                        }
-                    },
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                property: {
-                    type: 'Identifier',
-                    name: 'galaxies',
-                    range: [13, 21],
-                    loc: {
-                        start: { line: 1, column: 13 },
-                        end: { line: 1, column: 21 }
-                    }
-                },
-                range: [0, 21],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 21 }
-                }
-            },
-            range: [0, 21],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 21 }
-            }
-        },
-
-        'universe(42).galaxies': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'MemberExpression',
-                computed: false,
-                object: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'universe',
-                        range: [0, 8],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 8 }
-                        }
-                    },
-                    'arguments': [{
-                        type: 'Literal',
-                        value: 42,
-                        raw: '42',
-                        range: [9, 11],
-                        loc: {
-                            start: { line: 1, column: 9 },
-                            end: { line: 1, column: 11 }
-                        }
-                    }],
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                property: {
-                    type: 'Identifier',
-                    name: 'galaxies',
-                    range: [13, 21],
-                    loc: {
-                        start: { line: 1, column: 13 },
-                        end: { line: 1, column: 21 }
-                    }
-                },
-                range: [0, 21],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 21 }
-                }
-            },
-            range: [0, 21],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 21 }
-            }
-        },
-
-        'universe(42).galaxies(14, 3, 77).milkyway': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'MemberExpression',
-                computed: false,
-                object: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'MemberExpression',
-                        computed: false,
-                        object: {
-                            type: 'CallExpression',
-                            callee: {
-                                type: 'Identifier',
-                                name: 'universe',
-                                range: [0, 8],
-                                loc: {
-                                    start: { line: 1, column: 0 },
-                                    end: { line: 1, column: 8 }
-                                }
-                            },
-                            'arguments': [{
-                                type: 'Literal',
-                                value: 42,
-                                raw: '42',
-                                range: [9, 11],
-                                loc: {
-                                    start: { line: 1, column: 9 },
-                                    end: { line: 1, column: 11 }
-                                }
-                            }],
-                            range: [0, 12],
-                            loc: {
-                                start: { line: 1, column: 0 },
-                                end: { line: 1, column: 12 }
-                            }
-                        },
-                        property: {
-                            type: 'Identifier',
-                            name: 'galaxies',
-                            range: [13, 21],
-                            loc: {
-                                start: { line: 1, column: 13 },
-                                end: { line: 1, column: 21 }
-                            }
-                        },
-                        range: [0, 21],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 21 }
-                        }
-                    },
-                    'arguments': [{
-                        type: 'Literal',
-                        value: 14,
-                        raw: '14',
-                        range: [22, 24],
-                        loc: {
-                            start: { line: 1, column: 22 },
-                            end: { line: 1, column: 24 }
-                        }
-                    }, {
-                        type: 'Literal',
-                        value: 3,
-                        raw: '3',
-                        range: [26, 27],
-                        loc: {
-                            start: { line: 1, column: 26 },
-                            end: { line: 1, column: 27 }
-                        }
-                    }, {
-                        type: 'Literal',
-                        value: 77,
-                        raw: '77',
-                        range: [29, 31],
-                        loc: {
-                            start: { line: 1, column: 29 },
-                            end: { line: 1, column: 31 }
-                        }
-                    }],
-                    range: [0, 32],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 32 }
-                    }
-                },
-                property: {
-                    type: 'Identifier',
-                    name: 'milkyway',
-                    range: [33, 41],
-                    loc: {
-                        start: { line: 1, column: 33 },
-                        end: { line: 1, column: 41 }
-                    }
-                },
-                range: [0, 41],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 41 }
-                }
-            },
-            range: [0, 41],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 41 }
-            }
-        },
-
-        'earth.asia.Indonesia.prepareForElection(2014)': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'CallExpression',
-                callee: {
-                    type: 'MemberExpression',
-                    computed: false,
-                    object: {
-                        type: 'MemberExpression',
-                        computed: false,
-                        object: {
-                            type: 'MemberExpression',
-                            computed: false,
-                            object: {
-                                type: 'Identifier',
-                                name: 'earth',
-                                range: [0, 5],
-                                loc: {
-                                    start: { line: 1, column: 0 },
-                                    end: { line: 1, column: 5 }
-                                }
-                            },
-                            property: {
-                                type: 'Identifier',
-                                name: 'asia',
-                                range: [6, 10],
-                                loc: {
-                                    start: { line: 1, column: 6 },
-                                    end: { line: 1, column: 10 }
-                                }
-                            },
-                            range: [0, 10],
-                            loc: {
-                                start: { line: 1, column: 0 },
-                                end: { line: 1, column: 10 }
-                            }
-                        },
-                        property: {
-                            type: 'Identifier',
-                            name: 'Indonesia',
-                            range: [11, 20],
-                            loc: {
-                                start: { line: 1, column: 11 },
-                                end: { line: 1, column: 20 }
-                            }
-                        },
-                        range: [0, 20],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 20 }
-                        }
-                    },
-                    property: {
-                        type: 'Identifier',
-                        name: 'prepareForElection',
-                        range: [21, 39],
-                        loc: {
-                            start: { line: 1, column: 21 },
-                            end: { line: 1, column: 39 }
-                        }
-                    },
-                    range: [0, 39],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 39 }
-                    }
-                },
-                'arguments': [{
-                    type: 'Literal',
-                    value: 2014,
-                    raw: '2014',
-                    range: [40, 44],
-                    loc: {
-                        start: { line: 1, column: 40 },
-                        end: { line: 1, column: 44 }
-                    }
-                }],
-                range: [0, 45],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 45 }
-                }
-            },
-            range: [0, 45],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 45 }
-            }
-        },
-
-        'universe.if': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'MemberExpression',
-                computed: false,
-                object: {
-                    type: 'Identifier',
-                    name: 'universe',
-                    range: [0, 8],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                property: {
-                    type: 'Identifier',
-                    name: 'if',
-                    range: [9, 11],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 11 }
-                    }
-                },
-                range: [0, 11],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            range: [0, 11],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 11 }
-            }
-        },
-
-        'universe.true': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'MemberExpression',
-                computed: false,
-                object: {
-                    type: 'Identifier',
-                    name: 'universe',
-                    range: [0, 8],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                property: {
-                    type: 'Identifier',
-                    name: 'true',
-                    range: [9, 13],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 13 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            range: [0, 13],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 13 }
-            }
-        },
-
-        'universe.false': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'MemberExpression',
-                computed: false,
-                object: {
-                    type: 'Identifier',
-                    name: 'universe',
-                    range: [0, 8],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                property: {
-                    type: 'Identifier',
-                    name: 'false',
-                    range: [9, 14],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 14 }
-                    }
-                },
-                range: [0, 14],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 14 }
-                }
-            },
-            range: [0, 14],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 14 }
-            }
-        },
-
-        'universe.null': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'MemberExpression',
-                computed: false,
-                object: {
-                    type: 'Identifier',
-                    name: 'universe',
-                    range: [0, 8],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                property: {
-                    type: 'Identifier',
-                    name: 'null',
-                    range: [9, 13],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 13 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            range: [0, 13],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 13 }
-            }
-        }
-
-    },
-
-    'Postfix Expressions': {
-
-        'x++': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UpdateExpression',
-                operator: '++',
-                argument: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                prefix: false,
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            },
-            range: [0, 3],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 3 }
-            }
-        },
-
-        'x--': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UpdateExpression',
-                operator: '--',
-                argument: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                prefix: false,
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            },
-            range: [0, 3],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 3 }
-            }
-        },
-
-        'eval++': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UpdateExpression',
-                operator: '++',
-                argument: {
-                    type: 'Identifier',
-                    name: 'eval',
-                    range: [0, 4],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 4 }
-                    }
-                },
-                prefix: false,
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        'eval--': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UpdateExpression',
-                operator: '--',
-                argument: {
-                    type: 'Identifier',
-                    name: 'eval',
-                    range: [0, 4],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 4 }
-                    }
-                },
-                prefix: false,
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        'arguments++': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UpdateExpression',
-                operator: '++',
-                argument: {
-                    type: 'Identifier',
-                    name: 'arguments',
-                    range: [0, 9],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                prefix: false,
-                range: [0, 11],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            range: [0, 11],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 11 }
-            }
-        },
-
-        'arguments--': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UpdateExpression',
-                operator: '--',
-                argument: {
-                    type: 'Identifier',
-                    name: 'arguments',
-                    range: [0, 9],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                prefix: false,
-                range: [0, 11],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            range: [0, 11],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 11 }
-            }
-        }
-
-    },
-
-    'Unary Operators': {
-
-        '++x': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UpdateExpression',
-                operator: '++',
-                argument: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [2, 3],
-                    loc: {
-                        start: { line: 1, column: 2 },
-                        end: { line: 1, column: 3 }
-                    }
-                },
-                prefix: true,
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            },
-            range: [0, 3],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 3 }
-            }
-        },
-
-        '--x': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UpdateExpression',
-                operator: '--',
-                argument: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [2, 3],
-                    loc: {
-                        start: { line: 1, column: 2 },
-                        end: { line: 1, column: 3 }
-                    }
-                },
-                prefix: true,
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            },
-            range: [0, 3],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 3 }
-            }
-        },
-
-        '++eval': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UpdateExpression',
-                operator: '++',
-                argument: {
-                    type: 'Identifier',
-                    name: 'eval',
-                    range: [2, 6],
-                    loc: {
-                        start: { line: 1, column: 2 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                prefix: true,
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        '--eval': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UpdateExpression',
-                operator: '--',
-                argument: {
-                    type: 'Identifier',
-                    name: 'eval',
-                    range: [2, 6],
-                    loc: {
-                        start: { line: 1, column: 2 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                prefix: true,
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        '++arguments': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UpdateExpression',
-                operator: '++',
-                argument: {
-                    type: 'Identifier',
-                    name: 'arguments',
-                    range: [2, 11],
-                    loc: {
-                        start: { line: 1, column: 2 },
-                        end: { line: 1, column: 11 }
-                    }
-                },
-                prefix: true,
-                range: [0, 11],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            range: [0, 11],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 11 }
-            }
-        },
-
-        '--arguments': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UpdateExpression',
-                operator: '--',
-                argument: {
-                    type: 'Identifier',
-                    name: 'arguments',
-                    range: [2, 11],
-                    loc: {
-                        start: { line: 1, column: 2 },
-                        end: { line: 1, column: 11 }
-                    }
-                },
-                prefix: true,
-                range: [0, 11],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            range: [0, 11],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 11 }
-            }
-        },
-
-        '+x': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UnaryExpression',
-                operator: '+',
-                argument: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [1, 2],
-                    loc: {
-                        start: { line: 1, column: 1 },
-                        end: { line: 1, column: 2 }
-                    }
-                },
-                prefix: true,
-                range: [0, 2],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 2 }
-                }
-            },
-            range: [0, 2],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 2 }
-            }
-        },
-
-        '-x': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UnaryExpression',
-                operator: '-',
-                argument: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [1, 2],
-                    loc: {
-                        start: { line: 1, column: 1 },
-                        end: { line: 1, column: 2 }
-                    }
-                },
-                prefix: true,
-                range: [0, 2],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 2 }
-                }
-            },
-            range: [0, 2],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 2 }
-            }
-        },
-
-        '~x': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UnaryExpression',
-                operator: '~',
-                argument: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [1, 2],
-                    loc: {
-                        start: { line: 1, column: 1 },
-                        end: { line: 1, column: 2 }
-                    }
-                },
-                prefix: true,
-                range: [0, 2],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 2 }
-                }
-            },
-            range: [0, 2],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 2 }
-            }
-        },
-
-        '!x': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UnaryExpression',
-                operator: '!',
-                argument: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [1, 2],
-                    loc: {
-                        start: { line: 1, column: 1 },
-                        end: { line: 1, column: 2 }
-                    }
-                },
-                prefix: true,
-                range: [0, 2],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 2 }
-                }
-            },
-            range: [0, 2],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 2 }
-            }
-        },
-
-        'void x': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UnaryExpression',
-                operator: 'void',
-                argument: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [5, 6],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                prefix: true,
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        'delete x': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UnaryExpression',
-                operator: 'delete',
-                argument: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [7, 8],
-                    loc: {
-                        start: { line: 1, column: 7 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                prefix: true,
-                range: [0, 8],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 8 }
-                }
-            },
-            range: [0, 8],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 8 }
-            }
-        },
-
-        'typeof x': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'UnaryExpression',
-                operator: 'typeof',
-                argument: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [7, 8],
-                    loc: {
-                        start: { line: 1, column: 7 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                prefix: true,
-                range: [0, 8],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 8 }
-                }
-            },
-            range: [0, 8],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 8 }
-            }
-        }
-
-    },
-
-    'Multiplicative Operators': {
-
-        'x * y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '*',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        },
-
-        'x / y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '/',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        },
-
-        'x % y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '%',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        }
-
-    },
-
-    'Additive Operators': {
-
-        'x + y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '+',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        },
-
-        'x - y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '-',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        }
-
-    },
-
-    'Bitwise Shift Operator': {
-
-        'x << y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '<<',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [5, 6],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        'x >> y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '>>',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [5, 6],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        'x >>> y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '>>>',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [6, 7],
-                    loc: {
-                        start: { line: 1, column: 6 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        }
-
-    },
-
-    'Relational Operators': {
-
-        'x < y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '<',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        },
-
-        'x > y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '>',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        },
-
-        'x <= y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '<=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [5, 6],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        'x >= y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '>=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [5, 6],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        'x in y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: 'in',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [5, 6],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        'x instanceof y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: 'instanceof',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [13, 14],
-                    loc: {
-                        start: { line: 1, column: 13 },
-                        end: { line: 1, column: 14 }
-                    }
-                },
-                range: [0, 14],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 14 }
-                }
-            },
-            range: [0, 14],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 14 }
-            }
-        },
-
-        'x < y < z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '<',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '<',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    range: [0, 5],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        }
-
-    },
-
-    'Equality Operators': {
-
-        'x == y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '==',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [5, 6],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        'x != y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '!=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [5, 6],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        'x === y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '===',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [6, 7],
-                    loc: {
-                        start: { line: 1, column: 6 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        'x !== y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '!==',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [6, 7],
-                    loc: {
-                        start: { line: 1, column: 6 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        }
-
-    },
-
-    'Binary Bitwise Operators': {
-
-        'x & y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '&',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        },
-
-        'x ^ y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '^',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        },
-
-        'x | y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '|',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        }
-
-    },
-
-    'Binary Expressions': {
-
-        'x + y + z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '+',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '+',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    range: [0, 5],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x - y + z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '+',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '-',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    range: [0, 5],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x + y - z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '-',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '+',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    range: [0, 5],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x - y - z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '-',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '-',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    range: [0, 5],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x + y * z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '+',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'BinaryExpression',
-                    operator: '*',
-                    left: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'z',
-                        range: [8, 9],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 9 }
-                        }
-                    },
-                    range: [4, 9],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x + y / z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '+',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'BinaryExpression',
-                    operator: '/',
-                    left: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'z',
-                        range: [8, 9],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 9 }
-                        }
-                    },
-                    range: [4, 9],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x - y % z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '-',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'BinaryExpression',
-                    operator: '%',
-                    left: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'z',
-                        range: [8, 9],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 9 }
-                        }
-                    },
-                    range: [4, 9],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x * y * z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '*',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '*',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    range: [0, 5],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x * y / z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '/',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '*',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    range: [0, 5],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x * y % z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '%',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '*',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    range: [0, 5],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x % y * z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '*',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '%',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    range: [0, 5],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x << y << z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '<<',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '<<',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [5, 6],
-                        loc: {
-                            start: { line: 1, column: 5 },
-                            end: { line: 1, column: 6 }
-                        }
-                    },
-                    range: [0, 6],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [10, 11],
-                    loc: {
-                        start: { line: 1, column: 10 },
-                        end: { line: 1, column: 11 }
-                    }
-                },
-                range: [0, 11],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            range: [0, 11],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 11 }
-            }
-        },
-
-        'x | y | z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '|',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '|',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    range: [0, 5],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x & y & z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '&',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '&',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    range: [0, 5],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x ^ y ^ z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '^',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '^',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    range: [0, 5],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x & y | z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '|',
-                left: {
-                    type: 'BinaryExpression',
-                    operator: '&',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    range: [0, 5],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x | y ^ z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '|',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'BinaryExpression',
-                    operator: '^',
-                    left: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'z',
-                        range: [8, 9],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 9 }
-                        }
-                    },
-                    range: [4, 9],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x | y & z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'BinaryExpression',
-                operator: '|',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'BinaryExpression',
-                    operator: '&',
-                    left: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'z',
-                        range: [8, 9],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 9 }
-                        }
-                    },
-                    range: [4, 9],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        }
-
-    },
-
-    'Binary Logical Operators': {
-
-        'x || y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'LogicalExpression',
-                operator: '||',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [5, 6],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        'x && y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'LogicalExpression',
-                operator: '&&',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [5, 6],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        'x || y || z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'LogicalExpression',
-                operator: '||',
-                left: {
-                    type: 'LogicalExpression',
-                    operator: '||',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [5, 6],
-                        loc: {
-                            start: { line: 1, column: 5 },
-                            end: { line: 1, column: 6 }
-                        }
-                    },
-                    range: [0, 6],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [10, 11],
-                    loc: {
-                        start: { line: 1, column: 10 },
-                        end: { line: 1, column: 11 }
-                    }
-                },
-                range: [0, 11],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            range: [0, 11],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 11 }
-            }
-        },
-
-        'x && y && z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'LogicalExpression',
-                operator: '&&',
-                left: {
-                    type: 'LogicalExpression',
-                    operator: '&&',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [5, 6],
-                        loc: {
-                            start: { line: 1, column: 5 },
-                            end: { line: 1, column: 6 }
-                        }
-                    },
-                    range: [0, 6],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [10, 11],
-                    loc: {
-                        start: { line: 1, column: 10 },
-                        end: { line: 1, column: 11 }
-                    }
-                },
-                range: [0, 11],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            range: [0, 11],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 11 }
-            }
-        },
-
-        'x || y && z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'LogicalExpression',
-                operator: '||',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'LogicalExpression',
-                    operator: '&&',
-                    left: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [5, 6],
-                        loc: {
-                            start: { line: 1, column: 5 },
-                            end: { line: 1, column: 6 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'z',
-                        range: [10, 11],
-                        loc: {
-                            start: { line: 1, column: 10 },
-                            end: { line: 1, column: 11 }
-                        }
-                    },
-                    range: [5, 11],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 11 }
-                    }
-                },
-                range: [0, 11],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            range: [0, 11],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 11 }
-            }
-        },
-
-        'x || y ^ z': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'LogicalExpression',
-                operator: '||',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'BinaryExpression',
-                    operator: '^',
-                    left: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [5, 6],
-                        loc: {
-                            start: { line: 1, column: 5 },
-                            end: { line: 1, column: 6 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'z',
-                        range: [9, 10],
-                        loc: {
-                            start: { line: 1, column: 9 },
-                            end: { line: 1, column: 10 }
-                        }
-                    },
-                    range: [5, 10],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 10 }
-                    }
-                },
-                range: [0, 10],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 10 }
-                }
-            },
-            range: [0, 10],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 10 }
-            }
-        }
-
-    },
-
-    'Conditional Operator': {
-
-        'y ? 1 : 2': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'ConditionalExpression',
-                test: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                consequent: {
-                    type: 'Literal',
-                    value: 1,
-                    raw: '1',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                alternate: {
-                    type: 'Literal',
-                    value: 2,
-                    raw: '2',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x && y ? 1 : 2': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'ConditionalExpression',
-                test: {
-                    type: 'LogicalExpression',
-                    operator: '&&',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [5, 6],
-                        loc: {
-                            start: { line: 1, column: 5 },
-                            end: { line: 1, column: 6 }
-                        }
-                    },
-                    range: [0, 6],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                consequent: {
-                    type: 'Literal',
-                    value: 1,
-                    raw: '1',
-                    range: [9, 10],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 10 }
-                    }
-                },
-                alternate: {
-                    type: 'Literal',
-                    value: 2,
-                    raw: '2',
-                    range: [13, 14],
-                    loc: {
-                        start: { line: 1, column: 13 },
-                        end: { line: 1, column: 14 }
-                    }
-                },
-                range: [0, 14],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 14 }
-                }
-            },
-            range: [0, 14],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 14 }
-            }
-        }
-
-    },
-
-    'Assignment Operators': {
-
-        'x = 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [4, 6],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        'eval = 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'eval',
-                    range: [0, 4],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 4 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [7, 9],
-                    loc: {
-                        start: { line: 1, column: 7 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'arguments = 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'arguments',
-                    range: [0, 9],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [12, 14],
-                    loc: {
-                        start: { line: 1, column: 12 },
-                        end: { line: 1, column: 14 }
-                    }
-                },
-                range: [0, 14],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 14 }
-                }
-            },
-            range: [0, 14],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 14 }
-            }
-        },
-
-        'x *= 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '*=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [5, 7],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        'x /= 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '/=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [5, 7],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        'x %= 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '%=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [5, 7],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        'x += 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '+=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [5, 7],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        'x -= 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '-=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [5, 7],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        'x <<= 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '<<=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [6, 8],
-                    loc: {
-                        start: { line: 1, column: 6 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                range: [0, 8],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 8 }
-                }
-            },
-            range: [0, 8],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 8 }
-            }
-        },
-
-        'x >>= 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '>>=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [6, 8],
-                    loc: {
-                        start: { line: 1, column: 6 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                range: [0, 8],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 8 }
-                }
-            },
-            range: [0, 8],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 8 }
-            }
-        },
-
-        'x >>>= 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '>>>=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [7, 9],
-                    loc: {
-                        start: { line: 1, column: 7 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [0, 9],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'x &= 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '&=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [5, 7],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        'x ^= 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '^=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [5, 7],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        'x |= 42': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'AssignmentExpression',
-                operator: '|=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [5, 7],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        }
-
-    },
-
-    'Block': {
-
-        '{ foo }': {
-            type: 'BlockStatement',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Identifier',
-                    name: 'foo',
-                    range: [2, 5],
-                    loc: {
-                        start: { line: 1, column: 2 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                range: [2, 6],
-                loc: {
-                    start: { line: 1, column: 2 },
-                    end: { line: 1, column: 6 }
-                }
-            }],
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        '{ doThis(); doThat(); }': {
-            type: 'BlockStatement',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'doThis',
-                        range: [2, 8],
-                        loc: {
-                            start: { line: 1, column: 2 },
-                            end: { line: 1, column: 8 }
-                        }
-                    },
-                    'arguments': [],
-                    range: [2, 10],
-                    loc: {
-                        start: { line: 1, column: 2 },
-                        end: { line: 1, column: 10 }
-                    }
-                },
-                range: [2, 11],
-                loc: {
-                    start: { line: 1, column: 2 },
-                    end: { line: 1, column: 11 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'doThat',
-                        range: [12, 18],
-                        loc: {
-                            start: { line: 1, column: 12 },
-                            end: { line: 1, column: 18 }
-                        }
-                    },
-                    'arguments': [],
-                    range: [12, 20],
-                    loc: {
-                        start: { line: 1, column: 12 },
-                        end: { line: 1, column: 20 }
-                    }
-                },
-                range: [12, 21],
-                loc: {
-                    start: { line: 1, column: 12 },
-                    end: { line: 1, column: 21 }
-                }
-            }],
-            range: [0, 23],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 23 }
-            }
-        },
-
-        '{}': {
-            type: 'BlockStatement',
-            body: [],
-            range: [0, 2],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 2 }
-            }
-        }
-
-    },
-
-    'Variable Statement': {
-
-        'var x': {
-            type: 'VariableDeclaration',
-            declarations: [{
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                init: null,
-                range: [4, 5],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 5 }
-                }
-            }],
-            kind: 'var',
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        },
-
-        'var x, y;': {
-            type: 'VariableDeclaration',
-            declarations: [{
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                init: null,
-                range: [4, 5],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 5 }
-                }
-            }, {
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [7, 8],
-                    loc: {
-                        start: { line: 1, column: 7 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                init: null,
-                range: [7, 8],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 8 }
-                }
-            }],
-            kind: 'var',
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'var x = 42': {
-            type: 'VariableDeclaration',
-            declarations: [{
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                init: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [8, 10],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 10 }
-                    }
-                },
-                range: [4, 10],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 10 }
-                }
-            }],
-            kind: 'var',
-            range: [0, 10],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 10 }
-            }
-        },
-
-        'var eval = 42, arguments = 42': {
-            type: 'VariableDeclaration',
-            declarations: [{
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'eval',
-                    range: [4, 8],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                init: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [11, 13],
-                    loc: {
-                        start: { line: 1, column: 11 },
-                        end: { line: 1, column: 13 }
-                    }
-                },
-                range: [4, 13],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'arguments',
-                    range: [15, 24],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 24 }
-                    }
-                },
-                init: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [27, 29],
-                    loc: {
-                        start: { line: 1, column: 27 },
-                        end: { line: 1, column: 29 }
-                    }
-                },
-                range: [15, 29],
-                loc: {
-                    start: { line: 1, column: 15 },
-                    end: { line: 1, column: 29 }
-                }
-            }],
-            kind: 'var',
-            range: [0, 29],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 29 }
-            }
-        },
-
-        'var x = 14, y = 3, z = 1977': {
-            type: 'VariableDeclaration',
-            declarations: [{
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                init: {
-                    type: 'Literal',
-                    value: 14,
-                    raw: '14',
-                    range: [8, 10],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 10 }
-                    }
-                },
-                range: [4, 10],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 10 }
-                }
-            }, {
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [12, 13],
-                    loc: {
-                        start: { line: 1, column: 12 },
-                        end: { line: 1, column: 13 }
-                    }
-                },
-                init: {
-                    type: 'Literal',
-                    value: 3,
-                    raw: '3',
-                    range: [16, 17],
-                    loc: {
-                        start: { line: 1, column: 16 },
-                        end: { line: 1, column: 17 }
-                    }
-                },
-                range: [12, 17],
-                loc: {
-                    start: { line: 1, column: 12 },
-                    end: { line: 1, column: 17 }
-                }
-            }, {
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [19, 20],
-                    loc: {
-                        start: { line: 1, column: 19 },
-                        end: { line: 1, column: 20 }
-                    }
-                },
-                init: {
-                    type: 'Literal',
-                    value: 1977,
-                    raw: '1977',
-                    range: [23, 27],
-                    loc: {
-                        start: { line: 1, column: 23 },
-                        end: { line: 1, column: 27 }
-                    }
-                },
-                range: [19, 27],
-                loc: {
-                    start: { line: 1, column: 19 },
-                    end: { line: 1, column: 27 }
-                }
-            }],
-            kind: 'var',
-            range: [0, 27],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 27 }
-            }
-        },
-
-        'var implements, interface, package': {
-            type: 'VariableDeclaration',
-            declarations: [{
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'implements',
-                    range: [4, 14],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 14 }
-                    }
-                },
-                init: null,
-                range: [4, 14],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 14 }
-                }
-            }, {
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'interface',
-                    range: [16, 25],
-                    loc: {
-                        start: { line: 1, column: 16 },
-                        end: { line: 1, column: 25 }
-                    }
-                },
-                init: null,
-                range: [16, 25],
-                loc: {
-                    start: { line: 1, column: 16 },
-                    end: { line: 1, column: 25 }
-                }
-            }, {
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'package',
-                    range: [27, 34],
-                    loc: {
-                        start: { line: 1, column: 27 },
-                        end: { line: 1, column: 34 }
-                    }
-                },
-                init: null,
-                range: [27, 34],
-                loc: {
-                    start: { line: 1, column: 27 },
-                    end: { line: 1, column: 34 }
-                }
-            }],
-            kind: 'var',
-            range: [0, 34],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 34 }
-            }
-        },
-
-        'var private, protected, public, static': {
-            type: 'VariableDeclaration',
-            declarations: [{
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'private',
-                    range: [4, 11],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 11 }
-                    }
-                },
-                init: null,
-                range: [4, 11],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 11 }
-                }
-            }, {
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'protected',
-                    range: [13, 22],
-                    loc: {
-                        start: { line: 1, column: 13 },
-                        end: { line: 1, column: 22 }
-                    }
-                },
-                init: null,
-                range: [13, 22],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 1, column: 22 }
-                }
-            }, {
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'public',
-                    range: [24, 30],
-                    loc: {
-                        start: { line: 1, column: 24 },
-                        end: { line: 1, column: 30 }
-                    }
-                },
-                init: null,
-                range: [24, 30],
-                loc: {
-                    start: { line: 1, column: 24 },
-                    end: { line: 1, column: 30 }
-                }
-            }, {
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'static',
-                    range: [32, 38],
-                    loc: {
-                        start: { line: 1, column: 32 },
-                        end: { line: 1, column: 38 }
-                    }
-                },
-                init: null,
-                range: [32, 38],
-                loc: {
-                    start: { line: 1, column: 32 },
-                    end: { line: 1, column: 38 }
-                }
-            }],
-            kind: 'var',
-            range: [0, 38],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 38 }
-            }
-        }
-
-    },
-
-    'Let Statement': {
-
-        'let x': {
-            type: 'VariableDeclaration',
-            declarations: [{
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                init: null,
-                range: [4, 5],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 5 }
-                }
-            }],
-            kind: 'let',
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            }
-        },
-
-        '{ let x }': {
-            type: 'BlockStatement',
-            body: [{
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [6, 7],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 7 }
-                        }
-                    },
-                    init: null,
-                    range: [6, 7],
-                    loc: {
-                        start: { line: 1, column: 6 },
-                        end: { line: 1, column: 7 }
-                    }
-                }],
-                kind: 'let',
-                range: [2, 8],
-                loc: {
-                    start: { line: 1, column: 2 },
-                    end: { line: 1, column: 8 }
-                }
-            }],
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        '{ let x = 42 }': {
-            type: 'BlockStatement',
-            body: [{
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [6, 7],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 7 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 42,
-                        raw: '42',
-                        range: [10, 12],
-                        loc: {
-                            start: { line: 1, column: 10 },
-                            end: { line: 1, column: 12 }
-                        }
-                    },
-                    range: [6, 12],
-                    loc: {
-                        start: { line: 1, column: 6 },
-                        end: { line: 1, column: 12 }
-                    }
-                }],
-                kind: 'let',
-                range: [2, 13],
-                loc: {
-                    start: { line: 1, column: 2 },
-                    end: { line: 1, column: 13 }
-                }
-            }],
-            range: [0, 14],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 14 }
-            }
-        },
-
-        '{ let x = 14, y = 3, z = 1977 }': {
-            type: 'BlockStatement',
-            body: [{
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [6, 7],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 7 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 14,
-                        raw: '14',
-                        range: [10, 12],
-                        loc: {
-                            start: { line: 1, column: 10 },
-                            end: { line: 1, column: 12 }
-                        }
-                    },
-                    range: [6, 12],
-                    loc: {
-                        start: { line: 1, column: 6 },
-                        end: { line: 1, column: 12 }
-                    }
-                }, {
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [14, 15],
-                        loc: {
-                            start: { line: 1, column: 14 },
-                            end: { line: 1, column: 15 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 3,
-                        raw: '3',
-                        range: [18, 19],
-                        loc: {
-                            start: { line: 1, column: 18 },
-                            end: { line: 1, column: 19 }
-                        }
-                    },
-                    range: [14, 19],
-                    loc: {
-                        start: { line: 1, column: 14 },
-                        end: { line: 1, column: 19 }
-                    }
-                }, {
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'z',
-                        range: [21, 22],
-                        loc: {
-                            start: { line: 1, column: 21 },
-                            end: { line: 1, column: 22 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 1977,
-                        raw: '1977',
-                        range: [25, 29],
-                        loc: {
-                            start: { line: 1, column: 25 },
-                            end: { line: 1, column: 29 }
-                        }
-                    },
-                    range: [21, 29],
-                    loc: {
-                        start: { line: 1, column: 21 },
-                        end: { line: 1, column: 29 }
-                    }
-                }],
-                kind: 'let',
-                range: [2, 30],
-                loc: {
-                    start: { line: 1, column: 2 },
-                    end: { line: 1, column: 30 }
-                }
-            }],
-            range: [0, 31],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 31 }
-            }
-        }
-
-    },
-
-    'Const Statement': {
-
-        'const x = 42': {
-            type: 'VariableDeclaration',
-            declarations: [{
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [6, 7],
-                    loc: {
-                        start: { line: 1, column: 6 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                init: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [10, 12],
-                    loc: {
-                        start: { line: 1, column: 10 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [6, 12],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 12 }
-                }
-            }],
-            kind: 'const',
-            range: [0, 12],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 12 }
-            }
-        },
-
-        '{ const x = 42 }': {
-            type: 'BlockStatement',
-            body: [{
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [8, 9],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 9 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 42,
-                        raw: '42',
-                        range: [12, 14],
-                        loc: {
-                            start: { line: 1, column: 12 },
-                            end: { line: 1, column: 14 }
-                        }
-                    },
-                    range: [8, 14],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 14 }
-                    }
-                }],
-                kind: 'const',
-                range: [2, 15],
-                loc: {
-                    start: { line: 1, column: 2 },
-                    end: { line: 1, column: 15 }
-                }
-            }],
-            range: [0, 16],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 16 }
-            }
-        },
-
-        '{ const x = 14, y = 3, z = 1977 }': {
-            type: 'BlockStatement',
-            body: [{
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [8, 9],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 9 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 14,
-                        raw: '14',
-                        range: [12, 14],
-                        loc: {
-                            start: { line: 1, column: 12 },
-                            end: { line: 1, column: 14 }
-                        }
-                    },
-                    range: [8, 14],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 14 }
-                    }
-                }, {
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [16, 17],
-                        loc: {
-                            start: { line: 1, column: 16 },
-                            end: { line: 1, column: 17 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 3,
-                        raw: '3',
-                        range: [20, 21],
-                        loc: {
-                            start: { line: 1, column: 20 },
-                            end: { line: 1, column: 21 }
-                        }
-                    },
-                    range: [16, 21],
-                    loc: {
-                        start: { line: 1, column: 16 },
-                        end: { line: 1, column: 21 }
-                    }
-                }, {
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'z',
-                        range: [23, 24],
-                        loc: {
-                            start: { line: 1, column: 23 },
-                            end: { line: 1, column: 24 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 1977,
-                        raw: '1977',
-                        range: [27, 31],
-                        loc: {
-                            start: { line: 1, column: 27 },
-                            end: { line: 1, column: 31 }
-                        }
-                    },
-                    range: [23, 31],
-                    loc: {
-                        start: { line: 1, column: 23 },
-                        end: { line: 1, column: 31 }
-                    }
-                }],
-                kind: 'const',
-                range: [2, 32],
-                loc: {
-                    start: { line: 1, column: 2 },
-                    end: { line: 1, column: 32 }
-                }
-            }],
-            range: [0, 33],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 33 }
-            }
-        }
-
-    },
-
-    'Empty Statement': {
-
-        ';': {
-            type: 'EmptyStatement',
-            range: [0, 1],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 1 }
-            }
-        }
-
-    },
-
-    'Expression Statement': {
-
-        'x': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Identifier',
-                name: 'x',
-                range: [0, 1],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 1 }
-                }
-            },
-            range: [0, 1],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 1 }
-            }
-        },
-
-        'x, y': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'SequenceExpression',
-                expressions: [{
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [0, 1],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 1 }
-                    }
-                }, {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [3, 4],
-                    loc: {
-                        start: { line: 1, column: 3 },
-                        end: { line: 1, column: 4 }
-                    }
-                }],
-                range: [0, 4],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 4 }
-                }
-            },
-            range: [0, 4],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 4 }
-            }
-        },
-
-        '\\u0061': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Identifier',
-                name: 'a',
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            },
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            }
-        },
-
-        'a\\u0061': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Identifier',
-                name: 'aa',
-                range: [0, 7],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 7],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 7 }
-            }
-        },
-
-        '\\ua': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Identifier',
-                name: 'ua',
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            },
-            range: [0, 3],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 3 }
-            }
-        },
-
-        'a\\u': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'Identifier',
-                name: 'au',
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            },
-            range: [0, 3],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 3 }
-            }
-        }
-
-    },
-
-    'If Statement': {
-
-        'if (morning) goodMorning()': {
-            type: 'IfStatement',
-            test: {
-                type: 'Identifier',
-                name: 'morning',
-                range: [4, 11],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            consequent: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'goodMorning',
-                        range: [13, 24],
-                        loc: {
-                            start: { line: 1, column: 13 },
-                            end: { line: 1, column: 24 }
-                        }
-                    },
-                    'arguments': [],
-                    range: [13, 26],
-                    loc: {
-                        start: { line: 1, column: 13 },
-                        end: { line: 1, column: 26 }
-                    }
-                },
-                range: [13, 26],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 1, column: 26 }
-                }
-            },
-            alternate: null,
-            range: [0, 26],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 26 }
-            }
-        },
-
-        'if (morning) (function(){})': {
-            type: 'IfStatement',
-            test: {
-                type: 'Identifier',
-                name: 'morning',
-                range: [4, 11],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            consequent: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'FunctionExpression',
-                    id: null,
-                    params: [],
-                    defaults: [],
-                    body: {
-                        type: 'BlockStatement',
-                        body: [],
-                        range: [24, 26],
-                        loc: {
-                            start: { line: 1, column: 24 },
-                            end: { line: 1, column: 26 }
-                        }
-                    },
-                    rest: null,
-                    generator: false,
-                    expression: false,
-                    range: [14, 26],
-                    loc: {
-                        start: { line: 1, column: 14 },
-                        end: { line: 1, column: 26 }
-                    }
-                },
-                range: [13, 27],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 1, column: 27 }
-                }
-            },
-            alternate: null,
-            range: [0, 27],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 27 }
-            }
-        },
-
-        'if (morning) var x = 0;': {
-            type: 'IfStatement',
-            test: {
-                type: 'Identifier',
-                name: 'morning',
-                range: [4, 11],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            consequent: {
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [17, 18],
-                        loc: {
-                            start: { line: 1, column: 17 },
-                            end: { line: 1, column: 18 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 0,
-                        raw: '0',
-                        range: [21, 22],
-                        loc: {
-                            start: { line: 1, column: 21 },
-                            end: { line: 1, column: 22 }
-                        }
-                    },
-                    range: [17, 22],
-                    loc: {
-                        start: { line: 1, column: 17 },
-                        end: { line: 1, column: 22 }
-                    }
-                }],
-                kind: 'var',
-                range: [13, 23],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 1, column: 23 }
-                }
-            },
-            alternate: null,
-            range: [0, 23],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 23 }
-            }
-        },
-
-        'if (morning) function a(){}': {
-            type: 'IfStatement',
-            test: {
-                type: 'Identifier',
-                name: 'morning',
-                range: [4, 11],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            consequent: {
-                type: 'FunctionDeclaration',
-                id: {
-                    type: 'Identifier',
-                    name: 'a',
-                    range: [22, 23],
-                    loc: {
-                        start: { line: 1, column: 22 },
-                        end: { line: 1, column: 23 }
-                    }
-                },
-                params: [],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [25, 27],
-                    loc: {
-                        start: { line: 1, column: 25 },
-                        end: { line: 1, column: 27 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [13, 27],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 1, column: 27 }
-                }
-            },
-            alternate: null,
-            range: [0, 27],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 27 }
-            }
-        },
-
-        'if (morning) goodMorning(); else goodDay()': {
-            type: 'IfStatement',
-            test: {
-                type: 'Identifier',
-                name: 'morning',
-                range: [4, 11],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            consequent: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'goodMorning',
-                        range: [13, 24],
-                        loc: {
-                            start: { line: 1, column: 13 },
-                            end: { line: 1, column: 24 }
-                        }
-                    },
-                    'arguments': [],
-                    range: [13, 26],
-                    loc: {
-                        start: { line: 1, column: 13 },
-                        end: { line: 1, column: 26 }
-                    }
-                },
-                range: [13, 27],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 1, column: 27 }
-                }
-            },
-            alternate: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'goodDay',
-                        range: [33, 40],
-                        loc: {
-                            start: { line: 1, column: 33 },
-                            end: { line: 1, column: 40 }
-                        }
-                    },
-                    'arguments': [],
-                    range: [33, 42],
-                    loc: {
-                        start: { line: 1, column: 33 },
-                        end: { line: 1, column: 42 }
-                    }
-                },
-                range: [33, 42],
-                loc: {
-                    start: { line: 1, column: 33 },
-                    end: { line: 1, column: 42 }
-                }
-            },
-            range: [0, 42],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 42 }
-            }
-        }
-
-    },
-
-    'Iteration Statements': {
-
-        'do keep(); while (true)': {
-            type: 'DoWhileStatement',
-            body: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'keep',
-                        range: [3, 7],
-                        loc: {
-                            start: { line: 1, column: 3 },
-                            end: { line: 1, column: 7 }
-                        }
-                    },
-                    'arguments': [],
-                    range: [3, 9],
-                    loc: {
-                        start: { line: 1, column: 3 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [3, 10],
-                loc: {
-                    start: { line: 1, column: 3 },
-                    end: { line: 1, column: 10 }
-                }
-            },
-            test: {
-                type: 'Literal',
-                value: true,
-                raw: 'true',
-                range: [18, 22],
-                loc: {
-                    start: { line: 1, column: 18 },
-                    end: { line: 1, column: 22 }
-                }
-            },
-            range: [0, 23],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 23 }
-            }
-        },
-
-        'do keep(); while (true);': {
-            type: 'DoWhileStatement',
-            body: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'keep',
-                        range: [3, 7],
-                        loc: {
-                            start: { line: 1, column: 3 },
-                            end: { line: 1, column: 7 }
-                        }
-                    },
-                    'arguments': [],
-                    range: [3, 9],
-                    loc: {
-                        start: { line: 1, column: 3 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [3, 10],
-                loc: {
-                    start: { line: 1, column: 3 },
-                    end: { line: 1, column: 10 }
-                }
-            },
-            test: {
-                type: 'Literal',
-                value: true,
-                raw: 'true',
-                range: [18, 22],
-                loc: {
-                    start: { line: 1, column: 18 },
-                    end: { line: 1, column: 22 }
-                }
-            },
-            range: [0, 24],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 24 }
-            }
-        },
-
-        'do { x++; y--; } while (x < 10)': {
-            type: 'DoWhileStatement',
-            body: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'UpdateExpression',
-                        operator: '++',
-                        argument: {
-                            type: 'Identifier',
-                            name: 'x',
-                            range: [5, 6],
-                            loc: {
-                                start: { line: 1, column: 5 },
-                                end: { line: 1, column: 6 }
-                            }
-                        },
-                        prefix: false,
-                        range: [5, 8],
-                        loc: {
-                            start: { line: 1, column: 5 },
-                            end: { line: 1, column: 8 }
-                        }
-                    },
-                    range: [5, 9],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 9 }
-                    }
-                }, {
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'UpdateExpression',
-                        operator: '--',
-                        argument: {
-                            type: 'Identifier',
-                            name: 'y',
-                            range: [10, 11],
-                            loc: {
-                                start: { line: 1, column: 10 },
-                                end: { line: 1, column: 11 }
-                            }
-                        },
-                        prefix: false,
-                        range: [10, 13],
-                        loc: {
-                            start: { line: 1, column: 10 },
-                            end: { line: 1, column: 13 }
-                        }
-                    },
-                    range: [10, 14],
-                    loc: {
-                        start: { line: 1, column: 10 },
-                        end: { line: 1, column: 14 }
-                    }
-                }],
-                range: [3, 16],
-                loc: {
-                    start: { line: 1, column: 3 },
-                    end: { line: 1, column: 16 }
-                }
-            },
-            test: {
-                type: 'BinaryExpression',
-                operator: '<',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [24, 25],
-                    loc: {
-                        start: { line: 1, column: 24 },
-                        end: { line: 1, column: 25 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 10,
-                    raw: '10',
-                    range: [28, 30],
-                    loc: {
-                        start: { line: 1, column: 28 },
-                        end: { line: 1, column: 30 }
-                    }
-                },
-                range: [24, 30],
-                loc: {
-                    start: { line: 1, column: 24 },
-                    end: { line: 1, column: 30 }
-                }
-            },
-            range: [0, 31],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 31 }
-            }
-        },
-
-        '{ do { } while (false) false }': {
-            type: 'BlockStatement',
-            body: [{
-                type: 'DoWhileStatement',
-                body: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [5, 8],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                test: {
-                    type: 'Literal',
-                    value: false,
-                    raw: 'false',
-                    range: [16, 21],
-                    loc: {
-                        start: { line: 1, column: 16 },
-                        end: { line: 1, column: 21 }
-                    }
-                },
-                range: [2, 22],
-                loc: {
-                    start: { line: 1, column: 2 },
-                    end: { line: 1, column: 22 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: false,
-                    raw: 'false',
-                    range: [23, 28],
-                    loc: {
-                        start: { line: 1, column: 23 },
-                        end: { line: 1, column: 28 }
-                    }
-                },
-                range: [23, 29],
-                loc: {
-                    start: { line: 1, column: 23 },
-                    end: { line: 1, column: 29 }
-                }
-            }],
-            range: [0, 30],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 30 }
-            }
-        },
-
-        'while (true) doSomething()': {
-            type: 'WhileStatement',
-            test: {
-                type: 'Literal',
-                value: true,
-                raw: 'true',
-                range: [7, 11],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            body: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'doSomething',
-                        range: [13, 24],
-                        loc: {
-                            start: { line: 1, column: 13 },
-                            end: { line: 1, column: 24 }
-                        }
-                    },
-                    'arguments': [],
-                    range: [13, 26],
-                    loc: {
-                        start: { line: 1, column: 13 },
-                        end: { line: 1, column: 26 }
-                    }
-                },
-                range: [13, 26],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 1, column: 26 }
-                }
-            },
-            range: [0, 26],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 26 }
-            }
-        },
-
-        'while (x < 10) { x++; y--; }': {
-            type: 'WhileStatement',
-            test: {
-                type: 'BinaryExpression',
-                operator: '<',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [7, 8],
-                    loc: {
-                        start: { line: 1, column: 7 },
-                        end: { line: 1, column: 8 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 10,
-                    raw: '10',
-                    range: [11, 13],
-                    loc: {
-                        start: { line: 1, column: 11 },
-                        end: { line: 1, column: 13 }
-                    }
-                },
-                range: [7, 13],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            body: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'UpdateExpression',
-                        operator: '++',
-                        argument: {
-                            type: 'Identifier',
-                            name: 'x',
-                            range: [17, 18],
-                            loc: {
-                                start: { line: 1, column: 17 },
-                                end: { line: 1, column: 18 }
-                            }
-                        },
-                        prefix: false,
-                        range: [17, 20],
-                        loc: {
-                            start: { line: 1, column: 17 },
-                            end: { line: 1, column: 20 }
-                        }
-                    },
-                    range: [17, 21],
-                    loc: {
-                        start: { line: 1, column: 17 },
-                        end: { line: 1, column: 21 }
-                    }
-                }, {
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'UpdateExpression',
-                        operator: '--',
-                        argument: {
-                            type: 'Identifier',
-                            name: 'y',
-                            range: [22, 23],
-                            loc: {
-                                start: { line: 1, column: 22 },
-                                end: { line: 1, column: 23 }
-                            }
-                        },
-                        prefix: false,
-                        range: [22, 25],
-                        loc: {
-                            start: { line: 1, column: 22 },
-                            end: { line: 1, column: 25 }
-                        }
-                    },
-                    range: [22, 26],
-                    loc: {
-                        start: { line: 1, column: 22 },
-                        end: { line: 1, column: 26 }
-                    }
-                }],
-                range: [15, 28],
-                loc: {
-                    start: { line: 1, column: 15 },
-                    end: { line: 1, column: 28 }
-                }
-            },
-            range: [0, 28],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 28 }
-            }
-        },
-
-        'for(;;);': {
-            type: 'ForStatement',
-            init: null,
-            test: null,
-            update: null,
-            body: {
-                type: 'EmptyStatement',
-                range: [7, 8],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 8 }
-                }
-            },
-            range: [0, 8],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 8 }
-            }
-        },
-
-        'for(;;){}': {
-            type: 'ForStatement',
-            init: null,
-            test: null,
-            update: null,
-            body: {
-                type: 'BlockStatement',
-                body: [],
-                range: [7, 9],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        },
-
-        'for(x = 0;;);': {
-            type: 'ForStatement',
-            init: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 0,
-                    raw: '0',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [4, 9],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            test: null,
-            update: null,
-            body: {
-                type: 'EmptyStatement',
-                range: [12, 13],
-                loc: {
-                    start: { line: 1, column: 12 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            range: [0, 13],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 13 }
-            }
-        },
-
-        'for(var x = 0;;);': {
-            type: 'ForStatement',
-            init: {
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [8, 9],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 9 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 0,
-                        raw: '0',
-                        range: [12, 13],
-                        loc: {
-                            start: { line: 1, column: 12 },
-                            end: { line: 1, column: 13 }
-                        }
-                    },
-                    range: [8, 13],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 13 }
-                    }
-                }],
-                kind: 'var',
-                range: [4, 13],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            test: null,
-            update: null,
-            body: {
-                type: 'EmptyStatement',
-                range: [16, 17],
-                loc: {
-                    start: { line: 1, column: 16 },
-                    end: { line: 1, column: 17 }
-                }
-            },
-            range: [0, 17],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 17 }
-            }
-        },
-
-        'for(let x = 0;;);': {
-            type: 'ForStatement',
-            init: {
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [8, 9],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 9 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 0,
-                        raw: '0',
-                        range: [12, 13],
-                        loc: {
-                            start: { line: 1, column: 12 },
-                            end: { line: 1, column: 13 }
-                        }
-                    },
-                    range: [8, 13],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 13 }
-                    }
-                }],
-                kind: 'let',
-                range: [4, 13],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            test: null,
-            update: null,
-            body: {
-                type: 'EmptyStatement',
-                range: [16, 17],
-                loc: {
-                    start: { line: 1, column: 16 },
-                    end: { line: 1, column: 17 }
-                }
-            },
-            range: [0, 17],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 17 }
-            }
-        },
-
-        'for(var x = 0, y = 1;;);': {
-            type: 'ForStatement',
-            init: {
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [8, 9],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 9 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 0,
-                        raw: '0',
-                        range: [12, 13],
-                        loc: {
-                            start: { line: 1, column: 12 },
-                            end: { line: 1, column: 13 }
-                        }
-                    },
-                    range: [8, 13],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 13 }
-                    }
-                }, {
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [15, 16],
-                        loc: {
-                            start: { line: 1, column: 15 },
-                            end: { line: 1, column: 16 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 1,
-                        raw: '1',
-                        range: [19, 20],
-                        loc: {
-                            start: { line: 1, column: 19 },
-                            end: { line: 1, column: 20 }
-                        }
-                    },
-                    range: [15, 20],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 20 }
-                    }
-                }],
-                kind: 'var',
-                range: [4, 20],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 20 }
-                }
-            },
-            test: null,
-            update: null,
-            body: {
-                type: 'EmptyStatement',
-                range: [23, 24],
-                loc: {
-                    start: { line: 1, column: 23 },
-                    end: { line: 1, column: 24 }
-                }
-            },
-            range: [0, 24],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 24 }
-            }
-        },
-
-        'for(x = 0; x < 42;);': {
-            type: 'ForStatement',
-            init: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 0,
-                    raw: '0',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [4, 9],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            test: {
-                type: 'BinaryExpression',
-                operator: '<',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [11, 12],
-                    loc: {
-                        start: { line: 1, column: 11 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [15, 17],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 17 }
-                    }
-                },
-                range: [11, 17],
-                loc: {
-                    start: { line: 1, column: 11 },
-                    end: { line: 1, column: 17 }
-                }
-            },
-            update: null,
-            body: {
-                type: 'EmptyStatement',
-                range: [19, 20],
-                loc: {
-                    start: { line: 1, column: 19 },
-                    end: { line: 1, column: 20 }
-                }
-            },
-            range: [0, 20],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 20 }
-            }
-        },
-
-        'for(x = 0; x < 42; x++);': {
-            type: 'ForStatement',
-            init: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 0,
-                    raw: '0',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [4, 9],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            test: {
-                type: 'BinaryExpression',
-                operator: '<',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [11, 12],
-                    loc: {
-                        start: { line: 1, column: 11 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [15, 17],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 17 }
-                    }
-                },
-                range: [11, 17],
-                loc: {
-                    start: { line: 1, column: 11 },
-                    end: { line: 1, column: 17 }
-                }
-            },
-            update: {
-                type: 'UpdateExpression',
-                operator: '++',
-                argument: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [19, 20],
-                    loc: {
-                        start: { line: 1, column: 19 },
-                        end: { line: 1, column: 20 }
-                    }
-                },
-                prefix: false,
-                range: [19, 22],
-                loc: {
-                    start: { line: 1, column: 19 },
-                    end: { line: 1, column: 22 }
-                }
-            },
-            body: {
-                type: 'EmptyStatement',
-                range: [23, 24],
-                loc: {
-                    start: { line: 1, column: 23 },
-                    end: { line: 1, column: 24 }
-                }
-            },
-            range: [0, 24],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 24 }
-            }
-        },
-
-        'for(x = 0; x < 42; x++) process(x);': {
-            type: 'ForStatement',
-            init: {
-                type: 'AssignmentExpression',
-                operator: '=',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 0,
-                    raw: '0',
-                    range: [8, 9],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                range: [4, 9],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            test: {
-                type: 'BinaryExpression',
-                operator: '<',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [11, 12],
-                    loc: {
-                        start: { line: 1, column: 11 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                right: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [15, 17],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 17 }
-                    }
-                },
-                range: [11, 17],
-                loc: {
-                    start: { line: 1, column: 11 },
-                    end: { line: 1, column: 17 }
-                }
-            },
-            update: {
-                type: 'UpdateExpression',
-                operator: '++',
-                argument: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [19, 20],
-                    loc: {
-                        start: { line: 1, column: 19 },
-                        end: { line: 1, column: 20 }
-                    }
-                },
-                prefix: false,
-                range: [19, 22],
-                loc: {
-                    start: { line: 1, column: 19 },
-                    end: { line: 1, column: 22 }
-                }
-            },
-            body: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'process',
-                        range: [24, 31],
-                        loc: {
-                            start: { line: 1, column: 24 },
-                            end: { line: 1, column: 31 }
-                        }
-                    },
-                    'arguments': [{
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [32, 33],
-                        loc: {
-                            start: { line: 1, column: 32 },
-                            end: { line: 1, column: 33 }
-                        }
-                    }],
-                    range: [24, 34],
-                    loc: {
-                        start: { line: 1, column: 24 },
-                        end: { line: 1, column: 34 }
-                    }
-                },
-                range: [24, 35],
-                loc: {
-                    start: { line: 1, column: 24 },
-                    end: { line: 1, column: 35 }
-                }
-            },
-            range: [0, 35],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 35 }
-            }
-        },
-
-        'for(x in list) process(x);': {
-            type: 'ForInStatement',
-            left: {
-                type: 'Identifier',
-                name: 'x',
-                range: [4, 5],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            right: {
-                type: 'Identifier',
-                name: 'list',
-                range: [9, 13],
-                loc: {
-                    start: { line: 1, column: 9 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            body: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'process',
-                        range: [15, 22],
-                        loc: {
-                            start: { line: 1, column: 15 },
-                            end: { line: 1, column: 22 }
-                        }
-                    },
-                    'arguments': [{
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [23, 24],
-                        loc: {
-                            start: { line: 1, column: 23 },
-                            end: { line: 1, column: 24 }
-                        }
-                    }],
-                    range: [15, 25],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 25 }
-                    }
-                },
-                range: [15, 26],
-                loc: {
-                    start: { line: 1, column: 15 },
-                    end: { line: 1, column: 26 }
-                }
-            },
-            each: false,
-            range: [0, 26],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 26 }
-            }
-        },
-
-        'for (var x in list) process(x);': {
-            type: 'ForInStatement',
-            left: {
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [9, 10],
-                        loc: {
-                            start: { line: 1, column: 9 },
-                            end: { line: 1, column: 10 }
-                        }
-                    },
-                    init: null,
-                    range: [9, 10],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 10 }
-                    }
-                }],
-                kind: 'var',
-                range: [5, 10],
-                loc: {
-                    start: { line: 1, column: 5 },
-                    end: { line: 1, column: 10 }
-                }
-            },
-            right: {
-                type: 'Identifier',
-                name: 'list',
-                range: [14, 18],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 18 }
-                }
-            },
-            body: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'process',
-                        range: [20, 27],
-                        loc: {
-                            start: { line: 1, column: 20 },
-                            end: { line: 1, column: 27 }
-                        }
-                    },
-                    'arguments': [{
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [28, 29],
-                        loc: {
-                            start: { line: 1, column: 28 },
-                            end: { line: 1, column: 29 }
-                        }
-                    }],
-                    range: [20, 30],
-                    loc: {
-                        start: { line: 1, column: 20 },
-                        end: { line: 1, column: 30 }
-                    }
-                },
-                range: [20, 31],
-                loc: {
-                    start: { line: 1, column: 20 },
-                    end: { line: 1, column: 31 }
-                }
-            },
-            each: false,
-            range: [0, 31],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 31 }
-            }
-        },
-
-        'for (var x = 42 in list) process(x);': {
-            type: 'ForInStatement',
-            left: {
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [9, 10],
-                        loc: {
-                            start: { line: 1, column: 9 },
-                            end: { line: 1, column: 10 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 42,
-                        raw: '42',
-                        range: [13, 15],
-                        loc: {
-                            start: { line: 1, column: 13 },
-                            end: { line: 1, column: 15 }
-                        }
-                    },
-                    range: [9, 15],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 15 }
-                    }
-                }],
-                kind: 'var',
-                range: [5, 15],
-                loc: {
-                    start: { line: 1, column: 5 },
-                    end: { line: 1, column: 15 }
-                }
-            },
-            right: {
-                type: 'Identifier',
-                name: 'list',
-                range: [19, 23],
-                loc: {
-                    start: { line: 1, column: 19 },
-                    end: { line: 1, column: 23 }
-                }
-            },
-            body: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'process',
-                        range: [25, 32],
-                        loc: {
-                            start: { line: 1, column: 25 },
-                            end: { line: 1, column: 32 }
-                        }
-                    },
-                    'arguments': [{
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [33, 34],
-                        loc: {
-                            start: { line: 1, column: 33 },
-                            end: { line: 1, column: 34 }
-                        }
-                    }],
-                    range: [25, 35],
-                    loc: {
-                        start: { line: 1, column: 25 },
-                        end: { line: 1, column: 35 }
-                    }
-                },
-                range: [25, 36],
-                loc: {
-                    start: { line: 1, column: 25 },
-                    end: { line: 1, column: 36 }
-                }
-            },
-            each: false,
-            range: [0, 36],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 36 }
-            }
-        },
-
-        'for (let x in list) process(x);': {
-            type: 'ForInStatement',
-            left: {
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [9, 10],
-                        loc: {
-                            start: { line: 1, column: 9 },
-                            end: { line: 1, column: 10 }
-                        }
-                    },
-                    init: null,
-                    range: [9, 10],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 10 }
-                    }
-                }],
-                kind: 'let',
-                range: [5, 10],
-                loc: {
-                    start: { line: 1, column: 5 },
-                    end: { line: 1, column: 10 }
-                }
-            },
-            right: {
-                type: 'Identifier',
-                name: 'list',
-                range: [14, 18],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 18 }
-                }
-            },
-            body: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'process',
-                        range: [20, 27],
-                        loc: {
-                            start: { line: 1, column: 20 },
-                            end: { line: 1, column: 27 }
-                        }
-                    },
-                    'arguments': [{
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [28, 29],
-                        loc: {
-                            start: { line: 1, column: 28 },
-                            end: { line: 1, column: 29 }
-                        }
-                    }],
-                    range: [20, 30],
-                    loc: {
-                        start: { line: 1, column: 20 },
-                        end: { line: 1, column: 30 }
-                    }
-                },
-                range: [20, 31],
-                loc: {
-                    start: { line: 1, column: 20 },
-                    end: { line: 1, column: 31 }
-                }
-            },
-            each: false,
-            range: [0, 31],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 31 }
-            }
-        },
-
-        'for (let x = 42 in list) process(x);': {
-            type: 'ForInStatement',
-            left: {
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [9, 10],
-                        loc: {
-                            start: { line: 1, column: 9 },
-                            end: { line: 1, column: 10 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 42,
-                        raw: '42',
-                        range: [13, 15],
-                        loc: {
-                            start: { line: 1, column: 13 },
-                            end: { line: 1, column: 15 }
-                        }
-                    },
-                    range: [9, 15],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 15 }
-                    }
-                }],
-                kind: 'let',
-                range: [5, 15],
-                loc: {
-                    start: { line: 1, column: 5 },
-                    end: { line: 1, column: 15 }
-                }
-            },
-            right: {
-                type: 'Identifier',
-                name: 'list',
-                range: [19, 23],
-                loc: {
-                    start: { line: 1, column: 19 },
-                    end: { line: 1, column: 23 }
-                }
-            },
-            body: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'process',
-                        range: [25, 32],
-                        loc: {
-                            start: { line: 1, column: 25 },
-                            end: { line: 1, column: 32 }
-                        }
-                    },
-                    'arguments': [{
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [33, 34],
-                        loc: {
-                            start: { line: 1, column: 33 },
-                            end: { line: 1, column: 34 }
-                        }
-                    }],
-                    range: [25, 35],
-                    loc: {
-                        start: { line: 1, column: 25 },
-                        end: { line: 1, column: 35 }
-                    }
-                },
-                range: [25, 36],
-                loc: {
-                    start: { line: 1, column: 25 },
-                    end: { line: 1, column: 36 }
-                }
-            },
-            each: false,
-            range: [0, 36],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 36 }
-            }
-        },
-
-        'for (var i = function() { return 10 in [] } in list) process(x);': {
-            type: 'ForInStatement',
-            left: {
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'i',
-                        range: [9, 10],
-                        loc: {
-                            start: { line: 1, column: 9 },
-                            end: { line: 1, column: 10 }
-                        }
-                    },
-                    init: {
-                        type: 'FunctionExpression',
-                        id: null,
-                        params: [],
-                        defaults: [],
-                        body: {
-                            type: 'BlockStatement',
-                            body: [{
-                                type: 'ReturnStatement',
-                                argument: {
-                                    type: 'BinaryExpression',
-                                    operator: 'in',
-                                    left: {
-                                        type: 'Literal',
-                                        value: 10,
-                                        raw: '10',
-                                        range: [33, 35],
-                                        loc: {
-                                            start: { line: 1, column: 33 },
-                                            end: { line: 1, column: 35 }
-                                        }
-                                    },
-                                    right: {
-                                        type: 'ArrayExpression',
-                                        elements: [],
-                                        range: [39, 41],
-                                        loc: {
-                                            start: { line: 1, column: 39 },
-                                            end: { line: 1, column: 41 }
-                                        }
-                                    },
-                                    range: [33, 41],
-                                    loc: {
-                                        start: { line: 1, column: 33 },
-                                        end: { line: 1, column: 41 }
-                                    }
-                                },
-                                range: [26, 42],
-                                loc: {
-                                    start: { line: 1, column: 26 },
-                                    end: { line: 1, column: 42 }
-                                }
-                            }],
-                            range: [24, 43],
-                            loc: {
-                                start: { line: 1, column: 24 },
-                                end: { line: 1, column: 43 }
-                            }
-                        },
-                        rest: null,
-                        generator: false,
-                        expression: false,
-                        range: [13, 43],
-                        loc: {
-                            start: { line: 1, column: 13 },
-                            end: { line: 1, column: 43 }
-                        }
-                    },
-                    range: [9, 43],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 43 }
-                    }
-                }],
-                kind: 'var',
-                range: [5, 43],
-                loc: {
-                    start: { line: 1, column: 5 },
-                    end: { line: 1, column: 43 }
-                }
-            },
-            right: {
-                type: 'Identifier',
-                name: 'list',
-                range: [47, 51],
-                loc: {
-                    start: { line: 1, column: 47 },
-                    end: { line: 1, column: 51 }
-                }
-            },
-            body: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'Identifier',
-                        name: 'process',
-                        range: [53, 60],
-                        loc: {
-                            start: { line: 1, column: 53 },
-                            end: { line: 1, column: 60 }
-                        }
-                    },
-                    'arguments': [{
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [61, 62],
-                        loc: {
-                            start: { line: 1, column: 61 },
-                            end: { line: 1, column: 62 }
-                        }
-                    }],
-                    range: [53, 63],
-                    loc: {
-                        start: { line: 1, column: 53 },
-                        end: { line: 1, column: 63 }
-                    }
-                },
-                range: [53, 64],
-                loc: {
-                    start: { line: 1, column: 53 },
-                    end: { line: 1, column: 64 }
-                }
-            },
-            each: false,
-            range: [0, 64],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 64 }
-            }
-        }
-
-    },
-
-    'continue statement': {
-
-        'while (true) { continue; }': {
-            type: 'WhileStatement',
-            test: {
-                type: 'Literal',
-                value: true,
-                raw: 'true',
-                range: [7, 11],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            body: {
-                type: 'BlockStatement',
-                body: [
-                    {
-                        type: 'ContinueStatement',
-                        label: null,
-                        range: [15, 24],
-                        loc: {
-                            start: { line: 1, column: 15 },
-                            end: { line: 1, column: 24 }
-                        }
-                    }
-                ],
-                range: [13, 26],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 1, column: 26 }
-                }
-            },
-            range: [0, 26],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 26 }
-            }
-        },
-
-        'while (true) { continue }': {
-            type: 'WhileStatement',
-            test: {
-                type: 'Literal',
-                value: true,
-                raw: 'true',
-                range: [7, 11],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            body: {
-                type: 'BlockStatement',
-                body: [
-                    {
-                        type: 'ContinueStatement',
-                        label: null,
-                        range: [15, 24],
-                        loc: {
-                            start: { line: 1, column: 15 },
-                            end: { line: 1, column: 24 }
-                        }
-                    }
-                ],
-                range: [13, 25],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 1, column: 25 }
-                }
-            },
-            range: [0, 25],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 25 }
-            }
-        },
-
-        'done: while (true) { continue done }': {
-            type: 'LabeledStatement',
-            label: {
-                type: 'Identifier',
-                name: 'done',
-                range: [0, 4],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 4 }
-                }
-            },
-            body: {
-                type: 'WhileStatement',
-                test: {
-                    type: 'Literal',
-                    value: true,
-                    raw: 'true',
-                    range: [13, 17],
-                    loc: {
-                        start: { line: 1, column: 13 },
-                        end: { line: 1, column: 17 }
-                    }
-                },
-                body: {
-                    type: 'BlockStatement',
-                    body: [
-                        {
-                            type: 'ContinueStatement',
-                            label: {
-                                type: 'Identifier',
-                                name: 'done',
-                                range: [30, 34],
-                                loc: {
-                                    start: { line: 1, column: 30 },
-                                    end: { line: 1, column: 34 }
-                                }
-                            },
-                            range: [21, 35],
-                            loc: {
-                                start: { line: 1, column: 21 },
-                                end: { line: 1, column: 35 }
-                            }
-                        }
-                    ],
-                    range: [19, 36],
-                    loc: {
-                        start: { line: 1, column: 19 },
-                        end: { line: 1, column: 36 }
-                    }
-                },
-                range: [6, 36],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 36 }
-                }
-            },
-            range: [0, 36],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 36 }
-            }
-        },
-
-        'done: while (true) { continue done; }': {
-            type: 'LabeledStatement',
-            label: {
-                type: 'Identifier',
-                name: 'done',
-                range: [0, 4],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 4 }
-                }
-            },
-            body: {
-                type: 'WhileStatement',
-                test: {
-                    type: 'Literal',
-                    value: true,
-                    raw: 'true',
-                    range: [13, 17],
-                    loc: {
-                        start: { line: 1, column: 13 },
-                        end: { line: 1, column: 17 }
-                    }
-                },
-                body: {
-                    type: 'BlockStatement',
-                    body: [
-                        {
-                            type: 'ContinueStatement',
-                            label: {
-                                type: 'Identifier',
-                                name: 'done',
-                                range: [30, 34],
-                                loc: {
-                                    start: { line: 1, column: 30 },
-                                    end: { line: 1, column: 34 }
-                                }
-                            },
-                            range: [21, 35],
-                            loc: {
-                                start: { line: 1, column: 21 },
-                                end: { line: 1, column: 35 }
-                            }
-                        }
-                    ],
-                    range: [19, 37],
-                    loc: {
-                        start: { line: 1, column: 19 },
-                        end: { line: 1, column: 37 }
-                    }
-                },
-                range: [6, 37],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 37 }
-                }
-            },
-            range: [0, 37],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 37 }
-            }
-        }
-
-    },
-
-    'break statement': {
-
-        'while (true) { break }': {
-            type: 'WhileStatement',
-            test: {
-                type: 'Literal',
-                value: true,
-                raw: 'true',
-                range: [7, 11],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            body: {
-                type: 'BlockStatement',
-                body: [
-                    {
-                        type: 'BreakStatement',
-                        label: null,
-                        range: [15, 21],
-                        loc: {
-                            start: { line: 1, column: 15 },
-                            end: { line: 1, column: 21 }
-                        }
-                    }
-                ],
-                range: [13, 22],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 1, column: 22 }
-                }
-            },
-            range: [0, 22],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 22 }
-            }
-        },
-
-        'done: while (true) { break done }': {
-            type: 'LabeledStatement',
-            label: {
-                type: 'Identifier',
-                name: 'done',
-                range: [0, 4],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 4 }
-                }
-            },
-            body: {
-                type: 'WhileStatement',
-                test: {
-                    type: 'Literal',
-                    value: true,
-                    raw: 'true',
-                    range: [13, 17],
-                    loc: {
-                        start: { line: 1, column: 13 },
-                        end: { line: 1, column: 17 }
-                    }
-                },
-                body: {
-                    type: 'BlockStatement',
-                    body: [
-                        {
-                            type: 'BreakStatement',
-                            label: {
-                                type: 'Identifier',
-                                name: 'done',
-                                range: [27, 31],
-                                loc: {
-                                    start: { line: 1, column: 27 },
-                                    end: { line: 1, column: 31 }
-                                }
-                            },
-                            range: [21, 32],
-                            loc: {
-                                start: { line: 1, column: 21 },
-                                end: { line: 1, column: 32 }
-                            }
-                        }
-                    ],
-                    range: [19, 33],
-                    loc: {
-                        start: { line: 1, column: 19 },
-                        end: { line: 1, column: 33 }
-                    }
-                },
-                range: [6, 33],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 33 }
-                }
-            },
-            range: [0, 33],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 33 }
-            }
-        },
-
-        'done: while (true) { break done; }': {
-            type: 'LabeledStatement',
-            label: {
-                type: 'Identifier',
-                name: 'done',
-                range: [0, 4],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 4 }
-                }
-            },
-            body: {
-                type: 'WhileStatement',
-                test: {
-                    type: 'Literal',
-                    value: true,
-                    raw: 'true',
-                    range: [13, 17],
-                    loc: {
-                        start: { line: 1, column: 13 },
-                        end: { line: 1, column: 17 }
-                    }
-                },
-                body: {
-                    type: 'BlockStatement',
-                    body: [
-                        {
-                            type: 'BreakStatement',
-                            label: {
-                                type: 'Identifier',
-                                name: 'done',
-                                range: [27, 31],
-                                loc: {
-                                    start: { line: 1, column: 27 },
-                                    end: { line: 1, column: 31 }
-                                }
-                            },
-                            range: [21, 32],
-                            loc: {
-                                start: { line: 1, column: 21 },
-                                end: { line: 1, column: 32 }
-                            }
-                        }
-                    ],
-                    range: [19, 34],
-                    loc: {
-                        start: { line: 1, column: 19 },
-                        end: { line: 1, column: 34 }
-                    }
-                },
-                range: [6, 34],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 34 }
-                }
-            },
-            range: [0, 34],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 34 }
-            }
-        }
-
-    },
-
-    'return statement': {
-
-        '(function(){ return })': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'FunctionExpression',
-                id: null,
-                params: [],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [
-                        {
-                            type: 'ReturnStatement',
-                            argument: null,
-                            range: [13, 20],
-                            loc: {
-                                start: { line: 1, column: 13 },
-                                end: { line: 1, column: 20 }
-                            }
-                        }
-                    ],
-                    range: [11, 21],
-                    loc: {
-                        start: { line: 1, column: 11 },
-                        end: { line: 1, column: 21 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [1, 21],
-                loc: {
-                    start: { line: 1, column: 1 },
-                    end: { line: 1, column: 21 }
-                }
-            },
-            range: [0, 22],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 22 }
-            }
-        },
-
-        '(function(){ return; })': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'FunctionExpression',
-                id: null,
-                params: [],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [
-                        {
-                            type: 'ReturnStatement',
-                            argument: null,
-                            range: [13, 20],
-                            loc: {
-                                start: { line: 1, column: 13 },
-                                end: { line: 1, column: 20 }
-                            }
-                        }
-                    ],
-                    range: [11, 22],
-                    loc: {
-                        start: { line: 1, column: 11 },
-                        end: { line: 1, column: 22 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [1, 22],
-                loc: {
-                    start: { line: 1, column: 1 },
-                    end: { line: 1, column: 22 }
-                }
-            },
-            range: [0, 23],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 23 }
-            }
-        },
-
-        '(function(){ return x; })': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'FunctionExpression',
-                id: null,
-                params: [],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [
-                        {
-                            type: 'ReturnStatement',
-                            argument: {
-                                type: 'Identifier',
-                                name: 'x',
-                                range: [20, 21],
-                                loc: {
-                                    start: { line: 1, column: 20 },
-                                    end: { line: 1, column: 21 }
-                                }
-                            },
-                            range: [13, 22],
-                            loc: {
-                                start: { line: 1, column: 13 },
-                                end: { line: 1, column: 22 }
-                            }
-                        }
-                    ],
-                    range: [11, 24],
-                    loc: {
-                        start: { line: 1, column: 11 },
-                        end: { line: 1, column: 24 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [1, 24],
-                loc: {
-                    start: { line: 1, column: 1 },
-                    end: { line: 1, column: 24 }
-                }
-            },
-            range: [0, 25],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 25 }
-            }
-        },
-
-        '(function(){ return x * y })': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'FunctionExpression',
-                id: null,
-                params: [],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [
-                        {
-                            type: 'ReturnStatement',
-                            argument: {
-                                type: 'BinaryExpression',
-                                operator: '*',
-                                left: {
-                                    type: 'Identifier',
-                                    name: 'x',
-                                    range: [20, 21],
-                                    loc: {
-                                        start: { line: 1, column: 20 },
-                                        end: { line: 1, column: 21 }
-                                    }
-                                },
-                                right: {
-                                    type: 'Identifier',
-                                    name: 'y',
-                                    range: [24, 25],
-                                    loc: {
-                                        start: { line: 1, column: 24 },
-                                        end: { line: 1, column: 25 }
-                                    }
-                                },
-                                range: [20, 25],
-                                loc: {
-                                    start: { line: 1, column: 20 },
-                                    end: { line: 1, column: 25 }
-                                }
-                            },
-                            range: [13, 26],
-                            loc: {
-                                start: { line: 1, column: 13 },
-                                end: { line: 1, column: 26 }
-                            }
-                        }
-                    ],
-                    range: [11, 27],
-                    loc: {
-                        start: { line: 1, column: 11 },
-                        end: { line: 1, column: 27 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [1, 27],
-                loc: {
-                    start: { line: 1, column: 1 },
-                    end: { line: 1, column: 27 }
-                }
-            },
-            range: [0, 28],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 28 }
-            }
-        }
-    },
-
-    'with statement': {
-
-        'with (x) foo = bar': {
-            type: 'WithStatement',
-            object: {
-                type: 'Identifier',
-                name: 'x',
-                range: [6, 7],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            body: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'AssignmentExpression',
-                    operator: '=',
-                    left: {
-                        type: 'Identifier',
-                        name: 'foo',
-                        range: [9, 12],
-                        loc: {
-                            start: { line: 1, column: 9 },
-                            end: { line: 1, column: 12 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'bar',
-                        range: [15, 18],
-                        loc: {
-                            start: { line: 1, column: 15 },
-                            end: { line: 1, column: 18 }
-                        }
-                    },
-                    range: [9, 18],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 18 }
-                    }
-                },
-                range: [9, 18],
-                loc: {
-                    start: { line: 1, column: 9 },
-                    end: { line: 1, column: 18 }
-                }
-            },
-            range: [0, 18],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 18 }
-            }
-        },
-
-        'with (x) foo = bar;': {
-            type: 'WithStatement',
-            object: {
-                type: 'Identifier',
-                name: 'x',
-                range: [6, 7],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            body: {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'AssignmentExpression',
-                    operator: '=',
-                    left: {
-                        type: 'Identifier',
-                        name: 'foo',
-                        range: [9, 12],
-                        loc: {
-                            start: { line: 1, column: 9 },
-                            end: { line: 1, column: 12 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'bar',
-                        range: [15, 18],
-                        loc: {
-                            start: { line: 1, column: 15 },
-                            end: { line: 1, column: 18 }
-                        }
-                    },
-                    range: [9, 18],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 18 }
-                    }
-                },
-                range: [9, 19],
-                loc: {
-                    start: { line: 1, column: 9 },
-                    end: { line: 1, column: 19 }
-                }
-            },
-            range: [0, 19],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 19 }
-            }
-        },
-
-        'with (x) { foo = bar }': {
-            type: 'WithStatement',
-            object: {
-                type: 'Identifier',
-                name: 'x',
-                range: [6, 7],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            body: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'AssignmentExpression',
-                        operator: '=',
-                        left: {
-                            type: 'Identifier',
-                            name: 'foo',
-                            range: [11, 14],
-                            loc: {
-                                start: { line: 1, column: 11 },
-                                end: { line: 1, column: 14 }
-                            }
-                        },
-                        right: {
-                            type: 'Identifier',
-                            name: 'bar',
-                            range: [17, 20],
-                            loc: {
-                                start: { line: 1, column: 17 },
-                                end: { line: 1, column: 20 }
-                            }
-                        },
-                        range: [11, 20],
-                        loc: {
-                            start: { line: 1, column: 11 },
-                            end: { line: 1, column: 20 }
-                        }
-                    },
-                    range: [11, 21],
-                    loc: {
-                        start: { line: 1, column: 11 },
-                        end: { line: 1, column: 21 }
-                    }
-                }],
-                range: [9, 22],
-                loc: {
-                    start: { line: 1, column: 9 },
-                    end: { line: 1, column: 22 }
-                }
-            },
-            range: [0, 22],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 22 }
-            }
-        }
-
-    },
-
-    'switch statement': {
-
-        'switch (x) {}': {
-            type: 'SwitchStatement',
-            discriminant: {
-                type: 'Identifier',
-                name: 'x',
-                range: [8, 9],
-                loc: {
-                    start: { line: 1, column: 8 },
-                    end: { line: 1, column: 9 }
-                }
-            },
-            cases:[],
-            range: [0, 13],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 13 }
-            }
-        },
-
-        'switch (answer) { case 42: hi(); break; }': {
-            type: 'SwitchStatement',
-            discriminant: {
-                type: 'Identifier',
-                name: 'answer',
-                range: [8, 14],
-                loc: {
-                    start: { line: 1, column: 8 },
-                    end: { line: 1, column: 14 }
-                }
-            },
-            cases: [{
-                type: 'SwitchCase',
-                test: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [23, 25],
-                    loc: {
-                        start: { line: 1, column: 23 },
-                        end: { line: 1, column: 25 }
-                    }
-                },
-                consequent: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'CallExpression',
-                        callee: {
-                            type: 'Identifier',
-                            name: 'hi',
-                            range: [27, 29],
-                            loc: {
-                                start: { line: 1, column: 27 },
-                                end: { line: 1, column: 29 }
-                            }
-                        },
-                        'arguments': [],
-                        range: [27, 31],
-                        loc: {
-                            start: { line: 1, column: 27 },
-                            end: { line: 1, column: 31 }
-                        }
-                    },
-                    range: [27, 32],
-                    loc: {
-                        start: { line: 1, column: 27 },
-                        end: { line: 1, column: 32 }
-                    }
-                }, {
-                    type: 'BreakStatement',
-                    label: null,
-                    range: [33, 39],
-                    loc: {
-                        start: { line: 1, column: 33 },
-                        end: { line: 1, column: 39 }
-                    }
-                }],
-                range: [18, 39],
-                loc: {
-                    start: { line: 1, column: 18 },
-                    end: { line: 1, column: 39 }
-                }
-            }],
-            range: [0, 41],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 41 }
-            }
-        },
-
-        'switch (answer) { case 42: hi(); break; default: break }': {
-            type: 'SwitchStatement',
-            discriminant: {
-                type: 'Identifier',
-                name: 'answer',
-                range: [8, 14],
-                loc: {
-                    start: { line: 1, column: 8 },
-                    end: { line: 1, column: 14 }
-                }
-            },
-            cases: [{
-                type: 'SwitchCase',
-                test: {
-                    type: 'Literal',
-                    value: 42,
-                    raw: '42',
-                    range: [23, 25],
-                    loc: {
-                        start: { line: 1, column: 23 },
-                        end: { line: 1, column: 25 }
-                    }
-                },
-                consequent: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'CallExpression',
-                        callee: {
-                            type: 'Identifier',
-                            name: 'hi',
-                            range: [27, 29],
-                            loc: {
-                                start: { line: 1, column: 27 },
-                                end: { line: 1, column: 29 }
-                            }
-                        },
-                        'arguments': [],
-                        range: [27, 31],
-                        loc: {
-                            start: { line: 1, column: 27 },
-                            end: { line: 1, column: 31 }
-                        }
-                    },
-                    range: [27, 32],
-                    loc: {
-                        start: { line: 1, column: 27 },
-                        end: { line: 1, column: 32 }
-                    }
-                }, {
-                    type: 'BreakStatement',
-                    label: null,
-                    range: [33, 39],
-                    loc: {
-                        start: { line: 1, column: 33 },
-                        end: { line: 1, column: 39 }
-                    }
-                }],
-                range: [18, 39],
-                loc: {
-                    start: { line: 1, column: 18 },
-                    end: { line: 1, column: 39 }
-                }
-            }, {
-                type: 'SwitchCase',
-                test: null,
-                consequent: [{
-                    type: 'BreakStatement',
-                    label: null,
-                    range: [49, 55],
-                    loc: {
-                        start: { line: 1, column: 49 },
-                        end: { line: 1, column: 55 }
-                    }
-                }],
-                range: [40, 55],
-                loc: {
-                    start: { line: 1, column: 40 },
-                    end: { line: 1, column: 55 }
-                }
-            }],
-            range: [0, 56],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 56 }
-            }
-        }
-
-    },
-
-    'Labelled Statements': {
-
-        'start: for (;;) break start': {
-            type: 'LabeledStatement',
-            label: {
-                type: 'Identifier',
-                name: 'start',
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            body: {
-                type: 'ForStatement',
-                init: null,
-                test: null,
-                update: null,
-                body: {
-                    type: 'BreakStatement',
-                    label: {
-                        type: 'Identifier',
-                        name: 'start',
-                        range: [22, 27],
-                        loc: {
-                            start: { line: 1, column: 22 },
-                            end: { line: 1, column: 27 }
-                        }
-                    },
-                    range: [16, 27],
-                    loc: {
-                        start: { line: 1, column: 16 },
-                        end: { line: 1, column: 27 }
-                    }
-                },
-                range: [7, 27],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 27 }
-                }
-            },
-            range: [0, 27],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 27 }
-            }
-        },
-
-        'start: while (true) break start': {
-            type: 'LabeledStatement',
-            label: {
-                type: 'Identifier',
-                name: 'start',
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            },
-            body: {
-                type: 'WhileStatement',
-                test: {
-                    type: 'Literal',
-                    value: true,
-                    raw: 'true',
-                    range: [14, 18],
-                    loc: {
-                        start: { line: 1, column: 14 },
-                        end: { line: 1, column: 18 }
-                    }
-                },
-                body: {
-                    type: 'BreakStatement',
-                    label: {
-                        type: 'Identifier',
-                        name: 'start',
-                        range: [26, 31],
-                        loc: {
-                            start: { line: 1, column: 26 },
-                            end: { line: 1, column: 31 }
-                        }
-                    },
-                    range: [20, 31],
-                    loc: {
-                        start: { line: 1, column: 20 },
-                        end: { line: 1, column: 31 }
-                    }
-                },
-                range: [7, 31],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 31 }
-                }
-            },
-            range: [0, 31],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 31 }
-            }
-        }
-
-    },
-
-    'throw statement': {
-
-        'throw x;': {
-            type: 'ThrowStatement',
-            argument: {
-                type: 'Identifier',
-                name: 'x',
-                range: [6, 7],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            range: [0, 8],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 8 }
-            }
-        },
-
-        'throw x * y': {
-            type: 'ThrowStatement',
-            argument: {
-                type: 'BinaryExpression',
-                operator: '*',
-                left: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [6, 7],
-                    loc: {
-                        start: { line: 1, column: 6 },
-                        end: { line: 1, column: 7 }
-                    }
-                },
-                right: {
-                    type: 'Identifier',
-                    name: 'y',
-                    range: [10, 11],
-                    loc: {
-                        start: { line: 1, column: 10 },
-                        end: { line: 1, column: 11 }
-                    }
-                },
-                range: [6, 11],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            range: [0, 11],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 11 }
-            }
-        },
-
-        'throw { message: "Error" }': {
-            type: 'ThrowStatement',
-            argument: {
-                type: 'ObjectExpression',
-                properties: [{
-                    type: 'Property',
-                    key: {
-                        type: 'Identifier',
-                        name: 'message',
-                        range: [8, 15],
-                        loc: {
-                            start: { line: 1, column: 8 },
-                            end: { line: 1, column: 15 }
-                        }
-                    },
-                    value: {
-                        type: 'Literal',
-                        value: 'Error',
-                        raw: '"Error"',
-                        range: [17, 24],
-                        loc: {
-                            start: { line: 1, column: 17 },
-                            end: { line: 1, column: 24 }
-                        }
-                    },
-                    kind: 'init',
-                    range: [8, 24],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 24 }
-                    }
-                }],
-                range: [6, 26],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 26 }
-                }
-            },
-            range: [0, 26],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 26 }
-            }
-        }
-
-    },
-
-    'try statement': {
-
-        'try { } catch (e) { }': {
-            type: 'TryStatement',
-            block: {
-                type: 'BlockStatement',
-                body: [],
-                range: [4, 7],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            guardedHandlers: [],
-            handlers: [{
-                type: 'CatchClause',
-                param: {
-                    type: 'Identifier',
-                    name: 'e',
-                    range: [15, 16],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 16 }
-                    }
-                },
-                body: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [18, 21],
-                    loc: {
-                        start: { line: 1, column: 18 },
-                        end: { line: 1, column: 21 }
-                    }
-                },
-                range: [8, 21],
-                loc: {
-                    start: { line: 1, column: 8 },
-                    end: { line: 1, column: 21 }
-                }
-            }],
-            finalizer: null,
-            range: [0, 21],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 21 }
-            }
-        },
-
-        'try { } catch (eval) { }': {
-            type: 'TryStatement',
-            block: {
-                type: 'BlockStatement',
-                body: [],
-                range: [4, 7],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            guardedHandlers: [],
-            handlers: [{
-                type: 'CatchClause',
-                param: {
-                    type: 'Identifier',
-                    name: 'eval',
-                    range: [15, 19],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 19 }
-                    }
-                },
-                body: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [21, 24],
-                    loc: {
-                        start: { line: 1, column: 21 },
-                        end: { line: 1, column: 24 }
-                    }
-                },
-                range: [8, 24],
-                loc: {
-                    start: { line: 1, column: 8 },
-                    end: { line: 1, column: 24 }
-                }
-            }],
-            finalizer: null,
-            range: [0, 24],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 24 }
-            }
-        },
-
-        'try { } catch (arguments) { }': {
-            type: 'TryStatement',
-            block: {
-                type: 'BlockStatement',
-                body: [],
-                range: [4, 7],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            guardedHandlers: [],
-            handlers: [{
-                type: 'CatchClause',
-                param: {
-                    type: 'Identifier',
-                    name: 'arguments',
-                    range: [15, 24],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 24 }
-                    }
-                },
-                body: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [26, 29],
-                    loc: {
-                        start: { line: 1, column: 26 },
-                        end: { line: 1, column: 29 }
-                    }
-                },
-                range: [8, 29],
-                loc: {
-                    start: { line: 1, column: 8 },
-                    end: { line: 1, column: 29 }
-                }
-            }],
-            finalizer: null,
-            range: [0, 29],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 29 }
-            }
-        },
-
-        'try { } catch (e) { say(e) }': {
-            type: 'TryStatement',
-            block: {
-                type: 'BlockStatement',
-                body: [],
-                range: [4, 7],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            guardedHandlers: [],
-            handlers: [{
-                type: 'CatchClause',
-                param: {
-                    type: 'Identifier',
-                    name: 'e',
-                    range: [15, 16],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 16 }
-                    }
-                },
-                body: {
-                    type: 'BlockStatement',
-                    body: [{
-                        type: 'ExpressionStatement',
-                        expression: {
-                            type: 'CallExpression',
-                            callee: {
-                                type: 'Identifier',
-                                name: 'say',
-                                range: [20, 23],
-                                loc: {
-                                    start: { line: 1, column: 20 },
-                                    end: { line: 1, column: 23 }
-                                }
-                            },
-                            'arguments': [{
-                                type: 'Identifier',
-                                name: 'e',
-                                range: [24, 25],
-                                loc: {
-                                    start: { line: 1, column: 24 },
-                                    end: { line: 1, column: 25 }
-                                }
-                            }],
-                            range: [20, 26],
-                            loc: {
-                                start: { line: 1, column: 20 },
-                                end: { line: 1, column: 26 }
-                            }
-                        },
-                        range: [20, 27],
-                        loc: {
-                            start: { line: 1, column: 20 },
-                            end: { line: 1, column: 27 }
-                        }
-                    }],
-                    range: [18, 28],
-                    loc: {
-                        start: { line: 1, column: 18 },
-                        end: { line: 1, column: 28 }
-                    }
-                },
-                range: [8, 28],
-                loc: {
-                    start: { line: 1, column: 8 },
-                    end: { line: 1, column: 28 }
-                }
-            }],
-            finalizer: null,
-            range: [0, 28],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 28 }
-            }
-        },
-
-        'try { } finally { cleanup(stuff) }': {
-            type: 'TryStatement',
-            block: {
-                type: 'BlockStatement',
-                body: [],
-                range: [4, 7],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 7 }
-                }
-            },
-            guardedHandlers: [],
-            handlers: [],
-            finalizer: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'CallExpression',
-                        callee: {
-                            type: 'Identifier',
-                            name: 'cleanup',
-                            range: [18, 25],
-                            loc: {
-                                start: { line: 1, column: 18 },
-                                end: { line: 1, column: 25 }
-                            }
-                        },
-                        'arguments': [{
-                            type: 'Identifier',
-                            name: 'stuff',
-                            range: [26, 31],
-                            loc: {
-                                start: { line: 1, column: 26 },
-                                end: { line: 1, column: 31 }
-                            }
-                        }],
-                        range: [18, 32],
-                        loc: {
-                            start: { line: 1, column: 18 },
-                            end: { line: 1, column: 32 }
-                        }
-                    },
-                    range: [18, 33],
-                    loc: {
-                        start: { line: 1, column: 18 },
-                        end: { line: 1, column: 33 }
-                    }
-                }],
-                range: [16, 34],
-                loc: {
-                    start: { line: 1, column: 16 },
-                    end: { line: 1, column: 34 }
-                }
-            },
-            range: [0, 34],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 34 }
-            }
-        },
-
-        'try { doThat(); } catch (e) { say(e) }': {
-            type: 'TryStatement',
-            block: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'CallExpression',
-                        callee: {
-                            type: 'Identifier',
-                            name: 'doThat',
-                            range: [6, 12],
-                            loc: {
-                                start: { line: 1, column: 6 },
-                                end: { line: 1, column: 12 }
-                            }
-                        },
-                        'arguments': [],
-                        range: [6, 14],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 14 }
-                        }
-                    },
-                    range: [6, 15],
-                    loc: {
-                        start: { line: 1, column: 6 },
-                        end: { line: 1, column: 15 }
-                    }
-                }],
-                range: [4, 17],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 17 }
-                }
-            },
-            guardedHandlers: [],
-            handlers: [{
-                type: 'CatchClause',
-                param: {
-                    type: 'Identifier',
-                    name: 'e',
-                    range: [25, 26],
-                    loc: {
-                        start: { line: 1, column: 25 },
-                        end: { line: 1, column: 26 }
-                    }
-                },
-                body: {
-                    type: 'BlockStatement',
-                    body: [{
-                        type: 'ExpressionStatement',
-                        expression: {
-                            type: 'CallExpression',
-                            callee: {
-                                type: 'Identifier',
-                                name: 'say',
-                                range: [30, 33],
-                                loc: {
-                                    start: { line: 1, column: 30 },
-                                    end: { line: 1, column: 33 }
-                                }
-                            },
-                            'arguments': [{
-                                type: 'Identifier',
-                                name: 'e',
-                                range: [34, 35],
-                                loc: {
-                                    start: { line: 1, column: 34 },
-                                    end: { line: 1, column: 35 }
-                                }
-                            }],
-                            range: [30, 36],
-                            loc: {
-                                start: { line: 1, column: 30 },
-                                end: { line: 1, column: 36 }
-                            }
-                        },
-                        range: [30, 37],
-                        loc: {
-                            start: { line: 1, column: 30 },
-                            end: { line: 1, column: 37 }
-                        }
-                    }],
-                    range: [28, 38],
-                    loc: {
-                        start: { line: 1, column: 28 },
-                        end: { line: 1, column: 38 }
-                    }
-                },
-                range: [18, 38],
-                loc: {
-                    start: { line: 1, column: 18 },
-                    end: { line: 1, column: 38 }
-                }
-            }],
-            finalizer: null,
-            range: [0, 38],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 38 }
-            }
-        },
-
-        'try { doThat(); } catch (e) { say(e) } finally { cleanup(stuff) }': {
-            type: 'TryStatement',
-            block: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'CallExpression',
-                        callee: {
-                            type: 'Identifier',
-                            name: 'doThat',
-                            range: [6, 12],
-                            loc: {
-                                start: { line: 1, column: 6 },
-                                end: { line: 1, column: 12 }
-                            }
-                        },
-                        'arguments': [],
-                        range: [6, 14],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 14 }
-                        }
-                    },
-                    range: [6, 15],
-                    loc: {
-                        start: { line: 1, column: 6 },
-                        end: { line: 1, column: 15 }
-                    }
-                }],
-                range: [4, 17],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 17 }
-                }
-            },
-            guardedHandlers: [],
-            handlers: [{
-                type: 'CatchClause',
-                param: {
-                    type: 'Identifier',
-                    name: 'e',
-                    range: [25, 26],
-                    loc: {
-                        start: { line: 1, column: 25 },
-                        end: { line: 1, column: 26 }
-                    }
-                },
-                body: {
-                    type: 'BlockStatement',
-                    body: [{
-                        type: 'ExpressionStatement',
-                        expression: {
-                            type: 'CallExpression',
-                            callee: {
-                                type: 'Identifier',
-                                name: 'say',
-                                range: [30, 33],
-                                loc: {
-                                    start: { line: 1, column: 30 },
-                                    end: { line: 1, column: 33 }
-                                }
-                            },
-                            'arguments': [{
-                                type: 'Identifier',
-                                name: 'e',
-                                range: [34, 35],
-                                loc: {
-                                    start: { line: 1, column: 34 },
-                                    end: { line: 1, column: 35 }
-                                }
-                            }],
-                            range: [30, 36],
-                            loc: {
-                                start: { line: 1, column: 30 },
-                                end: { line: 1, column: 36 }
-                            }
-                        },
-                        range: [30, 37],
-                        loc: {
-                            start: { line: 1, column: 30 },
-                            end: { line: 1, column: 37 }
-                        }
-                    }],
-                    range: [28, 38],
-                    loc: {
-                        start: { line: 1, column: 28 },
-                        end: { line: 1, column: 38 }
-                    }
-                },
-                range: [18, 38],
-                loc: {
-                    start: { line: 1, column: 18 },
-                    end: { line: 1, column: 38 }
-                }
-            }],
-            finalizer: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'CallExpression',
-                        callee: {
-                            type: 'Identifier',
-                            name: 'cleanup',
-                            range: [49, 56],
-                            loc: {
-                                start: { line: 1, column: 49 },
-                                end: { line: 1, column: 56 }
-                            }
-                        },
-                        'arguments': [{
-                            type: 'Identifier',
-                            name: 'stuff',
-                            range: [57, 62],
-                            loc: {
-                                start: { line: 1, column: 57 },
-                                end: { line: 1, column: 62 }
-                            }
-                        }],
-                        range: [49, 63],
-                        loc: {
-                            start: { line: 1, column: 49 },
-                            end: { line: 1, column: 63 }
-                        }
-                    },
-                    range: [49, 64],
-                    loc: {
-                        start: { line: 1, column: 49 },
-                        end: { line: 1, column: 64 }
-                    }
-                }],
-                range: [47, 65],
-                loc: {
-                    start: { line: 1, column: 47 },
-                    end: { line: 1, column: 65 }
-                }
-            },
-            range: [0, 65],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 65 }
-            }
-        }
-
-    },
-
-    'debugger statement': {
-
-        'debugger;': {
-            type: 'DebuggerStatement',
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 9 }
-            }
-        }
-
-    },
-
-    'Function Definition': {
-
-        'function hello() { sayHi(); }': {
-            type: 'FunctionDeclaration',
-            id: {
-                type: 'Identifier',
-                name: 'hello',
-                range: [9, 14],
-                loc: {
-                    start: { line: 1, column: 9 },
-                    end: { line: 1, column: 14 }
-                }
-            },
-            params: [],
-            defaults: [],
-            body: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'CallExpression',
-                        callee: {
-                            type: 'Identifier',
-                            name: 'sayHi',
-                            range: [19, 24],
-                            loc: {
-                                start: { line: 1, column: 19 },
-                                end: { line: 1, column: 24 }
-                            }
-                        },
-                        'arguments': [],
-                        range: [19, 26],
-                        loc: {
-                            start: { line: 1, column: 19 },
-                            end: { line: 1, column: 26 }
-                        }
-                    },
-                    range: [19, 27],
-                    loc: {
-                        start: { line: 1, column: 19 },
-                        end: { line: 1, column: 27 }
-                    }
-                }],
-                range: [17, 29],
-                loc: {
-                    start: { line: 1, column: 17 },
-                    end: { line: 1, column: 29 }
-                }
-            },
-            rest: null,
-            generator: false,
-            expression: false,
-            range: [0, 29],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 29 }
-            }
-        },
-
-        'function eval() { }': {
-            type: 'FunctionDeclaration',
-            id: {
-                type: 'Identifier',
-                name: 'eval',
-                range: [9, 13],
-                loc: {
-                    start: { line: 1, column: 9 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            params: [],
-            defaults: [],
-            body: {
-                type: 'BlockStatement',
-                body: [],
-                range: [16, 19],
-                loc: {
-                    start: { line: 1, column: 16 },
-                    end: { line: 1, column: 19 }
-                }
-            },
-            rest: null,
-            generator: false,
-            expression: false,
-            range: [0, 19],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 19 }
-            }
-        },
-
-        'function arguments() { }': {
-            type: 'FunctionDeclaration',
-            id: {
-                type: 'Identifier',
-                name: 'arguments',
-                range: [9, 18],
-                loc: {
-                    start: { line: 1, column: 9 },
-                    end: { line: 1, column: 18 }
-                }
-            },
-            params: [],
-            defaults: [],
-            body: {
-                type: 'BlockStatement',
-                body: [],
-                range: [21, 24],
-                loc: {
-                    start: { line: 1, column: 21 },
-                    end: { line: 1, column: 24 }
-                }
-            },
-            rest: null,
-            generator: false,
-            expression: false,
-            range: [0, 24],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 24 }
-            }
-        },
-
-        'function test(t, t) { }': {
-            type: 'FunctionDeclaration',
-            id: {
-                type: 'Identifier',
-                name: 'test',
-                range: [9, 13],
-                loc: {
-                    start: { line: 1, column: 9 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            params: [{
-                type: 'Identifier',
-                name: 't',
-                range: [14, 15],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 15 }
-                }
-            }, {
-                type: 'Identifier',
-                name: 't',
-                range: [17, 18],
-                loc: {
-                    start: { line: 1, column: 17 },
-                    end: { line: 1, column: 18 }
-                }
-            }],
-            defaults: [],
-            body: {
-                type: 'BlockStatement',
-                body: [],
-                range: [20, 23],
-                loc: {
-                    start: { line: 1, column: 20 },
-                    end: { line: 1, column: 23 }
-                }
-            },
-            rest: null,
-            generator: false,
-            expression: false,
-            range: [0, 23],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 23 }
-            }
-        },
-
-        '(function test(t, t) { })': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'FunctionExpression',
-                id: {
-                    type: 'Identifier',
-                    name: 'test',
-                    range: [10, 14],
-                    loc: {
-                        start: { line: 1, column: 10 },
-                        end: { line: 1, column: 14 }
-                    }
-                },
-                params: [{
-                    type: 'Identifier',
-                    name: 't',
-                    range: [15, 16],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 16 }
-                    }
-                }, {
-                    type: 'Identifier',
-                    name: 't',
-                    range: [18, 19],
-                    loc: {
-                        start: { line: 1, column: 18 },
-                        end: { line: 1, column: 19 }
-                    }
-                }],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [21, 24],
-                    loc: {
-                        start: { line: 1, column: 21 },
-                        end: { line: 1, column: 24 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [1, 24],
-                loc: {
-                    start: { line: 1, column: 1 },
-                    end: { line: 1, column: 24 }
-                }
-            },
-            range: [0, 25],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 25 }
-            }
-        },
-
-        'function eval() { function inner() { "use strict" } }': {
-            type: 'FunctionDeclaration',
-            id: {
-                type: 'Identifier',
-                name: 'eval',
-                range: [9, 13],
-                loc: {
-                    start: { line: 1, column: 9 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            params: [],
-            defaults: [],
-            body: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'FunctionDeclaration',
-                    id: {
-                        type: 'Identifier',
-                        name: 'inner',
-                        range: [27, 32],
-                        loc: {
-                            start: { line: 1, column: 27 },
-                            end: { line: 1, column: 32 }
-                        }
-                    },
-                    params: [],
-                    defaults: [],
-                    body: {
-                        type: 'BlockStatement',
-                        body: [{
-                            type: 'ExpressionStatement',
-                            expression: {
-                                type: 'Literal',
-                                value: 'use strict',
-                                raw: '\"use strict\"',
-                                range: [37, 49],
-                                loc: {
-                                    start: { line: 1, column: 37 },
-                                    end: { line: 1, column: 49 }
-                                }
-                            },
-                            range: [37, 50],
-                            loc: {
-                                start: { line: 1, column: 37 },
-                                end: { line: 1, column: 50 }
-                            }
-                        }],
-                        range: [35, 51],
-                        loc: {
-                            start: { line: 1, column: 35 },
-                            end: { line: 1, column: 51 }
-                        }
-                    },
-                    rest: null,
-                    generator: false,
-                    expression: false,
-                    range: [18, 51],
-                    loc: {
-                        start: { line: 1, column: 18 },
-                        end: { line: 1, column: 51 }
-                    }
-                }],
-                range: [16, 53],
-                loc: {
-                    start: { line: 1, column: 16 },
-                    end: { line: 1, column: 53 }
-                }
-            },
-            rest: null,
-            generator: false,
-            expression: false,
-            range: [0, 53],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 53 }
-            }
-        },
-
-        'function hello(a) { sayHi(); }': {
-            type: 'FunctionDeclaration',
-            id: {
-                type: 'Identifier',
-                name: 'hello',
-                range: [9, 14],
-                loc: {
-                    start: { line: 1, column: 9 },
-                    end: { line: 1, column: 14 }
-                }
-            },
-            params: [{
-                type: 'Identifier',
-                name: 'a',
-                range: [15, 16],
-                loc: {
-                    start: { line: 1, column: 15 },
-                    end: { line: 1, column: 16 }
-                }
-            }],
-            defaults: [],
-            body: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'CallExpression',
-                        callee: {
-                            type: 'Identifier',
-                            name: 'sayHi',
-                            range: [20, 25],
-                            loc: {
-                                start: { line: 1, column: 20 },
-                                end: { line: 1, column: 25 }
-                            }
-                        },
-                        'arguments': [],
-                        range: [20, 27],
-                        loc: {
-                            start: { line: 1, column: 20 },
-                            end: { line: 1, column: 27 }
-                        }
-                    },
-                    range: [20, 28],
-                    loc: {
-                        start: { line: 1, column: 20 },
-                        end: { line: 1, column: 28 }
-                    }
-                }],
-                range: [18, 30],
-                loc: {
-                    start: { line: 1, column: 18 },
-                    end: { line: 1, column: 30 }
-                }
-            },
-            rest: null,
-            generator: false,
-            expression: false,
-            range: [0, 30],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 30 }
-            }
-        },
-
-        'function hello(a, b) { sayHi(); }': {
-            type: 'FunctionDeclaration',
-            id: {
-                type: 'Identifier',
-                name: 'hello',
-                range: [9, 14],
-                loc: {
-                    start: { line: 1, column: 9 },
-                    end: { line: 1, column: 14 }
-                }
-            },
-            params: [{
-                type: 'Identifier',
-                name: 'a',
-                range: [15, 16],
-                loc: {
-                    start: { line: 1, column: 15 },
-                    end: { line: 1, column: 16 }
-                }
-            }, {
-                type: 'Identifier',
-                name: 'b',
-                range: [18, 19],
-                loc: {
-                    start: { line: 1, column: 18 },
-                    end: { line: 1, column: 19 }
-                }
-            }],
-            defaults: [],
-            body: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'CallExpression',
-                        callee: {
-                            type: 'Identifier',
-                            name: 'sayHi',
-                            range: [23, 28],
-                            loc: {
-                                start: { line: 1, column: 23 },
-                                end: { line: 1, column: 28 }
-                            }
-                        },
-                        'arguments': [],
-                        range: [23, 30],
-                        loc: {
-                            start: { line: 1, column: 23 },
-                            end: { line: 1, column: 30 }
-                        }
-                    },
-                    range: [23, 31],
-                    loc: {
-                        start: { line: 1, column: 23 },
-                        end: { line: 1, column: 31 }
-                    }
-                }],
-                range: [21, 33],
-                loc: {
-                    start: { line: 1, column: 21 },
-                    end: { line: 1, column: 33 }
-                }
-            },
-            rest: null,
-            generator: false,
-            expression: false,
-            range: [0, 33],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 33 }
-            }
-        },
-
-        'var hi = function() { sayHi() };': {
-            type: 'VariableDeclaration',
-            declarations: [{
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'hi',
-                    range: [4, 6],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                init: {
-                    type: 'FunctionExpression',
-                    id: null,
-                    params: [],
-                    defaults: [],
-                    body: {
-                        type: 'BlockStatement',
-                        body: [{
-                            type: 'ExpressionStatement',
-                            expression: {
-                                type: 'CallExpression',
-                                callee: {
-                                    type: 'Identifier',
-                                    name: 'sayHi',
-                                    range: [22, 27],
-                                    loc: {
-                                        start: { line: 1, column: 22 },
-                                        end: { line: 1, column: 27 }
-                                    }
-                                },
-                                'arguments': [],
-                                range: [22, 29],
-                                loc: {
-                                    start: { line: 1, column: 22 },
-                                    end: { line: 1, column: 29 }
-                                }
-                            },
-                            range: [22, 30],
-                            loc: {
-                                start: { line: 1, column: 22 },
-                                end: { line: 1, column: 30 }
-                            }
-                        }],
-                        range: [20, 31],
-                        loc: {
-                            start: { line: 1, column: 20 },
-                            end: { line: 1, column: 31 }
-                        }
-                    },
-                    rest: null,
-                    generator: false,
-                    expression: false,
-                    range: [9, 31],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 31 }
-                    }
-                },
-                range: [4, 31],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 31 }
-                }
-            }],
-            kind: 'var',
-            range: [0, 32],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 32 }
-            }
-        },
-
-        'var hi = function eval() { };': {
-            type: 'VariableDeclaration',
-            declarations: [{
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'hi',
-                    range: [4, 6],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                init: {
-                    type: 'FunctionExpression',
-                    id: {
-                        type: 'Identifier',
-                        name: 'eval',
-                        range: [18, 22],
-                        loc: {
-                            start: { line: 1, column: 18 },
-                            end: { line: 1, column: 22 }
-                        }
-                    },
-                    params: [],
-                    defaults: [],
-                    body: {
-                        type: 'BlockStatement',
-                        body: [],
-                        range: [25, 28],
-                        loc: {
-                            start: { line: 1, column: 25 },
-                            end: { line: 1, column: 28 }
-                        }
-                    },
-                    rest: null,
-                    generator: false,
-                    expression: false,
-                    range: [9, 28],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 28 }
-                    }
-                },
-                range: [4, 28],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 28 }
-                }
-            }],
-            kind: 'var',
-            range: [0, 29],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 29 }
-            }
-        },
-
-        'var hi = function arguments() { };': {
-            type: 'VariableDeclaration',
-            declarations: [{
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'hi',
-                    range: [4, 6],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                init: {
-                    type: 'FunctionExpression',
-                    id: {
-                        type: 'Identifier',
-                        name: 'arguments',
-                        range: [18, 27],
-                        loc: {
-                            start: { line: 1, column: 18 },
-                            end: { line: 1, column: 27 }
-                        }
-                    },
-                    params: [],
-                    defaults: [],
-                    body: {
-                        type: 'BlockStatement',
-                        body: [],
-                        range: [30, 33],
-                        loc: {
-                            start: { line: 1, column: 30 },
-                            end: { line: 1, column: 33 }
-                        }
-                    },
-                    rest: null,
-                    generator: false,
-                    expression: false,
-                    range: [9, 33],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 33 }
-                    }
-                },
-                range: [4, 33],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 33 }
-                }
-            }],
-            kind: 'var',
-            range: [0, 34],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 34 }
-            }
-        },
-
-        'var hello = function hi() { sayHi() };': {
-            type: 'VariableDeclaration',
-            declarations: [{
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'hello',
-                    range: [4, 9],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 9 }
-                    }
-                },
-                init: {
-                    type: 'FunctionExpression',
-                    id: {
-                        type: 'Identifier',
-                        name: 'hi',
-                        range: [21, 23],
-                        loc: {
-                            start: { line: 1, column: 21 },
-                            end: { line: 1, column: 23 }
-                        }
-                    },
-                    params: [],
-                    defaults: [],
-                    body: {
-                        type: 'BlockStatement',
-                        body: [{
-                            type: 'ExpressionStatement',
-                            expression: {
-                                type: 'CallExpression',
-                                callee: {
-                                    type: 'Identifier',
-                                    name: 'sayHi',
-                                    range: [28, 33],
-                                    loc: {
-                                        start: { line: 1, column: 28 },
-                                        end: { line: 1, column: 33 }
-                                    }
-                                },
-                                'arguments': [],
-                                range: [28, 35],
-                                loc: {
-                                    start: { line: 1, column: 28 },
-                                    end: { line: 1, column: 35 }
-                                }
-                            },
-                            range: [28, 36],
-                            loc: {
-                                start: { line: 1, column: 28 },
-                                end: { line: 1, column: 36 }
-                            }
-                        }],
-                        range: [26, 37],
-                        loc: {
-                            start: { line: 1, column: 26 },
-                            end: { line: 1, column: 37 }
-                        }
-                    },
-                    rest: null,
-                    generator: false,
-                    expression: false,
-                    range: [12, 37],
-                    loc: {
-                        start: { line: 1, column: 12 },
-                        end: { line: 1, column: 37 }
-                    }
-                },
-                range: [4, 37],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 37 }
-                }
-            }],
-            kind: 'var',
-            range: [0, 38],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 38 }
-            }
-        },
-
-        '(function(){})': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'FunctionExpression',
-                id: null,
-                params: [],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [11, 13],
-                    loc: {
-                        start: { line: 1, column: 11 },
-                        end: { line: 1, column: 13 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [1, 13],
-                loc: {
-                    start: { line: 1, column: 1 },
-                    end: { line: 1, column: 13 }
-                }
-            },
-            range: [0, 14],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 14 }
-            }
-        }
-
-    },
-
-    'Automatic semicolon insertion': {
-
-        '{ x\n++y }': {
-            type: 'BlockStatement',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [2, 3],
-                    loc: {
-                        start: { line: 1, column: 2 },
-                        end: { line: 1, column: 3 }
-                    }
-                },
-                range: [2, 4],
-                loc: {
-                    start: { line: 1, column: 2 },
-                    end: { line: 2, column: 0 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'UpdateExpression',
-                    operator: '++',
-                    argument: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [6, 7],
-                        loc: {
-                            start: { line: 2, column: 2 },
-                            end: { line: 2, column: 3 }
-                        }
-                    },
-                    prefix: true,
-                    range: [4, 7],
-                    loc: {
-                        start: { line: 2, column: 0 },
-                        end: { line: 2, column: 3 }
-                    }
-                },
-                range: [4, 8],
-                loc: {
-                    start: { line: 2, column: 0 },
-                    end: { line: 2, column: 4 }
-                }
-            }],
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 5 }
-            }
-        },
-
-        '{ x\n--y }': {
-            type: 'BlockStatement',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [2, 3],
-                    loc: {
-                        start: { line: 1, column: 2 },
-                        end: { line: 1, column: 3 }
-                    }
-                },
-                range: [2, 4],
-                loc: {
-                    start: { line: 1, column: 2 },
-                    end: { line: 2, column: 0 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'UpdateExpression',
-                    operator: '--',
-                    argument: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [6, 7],
-                        loc: {
-                            start: { line: 2, column: 2 },
-                            end: { line: 2, column: 3 }
-                        }
-                    },
-                    prefix: true,
-                    range: [4, 7],
-                    loc: {
-                        start: { line: 2, column: 0 },
-                        end: { line: 2, column: 3 }
-                    }
-                },
-                range: [4, 8],
-                loc: {
-                    start: { line: 2, column: 0 },
-                    end: { line: 2, column: 4 }
-                }
-            }],
-            range: [0, 9],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 5 }
-            }
-        },
-
-        'var x /* comment */;': {
-            type: 'VariableDeclaration',
-            declarations: [{
-                type: 'VariableDeclarator',
-                id: {
-                    type: 'Identifier',
-                    name: 'x',
-                    range: [4, 5],
-                    loc: {
-                        start: { line: 1, column: 4 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                init: null,
-                range: [4, 5],
-                loc: {
-                    start: { line: 1, column: 4 },
-                    end: { line: 1, column: 5 }
-                }
-            }],
-            kind: 'var',
-            range: [0, 20],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 20 }
-            }
-        },
-
-        '{ var x = 14, y = 3\nz; }': {
-            type: 'BlockStatement',
-            body: [{
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [6, 7],
-                        loc: {
-                            start: { line: 1, column: 6 },
-                            end: { line: 1, column: 7 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 14,
-                        raw: '14',
-                        range: [10, 12],
-                        loc: {
-                            start: { line: 1, column: 10 },
-                            end: { line: 1, column: 12 }
-                        }
-                    },
-                    range: [6, 12],
-                    loc: {
-                        start: { line: 1, column: 6 },
-                        end: { line: 1, column: 12 }
-                    }
-                }, {
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'y',
-                        range: [14, 15],
-                        loc: {
-                            start: { line: 1, column: 14 },
-                            end: { line: 1, column: 15 }
-                        }
-                    },
-                    init: {
-                        type: 'Literal',
-                        value: 3,
-                        raw: '3',
-                        range: [18, 19],
-                        loc: {
-                            start: { line: 1, column: 18 },
-                            end: { line: 1, column: 19 }
-                        }
-                    },
-                    range: [14, 19],
-                    loc: {
-                        start: { line: 1, column: 14 },
-                        end: { line: 1, column: 19 }
-                    }
-                }],
-                kind: 'var',
-                range: [2, 20],
-                loc: {
-                    start: { line: 1, column: 2 },
-                    end: { line: 2, column: 0 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Identifier',
-                    name: 'z',
-                    range: [20, 21],
-                    loc: {
-                        start: { line: 2, column: 0 },
-                        end: { line: 2, column: 1 }
-                    }
-                },
-                range: [20, 22],
-                loc: {
-                    start: { line: 2, column: 0 },
-                    end: { line: 2, column: 2 }
-                }
-            }],
-            range: [0, 24],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 4 }
-            }
-        },
-
-        'while (true) { continue\nthere; }': {
-            type: 'WhileStatement',
-            test: {
-                type: 'Literal',
-                value: true,
-                raw: 'true',
-                range: [7, 11],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            body: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'ContinueStatement',
-                    label: null,
-                    range: [15, 23],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 23 }
-                    }
-                }, {
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'Identifier',
-                        name: 'there',
-                        range: [24, 29],
-                        loc: {
-                            start: { line: 2, column: 0 },
-                            end: { line: 2, column: 5 }
-                        }
-                    },
-                    range: [24, 30],
-                    loc: {
-                        start: { line: 2, column: 0 },
-                        end: { line: 2, column: 6 }
-                    }
-                }],
-                range: [13, 32],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 2, column: 8 }
-                }
-            },
-            range: [0, 32],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 8 }
-            }
-        },
-
-        'while (true) { continue // Comment\nthere; }': {
-            type: 'WhileStatement',
-            test: {
-                type: 'Literal',
-                value: true,
-                raw: 'true',
-                range: [7, 11],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            body: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'ContinueStatement',
-                    label: null,
-                    range: [15, 23],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 23 }
-                    }
-                }, {
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'Identifier',
-                        name: 'there',
-                        range: [35, 40],
-                        loc: {
-                            start: { line: 2, column: 0 },
-                            end: { line: 2, column: 5 }
-                        }
-                    },
-                    range: [35, 41],
-                    loc: {
-                        start: { line: 2, column: 0 },
-                        end: { line: 2, column: 6 }
-                    }
-                }],
-                range: [13, 43],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 2, column: 8 }
-                }
-            },
-            range: [0, 43],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 8 }
-            }
-        },
-
-        'while (true) { continue /* Multiline\nComment */there; }': {
-            type: 'WhileStatement',
-            test: {
-                type: 'Literal',
-                value: true,
-                raw: 'true',
-                range: [7, 11],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            body: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'ContinueStatement',
-                    label: null,
-                    range: [15, 23],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 23 }
-                    }
-                }, {
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'Identifier',
-                        name: 'there',
-                        range: [47, 52],
-                        loc: {
-                            start: { line: 2, column: 10 },
-                            end: { line: 2, column: 15 }
-                        }
-                    },
-                    range: [47, 53],
-                    loc: {
-                        start: { line: 2, column: 10 },
-                        end: { line: 2, column: 16 }
-                    }
-                }],
-                range: [13, 55],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 2, column: 18 }
-                }
-            },
-            range: [0, 55],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 18 }
-            }
-        },
-
-        'while (true) { break\nthere; }': {
-            type: 'WhileStatement',
-            test: {
-                type: 'Literal',
-                value: true,
-                raw: 'true',
-                range: [7, 11],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            body: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'BreakStatement',
-                    label: null,
-                    range: [15, 20],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 20 }
-                    }
-                }, {
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'Identifier',
-                        name: 'there',
-                        range: [21, 26],
-                        loc: {
-                            start: { line: 2, column: 0 },
-                            end: { line: 2, column: 5 }
-                        }
-                    },
-                    range: [21, 27],
-                    loc: {
-                        start: { line: 2, column: 0 },
-                        end: { line: 2, column: 6 }
-                    }
-                }],
-                range: [13, 29],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 2, column: 8 }
-                }
-            },
-            range: [0, 29],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 8 }
-            }
-        },
-
-        'while (true) { break // Comment\nthere; }': {
-            type: 'WhileStatement',
-            test: {
-                type: 'Literal',
-                value: true,
-                raw: 'true',
-                range: [7, 11],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            body: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'BreakStatement',
-                    label: null,
-                    range: [15, 20],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 20 }
-                    }
-                }, {
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'Identifier',
-                        name: 'there',
-                        range: [32, 37],
-                        loc: {
-                            start: { line: 2, column: 0 },
-                            end: { line: 2, column: 5 }
-                        }
-                    },
-                    range: [32, 38],
-                    loc: {
-                        start: { line: 2, column: 0 },
-                        end: { line: 2, column: 6 }
-                    }
-                }],
-                range: [13, 40],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 2, column: 8 }
-                }
-            },
-            range: [0, 40],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 8 }
-            }
-        },
-
-        'while (true) { break /* Multiline\nComment */there; }': {
-            type: 'WhileStatement',
-            test: {
-                type: 'Literal',
-                value: true,
-                raw: 'true',
-                range: [7, 11],
-                loc: {
-                    start: { line: 1, column: 7 },
-                    end: { line: 1, column: 11 }
-                }
-            },
-            body: {
-                type: 'BlockStatement',
-                body: [{
-                    type: 'BreakStatement',
-                    label: null,
-                    range: [15, 20],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 20 }
-                    }
-                }, {
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'Identifier',
-                        name: 'there',
-                        range: [44, 49],
-                        loc: {
-                            start: { line: 2, column: 10 },
-                            end: { line: 2, column: 15 }
-                        }
-                    },
-                    range: [44, 50],
-                    loc: {
-                        start: { line: 2, column: 10 },
-                        end: { line: 2, column: 16 }
-                    }
-                }],
-                range: [13, 52],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 2, column: 18 }
-                }
-            },
-            range: [0, 52],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 18 }
-            }
-        },
-
-        '(function(){ return\nx; })': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'FunctionExpression',
-                id: null,
-                params: [],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [
-                        {
-                            type: 'ReturnStatement',
-                            argument: null,
-                            range: [13, 19],
-                            loc: {
-                                start: { line: 1, column: 13 },
-                                end: { line: 1, column: 19 }
-                            }
-                        },
-                        {
-                            type: 'ExpressionStatement',
-                            expression: {
-                                type: 'Identifier',
-                                name: 'x',
-                                range: [20, 21],
-                                loc: {
-                                    start: { line: 2, column: 0 },
-                                    end: { line: 2, column: 1 }
-                                }
-                            },
-                            range: [20, 22],
-                            loc: {
-                                start: { line: 2, column: 0 },
-                                end: { line: 2, column: 2 }
-                            }
-                        }
-                    ],
-                    range: [11, 24],
-                    loc: {
-                        start: { line: 1, column: 11 },
-                        end: { line: 2, column: 4 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [1, 24],
-                loc: {
-                    start: { line: 1, column: 1 },
-                    end: { line: 2, column: 4 }
-                }
-            },
-            range: [0, 25],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 5 }
-            }
-        },
-
-        '(function(){ return // Comment\nx; })': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'FunctionExpression',
-                id: null,
-                params: [],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [
-                        {
-                            type: 'ReturnStatement',
-                            argument: null,
-                            range: [13, 19],
-                            loc: {
-                                start: { line: 1, column: 13 },
-                                end: { line: 1, column: 19 }
-                            }
-                        },
-                        {
-                            type: 'ExpressionStatement',
-                            expression: {
-                                type: 'Identifier',
-                                name: 'x',
-                                range: [31, 32],
-                                loc: {
-                                    start: { line: 2, column: 0 },
-                                    end: { line: 2, column: 1 }
-                                }
-                            },
-                            range: [31, 33],
-                            loc: {
-                                start: { line: 2, column: 0 },
-                                end: { line: 2, column: 2 }
-                            }
-                        }
-                    ],
-                    range: [11, 35],
-                    loc: {
-                        start: { line: 1, column: 11 },
-                        end: { line: 2, column: 4 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [1, 35],
-                loc: {
-                    start: { line: 1, column: 1 },
-                    end: { line: 2, column: 4 }
-                }
-            },
-            range: [0, 36],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 5 }
-            }
-        },
-
-        '(function(){ return/* Multiline\nComment */x; })': {
-            type: 'ExpressionStatement',
-            expression: {
-                type: 'FunctionExpression',
-                id: null,
-                params: [],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [
-                        {
-                            type: 'ReturnStatement',
-                            argument: null,
-                            range: [13, 19],
-                            loc: {
-                                start: { line: 1, column: 13 },
-                                end: { line: 1, column: 19 }
-                            }
-                        },
-                        {
-                            type: 'ExpressionStatement',
-                            expression: {
-                                type: 'Identifier',
-                                name: 'x',
-                                range: [42, 43],
-                                loc: {
-                                    start: { line: 2, column: 10 },
-                                    end: { line: 2, column: 11 }
-                                }
-                            },
-                            range: [42, 44],
-                            loc: {
-                                start: { line: 2, column: 10 },
-                                end: { line: 2, column: 12 }
-                            }
-                        }
-                    ],
-                    range: [11, 46],
-                    loc: {
-                        start: { line: 1, column: 11 },
-                        end: { line: 2, column: 14 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [1, 46],
-                loc: {
-                    start: { line: 1, column: 1 },
-                    end: { line: 2, column: 14 }
-                }
-            },
-            range: [0, 47],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 15 }
-            }
-        },
-
-        '{ throw error\nerror; }': {
-            type: 'BlockStatement',
-            body: [{
-                type: 'ThrowStatement',
-                argument: {
-                    type: 'Identifier',
-                    name: 'error',
-                    range: [8, 13],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 13 }
-                    }
-                },
-                range: [2, 14],
-                loc: {
-                    start: { line: 1, column: 2 },
-                    end: { line: 2, column: 0 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Identifier',
-                    name: 'error',
-                    range: [14, 19],
-                    loc: {
-                        start: { line: 2, column: 0 },
-                        end: { line: 2, column: 5 }
-                    }
-                },
-                range: [14, 20],
-                loc: {
-                    start: { line: 2, column: 0 },
-                    end: { line: 2, column: 6 }
-                }
-            }],
-            range: [0, 22],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 8 }
-            }
-        },
-
-        '{ throw error// Comment\nerror; }': {
-            type: 'BlockStatement',
-            body: [{
-                type: 'ThrowStatement',
-                argument: {
-                    type: 'Identifier',
-                    name: 'error',
-                    range: [8, 13],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 13 }
-                    }
-                },
-                range: [2, 24],
-                loc: {
-                    start: { line: 1, column: 2 },
-                    end: { line: 2, column: 0 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Identifier',
-                    name: 'error',
-                    range: [24, 29],
-                    loc: {
-                        start: { line: 2, column: 0 },
-                        end: { line: 2, column: 5 }
-                    }
-                },
-                range: [24, 30],
-                loc: {
-                    start: { line: 2, column: 0 },
-                    end: { line: 2, column: 6 }
-                }
-            }],
-            range: [0, 32],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 8 }
-            }
-        },
-
-        '{ throw error/* Multiline\nComment */error; }': {
-            type: 'BlockStatement',
-            body: [{
-                type: 'ThrowStatement',
-                argument: {
-                    type: 'Identifier',
-                    name: 'error',
-                    range: [8, 13],
-                    loc: {
-                        start: { line: 1, column: 8 },
-                        end: { line: 1, column: 13 }
-                    }
-                },
-                range: [2, 36],
-                loc: {
-                    start: { line: 1, column: 2 },
-                    end: { line: 2, column: 10 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Identifier',
-                    name: 'error',
-                    range: [36, 41],
-                    loc: {
-                        start: { line: 2, column: 10 },
-                        end: { line: 2, column: 15 }
-                    }
-                },
-                range: [36, 42],
-                loc: {
-                    start: { line: 2, column: 10 },
-                    end: { line: 2, column: 16 }
-                }
-            }],
-            range: [0, 44],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 2, column: 18 }
-            }
-        }
-
-    },
-
-    'Source elements': {
-
-        '': {
-            type: 'Program',
-            body: [],
-            range: [0, 0],
-            loc: {
-                start: { line: 0, column: 0 },
-                end: { line: 0, column: 0 }
-            },
-            tokens: []
-        }
-    },
-
-    'Invalid syntax': {
-
-        '{': {
-            index: 1,
-            lineNumber: 1,
-            column: 2,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        '}': {
-            index: 0,
-            lineNumber: 1,
-            column: 1,
-            message: 'Error: Line 1: Unexpected token }'
-        },
-
-        '3ea': {
-            index: 2,
-            lineNumber: 1,
-            column: 3,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '3in []': {
-            index: 1,
-            lineNumber: 1,
-            column: 2,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '3e': {
-            index: 2,
-            lineNumber: 1,
-            column: 3,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '3e+': {
-            index: 3,
-            lineNumber: 1,
-            column: 4,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '3e-': {
-            index: 3,
-            lineNumber: 1,
-            column: 4,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '3x': {
-            index: 1,
-            lineNumber: 1,
-            column: 2,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '3x0': {
-            index: 1,
-            lineNumber: 1,
-            column: 2,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '0x': {
-            index: 2,
-            lineNumber: 1,
-            column: 3,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '09': {
-            index: 1,
-            lineNumber: 1,
-            column: 2,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '018': {
-            index: 2,
-            lineNumber: 1,
-            column: 3,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '01a': {
-            index: 2,
-            lineNumber: 1,
-            column: 3,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '3in[]': {
-            index: 1,
-            lineNumber: 1,
-            column: 2,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '0x3in[]': {
-            index: 3,
-            lineNumber: 1,
-            column: 4,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '"Hello\nWorld"': {
-            index: 7,
-            lineNumber: 1,
-            column: 8,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        'x\\': {
-            index: 2,
-            lineNumber: 1,
-            column: 3,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        'x\\u005c': {
-            index: 7,
-            lineNumber: 1,
-            column: 8,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        'x\\u002a': {
-            index: 7,
-            lineNumber: 1,
-            column: 8,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        'var x = /(s/g': {
-            index: 13,
-            lineNumber: 1,
-            column: 14,
-            message: 'Error: Line 1: Invalid regular expression'
-        },
-
-        '/': {
-            index: 1,
-            lineNumber: 1,
-            column: 2,
-            message: 'Error: Line 1: Invalid regular expression: missing /'
-        },
-
-        '/test': {
-            index: 5,
-            lineNumber: 1,
-            column: 6,
-            message: 'Error: Line 1: Invalid regular expression: missing /'
-        },
-
-        'var x = /[a-z]/\\ux': {
-            index: 18,
-            lineNumber: 1,
-            column: 19,
-            message: 'Error: Line 1: Invalid regular expression'
-        },
-
-        '3 = 4': {
-            index: 1,
-            lineNumber: 1,
-            column: 2,
-            message: 'Error: Line 1: Invalid left-hand side in assignment'
-        },
-
-        'func() = 4': {
-            index: 6,
-            lineNumber: 1,
-            column: 7,
-            message: 'Error: Line 1: Invalid left-hand side in assignment'
-        },
-
-        '(1 + 1) = 10': {
-            index: 7,
-            lineNumber: 1,
-            column: 8,
-            message: 'Error: Line 1: Invalid left-hand side in assignment'
-        },
-
-        '1++': {
-            index: 1,
-            lineNumber: 1,
-            column: 2,
-            message: 'Error: Line 1: Invalid left-hand side in assignment'
-        },
-
-        '1--': {
-            index: 1,
-            lineNumber: 1,
-            column: 2,
-            message: 'Error: Line 1: Invalid left-hand side in assignment'
-        },
-
-        '++1': {
-            index: 3,
-            lineNumber: 1,
-            column: 4,
-            message: 'Error: Line 1: Invalid left-hand side in assignment'
-        },
-
-        '--1': {
-            index: 3,
-            lineNumber: 1,
-            column: 4,
-            message: 'Error: Line 1: Invalid left-hand side in assignment'
-        },
-
-        'for((1 + 1) in list) process(x);': {
-            index: 11,
-            lineNumber: 1,
-            column: 12,
-            message: 'Error: Line 1: Invalid left-hand side in for-in'
-        },
-
-        '[': {
-            index: 1,
-            lineNumber: 1,
-            column: 2,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        '[,': {
-            index: 2,
-            lineNumber: 1,
-            column: 3,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        '1 + {': {
-            index: 5,
-            lineNumber: 1,
-            column: 6,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        '1 + { t:t ': {
-            index: 10,
-            lineNumber: 1,
-            column: 11,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        '1 + { t:t,': {
-            index: 10,
-            lineNumber: 1,
-            column: 11,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        'var x = /\n/': {
-            index: 10,
-            lineNumber: 1,
-            column: 11,
-            message: 'Error: Line 1: Invalid regular expression: missing /'
-        },
-
-        'var x = "\n': {
-            index: 10,
-            lineNumber: 1,
-            column: 11,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        'var if = 42': {
-            index: 4,
-            lineNumber: 1,
-            column: 5,
-            message: 'Error: Line 1: Unexpected token if'
-        },
-
-        'i + 2 = 42': {
-            index: 5,
-            lineNumber: 1,
-            column: 6,
-            message: 'Error: Line 1: Invalid left-hand side in assignment'
-        },
-
-        '+i = 42': {
-            index: 2,
-            lineNumber: 1,
-            column: 3,
-            message: 'Error: Line 1: Invalid left-hand side in assignment'
-        },
-
-        '1 + (': {
-            index: 5,
-            lineNumber: 1,
-            column: 6,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        '\n\n\n{': {
-            index: 4,
-            lineNumber: 4,
-            column: 2,
-            message: 'Error: Line 4: Unexpected end of input'
-        },
-
-        '\n/* Some multiline\ncomment */\n)': {
-            index: 30,
-            lineNumber: 4,
-            column: 1,
-            message: 'Error: Line 4: Unexpected token )'
-        },
-
-        '{ set 1 }': {
-            index: 6,
-            lineNumber: 1,
-            column: 7,
-            message: 'Error: Line 1: Unexpected number'
-        },
-
-        '{ get 2 }': {
-            index: 6,
-            lineNumber: 1,
-            column: 7,
-            message: 'Error: Line 1: Unexpected number'
-        },
-
-        '({ set: s(if) { } })': {
-            index: 10,
-            lineNumber: 1,
-            column: 11,
-            message: 'Error: Line 1: Unexpected token if'
-        },
-
-        '({ set s(.) { } })': {
-            index: 9,
-            lineNumber: 1,
-            column: 10,
-            message: 'Error: Line 1: Unexpected token .'
-        },
-
-        '({ set s() { } })': {
-            index: 9,
-            lineNumber: 1,
-            column: 10,
-            message: 'Error: Line 1: Unexpected token )'
-        },
-
-        '({ set: s() { } })': {
-            index: 12,
-            lineNumber: 1,
-            column: 13,
-            message: 'Error: Line 1: Unexpected token {'
-        },
-
-        '({ set: s(a, b) { } })': {
-            index: 16,
-            lineNumber: 1,
-            column: 17,
-            message: 'Error: Line 1: Unexpected token {'
-        },
-
-        '({ get: g(d) { } })': {
-            index: 13,
-            lineNumber: 1,
-            column: 14,
-            message: 'Error: Line 1: Unexpected token {'
-        },
-
-        '({ get i() { }, i: 42 })': {
-            index: 21,
-            lineNumber: 1,
-            column: 22,
-            message: 'Error: Line 1: Object literal may not have data and accessor property with the same name'
-        },
-
-        '({ i: 42, get i() { } })': {
-            index: 21,
-            lineNumber: 1,
-            column: 22,
-            message: 'Error: Line 1: Object literal may not have data and accessor property with the same name'
-        },
-
-        '({ set i(x) { }, i: 42 })': {
-            index: 22,
-            lineNumber: 1,
-            column: 23,
-            message: 'Error: Line 1: Object literal may not have data and accessor property with the same name'
-        },
-
-        '({ i: 42, set i(x) { } })': {
-            index: 22,
-            lineNumber: 1,
-            column: 23,
-            message: 'Error: Line 1: Object literal may not have data and accessor property with the same name'
-        },
-
-        '({ get i() { }, get i() { } })': {
-            index: 27,
-            lineNumber: 1,
-            column: 28,
-            message: 'Error: Line 1: Object literal may not have multiple get/set accessors with the same name'
-        },
-
-        '({ set i(x) { }, set i(x) { } })': {
-            index: 29,
-            lineNumber: 1,
-            column: 30,
-            message: 'Error: Line 1: Object literal may not have multiple get/set accessors with the same name'
-        },
-
-        'function t(if) { }': {
-            index: 11,
-            lineNumber: 1,
-            column: 12,
-            message: 'Error: Line 1: Unexpected token if'
-        },
-
-        'function t(true) { }': {
-            index: 11,
-            lineNumber: 1,
-            column: 12,
-            message: 'Error: Line 1: Unexpected token true'
-        },
-
-        'function t(false) { }': {
-            index: 11,
-            lineNumber: 1,
-            column: 12,
-            message: 'Error: Line 1: Unexpected token false'
-        },
-
-        'function t(null) { }': {
-            index: 11,
-            lineNumber: 1,
-            column: 12,
-            message: 'Error: Line 1: Unexpected token null'
-        },
-
-        'function null() { }': {
-            index: 9,
-            lineNumber: 1,
-            column: 10,
-            message: 'Error: Line 1: Unexpected token null'
-        },
-
-        'function true() { }': {
-            index: 9,
-            lineNumber: 1,
-            column: 10,
-            message: 'Error: Line 1: Unexpected token true'
-        },
-
-        'function false() { }': {
-            index: 9,
-            lineNumber: 1,
-            column: 10,
-            message: 'Error: Line 1: Unexpected token false'
-        },
-
-        'function if() { }': {
-            index: 9,
-            lineNumber: 1,
-            column: 10,
-            message: 'Error: Line 1: Unexpected token if'
-        },
-
-        'a b;': {
-            index: 2,
-            lineNumber: 1,
-            column: 3,
-            message: 'Error: Line 1: Unexpected identifier'
-        },
-
-        'if.a;': {
-            index: 2,
-            lineNumber: 1,
-            column: 3,
-            message: 'Error: Line 1: Unexpected token .'
-        },
-
-        'a if;': {
-            index: 2,
-            lineNumber: 1,
-            column: 3,
-            message: 'Error: Line 1: Unexpected token if'
-        },
-
-        'a class;': {
-            index: 2,
-            lineNumber: 1,
-            column: 3,
-            message: 'Error: Line 1: Unexpected reserved word'
-        },
-
-        'break\n': {
-            index: 5,
-            lineNumber: 1,
-            column: 6,
-            message: 'Error: Line 1: Illegal break statement'
-        },
-
-        'break 1;': {
-            index: 6,
-            lineNumber: 1,
-            column: 7,
-            message: 'Error: Line 1: Unexpected number'
-        },
-
-        'continue\n': {
-            index: 8,
-            lineNumber: 1,
-            column: 9,
-            message: 'Error: Line 1: Illegal continue statement'
-        },
-
-        'continue 2;': {
-            index: 9,
-            lineNumber: 1,
-            column: 10,
-            message: 'Error: Line 1: Unexpected number'
-        },
-
-        'throw': {
-            index: 5,
-            lineNumber: 1,
-            column: 6,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        'throw;': {
-            index: 5,
-            lineNumber: 1,
-            column: 6,
-            message: 'Error: Line 1: Unexpected token ;'
-        },
-
-        'throw\n': {
-            index: 5,
-            lineNumber: 1,
-            column: 6,
-            message: 'Error: Line 1: Illegal newline after throw'
-        },
-
-        'for (var i, i2 in {});': {
-            index: 15,
-            lineNumber: 1,
-            column: 16,
-            message: 'Error: Line 1: Unexpected token in'
-        },
-
-        'for ((i in {}));': {
-            index: 14,
-            lineNumber: 1,
-            column: 15,
-            message: 'Error: Line 1: Unexpected token )'
-        },
-
-        'for (i + 1 in {});': {
-            index: 10,
-            lineNumber: 1,
-            column: 11,
-            message: 'Error: Line 1: Invalid left-hand side in for-in'
-        },
-
-        'for (+i in {});': {
-            index: 7,
-            lineNumber: 1,
-            column: 8,
-            message: 'Error: Line 1: Invalid left-hand side in for-in'
-        },
-
-        'if(false)': {
-            index: 9,
-            lineNumber: 1,
-            column: 10,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        'if(false) doThis(); else': {
-            index: 24,
-            lineNumber: 1,
-            column: 25,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        'do': {
-            index: 2,
-            lineNumber: 1,
-            column: 3,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        'while(false)': {
-            index: 12,
-            lineNumber: 1,
-            column: 13,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        'for(;;)': {
-            index: 7,
-            lineNumber: 1,
-            column: 8,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        'with(x)': {
-            index: 7,
-            lineNumber: 1,
-            column: 8,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        'try { }': {
-            index: 7,
-            lineNumber: 1,
-            column: 8,
-            message: 'Error: Line 1: Missing catch or finally after try'
-        },
-
-        'try {} catch (42) {} ': {
-            index: 14,
-            lineNumber: 1,
-            column: 15,
-            message: 'Error: Line 1: Unexpected number'
-        },
-
-        'try {} catch (answer()) {} ': {
-            index: 20,
-            lineNumber: 1,
-            column: 21,
-            message: 'Error: Line 1: Unexpected token ('
-        },
-
-        'try {} catch (-x) {} ': {
-            index: 14,
-            lineNumber: 1,
-            column: 15,
-            message: 'Error: Line 1: Unexpected token -'
-        },
-
-
-        '\u203F = 10': {
-            index: 0,
-            lineNumber: 1,
-            column: 1,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        'const x = 12, y;': {
-            index: 15,
-            lineNumber: 1,
-            column: 16,
-            message: 'Error: Line 1: Unexpected token ;'
-        },
-
-        'const x, y = 12;': {
-            index: 7,
-            lineNumber: 1,
-            column: 8,
-            message: 'Error: Line 1: Unexpected token ,'
-        },
-
-        'const x;': {
-            index: 7,
-            lineNumber: 1,
-            column: 8,
-            message: 'Error: Line 1: Unexpected token ;'
-        },
-
-        'if(true) let a = 1;': {
-            index: 9,
-            lineNumber: 1,
-            column: 10,
-            message: 'Error: Line 1: Unexpected token let'
-        },
-
-        'if(true) const a = 1;': {
-            index: 9,
-            lineNumber: 1,
-            column: 10,
-            message: 'Error: Line 1: Unexpected token const'
-        },
-
-        'switch (c) { default: default: }': {
-            index: 30,
-            lineNumber: 1,
-            column: 31,
-            message: 'Error: Line 1: More than one default clause in switch statement'
-        },
-
-        'new X()."s"': {
-            index: 8,
-            lineNumber: 1,
-            column: 9,
-            message: 'Error: Line 1: Unexpected string'
-        },
-
-        '/*': {
-            index: 2,
-            lineNumber: 1,
-            column: 3,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '/*\n\n\n': {
-            index: 5,
-            lineNumber: 4,
-            column: 1,
-            message: 'Error: Line 4: Unexpected token ILLEGAL'
-        },
-
-        '/**': {
-            index: 3,
-            lineNumber: 1,
-            column: 4,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '/*\n\n*': {
-            index: 5,
-            lineNumber: 3,
-            column: 2,
-            message: 'Error: Line 3: Unexpected token ILLEGAL'
-        },
-
-        '/*hello': {
-            index: 7,
-            lineNumber: 1,
-            column: 8,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '/*hello  *': {
-            index: 10,
-            lineNumber: 1,
-            column: 11,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '\n]': {
-            index: 1,
-            lineNumber: 2,
-            column: 1,
-            message: 'Error: Line 2: Unexpected token ]'
-        },
-
-        '\r]': {
-            index: 1,
-            lineNumber: 2,
-            column: 1,
-            message: 'Error: Line 2: Unexpected token ]'
-        },
-
-        '\r\n]': {
-            index: 2,
-            lineNumber: 2,
-            column: 1,
-            message: 'Error: Line 2: Unexpected token ]'
-        },
-
-        '\n\r]': {
-            index: 2,
-            lineNumber: 3,
-            column: 1,
-            message: 'Error: Line 3: Unexpected token ]'
-        },
-
-        '//\r\n]': {
-            index: 4,
-            lineNumber: 2,
-            column: 1,
-            message: 'Error: Line 2: Unexpected token ]'
-        },
-
-        '//\n\r]': {
-            index: 4,
-            lineNumber: 3,
-            column: 1,
-            message: 'Error: Line 3: Unexpected token ]'
-        },
-
-        '/a\\\n/': {
-            index: 4,
-            lineNumber: 1,
-            column: 5,
-            message: 'Error: Line 1: Invalid regular expression: missing /'
-        },
-        
-        '//\r \n]': {
-            index: 5,
-            lineNumber: 3,
-            column: 1,
-            message: 'Error: Line 3: Unexpected token ]'
-        },
-
-        '/*\r\n*/]': {
-            index: 6,
-            lineNumber: 2,
-            column: 3,
-            message: 'Error: Line 2: Unexpected token ]'
-        },
-
-        '/*\n\r*/]': {
-            index: 6,
-            lineNumber: 3,
-            column: 3,
-            message: 'Error: Line 3: Unexpected token ]'
-        },
-
-        '/*\r \n*/]': {
-            index: 7,
-            lineNumber: 3,
-            column: 3,
-            message: 'Error: Line 3: Unexpected token ]'
-        },
-
-        '\\\\': {
-            index: 1,
-            lineNumber: 1,
-            column: 2,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '\\u005c': {
-            index: 6,
-            lineNumber: 1,
-            column: 7,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-
-        '\\x': {
-            index: 1,
-            lineNumber: 1,
-            column: 2,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '\\u0000': {
-            index: 6,
-            lineNumber: 1,
-            column: 7,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '\u200C = []': {
-            index: 0,
-            lineNumber: 1,
-            column: 1,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '\u200D = []': {
-            index: 0,
-            lineNumber: 1,
-            column: 1,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '"\\': {
-            index: 3,
-            lineNumber: 1,
-            column: 4,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        '"\\u': {
-            index: 3,
-            lineNumber: 1,
-            column: 4,
-            message: 'Error: Line 1: Unexpected token ILLEGAL'
-        },
-
-        'try { } catch() {}': {
-            index: 14,
-            lineNumber: 1,
-            column: 15,
-            message: 'Error: Line 1: Unexpected token )'
-        },
-
-        'return': {
-            index: 6,
-            lineNumber: 1,
-            column: 7,
-            message: 'Error: Line 1: Illegal return statement'
-        },
-
-        'break': {
-            index: 5,
-            lineNumber: 1,
-            column: 6,
-            message: 'Error: Line 1: Illegal break statement'
-        },
-
-        'continue': {
-            index: 8,
-            lineNumber: 1,
-            column: 9,
-            message: 'Error: Line 1: Illegal continue statement'
-        },
-
-        'switch (x) { default: continue; }': {
-            index: 31,
-            lineNumber: 1,
-            column: 32,
-            message: 'Error: Line 1: Illegal continue statement'
-        },
-
-        'do { x } *': {
-            index: 9,
-            lineNumber: 1,
-            column: 10,
-            message: 'Error: Line 1: Unexpected token *'
-        },
-
-        'while (true) { break x; }': {
-            index: 22,
-            lineNumber: 1,
-            column: 23,
-            message: 'Error: Line 1: Undefined label \'x\''
-        },
-
-        'while (true) { continue x; }': {
-            index: 25,
-            lineNumber: 1,
-            column: 26,
-            message: 'Error: Line 1: Undefined label \'x\''
-        },
-
-        'x: while (true) { (function () { break x; }); }': {
-            index: 40,
-            lineNumber: 1,
-            column: 41,
-            message: 'Error: Line 1: Undefined label \'x\''
-        },
-
-        'x: while (true) { (function () { continue x; }); }': {
-            index: 43,
-            lineNumber: 1,
-            column: 44,
-            message: 'Error: Line 1: Undefined label \'x\''
-        },
-
-        'x: while (true) { (function () { break; }); }': {
-            index: 39,
-            lineNumber: 1,
-            column: 40,
-            message: 'Error: Line 1: Illegal break statement'
-        },
-
-        'x: while (true) { (function () { continue; }); }': {
-            index: 42,
-            lineNumber: 1,
-            column: 43,
-            message: 'Error: Line 1: Illegal continue statement'
-        },
-
-        'x: while (true) { x: while (true) { } }': {
-            index: 20,
-            lineNumber: 1,
-            column: 21,
-            message: 'Error: Line 1: Label \'x\' has already been declared'
-        },
-
-        '(function () { \'use strict\'; delete i; }())': {
-            index: 37,
-            lineNumber: 1,
-            column: 38,
-            message: 'Error: Line 1: Delete of an unqualified identifier in strict mode.'
-        },
-
-        '(function () { \'use strict\'; with (i); }())': {
-            index: 28,
-            lineNumber: 1,
-            column: 29,
-            message: 'Error: Line 1: Strict mode code may not include a with statement'
-        },
-
-        'function hello() {\'use strict\'; ({ i: 42, i: 42 }) }': {
-            index: 47,
-            lineNumber: 1,
-            column: 48,
-            message: 'Error: Line 1: Duplicate data property in object literal not allowed in strict mode'
-        },
-
-        'function hello() {\'use strict\'; ({ hasOwnProperty: 42, hasOwnProperty: 42 }) }': {
-            index: 73,
-            lineNumber: 1,
-            column: 74,
-            message: 'Error: Line 1: Duplicate data property in object literal not allowed in strict mode'
-        },
-
-        'function hello() {\'use strict\'; var eval = 10; }': {
-            index: 40,
-            lineNumber: 1,
-            column: 41,
-            message: 'Error: Line 1: Variable name may not be eval or arguments in strict mode'
-        },
-
-        'function hello() {\'use strict\'; var arguments = 10; }': {
-            index: 45,
-            lineNumber: 1,
-            column: 46,
-            message: 'Error: Line 1: Variable name may not be eval or arguments in strict mode'
-        },
-
-        'function hello() {\'use strict\'; try { } catch (eval) { } }': {
-            index: 51,
-            lineNumber: 1,
-            column: 52,
-            message: 'Error: Line 1: Catch variable may not be eval or arguments in strict mode'
-        },
-
-        'function hello() {\'use strict\'; try { } catch (arguments) { } }': {
-            index: 56,
-            lineNumber: 1,
-            column: 57,
-            message: 'Error: Line 1: Catch variable may not be eval or arguments in strict mode'
-        },
-
-        'function hello() {\'use strict\'; eval = 10; }': {
-            index: 32,
-            lineNumber: 1,
-            column: 33,
-            message: 'Error: Line 1: Assignment to eval or arguments is not allowed in strict mode'
-        },
-
-        'function hello() {\'use strict\'; arguments = 10; }': {
-            index: 32,
-            lineNumber: 1,
-            column: 33,
-            message: 'Error: Line 1: Assignment to eval or arguments is not allowed in strict mode'
-        },
-
-        'function hello() {\'use strict\'; ++eval; }': {
-            index: 38,
-            lineNumber: 1,
-            column: 39,
-            message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode'
-        },
-
-        'function hello() {\'use strict\'; --eval; }': {
-            index: 38,
-            lineNumber: 1,
-            column: 39,
-            message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode'
-        },
-
-        'function hello() {\'use strict\'; ++arguments; }': {
-            index: 43,
-            lineNumber: 1,
-            column: 44,
-            message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode'
-        },
-
-        'function hello() {\'use strict\'; --arguments; }': {
-            index: 43,
-            lineNumber: 1,
-            column: 44,
-            message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode'
-        },
-
-        'function hello() {\'use strict\'; eval++; }': {
-            index: 36,
-            lineNumber: 1,
-            column: 37,
-            message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode'
-        },
-
-        'function hello() {\'use strict\'; eval--; }': {
-            index: 36,
-            lineNumber: 1,
-            column: 37,
-            message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode'
-        },
-
-        'function hello() {\'use strict\'; arguments++; }': {
-            index: 41,
-            lineNumber: 1,
-            column: 42,
-            message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode'
-        },
-
-        'function hello() {\'use strict\'; arguments--; }': {
-            index: 41,
-            lineNumber: 1,
-            column: 42,
-            message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode'
-        },
-
-        'function hello() {\'use strict\'; function eval() { } }': {
-            index: 41,
-            lineNumber: 1,
-            column: 42,
-            message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
-        },
-
-        'function hello() {\'use strict\'; function arguments() { } }': {
-            index: 41,
-            lineNumber: 1,
-            column: 42,
-            message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
-        },
-
-        'function eval() {\'use strict\'; }': {
-            index: 9,
-            lineNumber: 1,
-            column: 10,
-            message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
-        },
-
-        'function arguments() {\'use strict\'; }': {
-            index: 9,
-            lineNumber: 1,
-            column: 10,
-            message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
-        },
-
-        'function hello() {\'use strict\'; (function eval() { }()) }': {
-            index: 42,
-            lineNumber: 1,
-            column: 43,
-            message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
-        },
-
-        'function hello() {\'use strict\'; (function arguments() { }()) }': {
-            index: 42,
-            lineNumber: 1,
-            column: 43,
-            message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
-        },
-
-        '(function eval() {\'use strict\'; })()': {
-            index: 10,
-            lineNumber: 1,
-            column: 11,
-            message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
-        },
-
-        '(function arguments() {\'use strict\'; })()': {
-            index: 10,
-            lineNumber: 1,
-            column: 11,
-            message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
-        },
-
-        'function hello() {\'use strict\'; ({ s: function eval() { } }); }': {
-            index: 47,
-            lineNumber: 1,
-            column: 48,
-            message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
-        },
-
-        '(function package() {\'use strict\'; })()': {
-            index: 10,
-            lineNumber: 1,
-            column: 11,
-            message: 'Error: Line 1: Use of future reserved word in strict mode'
-        },
-
-        'function hello() {\'use strict\'; ({ i: 10, set s(eval) { } }); }': {
-            index: 48,
-            lineNumber: 1,
-            column: 49,
-            message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
-        },
-
-        'function hello() {\'use strict\'; ({ set s(eval) { } }); }': {
-            index: 41,
-            lineNumber: 1,
-            column: 42,
-            message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
-        },
-
-        'function hello() {\'use strict\'; ({ s: function s(eval) { } }); }': {
-            index: 49,
-            lineNumber: 1,
-            column: 50,
-            message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
-        },
-
-        'function hello(eval) {\'use strict\';}': {
-            index: 15,
-            lineNumber: 1,
-            column: 16,
-            message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
-        },
-
-        'function hello(arguments) {\'use strict\';}': {
-            index: 15,
-            lineNumber: 1,
-            column: 16,
-            message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
-        },
-
-        'function hello() { \'use strict\'; function inner(eval) {} }': {
-            index: 48,
-            lineNumber: 1,
-            column: 49,
-            message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
-        },
-
-        'function hello() { \'use strict\'; function inner(arguments) {} }': {
-            index: 48,
-            lineNumber: 1,
-            column: 49,
-            message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
-        },
-
-        ' "\\1"; \'use strict\';': {
-            index: 1,
-            lineNumber: 1,
-            column: 2,
-            message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
-        },
-
-        'function hello() { \'use strict\'; "\\1"; }': {
-            index: 33,
-            lineNumber: 1,
-            column: 34,
-            message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
-        },
-
-        'function hello() { \'use strict\'; 021; }': {
-            index: 33,
-            lineNumber: 1,
-            column: 34,
-            message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
-        },
-
-        'function hello() { \'use strict\'; ({ "\\1": 42 }); }': {
-            index: 36,
-            lineNumber: 1,
-            column: 37,
-            message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
-        },
-
-        'function hello() { \'use strict\'; ({ 021: 42 }); }': {
-            index: 36,
-            lineNumber: 1,
-            column: 37,
-            message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
-        },
-
-        'function hello() { "octal directive\\1"; "use strict"; }': {
-            index: 19,
-            lineNumber: 1,
-            column: 20,
-            message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
-        },
-
-        'function hello() { "octal directive\\1"; "octal directive\\2"; "use strict"; }': {
-            index: 19,
-            lineNumber: 1,
-            column: 20,
-            message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
-        },
-
-        'function hello() { "use strict"; function inner() { "octal directive\\1"; } }': {
-            index: 52,
-            lineNumber: 1,
-            column: 53,
-            message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
-        },
-
-        'function hello() { "use strict"; var implements; }': {
-            index: 37,
-            lineNumber: 1,
-            column: 38,
-            message: 'Error: Line 1: Use of future reserved word in strict mode'
-        },
-
-        'function hello() { "use strict"; var interface; }': {
-            index: 37,
-            lineNumber: 1,
-            column: 38,
-            message: 'Error: Line 1: Use of future reserved word in strict mode'
-        },
-
-        'function hello() { "use strict"; var package; }': {
-            index: 37,
-            lineNumber: 1,
-            column: 38,
-            message: 'Error: Line 1: Use of future reserved word in strict mode'
-        },
-
-        'function hello() { "use strict"; var private; }': {
-            index: 37,
-            lineNumber: 1,
-            column: 38,
-            message: 'Error: Line 1: Use of future reserved word in strict mode'
-        },
-
-        'function hello() { "use strict"; var protected; }': {
-            index: 37,
-            lineNumber: 1,
-            column: 38,
-            message: 'Error: Line 1: Use of future reserved word in strict mode'
-        },
-
-        'function hello() { "use strict"; var public; }': {
-            index: 37,
-            lineNumber: 1,
-            column: 38,
-            message: 'Error: Line 1: Use of future reserved word in strict mode'
-        },
-
-        'function hello() { "use strict"; var static; }': {
-            index: 37,
-            lineNumber: 1,
-            column: 38,
-            message: 'Error: Line 1: Use of future reserved word in strict mode'
-        },
-
-        'function hello() { "use strict"; var yield; }': {
-            index: 37,
-            lineNumber: 1,
-            column: 38,
-            message: 'Error: Line 1: Use of future reserved word in strict mode'
-        },
-
-        'function hello() { "use strict"; var let; }': {
-            index: 37,
-            lineNumber: 1,
-            column: 38,
-            message: 'Error: Line 1: Use of future reserved word in strict mode'
-        },
-
-        'function hello(static) { "use strict"; }': {
-            index: 15,
-            lineNumber: 1,
-            column: 16,
-            message: 'Error: Line 1: Use of future reserved word in strict mode'
-        },
-
-        'function static() { "use strict"; }': {
-            index: 9,
-            lineNumber: 1,
-            column: 10,
-            message: 'Error: Line 1: Use of future reserved word in strict mode'
-        },
-
-        'var yield': {
-            index: 4,
-            lineNumber: 1,
-            column: 5,
-            message: 'Error: Line 1: Unexpected token yield'
-        },
-
-        'var let': {
-            index: 4,
-            lineNumber: 1,
-            column: 5,
-            message: 'Error: Line 1: Unexpected token let'
-        },
-
-        '"use strict"; function static() { }': {
-            index: 23,
-            lineNumber: 1,
-            column: 24,
-            message: 'Error: Line 1: Use of future reserved word in strict mode'
-        },
-
-        'function a(t, t) { "use strict"; }': {
-            index: 14,
-            lineNumber: 1,
-            column: 15,
-            message: 'Error: Line 1: Strict mode function may not have duplicate parameter names'
-        },
-
-        'function a(eval) { "use strict"; }': {
-            index: 11,
-            lineNumber: 1,
-            column: 12,
-            message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
-        },
-
-        'function a(package) { "use strict"; }': {
-            index: 11,
-            lineNumber: 1,
-            column: 12,
-            message: 'Error: Line 1: Use of future reserved word in strict mode'
-        },
-
-        'function a() { "use strict"; function b(t, t) { }; }': {
-            index: 43,
-            lineNumber: 1,
-            column: 44,
-            message: 'Error: Line 1: Strict mode function may not have duplicate parameter names'
-        },
-
-        '(function a(t, t) { "use strict"; })': {
-            index: 15,
-            lineNumber: 1,
-            column: 16,
-            message: 'Error: Line 1: Strict mode function may not have duplicate parameter names'
-        },
-
-        'function a() { "use strict"; (function b(t, t) { }); }': {
-            index: 44,
-            lineNumber: 1,
-            column: 45,
-            message: 'Error: Line 1: Strict mode function may not have duplicate parameter names'
-        },
-
-        '(function a(eval) { "use strict"; })': {
-            index: 12,
-            lineNumber: 1,
-            column: 13,
-            message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
-        },
-
-        '(function a(package) { "use strict"; })': {
-            index: 12,
-            lineNumber: 1,
-            column: 13,
-            message: 'Error: Line 1: Use of future reserved word in strict mode'
-        },
-
-        'var': {
-            index: 3,
-            lineNumber: 1,
-            column: 4,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        'let': {
-            index: 3,
-            lineNumber: 1,
-            column: 4,
-            message: 'Error: Line 1: Unexpected end of input'
-        },
-
-        'const': {
-            index: 5,
-            lineNumber: 1,
-            column: 6,
-            message: 'Error: Line 1: Unexpected end of input'
-        }
-
-    },
-
-    'API': {
-        'parse()': {
-            call: 'parse',
-            args: [],
-            result: {
-                type: 'Program',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'Identifier',
-                        name: 'undefined'
-                    }
-                }]
-            }
-        },
-
-        'parse(null)': {
-            call: 'parse',
-            args: [null],
-            result: {
-                type: 'Program',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'Literal',
-                        value: null
-                    }
-                }]
-            }
-        },
-
-        'parse(42)': {
-            call: 'parse',
-            args: [42],
-            result: {
-                type: 'Program',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'Literal',
-                        value: 42
-                    }
-                }]
-            }
-        },
-
-        'parse(true)': {
-            call: 'parse',
-            args: [true],
-            result: {
-                type: 'Program',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'Literal',
-                        value: true
-                    }
-                }]
-            }
-        },
-
-        'parse(undefined)': {
-            call: 'parse',
-            args: [void 0],
-            result: {
-                type: 'Program',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'Identifier',
-                        name: 'undefined'
-                    }
-                }]
-            }
-        },
-
-        'parse(new String("test"))': {
-            call: 'parse',
-            args: [new String('test')],
-            result: {
-                type: 'Program',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'Identifier',
-                        name: 'test'
-                    }
-                }]
-            }
-        },
-
-        'parse(new Number(42))': {
-            call: 'parse',
-            args: [new Number(42)],
-            result: {
-                type: 'Program',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'Literal',
-                        value: 42
-                    }
-                }]
-            }
-        },
-
-        'parse(new Boolean(true))': {
-            call: 'parse',
-            args: [new Boolean(true)],
-            result: {
-                type: 'Program',
-                body: [{
-                    type: 'ExpressionStatement',
-                    expression: {
-                        type: 'Literal',
-                        value: true
-                    }
-                }]
-            }
-        },
-
-        'Syntax': {
-            property: 'Syntax',
-            result: {
-                AssignmentExpression: 'AssignmentExpression',
-                ArrayExpression: 'ArrayExpression',
-                BlockStatement: 'BlockStatement',
-                BinaryExpression: 'BinaryExpression',
-                BreakStatement: 'BreakStatement',
-                CallExpression: 'CallExpression',
-                CatchClause: 'CatchClause',
-                ConditionalExpression: 'ConditionalExpression',
-                ContinueStatement: 'ContinueStatement',
-                DoWhileStatement: 'DoWhileStatement',
-                DebuggerStatement: 'DebuggerStatement',
-                EmptyStatement: 'EmptyStatement',
-                ExpressionStatement: 'ExpressionStatement',
-                ForStatement: 'ForStatement',
-                ForInStatement: 'ForInStatement',
-                FunctionDeclaration: 'FunctionDeclaration',
-                FunctionExpression: 'FunctionExpression',
-                Identifier: 'Identifier',
-                IfStatement: 'IfStatement',
-                Literal: 'Literal',
-                LabeledStatement: 'LabeledStatement',
-                LogicalExpression: 'LogicalExpression',
-                MemberExpression: 'MemberExpression',
-                NewExpression: 'NewExpression',
-                ObjectExpression: 'ObjectExpression',
-                Program: 'Program',
-                Property: 'Property',
-                ReturnStatement: 'ReturnStatement',
-                SequenceExpression: 'SequenceExpression',
-                SwitchStatement: 'SwitchStatement',
-                SwitchCase: 'SwitchCase',
-                ThisExpression: 'ThisExpression',
-                ThrowStatement: 'ThrowStatement',
-                TryStatement: 'TryStatement',
-                UnaryExpression: 'UnaryExpression',
-                UpdateExpression: 'UpdateExpression',
-                VariableDeclaration: 'VariableDeclaration',
-                VariableDeclarator: 'VariableDeclarator',
-                WhileStatement: 'WhileStatement',
-                WithStatement: 'WithStatement'
-            }
-        }
-
-    },
-
-    'Tolerant parse': {
-        'return': {
-            type: 'Program',
-            body: [{
-                type: 'ReturnStatement',
-                'argument': null,
-                range: [0, 6],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 6 }
-                }
-            }],
-            range: [0, 6],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 6 }
-            },
-            errors: [{
-                index: 6,
-                lineNumber: 1,
-                column: 7,
-                message: 'Error: Line 1: Illegal return statement'
-            }]
-        },
-
-        '(function () { \'use strict\'; with (i); }())': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'FunctionExpression',
-                        id: null,
-                        params: [],
-                        defaults: [],
-                        body: {
-                            type: 'BlockStatement',
-                            body: [{
-                                type: 'ExpressionStatement',
-                                expression: {
-                                    type: 'Literal',
-                                    value: 'use strict',
-                                    raw: '\'use strict\'',
-                                    range: [15, 27],
-                                    loc: {
-                                        start: { line: 1, column: 15 },
-                                        end: { line: 1, column: 27 }
-                                    }
-                                },
-                                range: [15, 28],
-                                loc: {
-                                    start: { line: 1, column: 15 },
-                                    end: { line: 1, column: 28 }
-                                }
-                            }, {
-                                type: 'WithStatement',
-                                object: {
-                                    type: 'Identifier',
-                                    name: 'i',
-                                    range: [35, 36],
-                                    loc: {
-                                        start: { line: 1, column: 35 },
-                                        end: { line: 1, column: 36 }
-                                    }
-                                },
-                                body: {
-                                    type: 'EmptyStatement',
-                                    range: [37, 38],
-                                    loc: {
-                                        start: { line: 1, column: 37 },
-                                        end: { line: 1, column: 38 }
-                                    }
-                                },
-                                range: [29, 38],
-                                loc: {
-                                    start: { line: 1, column: 29 },
-                                    end: { line: 1, column: 38 }
-                                }
-                            }],
-                            range: [13, 40],
-                            loc: {
-                                start: { line: 1, column: 13 },
-                                end: { line: 1, column: 40 }
-                            }
-                        },
-                        rest: null,
-                        generator: false,
-                        expression: false,
-                        range: [1, 40],
-                        loc: {
-                            start: { line: 1, column: 1 },
-                            end: { line: 1, column: 40 }
-                        }
-                    },
-                    'arguments': [],
-                    range: [1, 42],
-                    loc: {
-                        start: { line: 1, column: 1 },
-                        end: { line: 1, column: 42 }
-                    }
-                },
-                range: [0, 43],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 43 }
-                }
-            }],
-            range: [0, 43],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 43 }
-            },
-            errors: [{
-                index: 29,
-                lineNumber: 1,
-                column: 30,
-                message: 'Error: Line 1: Strict mode code may not include a with statement'
-            }]
-        },
-
-        '(function () { \'use strict\'; 021 }())': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'CallExpression',
-                    callee: {
-                        type: 'FunctionExpression',
-                        id: null,
-                        params: [],
-                        defaults: [],
-                        body: {
-                            type: 'BlockStatement',
-                            body: [{
-                                type: 'ExpressionStatement',
-                                expression: {
-                                    type: 'Literal',
-                                    value: 'use strict',
-                                    raw: '\'use strict\'',
-                                    range: [15, 27],
-                                    loc: {
-                                        start: { line: 1, column: 15 },
-                                        end: { line: 1, column: 27 }
-                                    }
-                                },
-                                range: [15, 28],
-                                loc: {
-                                    start: { line: 1, column: 15 },
-                                    end: { line: 1, column: 28 }
-                                }
-                            }, {
-                                type: 'ExpressionStatement',
-                                expression: {
-                                    type: 'Literal',
-                                    value: 17,
-                                    raw: "021",
-                                    range: [29, 32],
-                                    loc: {
-                                        start: { line: 1, column: 29 },
-                                        end: { line: 1, column: 32 }
-                                    }
-                                },
-                                range: [29, 33],
-                                loc: {
-                                    start: { line: 1, column: 29 },
-                                    end: { line: 1, column: 33 }
-                                }
-                            }],
-                            range: [13, 34],
-                            loc: {
-                                start: { line: 1, column: 13 },
-                                end: { line: 1, column: 34 }
-                            }
-                        },
-                        rest: null,
-                        generator: false,
-                        expression: false,
-                        range: [1, 34],
-                        loc: {
-                            start: { line: 1, column: 1 },
-                            end: { line: 1, column: 34 }
-                        }
-                    },
-                    'arguments': [],
-                    range: [1, 36],
-                    loc: {
-                        start: { line: 1, column: 1 },
-                        end: { line: 1, column: 36 }
-                    }
-                },
-                range: [0, 37],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 37 }
-                }
-            }],
-            range: [0, 37],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 37 }
-            },
-            errors: [{
-                index: 29,
-                lineNumber: 1,
-                column: 30,
-                message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
-            }]
-        },
-
-        '"use strict"; delete x': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'UnaryExpression',
-                    operator: 'delete',
-                    argument: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [21, 22],
-                        loc: {
-                            start: { line: 1, column: 21 },
-                            end: { line: 1, column: 22 }
-                        }
-                    },
-                    prefix: true,
-                    range: [14, 22],
-                    loc: {
-                        start: { line: 1, column: 14 },
-                        end: { line: 1, column: 22 }
-                    }
-                },
-                range: [14, 22],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 22 }
-                }
-            }],
-            range: [0, 22],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 22 }
-            },
-            errors: [{
-                index: 22,
-                lineNumber: 1,
-                column: 23,
-                message: 'Error: Line 1: Delete of an unqualified identifier in strict mode.'
-            }]
-        },
-
-        '"use strict"; try {} catch (eval) {}': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'TryStatement',
-                block: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [18, 20],
-                    loc: {
-                        start: { line: 1, column: 18 },
-                        end: { line: 1, column: 20 }
-                    }
-                },
-                guardedHandlers: [],
-                handlers: [{
-                    type: 'CatchClause',
-                    param: {
-                        type: 'Identifier',
-                        name: 'eval',
-                        range: [28, 32],
-                        loc: {
-                            start: { line: 1, column: 28 },
-                            end: { line: 1, column: 32 }
-                        }
-                    },
-                    body: {
-                        type: 'BlockStatement',
-                        body: [],
-                        range: [34, 36],
-                        loc: {
-                            start: { line: 1, column: 34 },
-                            end: { line: 1, column: 36 }
-                        }
-                    },
-                    range: [21, 36],
-                    loc: {
-                        start: { line: 1, column: 21 },
-                        end: { line: 1, column: 36 }
-                    }
-                }],
-                finalizer: null,
-                range: [14, 36],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 36 }
-                }
-            }],
-            range: [0, 36],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 36 }
-            },
-            errors: [{
-                index: 32,
-                lineNumber: 1,
-                column: 33,
-                message: 'Error: Line 1: Catch variable may not be eval or arguments in strict mode'
-            }]
-        },
-
-        '"use strict"; try {} catch (arguments) {}': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'TryStatement',
-                block: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [18, 20],
-                    loc: {
-                        start: { line: 1, column: 18 },
-                        end: { line: 1, column: 20 }
-                    }
-                },
-                guardedHandlers: [],
-                handlers: [{
-                    type: 'CatchClause',
-                    param: {
-                        type: 'Identifier',
-                        name: 'arguments',
-                        range: [28, 37],
-                        loc: {
-                            start: { line: 1, column: 28 },
-                            end: { line: 1, column: 37 }
-                        }
-                    },
-                    body: {
-                        type: 'BlockStatement',
-                        body: [],
-                        range: [39, 41],
-                        loc: {
-                            start: { line: 1, column: 39 },
-                            end: { line: 1, column: 41 }
-                        }
-                    },
-                    range: [21, 41],
-                    loc: {
-                        start: { line: 1, column: 21 },
-                        end: { line: 1, column: 41 }
-                    }
-                }],
-                finalizer: null,
-                range: [14, 41],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 41 }
-                }
-            }],
-            range: [0, 41],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 41 }
-            },
-            errors: [{
-                index: 37,
-                lineNumber: 1,
-                column: 38,
-                message: 'Error: Line 1: Catch variable may not be eval or arguments in strict mode'
-            }]
-        },
-
-        '"use strict"; var eval;': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'eval',
-                        range: [18, 22],
-                        loc: {
-                            start: { line: 1, column: 18 },
-                            end: { line: 1, column: 22 }
-                        }
-                    },
-                    init: null,
-                    range: [18, 22],
-                    loc: {
-                        start: { line: 1, column: 18 },
-                        end: { line: 1, column: 22 }
-                    }
-                }],
-                kind: 'var',
-                range: [14, 23],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 23 }
-                }
-            }],
-            range: [0, 23],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 23 }
-            },
-            errors: [{
-                index: 22,
-                lineNumber: 1,
-                column: 23,
-                message: 'Error: Line 1: Variable name may not be eval or arguments in strict mode'
-            }]
-        },
-
-        '"use strict"; var arguments;': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'arguments',
-                        range: [18, 27],
-                        loc: {
-                            start: { line: 1, column: 18 },
-                            end: { line: 1, column: 27 }
-                        }
-                    },
-                    init: null,
-                    range: [18, 27],
-                    loc: {
-                        start: { line: 1, column: 18 },
-                        end: { line: 1, column: 27 }
-                    }
-                }],
-                kind: 'var',
-                range: [14, 28],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 28 }
-                }
-            }],
-            range: [0, 28],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 28 }
-            },
-            errors: [{
-                index: 27,
-                lineNumber: 1,
-                column: 28,
-                message: 'Error: Line 1: Variable name may not be eval or arguments in strict mode'
-            }]
-        },
-
-        '"use strict"; eval = 0;': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'AssignmentExpression',
-                    operator: '=',
-                    left: {
-                        type: 'Identifier',
-                        name: 'eval',
-                        range: [14, 18],
-                        loc: {
-                            start: { line: 1, column: 14 },
-                            end: { line: 1, column: 18 }
-                        }
-                    },
-                    right: {
-                        type: 'Literal',
-                        value: 0,
-                        raw: '0',
-                        range: [21, 22],
-                        loc: {
-                            start: { line: 1, column: 21 },
-                            end: { line: 1, column: 22 }
-                        }
-                    },
-                    range: [14, 22],
-                    loc: {
-                        start: { line: 1, column: 14 },
-                        end: { line: 1, column: 22 }
-                    }
-                },
-                range: [14, 23],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 23 }
-                }
-            }],
-            range: [0, 23],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 23 }
-            },
-            errors: [{
-                index: 14,
-                lineNumber: 1,
-                column: 15,
-                message: 'Error: Line 1: Assignment to eval or arguments is not allowed in strict mode'
-            }]
-        },
-
-        '"use strict"; eval++;': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'UpdateExpression',
-                    operator: '++',
-                    argument: {
-                        type: 'Identifier',
-                        name: 'eval',
-                        range: [14, 18],
-                        loc: {
-                            start: { line: 1, column: 14 },
-                            end: { line: 1, column: 18 }
-                        }
-                    },
-                    prefix: false,
-                    range: [14, 20],
-                    loc: {
-                        start: { line: 1, column: 14 },
-                        end: { line: 1, column: 20 }
-                    }
-                },
-                range: [14, 21],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 21 }
-                }
-            }],
-            range: [0, 21],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 21 }
-            },
-            errors: [{
-                index: 18,
-                lineNumber: 1,
-                column: 19,
-                message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode'
-            }]
-        },
-
-        '"use strict"; --eval;': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'UpdateExpression',
-                    operator: '--',
-                    argument: {
-                        type: 'Identifier',
-                        name: 'eval',
-                        range: [16, 20],
-                        loc: {
-                            start: { line: 1, column: 16 },
-                            end: { line: 1, column: 20 }
-                        }
-                    },
-                    prefix: true,
-                    range: [14, 20],
-                    loc: {
-                        start: { line: 1, column: 14 },
-                        end: { line: 1, column: 20 }
-                    }
-                },
-                range: [14, 21],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 21 }
-                }
-            }],
-            range: [0, 21],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 21 }
-            },
-            errors: [{
-                index: 20,
-                lineNumber: 1,
-                column: 21,
-                message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode'
-            }]
-        },
-
-        '"use strict"; arguments = 0;': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'AssignmentExpression',
-                    operator: '=',
-                    left: {
-                        type: 'Identifier',
-                        name: 'arguments',
-                        range: [14, 23],
-                        loc: {
-                            start: { line: 1, column: 14 },
-                            end: { line: 1, column: 23 }
-                        }
-                    },
-                    right: {
-                        type: 'Literal',
-                        value: 0,
-                        raw: '0',
-                        range: [26, 27],
-                        loc: {
-                            start: { line: 1, column: 26 },
-                            end: { line: 1, column: 27 }
-                        }
-                    },
-                    range: [14, 27],
-                    loc: {
-                        start: { line: 1, column: 14 },
-                        end: { line: 1, column: 27 }
-                    }
-                },
-                range: [14, 28],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 28 }
-                }
-            }],
-            range: [0, 28],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 28 }
-            },
-            errors: [{
-                index: 14,
-                lineNumber: 1,
-                column: 15,
-                message: 'Error: Line 1: Assignment to eval or arguments is not allowed in strict mode'
-            }]
-        },
-
-        '"use strict"; arguments--;': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'UpdateExpression',
-                    operator: '--',
-                    argument: {
-                        type: 'Identifier',
-                        name: 'arguments',
-                        range: [14, 23],
-                        loc: {
-                            start: { line: 1, column: 14 },
-                            end: { line: 1, column: 23 }
-                        }
-                    },
-                    prefix: false,
-                    range: [14, 25],
-                    loc: {
-                        start: { line: 1, column: 14 },
-                        end: { line: 1, column: 25 }
-                    }
-                },
-                range: [14, 26],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 26 }
-                }
-            }],
-            range: [0, 26],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 26 }
-            },
-            errors: [{
-                index: 23,
-                lineNumber: 1,
-                column: 24,
-                message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode'
-            }]
-        },
-
-        '"use strict"; ++arguments;': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'UpdateExpression',
-                    operator: '++',
-                    argument: {
-                        type: 'Identifier',
-                        name: 'arguments',
-                        range: [16, 25],
-                        loc: {
-                            start: { line: 1, column: 16 },
-                            end: { line: 1, column: 25 }
-                        }
-                    },
-                    prefix: true,
-                    range: [14, 25],
-                    loc: {
-                        start: { line: 1, column: 14 },
-                        end: { line: 1, column: 25 }
-                    }
-                },
-                range: [14, 26],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 26 }
-                }
-            }],
-            range: [0, 26],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 26 }
-            },
-            errors: [{
-                index: 25,
-                lineNumber: 1,
-                column: 26,
-                message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode'
-            }]
-        },
-
-
-        '"use strict";x={y:1,y:1}': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'AssignmentExpression',
-                    operator: '=',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [13, 14],
-                        loc: {
-                            start: { line: 1, column: 13 },
-                            end: { line: 1, column: 14 }
-                        }
-                    },
-                    right: {
-                        type: 'ObjectExpression',
-                        properties: [{
-                            type: 'Property',
-                            key: {
-                                type: 'Identifier',
-                                name: 'y',
-                                range: [16, 17],
-                                loc: {
-                                    start: { line: 1, column: 16 },
-                                    end: { line: 1, column: 17 }
-                                }
-                            },
-                            value: {
-                                type: 'Literal',
-                                value: 1,
-                                raw: '1',
-                                range: [18, 19],
-                                loc: {
-                                    start: { line: 1, column: 18 },
-                                    end: { line: 1, column: 19 }
-                                }
-                            },
-                            kind: 'init',
-                            range: [16, 19],
-                            loc: {
-                                start: { line: 1, column: 16 },
-                                end: { line: 1, column: 19 }
-                            }
-                        }, {
-                            type: 'Property',
-                            key: {
-                                type: 'Identifier',
-                                name: 'y',
-                                range: [20, 21],
-                                loc: {
-                                    start: { line: 1, column: 20 },
-                                    end: { line: 1, column: 21 }
-                                }
-                            },
-                            value: {
-                                type: 'Literal',
-                                value: 1,
-                                raw: '1',
-                                range: [22, 23],
-                                loc: {
-                                    start: { line: 1, column: 22 },
-                                    end: { line: 1, column: 23 }
-                                }
-                            },
-                            kind: 'init',
-                            range: [20, 23],
-                            loc: {
-                                start: { line: 1, column: 20 },
-                                end: { line: 1, column: 23 }
-                            }
-                        }],
-                        range: [15, 24],
-                        loc: {
-                            start: { line: 1, column: 15 },
-                            end: { line: 1, column: 24 }
-                        }
-                    },
-                    range: [13, 24],
-                    loc: {
-                        start: { line: 1, column: 13 },
-                        end: { line: 1, column: 24 }
-                    }
-                },
-                range: [13, 24],
-                loc: {
-                    start: { line: 1, column: 13 },
-                    end: { line: 1, column: 24 }
-                }
-            }],
-            range: [0, 24],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 24 }
-            },
-            errors: [{
-                index: 23,
-                lineNumber: 1,
-                column: 24,
-                message: 'Error: Line 1: Duplicate data property in object literal not allowed in strict mode'
-            }]
-        },
-
-        '"use strict"; function eval() {};': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'FunctionDeclaration',
-                id: {
-                    type: 'Identifier',
-                    name: 'eval',
-                    range: [23, 27],
-                    loc: {
-                        start: { line: 1, column: 23 },
-                        end: { line: 1, column: 27 }
-                    }
-                },
-                params: [],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [30, 32],
-                    loc: {
-                        start: { line: 1, column: 30 },
-                        end: { line: 1, column: 32 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [14, 32],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 32 }
-                }
-            }, {
-                type: 'EmptyStatement',
-                range: [32, 33],
-                loc: {
-                    start: { line: 1, column: 32 },
-                    end: { line: 1, column: 33 }
-                }
-            }],
-            range: [0, 33],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 33 }
-            },
-            errors: [{
-                index: 23,
-                lineNumber: 1,
-                column: 24,
-                message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
-            }]
-        },
-
-        '"use strict"; function arguments() {};': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'FunctionDeclaration',
-                id: {
-                    type: 'Identifier',
-                    name: 'arguments',
-                    range: [23, 32],
-                    loc: {
-                        start: { line: 1, column: 23 },
-                        end: { line: 1, column: 32 }
-                    }
-                },
-                params: [],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [35, 37],
-                    loc: {
-                        start: { line: 1, column: 35 },
-                        end: { line: 1, column: 37 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [14, 37],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 37 }
-                }
-            }, {
-                type: 'EmptyStatement',
-                range: [37, 38],
-                loc: {
-                    start: { line: 1, column: 37 },
-                    end: { line: 1, column: 38 }
-                }
-            }],
-            range: [0, 38],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 38 }
-            },
-            errors: [{
-                index: 23,
-                lineNumber: 1,
-                column: 24,
-                message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
-            }]
-        },
-
-        '"use strict"; function interface() {};': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'FunctionDeclaration',
-                id: {
-                    type: 'Identifier',
-                    name: 'interface',
-                    range: [23, 32],
-                    loc: {
-                        start: { line: 1, column: 23 },
-                        end: { line: 1, column: 32 }
-                    }
-                },
-                params: [],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [35, 37],
-                    loc: {
-                        start: { line: 1, column: 35 },
-                        end: { line: 1, column: 37 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [14, 37],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 37 }
-                }
-            }, {
-                type: 'EmptyStatement',
-                range: [37, 38],
-                loc: {
-                    start: { line: 1, column: 37 },
-                    end: { line: 1, column: 38 }
-                }
-            }],
-            range: [0, 38],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 38 }
-            },
-            errors: [{
-                index: 23,
-                lineNumber: 1,
-                column: 24,
-                message: 'Error: Line 1: Use of future reserved word in strict mode'
-            }]
-        },
-
-        '"use strict"; (function eval() {});': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'FunctionExpression',
-                    id: {
-                        type: 'Identifier',
-                        name: 'eval',
-                        range: [24, 28],
-                        loc: {
-                            start: { line: 1, column: 24 },
-                            end: { line: 1, column: 28 }
-                        }
-                    },
-                    params: [],
-                    defaults: [],
-                    body: {
-                        type: 'BlockStatement',
-                        body: [],
-                        range: [31, 33],
-                        loc: {
-                            start: { line: 1, column: 31 },
-                            end: { line: 1, column: 33 }
-                        }
-                    },
-                    rest: null,
-                    generator: false,
-                    expression: false,
-                    range: [15, 33],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 33 }
-                    }
-                },
-                range: [14, 35],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 35 }
-                }
-            }],
-            range: [0, 35],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 35 }
-            },
-            errors: [{
-                index: 24,
-                lineNumber: 1,
-                column: 25,
-                message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
-            }]
-        },
-
-        '"use strict"; (function arguments() {});': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'FunctionExpression',
-                    id: {
-                        type: 'Identifier',
-                        name: 'arguments',
-                        range: [24, 33],
-                        loc: {
-                            start: { line: 1, column: 24 },
-                            end: { line: 1, column: 33 }
-                        }
-                    },
-                    params: [],
-                    defaults: [],
-                    body: {
-                        type: 'BlockStatement',
-                        body: [],
-                        range: [36, 38],
-                        loc: {
-                            start: { line: 1, column: 36 },
-                            end: { line: 1, column: 38 }
-                        }
-                    },
-                    rest: null,
-                    generator: false,
-                    expression: false,
-                    range: [15, 38],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 38 }
-                    }
-                },
-                range: [14, 40],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 40 }
-                }
-            }],
-            range: [0, 40],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 40 }
-            },
-            errors: [{
-                index: 24,
-                lineNumber: 1,
-                column: 25,
-                message: 'Error: Line 1: Function name may not be eval or arguments in strict mode'
-            }]
-        },
-
-        '"use strict"; (function interface() {});': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'FunctionExpression',
-                    id: {
-                        type: 'Identifier',
-                        name: 'interface',
-                        range: [24, 33],
-                        loc: {
-                            start: { line: 1, column: 24 },
-                            end: { line: 1, column: 33 }
-                        }
-                    },
-                    params: [],
-                    defaults: [],
-                    body: {
-                        type: 'BlockStatement',
-                        body: [],
-                        range: [36, 38],
-                        loc: {
-                            start: { line: 1, column: 36 },
-                            end: { line: 1, column: 38 }
-                        }
-                    },
-                    rest: null,
-                    generator: false,
-                    expression: false,
-                    range: [15, 38],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 38 }
-                    }
-                },
-                range: [14, 40],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 40 }
-                }
-            }],
-            range: [0, 40],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 40 }
-            },
-            errors: [{
-                index: 24,
-                lineNumber: 1,
-                column: 25,
-                message: 'Error: Line 1: Use of future reserved word in strict mode'
-            }]
-        },
-
-        '"use strict"; function f(eval) {};': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'FunctionDeclaration',
-                id: {
-                    type: 'Identifier',
-                    name: 'f',
-                    range: [23, 24],
-                    loc: {
-                        start: { line: 1, column: 23 },
-                        end: { line: 1, column: 24 }
-                    }
-                },
-                params: [{
-                    type: 'Identifier',
-                    name: 'eval',
-                    range: [25, 29],
-                    loc: {
-                        start: { line: 1, column: 25 },
-                        end: { line: 1, column: 29 }
-                    }
-                }],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [31, 33],
-                    loc: {
-                        start: { line: 1, column: 31 },
-                        end: { line: 1, column: 33 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [14, 33],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 33 }
-                }
-            }, {
-                type: 'EmptyStatement',
-                range: [33, 34],
-                loc: {
-                    start: { line: 1, column: 33 },
-                    end: { line: 1, column: 34 }
-                }
-            }],
-            range: [0, 34],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 34 }
-            },
-            errors: [{
-                index: 25,
-                lineNumber: 1,
-                column: 26,
-                message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
-            }]
-        },
-
-        '"use strict"; function f(arguments) {};': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'FunctionDeclaration',
-                id: {
-                    type: 'Identifier',
-                    name: 'f',
-                    range: [23, 24],
-                    loc: {
-                        start: { line: 1, column: 23 },
-                        end: { line: 1, column: 24 }
-                    }
-                },
-                params: [{
-                    type: 'Identifier',
-                    name: 'arguments',
-                    range: [25, 34],
-                    loc: {
-                        start: { line: 1, column: 25 },
-                        end: { line: 1, column: 34 }
-                    }
-                }],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [36, 38],
-                    loc: {
-                        start: { line: 1, column: 36 },
-                        end: { line: 1, column: 38 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [14, 38],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 38 }
-                }
-            }, {
-                type: 'EmptyStatement',
-                range: [38, 39],
-                loc: {
-                    start: { line: 1, column: 38 },
-                    end: { line: 1, column: 39 }
-                }
-            }],
-            range: [0, 39],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 39 }
-            },
-            errors: [{
-                index: 25,
-                lineNumber: 1,
-                column: 26,
-                message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
-            }]
-        },
-
-        '"use strict"; function f(foo,  foo) {};': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'FunctionDeclaration',
-                id: {
-                    type: 'Identifier',
-                    name: 'f',
-                    range: [23, 24],
-                    loc: {
-                        start: { line: 1, column: 23 },
-                        end: { line: 1, column: 24 }
-                    }
-                },
-                params: [{
-                    type: 'Identifier',
-                    name: 'foo',
-                    range: [25, 28],
-                    loc: {
-                        start: { line: 1, column: 25 },
-                        end: { line: 1, column: 28 }
-                    }
-                }, {
-                    type: 'Identifier',
-                    name: 'foo',
-                    range: [31, 34],
-                    loc: {
-                        start: { line: 1, column: 31 },
-                        end: { line: 1, column: 34 }
-                    }
-                }],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [36, 38],
-                    loc: {
-                        start: { line: 1, column: 36 },
-                        end: { line: 1, column: 38 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [14, 38],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 38 }
-                }
-            }, {
-                type: 'EmptyStatement',
-                range: [38, 39],
-                loc: {
-                    start: { line: 1, column: 38 },
-                    end: { line: 1, column: 39 }
-                }
-            }],
-            range: [0, 39],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 39 }
-            },
-            errors: [{
-                index: 31,
-                lineNumber: 1,
-                column: 32,
-                message: 'Error: Line 1: Strict mode function may not have duplicate parameter names'
-            }]
-        },
-
-        '"use strict"; (function f(eval) {});': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'FunctionExpression',
-                    id: {
-                        type: 'Identifier',
-                        name: 'f',
-                        range: [24, 25],
-                        loc: {
-                            start: { line: 1, column: 24 },
-                            end: { line: 1, column: 25 }
-                        }
-                    },
-                    params: [{
-                        type: 'Identifier',
-                        name: 'eval',
-                        range: [26, 30],
-                        loc: {
-                            start: { line: 1, column: 26 },
-                            end: { line: 1, column: 30 }
-                        }
-                    }],
-                    defaults: [],
-                    body: {
-                        type: 'BlockStatement',
-                        body: [],
-                        range: [32, 34],
-                        loc: {
-                            start: { line: 1, column: 32 },
-                            end: { line: 1, column: 34 }
-                        }
-                    },
-                    rest: null,
-                    generator: false,
-                    expression: false,
-                    range: [15, 34],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 34 }
-                    }
-                },
-                range: [14, 36],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 36 }
-                }
-            }],
-            range: [0, 36],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 36 }
-            },
-            errors: [{
-                index: 26,
-                lineNumber: 1,
-                column: 27,
-                message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
-            }]
-        },
-
-
-        '"use strict"; (function f(arguments) {});': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'FunctionExpression',
-                    id: {
-                        type: 'Identifier',
-                        name: 'f',
-                        range: [24, 25],
-                        loc: {
-                            start: { line: 1, column: 24 },
-                            end: { line: 1, column: 25 }
-                        }
-                    },
-                    params: [{
-                        type: 'Identifier',
-                        name: 'arguments',
-                        range: [26, 35],
-                        loc: {
-                            start: { line: 1, column: 26 },
-                            end: { line: 1, column: 35 }
-                        }
-                    }],
-                    defaults: [],
-                    body: {
-                        type: 'BlockStatement',
-                        body: [],
-                        range: [37, 39],
-                        loc: {
-                            start: { line: 1, column: 37 },
-                            end: { line: 1, column: 39 }
-                        }
-                    },
-                    rest: null,
-                    generator: false,
-                    expression: false,
-                    range: [15, 39],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 39 }
-                    }
-                },
-                range: [14, 41],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 41 }
-                }
-            }],
-            range: [0, 41],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 41 }
-            },
-            errors: [{
-                index: 26,
-                lineNumber: 1,
-                column: 27,
-                message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
-            }]
-        },
-
-        '"use strict"; (function f(foo,  foo) {});': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'FunctionExpression',
-                    id: {
-                        type: 'Identifier',
-                        name: 'f',
-                        range: [24, 25],
-                        loc: {
-                            start: { line: 1, column: 24 },
-                            end: { line: 1, column: 25 }
-                        }
-                    },
-                    params: [{
-                        type: 'Identifier',
-                        name: 'foo',
-                        range: [26, 29],
-                        loc: {
-                            start: { line: 1, column: 26 },
-                            end: { line: 1, column: 29 }
-                        }
-                    }, {
-                        type: 'Identifier',
-                        name: 'foo',
-                        range: [32, 35],
-                        loc: {
-                            start: { line: 1, column: 32 },
-                            end: { line: 1, column: 35 }
-                        }
-                    }],
-                    defaults: [],
-                    body: {
-                        type: 'BlockStatement',
-                        body: [],
-                        range: [37, 39],
-                        loc: {
-                            start: { line: 1, column: 37 },
-                            end: { line: 1, column: 39 }
-                        }
-                    },
-                    rest: null,
-                    generator: false,
-                    expression: false,
-                    range: [15, 39],
-                    loc: {
-                        start: { line: 1, column: 15 },
-                        end: { line: 1, column: 39 }
-                    }
-                },
-                range: [14, 41],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 41 }
-                }
-            }],
-            range: [0, 41],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 41 }
-            },
-            errors: [{
-                index: 32,
-                lineNumber: 1,
-                column: 33,
-                message: 'Error: Line 1: Strict mode function may not have duplicate parameter names'
-            }]
-        },
-
-        '"use strict"; x = { set f(eval) {} }' : {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'AssignmentExpression',
-                    operator: '=',
-                    left: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [14, 15],
-                        loc: {
-                            start: { line: 1, column: 14 },
-                            end: { line: 1, column: 15 }
-                        }
-                    },
-                    right: {
-                        type: 'ObjectExpression',
-                        properties: [{
-                            type: 'Property',
-                            key: {
-                                type: 'Identifier',
-                                name: 'f',
-                                range: [24, 25],
-                                loc: {
-                                    start: { line: 1, column: 24 },
-                                    end: { line: 1, column: 25 }
-                                }
-                            },
-                            value : {
-                                type: 'FunctionExpression',
-                                id: null,
-                                params: [{
-                                    type: 'Identifier',
-                                    name: 'eval',
-                                    range: [26, 30],
-                                    loc: {
-                                        start: { line: 1, column: 26 },
-                                        end: { line: 1, column: 30 }
-                                    }
-                                }],
-                                defaults: [],
-                                body: {
-                                    type: 'BlockStatement',
-                                    body: [],
-                                    range: [32, 34],
-                                    loc: {
-                                        start: { line: 1, column: 32 },
-                                        end: { line: 1, column: 34 }
-                                    }
-                                },
-                                rest: null,
-                                generator: false,
-                                expression: false,
-                                range: [32, 34],
-                                loc: {
-                                    start: { line: 1, column: 32 },
-                                    end: { line: 1, column: 34 }
-                                }
-                            },
-                            kind: 'set',
-                            range: [20, 34],
-                            loc: {
-                                start: { line: 1, column: 20 },
-                                end: { line: 1, column: 34 }
-                            }
-                        }],
-                        range: [18, 36],
-                        loc: {
-                            start: { line: 1, column: 18 },
-                            end: { line: 1, column: 36 }
-                        }
-                    },
-                    range: [14, 36],
-                    loc: {
-                        start: { line: 1, column: 14 },
-                        end: { line: 1, column: 36 }
-                    }
-                },
-                range: [14, 36],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 36 }
-                }
-            }],
-            range: [0, 36],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 36 }
-            },
-            errors: [{
-                index: 26,
-                lineNumber: 1,
-                column: 27,
-                message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode'
-            }]
-        },
-
-        'function hello() { "octal directive\\1"; "use strict"; }': {
-            type: 'Program',
-            body: [{
-                type: 'FunctionDeclaration',
-                id: {
-                    type: 'Identifier',
-                    name: 'hello',
-                    range: [9, 14],
-                    loc: {
-                        start: { line: 1, column: 9 },
-                        end: { line: 1, column: 14 }
-                    }
-                },
-                params: [],
-                defaults: [],
-                body: {
-                    type: 'BlockStatement',
-                    body: [{
-                        type: 'ExpressionStatement',
-                        expression: {
-                            type: 'Literal',
-                            value: 'octal directive\u0001',
-                            raw: '"octal directive\\1"',
-                            range: [19, 38],
-                            loc: {
-                                start: { line: 1, column: 19 },
-                                end: { line: 1, column: 38 }
-                            }
-                        },
-                        range: [19, 39],
-                        loc: {
-                            start: { line: 1, column: 19 },
-                            end: { line: 1, column: 39 }
-                        }
-                    }, {
-                        type: 'ExpressionStatement',
-                        expression: {
-                            type: 'Literal',
-                            value: 'use strict',
-                            raw: '"use strict"',
-                            range: [40, 52],
-                            loc: {
-                                start: { line: 1, column: 40 },
-                                end: { line: 1, column: 52 }
-                            }
-                        },
-                        range: [40, 53],
-                        loc: {
-                            start: { line: 1, column: 40 },
-                            end: { line: 1, column: 53 }
-                        }
-                    }],
-                    range: [17, 55],
-                    loc: {
-                        start: { line: 1, column: 17 },
-                        end: { line: 1, column: 55 }
-                    }
-                },
-                rest: null,
-                generator: false,
-                expression: false,
-                range: [0, 55],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 55 }
-                }
-            }],
-            range: [0, 55],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 55 }
-            },
-            errors: [{
-                index: 19,
-                lineNumber: 1,
-                column: 20,
-                message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
-            }]
-        },
-
-        '"\\1"; \'use strict\';': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: '\u0001',
-                    raw: '"\\1"',
-                    range: [0, 4],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 4 }
-                    }
-                },
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            }, {
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '\'use strict\'',
-                    range: [6, 18],
-                    loc: {
-                        start: { line: 1, column: 6 },
-                        end: { line: 1, column: 18 }
-                    }
-                },
-                range: [6, 19],
-                loc: {
-                    start: { line: 1, column: 6 },
-                    end: { line: 1, column: 19 }
-                }
-            }],
-            range: [0, 19],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 19 }
-            },
-            errors: [{
-                index: 0,
-                lineNumber: 1,
-                column: 1,
-                message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
-            }]
-        },
-
-        '"use strict"; var x = { 014: 3}': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [18, 19],
-                        loc: {
-                            start: { line: 1, column: 18 },
-                            end: { line: 1, column: 19 }
-                        }
-                    },
-                    init: {
-                        type: 'ObjectExpression',
-                        properties: [{
-                            type: 'Property',
-                            key: {
-                                type: 'Literal',
-                                value: 12,
-                                raw: '014',
-                                range: [24, 27],
-                                loc: {
-                                    start: { line: 1, column: 24 },
-                                    end: { line: 1, column: 27 }
-                                }
-                            },
-                            value: {
-                                type: 'Literal',
-                                value: 3,
-                                raw: '3',
-                                range: [29, 30],
-                                loc: {
-                                    start: { line: 1, column: 29 },
-                                    end: { line: 1, column: 30 }
-                                }
-                            },
-                            kind: 'init',
-                            range: [24, 30],
-                            loc: {
-                                start: { line: 1, column: 24 },
-                                end: { line: 1, column: 30 }
-                            }
-                        }],
-                        range: [22, 31],
-                        loc: {
-                            start: { line: 1, column: 22 },
-                            end: { line: 1, column: 31 }
-                        }
-                    },
-                    range: [18, 31],
-                    loc: {
-                        start: { line: 1, column: 18 },
-                        end: { line: 1, column: 31 }
-                    }
-                }],
-                kind: 'var',
-                range: [14, 31],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 31 }
-                }
-            }],
-            range: [0, 31],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 31 }
-            },
-            errors: [{
-                index: 24,
-                lineNumber: 1,
-                column: 25,
-                message: 'Error: Line 1: Octal literals are not allowed in strict mode.'
-            }]
-        },
-
-        '"use strict"; var x = { get i() {}, get i() {} }': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [18, 19],
-                        loc: {
-                            start: { line: 1, column: 18 },
-                            end: { line: 1, column: 19 }
-                        }
-                    },
-                    init: {
-                        type: 'ObjectExpression',
-                        properties: [{
-                            type: 'Property',
-                            key: {
-                                type: 'Identifier',
-                                name: 'i',
-                                range: [28, 29],
-                                loc: {
-                                    start: { line: 1, column: 28 },
-                                    end: { line: 1, column: 29 }
-                                }
-                            },
-                            value: {
-                                type: 'FunctionExpression',
-                                id: null,
-                                params: [],
-                                defaults: [],
-                                body: {
-                                    type: 'BlockStatement',
-                                    body: [],
-                                    range: [32, 34],
-                                    loc: {
-                                        start: { line: 1, column: 32 },
-                                        end: { line: 1, column: 34 }
-                                    }
-                                },
-                                rest: null,
-                                generator: false,
-                                expression: false,
-                                range: [32, 34],
-                                loc: {
-                                    start: { line: 1, column: 32 },
-                                    end: { line: 1, column: 34 }
-                                }
-                            },
-                            kind: 'get',
-                            range: [24, 34],
-                            loc: {
-                                start: { line: 1, column: 24 },
-                                end: { line: 1, column: 34 }
-                            }
-                        }, {
-                            type: 'Property',
-                            key: {
-                                type: 'Identifier',
-                                name: 'i',
-                                range: [40, 41],
-                                loc: {
-                                    start: { line: 1, column: 40 },
-                                    end: { line: 1, column: 41 }
-                                }
-                            },
-                            value: {
-                                type: 'FunctionExpression',
-                                id: null,
-                                params: [],
-                                defaults: [],
-                                body: {
-                                    type: 'BlockStatement',
-                                    body: [],
-                                    range: [44, 46],
-                                    loc: {
-                                        start: { line: 1, column: 44 },
-                                        end: { line: 1, column: 46 }
-                                    }
-                                },
-                                rest: null,
-                                generator: false,
-                                expression: false,
-                                range: [44, 46],
-                                loc: {
-                                    start: { line: 1, column: 44 },
-                                    end: { line: 1, column: 46 }
-                                }
-                            },
-                            kind: 'get',
-                            range: [36, 46],
-                            loc: {
-                                start: { line: 1, column: 36 },
-                                end: { line: 1, column: 46 }
-                            }
-                        }],
-                        range: [22, 48],
-                        loc: {
-                            start: { line: 1, column: 22 },
-                            end: { line: 1, column: 48 }
-                        }
-                    },
-                    range: [18, 48],
-                    loc: {
-                        start: { line: 1, column: 18 },
-                        end: { line: 1, column: 48 }
-                    }
-                }],
-                kind: 'var',
-                range: [14, 48],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 48 }
-                }
-            }],
-            range: [0, 48],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 48 }
-            },
-            errors: [{
-                index: 46,
-                lineNumber: 1,
-                column: 47,
-                message: 'Error: Line 1: Object literal may not have multiple get/set accessors with the same name'
-            }]
-        },
-
-        '"use strict"; var x = { i: 42, get i() {} }': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [18, 19],
-                        loc: {
-                            start: { line: 1, column: 18 },
-                            end: { line: 1, column: 19 }
-                        }
-                    },
-                    init: {
-                        type: 'ObjectExpression',
-                        properties: [{
-                            type: 'Property',
-                            key: {
-                                type: 'Identifier',
-                                name: 'i',
-                                range: [24, 25],
-                                loc: {
-                                    start: { line: 1, column: 24 },
-                                    end: { line: 1, column: 25 }
-                                }
-                            },
-                            value: {
-                                type: 'Literal',
-                                value: 42,
-                                raw: '42',
-                                range: [27, 29],
-                                loc: {
-                                    start: { line: 1, column: 27 },
-                                    end: { line: 1, column: 29 }
-                                }
-                            },
-                            kind: 'init',
-                            range: [24, 29],
-                            loc: {
-                                start: { line: 1, column: 24 },
-                                end: { line: 1, column: 29 }
-                            }
-                        }, {
-                            type: 'Property',
-                            key: {
-                                type: 'Identifier',
-                                name: 'i',
-                                range: [35, 36],
-                                loc: {
-                                    start: { line: 1, column: 35 },
-                                    end: { line: 1, column: 36 }
-                                }
-                            },
-                            value: {
-                                type: 'FunctionExpression',
-                                id: null,
-                                params: [],
-                                defaults: [],
-                                body: {
-                                    type: 'BlockStatement',
-                                    body: [],
-                                    range: [39, 41],
-                                    loc: {
-                                        start: { line: 1, column: 39 },
-                                        end: { line: 1, column: 41 }
-                                    }
-                                },
-                                rest: null,
-                                generator: false,
-                                expression: false,
-                                range: [39, 41],
-                                loc: {
-                                    start: { line: 1, column: 39 },
-                                    end: { line: 1, column: 41 }
-                                }
-                            },
-                            kind: 'get',
-                            range: [31, 41],
-                            loc: {
-                                start: { line: 1, column: 31 },
-                                end: { line: 1, column: 41 }
-                            }
-                        }],
-                        range: [22, 43],
-                        loc: {
-                            start: { line: 1, column: 22 },
-                            end: { line: 1, column: 43 }
-                        }
-                    },
-                    range: [18, 43],
-                    loc: {
-                        start: { line: 1, column: 18 },
-                        end: { line: 1, column: 43 }
-                    }
-                }],
-                kind: 'var',
-                range: [14, 43],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 43 }
-                }
-            }],
-            range: [0, 43],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 43 }
-            },
-            errors: [{
-                index: 41,
-                lineNumber: 1,
-                column: 42,
-                message: 'Error: Line 1: Object literal may not have data and accessor property with the same name'
-            }]
-        },
-
-        '"use strict"; var x = { set i(x) {}, i: 42 }': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'Literal',
-                    value: 'use strict',
-                    raw: '"use strict"',
-                    range: [0, 12],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                range: [0, 13],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 13 }
-                }
-            }, {
-                type: 'VariableDeclaration',
-                declarations: [{
-                    type: 'VariableDeclarator',
-                    id: {
-                        type: 'Identifier',
-                        name: 'x',
-                        range: [18, 19],
-                        loc: {
-                            start: { line: 1, column: 18 },
-                            end: { line: 1, column: 19 }
-                        }
-                    },
-                    init: {
-                        type: 'ObjectExpression',
-                        properties: [{
-                            type: 'Property',
-                            key: {
-                                type: 'Identifier',
-                                name: 'i',
-                                range: [28, 29],
-                                loc: {
-                                    start: { line: 1, column: 28 },
-                                    end: { line: 1, column: 29 }
-                                }
-                            },
-                            value: {
-                                type: 'FunctionExpression',
-                                id: null,
-                                params: [{
-                                    type: 'Identifier',
-                                    name: 'x',
-                                    range: [30, 31],
-                                    loc: {
-                                        start: { line: 1, column: 30 },
-                                        end: { line: 1, column: 31 }
-                                    }
-                                }],
-                                defaults: [],
-                                body: {
-                                    type: 'BlockStatement',
-                                    body: [],
-                                    range: [33, 35],
-                                    loc: {
-                                        start: { line: 1, column: 33 },
-                                        end: { line: 1, column: 35 }
-                                    }
-                                },
-                                rest: null,
-                                generator: false,
-                                expression: false,
-                                range: [33, 35],
-                                loc: {
-                                    start: { line: 1, column: 33 },
-                                    end: { line: 1, column: 35 }
-                                }
-                            },
-                            kind: 'set',
-                            range: [24, 35],
-                            loc: {
-                                start: { line: 1, column: 24 },
-                                end: { line: 1, column: 35 }
-                            }
-                        }, {
-                            type: 'Property',
-                            key: {
-                                type: 'Identifier',
-                                name: 'i',
-                                range: [37, 38],
-                                loc: {
-                                    start: { line: 1, column: 37 },
-                                    end: { line: 1, column: 38 }
-                                }
-                            },
-                            value: {
-                                type: 'Literal',
-                                value: 42,
-                                raw: '42',
-                                range: [40, 42],
-                                loc: {
-                                    start: { line: 1, column: 40 },
-                                    end: { line: 1, column: 42 }
-                                }
-                            },
-                            kind: 'init',
-                            range: [37, 42],
-                            loc: {
-                                start: { line: 1, column: 37 },
-                                end: { line: 1, column: 42 }
-                            }
-                        }],
-                        range: [22, 44],
-                        loc: {
-                            start: { line: 1, column: 22 },
-                            end: { line: 1, column: 44 }
-                        }
-                    },
-                    range: [18, 44],
-                    loc: {
-                        start: { line: 1, column: 18 },
-                        end: { line: 1, column: 44 }
-                    }
-                }],
-                kind: 'var',
-                range: [14, 44],
-                loc: {
-                    start: { line: 1, column: 14 },
-                    end: { line: 1, column: 44 }
-                }
-            }],
-            range: [0, 44],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 44 }
-            },
-            errors: [{
-                index: 42,
-                lineNumber: 1,
-                column: 43,
-                message: 'Error: Line 1: Object literal may not have data and accessor property with the same name'
-            }]
-
-
-        },
-
-        '({ set s() { } })': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'ObjectExpression',
-                    properties: [{
-                        type: 'Property',
-                        key: {
-                            type: 'Identifier',
-                            name: 's',
-                            range: [7, 8],
-                            loc: {
-                                start: { line: 1, column: 7 },
-                                end: { line: 1, column: 8 }
-                            }
-                        },
-                        value: {
-                            type: 'FunctionExpression',
-                            id: null,
-                            params: [],
-                            defaults: [],
-                            body: {
-                                type: 'BlockStatement',
-                                body: [],
-                                range: [11, 14],
-                                loc: {
-                                    start: { line: 1, column: 11 },
-                                    end: { line: 1, column: 14 }
-                                }
-                            },
-                            rest: null,
-                            generator: false,
-                            expression: false,
-                            range: [11, 14],
-                            loc: {
-                                start: { line: 1, column: 11 },
-                                end: { line: 1, column: 14 }
-                            }
-                        },
-                        kind: 'set',
-                        range: [3, 14],
-                        loc: {
-                            start: { line: 1, column: 3 },
-                            end: { line: 1, column: 14 }
-                        }
-                    }],
-                    range: [1, 16],
-                    loc: {
-                        start: { line: 1, column: 1 },
-                        end: { line: 1, column: 16 }
-                    }
-                },
-                range: [0, 17],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 17 }
-                }
-            }],
-            range: [0, 17],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 17 }
-            },
-            errors: [{
-                index: 9,
-                lineNumber: 1,
-                column: 10,
-                message: 'Error: Line 1: Unexpected token )'
-            }]
-        },
-
-        'foo("bar") = baz': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'AssignmentExpression',
-                    operator: '=',
-                    left: {
-                        type: 'CallExpression',
-                        callee: {
-                            type: 'Identifier',
-                            name: 'foo',
-                            range: [0, 3],
-                            loc: {
-                                start: { line: 1, column: 0 },
-                                end: { line: 1, column: 3 }
-                            }
-                        },
-                        'arguments': [{
-                            type: 'Literal',
-                            value: 'bar',
-                            raw: '"bar"',
-                            range: [4, 9],
-                            loc: {
-                                start: { line: 1, column: 4 },
-                                end: { line: 1, column: 9 }
-                            }
-                        }],
-                        range: [0, 10],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 10 }
-                        }
-                    },
-                    right: {
-                        type: 'Identifier',
-                        name: 'baz',
-                        range: [13, 16],
-                        loc: {
-                            start: { line: 1, column: 13 },
-                            end: { line: 1, column: 16 }
-                        }
-                    },
-                    range: [0, 16],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 16 }
-                    }
-                },
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            }],
-            range: [0, 16],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 16 }
-            },
-            errors: [{
-                index: 10,
-                lineNumber: 1,
-                column: 11,
-                message: 'Error: Line 1: Invalid left-hand side in assignment'
-            }]
-        },
-
-        '1 = 2': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'AssignmentExpression',
-                    operator: '=',
-                    left: {
-                        type: 'Literal',
-                        value: 1,
-                        raw: '1',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    right: {
-                        type: 'Literal',
-                        value: 2,
-                        raw: '2',
-                        range: [4, 5],
-                        loc: {
-                            start: { line: 1, column: 4 },
-                            end: { line: 1, column: 5 }
-                        }
-                    },
-                    range: [0, 5],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 5 }
-                    }
-                },
-                range: [0, 5],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 5 }
-                }
-            }],
-            range: [0, 5],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 5 }
-            },
-            errors: [{
-                index: 1,
-                lineNumber: 1,
-                column: 2,
-                message: 'Error: Line 1: Invalid left-hand side in assignment'
-            }]
-        },
-
-        '3++': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'UpdateExpression',
-                    operator: '++',
-                    argument: {
-                        type: 'Literal',
-                        value: 3,
-                        raw: '3',
-                        range: [0, 1],
-                        loc: {
-                            start: { line: 1, column: 0 },
-                            end: { line: 1, column: 1 }
-                        }
-                    },
-                    prefix: false,
-                    range: [0, 3],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 3 }
-                    }
-                },
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            }],
-            range: [0, 3],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 3 }
-            },
-            errors: [{
-                index: 1,
-                lineNumber: 1,
-                column: 2,
-                message: 'Error: Line 1: Invalid left-hand side in assignment'
-            }]
-        },
-
-        '--4': {
-            type: 'Program',
-            body: [{
-                type: 'ExpressionStatement',
-                expression: {
-                    type: 'UpdateExpression',
-                    operator: '--',
-                    argument: {
-                        type: 'Literal',
-                        value: 4,
-                        raw: '4',
-                        range: [2, 3],
-                        loc: {
-                            start: { line: 1, column: 2 },
-                            end: { line: 1, column: 3 }
-                        }
-                    },
-                    prefix: true,
-                    range: [0, 3],
-                    loc: {
-                        start: { line: 1, column: 0 },
-                        end: { line: 1, column: 3 }
-                    }
-                },
-                range: [0, 3],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 3 }
-                }
-            }],
-            range: [0, 3],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 3 }
-            },
-            errors: [{
-                index: 3,
-                lineNumber: 1,
-                column: 4,
-                message: 'Error: Line 1: Invalid left-hand side in assignment'
-            }]
-        },
-
-        'for (5 in []) {}': {
-            type: 'Program',
-            body: [{
-                type: 'ForInStatement',
-                left: {
-                    type: 'Literal',
-                    value: 5,
-                    raw: '5',
-                    range: [5, 6],
-                    loc: {
-                        start: { line: 1, column: 5 },
-                        end: { line: 1, column: 6 }
-                    }
-                },
-                right: {
-                    type: 'ArrayExpression',
-                    elements: [],
-                    range: [10, 12],
-                    loc: {
-                        start: { line: 1, column: 10 },
-                        end: { line: 1, column: 12 }
-                    }
-                },
-                body: {
-                    type: 'BlockStatement',
-                    body: [],
-                    range: [14, 16],
-                    loc: {
-                        start: { line: 1, column: 14 },
-                        end: { line: 1, column: 16 }
-                    }
-                },
-                each: false,
-                range: [0, 16],
-                loc: {
-                    start: { line: 1, column: 0 },
-                    end: { line: 1, column: 16 }
-                }
-            }],
-            range: [0, 16],
-            loc: {
-                start: { line: 1, column: 0 },
-                end: { line: 1, column: 16 }
-            },
-            errors: [{
-                index: 6,
-                lineNumber: 1,
-                column: 7,
-                message: 'Error: Line 1: Invalid left-hand side in for-in'
-            }]
-        }
-
-
-    }
-};
-
diff --git a/node_modules/etag/HISTORY.md b/node_modules/etag/HISTORY.md
deleted file mode 100644
index 222b293dee9f8712b82a7e453c1f80e6e65348e7..0000000000000000000000000000000000000000
--- a/node_modules/etag/HISTORY.md
+++ /dev/null
@@ -1,83 +0,0 @@
-1.8.1 / 2017-09-12
-==================
-
-  * perf: replace regular expression with substring
-
-1.8.0 / 2017-02-18
-==================
-
-  * Use SHA1 instead of MD5 for ETag hashing
-    - Improves performance for larger entities
-    - Works with FIPS 140-2 OpenSSL configuration
-
-1.7.0 / 2015-06-08
-==================
-
-  * Always include entity length in ETags for hash length extensions
-  * Generate non-Stats ETags using MD5 only (no longer CRC32)
-  * Improve stat performance by removing hashing
-  * Remove base64 padding in ETags to shorten
-  * Use MD5 instead of MD4 in weak ETags over 1KB
-
-1.6.0 / 2015-05-10
-==================
-
-  * Improve support for JXcore
-  * Remove requirement of `atime` in the stats object
-  * Support "fake" stats objects in environments without `fs`
-
-1.5.1 / 2014-11-19
-==================
-
-  * deps: crc@3.2.1
-    - Minor fixes
-
-1.5.0 / 2014-10-14
-==================
-
-  * Improve string performance
-  * Slightly improve speed for weak ETags over 1KB
-
-1.4.0 / 2014-09-21
-==================
-
-  * Support "fake" stats objects
-  * Support Node.js 0.6
-
-1.3.1 / 2014-09-14
-==================
-
-  * Use the (new and improved) `crc` for crc32
-
-1.3.0 / 2014-08-29
-==================
-
-  * Default strings to strong ETags
-  * Improve speed for weak ETags over 1KB
-
-1.2.1 / 2014-08-29
-==================
-
-  * Use the (much faster) `buffer-crc32` for crc32
-
-1.2.0 / 2014-08-24
-==================
-
-  * Add support for file stat objects
-
-1.1.0 / 2014-08-24
-==================
-
-  * Add fast-path for empty entity
-  * Add weak ETag generation
-  * Shrink size of generated ETags
-
-1.0.1 / 2014-08-24
-==================
-
-  * Fix behavior of string containing Unicode
-
-1.0.0 / 2014-05-18
-==================
-
-  * Initial release
diff --git a/node_modules/etag/LICENSE b/node_modules/etag/LICENSE
deleted file mode 100644
index cab251c2b9a81318267600f68130faa3a290e5fd..0000000000000000000000000000000000000000
--- a/node_modules/etag/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014-2016 Douglas Christopher Wilson
-
-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/etag/README.md b/node_modules/etag/README.md
deleted file mode 100644
index 09c2169e7b3ab576199dfe890b2f04cb645c5ac7..0000000000000000000000000000000000000000
--- a/node_modules/etag/README.md
+++ /dev/null
@@ -1,159 +0,0 @@
-# etag
-
-[![NPM Version][npm-image]][npm-url]
-[![NPM Downloads][downloads-image]][downloads-url]
-[![Node.js Version][node-version-image]][node-version-url]
-[![Build Status][travis-image]][travis-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-Create simple HTTP ETags
-
-This module generates HTTP ETags (as defined in RFC 7232) for use in
-HTTP responses.
-
-## Installation
-
-This is a [Node.js](https://nodejs.org/en/) module available through the
-[npm registry](https://www.npmjs.com/). Installation is done using the
-[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
-
-```sh
-$ npm install etag
-```
-
-## API
-
-<!-- eslint-disable no-unused-vars -->
-
-```js
-var etag = require('etag')
-```
-
-### etag(entity, [options])
-
-Generate a strong ETag for the given entity. This should be the complete
-body of the entity. Strings, `Buffer`s, and `fs.Stats` are accepted. By
-default, a strong ETag is generated except for `fs.Stats`, which will
-generate a weak ETag (this can be overwritten by `options.weak`).
-
-<!-- eslint-disable no-undef -->
-
-```js
-res.setHeader('ETag', etag(body))
-```
-
-#### Options
-
-`etag` accepts these properties in the options object.
-
-##### weak
-
-Specifies if the generated ETag will include the weak validator mark (that
-is, the leading `W/`). The actual entity tag is the same. The default value
-is `false`, unless the `entity` is `fs.Stats`, in which case it is `true`.
-
-## Testing
-
-```sh
-$ npm test
-```
-
-## Benchmark
-
-```bash
-$ npm run-script bench
-
-> etag@1.8.1 bench nodejs-etag
-> node benchmark/index.js
-
-  http_parser@2.7.0
-  node@6.11.1
-  v8@5.1.281.103
-  uv@1.11.0
-  zlib@1.2.11
-  ares@1.10.1-DEV
-  icu@58.2
-  modules@48
-  openssl@1.0.2k
-
-> node benchmark/body0-100b.js
-
-  100B body
-
-  4 tests completed.
-
-  buffer - strong x 258,647 ops/sec ±1.07% (180 runs sampled)
-  buffer - weak   x 263,812 ops/sec ±0.61% (184 runs sampled)
-  string - strong x 259,955 ops/sec ±1.19% (185 runs sampled)
-  string - weak   x 264,356 ops/sec ±1.09% (184 runs sampled)
-
-> node benchmark/body1-1kb.js
-
-  1KB body
-
-  4 tests completed.
-
-  buffer - strong x 189,018 ops/sec ±1.12% (182 runs sampled)
-  buffer - weak   x 190,586 ops/sec ±0.81% (186 runs sampled)
-  string - strong x 144,272 ops/sec ±0.96% (188 runs sampled)
-  string - weak   x 145,380 ops/sec ±1.43% (187 runs sampled)
-
-> node benchmark/body2-5kb.js
-
-  5KB body
-
-  4 tests completed.
-
-  buffer - strong x 92,435 ops/sec ±0.42% (188 runs sampled)
-  buffer - weak   x 92,373 ops/sec ±0.58% (189 runs sampled)
-  string - strong x 48,850 ops/sec ±0.56% (186 runs sampled)
-  string - weak   x 49,380 ops/sec ±0.56% (190 runs sampled)
-
-> node benchmark/body3-10kb.js
-
-  10KB body
-
-  4 tests completed.
-
-  buffer - strong x 55,989 ops/sec ±0.93% (188 runs sampled)
-  buffer - weak   x 56,148 ops/sec ±0.55% (190 runs sampled)
-  string - strong x 27,345 ops/sec ±0.43% (188 runs sampled)
-  string - weak   x 27,496 ops/sec ±0.45% (190 runs sampled)
-
-> node benchmark/body4-100kb.js
-
-  100KB body
-
-  4 tests completed.
-
-  buffer - strong x 7,083 ops/sec ±0.22% (190 runs sampled)
-  buffer - weak   x 7,115 ops/sec ±0.26% (191 runs sampled)
-  string - strong x 3,068 ops/sec ±0.34% (190 runs sampled)
-  string - weak   x 3,096 ops/sec ±0.35% (190 runs sampled)
-
-> node benchmark/stats.js
-
-  stat
-
-  4 tests completed.
-
-  real - strong x 871,642 ops/sec ±0.34% (189 runs sampled)
-  real - weak   x 867,613 ops/sec ±0.39% (190 runs sampled)
-  fake - strong x 401,051 ops/sec ±0.40% (189 runs sampled)
-  fake - weak   x 400,100 ops/sec ±0.47% (188 runs sampled)
-```
-
-## License
-
-[MIT](LICENSE)
-
-[npm-image]: https://img.shields.io/npm/v/etag.svg
-[npm-url]: https://npmjs.org/package/etag
-[node-version-image]: https://img.shields.io/node/v/etag.svg
-[node-version-url]: https://nodejs.org/en/download/
-[travis-image]: https://img.shields.io/travis/jshttp/etag/master.svg
-[travis-url]: https://travis-ci.org/jshttp/etag
-[coveralls-image]: https://img.shields.io/coveralls/jshttp/etag/master.svg
-[coveralls-url]: https://coveralls.io/r/jshttp/etag?branch=master
-[downloads-image]: https://img.shields.io/npm/dm/etag.svg
-[downloads-url]: https://npmjs.org/package/etag
diff --git a/node_modules/etag/index.js b/node_modules/etag/index.js
deleted file mode 100644
index 2a585c91f07351e9566d50faec67a0272367ba81..0000000000000000000000000000000000000000
--- a/node_modules/etag/index.js
+++ /dev/null
@@ -1,131 +0,0 @@
-/*!
- * etag
- * Copyright(c) 2014-2016 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = etag
-
-/**
- * Module dependencies.
- * @private
- */
-
-var crypto = require('crypto')
-var Stats = require('fs').Stats
-
-/**
- * Module variables.
- * @private
- */
-
-var toString = Object.prototype.toString
-
-/**
- * Generate an entity tag.
- *
- * @param {Buffer|string} entity
- * @return {string}
- * @private
- */
-
-function entitytag (entity) {
-  if (entity.length === 0) {
-    // fast-path empty
-    return '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"'
-  }
-
-  // compute hash of entity
-  var hash = crypto
-    .createHash('sha1')
-    .update(entity, 'utf8')
-    .digest('base64')
-    .substring(0, 27)
-
-  // compute length of entity
-  var len = typeof entity === 'string'
-    ? Buffer.byteLength(entity, 'utf8')
-    : entity.length
-
-  return '"' + len.toString(16) + '-' + hash + '"'
-}
-
-/**
- * Create a simple ETag.
- *
- * @param {string|Buffer|Stats} entity
- * @param {object} [options]
- * @param {boolean} [options.weak]
- * @return {String}
- * @public
- */
-
-function etag (entity, options) {
-  if (entity == null) {
-    throw new TypeError('argument entity is required')
-  }
-
-  // support fs.Stats object
-  var isStats = isstats(entity)
-  var weak = options && typeof options.weak === 'boolean'
-    ? options.weak
-    : isStats
-
-  // validate argument
-  if (!isStats && typeof entity !== 'string' && !Buffer.isBuffer(entity)) {
-    throw new TypeError('argument entity must be string, Buffer, or fs.Stats')
-  }
-
-  // generate entity tag
-  var tag = isStats
-    ? stattag(entity)
-    : entitytag(entity)
-
-  return weak
-    ? 'W/' + tag
-    : tag
-}
-
-/**
- * Determine if object is a Stats object.
- *
- * @param {object} obj
- * @return {boolean}
- * @api private
- */
-
-function isstats (obj) {
-  // genuine fs.Stats
-  if (typeof Stats === 'function' && obj instanceof Stats) {
-    return true
-  }
-
-  // quack quack
-  return obj && typeof obj === 'object' &&
-    'ctime' in obj && toString.call(obj.ctime) === '[object Date]' &&
-    'mtime' in obj && toString.call(obj.mtime) === '[object Date]' &&
-    'ino' in obj && typeof obj.ino === 'number' &&
-    'size' in obj && typeof obj.size === 'number'
-}
-
-/**
- * Generate a tag for a stat.
- *
- * @param {object} stat
- * @return {string}
- * @private
- */
-
-function stattag (stat) {
-  var mtime = stat.mtime.getTime().toString(16)
-  var size = stat.size.toString(16)
-
-  return '"' + size + '-' + mtime + '"'
-}
diff --git a/node_modules/etag/package.json b/node_modules/etag/package.json
deleted file mode 100644
index b06ab803c0f80f56c5c88b8dc394468aee3485f4..0000000000000000000000000000000000000000
--- a/node_modules/etag/package.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "name": "etag",
-  "description": "Create simple HTTP ETags",
-  "version": "1.8.1",
-  "contributors": [
-    "Douglas Christopher Wilson <doug@somethingdoug.com>",
-    "David Björklund <david.bjorklund@gmail.com>"
-  ],
-  "license": "MIT",
-  "keywords": [
-    "etag",
-    "http",
-    "res"
-  ],
-  "repository": "jshttp/etag",
-  "devDependencies": {
-    "beautify-benchmark": "0.2.4",
-    "benchmark": "2.1.4",
-    "eslint": "3.19.0",
-    "eslint-config-standard": "10.2.1",
-    "eslint-plugin-import": "2.7.0",
-    "eslint-plugin-markdown": "1.0.0-beta.6",
-    "eslint-plugin-node": "5.1.1",
-    "eslint-plugin-promise": "3.5.0",
-    "eslint-plugin-standard": "3.0.1",
-    "istanbul": "0.4.5",
-    "mocha": "1.21.5",
-    "safe-buffer": "5.1.1",
-    "seedrandom": "2.4.3"
-  },
-  "files": [
-    "LICENSE",
-    "HISTORY.md",
-    "README.md",
-    "index.js"
-  ],
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "scripts": {
-    "bench": "node benchmark/index.js",
-    "lint": "eslint --plugin markdown --ext js,md .",
-    "test": "mocha --reporter spec --bail --check-leaks test/",
-    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
-    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/"
-  }
-}
diff --git a/node_modules/express-session/node_modules/cookie-signature/History.md b/node_modules/express-session/node_modules/cookie-signature/History.md
deleted file mode 100644
index bcf8cc95604c9aa3254d148150494f566ddc0a79..0000000000000000000000000000000000000000
--- a/node_modules/express-session/node_modules/cookie-signature/History.md
+++ /dev/null
@@ -1,42 +0,0 @@
-1.0.7 / 2023-04-12
-==================
-
-* backport the buffer support from the 1.2.x release branch (thanks @FadhiliNjagi!)
-
-1.0.6 / 2015-02-03
-==================
-
-* use `npm test` instead of `make test` to run tests
-* clearer assertion messages when checking input
-
-1.0.5 / 2014-09-05
-==================
-
-* add license to package.json
-
-1.0.4 / 2014-06-25
-==================
-
- * corrected avoidance of timing attacks (thanks @tenbits!)
-
-1.0.3 / 2014-01-28
-==================
-
- * [incorrect] fix for timing attacks
-
-1.0.2 / 2014-01-28
-==================
-
- * fix missing repository warning
- * fix typo in test
-
-1.0.1 / 2013-04-15
-==================
-
-  * Revert "Changed underlying HMAC algo. to sha512."
-  * Revert "Fix for timing attacks on MAC verification."
-
-0.0.1 / 2010-01-03
-==================
-
-  * Initial release
diff --git a/node_modules/express-session/node_modules/cookie-signature/Readme.md b/node_modules/express-session/node_modules/cookie-signature/Readme.md
deleted file mode 100644
index 2559e841b02edfdc128176bfbdc0b938209a99ea..0000000000000000000000000000000000000000
--- a/node_modules/express-session/node_modules/cookie-signature/Readme.md
+++ /dev/null
@@ -1,42 +0,0 @@
-
-# cookie-signature
-
-  Sign and unsign cookies.
-
-## Example
-
-```js
-var cookie = require('cookie-signature');
-
-var val = cookie.sign('hello', 'tobiiscool');
-val.should.equal('hello.DGDUkGlIkCzPz+C0B064FNgHdEjox7ch8tOBGslZ5QI');
-
-var val = cookie.sign('hello', 'tobiiscool');
-cookie.unsign(val, 'tobiiscool').should.equal('hello');
-cookie.unsign(val, 'luna').should.be.false;
-```
-
-## License 
-
-(The MIT License)
-
-Copyright (c) 2012 LearnBoost &lt;tj@learnboost.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.
\ No newline at end of file
diff --git a/node_modules/express-session/node_modules/cookie-signature/index.js b/node_modules/express-session/node_modules/cookie-signature/index.js
deleted file mode 100644
index 336d487f827356b0934e09a4c618f05761af7136..0000000000000000000000000000000000000000
--- a/node_modules/express-session/node_modules/cookie-signature/index.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var crypto = require('crypto');
-
-/**
- * Sign the given `val` with `secret`.
- *
- * @param {String} val
- * @param {String|NodeJS.ArrayBufferView|crypto.KeyObject} secret
- * @return {String}
- * @api private
- */
-
-exports.sign = function(val, secret){
-  if ('string' !== typeof val) throw new TypeError("Cookie value must be provided as a string.");
-  if (null == secret) throw new TypeError("Secret key must be provided.");
-  return val + '.' + crypto
-    .createHmac('sha256', secret)
-    .update(val)
-    .digest('base64')
-    .replace(/\=+$/, '');
-};
-
-/**
- * Unsign and decode the given `val` with `secret`,
- * returning `false` if the signature is invalid.
- *
- * @param {String} val
- * @param {String|NodeJS.ArrayBufferView|crypto.KeyObject} secret
- * @return {String|Boolean}
- * @api private
- */
-
-exports.unsign = function(val, secret){
-  if ('string' !== typeof val) throw new TypeError("Signed cookie string must be provided.");
-  if (null == secret) throw new TypeError("Secret key must be provided.");
-  var str = val.slice(0, val.lastIndexOf('.'))
-    , mac = exports.sign(str, secret);
-  
-  return sha1(mac) == sha1(val) ? str : false;
-};
-
-/**
- * Private
- */
-
-function sha1(str){
-  return crypto.createHash('sha1').update(str).digest('hex');
-}
diff --git a/node_modules/express-session/node_modules/cookie-signature/package.json b/node_modules/express-session/node_modules/cookie-signature/package.json
deleted file mode 100644
index 738487b53c337d7ba1888d6b8e416853cb4940de..0000000000000000000000000000000000000000
--- a/node_modules/express-session/node_modules/cookie-signature/package.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "name": "cookie-signature",
-  "version": "1.0.7",
-  "description": "Sign and unsign cookies",
-  "keywords": ["cookie", "sign", "unsign"],
-  "author": "TJ Holowaychuk <tj@learnboost.com>",
-  "license": "MIT",
-  "repository": { "type": "git", "url": "https://github.com/visionmedia/node-cookie-signature.git"},
-  "dependencies": {},
-  "devDependencies": {
-    "mocha": "*",
-    "should": "*"
-  },
-  "scripts": {
-    "test": "mocha --require should --reporter spec"
-  },
-  "main": "index"
-}
\ No newline at end of file
diff --git a/node_modules/express-session/node_modules/cookie/LICENSE b/node_modules/express-session/node_modules/cookie/LICENSE
deleted file mode 100644
index 058b6b4efa3f45896ae691f2558a2a1aca05bebd..0000000000000000000000000000000000000000
--- a/node_modules/express-session/node_modules/cookie/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2012-2014 Roman Shtylman <shtylman@gmail.com>
-Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.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/express-session/node_modules/cookie/README.md b/node_modules/express-session/node_modules/cookie/README.md
deleted file mode 100644
index 71fdac1110bba222a716c4b56b90028a6a9e5af4..0000000000000000000000000000000000000000
--- a/node_modules/express-session/node_modules/cookie/README.md
+++ /dev/null
@@ -1,317 +0,0 @@
-# cookie
-
-[![NPM Version][npm-version-image]][npm-url]
-[![NPM Downloads][npm-downloads-image]][npm-url]
-[![Node.js Version][node-image]][node-url]
-[![Build Status][ci-image]][ci-url]
-[![Coverage Status][coveralls-image]][coveralls-url]
-
-Basic HTTP cookie parser and serializer for HTTP servers.
-
-## Installation
-
-This is a [Node.js](https://nodejs.org/en/) module available through the
-[npm registry](https://www.npmjs.com/). Installation is done using the
-[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
-
-```sh
-$ npm install cookie
-```
-
-## API
-
-```js
-var cookie = require('cookie');
-```
-
-### cookie.parse(str, options)
-
-Parse an HTTP `Cookie` header string and returning an object of all cookie name-value pairs.
-The `str` argument is the string representing a `Cookie` header value and `options` is an
-optional object containing additional parsing options.
-
-```js
-var cookies = cookie.parse('foo=bar; equation=E%3Dmc%5E2');
-// { foo: 'bar', equation: 'E=mc^2' }
-```
-
-#### Options
-
-`cookie.parse` accepts these properties in the options object.
-
-##### decode
-
-Specifies a function that will be used to decode a cookie's value. Since the value of a cookie
-has a limited character set (and must be a simple string), this function can be used to decode
-a previously-encoded cookie value into a JavaScript string or other object.
-
-The default function is the global `decodeURIComponent`, which will decode any URL-encoded
-sequences into their byte representations.
-
-**note** if an error is thrown from this function, the original, non-decoded cookie value will
-be returned as the cookie's value.
-
-### cookie.serialize(name, value, options)
-
-Serialize a cookie name-value pair into a `Set-Cookie` header string. The `name` argument is the
-name for the cookie, the `value` argument is the value to set the cookie to, and the `options`
-argument is an optional object containing additional serialization options.
-
-```js
-var setCookie = cookie.serialize('foo', 'bar');
-// foo=bar
-```
-
-#### Options
-
-`cookie.serialize` accepts these properties in the options object.
-
-##### domain
-
-Specifies the value for the [`Domain` `Set-Cookie` attribute][rfc-6265-5.2.3]. By default, no
-domain is set, and most clients will consider the cookie to apply to only the current domain.
-
-##### encode
-
-Specifies a function that will be used to encode a cookie's value. Since value of a cookie
-has a limited character set (and must be a simple string), this function can be used to encode
-a value into a string suited for a cookie's value.
-
-The default function is the global `encodeURIComponent`, which will encode a JavaScript string
-into UTF-8 byte sequences and then URL-encode any that fall outside of the cookie range.
-
-##### expires
-
-Specifies the `Date` object to be the value for the [`Expires` `Set-Cookie` attribute][rfc-6265-5.2.1].
-By default, no expiration is set, and most clients will consider this a "non-persistent cookie" and
-will delete it on a condition like exiting a web browser application.
-
-**note** the [cookie storage model specification][rfc-6265-5.3] states that if both `expires` and
-`maxAge` are set, then `maxAge` takes precedence, but it is possible not all clients by obey this,
-so if both are set, they should point to the same date and time.
-
-##### httpOnly
-
-Specifies the `boolean` value for the [`HttpOnly` `Set-Cookie` attribute][rfc-6265-5.2.6]. When truthy,
-the `HttpOnly` attribute is set, otherwise it is not. By default, the `HttpOnly` attribute is not set.
-
-**note** be careful when setting this to `true`, as compliant clients will not allow client-side
-JavaScript to see the cookie in `document.cookie`.
-
-##### maxAge
-
-Specifies the `number` (in seconds) to be the value for the [`Max-Age` `Set-Cookie` attribute][rfc-6265-5.2.2].
-The given number will be converted to an integer by rounding down. By default, no maximum age is set.
-
-**note** the [cookie storage model specification][rfc-6265-5.3] states that if both `expires` and
-`maxAge` are set, then `maxAge` takes precedence, but it is possible not all clients by obey this,
-so if both are set, they should point to the same date and time.
-
-##### partitioned
-
-Specifies the `boolean` value for the [`Partitioned` `Set-Cookie`](rfc-cutler-httpbis-partitioned-cookies)
-attribute. When truthy, the `Partitioned` attribute is set, otherwise it is not. By default, the
-`Partitioned` attribute is not set.
-
-**note** This is an attribute that has not yet been fully standardized, and may change in the future.
-This also means many clients may ignore this attribute until they understand it.
-
-More information about can be found in [the proposal](https://github.com/privacycg/CHIPS).
-
-##### path
-
-Specifies the value for the [`Path` `Set-Cookie` attribute][rfc-6265-5.2.4]. By default, the path
-is considered the ["default path"][rfc-6265-5.1.4].
-
-##### priority
-
-Specifies the `string` to be the value for the [`Priority` `Set-Cookie` attribute][rfc-west-cookie-priority-00-4.1].
-
-  - `'low'` will set the `Priority` attribute to `Low`.
-  - `'medium'` will set the `Priority` attribute to `Medium`, the default priority when not set.
-  - `'high'` will set the `Priority` attribute to `High`.
-
-More information about the different priority levels can be found in
-[the specification][rfc-west-cookie-priority-00-4.1].
-
-**note** This is an attribute that has not yet been fully standardized, and may change in the future.
-This also means many clients may ignore this attribute until they understand it.
-
-##### sameSite
-
-Specifies the `boolean` or `string` to be the value for the [`SameSite` `Set-Cookie` attribute][rfc-6265bis-09-5.4.7].
-
-  - `true` will set the `SameSite` attribute to `Strict` for strict same site enforcement.
-  - `false` will not set the `SameSite` attribute.
-  - `'lax'` will set the `SameSite` attribute to `Lax` for lax same site enforcement.
-  - `'none'` will set the `SameSite` attribute to `None` for an explicit cross-site cookie.
-  - `'strict'` will set the `SameSite` attribute to `Strict` for strict same site enforcement.
-
-More information about the different enforcement levels can be found in
-[the specification][rfc-6265bis-09-5.4.7].
-
-**note** This is an attribute that has not yet been fully standardized, and may change in the future.
-This also means many clients may ignore this attribute until they understand it.
-
-##### secure
-
-Specifies the `boolean` value for the [`Secure` `Set-Cookie` attribute][rfc-6265-5.2.5]. When truthy,
-the `Secure` attribute is set, otherwise it is not. By default, the `Secure` attribute is not set.
-
-**note** be careful when setting this to `true`, as compliant clients will not send the cookie back to
-the server in the future if the browser does not have an HTTPS connection.
-
-## Example
-
-The following example uses this module in conjunction with the Node.js core HTTP server
-to prompt a user for their name and display it back on future visits.
-
-```js
-var cookie = require('cookie');
-var escapeHtml = require('escape-html');
-var http = require('http');
-var url = require('url');
-
-function onRequest(req, res) {
-  // Parse the query string
-  var query = url.parse(req.url, true, true).query;
-
-  if (query && query.name) {
-    // Set a new cookie with the name
-    res.setHeader('Set-Cookie', cookie.serialize('name', String(query.name), {
-      httpOnly: true,
-      maxAge: 60 * 60 * 24 * 7 // 1 week
-    }));
-
-    // Redirect back after setting cookie
-    res.statusCode = 302;
-    res.setHeader('Location', req.headers.referer || '/');
-    res.end();
-    return;
-  }
-
-  // Parse the cookies on the request
-  var cookies = cookie.parse(req.headers.cookie || '');
-
-  // Get the visitor name set in the cookie
-  var name = cookies.name;
-
-  res.setHeader('Content-Type', 'text/html; charset=UTF-8');
-
-  if (name) {
-    res.write('<p>Welcome back, <b>' + escapeHtml(name) + '</b>!</p>');
-  } else {
-    res.write('<p>Hello, new visitor!</p>');
-  }
-
-  res.write('<form method="GET">');
-  res.write('<input placeholder="enter your name" name="name"> <input type="submit" value="Set Name">');
-  res.end('</form>');
-}
-
-http.createServer(onRequest).listen(3000);
-```
-
-## Testing
-
-```sh
-$ npm test
-```
-
-## Benchmark
-
-```
-$ npm run bench
-
-> cookie@0.5.0 bench
-> node benchmark/index.js
-
-  node@18.18.2
-  acorn@8.10.0
-  ada@2.6.0
-  ares@1.19.1
-  brotli@1.0.9
-  cldr@43.1
-  icu@73.2
-  llhttp@6.0.11
-  modules@108
-  napi@9
-  nghttp2@1.57.0
-  nghttp3@0.7.0
-  ngtcp2@0.8.1
-  openssl@3.0.10+quic
-  simdutf@3.2.14
-  tz@2023c
-  undici@5.26.3
-  unicode@15.0
-  uv@1.44.2
-  uvwasi@0.0.18
-  v8@10.2.154.26-node.26
-  zlib@1.2.13.1-motley
-
-> node benchmark/parse-top.js
-
-  cookie.parse - top sites
-
-  14 tests completed.
-
-  parse accounts.google.com x 2,588,913 ops/sec ±0.74% (186 runs sampled)
-  parse apple.com           x 2,370,002 ops/sec ±0.69% (186 runs sampled)
-  parse cloudflare.com      x 2,213,102 ops/sec ±0.88% (188 runs sampled)
-  parse docs.google.com     x 2,194,157 ops/sec ±1.03% (184 runs sampled)
-  parse drive.google.com    x 2,265,084 ops/sec ±0.79% (187 runs sampled)
-  parse en.wikipedia.org    x   457,099 ops/sec ±0.81% (186 runs sampled)
-  parse linkedin.com        x   504,407 ops/sec ±0.89% (186 runs sampled)
-  parse maps.google.com     x 1,230,959 ops/sec ±0.98% (186 runs sampled)
-  parse microsoft.com       x   926,294 ops/sec ±0.88% (184 runs sampled)
-  parse play.google.com     x 2,311,338 ops/sec ±0.83% (185 runs sampled)
-  parse support.google.com  x 1,508,850 ops/sec ±0.86% (186 runs sampled)
-  parse www.google.com      x 1,022,582 ops/sec ±1.32% (182 runs sampled)
-  parse youtu.be            x   332,136 ops/sec ±1.02% (185 runs sampled)
-  parse youtube.com         x   323,833 ops/sec ±0.77% (183 runs sampled)
-
-> node benchmark/parse.js
-
-  cookie.parse - generic
-
-  6 tests completed.
-
-  simple      x 3,214,032 ops/sec ±1.61% (183 runs sampled)
-  decode      x   587,237 ops/sec ±1.16% (187 runs sampled)
-  unquote     x 2,954,618 ops/sec ±1.35% (183 runs sampled)
-  duplicates  x   857,008 ops/sec ±0.89% (187 runs sampled)
-  10 cookies  x   292,133 ops/sec ±0.89% (187 runs sampled)
-  100 cookies x    22,610 ops/sec ±0.68% (187 runs sampled)
-```
-
-## References
-
-- [RFC 6265: HTTP State Management Mechanism][rfc-6265]
-- [Same-site Cookies][rfc-6265bis-09-5.4.7]
-
-[rfc-cutler-httpbis-partitioned-cookies]: https://tools.ietf.org/html/draft-cutler-httpbis-partitioned-cookies/
-[rfc-west-cookie-priority-00-4.1]: https://tools.ietf.org/html/draft-west-cookie-priority-00#section-4.1
-[rfc-6265bis-09-5.4.7]: https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-09#section-5.4.7
-[rfc-6265]: https://tools.ietf.org/html/rfc6265
-[rfc-6265-5.1.4]: https://tools.ietf.org/html/rfc6265#section-5.1.4
-[rfc-6265-5.2.1]: https://tools.ietf.org/html/rfc6265#section-5.2.1
-[rfc-6265-5.2.2]: https://tools.ietf.org/html/rfc6265#section-5.2.2
-[rfc-6265-5.2.3]: https://tools.ietf.org/html/rfc6265#section-5.2.3
-[rfc-6265-5.2.4]: https://tools.ietf.org/html/rfc6265#section-5.2.4
-[rfc-6265-5.2.5]: https://tools.ietf.org/html/rfc6265#section-5.2.5
-[rfc-6265-5.2.6]: https://tools.ietf.org/html/rfc6265#section-5.2.6
-[rfc-6265-5.3]: https://tools.ietf.org/html/rfc6265#section-5.3
-
-## License
-
-[MIT](LICENSE)
-
-[ci-image]: https://badgen.net/github/checks/jshttp/cookie/master?label=ci
-[ci-url]: https://github.com/jshttp/cookie/actions/workflows/ci.yml
-[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/cookie/master
-[coveralls-url]: https://coveralls.io/r/jshttp/cookie?branch=master
-[node-image]: https://badgen.net/npm/node/cookie
-[node-url]: https://nodejs.org/en/download
-[npm-downloads-image]: https://badgen.net/npm/dm/cookie
-[npm-url]: https://npmjs.org/package/cookie
-[npm-version-image]: https://badgen.net/npm/v/cookie
diff --git a/node_modules/express-session/node_modules/cookie/SECURITY.md b/node_modules/express-session/node_modules/cookie/SECURITY.md
deleted file mode 100644
index fd4a6c53a9cd1abacf91125dab3fde3163b4c412..0000000000000000000000000000000000000000
--- a/node_modules/express-session/node_modules/cookie/SECURITY.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Security Policies and Procedures
-
-## Reporting a Bug
-
-The `cookie` team and community take all security bugs seriously. Thank
-you for improving the security of the project. We appreciate your efforts and
-responsible disclosure and will make every effort to acknowledge your
-contributions.
-
-Report security bugs by emailing the current owner(s) of `cookie`. This
-information can be found in the npm registry using the command
-`npm owner ls cookie`.
-If unsure or unable to get the information from the above, open an issue
-in the [project issue tracker](https://github.com/jshttp/cookie/issues)
-asking for the current contact information.
-
-To ensure the timely response to your report, please ensure that the entirety
-of the report is contained within the email body and not solely behind a web
-link or an attachment.
-
-At least one owner will acknowledge your email within 48 hours, and will send a
-more detailed response within 48 hours indicating the next steps in handling
-your report. After the initial reply to your report, the owners will
-endeavor to keep you informed of the progress towards a fix and full
-announcement, and may ask for additional information or guidance.
diff --git a/node_modules/express-session/node_modules/cookie/index.js b/node_modules/express-session/node_modules/cookie/index.js
deleted file mode 100644
index acd5acd6ab3cfd4441516573c5948db0ea6d7785..0000000000000000000000000000000000000000
--- a/node_modules/express-session/node_modules/cookie/index.js
+++ /dev/null
@@ -1,335 +0,0 @@
-/*!
- * cookie
- * Copyright(c) 2012-2014 Roman Shtylman
- * Copyright(c) 2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module exports.
- * @public
- */
-
-exports.parse = parse;
-exports.serialize = serialize;
-
-/**
- * Module variables.
- * @private
- */
-
-var __toString = Object.prototype.toString
-var __hasOwnProperty = Object.prototype.hasOwnProperty
-
-/**
- * RegExp to match cookie-name in RFC 6265 sec 4.1.1
- * This refers out to the obsoleted definition of token in RFC 2616 sec 2.2
- * which has been replaced by the token definition in RFC 7230 appendix B.
- *
- * cookie-name       = token
- * token             = 1*tchar
- * tchar             = "!" / "#" / "$" / "%" / "&" / "'" /
- *                     "*" / "+" / "-" / "." / "^" / "_" /
- *                     "`" / "|" / "~" / DIGIT / ALPHA
- */
-
-var cookieNameRegExp = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
-
-/**
- * RegExp to match cookie-value in RFC 6265 sec 4.1.1
- *
- * cookie-value      = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
- * cookie-octet      = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
- *                     ; US-ASCII characters excluding CTLs,
- *                     ; whitespace DQUOTE, comma, semicolon,
- *                     ; and backslash
- */
-
-var cookieValueRegExp = /^("?)[\u0021\u0023-\u002B\u002D-\u003A\u003C-\u005B\u005D-\u007E]*\1$/;
-
-/**
- * RegExp to match domain-value in RFC 6265 sec 4.1.1
- *
- * domain-value      = <subdomain>
- *                     ; defined in [RFC1034], Section 3.5, as
- *                     ; enhanced by [RFC1123], Section 2.1
- * <subdomain>       = <label> | <subdomain> "." <label>
- * <label>           = <let-dig> [ [ <ldh-str> ] <let-dig> ]
- *                     Labels must be 63 characters or less.
- *                     'let-dig' not 'letter' in the first char, per RFC1123
- * <ldh-str>         = <let-dig-hyp> | <let-dig-hyp> <ldh-str>
- * <let-dig-hyp>     = <let-dig> | "-"
- * <let-dig>         = <letter> | <digit>
- * <letter>          = any one of the 52 alphabetic characters A through Z in
- *                     upper case and a through z in lower case
- * <digit>           = any one of the ten digits 0 through 9
- *
- * Keep support for leading dot: https://github.com/jshttp/cookie/issues/173
- *
- * > (Note that a leading %x2E ("."), if present, is ignored even though that
- * character is not permitted, but a trailing %x2E ("."), if present, will
- * cause the user agent to ignore the attribute.)
- */
-
-var domainValueRegExp = /^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i;
-
-/**
- * RegExp to match path-value in RFC 6265 sec 4.1.1
- *
- * path-value        = <any CHAR except CTLs or ";">
- * CHAR              = %x01-7F
- *                     ; defined in RFC 5234 appendix B.1
- */
-
-var pathValueRegExp = /^[\u0020-\u003A\u003D-\u007E]*$/;
-
-/**
- * Parse a cookie header.
- *
- * Parse the given cookie header string into an object
- * The object has the various cookies as keys(names) => values
- *
- * @param {string} str
- * @param {object} [opt]
- * @return {object}
- * @public
- */
-
-function parse(str, opt) {
-  if (typeof str !== 'string') {
-    throw new TypeError('argument str must be a string');
-  }
-
-  var obj = {};
-  var len = str.length;
-  // RFC 6265 sec 4.1.1, RFC 2616 2.2 defines a cookie name consists of one char minimum, plus '='.
-  if (len < 2) return obj;
-
-  var dec = (opt && opt.decode) || decode;
-  var index = 0;
-  var eqIdx = 0;
-  var endIdx = 0;
-
-  do {
-    eqIdx = str.indexOf('=', index);
-    if (eqIdx === -1) break; // No more cookie pairs.
-
-    endIdx = str.indexOf(';', index);
-
-    if (endIdx === -1) {
-      endIdx = len;
-    } else if (eqIdx > endIdx) {
-      // backtrack on prior semicolon
-      index = str.lastIndexOf(';', eqIdx - 1) + 1;
-      continue;
-    }
-
-    var keyStartIdx = startIndex(str, index, eqIdx);
-    var keyEndIdx = endIndex(str, eqIdx, keyStartIdx);
-    var key = str.slice(keyStartIdx, keyEndIdx);
-
-    // only assign once
-    if (!__hasOwnProperty.call(obj, key)) {
-      var valStartIdx = startIndex(str, eqIdx + 1, endIdx);
-      var valEndIdx = endIndex(str, endIdx, valStartIdx);
-
-      if (str.charCodeAt(valStartIdx) === 0x22 /* " */ && str.charCodeAt(valEndIdx - 1) === 0x22 /* " */) {
-        valStartIdx++;
-        valEndIdx--;
-      }
-
-      var val = str.slice(valStartIdx, valEndIdx);
-      obj[key] = tryDecode(val, dec);
-    }
-
-    index = endIdx + 1
-  } while (index < len);
-
-  return obj;
-}
-
-function startIndex(str, index, max) {
-  do {
-    var code = str.charCodeAt(index);
-    if (code !== 0x20 /*   */ && code !== 0x09 /* \t */) return index;
-  } while (++index < max);
-  return max;
-}
-
-function endIndex(str, index, min) {
-  while (index > min) {
-    var code = str.charCodeAt(--index);
-    if (code !== 0x20 /*   */ && code !== 0x09 /* \t */) return index + 1;
-  }
-  return min;
-}
-
-/**
- * Serialize data into a cookie header.
- *
- * Serialize a name value pair into a cookie string suitable for
- * http headers. An optional options object specifies cookie parameters.
- *
- * serialize('foo', 'bar', { httpOnly: true })
- *   => "foo=bar; httpOnly"
- *
- * @param {string} name
- * @param {string} val
- * @param {object} [opt]
- * @return {string}
- * @public
- */
-
-function serialize(name, val, opt) {
-  var enc = (opt && opt.encode) || encodeURIComponent;
-
-  if (typeof enc !== 'function') {
-    throw new TypeError('option encode is invalid');
-  }
-
-  if (!cookieNameRegExp.test(name)) {
-    throw new TypeError('argument name is invalid');
-  }
-
-  var value = enc(val);
-
-  if (!cookieValueRegExp.test(value)) {
-    throw new TypeError('argument val is invalid');
-  }
-
-  var str = name + '=' + value;
-  if (!opt) return str;
-
-  if (null != opt.maxAge) {
-    var maxAge = Math.floor(opt.maxAge);
-
-    if (!isFinite(maxAge)) {
-      throw new TypeError('option maxAge is invalid')
-    }
-
-    str += '; Max-Age=' + maxAge;
-  }
-
-  if (opt.domain) {
-    if (!domainValueRegExp.test(opt.domain)) {
-      throw new TypeError('option domain is invalid');
-    }
-
-    str += '; Domain=' + opt.domain;
-  }
-
-  if (opt.path) {
-    if (!pathValueRegExp.test(opt.path)) {
-      throw new TypeError('option path is invalid');
-    }
-
-    str += '; Path=' + opt.path;
-  }
-
-  if (opt.expires) {
-    var expires = opt.expires
-
-    if (!isDate(expires) || isNaN(expires.valueOf())) {
-      throw new TypeError('option expires is invalid');
-    }
-
-    str += '; Expires=' + expires.toUTCString()
-  }
-
-  if (opt.httpOnly) {
-    str += '; HttpOnly';
-  }
-
-  if (opt.secure) {
-    str += '; Secure';
-  }
-
-  if (opt.partitioned) {
-    str += '; Partitioned'
-  }
-
-  if (opt.priority) {
-    var priority = typeof opt.priority === 'string'
-      ? opt.priority.toLowerCase() : opt.priority;
-
-    switch (priority) {
-      case 'low':
-        str += '; Priority=Low'
-        break
-      case 'medium':
-        str += '; Priority=Medium'
-        break
-      case 'high':
-        str += '; Priority=High'
-        break
-      default:
-        throw new TypeError('option priority is invalid')
-    }
-  }
-
-  if (opt.sameSite) {
-    var sameSite = typeof opt.sameSite === 'string'
-      ? opt.sameSite.toLowerCase() : opt.sameSite;
-
-    switch (sameSite) {
-      case true:
-        str += '; SameSite=Strict';
-        break;
-      case 'lax':
-        str += '; SameSite=Lax';
-        break;
-      case 'strict':
-        str += '; SameSite=Strict';
-        break;
-      case 'none':
-        str += '; SameSite=None';
-        break;
-      default:
-        throw new TypeError('option sameSite is invalid');
-    }
-  }
-
-  return str;
-}
-
-/**
- * URL-decode string value. Optimized to skip native call when no %.
- *
- * @param {string} str
- * @returns {string}
- */
-
-function decode (str) {
-  return str.indexOf('%') !== -1
-    ? decodeURIComponent(str)
-    : str
-}
-
-/**
- * Determine if value is a Date.
- *
- * @param {*} val
- * @private
- */
-
-function isDate (val) {
-  return __toString.call(val) === '[object Date]';
-}
-
-/**
- * Try decoding a string using a decoding function.
- *
- * @param {string} str
- * @param {function} decode
- * @private
- */
-
-function tryDecode(str, decode) {
-  try {
-    return decode(str);
-  } catch (e) {
-    return str;
-  }
-}
diff --git a/node_modules/express-session/node_modules/cookie/package.json b/node_modules/express-session/node_modules/cookie/package.json
deleted file mode 100644
index 22e3f922ba048e5cd1a20ac6a5b77fbc3b155095..0000000000000000000000000000000000000000
--- a/node_modules/express-session/node_modules/cookie/package.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "name": "cookie",
-  "description": "HTTP server cookie parsing and serialization",
-  "version": "0.7.2",
-  "author": "Roman Shtylman <shtylman@gmail.com>",
-  "contributors": [
-    "Douglas Christopher Wilson <doug@somethingdoug.com>"
-  ],
-  "license": "MIT",
-  "keywords": [
-    "cookie",
-    "cookies"
-  ],
-  "repository": "jshttp/cookie",
-  "devDependencies": {
-    "beautify-benchmark": "0.2.4",
-    "benchmark": "2.1.4",
-    "eslint": "8.53.0",
-    "eslint-plugin-markdown": "3.0.1",
-    "mocha": "10.2.0",
-    "nyc": "15.1.0",
-    "safe-buffer": "5.2.1",
-    "top-sites": "1.1.194"
-  },
-  "files": [
-    "HISTORY.md",
-    "LICENSE",
-    "README.md",
-    "SECURITY.md",
-    "index.js"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "scripts": {
-    "bench": "node benchmark/index.js",
-    "lint": "eslint .",
-    "test": "mocha --reporter spec --bail --check-leaks test/",
-    "test-ci": "nyc --reporter=lcov --reporter=text npm test",
-    "test-cov": "nyc --reporter=html --reporter=text npm test",
-    "update-bench": "node scripts/update-benchmark.js"
-  }
-}
diff --git a/node_modules/express/History.md b/node_modules/express/History.md
deleted file mode 100644
index c234f529cea898151cd58315ee496bc2067a776e..0000000000000000000000000000000000000000
--- a/node_modules/express/History.md
+++ /dev/null
@@ -1,3656 +0,0 @@
-4.21.2 / 2024-11-06
-==========
-
-  * deps: path-to-regexp@0.1.12
-    - Fix backtracking protection
-  * deps: path-to-regexp@0.1.11
-    - Throws an error on invalid path values
-
-4.21.1 / 2024-10-08
-==========
-
-  * Backported a fix for [CVE-2024-47764](https://nvd.nist.gov/vuln/detail/CVE-2024-47764)
-
-
-4.21.0 / 2024-09-11
-==========
-
-  * Deprecate `res.location("back")` and `res.redirect("back")` magic string
-  * deps: serve-static@1.16.2
-    * includes send@0.19.0
-  * deps: finalhandler@1.3.1
-  * deps: qs@6.13.0
-
-4.20.0 / 2024-09-10
-==========
-  * deps: serve-static@0.16.0
-    * Remove link renderization in html while redirecting
-  * deps: send@0.19.0
-    * Remove link renderization in html while redirecting
-  * deps: body-parser@0.6.0
-    * add `depth` option to customize the depth level in the parser
-    * IMPORTANT: The default `depth` level for parsing URL-encoded data is now `32` (previously was `Infinity`)
-  * Remove link renderization in html while using `res.redirect`
-  * deps: path-to-regexp@0.1.10
-    - Adds support for named matching groups in the routes using a regex
-    - Adds backtracking protection to parameters without regexes defined
-  * deps: encodeurl@~2.0.0
-    - Removes encoding of `\`, `|`, and `^` to align better with URL spec
-  * Deprecate passing `options.maxAge` and `options.expires` to `res.clearCookie`
-    - Will be ignored in v5, clearCookie will set a cookie with an expires in the past to instruct clients to delete the cookie
-
-4.19.2 / 2024-03-25
-==========
-
-  * Improved fix for open redirect allow list bypass
-
-4.19.1 / 2024-03-20
-==========
-
-  * Allow passing non-strings to res.location with new encoding handling checks
-
-4.19.0 / 2024-03-20
-==========
-
-  * Prevent open redirect allow list bypass due to encodeurl
-  * deps: cookie@0.6.0
-
-4.18.3 / 2024-02-29
-==========
-
-  * Fix routing requests without method
-  * deps: body-parser@1.20.2
-    - Fix strict json error message on Node.js 19+
-    - deps: content-type@~1.0.5
-    - deps: raw-body@2.5.2
-  * deps: cookie@0.6.0
-    - Add `partitioned` option
-
-4.18.2 / 2022-10-08
-===================
-
-  * Fix regression routing a large stack in a single route
-  * deps: body-parser@1.20.1
-    - deps: qs@6.11.0
-    - perf: remove unnecessary object clone
-  * deps: qs@6.11.0
-
-4.18.1 / 2022-04-29
-===================
-
-  * Fix hanging on large stack of sync routes
-
-4.18.0 / 2022-04-25
-===================
-
-  * Add "root" option to `res.download`
-  * Allow `options` without `filename` in `res.download`
-  * Deprecate string and non-integer arguments to `res.status`
-  * Fix behavior of `null`/`undefined` as `maxAge` in `res.cookie`
-  * Fix handling very large stacks of sync middleware
-  * Ignore `Object.prototype` values in settings through `app.set`/`app.get`
-  * Invoke `default` with same arguments as types in `res.format`
-  * Support proper 205 responses using `res.send`
-  * Use `http-errors` for `res.format` error
-  * deps: body-parser@1.20.0
-    - Fix error message for json parse whitespace in `strict`
-    - Fix internal error when inflated body exceeds limit
-    - Prevent loss of async hooks context
-    - Prevent hanging when request already read
-    - deps: depd@2.0.0
-    - deps: http-errors@2.0.0
-    - deps: on-finished@2.4.1
-    - deps: qs@6.10.3
-    - deps: raw-body@2.5.1
-  * deps: cookie@0.5.0
-    - Add `priority` option
-    - Fix `expires` option to reject invalid dates
-  * deps: depd@2.0.0
-    - Replace internal `eval` usage with `Function` constructor
-    - Use instance methods on `process` to check for listeners
-  * deps: finalhandler@1.2.0
-    - Remove set content headers that break response
-    - deps: on-finished@2.4.1
-    - deps: statuses@2.0.1
-  * deps: on-finished@2.4.1
-    - Prevent loss of async hooks context
-  * deps: qs@6.10.3
-  * deps: send@0.18.0
-    - Fix emitted 416 error missing headers property
-    - Limit the headers removed for 304 response
-    - deps: depd@2.0.0
-    - deps: destroy@1.2.0
-    - deps: http-errors@2.0.0
-    - deps: on-finished@2.4.1
-    - deps: statuses@2.0.1
-  * deps: serve-static@1.15.0
-    - deps: send@0.18.0
-  * deps: statuses@2.0.1
-    - Remove code 306
-    - Rename `425 Unordered Collection` to standard `425 Too Early`
-
-4.17.3 / 2022-02-16
-===================
-
-  * deps: accepts@~1.3.8
-    - deps: mime-types@~2.1.34
-    - deps: negotiator@0.6.3
-  * deps: body-parser@1.19.2
-    - deps: bytes@3.1.2
-    - deps: qs@6.9.7
-    - deps: raw-body@2.4.3
-  * deps: cookie@0.4.2
-  * deps: qs@6.9.7
-    * Fix handling of `__proto__` keys
-  * pref: remove unnecessary regexp for trust proxy
-
-4.17.2 / 2021-12-16
-===================
-
-  * Fix handling of `undefined` in `res.jsonp`
-  * Fix handling of `undefined` when `"json escape"` is enabled
-  * Fix incorrect middleware execution with unanchored `RegExp`s
-  * Fix `res.jsonp(obj, status)` deprecation message
-  * Fix typo in `res.is` JSDoc
-  * deps: body-parser@1.19.1
-    - deps: bytes@3.1.1
-    - deps: http-errors@1.8.1
-    - deps: qs@6.9.6
-    - deps: raw-body@2.4.2
-    - deps: safe-buffer@5.2.1
-    - deps: type-is@~1.6.18
-  * deps: content-disposition@0.5.4
-    - deps: safe-buffer@5.2.1
-  * deps: cookie@0.4.1
-    - Fix `maxAge` option to reject invalid values
-  * deps: proxy-addr@~2.0.7
-    - Use `req.socket` over deprecated `req.connection`
-    - deps: forwarded@0.2.0
-    - deps: ipaddr.js@1.9.1
-  * deps: qs@6.9.6
-  * deps: safe-buffer@5.2.1
-  * deps: send@0.17.2
-    - deps: http-errors@1.8.1
-    - deps: ms@2.1.3
-    - pref: ignore empty http tokens
-  * deps: serve-static@1.14.2
-    - deps: send@0.17.2
-  * deps: setprototypeof@1.2.0
-
-4.17.1 / 2019-05-25
-===================
-
-  * Revert "Improve error message for `null`/`undefined` to `res.status`"
-
-4.17.0 / 2019-05-16
-===================
-
-  * Add `express.raw` to parse bodies into `Buffer`
-  * Add `express.text` to parse bodies into string
-  * Improve error message for non-strings to `res.sendFile`
-  * Improve error message for `null`/`undefined` to `res.status`
-  * Support multiple hosts in `X-Forwarded-Host`
-  * deps: accepts@~1.3.7
-  * deps: body-parser@1.19.0
-    - Add encoding MIK
-    - Add petabyte (`pb`) support
-    - Fix parsing array brackets after index
-    - deps: bytes@3.1.0
-    - deps: http-errors@1.7.2
-    - deps: iconv-lite@0.4.24
-    - deps: qs@6.7.0
-    - deps: raw-body@2.4.0
-    - deps: type-is@~1.6.17
-  * deps: content-disposition@0.5.3
-  * deps: cookie@0.4.0
-    - Add `SameSite=None` support
-  * deps: finalhandler@~1.1.2
-    - Set stricter `Content-Security-Policy` header
-    - deps: parseurl@~1.3.3
-    - deps: statuses@~1.5.0
-  * deps: parseurl@~1.3.3
-  * deps: proxy-addr@~2.0.5
-    - deps: ipaddr.js@1.9.0
-  * deps: qs@6.7.0
-    - Fix parsing array brackets after index
-  * deps: range-parser@~1.2.1
-  * deps: send@0.17.1
-    - Set stricter CSP header in redirect & error responses
-    - deps: http-errors@~1.7.2
-    - deps: mime@1.6.0
-    - deps: ms@2.1.1
-    - deps: range-parser@~1.2.1
-    - deps: statuses@~1.5.0
-    - perf: remove redundant `path.normalize` call
-  * deps: serve-static@1.14.1
-    - Set stricter CSP header in redirect response
-    - deps: parseurl@~1.3.3
-    - deps: send@0.17.1
-  * deps: setprototypeof@1.1.1
-  * deps: statuses@~1.5.0
-    - Add `103 Early Hints`
-  * deps: type-is@~1.6.18
-    - deps: mime-types@~2.1.24
-    - perf: prevent internal `throw` on invalid type
-
-4.16.4 / 2018-10-10
-===================
-
-  * Fix issue where `"Request aborted"` may be logged in `res.sendfile`
-  * Fix JSDoc for `Router` constructor
-  * deps: body-parser@1.18.3
-    - Fix deprecation warnings on Node.js 10+
-    - Fix stack trace for strict json parse error
-    - deps: depd@~1.1.2
-    - deps: http-errors@~1.6.3
-    - deps: iconv-lite@0.4.23
-    - deps: qs@6.5.2
-    - deps: raw-body@2.3.3
-    - deps: type-is@~1.6.16
-  * deps: proxy-addr@~2.0.4
-    - deps: ipaddr.js@1.8.0
-  * deps: qs@6.5.2
-  * deps: safe-buffer@5.1.2
-
-4.16.3 / 2018-03-12
-===================
-
-  * deps: accepts@~1.3.5
-    - deps: mime-types@~2.1.18
-  * deps: depd@~1.1.2
-    - perf: remove argument reassignment
-  * deps: encodeurl@~1.0.2
-    - Fix encoding `%` as last character
-  * deps: finalhandler@1.1.1
-    - Fix 404 output for bad / missing pathnames
-    - deps: encodeurl@~1.0.2
-    - deps: statuses@~1.4.0
-  * deps: proxy-addr@~2.0.3
-    - deps: ipaddr.js@1.6.0
-  * deps: send@0.16.2
-    - Fix incorrect end tag in default error & redirects
-    - deps: depd@~1.1.2
-    - deps: encodeurl@~1.0.2
-    - deps: statuses@~1.4.0
-  * deps: serve-static@1.13.2
-    - Fix incorrect end tag in redirects
-    - deps: encodeurl@~1.0.2
-    - deps: send@0.16.2
-  * deps: statuses@~1.4.0
-  * deps: type-is@~1.6.16
-    - deps: mime-types@~2.1.18
-
-4.16.2 / 2017-10-09
-===================
-
-  * Fix `TypeError` in `res.send` when given `Buffer` and `ETag` header set
-  * perf: skip parsing of entire `X-Forwarded-Proto` header
-
-4.16.1 / 2017-09-29
-===================
-
-  * deps: send@0.16.1
-  * deps: serve-static@1.13.1
-    - Fix regression when `root` is incorrectly set to a file
-    - deps: send@0.16.1
-
-4.16.0 / 2017-09-28
-===================
-
-  * Add `"json escape"` setting for `res.json` and `res.jsonp`
-  * Add `express.json` and `express.urlencoded` to parse bodies
-  * Add `options` argument to `res.download`
-  * Improve error message when autoloading invalid view engine
-  * Improve error messages when non-function provided as middleware
-  * Skip `Buffer` encoding when not generating ETag for small response
-  * Use `safe-buffer` for improved Buffer API
-  * deps: accepts@~1.3.4
-    - deps: mime-types@~2.1.16
-  * deps: content-type@~1.0.4
-    - perf: remove argument reassignment
-    - perf: skip parameter parsing when no parameters
-  * deps: etag@~1.8.1
-    - perf: replace regular expression with substring
-  * deps: finalhandler@1.1.0
-    - Use `res.headersSent` when available
-  * deps: parseurl@~1.3.2
-    - perf: reduce overhead for full URLs
-    - perf: unroll the "fast-path" `RegExp`
-  * deps: proxy-addr@~2.0.2
-    - Fix trimming leading / trailing OWS in `X-Forwarded-For`
-    - deps: forwarded@~0.1.2
-    - deps: ipaddr.js@1.5.2
-    - perf: reduce overhead when no `X-Forwarded-For` header
-  * deps: qs@6.5.1
-    - Fix parsing & compacting very deep objects
-  * deps: send@0.16.0
-    - Add 70 new types for file extensions
-    - Add `immutable` option
-    - Fix missing `</html>` in default error & redirects
-    - Set charset as "UTF-8" for .js and .json
-    - Use instance methods on steam to check for listeners
-    - deps: mime@1.4.1
-    - perf: improve path validation speed
-  * deps: serve-static@1.13.0
-    - Add 70 new types for file extensions
-    - Add `immutable` option
-    - Set charset as "UTF-8" for .js and .json
-    - deps: send@0.16.0
-  * deps: setprototypeof@1.1.0
-  * deps: utils-merge@1.0.1
-  * deps: vary@~1.1.2
-    - perf: improve header token parsing speed
-  * perf: re-use options object when generating ETags
-  * perf: remove dead `.charset` set in `res.jsonp`
-
-4.15.5 / 2017-09-24
-===================
-
-  * deps: debug@2.6.9
-  * deps: finalhandler@~1.0.6
-    - deps: debug@2.6.9
-    - deps: parseurl@~1.3.2
-  * deps: fresh@0.5.2
-    - Fix handling of modified headers with invalid dates
-    - perf: improve ETag match loop
-    - perf: improve `If-None-Match` token parsing
-  * deps: send@0.15.6
-    - Fix handling of modified headers with invalid dates
-    - deps: debug@2.6.9
-    - deps: etag@~1.8.1
-    - deps: fresh@0.5.2
-    - perf: improve `If-Match` token parsing
-  * deps: serve-static@1.12.6
-    - deps: parseurl@~1.3.2
-    - deps: send@0.15.6
-    - perf: improve slash collapsing
-
-4.15.4 / 2017-08-06
-===================
-
-  * deps: debug@2.6.8
-  * deps: depd@~1.1.1
-    - Remove unnecessary `Buffer` loading
-  * deps: finalhandler@~1.0.4
-    - deps: debug@2.6.8
-  * deps: proxy-addr@~1.1.5
-    - Fix array argument being altered
-    - deps: ipaddr.js@1.4.0
-  * deps: qs@6.5.0
-  * deps: send@0.15.4
-    - deps: debug@2.6.8
-    - deps: depd@~1.1.1
-    - deps: http-errors@~1.6.2
-  * deps: serve-static@1.12.4
-    - deps: send@0.15.4
-
-4.15.3 / 2017-05-16
-===================
-
-  * Fix error when `res.set` cannot add charset to `Content-Type`
-  * deps: debug@2.6.7
-    - Fix `DEBUG_MAX_ARRAY_LENGTH`
-    - deps: ms@2.0.0
-  * deps: finalhandler@~1.0.3
-    - Fix missing `</html>` in HTML document
-    - deps: debug@2.6.7
-  * deps: proxy-addr@~1.1.4
-    - deps: ipaddr.js@1.3.0
-  * deps: send@0.15.3
-    - deps: debug@2.6.7
-    - deps: ms@2.0.0
-  * deps: serve-static@1.12.3
-    - deps: send@0.15.3
-  * deps: type-is@~1.6.15
-    - deps: mime-types@~2.1.15
-  * deps: vary@~1.1.1
-    - perf: hoist regular expression
-
-4.15.2 / 2017-03-06
-===================
-
-  * deps: qs@6.4.0
-    - Fix regression parsing keys starting with `[`
-
-4.15.1 / 2017-03-05
-===================
-
-  * deps: send@0.15.1
-    - Fix issue when `Date.parse` does not return `NaN` on invalid date
-    - Fix strict violation in broken environments
-  * deps: serve-static@1.12.1
-    - Fix issue when `Date.parse` does not return `NaN` on invalid date
-    - deps: send@0.15.1
-
-4.15.0 / 2017-03-01
-===================
-
-  * Add debug message when loading view engine
-  * Add `next("router")` to exit from router
-  * Fix case where `router.use` skipped requests routes did not
-  * Remove usage of `res._headers` private field
-    - Improves compatibility with Node.js 8 nightly
-  * Skip routing when `req.url` is not set
-  * Use `%o` in path debug to tell types apart
-  * Use `Object.create` to setup request & response prototypes
-  * Use `setprototypeof` module to replace `__proto__` setting
-  * Use `statuses` instead of `http` module for status messages
-  * deps: debug@2.6.1
-    - Allow colors in workers
-    - Deprecated `DEBUG_FD` environment variable set to `3` or higher
-    - Fix error when running under React Native
-    - Use same color for same namespace
-    - deps: ms@0.7.2
-  * deps: etag@~1.8.0
-    - Use SHA1 instead of MD5 for ETag hashing
-    - Works with FIPS 140-2 OpenSSL configuration
-  * deps: finalhandler@~1.0.0
-    - Fix exception when `err` cannot be converted to a string
-    - Fully URL-encode the pathname in the 404
-    - Only include the pathname in the 404 message
-    - Send complete HTML document
-    - Set `Content-Security-Policy: default-src 'self'` header
-    - deps: debug@2.6.1
-  * deps: fresh@0.5.0
-    - Fix false detection of `no-cache` request directive
-    - Fix incorrect result when `If-None-Match` has both `*` and ETags
-    - Fix weak `ETag` matching to match spec
-    - perf: delay reading header values until needed
-    - perf: enable strict mode
-    - perf: hoist regular expressions
-    - perf: remove duplicate conditional
-    - perf: remove unnecessary boolean coercions
-    - perf: skip checking modified time if ETag check failed
-    - perf: skip parsing `If-None-Match` when no `ETag` header
-    - perf: use `Date.parse` instead of `new Date`
-  * deps: qs@6.3.1
-    - Fix array parsing from skipping empty values
-    - Fix compacting nested arrays
-  * deps: send@0.15.0
-    - Fix false detection of `no-cache` request directive
-    - Fix incorrect result when `If-None-Match` has both `*` and ETags
-    - Fix weak `ETag` matching to match spec
-    - Remove usage of `res._headers` private field
-    - Support `If-Match` and `If-Unmodified-Since` headers
-    - Use `res.getHeaderNames()` when available
-    - Use `res.headersSent` when available
-    - deps: debug@2.6.1
-    - deps: etag@~1.8.0
-    - deps: fresh@0.5.0
-    - deps: http-errors@~1.6.1
-  * deps: serve-static@1.12.0
-    - Fix false detection of `no-cache` request directive
-    - Fix incorrect result when `If-None-Match` has both `*` and ETags
-    - Fix weak `ETag` matching to match spec
-    - Remove usage of `res._headers` private field
-    - Send complete HTML document in redirect response
-    - Set default CSP header in redirect response
-    - Support `If-Match` and `If-Unmodified-Since` headers
-    - Use `res.getHeaderNames()` when available
-    - Use `res.headersSent` when available
-    - deps: send@0.15.0
-  * perf: add fast match path for `*` route
-  * perf: improve `req.ips` performance
-
-4.14.1 / 2017-01-28
-===================
-
-  * deps: content-disposition@0.5.2
-  * deps: finalhandler@0.5.1
-    - Fix exception when `err.headers` is not an object
-    - deps: statuses@~1.3.1
-    - perf: hoist regular expressions
-    - perf: remove duplicate validation path
-  * deps: proxy-addr@~1.1.3
-    - deps: ipaddr.js@1.2.0
-  * deps: send@0.14.2
-    - deps: http-errors@~1.5.1
-    - deps: ms@0.7.2
-    - deps: statuses@~1.3.1
-  * deps: serve-static@~1.11.2
-    - deps: send@0.14.2
-  * deps: type-is@~1.6.14
-    - deps: mime-types@~2.1.13
-
-4.14.0 / 2016-06-16
-===================
-
-  * Add `acceptRanges` option to `res.sendFile`/`res.sendfile`
-  * Add `cacheControl` option to `res.sendFile`/`res.sendfile`
-  * Add `options` argument to `req.range`
-    - Includes the `combine` option
-  * Encode URL in `res.location`/`res.redirect` if not already encoded
-  * Fix some redirect handling in `res.sendFile`/`res.sendfile`
-  * Fix Windows absolute path check using forward slashes
-  * Improve error with invalid arguments to `req.get()`
-  * Improve performance for `res.json`/`res.jsonp` in most cases
-  * Improve `Range` header handling in `res.sendFile`/`res.sendfile`
-  * deps: accepts@~1.3.3
-    - Fix including type extensions in parameters in `Accept` parsing
-    - Fix parsing `Accept` parameters with quoted equals
-    - Fix parsing `Accept` parameters with quoted semicolons
-    - Many performance improvements
-    - deps: mime-types@~2.1.11
-    - deps: negotiator@0.6.1
-  * deps: content-type@~1.0.2
-    - perf: enable strict mode
-  * deps: cookie@0.3.1
-    - Add `sameSite` option
-    - Fix cookie `Max-Age` to never be a floating point number
-    - Improve error message when `encode` is not a function
-    - Improve error message when `expires` is not a `Date`
-    - Throw better error for invalid argument to parse
-    - Throw on invalid values provided to `serialize`
-    - perf: enable strict mode
-    - perf: hoist regular expression
-    - perf: use for loop in parse
-    - perf: use string concatenation for serialization
-  * deps: finalhandler@0.5.0
-    - Change invalid or non-numeric status code to 500
-    - Overwrite status message to match set status code
-    - Prefer `err.statusCode` if `err.status` is invalid
-    - Set response headers from `err.headers` object
-    - Use `statuses` instead of `http` module for status messages
-  * deps: proxy-addr@~1.1.2
-    - Fix accepting various invalid netmasks
-    - Fix IPv6-mapped IPv4 validation edge cases
-    - IPv4 netmasks must be contiguous
-    - IPv6 addresses cannot be used as a netmask
-    - deps: ipaddr.js@1.1.1
-  * deps: qs@6.2.0
-    - Add `decoder` option in `parse` function
-  * deps: range-parser@~1.2.0
-    - Add `combine` option to combine overlapping ranges
-    - Fix incorrectly returning -1 when there is at least one valid range
-    - perf: remove internal function
-  * deps: send@0.14.1
-    - Add `acceptRanges` option
-    - Add `cacheControl` option
-    - Attempt to combine multiple ranges into single range
-    - Correctly inherit from `Stream` class
-    - Fix `Content-Range` header in 416 responses when using `start`/`end` options
-    - Fix `Content-Range` header missing from default 416 responses
-    - Fix redirect error when `path` contains raw non-URL characters
-    - Fix redirect when `path` starts with multiple forward slashes
-    - Ignore non-byte `Range` headers
-    - deps: http-errors@~1.5.0
-    - deps: range-parser@~1.2.0
-    - deps: statuses@~1.3.0
-    - perf: remove argument reassignment
-  * deps: serve-static@~1.11.1
-    - Add `acceptRanges` option
-    - Add `cacheControl` option
-    - Attempt to combine multiple ranges into single range
-    - Fix redirect error when `req.url` contains raw non-URL characters
-    - Ignore non-byte `Range` headers
-    - Use status code 301 for redirects
-    - deps: send@0.14.1
-  * deps: type-is@~1.6.13
-    - Fix type error when given invalid type to match against
-    - deps: mime-types@~2.1.11
-  * deps: vary@~1.1.0
-    - Only accept valid field names in the `field` argument
-  * perf: use strict equality when possible
-
-4.13.4 / 2016-01-21
-===================
-
-  * deps: content-disposition@0.5.1
-    - perf: enable strict mode
-  * deps: cookie@0.1.5
-    - Throw on invalid values provided to `serialize`
-  * deps: depd@~1.1.0
-    - Support web browser loading
-    - perf: enable strict mode
-  * deps: escape-html@~1.0.3
-    - perf: enable strict mode
-    - perf: optimize string replacement
-    - perf: use faster string coercion
-  * deps: finalhandler@0.4.1
-    - deps: escape-html@~1.0.3
-  * deps: merge-descriptors@1.0.1
-    - perf: enable strict mode
-  * deps: methods@~1.1.2
-    - perf: enable strict mode
-  * deps: parseurl@~1.3.1
-    - perf: enable strict mode
-  * deps: proxy-addr@~1.0.10
-    - deps: ipaddr.js@1.0.5
-    - perf: enable strict mode
-  * deps: range-parser@~1.0.3
-    - perf: enable strict mode
-  * deps: send@0.13.1
-    - deps: depd@~1.1.0
-    - deps: destroy@~1.0.4
-    - deps: escape-html@~1.0.3
-    - deps: range-parser@~1.0.3
-  * deps: serve-static@~1.10.2
-    - deps: escape-html@~1.0.3
-    - deps: parseurl@~1.3.0
-    - deps: send@0.13.1
-
-4.13.3 / 2015-08-02
-===================
-
-  * Fix infinite loop condition using `mergeParams: true`
-  * Fix inner numeric indices incorrectly altering parent `req.params`
-
-4.13.2 / 2015-07-31
-===================
-
-  * deps: accepts@~1.2.12
-    - deps: mime-types@~2.1.4
-  * deps: array-flatten@1.1.1
-    - perf: enable strict mode
-  * deps: path-to-regexp@0.1.7
-    - Fix regression with escaped round brackets and matching groups
-  * deps: type-is@~1.6.6
-    - deps: mime-types@~2.1.4
-
-4.13.1 / 2015-07-05
-===================
-
-  * deps: accepts@~1.2.10
-    - deps: mime-types@~2.1.2
-  * deps: qs@4.0.0
-    - Fix dropping parameters like `hasOwnProperty`
-    - Fix various parsing edge cases
-  * deps: type-is@~1.6.4
-    - deps: mime-types@~2.1.2
-    - perf: enable strict mode
-    - perf: remove argument reassignment
-
-4.13.0 / 2015-06-20
-===================
-
-  * Add settings to debug output
-  * Fix `res.format` error when only `default` provided
-  * Fix issue where `next('route')` in `app.param` would incorrectly skip values
-  * Fix hiding platform issues with `decodeURIComponent`
-    - Only `URIError`s are a 400
-  * Fix using `*` before params in routes
-  * Fix using capture groups before params in routes
-  * Simplify `res.cookie` to call `res.append`
-  * Use `array-flatten` module for flattening arrays
-  * deps: accepts@~1.2.9
-    - deps: mime-types@~2.1.1
-    - perf: avoid argument reassignment & argument slice
-    - perf: avoid negotiator recursive construction
-    - perf: enable strict mode
-    - perf: remove unnecessary bitwise operator
-  * deps: cookie@0.1.3
-    - perf: deduce the scope of try-catch deopt
-    - perf: remove argument reassignments
-  * deps: escape-html@1.0.2
-  * deps: etag@~1.7.0
-    - Always include entity length in ETags for hash length extensions
-    - Generate non-Stats ETags using MD5 only (no longer CRC32)
-    - Improve stat performance by removing hashing
-    - Improve support for JXcore
-    - Remove base64 padding in ETags to shorten
-    - Support "fake" stats objects in environments without fs
-    - Use MD5 instead of MD4 in weak ETags over 1KB
-  * deps: finalhandler@0.4.0
-    - Fix a false-positive when unpiping in Node.js 0.8
-    - Support `statusCode` property on `Error` objects
-    - Use `unpipe` module for unpiping requests
-    - deps: escape-html@1.0.2
-    - deps: on-finished@~2.3.0
-    - perf: enable strict mode
-    - perf: remove argument reassignment
-  * deps: fresh@0.3.0
-    - Add weak `ETag` matching support
-  * deps: on-finished@~2.3.0
-    - Add defined behavior for HTTP `CONNECT` requests
-    - Add defined behavior for HTTP `Upgrade` requests
-    - deps: ee-first@1.1.1
-  * deps: path-to-regexp@0.1.6
-  * deps: send@0.13.0
-    - Allow Node.js HTTP server to set `Date` response header
-    - Fix incorrectly removing `Content-Location` on 304 response
-    - Improve the default redirect response headers
-    - Send appropriate headers on default error response
-    - Use `http-errors` for standard emitted errors
-    - Use `statuses` instead of `http` module for status messages
-    - deps: escape-html@1.0.2
-    - deps: etag@~1.7.0
-    - deps: fresh@0.3.0
-    - deps: on-finished@~2.3.0
-    - perf: enable strict mode
-    - perf: remove unnecessary array allocations
-  * deps: serve-static@~1.10.0
-    - Add `fallthrough` option
-    - Fix reading options from options prototype
-    - Improve the default redirect response headers
-    - Malformed URLs now `next()` instead of 400
-    - deps: escape-html@1.0.2
-    - deps: send@0.13.0
-    - perf: enable strict mode
-    - perf: remove argument reassignment
-  * deps: type-is@~1.6.3
-    - deps: mime-types@~2.1.1
-    - perf: reduce try block size
-    - perf: remove bitwise operations
-  * perf: enable strict mode
-  * perf: isolate `app.render` try block
-  * perf: remove argument reassignments in application
-  * perf: remove argument reassignments in request prototype
-  * perf: remove argument reassignments in response prototype
-  * perf: remove argument reassignments in routing
-  * perf: remove argument reassignments in `View`
-  * perf: skip attempting to decode zero length string
-  * perf: use saved reference to `http.STATUS_CODES`
-
-4.12.4 / 2015-05-17
-===================
-
-  * deps: accepts@~1.2.7
-    - deps: mime-types@~2.0.11
-    - deps: negotiator@0.5.3
-  * deps: debug@~2.2.0
-    - deps: ms@0.7.1
-  * deps: depd@~1.0.1
-  * deps: etag@~1.6.0
-    - Improve support for JXcore
-    - Support "fake" stats objects in environments without `fs`
-  * deps: finalhandler@0.3.6
-    - deps: debug@~2.2.0
-    - deps: on-finished@~2.2.1
-  * deps: on-finished@~2.2.1
-    - Fix `isFinished(req)` when data buffered
-  * deps: proxy-addr@~1.0.8
-    - deps: ipaddr.js@1.0.1
-  * deps: qs@2.4.2
-   - Fix allowing parameters like `constructor`
-  * deps: send@0.12.3
-    - deps: debug@~2.2.0
-    - deps: depd@~1.0.1
-    - deps: etag@~1.6.0
-    - deps: ms@0.7.1
-    - deps: on-finished@~2.2.1
-  * deps: serve-static@~1.9.3
-    - deps: send@0.12.3
-  * deps: type-is@~1.6.2
-    - deps: mime-types@~2.0.11
-
-4.12.3 / 2015-03-17
-===================
-
-  * deps: accepts@~1.2.5
-    - deps: mime-types@~2.0.10
-  * deps: debug@~2.1.3
-    - Fix high intensity foreground color for bold
-    - deps: ms@0.7.0
-  * deps: finalhandler@0.3.4
-    - deps: debug@~2.1.3
-  * deps: proxy-addr@~1.0.7
-    - deps: ipaddr.js@0.1.9
-  * deps: qs@2.4.1
-    - Fix error when parameter `hasOwnProperty` is present
-  * deps: send@0.12.2
-    - Throw errors early for invalid `extensions` or `index` options
-    - deps: debug@~2.1.3
-  * deps: serve-static@~1.9.2
-    - deps: send@0.12.2
-  * deps: type-is@~1.6.1
-    - deps: mime-types@~2.0.10
-
-4.12.2 / 2015-03-02
-===================
-
-  * Fix regression where `"Request aborted"` is logged using `res.sendFile`
-
-4.12.1 / 2015-03-01
-===================
-
-  * Fix constructing application with non-configurable prototype properties
-  * Fix `ECONNRESET` errors from `res.sendFile` usage
-  * Fix `req.host` when using "trust proxy" hops count
-  * Fix `req.protocol`/`req.secure` when using "trust proxy" hops count
-  * Fix wrong `code` on aborted connections from `res.sendFile`
-  * deps: merge-descriptors@1.0.0
-
-4.12.0 / 2015-02-23
-===================
-
-  * Fix `"trust proxy"` setting to inherit when app is mounted
-  * Generate `ETag`s for all request responses
-    - No longer restricted to only responses for `GET` and `HEAD` requests
-  * Use `content-type` to parse `Content-Type` headers
-  * deps: accepts@~1.2.4
-    - Fix preference sorting to be stable for long acceptable lists
-    - deps: mime-types@~2.0.9
-    - deps: negotiator@0.5.1
-  * deps: cookie-signature@1.0.6
-  * deps: send@0.12.1
-    - Always read the stat size from the file
-    - Fix mutating passed-in `options`
-    - deps: mime@1.3.4
-  * deps: serve-static@~1.9.1
-    - deps: send@0.12.1
-  * deps: type-is@~1.6.0
-    - fix argument reassignment
-    - fix false-positives in `hasBody` `Transfer-Encoding` check
-    - support wildcard for both type and subtype (`*/*`)
-    - deps: mime-types@~2.0.9
-
-4.11.2 / 2015-02-01
-===================
-
-  * Fix `res.redirect` double-calling `res.end` for `HEAD` requests
-  * deps: accepts@~1.2.3
-    - deps: mime-types@~2.0.8
-  * deps: proxy-addr@~1.0.6
-    - deps: ipaddr.js@0.1.8
-  * deps: type-is@~1.5.6
-    - deps: mime-types@~2.0.8
-
-4.11.1 / 2015-01-20
-===================
-
-  * deps: send@0.11.1
-    - Fix root path disclosure
-  * deps: serve-static@~1.8.1
-    - Fix redirect loop in Node.js 0.11.14
-    - Fix root path disclosure
-    - deps: send@0.11.1
-
-4.11.0 / 2015-01-13
-===================
-
-  * Add `res.append(field, val)` to append headers
-  * Deprecate leading `:` in `name` for `app.param(name, fn)`
-  * Deprecate `req.param()` -- use `req.params`, `req.body`, or `req.query` instead
-  * Deprecate `app.param(fn)`
-  * Fix `OPTIONS` responses to include the `HEAD` method properly
-  * Fix `res.sendFile` not always detecting aborted connection
-  * Match routes iteratively to prevent stack overflows
-  * deps: accepts@~1.2.2
-    - deps: mime-types@~2.0.7
-    - deps: negotiator@0.5.0
-  * deps: send@0.11.0
-    - deps: debug@~2.1.1
-    - deps: etag@~1.5.1
-    - deps: ms@0.7.0
-    - deps: on-finished@~2.2.0
-  * deps: serve-static@~1.8.0
-    - deps: send@0.11.0
-
-4.10.8 / 2015-01-13
-===================
-
-  * Fix crash from error within `OPTIONS` response handler
-  * deps: proxy-addr@~1.0.5
-    - deps: ipaddr.js@0.1.6
-
-4.10.7 / 2015-01-04
-===================
-
-  * Fix `Allow` header for `OPTIONS` to not contain duplicate methods
-  * Fix incorrect "Request aborted" for `res.sendFile` when `HEAD` or 304
-  * deps: debug@~2.1.1
-  * deps: finalhandler@0.3.3
-    - deps: debug@~2.1.1
-    - deps: on-finished@~2.2.0
-  * deps: methods@~1.1.1
-  * deps: on-finished@~2.2.0
-  * deps: serve-static@~1.7.2
-    - Fix potential open redirect when mounted at root
-  * deps: type-is@~1.5.5
-    - deps: mime-types@~2.0.7
-
-4.10.6 / 2014-12-12
-===================
-
-  * Fix exception in `req.fresh`/`req.stale` without response headers
-
-4.10.5 / 2014-12-10
-===================
-
-  * Fix `res.send` double-calling `res.end` for `HEAD` requests
-  * deps: accepts@~1.1.4
-    - deps: mime-types@~2.0.4
-  * deps: type-is@~1.5.4
-    - deps: mime-types@~2.0.4
-
-4.10.4 / 2014-11-24
-===================
-
-  * Fix `res.sendfile` logging standard write errors
-
-4.10.3 / 2014-11-23
-===================
-
-  * Fix `res.sendFile` logging standard write errors
-  * deps: etag@~1.5.1
-  * deps: proxy-addr@~1.0.4
-    - deps: ipaddr.js@0.1.5
-  * deps: qs@2.3.3
-    - Fix `arrayLimit` behavior
-
-4.10.2 / 2014-11-09
-===================
-
-  * Correctly invoke async router callback asynchronously
-  * deps: accepts@~1.1.3
-    - deps: mime-types@~2.0.3
-  * deps: type-is@~1.5.3
-    - deps: mime-types@~2.0.3
-
-4.10.1 / 2014-10-28
-===================
-
-  * Fix handling of URLs containing `://` in the path
-  * deps: qs@2.3.2
-    - Fix parsing of mixed objects and values
-
-4.10.0 / 2014-10-23
-===================
-
-  * Add support for `app.set('views', array)`
-    - Views are looked up in sequence in array of directories
-  * Fix `res.send(status)` to mention `res.sendStatus(status)`
-  * Fix handling of invalid empty URLs
-  * Use `content-disposition` module for `res.attachment`/`res.download`
-    - Sends standards-compliant `Content-Disposition` header
-    - Full Unicode support
-  * Use `path.resolve` in view lookup
-  * deps: debug@~2.1.0
-    - Implement `DEBUG_FD` env variable support
-  * deps: depd@~1.0.0
-  * deps: etag@~1.5.0
-    - Improve string performance
-    - Slightly improve speed for weak ETags over 1KB
-  * deps: finalhandler@0.3.2
-    - Terminate in progress response only on error
-    - Use `on-finished` to determine request status
-    - deps: debug@~2.1.0
-    - deps: on-finished@~2.1.1
-  * deps: on-finished@~2.1.1
-    - Fix handling of pipelined requests
-  * deps: qs@2.3.0
-    - Fix parsing of mixed implicit and explicit arrays
-  * deps: send@0.10.1
-    - deps: debug@~2.1.0
-    - deps: depd@~1.0.0
-    - deps: etag@~1.5.0
-    - deps: on-finished@~2.1.1
-  * deps: serve-static@~1.7.1
-    - deps: send@0.10.1
-
-4.9.8 / 2014-10-17
-==================
-
-  * Fix `res.redirect` body when redirect status specified
-  * deps: accepts@~1.1.2
-    - Fix error when media type has invalid parameter
-    - deps: negotiator@0.4.9
-
-4.9.7 / 2014-10-10
-==================
-
-  * Fix using same param name in array of paths
-
-4.9.6 / 2014-10-08
-==================
-
-  * deps: accepts@~1.1.1
-    - deps: mime-types@~2.0.2
-    - deps: negotiator@0.4.8
-  * deps: serve-static@~1.6.4
-    - Fix redirect loop when index file serving disabled
-  * deps: type-is@~1.5.2
-    - deps: mime-types@~2.0.2
-
-4.9.5 / 2014-09-24
-==================
-
-  * deps: etag@~1.4.0
-  * deps: proxy-addr@~1.0.3
-    - Use `forwarded` npm module
-  * deps: send@0.9.3
-    - deps: etag@~1.4.0
-  * deps: serve-static@~1.6.3
-    - deps: send@0.9.3
-
-4.9.4 / 2014-09-19
-==================
-
-  * deps: qs@2.2.4
-    - Fix issue with object keys starting with numbers truncated
-
-4.9.3 / 2014-09-18
-==================
-
-  * deps: proxy-addr@~1.0.2
-    - Fix a global leak when multiple subnets are trusted
-    - deps: ipaddr.js@0.1.3
-
-4.9.2 / 2014-09-17
-==================
-
-  * Fix regression for empty string `path` in `app.use`
-  * Fix `router.use` to accept array of middleware without path
-  * Improve error message for bad `app.use` arguments
-
-4.9.1 / 2014-09-16
-==================
-
-  * Fix `app.use` to accept array of middleware without path
-  * deps: depd@0.4.5
-  * deps: etag@~1.3.1
-  * deps: send@0.9.2
-    - deps: depd@0.4.5
-    - deps: etag@~1.3.1
-    - deps: range-parser@~1.0.2
-  * deps: serve-static@~1.6.2
-    - deps: send@0.9.2
-
-4.9.0 / 2014-09-08
-==================
-
-  * Add `res.sendStatus`
-  * Invoke callback for sendfile when client aborts
-    - Applies to `res.sendFile`, `res.sendfile`, and `res.download`
-    - `err` will be populated with request aborted error
-  * Support IP address host in `req.subdomains`
-  * Use `etag` to generate `ETag` headers
-  * deps: accepts@~1.1.0
-    - update `mime-types`
-  * deps: cookie-signature@1.0.5
-  * deps: debug@~2.0.0
-  * deps: finalhandler@0.2.0
-    - Set `X-Content-Type-Options: nosniff` header
-    - deps: debug@~2.0.0
-  * deps: fresh@0.2.4
-  * deps: media-typer@0.3.0
-    - Throw error when parameter format invalid on parse
-  * deps: qs@2.2.3
-    - Fix issue where first empty value in array is discarded
-  * deps: range-parser@~1.0.2
-  * deps: send@0.9.1
-    - Add `lastModified` option
-    - Use `etag` to generate `ETag` header
-    - deps: debug@~2.0.0
-    - deps: fresh@0.2.4
-  * deps: serve-static@~1.6.1
-    - Add `lastModified` option
-    - deps: send@0.9.1
-  * deps: type-is@~1.5.1
-    - fix `hasbody` to be true for `content-length: 0`
-    - deps: media-typer@0.3.0
-    - deps: mime-types@~2.0.1
-  * deps: vary@~1.0.0
-    - Accept valid `Vary` header string as `field`
-
-4.8.8 / 2014-09-04
-==================
-
-  * deps: send@0.8.5
-    - Fix a path traversal issue when using `root`
-    - Fix malicious path detection for empty string path
-  * deps: serve-static@~1.5.4
-    - deps: send@0.8.5
-
-4.8.7 / 2014-08-29
-==================
-
-  * deps: qs@2.2.2
-    - Remove unnecessary cloning
-
-4.8.6 / 2014-08-27
-==================
-
-  * deps: qs@2.2.0
-    - Array parsing fix
-    - Performance improvements
-
-4.8.5 / 2014-08-18
-==================
-
-  * deps: send@0.8.3
-    - deps: destroy@1.0.3
-    - deps: on-finished@2.1.0
-  * deps: serve-static@~1.5.3
-    - deps: send@0.8.3
-
-4.8.4 / 2014-08-14
-==================
-
-  * deps: qs@1.2.2
-  * deps: send@0.8.2
-    - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream`
-  * deps: serve-static@~1.5.2
-    - deps: send@0.8.2
-
-4.8.3 / 2014-08-10
-==================
-
-  * deps: parseurl@~1.3.0
-  * deps: qs@1.2.1
-  * deps: serve-static@~1.5.1
-    - Fix parsing of weird `req.originalUrl` values
-    - deps: parseurl@~1.3.0
-    - deps: utils-merge@1.0.0
-
-4.8.2 / 2014-08-07
-==================
-
-  * deps: qs@1.2.0
-    - Fix parsing array of objects
-
-4.8.1 / 2014-08-06
-==================
-
-  * fix incorrect deprecation warnings on `res.download`
-  * deps: qs@1.1.0
-    - Accept urlencoded square brackets
-    - Accept empty values in implicit array notation
-
-4.8.0 / 2014-08-05
-==================
-
-  * add `res.sendFile`
-    - accepts a file system path instead of a URL
-    - requires an absolute path or `root` option specified
-  * deprecate `res.sendfile` -- use `res.sendFile` instead
-  * support mounted app as any argument to `app.use()`
-  * deps: qs@1.0.2
-    - Complete rewrite
-    - Limits array length to 20
-    - Limits object depth to 5
-    - Limits parameters to 1,000
-  * deps: send@0.8.1
-    - Add `extensions` option
-  * deps: serve-static@~1.5.0
-    - Add `extensions` option
-    - deps: send@0.8.1
-
-4.7.4 / 2014-08-04
-==================
-
-  * fix `res.sendfile` regression for serving directory index files
-  * deps: send@0.7.4
-    - Fix incorrect 403 on Windows and Node.js 0.11
-    - Fix serving index files without root dir
-  * deps: serve-static@~1.4.4
-    - deps: send@0.7.4
-
-4.7.3 / 2014-08-04
-==================
-
-  * deps: send@0.7.3
-    - Fix incorrect 403 on Windows and Node.js 0.11
-  * deps: serve-static@~1.4.3
-    - Fix incorrect 403 on Windows and Node.js 0.11
-    - deps: send@0.7.3
-
-4.7.2 / 2014-07-27
-==================
-
-  * deps: depd@0.4.4
-    - Work-around v8 generating empty stack traces
-  * deps: send@0.7.2
-    - deps: depd@0.4.4
-  * deps: serve-static@~1.4.2
-
-4.7.1 / 2014-07-26
-==================
-
-  * deps: depd@0.4.3
-    - Fix exception when global `Error.stackTraceLimit` is too low
-  * deps: send@0.7.1
-    - deps: depd@0.4.3
-  * deps: serve-static@~1.4.1
-
-4.7.0 / 2014-07-25
-==================
-
-  * fix `req.protocol` for proxy-direct connections
-  * configurable query parser with `app.set('query parser', parser)`
-    - `app.set('query parser', 'extended')` parse with "qs" module
-    - `app.set('query parser', 'simple')` parse with "querystring" core module
-    - `app.set('query parser', false)` disable query string parsing
-    - `app.set('query parser', true)` enable simple parsing
-  * deprecate `res.json(status, obj)` -- use `res.status(status).json(obj)` instead
-  * deprecate `res.jsonp(status, obj)` -- use `res.status(status).jsonp(obj)` instead
-  * deprecate `res.send(status, body)` -- use `res.status(status).send(body)` instead
-  * deps: debug@1.0.4
-  * deps: depd@0.4.2
-    - Add `TRACE_DEPRECATION` environment variable
-    - Remove non-standard grey color from color output
-    - Support `--no-deprecation` argument
-    - Support `--trace-deprecation` argument
-  * deps: finalhandler@0.1.0
-    - Respond after request fully read
-    - deps: debug@1.0.4
-  * deps: parseurl@~1.2.0
-    - Cache URLs based on original value
-    - Remove no-longer-needed URL mis-parse work-around
-    - Simplify the "fast-path" `RegExp`
-  * deps: send@0.7.0
-    - Add `dotfiles` option
-    - Cap `maxAge` value to 1 year
-    - deps: debug@1.0.4
-    - deps: depd@0.4.2
-  * deps: serve-static@~1.4.0
-    - deps: parseurl@~1.2.0
-    - deps: send@0.7.0
-  * perf: prevent multiple `Buffer` creation in `res.send`
-
-4.6.1 / 2014-07-12
-==================
-
-  * fix `subapp.mountpath` regression for `app.use(subapp)`
-
-4.6.0 / 2014-07-11
-==================
-
-  * accept multiple callbacks to `app.use()`
-  * add explicit "Rosetta Flash JSONP abuse" protection
-    - previous versions are not vulnerable; this is just explicit protection
-  * catch errors in multiple `req.param(name, fn)` handlers
-  * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead
-  * fix `res.send(status, num)` to send `num` as json (not error)
-  * remove unnecessary escaping when `res.jsonp` returns JSON response
-  * support non-string `path` in `app.use(path, fn)`
-    - supports array of paths
-    - supports `RegExp`
-  * router: fix optimization on router exit
-  * router: refactor location of `try` blocks
-  * router: speed up standard `app.use(fn)`
-  * deps: debug@1.0.3
-    - Add support for multiple wildcards in namespaces
-  * deps: finalhandler@0.0.3
-    - deps: debug@1.0.3
-  * deps: methods@1.1.0
-    - add `CONNECT`
-  * deps: parseurl@~1.1.3
-    - faster parsing of href-only URLs
-  * deps: path-to-regexp@0.1.3
-  * deps: send@0.6.0
-    - deps: debug@1.0.3
-  * deps: serve-static@~1.3.2
-    - deps: parseurl@~1.1.3
-    - deps: send@0.6.0
-  * perf: fix arguments reassign deopt in some `res` methods
-
-4.5.1 / 2014-07-06
-==================
-
- * fix routing regression when altering `req.method`
-
-4.5.0 / 2014-07-04
-==================
-
- * add deprecation message to non-plural `req.accepts*`
- * add deprecation message to `res.send(body, status)`
- * add deprecation message to `res.vary()`
- * add `headers` option to `res.sendfile`
-   - use to set headers on successful file transfer
- * add `mergeParams` option to `Router`
-   - merges `req.params` from parent routes
- * add `req.hostname` -- correct name for what `req.host` returns
- * deprecate things with `depd` module
- * deprecate `req.host` -- use `req.hostname` instead
- * fix behavior when handling request without routes
- * fix handling when `route.all` is only route
- * invoke `router.param()` only when route matches
- * restore `req.params` after invoking router
- * use `finalhandler` for final response handling
- * use `media-typer` to alter content-type charset
- * deps: accepts@~1.0.7
- * deps: send@0.5.0
-   - Accept string for `maxage` (converted by `ms`)
-   - Include link in default redirect response
- * deps: serve-static@~1.3.0
-   - Accept string for `maxAge` (converted by `ms`)
-   - Add `setHeaders` option
-   - Include HTML link in redirect response
-   - deps: send@0.5.0
- * deps: type-is@~1.3.2
-
-4.4.5 / 2014-06-26
-==================
-
- * deps: cookie-signature@1.0.4
-   - fix for timing attacks
-
-4.4.4 / 2014-06-20
-==================
-
- * fix `res.attachment` Unicode filenames in Safari
- * fix "trim prefix" debug message in `express:router`
- * deps: accepts@~1.0.5
- * deps: buffer-crc32@0.2.3
-
-4.4.3 / 2014-06-11
-==================
-
- * fix persistence of modified `req.params[name]` from `app.param()`
- * deps: accepts@1.0.3
-   - deps: negotiator@0.4.6
- * deps: debug@1.0.2
- * deps: send@0.4.3
-   - Do not throw uncatchable error on file open race condition
-   - Use `escape-html` for HTML escaping
-   - deps: debug@1.0.2
-   - deps: finished@1.2.2
-   - deps: fresh@0.2.2
- * deps: serve-static@1.2.3
-   - Do not throw uncatchable error on file open race condition
-   - deps: send@0.4.3
-
-4.4.2 / 2014-06-09
-==================
-
- * fix catching errors from top-level handlers
- * use `vary` module for `res.vary`
- * deps: debug@1.0.1
- * deps: proxy-addr@1.0.1
- * deps: send@0.4.2
-   - fix "event emitter leak" warnings
-   - deps: debug@1.0.1
-   - deps: finished@1.2.1
- * deps: serve-static@1.2.2
-   - fix "event emitter leak" warnings
-   - deps: send@0.4.2
- * deps: type-is@1.2.1
-
-4.4.1 / 2014-06-02
-==================
-
- * deps: methods@1.0.1
- * deps: send@0.4.1
-   - Send `max-age` in `Cache-Control` in correct format
- * deps: serve-static@1.2.1
-   - use `escape-html` for escaping
-   - deps: send@0.4.1
-
-4.4.0 / 2014-05-30
-==================
-
- * custom etag control with `app.set('etag', val)`
-   - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation
-   - `app.set('etag', 'weak')` weak tag
-   - `app.set('etag', 'strong')` strong etag
-   - `app.set('etag', false)` turn off
-   - `app.set('etag', true)` standard etag
- * mark `res.send` ETag as weak and reduce collisions
- * update accepts to 1.0.2
-   - Fix interpretation when header not in request
- * update send to 0.4.0
-   - Calculate ETag with md5 for reduced collisions
-   - Ignore stream errors after request ends
-   - deps: debug@0.8.1
- * update serve-static to 1.2.0
-   - Calculate ETag with md5 for reduced collisions
-   - Ignore stream errors after request ends
-   - deps: send@0.4.0
-
-4.3.2 / 2014-05-28
-==================
-
- * fix handling of errors from `router.param()` callbacks
-
-4.3.1 / 2014-05-23
-==================
-
- * revert "fix behavior of multiple `app.VERB` for the same path"
-   - this caused a regression in the order of route execution
-
-4.3.0 / 2014-05-21
-==================
-
- * add `req.baseUrl` to access the path stripped from `req.url` in routes
- * fix behavior of multiple `app.VERB` for the same path
- * fix issue routing requests among sub routers
- * invoke `router.param()` only when necessary instead of every match
- * proper proxy trust with `app.set('trust proxy', trust)`
-   - `app.set('trust proxy', 1)` trust first hop
-   - `app.set('trust proxy', 'loopback')` trust loopback addresses
-   - `app.set('trust proxy', '10.0.0.1')` trust single IP
-   - `app.set('trust proxy', '10.0.0.1/16')` trust subnet
-   - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list
-   - `app.set('trust proxy', false)` turn off
-   - `app.set('trust proxy', true)` trust everything
- * set proper `charset` in `Content-Type` for `res.send`
- * update type-is to 1.2.0
-   - support suffix matching
-
-4.2.0 / 2014-05-11
-==================
-
- * deprecate `app.del()` -- use `app.delete()` instead
- * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead
-   - the edge-case `res.json(status, num)` requires `res.status(status).json(num)`
- * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead
-   - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)`
- * fix `req.next` when inside router instance
- * include `ETag` header in `HEAD` requests
- * keep previous `Content-Type` for `res.jsonp`
- * support PURGE method
-   - add `app.purge`
-   - add `router.purge`
-   - include PURGE in `app.all`
- * update debug to 0.8.0
-   - add `enable()` method
-   - change from stderr to stdout
- * update methods to 1.0.0
-   - add PURGE
-
-4.1.2 / 2014-05-08
-==================
-
- * fix `req.host` for IPv6 literals
- * fix `res.jsonp` error if callback param is object
-
-4.1.1 / 2014-04-27
-==================
-
- * fix package.json to reflect supported node version
-
-4.1.0 / 2014-04-24
-==================
-
- * pass options from `res.sendfile` to `send`
- * preserve casing of headers in `res.header` and `res.set`
- * support unicode file names in `res.attachment` and `res.download`
- * update accepts to 1.0.1
-   - deps: negotiator@0.4.0
- * update cookie to 0.1.2
-   - Fix for maxAge == 0
-   - made compat with expires field
- * update send to 0.3.0
-   - Accept API options in options object
-   - Coerce option types
-   - Control whether to generate etags
-   - Default directory access to 403 when index disabled
-   - Fix sending files with dots without root set
-   - Include file path in etag
-   - Make "Can't set headers after they are sent." catchable
-   - Send full entity-body for multi range requests
-   - Set etags to "weak"
-   - Support "If-Range" header
-   - Support multiple index paths
-   - deps: mime@1.2.11
- * update serve-static to 1.1.0
-   - Accept options directly to `send` module
-   - Resolve relative paths at middleware setup
-   - Use parseurl to parse the URL from request
-   - deps: send@0.3.0
- * update type-is to 1.1.0
-   - add non-array values support
-   - add `multipart` as a shorthand
-
-4.0.0 / 2014-04-09
-==================
-
- * remove:
-   - node 0.8 support
-   - connect and connect's patches except for charset handling
-   - express(1) - moved to [express-generator](https://github.com/expressjs/generator)
-   - `express.createServer()` - it has been deprecated for a long time. Use `express()`
-   - `app.configure` - use logic in your own app code
-   - `app.router` - is removed
-   - `req.auth` - use `basic-auth` instead
-   - `req.accepted*` - use `req.accepts*()` instead
-   - `res.location` - relative URL resolution is removed
-   - `res.charset` - include the charset in the content type when using `res.set()`
-   - all bundled middleware except `static`
- * change:
-   - `app.route` -> `app.mountpath` when mounting an express app in another express app
-   - `json spaces` no longer enabled by default in development
-   - `req.accepts*` -> `req.accepts*s` - i.e. `req.acceptsEncoding` -> `req.acceptsEncodings`
-   - `req.params` is now an object instead of an array
-   - `res.locals` is no longer a function. It is a plain js object. Treat it as such.
-   - `res.headerSent` -> `res.headersSent` to match node.js ServerResponse object
- * refactor:
-   - `req.accepts*` with [accepts](https://github.com/expressjs/accepts)
-   - `req.is` with [type-is](https://github.com/expressjs/type-is)
-   - [path-to-regexp](https://github.com/component/path-to-regexp)
- * add:
-   - `app.router()` - returns the app Router instance
-   - `app.route()` - Proxy to the app's `Router#route()` method to create a new route
-   - Router & Route - public API
-
-3.21.2 / 2015-07-31
-===================
-
-  * deps: connect@2.30.2
-    - deps: body-parser@~1.13.3
-    - deps: compression@~1.5.2
-    - deps: errorhandler@~1.4.2
-    - deps: method-override@~2.3.5
-    - deps: serve-index@~1.7.2
-    - deps: type-is@~1.6.6
-    - deps: vhost@~3.0.1
-  * deps: vary@~1.0.1
-    - Fix setting empty header from empty `field`
-    - perf: enable strict mode
-    - perf: remove argument reassignments
-
-3.21.1 / 2015-07-05
-===================
-
-  * deps: basic-auth@~1.0.3
-  * deps: connect@2.30.1
-    - deps: body-parser@~1.13.2
-    - deps: compression@~1.5.1
-    - deps: errorhandler@~1.4.1
-    - deps: morgan@~1.6.1
-    - deps: pause@0.1.0
-    - deps: qs@4.0.0
-    - deps: serve-index@~1.7.1
-    - deps: type-is@~1.6.4
-
-3.21.0 / 2015-06-18
-===================
-
-  * deps: basic-auth@1.0.2
-    - perf: enable strict mode
-    - perf: hoist regular expression
-    - perf: parse with regular expressions
-    - perf: remove argument reassignment
-  * deps: connect@2.30.0
-    - deps: body-parser@~1.13.1
-    - deps: bytes@2.1.0
-    - deps: compression@~1.5.0
-    - deps: cookie@0.1.3
-    - deps: cookie-parser@~1.3.5
-    - deps: csurf@~1.8.3
-    - deps: errorhandler@~1.4.0
-    - deps: express-session@~1.11.3
-    - deps: finalhandler@0.4.0
-    - deps: fresh@0.3.0
-    - deps: morgan@~1.6.0
-    - deps: serve-favicon@~2.3.0
-    - deps: serve-index@~1.7.0
-    - deps: serve-static@~1.10.0
-    - deps: type-is@~1.6.3
-  * deps: cookie@0.1.3
-    - perf: deduce the scope of try-catch deopt
-    - perf: remove argument reassignments
-  * deps: escape-html@1.0.2
-  * deps: etag@~1.7.0
-    - Always include entity length in ETags for hash length extensions
-    - Generate non-Stats ETags using MD5 only (no longer CRC32)
-    - Improve stat performance by removing hashing
-    - Improve support for JXcore
-    - Remove base64 padding in ETags to shorten
-    - Support "fake" stats objects in environments without fs
-    - Use MD5 instead of MD4 in weak ETags over 1KB
-  * deps: fresh@0.3.0
-    - Add weak `ETag` matching support
-  * deps: mkdirp@0.5.1
-    - Work in global strict mode
-  * deps: send@0.13.0
-    - Allow Node.js HTTP server to set `Date` response header
-    - Fix incorrectly removing `Content-Location` on 304 response
-    - Improve the default redirect response headers
-    - Send appropriate headers on default error response
-    - Use `http-errors` for standard emitted errors
-    - Use `statuses` instead of `http` module for status messages
-    - deps: escape-html@1.0.2
-    - deps: etag@~1.7.0
-    - deps: fresh@0.3.0
-    - deps: on-finished@~2.3.0
-    - perf: enable strict mode
-    - perf: remove unnecessary array allocations
-
-3.20.3 / 2015-05-17
-===================
-
-  * deps: connect@2.29.2
-    - deps: body-parser@~1.12.4
-    - deps: compression@~1.4.4
-    - deps: connect-timeout@~1.6.2
-    - deps: debug@~2.2.0
-    - deps: depd@~1.0.1
-    - deps: errorhandler@~1.3.6
-    - deps: finalhandler@0.3.6
-    - deps: method-override@~2.3.3
-    - deps: morgan@~1.5.3
-    - deps: qs@2.4.2
-    - deps: response-time@~2.3.1
-    - deps: serve-favicon@~2.2.1
-    - deps: serve-index@~1.6.4
-    - deps: serve-static@~1.9.3
-    - deps: type-is@~1.6.2
-  * deps: debug@~2.2.0
-    - deps: ms@0.7.1
-  * deps: depd@~1.0.1
-  * deps: proxy-addr@~1.0.8
-    - deps: ipaddr.js@1.0.1
-  * deps: send@0.12.3
-    - deps: debug@~2.2.0
-    - deps: depd@~1.0.1
-    - deps: etag@~1.6.0
-    - deps: ms@0.7.1
-    - deps: on-finished@~2.2.1
-
-3.20.2 / 2015-03-16
-===================
-
-  * deps: connect@2.29.1
-    - deps: body-parser@~1.12.2
-    - deps: compression@~1.4.3
-    - deps: connect-timeout@~1.6.1
-    - deps: debug@~2.1.3
-    - deps: errorhandler@~1.3.5
-    - deps: express-session@~1.10.4
-    - deps: finalhandler@0.3.4
-    - deps: method-override@~2.3.2
-    - deps: morgan@~1.5.2
-    - deps: qs@2.4.1
-    - deps: serve-index@~1.6.3
-    - deps: serve-static@~1.9.2
-    - deps: type-is@~1.6.1
-  * deps: debug@~2.1.3
-    - Fix high intensity foreground color for bold
-    - deps: ms@0.7.0
-  * deps: merge-descriptors@1.0.0
-  * deps: proxy-addr@~1.0.7
-    - deps: ipaddr.js@0.1.9
-  * deps: send@0.12.2
-    - Throw errors early for invalid `extensions` or `index` options
-    - deps: debug@~2.1.3
-
-3.20.1 / 2015-02-28
-===================
-
-  * Fix `req.host` when using "trust proxy" hops count
-  * Fix `req.protocol`/`req.secure` when using "trust proxy" hops count
-
-3.20.0 / 2015-02-18
-===================
-
-  * Fix `"trust proxy"` setting to inherit when app is mounted
-  * Generate `ETag`s for all request responses
-    - No longer restricted to only responses for `GET` and `HEAD` requests
-  * Use `content-type` to parse `Content-Type` headers
-  * deps: connect@2.29.0
-    - Use `content-type` to parse `Content-Type` headers
-    - deps: body-parser@~1.12.0
-    - deps: compression@~1.4.1
-    - deps: connect-timeout@~1.6.0
-    - deps: cookie-parser@~1.3.4
-    - deps: cookie-signature@1.0.6
-    - deps: csurf@~1.7.0
-    - deps: errorhandler@~1.3.4
-    - deps: express-session@~1.10.3
-    - deps: http-errors@~1.3.1
-    - deps: response-time@~2.3.0
-    - deps: serve-index@~1.6.2
-    - deps: serve-static@~1.9.1
-    - deps: type-is@~1.6.0
-  * deps: cookie-signature@1.0.6
-  * deps: send@0.12.1
-    - Always read the stat size from the file
-    - Fix mutating passed-in `options`
-    - deps: mime@1.3.4
-
-3.19.2 / 2015-02-01
-===================
-
-  * deps: connect@2.28.3
-    - deps: compression@~1.3.1
-    - deps: csurf@~1.6.6
-    - deps: errorhandler@~1.3.3
-    - deps: express-session@~1.10.2
-    - deps: serve-index@~1.6.1
-    - deps: type-is@~1.5.6
-  * deps: proxy-addr@~1.0.6
-    - deps: ipaddr.js@0.1.8
-
-3.19.1 / 2015-01-20
-===================
-
-  * deps: connect@2.28.2
-    - deps: body-parser@~1.10.2
-    - deps: serve-static@~1.8.1
-  * deps: send@0.11.1
-    - Fix root path disclosure
-
-3.19.0 / 2015-01-09
-===================
-
-  * Fix `OPTIONS` responses to include the `HEAD` method property
-  * Use `readline` for prompt in `express(1)`
-  * deps: commander@2.6.0
-  * deps: connect@2.28.1
-    - deps: body-parser@~1.10.1
-    - deps: compression@~1.3.0
-    - deps: connect-timeout@~1.5.0
-    - deps: csurf@~1.6.4
-    - deps: debug@~2.1.1
-    - deps: errorhandler@~1.3.2
-    - deps: express-session@~1.10.1
-    - deps: finalhandler@0.3.3
-    - deps: method-override@~2.3.1
-    - deps: morgan@~1.5.1
-    - deps: serve-favicon@~2.2.0
-    - deps: serve-index@~1.6.0
-    - deps: serve-static@~1.8.0
-    - deps: type-is@~1.5.5
-  * deps: debug@~2.1.1
-  * deps: methods@~1.1.1
-  * deps: proxy-addr@~1.0.5
-    - deps: ipaddr.js@0.1.6
-  * deps: send@0.11.0
-    - deps: debug@~2.1.1
-    - deps: etag@~1.5.1
-    - deps: ms@0.7.0
-    - deps: on-finished@~2.2.0
-
-3.18.6 / 2014-12-12
-===================
-
-  * Fix exception in `req.fresh`/`req.stale` without response headers
-
-3.18.5 / 2014-12-11
-===================
-
-  * deps: connect@2.27.6
-    - deps: compression@~1.2.2
-    - deps: express-session@~1.9.3
-    - deps: http-errors@~1.2.8
-    - deps: serve-index@~1.5.3
-    - deps: type-is@~1.5.4
-
-3.18.4 / 2014-11-23
-===================
-
-  * deps: connect@2.27.4
-    - deps: body-parser@~1.9.3
-    - deps: compression@~1.2.1
-    - deps: errorhandler@~1.2.3
-    - deps: express-session@~1.9.2
-    - deps: qs@2.3.3
-    - deps: serve-favicon@~2.1.7
-    - deps: serve-static@~1.5.1
-    - deps: type-is@~1.5.3
-  * deps: etag@~1.5.1
-  * deps: proxy-addr@~1.0.4
-    - deps: ipaddr.js@0.1.5
-
-3.18.3 / 2014-11-09
-===================
-
-  * deps: connect@2.27.3
-    - Correctly invoke async callback asynchronously
-    - deps: csurf@~1.6.3
-
-3.18.2 / 2014-10-28
-===================
-
-  * deps: connect@2.27.2
-    - Fix handling of URLs containing `://` in the path
-    - deps: body-parser@~1.9.2
-    - deps: qs@2.3.2
-
-3.18.1 / 2014-10-22
-===================
-
-  * Fix internal `utils.merge` deprecation warnings
-  * deps: connect@2.27.1
-    - deps: body-parser@~1.9.1
-    - deps: express-session@~1.9.1
-    - deps: finalhandler@0.3.2
-    - deps: morgan@~1.4.1
-    - deps: qs@2.3.0
-    - deps: serve-static@~1.7.1
-  * deps: send@0.10.1
-    - deps: on-finished@~2.1.1
-
-3.18.0 / 2014-10-17
-===================
-
-  * Use `content-disposition` module for `res.attachment`/`res.download`
-    - Sends standards-compliant `Content-Disposition` header
-    - Full Unicode support
-  * Use `etag` module to generate `ETag` headers
-  * deps: connect@2.27.0
-    - Use `http-errors` module for creating errors
-    - Use `utils-merge` module for merging objects
-    - deps: body-parser@~1.9.0
-    - deps: compression@~1.2.0
-    - deps: connect-timeout@~1.4.0
-    - deps: debug@~2.1.0
-    - deps: depd@~1.0.0
-    - deps: express-session@~1.9.0
-    - deps: finalhandler@0.3.1
-    - deps: method-override@~2.3.0
-    - deps: morgan@~1.4.0
-    - deps: response-time@~2.2.0
-    - deps: serve-favicon@~2.1.6
-    - deps: serve-index@~1.5.0
-    - deps: serve-static@~1.7.0
-  * deps: debug@~2.1.0
-    - Implement `DEBUG_FD` env variable support
-  * deps: depd@~1.0.0
-  * deps: send@0.10.0
-    - deps: debug@~2.1.0
-    - deps: depd@~1.0.0
-    - deps: etag@~1.5.0
-
-3.17.8 / 2014-10-15
-===================
-
-  * deps: connect@2.26.6
-    - deps: compression@~1.1.2
-    - deps: csurf@~1.6.2
-    - deps: errorhandler@~1.2.2
-
-3.17.7 / 2014-10-08
-===================
-
-  * deps: connect@2.26.5
-    - Fix accepting non-object arguments to `logger`
-    - deps: serve-static@~1.6.4
-
-3.17.6 / 2014-10-02
-===================
-
-  * deps: connect@2.26.4
-    - deps: morgan@~1.3.2
-    - deps: type-is@~1.5.2
-
-3.17.5 / 2014-09-24
-===================
-
-  * deps: connect@2.26.3
-    - deps: body-parser@~1.8.4
-    - deps: serve-favicon@~2.1.5
-    - deps: serve-static@~1.6.3
-  * deps: proxy-addr@~1.0.3
-    - Use `forwarded` npm module
-  * deps: send@0.9.3
-    - deps: etag@~1.4.0
-
-3.17.4 / 2014-09-19
-===================
-
-  * deps: connect@2.26.2
-    - deps: body-parser@~1.8.3
-    - deps: qs@2.2.4
-
-3.17.3 / 2014-09-18
-===================
-
-  * deps: proxy-addr@~1.0.2
-    - Fix a global leak when multiple subnets are trusted
-    - deps: ipaddr.js@0.1.3
-
-3.17.2 / 2014-09-15
-===================
-
-  * Use `crc` instead of `buffer-crc32` for speed
-  * deps: connect@2.26.1
-    - deps: body-parser@~1.8.2
-    - deps: depd@0.4.5
-    - deps: express-session@~1.8.2
-    - deps: morgan@~1.3.1
-    - deps: serve-favicon@~2.1.3
-    - deps: serve-static@~1.6.2
-  * deps: depd@0.4.5
-  * deps: send@0.9.2
-    - deps: depd@0.4.5
-    - deps: etag@~1.3.1
-    - deps: range-parser@~1.0.2
-
-3.17.1 / 2014-09-08
-===================
-
-  * Fix error in `req.subdomains` on empty host
-
-3.17.0 / 2014-09-08
-===================
-
-  * Support `X-Forwarded-Host` in `req.subdomains`
-  * Support IP address host in `req.subdomains`
-  * deps: connect@2.26.0
-    - deps: body-parser@~1.8.1
-    - deps: compression@~1.1.0
-    - deps: connect-timeout@~1.3.0
-    - deps: cookie-parser@~1.3.3
-    - deps: cookie-signature@1.0.5
-    - deps: csurf@~1.6.1
-    - deps: debug@~2.0.0
-    - deps: errorhandler@~1.2.0
-    - deps: express-session@~1.8.1
-    - deps: finalhandler@0.2.0
-    - deps: fresh@0.2.4
-    - deps: media-typer@0.3.0
-    - deps: method-override@~2.2.0
-    - deps: morgan@~1.3.0
-    - deps: qs@2.2.3
-    - deps: serve-favicon@~2.1.3
-    - deps: serve-index@~1.2.1
-    - deps: serve-static@~1.6.1
-    - deps: type-is@~1.5.1
-    - deps: vhost@~3.0.0
-  * deps: cookie-signature@1.0.5
-  * deps: debug@~2.0.0
-  * deps: fresh@0.2.4
-  * deps: media-typer@0.3.0
-    - Throw error when parameter format invalid on parse
-  * deps: range-parser@~1.0.2
-  * deps: send@0.9.1
-    - Add `lastModified` option
-    - Use `etag` to generate `ETag` header
-    - deps: debug@~2.0.0
-    - deps: fresh@0.2.4
-  * deps: vary@~1.0.0
-    - Accept valid `Vary` header string as `field`
-
-3.16.10 / 2014-09-04
-====================
-
-  * deps: connect@2.25.10
-    - deps: serve-static@~1.5.4
-  * deps: send@0.8.5
-    - Fix a path traversal issue when using `root`
-    - Fix malicious path detection for empty string path
-
-3.16.9 / 2014-08-29
-===================
-
-  * deps: connect@2.25.9
-    - deps: body-parser@~1.6.7
-    - deps: qs@2.2.2
-
-3.16.8 / 2014-08-27
-===================
-
-  * deps: connect@2.25.8
-    - deps: body-parser@~1.6.6
-    - deps: csurf@~1.4.1
-    - deps: qs@2.2.0
-
-3.16.7 / 2014-08-18
-===================
-
-  * deps: connect@2.25.7
-    - deps: body-parser@~1.6.5
-    - deps: express-session@~1.7.6
-    - deps: morgan@~1.2.3
-    - deps: serve-static@~1.5.3
-  * deps: send@0.8.3
-    - deps: destroy@1.0.3
-    - deps: on-finished@2.1.0
-
-3.16.6 / 2014-08-14
-===================
-
-  * deps: connect@2.25.6
-    - deps: body-parser@~1.6.4
-    - deps: qs@1.2.2
-    - deps: serve-static@~1.5.2
-  * deps: send@0.8.2
-    - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream`
-
-3.16.5 / 2014-08-11
-===================
-
-  * deps: connect@2.25.5
-    - Fix backwards compatibility in `logger`
-
-3.16.4 / 2014-08-10
-===================
-
-  * Fix original URL parsing in `res.location`
-  * deps: connect@2.25.4
-    - Fix `query` middleware breaking with argument
-    - deps: body-parser@~1.6.3
-    - deps: compression@~1.0.11
-    - deps: connect-timeout@~1.2.2
-    - deps: express-session@~1.7.5
-    - deps: method-override@~2.1.3
-    - deps: on-headers@~1.0.0
-    - deps: parseurl@~1.3.0
-    - deps: qs@1.2.1
-    - deps: response-time@~2.0.1
-    - deps: serve-index@~1.1.6
-    - deps: serve-static@~1.5.1
-  * deps: parseurl@~1.3.0
-
-3.16.3 / 2014-08-07
-===================
-
-  * deps: connect@2.25.3
-    - deps: multiparty@3.3.2
-
-3.16.2 / 2014-08-07
-===================
-
-  * deps: connect@2.25.2
-    - deps: body-parser@~1.6.2
-    - deps: qs@1.2.0
-
-3.16.1 / 2014-08-06
-===================
-
-  * deps: connect@2.25.1
-    - deps: body-parser@~1.6.1
-    - deps: qs@1.1.0
-
-3.16.0 / 2014-08-05
-===================
-
-  * deps: connect@2.25.0
-    - deps: body-parser@~1.6.0
-    - deps: compression@~1.0.10
-    - deps: csurf@~1.4.0
-    - deps: express-session@~1.7.4
-    - deps: qs@1.0.2
-    - deps: serve-static@~1.5.0
-  * deps: send@0.8.1
-    - Add `extensions` option
-
-3.15.3 / 2014-08-04
-===================
-
-  * fix `res.sendfile` regression for serving directory index files
-  * deps: connect@2.24.3
-    - deps: serve-index@~1.1.5
-    - deps: serve-static@~1.4.4
-  * deps: send@0.7.4
-    - Fix incorrect 403 on Windows and Node.js 0.11
-    - Fix serving index files without root dir
-
-3.15.2 / 2014-07-27
-===================
-
-  * deps: connect@2.24.2
-    - deps: body-parser@~1.5.2
-    - deps: depd@0.4.4
-    - deps: express-session@~1.7.2
-    - deps: morgan@~1.2.2
-    - deps: serve-static@~1.4.2
-  * deps: depd@0.4.4
-    - Work-around v8 generating empty stack traces
-  * deps: send@0.7.2
-    - deps: depd@0.4.4
-
-3.15.1 / 2014-07-26
-===================
-
-  * deps: connect@2.24.1
-    - deps: body-parser@~1.5.1
-    - deps: depd@0.4.3
-    - deps: express-session@~1.7.1
-    - deps: morgan@~1.2.1
-    - deps: serve-index@~1.1.4
-    - deps: serve-static@~1.4.1
-  * deps: depd@0.4.3
-    - Fix exception when global `Error.stackTraceLimit` is too low
-  * deps: send@0.7.1
-    - deps: depd@0.4.3
-
-3.15.0 / 2014-07-22
-===================
-
-  * Fix `req.protocol` for proxy-direct connections
-  * Pass options from `res.sendfile` to `send`
-  * deps: connect@2.24.0
-    - deps: body-parser@~1.5.0
-    - deps: compression@~1.0.9
-    - deps: connect-timeout@~1.2.1
-    - deps: debug@1.0.4
-    - deps: depd@0.4.2
-    - deps: express-session@~1.7.0
-    - deps: finalhandler@0.1.0
-    - deps: method-override@~2.1.2
-    - deps: morgan@~1.2.0
-    - deps: multiparty@3.3.1
-    - deps: parseurl@~1.2.0
-    - deps: serve-static@~1.4.0
-  * deps: debug@1.0.4
-  * deps: depd@0.4.2
-    - Add `TRACE_DEPRECATION` environment variable
-    - Remove non-standard grey color from color output
-    - Support `--no-deprecation` argument
-    - Support `--trace-deprecation` argument
-  * deps: parseurl@~1.2.0
-    - Cache URLs based on original value
-    - Remove no-longer-needed URL mis-parse work-around
-    - Simplify the "fast-path" `RegExp`
-  * deps: send@0.7.0
-    - Add `dotfiles` option
-    - Cap `maxAge` value to 1 year
-    - deps: debug@1.0.4
-    - deps: depd@0.4.2
-
-3.14.0 / 2014-07-11
-===================
-
- * add explicit "Rosetta Flash JSONP abuse" protection
-   - previous versions are not vulnerable; this is just explicit protection
- * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead
- * fix `res.send(status, num)` to send `num` as json (not error)
- * remove unnecessary escaping when `res.jsonp` returns JSON response
- * deps: basic-auth@1.0.0
-   - support empty password
-   - support empty username
- * deps: connect@2.23.0
-   - deps: debug@1.0.3
-   - deps: express-session@~1.6.4
-   - deps: method-override@~2.1.0
-   - deps: parseurl@~1.1.3
-   - deps: serve-static@~1.3.1
-  * deps: debug@1.0.3
-    - Add support for multiple wildcards in namespaces
-  * deps: methods@1.1.0
-    - add `CONNECT`
-  * deps: parseurl@~1.1.3
-    - faster parsing of href-only URLs
-
-3.13.0 / 2014-07-03
-===================
-
- * add deprecation message to `app.configure`
- * add deprecation message to `req.auth`
- * use `basic-auth` to parse `Authorization` header
- * deps: connect@2.22.0
-   - deps: csurf@~1.3.0
-   - deps: express-session@~1.6.1
-   - deps: multiparty@3.3.0
-   - deps: serve-static@~1.3.0
- * deps: send@0.5.0
-   - Accept string for `maxage` (converted by `ms`)
-   - Include link in default redirect response
-
-3.12.1 / 2014-06-26
-===================
-
- * deps: connect@2.21.1
-   - deps: cookie-parser@1.3.2
-   - deps: cookie-signature@1.0.4
-   - deps: express-session@~1.5.2
-   - deps: type-is@~1.3.2
- * deps: cookie-signature@1.0.4
-   - fix for timing attacks
-
-3.12.0 / 2014-06-21
-===================
-
- * use `media-typer` to alter content-type charset
- * deps: connect@2.21.0
-   - deprecate `connect(middleware)` -- use `app.use(middleware)` instead
-   - deprecate `connect.createServer()` -- use `connect()` instead
-   - fix `res.setHeader()` patch to work with get -> append -> set pattern
-   - deps: compression@~1.0.8
-   - deps: errorhandler@~1.1.1
-   - deps: express-session@~1.5.0
-   - deps: serve-index@~1.1.3
-
-3.11.0 / 2014-06-19
-===================
-
- * deprecate things with `depd` module
- * deps: buffer-crc32@0.2.3
- * deps: connect@2.20.2
-   - deprecate `verify` option to `json` -- use `body-parser` npm module instead
-   - deprecate `verify` option to `urlencoded` -- use `body-parser` npm module instead
-   - deprecate things with `depd` module
-   - use `finalhandler` for final response handling
-   - use `media-typer` to parse `content-type` for charset
-   - deps: body-parser@1.4.3
-   - deps: connect-timeout@1.1.1
-   - deps: cookie-parser@1.3.1
-   - deps: csurf@1.2.2
-   - deps: errorhandler@1.1.0
-   - deps: express-session@1.4.0
-   - deps: multiparty@3.2.9
-   - deps: serve-index@1.1.2
-   - deps: type-is@1.3.1
-   - deps: vhost@2.0.0
-
-3.10.5 / 2014-06-11
-===================
-
- * deps: connect@2.19.6
-   - deps: body-parser@1.3.1
-   - deps: compression@1.0.7
-   - deps: debug@1.0.2
-   - deps: serve-index@1.1.1
-   - deps: serve-static@1.2.3
- * deps: debug@1.0.2
- * deps: send@0.4.3
-   - Do not throw uncatchable error on file open race condition
-   - Use `escape-html` for HTML escaping
-   - deps: debug@1.0.2
-   - deps: finished@1.2.2
-   - deps: fresh@0.2.2
-
-3.10.4 / 2014-06-09
-===================
-
- * deps: connect@2.19.5
-   - fix "event emitter leak" warnings
-   - deps: csurf@1.2.1
-   - deps: debug@1.0.1
-   - deps: serve-static@1.2.2
-   - deps: type-is@1.2.1
- * deps: debug@1.0.1
- * deps: send@0.4.2
-   - fix "event emitter leak" warnings
-   - deps: finished@1.2.1
-   - deps: debug@1.0.1
-
-3.10.3 / 2014-06-05
-===================
-
- * use `vary` module for `res.vary`
- * deps: connect@2.19.4
-   - deps: errorhandler@1.0.2
-   - deps: method-override@2.0.2
-   - deps: serve-favicon@2.0.1
- * deps: debug@1.0.0
-
-3.10.2 / 2014-06-03
-===================
-
- * deps: connect@2.19.3
-   - deps: compression@1.0.6
-
-3.10.1 / 2014-06-03
-===================
-
- * deps: connect@2.19.2
-   - deps: compression@1.0.4
- * deps: proxy-addr@1.0.1
-
-3.10.0 / 2014-06-02
-===================
-
- * deps: connect@2.19.1
-   - deprecate `methodOverride()` -- use `method-override` npm module instead
-   - deps: body-parser@1.3.0
-   - deps: method-override@2.0.1
-   - deps: multiparty@3.2.8
-   - deps: response-time@2.0.0
-   - deps: serve-static@1.2.1
- * deps: methods@1.0.1
- * deps: send@0.4.1
-   - Send `max-age` in `Cache-Control` in correct format
-
-3.9.0 / 2014-05-30
-==================
-
- * custom etag control with `app.set('etag', val)`
-   - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation
-   - `app.set('etag', 'weak')` weak tag
-   - `app.set('etag', 'strong')` strong etag
-   - `app.set('etag', false)` turn off
-   - `app.set('etag', true)` standard etag
- * Include ETag in HEAD requests
- * mark `res.send` ETag as weak and reduce collisions
- * update connect to 2.18.0
-   - deps: compression@1.0.3
-   - deps: serve-index@1.1.0
-   - deps: serve-static@1.2.0
- * update send to 0.4.0
-   - Calculate ETag with md5 for reduced collisions
-   - Ignore stream errors after request ends
-   - deps: debug@0.8.1
-
-3.8.1 / 2014-05-27
-==================
-
- * update connect to 2.17.3
-   - deps: body-parser@1.2.2
-   - deps: express-session@1.2.1
-   - deps: method-override@1.0.2
-
-3.8.0 / 2014-05-21
-==================
-
- * keep previous `Content-Type` for `res.jsonp`
- * set proper `charset` in `Content-Type` for `res.send`
- * update connect to 2.17.1
-   - fix `res.charset` appending charset when `content-type` has one
-   - deps: express-session@1.2.0
-   - deps: morgan@1.1.1
-   - deps: serve-index@1.0.3
-
-3.7.0 / 2014-05-18
-==================
-
- * proper proxy trust with `app.set('trust proxy', trust)`
-   - `app.set('trust proxy', 1)` trust first hop
-   - `app.set('trust proxy', 'loopback')` trust loopback addresses
-   - `app.set('trust proxy', '10.0.0.1')` trust single IP
-   - `app.set('trust proxy', '10.0.0.1/16')` trust subnet
-   - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list
-   - `app.set('trust proxy', false)` turn off
-   - `app.set('trust proxy', true)` trust everything
- * update connect to 2.16.2
-   - deprecate `res.headerSent` -- use `res.headersSent`
-   - deprecate `res.on("header")` -- use on-headers module instead
-   - fix edge-case in `res.appendHeader` that would append in wrong order
-   - json: use body-parser
-   - urlencoded: use body-parser
-   - dep: bytes@1.0.0
-   - dep: cookie-parser@1.1.0
-   - dep: csurf@1.2.0
-   - dep: express-session@1.1.0
-   - dep: method-override@1.0.1
-
-3.6.0 / 2014-05-09
-==================
-
- * deprecate `app.del()` -- use `app.delete()` instead
- * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead
-   - the edge-case `res.json(status, num)` requires `res.status(status).json(num)`
- * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead
-   - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)`
- * support PURGE method
-   - add `app.purge`
-   - add `router.purge`
-   - include PURGE in `app.all`
- * update connect to 2.15.0
-   * Add `res.appendHeader`
-   * Call error stack even when response has been sent
-   * Patch `res.headerSent` to return Boolean
-   * Patch `res.headersSent` for node.js 0.8
-   * Prevent default 404 handler after response sent
-   * dep: compression@1.0.2
-   * dep: connect-timeout@1.1.0
-   * dep: debug@^0.8.0
-   * dep: errorhandler@1.0.1
-   * dep: express-session@1.0.4
-   * dep: morgan@1.0.1
-   * dep: serve-favicon@2.0.0
-   * dep: serve-index@1.0.2
- * update debug to 0.8.0
-   * add `enable()` method
-   * change from stderr to stdout
- * update methods to 1.0.0
-   - add PURGE
- * update mkdirp to 0.5.0
-
-3.5.3 / 2014-05-08
-==================
-
- * fix `req.host` for IPv6 literals
- * fix `res.jsonp` error if callback param is object
-
-3.5.2 / 2014-04-24
-==================
-
- * update connect to 2.14.5
- * update cookie to 0.1.2
- * update mkdirp to 0.4.0
- * update send to 0.3.0
-
-3.5.1 / 2014-03-25
-==================
-
- * pin less-middleware in generated app
-
-3.5.0 / 2014-03-06
-==================
-
- * bump deps
-
-3.4.8 / 2014-01-13
-==================
-
- * prevent incorrect automatic OPTIONS responses #1868 @dpatti
- * update binary and examples for jade 1.0 #1876 @yossi, #1877 @reqshark, #1892 @matheusazzi
- * throw 400 in case of malformed paths @rlidwka
-
-3.4.7 / 2013-12-10
-==================
-
- * update connect
-
-3.4.6 / 2013-12-01
-==================
-
- * update connect (raw-body)
-
-3.4.5 / 2013-11-27
-==================
-
- * update connect
- * res.location: remove leading ./ #1802 @kapouer
- * res.redirect: fix `res.redirect('toString') #1829 @michaelficarra
- * res.send: always send ETag when content-length > 0
- * router: add Router.all() method
-
-3.4.4 / 2013-10-29
-==================
-
- * update connect
- * update supertest
- * update methods
- * express(1): replace bodyParser() with urlencoded() and json() #1795 @chirag04
-
-3.4.3 / 2013-10-23
-==================
-
- * update connect
-
-3.4.2 / 2013-10-18
-==================
-
- * update connect
- * downgrade commander
-
-3.4.1 / 2013-10-15
-==================
-
- * update connect
- * update commander
- * jsonp: check if callback is a function
- * router: wrap encodeURIComponent in a try/catch #1735 (@lxe)
- * res.format: now includes charset @1747 (@sorribas)
- * res.links: allow multiple calls @1746 (@sorribas)
-
-3.4.0 / 2013-09-07
-==================
-
- * add res.vary(). Closes #1682
- * update connect
-
-3.3.8 / 2013-09-02
-==================
-
- * update connect
-
-3.3.7 / 2013-08-28
-==================
-
- * update connect
-
-3.3.6 / 2013-08-27
-==================
-
- * Revert "remove charset from json responses. Closes #1631" (causes issues in some clients)
- * add: req.accepts take an argument list
-
-3.3.4 / 2013-07-08
-==================
-
- * update send and connect
-
-3.3.3 / 2013-07-04
-==================
-
- * update connect
-
-3.3.2 / 2013-07-03
-==================
-
- * update connect
- * update send
- * remove .version export
-
-3.3.1 / 2013-06-27
-==================
-
- * update connect
-
-3.3.0 / 2013-06-26
-==================
-
- * update connect
- * add support for multiple X-Forwarded-Proto values. Closes #1646
- * change: remove charset from json responses. Closes #1631
- * change: return actual booleans from req.accept* functions
- * fix jsonp callback array throw
-
-3.2.6 / 2013-06-02
-==================
-
- * update connect
-
-3.2.5 / 2013-05-21
-==================
-
- * update connect
- * update node-cookie
- * add: throw a meaningful error when there is no default engine
- * change generation of ETags with res.send() to GET requests only. Closes #1619
-
-3.2.4 / 2013-05-09
-==================
-
-  * fix `req.subdomains` when no Host is present
-  * fix `req.host` when no Host is present, return undefined
-
-3.2.3 / 2013-05-07
-==================
-
-  * update connect / qs
-
-3.2.2 / 2013-05-03
-==================
-
-  * update qs
-
-3.2.1 / 2013-04-29
-==================
-
-  * add app.VERB() paths array deprecation warning
-  * update connect
-  * update qs and remove all ~ semver crap
-  * fix: accept number as value of Signed Cookie
-
-3.2.0 / 2013-04-15
-==================
-
-  * add "view" constructor setting to override view behaviour
-  * add req.acceptsEncoding(name)
-  * add req.acceptedEncodings
-  * revert cookie signature change causing session race conditions
-  * fix sorting of Accept values of the same quality
-
-3.1.2 / 2013-04-12
-==================
-
-  * add support for custom Accept parameters
-  * update cookie-signature
-
-3.1.1 / 2013-04-01
-==================
-
-  * add X-Forwarded-Host support to `req.host`
-  * fix relative redirects
-  * update mkdirp
-  * update buffer-crc32
-  * remove legacy app.configure() method from app template.
-
-3.1.0 / 2013-01-25
-==================
-
-  * add support for leading "." in "view engine" setting
-  * add array support to `res.set()`
-  * add node 0.8.x to travis.yml
-  * add "subdomain offset" setting for tweaking `req.subdomains`
-  * add `res.location(url)` implementing `res.redirect()`-like setting of Location
-  * use app.get() for x-powered-by setting for inheritance
-  * fix colons in passwords for `req.auth`
-
-3.0.6 / 2013-01-04
-==================
-
-  * add http verb methods to Router
-  * update connect
-  * fix mangling of the `res.cookie()` options object
-  * fix jsonp whitespace escape. Closes #1132
-
-3.0.5 / 2012-12-19
-==================
-
-  * add throwing when a non-function is passed to a route
-  * fix: explicitly remove Transfer-Encoding header from 204 and 304 responses
-  * revert "add 'etag' option"
-
-3.0.4 / 2012-12-05
-==================
-
-  * add 'etag' option to disable `res.send()` Etags
-  * add escaping of urls in text/plain in `res.redirect()`
-    for old browsers interpreting as html
-  * change crc32 module for a more liberal license
-  * update connect
-
-3.0.3 / 2012-11-13
-==================
-
-  * update connect
-  * update cookie module
-  * fix cookie max-age
-
-3.0.2 / 2012-11-08
-==================
-
-  * add OPTIONS to cors example. Closes #1398
-  * fix route chaining regression. Closes #1397
-
-3.0.1 / 2012-11-01
-==================
-
-  * update connect
-
-3.0.0 / 2012-10-23
-==================
-
-  * add `make clean`
-  * add "Basic" check to req.auth
-  * add `req.auth` test coverage
-  * add cb && cb(payload) to `res.jsonp()`. Closes #1374
-  * add backwards compat for `res.redirect()` status. Closes #1336
-  * add support for `res.json()` to retain previously defined Content-Types. Closes #1349
-  * update connect
-  * change `res.redirect()` to utilize a pathname-relative Location again. Closes #1382
-  * remove non-primitive string support for `res.send()`
-  * fix view-locals example. Closes #1370
-  * fix route-separation example
-
-3.0.0rc5 / 2012-09-18
-==================
-
-  * update connect
-  * add redis search example
-  * add static-files example
-  * add "x-powered-by" setting (`app.disable('x-powered-by')`)
-  * add "application/octet-stream" redirect Accept test case. Closes #1317
-
-3.0.0rc4 / 2012-08-30
-==================
-
-  * add `res.jsonp()`. Closes #1307
-  * add "verbose errors" option to error-pages example
-  * add another route example to express(1) so people are not so confused
-  * add redis online user activity tracking example
-  * update connect dep
-  * fix etag quoting. Closes #1310
-  * fix error-pages 404 status
-  * fix jsonp callback char restrictions
-  * remove old OPTIONS default response
-
-3.0.0rc3 / 2012-08-13
-==================
-
-  * update connect dep
-  * fix signed cookies to work with `connect.cookieParser()` ("s:" prefix was missing) [tnydwrds]
-  * fix `res.render()` clobbering of "locals"
-
-3.0.0rc2 / 2012-08-03
-==================
-
-  * add CORS example
-  * update connect dep
-  * deprecate `.createServer()` & remove old stale examples
-  * fix: escape `res.redirect()` link
-  * fix vhost example
-
-3.0.0rc1 / 2012-07-24
-==================
-
-  * add more examples to view-locals
-  * add scheme-relative redirects (`res.redirect("//foo.com")`) support
-  * update cookie dep
-  * update connect dep
-  * update send dep
-  * fix `express(1)` -h flag, use -H for hogan. Closes #1245
-  * fix `res.sendfile()` socket error handling regression
-
-3.0.0beta7 / 2012-07-16
-==================
-
-  * update connect dep for `send()` root normalization regression
-
-3.0.0beta6 / 2012-07-13
-==================
-
-  * add `err.view` property for view errors. Closes #1226
-  * add "jsonp callback name" setting
-  * add support for "/foo/:bar*" non-greedy matches
-  * change `res.sendfile()` to use `send()` module
-  * change `res.send` to use "response-send" module
-  * remove `app.locals.use` and `res.locals.use`, use regular middleware
-
-3.0.0beta5 / 2012-07-03
-==================
-
-  * add "make check" support
-  * add route-map example
-  * add `res.json(obj, status)` support back for BC
-  * add "methods" dep, remove internal methods module
-  * update connect dep
-  * update auth example to utilize cores pbkdf2
-  * updated tests to use "supertest"
-
-3.0.0beta4 / 2012-06-25
-==================
-
-  * Added `req.auth`
-  * Added `req.range(size)`
-  * Added `res.links(obj)`
-  * Added `res.send(body, status)` support back for backwards compat
-  * Added `.default()` support to `res.format()`
-  * Added 2xx / 304 check to `req.fresh`
-  * Revert "Added + support to the router"
-  * Fixed `res.send()` freshness check, respect res.statusCode
-
-3.0.0beta3 / 2012-06-15
-==================
-
-  * Added hogan `--hjs` to express(1) [nullfirm]
-  * Added another example to content-negotiation
-  * Added `fresh` dep
-  * Changed: `res.send()` always checks freshness
-  * Fixed: expose connects mime module. Closes #1165
-
-3.0.0beta2 / 2012-06-06
-==================
-
-  * Added `+` support to the router
-  * Added `req.host`
-  * Changed `req.param()` to check route first
-  * Update connect dep
-
-3.0.0beta1 / 2012-06-01
-==================
-
-  * Added `res.format()` callback to override default 406 behaviour
-  * Fixed `res.redirect()` 406. Closes #1154
-
-3.0.0alpha5 / 2012-05-30
-==================
-
-  * Added `req.ip`
-  * Added `{ signed: true }` option to `res.cookie()`
-  * Removed `res.signedCookie()`
-  * Changed: dont reverse `req.ips`
-  * Fixed "trust proxy" setting check for `req.ips`
-
-3.0.0alpha4 / 2012-05-09
-==================
-
-  * Added: allow `[]` in jsonp callback. Closes #1128
-  * Added `PORT` env var support in generated template. Closes #1118 [benatkin]
-  * Updated: connect 2.2.2
-
-3.0.0alpha3 / 2012-05-04
-==================
-
-  * Added public `app.routes`. Closes #887
-  * Added _view-locals_ example
-  * Added _mvc_ example
-  * Added `res.locals.use()`. Closes #1120
-  * Added conditional-GET support to `res.send()`
-  * Added: coerce `res.set()` values to strings
-  * Changed: moved `static()` in generated apps below router
-  * Changed: `res.send()` only set ETag when not previously set
-  * Changed connect 2.2.1 dep
-  * Changed: `make test` now runs unit / acceptance tests
-  * Fixed req/res proto inheritance
-
-3.0.0alpha2 / 2012-04-26
-==================
-
-  * Added `make benchmark` back
-  * Added `res.send()` support for `String` objects
-  * Added client-side data exposing example
-  * Added `res.header()` and `req.header()` aliases for BC
-  * Added `express.createServer()` for BC
-  * Perf: memoize parsed urls
-  * Perf: connect 2.2.0 dep
-  * Changed: make `expressInit()` middleware self-aware
-  * Fixed: use app.get() for all core settings
-  * Fixed redis session example
-  * Fixed session example. Closes #1105
-  * Fixed generated express dep. Closes #1078
-
-3.0.0alpha1 / 2012-04-15
-==================
-
-  * Added `app.locals.use(callback)`
-  * Added `app.locals` object
-  * Added `app.locals(obj)`
-  * Added `res.locals` object
-  * Added `res.locals(obj)`
-  * Added `res.format()` for content-negotiation
-  * Added `app.engine()`
-  * Added `res.cookie()` JSON cookie support
-  * Added "trust proxy" setting
-  * Added `req.subdomains`
-  * Added `req.protocol`
-  * Added `req.secure`
-  * Added `req.path`
-  * Added `req.ips`
-  * Added `req.fresh`
-  * Added `req.stale`
-  * Added comma-delimited / array support for `req.accepts()`
-  * Added debug instrumentation
-  * Added `res.set(obj)`
-  * Added `res.set(field, value)`
-  * Added `res.get(field)`
-  * Added `app.get(setting)`. Closes #842
-  * Added `req.acceptsLanguage()`
-  * Added `req.acceptsCharset()`
-  * Added `req.accepted`
-  * Added `req.acceptedLanguages`
-  * Added `req.acceptedCharsets`
-  * Added "json replacer" setting
-  * Added "json spaces" setting
-  * Added X-Forwarded-Proto support to `res.redirect()`. Closes #92
-  * Added `--less` support to express(1)
-  * Added `express.response` prototype
-  * Added `express.request` prototype
-  * Added `express.application` prototype
-  * Added `app.path()`
-  * Added `app.render()`
-  * Added `res.type()` to replace `res.contentType()`
-  * Changed: `res.redirect()` to add relative support
-  * Changed: enable "jsonp callback" by default
-  * Changed: renamed "case sensitive routes" to "case sensitive routing"
-  * Rewrite of all tests with mocha
-  * Removed "root" setting
-  * Removed `res.redirect('home')` support
-  * Removed `req.notify()`
-  * Removed `app.register()`
-  * Removed `app.redirect()`
-  * Removed `app.is()`
-  * Removed `app.helpers()`
-  * Removed `app.dynamicHelpers()`
-  * Fixed `res.sendfile()` with non-GET. Closes #723
-  * Fixed express(1) public dir for windows. Closes #866
-
-2.5.9/ 2012-04-02
-==================
-
-  * Added support for PURGE request method [pbuyle]
-  * Fixed `express(1)` generated app `app.address()` before `listening` [mmalecki]
-
-2.5.8 / 2012-02-08
-==================
-
-  * Update mkdirp dep. Closes #991
-
-2.5.7 / 2012-02-06
-==================
-
-  * Fixed `app.all` duplicate DELETE requests [mscdex]
-
-2.5.6 / 2012-01-13
-==================
-
-  * Updated hamljs dev dep. Closes #953
-
-2.5.5 / 2012-01-08
-==================
-
-  * Fixed: set `filename` on cached templates [matthewleon]
-
-2.5.4 / 2012-01-02
-==================
-
-  * Fixed `express(1)` eol on 0.4.x. Closes #947
-
-2.5.3 / 2011-12-30
-==================
-
-  * Fixed `req.is()` when a charset is present
-
-2.5.2 / 2011-12-10
-==================
-
-  * Fixed: express(1) LF -> CRLF for windows
-
-2.5.1 / 2011-11-17
-==================
-
-  * Changed: updated connect to 1.8.x
-  * Removed sass.js support from express(1)
-
-2.5.0 / 2011-10-24
-==================
-
-  * Added ./routes dir for generated app by default
-  * Added npm install reminder to express(1) app gen
-  * Added 0.5.x support
-  * Removed `make test-cov` since it wont work with node 0.5.x
-  * Fixed express(1) public dir for windows. Closes #866
-
-2.4.7 / 2011-10-05
-==================
-
-  * Added mkdirp to express(1). Closes #795
-  * Added simple _json-config_ example
-  * Added  shorthand for the parsed request's pathname via `req.path`
-  * Changed connect dep to 1.7.x to fix npm issue...
-  * Fixed `res.redirect()` __HEAD__ support. [reported by xerox]
-  * Fixed `req.flash()`, only escape args
-  * Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie]
-
-2.4.6 / 2011-08-22
-==================
-
-  * Fixed multiple param callback regression. Closes #824 [reported by TroyGoode]
-
-2.4.5 / 2011-08-19
-==================
-
-  * Added support for routes to handle errors. Closes #809
-  * Added `app.routes.all()`. Closes #803
-  * Added "basepath" setting to work in conjunction with reverse proxies etc.
-  * Refactored `Route` to use a single array of callbacks
-  * Added support for multiple callbacks for `app.param()`. Closes #801
-Closes #805
-  * Changed: removed .call(self) for route callbacks
-  * Dependency: `qs >= 0.3.1`
-  * Fixed `res.redirect()` on windows due to `join()` usage. Closes #808
-
-2.4.4 / 2011-08-05
-==================
-
-  * Fixed `res.header()` intention of a set, even when `undefined`
-  * Fixed `*`, value no longer required
-  * Fixed `res.send(204)` support. Closes #771
-
-2.4.3 / 2011-07-14
-==================
-
-  * Added docs for `status` option special-case. Closes #739
-  * Fixed `options.filename`, exposing the view path to template engines
-
-2.4.2. / 2011-07-06
-==================
-
-  * Revert "removed jsonp stripping" for XSS
-
-2.4.1 / 2011-07-06
-==================
-
-  * Added `res.json()` JSONP support. Closes #737
-  * Added _extending-templates_ example. Closes #730
-  * Added "strict routing" setting for trailing slashes
-  * Added support for multiple envs in `app.configure()` calls. Closes #735
-  * Changed: `res.send()` using `res.json()`
-  * Changed: when cookie `path === null` don't default it
-  * Changed; default cookie path to "home" setting. Closes #731
-  * Removed _pids/logs_ creation from express(1)
-
-2.4.0 / 2011-06-28
-==================
-
-  * Added chainable `res.status(code)`
-  * Added `res.json()`, an explicit version of `res.send(obj)`
-  * Added simple web-service example
-
-2.3.12 / 2011-06-22
-==================
-
-  * \#express is now on freenode! come join!
-  * Added `req.get(field, param)`
-  * Added links to Japanese documentation, thanks @hideyukisaito!
-  * Added; the `express(1)` generated app outputs the env
-  * Added `content-negotiation` example
-  * Dependency: connect >= 1.5.1 < 2.0.0
-  * Fixed view layout bug. Closes #720
-  * Fixed; ignore body on 304. Closes #701
-
-2.3.11 / 2011-06-04
-==================
-
-  * Added `npm test`
-  * Removed generation of dummy test file from `express(1)`
-  * Fixed; `express(1)` adds express as a dep
-  * Fixed; prune on `prepublish`
-
-2.3.10 / 2011-05-27
-==================
-
-  * Added `req.route`, exposing the current route
-  * Added _package.json_ generation support to `express(1)`
-  * Fixed call to `app.param()` function for optional params. Closes #682
-
-2.3.9 / 2011-05-25
-==================
-
-  * Fixed bug-ish with `../' in `res.partial()` calls
-
-2.3.8 / 2011-05-24
-==================
-
-  * Fixed `app.options()`
-
-2.3.7 / 2011-05-23
-==================
-
-  * Added route `Collection`, ex: `app.get('/user/:id').remove();`
-  * Added support for `app.param(fn)` to define param logic
-  * Removed `app.param()` support for callback with return value
-  * Removed module.parent check from express(1) generated app. Closes #670
-  * Refactored router. Closes #639
-
-2.3.6 / 2011-05-20
-==================
-
-  * Changed; using devDependencies instead of git submodules
-  * Fixed redis session example
-  * Fixed markdown example
-  * Fixed view caching, should not be enabled in development
-
-2.3.5 / 2011-05-20
-==================
-
-  * Added export `.view` as alias for `.View`
-
-2.3.4 / 2011-05-08
-==================
-
-  * Added `./examples/say`
-  * Fixed `res.sendfile()` bug preventing the transfer of files with spaces
-
-2.3.3 / 2011-05-03
-==================
-
-  * Added "case sensitive routes" option.
-  * Changed; split methods supported per rfc [slaskis]
-  * Fixed route-specific middleware when using the same callback function several times
-
-2.3.2 / 2011-04-27
-==================
-
-  * Fixed view hints
-
-2.3.1 / 2011-04-26
-==================
-
-  * Added `app.match()` as `app.match.all()`
-  * Added `app.lookup()` as `app.lookup.all()`
-  * Added `app.remove()` for `app.remove.all()`
-  * Added `app.remove.VERB()`
-  * Fixed template caching collision issue. Closes #644
-  * Moved router over from connect and started refactor
-
-2.3.0 / 2011-04-25
-==================
-
-  * Added options support to `res.clearCookie()`
-  * Added `res.helpers()` as alias of `res.locals()`
-  * Added; json defaults to UTF-8 with `res.send()`. Closes #632. [Daniel   * Dependency `connect >= 1.4.0`
-  * Changed; auto set Content-Type in res.attachement [Aaron Heckmann]
-  * Renamed "cache views" to "view cache". Closes #628
-  * Fixed caching of views when using several apps. Closes #637
-  * Fixed gotcha invoking `app.param()` callbacks once per route middleware.
-Closes #638
-  * Fixed partial lookup precedence. Closes #631
-Shaw]
-
-2.2.2 / 2011-04-12
-==================
-
-  * Added second callback support for `res.download()` connection errors
-  * Fixed `filename` option passing to template engine
-
-2.2.1 / 2011-04-04
-==================
-
-  * Added `layout(path)` helper to change the layout within a view. Closes #610
-  * Fixed `partial()` collection object support.
-    Previously only anything with `.length` would work.
-    When `.length` is present one must still be aware of holes,
-    however now `{ collection: {foo: 'bar'}}` is valid, exposes
-    `keyInCollection` and `keysInCollection`.
-
-  * Performance improved with better view caching
-  * Removed `request` and `response` locals
-  * Changed; errorHandler page title is now `Express` instead of `Connect`
-
-2.2.0 / 2011-03-30
-==================
-
-  * Added `app.lookup.VERB()`, ex `app.lookup.put('/user/:id')`. Closes #606
-  * Added `app.match.VERB()`, ex `app.match.put('/user/12')`. Closes #606
-  * Added `app.VERB(path)` as alias of `app.lookup.VERB()`.
-  * Dependency `connect >= 1.2.0`
-
-2.1.1 / 2011-03-29
-==================
-
-  * Added; expose `err.view` object when failing to locate a view
-  * Fixed `res.partial()` call `next(err)` when no callback is given [reported by aheckmann]
-  * Fixed; `res.send(undefined)` responds with 204 [aheckmann]
-
-2.1.0 / 2011-03-24
-==================
-
-  * Added `<root>/_?<name>` partial lookup support. Closes #447
-  * Added `request`, `response`, and `app` local variables
-  * Added `settings` local variable, containing the app's settings
-  * Added `req.flash()` exception if `req.session` is not available
-  * Added `res.send(bool)` support (json response)
-  * Fixed stylus example for latest version
-  * Fixed; wrap try/catch around `res.render()`
-
-2.0.0 / 2011-03-17
-==================
-
-  * Fixed up index view path alternative.
-  * Changed; `res.locals()` without object returns the locals
-
-2.0.0rc3 / 2011-03-17
-==================
-
-  * Added `res.locals(obj)` to compliment `res.local(key, val)`
-  * Added `res.partial()` callback support
-  * Fixed recursive error reporting issue in `res.render()`
-
-2.0.0rc2 / 2011-03-17
-==================
-
-  * Changed; `partial()` "locals" are now optional
-  * Fixed `SlowBuffer` support. Closes #584 [reported by tyrda01]
-  * Fixed .filename view engine option [reported by drudge]
-  * Fixed blog example
-  * Fixed `{req,res}.app` reference when mounting [Ben Weaver]
-
-2.0.0rc / 2011-03-14
-==================
-
-  * Fixed; expose `HTTPSServer` constructor
-  * Fixed express(1) default test charset. Closes #579 [reported by secoif]
-  * Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP]
-
-2.0.0beta3 / 2011-03-09
-==================
-
-  * Added support for `res.contentType()` literal
-    The original `res.contentType('.json')`,
-    `res.contentType('application/json')`, and `res.contentType('json')`
-    will work now.
-  * Added `res.render()` status option support back
-  * Added charset option for `res.render()`
-  * Added `.charset` support (via connect 1.0.4)
-  * Added view resolution hints when in development and a lookup fails
-  * Added layout lookup support relative to the page view.
-    For example while rendering `./views/user/index.jade` if you create
-    `./views/user/layout.jade` it will be used in favour of the root layout.
-  * Fixed `res.redirect()`. RFC states absolute url [reported by unlink]
-  * Fixed; default `res.send()` string charset to utf8
-  * Removed `Partial` constructor (not currently used)
-
-2.0.0beta2 / 2011-03-07
-==================
-
-  * Added res.render() `.locals` support back to aid in migration process
-  * Fixed flash example
-
-2.0.0beta / 2011-03-03
-==================
-
-  * Added HTTPS support
-  * Added `res.cookie()` maxAge support
-  * Added `req.header()` _Referrer_ / _Referer_ special-case, either works
-  * Added mount support for `res.redirect()`, now respects the mount-point
-  * Added `union()` util, taking place of `merge(clone())` combo
-  * Added stylus support to express(1) generated app
-  * Added secret to session middleware used in examples and generated app
-  * Added `res.local(name, val)` for progressive view locals
-  * Added default param support to `req.param(name, default)`
-  * Added `app.disabled()` and `app.enabled()`
-  * Added `app.register()` support for omitting leading ".", either works
-  * Added `res.partial()`, using the same interface as `partial()` within a view. Closes #539
-  * Added `app.param()` to map route params to async/sync logic
-  * Added; aliased `app.helpers()` as `app.locals()`. Closes #481
-  * Added extname with no leading "." support to `res.contentType()`
-  * Added `cache views` setting, defaulting to enabled in "production" env
-  * Added index file partial resolution, eg: partial('user') may try _views/user/index.jade_.
-  * Added `req.accepts()` support for extensions
-  * Changed; `res.download()` and `res.sendfile()` now utilize Connect's
-    static file server `connect.static.send()`.
-  * Changed; replaced `connect.utils.mime()` with npm _mime_ module
-  * Changed; allow `req.query` to be pre-defined (via middleware or other parent
-  * Changed view partial resolution, now relative to parent view
-  * Changed view engine signature. no longer `engine.render(str, options, callback)`, now `engine.compile(str, options) -> Function`, the returned function accepts `fn(locals)`.
-  * Fixed `req.param()` bug returning Array.prototype methods. Closes #552
-  * Fixed; using `Stream#pipe()` instead of `sys.pump()` in `res.sendfile()`
-  * Fixed; using _qs_ module instead of _querystring_
-  * Fixed; strip unsafe chars from jsonp callbacks
-  * Removed "stream threshold" setting
-
-1.0.8 / 2011-03-01
-==================
-
-  * Allow `req.query` to be pre-defined (via middleware or other parent app)
-  * "connect": ">= 0.5.0 < 1.0.0". Closes #547
-  * Removed the long deprecated __EXPRESS_ENV__ support
-
-1.0.7 / 2011-02-07
-==================
-
-  * Fixed `render()` setting inheritance.
-    Mounted apps would not inherit "view engine"
-
-1.0.6 / 2011-02-07
-==================
-
-  * Fixed `view engine` setting bug when period is in dirname
-
-1.0.5 / 2011-02-05
-==================
-
-  * Added secret to generated app `session()` call
-
-1.0.4 / 2011-02-05
-==================
-
-  * Added `qs` dependency to _package.json_
-  * Fixed namespaced `require()`s for latest connect support
-
-1.0.3 / 2011-01-13
-==================
-
-  * Remove unsafe characters from JSONP callback names [Ryan Grove]
-
-1.0.2 / 2011-01-10
-==================
-
-  * Removed nested require, using `connect.router`
-
-1.0.1 / 2010-12-29
-==================
-
-  * Fixed for middleware stacked via `createServer()`
-    previously the `foo` middleware passed to `createServer(foo)`
-    would not have access to Express methods such as `res.send()`
-    or props like `req.query` etc.
-
-1.0.0 / 2010-11-16
-==================
-
-  * Added; deduce partial object names from the last segment.
-    For example by default `partial('forum/post', postObject)` will
-    give you the _post_ object, providing a meaningful default.
-  * Added http status code string representation to `res.redirect()` body
-  * Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__.
-  * Added `req.is()` to aid in content negotiation
-  * Added partial local inheritance [suggested by masylum]. Closes #102
-    providing access to parent template locals.
-  * Added _-s, --session[s]_ flag to express(1) to add session related middleware
-  * Added _--template_ flag to express(1) to specify the
-    template engine to use.
-  * Added _--css_ flag to express(1) to specify the
-    stylesheet engine to use (or just plain css by default).
-  * Added `app.all()` support [thanks aheckmann]
-  * Added partial direct object support.
-    You may now `partial('user', user)` providing the "user" local,
-    vs previously `partial('user', { object: user })`.
-  * Added _route-separation_ example since many people question ways
-    to do this with CommonJS modules. Also view the _blog_ example for
-    an alternative.
-  * Performance; caching view path derived partial object names
-  * Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454
-  * Fixed jsonp support; _text/javascript_ as per mailinglist discussion
-
-1.0.0rc4 / 2010-10-14
-==================
-
-  * Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0
-  * Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware))
-  * Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass]
-  * Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass]
-  * Added `partial()` support for array-like collections. Closes #434
-  * Added support for swappable querystring parsers
-  * Added session usage docs. Closes #443
-  * Added dynamic helper caching. Closes #439 [suggested by maritz]
-  * Added authentication example
-  * Added basic Range support to `res.sendfile()` (and `res.download()` etc)
-  * Changed; `express(1)` generated app using 2 spaces instead of 4
-  * Default env to "development" again [aheckmann]
-  * Removed _context_ option is no more, use "scope"
-  * Fixed; exposing _./support_ libs to examples so they can run without installs
-  * Fixed mvc example
-
-1.0.0rc3 / 2010-09-20
-==================
-
-  * Added confirmation for `express(1)` app generation. Closes #391
-  * Added extending of flash formatters via `app.flashFormatters`
-  * Added flash formatter support. Closes #411
-  * Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold"
-  * Added _stream threshold_ setting for `res.sendfile()`
-  * Added `res.send()` __HEAD__ support
-  * Added `res.clearCookie()`
-  * Added `res.cookie()`
-  * Added `res.render()` headers option
-  * Added `res.redirect()` response bodies
-  * Added `res.render()` status option support. Closes #425 [thanks aheckmann]
-  * Fixed `res.sendfile()` responding with 403 on malicious path
-  * Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_
-  * Fixed; mounted apps settings now inherit from parent app [aheckmann]
-  * Fixed; stripping Content-Length / Content-Type when 204
-  * Fixed `res.send()` 204. Closes #419
-  * Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402
-  * Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo]
-
-
-1.0.0rc2 / 2010-08-17
-==================
-
-  * Added `app.register()` for template engine mapping. Closes #390
-  * Added `res.render()` callback support as second argument (no options)
-  * Added callback support to `res.download()`
-  * Added callback support for `res.sendfile()`
-  * Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()`
-  * Added "partials" setting to docs
-  * Added default expresso tests to `express(1)` generated app. Closes #384
-  * Fixed `res.sendfile()` error handling, defer via `next()`
-  * Fixed `res.render()` callback when a layout is used [thanks guillermo]
-  * Fixed; `make install` creating ~/.node_libraries when not present
-  * Fixed issue preventing error handlers from being defined anywhere. Closes #387
-
-1.0.0rc / 2010-07-28
-==================
-
-  * Added mounted hook. Closes #369
-  * Added connect dependency to _package.json_
-
-  * Removed "reload views" setting and support code
-    development env never caches, production always caches.
-
-  * Removed _param_ in route callbacks, signature is now
-    simply (req, res, next), previously (req, res, params, next).
-    Use _req.params_ for path captures, _req.query_ for GET params.
-
-  * Fixed "home" setting
-  * Fixed middleware/router precedence issue. Closes #366
-  * Fixed; _configure()_ callbacks called immediately. Closes #368
-
-1.0.0beta2 / 2010-07-23
-==================
-
-  * Added more examples
-  * Added; exporting `Server` constructor
-  * Added `Server#helpers()` for view locals
-  * Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349
-  * Added support for absolute view paths
-  * Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363
-  * Added Guillermo Rauch to the contributor list
-  * Added support for "as" for non-collection partials. Closes #341
-  * Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf]
-  * Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo]
-  * Fixed instanceof `Array` checks, now `Array.isArray()`
-  * Fixed express(1) expansion of public dirs. Closes #348
-  * Fixed middleware precedence. Closes #345
-  * Fixed view watcher, now async [thanks aheckmann]
-
-1.0.0beta / 2010-07-15
-==================
-
-  * Re-write
-    - much faster
-    - much lighter
-    - Check [ExpressJS.com](http://expressjs.com) for migration guide and updated docs
-
-0.14.0 / 2010-06-15
-==================
-
-  * Utilize relative requires
-  * Added Static bufferSize option [aheckmann]
-  * Fixed caching of view and partial subdirectories [aheckmann]
-  * Fixed mime.type() comments now that ".ext" is not supported
-  * Updated haml submodule
-  * Updated class submodule
-  * Removed bin/express
-
-0.13.0 / 2010-06-01
-==================
-
-  * Added node v0.1.97 compatibility
-  * Added support for deleting cookies via Request#cookie('key', null)
-  * Updated haml submodule
-  * Fixed not-found page, now using charset utf-8
-  * Fixed show-exceptions page, now using charset utf-8
-  * Fixed view support due to fs.readFile Buffers
-  * Changed; mime.type() no longer accepts ".type" due to node extname() changes
-
-0.12.0 / 2010-05-22
-==================
-
-  * Added node v0.1.96 compatibility
-  * Added view `helpers` export which act as additional local variables
-  * Updated haml submodule
-  * Changed ETag; removed inode, modified time only
-  * Fixed LF to CRLF for setting multiple cookies
-  * Fixed cookie compilation; values are now urlencoded
-  * Fixed cookies parsing; accepts quoted values and url escaped cookies
-
-0.11.0 / 2010-05-06
-==================
-
-  * Added support for layouts using different engines
-    - this.render('page.html.haml', { layout: 'super-cool-layout.html.ejs' })
-    - this.render('page.html.haml', { layout: 'foo' }) // assumes 'foo.html.haml'
-    - this.render('page.html.haml', { layout: false }) // no layout
-  * Updated ext submodule
-  * Updated haml submodule
-  * Fixed EJS partial support by passing along the context. Issue #307
-
-0.10.1 / 2010-05-03
-==================
-
-  * Fixed binary uploads.
-
-0.10.0 / 2010-04-30
-==================
-
-  * Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s
-    encoding is set to 'utf8' or 'utf-8').
-  * Added "encoding" option to Request#render(). Closes #299
-  * Added "dump exceptions" setting, which is enabled by default.
-  * Added simple ejs template engine support
-  * Added error response support for text/plain, application/json. Closes #297
-  * Added callback function param to Request#error()
-  * Added Request#sendHead()
-  * Added Request#stream()
-  * Added support for Request#respond(304, null) for empty response bodies
-  * Added ETag support to Request#sendfile()
-  * Added options to Request#sendfile(), passed to fs.createReadStream()
-  * Added filename arg to Request#download()
-  * Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request
-  * Performance enhanced by preventing several calls to toLowerCase() in Router#match()
-  * Changed; Request#sendfile() now streams
-  * Changed; Renamed Request#halt() to Request#respond(). Closes #289
-  * Changed; Using sys.inspect() instead of JSON.encode() for error output
-  * Changed; run() returns the http.Server instance. Closes #298
-  * Changed; Defaulting Server#host to null (INADDR_ANY)
-  * Changed; Logger "common" format scale of 0.4f
-  * Removed Logger "request" format
-  * Fixed; Catching ENOENT in view caching, preventing error when "views/partials" is not found
-  * Fixed several issues with http client
-  * Fixed Logger Content-Length output
-  * Fixed bug preventing Opera from retaining the generated session id. Closes #292
-
-0.9.0 / 2010-04-14
-==================
-
-  * Added DSL level error() route support
-  * Added DSL level notFound() route support
-  * Added Request#error()
-  * Added Request#notFound()
-  * Added Request#render() callback function. Closes #258
-  * Added "max upload size" setting
-  * Added "magic" variables to collection partials (\_\_index\_\_, \_\_length\_\_, \_\_isFirst\_\_, \_\_isLast\_\_). Closes #254
-  * Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js
-  * Added callback function support to Request#halt() as 3rd/4th arg
-  * Added preprocessing of route param wildcards using param(). Closes #251
-  * Added view partial support (with collections etc.)
-  * Fixed bug preventing falsey params (such as ?page=0). Closes #286
-  * Fixed setting of multiple cookies. Closes #199
-  * Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml)
-  * Changed; session cookie is now httpOnly
-  * Changed; Request is no longer global
-  * Changed; Event is no longer global
-  * Changed; "sys" module is no longer global
-  * Changed; moved Request#download to Static plugin where it belongs
-  * Changed; Request instance created before body parsing. Closes #262
-  * Changed; Pre-caching views in memory when "cache view contents" is enabled. Closes #253
-  * Changed; Pre-caching view partials in memory when "cache view partials" is enabled
-  * Updated support to node --version 0.1.90
-  * Updated dependencies
-  * Removed set("session cookie") in favour of use(Session, { cookie: { ... }})
-  * Removed utils.mixin(); use Object#mergeDeep()
-
-0.8.0 / 2010-03-19
-==================
-
-  * Added coffeescript example app. Closes #242
-  * Changed; cache api now async friendly. Closes #240
-  * Removed deprecated 'express/static' support. Use 'express/plugins/static'
-
-0.7.6 / 2010-03-19
-==================
-
-  * Added Request#isXHR. Closes #229
-  * Added `make install` (for the executable)
-  * Added `express` executable for setting up simple app templates
-  * Added "GET /public/*" to Static plugin, defaulting to <root>/public
-  * Added Static plugin
-  * Fixed; Request#render() only calls cache.get() once
-  * Fixed; Namespacing View caches with "view:"
-  * Fixed; Namespacing Static caches with "static:"
-  * Fixed; Both example apps now use the Static plugin
-  * Fixed set("views"). Closes #239
-  * Fixed missing space for combined log format
-  * Deprecated Request#sendfile() and 'express/static'
-  * Removed Server#running
-
-0.7.5 / 2010-03-16
-==================
-
-  * Added Request#flash() support without args, now returns all flashes
-  * Updated ext submodule
-
-0.7.4 / 2010-03-16
-==================
-
-  * Fixed session reaper
-  * Changed; class.js replacing js-oo Class implementation (quite a bit faster, no browser cruft)
-
-0.7.3 / 2010-03-16
-==================
-
-  * Added package.json
-  * Fixed requiring of haml / sass due to kiwi removal
-
-0.7.2 / 2010-03-16
-==================
-
-  * Fixed GIT submodules (HAH!)
-
-0.7.1 / 2010-03-16
-==================
-
-  * Changed; Express now using submodules again until a PM is adopted
-  * Changed; chat example using millisecond conversions from ext
-
-0.7.0 / 2010-03-15
-==================
-
-  * Added Request#pass() support (finds the next matching route, or the given path)
-  * Added Logger plugin (default "common" format replaces CommonLogger)
-  * Removed Profiler plugin
-  * Removed CommonLogger plugin
-
-0.6.0 / 2010-03-11
-==================
-
-  * Added seed.yml for kiwi package management support
-  * Added HTTP client query string support when method is GET. Closes #205
-
-  * Added support for arbitrary view engines.
-    For example "foo.engine.html" will now require('engine'),
-    the exports from this module are cached after the first require().
-
-  * Added async plugin support
-
-  * Removed usage of RESTful route funcs as http client
-    get() etc, use http.get() and friends
-
-  * Removed custom exceptions
-
-0.5.0 / 2010-03-10
-==================
-
-  * Added ext dependency (library of js extensions)
-  * Removed extname() / basename() utils. Use path module
-  * Removed toArray() util. Use arguments.values
-  * Removed escapeRegexp() util. Use RegExp.escape()
-  * Removed process.mixin() dependency. Use utils.mixin()
-  * Removed Collection
-  * Removed ElementCollection
-  * Shameless self promotion of ebook "Advanced JavaScript" (http://dev-mag.com)  ;)
-
-0.4.0 / 2010-02-11
-==================
-
-  * Added flash() example to sample upload app
-  * Added high level restful http client module (express/http)
-  * Changed; RESTful route functions double as HTTP clients. Closes #69
-  * Changed; throwing error when routes are added at runtime
-  * Changed; defaulting render() context to the current Request. Closes #197
-  * Updated haml submodule
-
-0.3.0 / 2010-02-11
-==================
-
-  * Updated haml / sass submodules. Closes #200
-  * Added flash message support. Closes #64
-  * Added accepts() now allows multiple args. fixes #117
-  * Added support for plugins to halt. Closes #189
-  * Added alternate layout support. Closes #119
-  * Removed Route#run(). Closes #188
-  * Fixed broken specs due to use(Cookie) missing
-
-0.2.1 / 2010-02-05
-==================
-
-  * Added "plot" format option for Profiler (for gnuplot processing)
-  * Added request number to Profiler plugin
-  * Fixed binary encoding for multipart file uploads, was previously defaulting to UTF8
-  * Fixed issue with routes not firing when not files are present. Closes #184
-  * Fixed process.Promise -> events.Promise
-
-0.2.0 / 2010-02-03
-==================
-
-  * Added parseParam() support for name[] etc. (allows for file inputs with "multiple" attr) Closes #180
-  * Added Both Cache and Session option "reapInterval" may be "reapEvery". Closes #174
-  * Added expiration support to cache api with reaper. Closes #133
-  * Added cache Store.Memory#reap()
-  * Added Cache; cache api now uses first class Cache instances
-  * Added abstract session Store. Closes #172
-  * Changed; cache Memory.Store#get() utilizing Collection
-  * Renamed MemoryStore -> Store.Memory
-  * Fixed use() of the same plugin several time will always use latest options. Closes #176
-
-0.1.0 / 2010-02-03
-==================
-
-  * Changed; Hooks (before / after) pass request as arg as well as evaluated in their context
-  * Updated node support to 0.1.27 Closes #169
-  * Updated dirname(__filename) -> __dirname
-  * Updated libxmljs support to v0.2.0
-  * Added session support with memory store / reaping
-  * Added quick uid() helper
-  * Added multi-part upload support
-  * Added Sass.js support / submodule
-  * Added production env caching view contents and static files
-  * Added static file caching. Closes #136
-  * Added cache plugin with memory stores
-  * Added support to StaticFile so that it works with non-textual files.
-  * Removed dirname() helper
-  * Removed several globals (now their modules must be required)
-
-0.0.2 / 2010-01-10
-==================
-
-  * Added view benchmarks; currently haml vs ejs
-  * Added Request#attachment() specs. Closes #116
-  * Added use of node's parseQuery() util. Closes #123
-  * Added `make init` for submodules
-  * Updated Haml
-  * Updated sample chat app to show messages on load
-  * Updated libxmljs parseString -> parseHtmlString
-  * Fixed `make init` to work with older versions of git
-  * Fixed specs can now run independent specs for those who can't build deps. Closes #127
-  * Fixed issues introduced by the node url module changes. Closes 126.
-  * Fixed two assertions failing due to Collection#keys() returning strings
-  * Fixed faulty Collection#toArray() spec due to keys() returning strings
-  * Fixed `make test` now builds libxmljs.node before testing
-
-0.0.1 / 2010-01-03
-==================
-
-  * Initial release
diff --git a/node_modules/express/LICENSE b/node_modules/express/LICENSE
deleted file mode 100644
index aa927e44e31d486f807634887662efa39256bf84..0000000000000000000000000000000000000000
--- a/node_modules/express/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2009-2014 TJ Holowaychuk <tj@vision-media.ca>
-Copyright (c) 2013-2014 Roman Shtylman <shtylman+expressjs@gmail.com>
-Copyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.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/express/Readme.md b/node_modules/express/Readme.md
deleted file mode 100644
index bc108d55fc07a3dccfc6a62c7b1a6ef049950096..0000000000000000000000000000000000000000
--- a/node_modules/express/Readme.md
+++ /dev/null
@@ -1,260 +0,0 @@
-[![Express Logo](https://i.cloudup.com/zfY6lL7eFa-3000x3000.png)](http://expressjs.com/)
-
-**Fast, unopinionated, minimalist web framework for [Node.js](http://nodejs.org).**
-
-**This project has a [Code of Conduct][].**
-
-## Table of contents
-
-* [Installation](#Installation)
-* [Features](#Features)
-* [Docs & Community](#docs--community)
-* [Quick Start](#Quick-Start)
-* [Running Tests](#Running-Tests)
-* [Philosophy](#Philosophy)
-* [Examples](#Examples)
-* [Contributing to Express](#Contributing)
-* [TC (Technical Committee)](#tc-technical-committee)
-* [Triagers](#triagers)
-* [License](#license)
-
-
-[![NPM Version][npm-version-image]][npm-url]
-[![NPM Install Size][npm-install-size-image]][npm-install-size-url]
-[![NPM Downloads][npm-downloads-image]][npm-downloads-url]
-[![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer]
-
-
-```js
-const express = require('express')
-const app = express()
-
-app.get('/', function (req, res) {
-  res.send('Hello World')
-})
-
-app.listen(3000)
-```
-
-## Installation
-
-This is a [Node.js](https://nodejs.org/en/) module available through the
-[npm registry](https://www.npmjs.com/).
-
-Before installing, [download and install Node.js](https://nodejs.org/en/download/).
-Node.js 0.10 or higher is required.
-
-If this is a brand new project, make sure to create a `package.json` first with
-the [`npm init` command](https://docs.npmjs.com/creating-a-package-json-file).
-
-Installation is done using the
-[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
-
-```console
-$ npm install express
-```
-
-Follow [our installing guide](http://expressjs.com/en/starter/installing.html)
-for more information.
-
-## Features
-
-  * Robust routing
-  * Focus on high performance
-  * Super-high test coverage
-  * HTTP helpers (redirection, caching, etc)
-  * View system supporting 14+ template engines
-  * Content negotiation
-  * Executable for generating applications quickly
-
-## Docs & Community
-
-  * [Website and Documentation](http://expressjs.com/) - [[website repo](https://github.com/expressjs/expressjs.com)]
-  * [#express](https://web.libera.chat/#express) on [Libera Chat](https://libera.chat) IRC
-  * [GitHub Organization](https://github.com/expressjs) for Official Middleware & Modules
-  * Visit the [Wiki](https://github.com/expressjs/express/wiki)
-  * [Google Group](https://groups.google.com/group/express-js) for discussion
-  * [Gitter](https://gitter.im/expressjs/express) for support and discussion
-
-**PROTIP** Be sure to read [Migrating from 3.x to 4.x](https://github.com/expressjs/express/wiki/Migrating-from-3.x-to-4.x) as well as [New features in 4.x](https://github.com/expressjs/express/wiki/New-features-in-4.x).
-
-## Quick Start
-
-  The quickest way to get started with express is to utilize the executable [`express(1)`](https://github.com/expressjs/generator) to generate an application as shown below:
-
-  Install the executable. The executable's major version will match Express's:
-
-```console
-$ npm install -g express-generator@4
-```
-
-  Create the app:
-
-```console
-$ express /tmp/foo && cd /tmp/foo
-```
-
-  Install dependencies:
-
-```console
-$ npm install
-```
-
-  Start the server:
-
-```console
-$ npm start
-```
-
-  View the website at: http://localhost:3000
-
-## Philosophy
-
-  The Express philosophy is to provide small, robust tooling for HTTP servers, making
-  it a great solution for single page applications, websites, hybrids, or public
-  HTTP APIs.
-
-  Express does not force you to use any specific ORM or template engine. With support for over
-  14 template engines via [Consolidate.js](https://github.com/tj/consolidate.js),
-  you can quickly craft your perfect framework.
-
-## Examples
-
-  To view the examples, clone the Express repo and install the dependencies:
-
-```console
-$ git clone https://github.com/expressjs/express.git --depth 1
-$ cd express
-$ npm install
-```
-
-  Then run whichever example you want:
-
-```console
-$ node examples/content-negotiation
-```
-
-## Contributing
-
-  [![Linux Build][github-actions-ci-image]][github-actions-ci-url]
-  [![Windows Build][appveyor-image]][appveyor-url]
-  [![Test Coverage][coveralls-image]][coveralls-url]
-
-The Express.js project welcomes all constructive contributions. Contributions take many forms,
-from code for bug fixes and enhancements, to additions and fixes to documentation, additional
-tests, triaging incoming pull requests and issues, and more!
-
-See the [Contributing Guide](Contributing.md) for more technical details on contributing.
-
-### Security Issues
-
-If you discover a security vulnerability in Express, please see [Security Policies and Procedures](Security.md).
-
-### Running Tests
-
-To run the test suite, first install the dependencies, then run `npm test`:
-
-```console
-$ npm install
-$ npm test
-```
-
-## People
-
-The original author of Express is [TJ Holowaychuk](https://github.com/tj)
-
-[List of all contributors](https://github.com/expressjs/express/graphs/contributors)
-
-### TC (Technical Committee)
-
-* [UlisesGascon](https://github.com/UlisesGascon) - **Ulises Gascón** (he/him)
-* [jonchurch](https://github.com/jonchurch) - **Jon Church**
-* [wesleytodd](https://github.com/wesleytodd) - **Wes Todd**
-* [LinusU](https://github.com/LinusU) - **Linus Unnebäck**
-* [blakeembrey](https://github.com/blakeembrey) - **Blake Embrey**
-* [sheplu](https://github.com/sheplu) - **Jean Burellier**
-* [crandmck](https://github.com/crandmck) - **Rand McKinney**
-* [ctcpip](https://github.com/ctcpip) - **Chris de Almeida**
-
-<details>
-<summary>TC emeriti members</summary>
-
-#### TC emeriti members
-
-  * [dougwilson](https://github.com/dougwilson) - **Douglas Wilson**
-  * [hacksparrow](https://github.com/hacksparrow) - **Hage Yaapa**
-  * [jonathanong](https://github.com/jonathanong) - **jongleberry**
-  * [niftylettuce](https://github.com/niftylettuce) - **niftylettuce**
-  * [troygoode](https://github.com/troygoode) - **Troy Goode**
-</details>
-
-
-### Triagers
-
-* [aravindvnair99](https://github.com/aravindvnair99) - **Aravind Nair**
-* [carpasse](https://github.com/carpasse) - **Carlos Serrano**
-* [CBID2](https://github.com/CBID2) - **Christine Belzie**
-* [enyoghasim](https://github.com/enyoghasim) - **David Enyoghasim**
-* [UlisesGascon](https://github.com/UlisesGascon) - **Ulises Gascón** (he/him)
-* [mertcanaltin](https://github.com/mertcanaltin) - **Mert Can Altin**
-* [0ss](https://github.com/0ss) - **Salah**
-* [import-brain](https://github.com/import-brain) - **Eric Cheng** (he/him)
-* [3imed-jaberi](https://github.com/3imed-jaberi) - **Imed Jaberi**
-* [dakshkhetan](https://github.com/dakshkhetan) - **Daksh Khetan** (he/him)
-* [lucasraziel](https://github.com/lucasraziel) - **Lucas Soares Do Rego**
-* [IamLizu](https://github.com/IamLizu) - **S M Mahmudul Hasan** (he/him)
-* [Sushmeet](https://github.com/Sushmeet) - **Sushmeet Sunger**
-
-<details>
-<summary>Triagers emeriti members</summary>
-
-#### Emeritus Triagers
-
-  * [AuggieH](https://github.com/AuggieH) - **Auggie Hudak**
-  * [G-Rath](https://github.com/G-Rath) - **Gareth Jones**
-  * [MohammadXroid](https://github.com/MohammadXroid) - **Mohammad Ayashi**
-  * [NawafSwe](https://github.com/NawafSwe) - **Nawaf Alsharqi**
-  * [NotMoni](https://github.com/NotMoni) - **Moni**
-  * [VigneshMurugan](https://github.com/VigneshMurugan) - **Vignesh Murugan**
-  * [davidmashe](https://github.com/davidmashe) - **David Ashe**
-  * [digitaIfabric](https://github.com/digitaIfabric) - **David**
-  * [e-l-i-s-e](https://github.com/e-l-i-s-e) - **Elise Bonner**
-  * [fed135](https://github.com/fed135) - **Frederic Charette**
-  * [firmanJS](https://github.com/firmanJS) - **Firman Abdul Hakim**
-  * [getspooky](https://github.com/getspooky) - **Yasser Ameur**
-  * [ghinks](https://github.com/ghinks) - **Glenn**
-  * [ghousemohamed](https://github.com/ghousemohamed) - **Ghouse Mohamed**
-  * [gireeshpunathil](https://github.com/gireeshpunathil) - **Gireesh Punathil**
-  * [jake32321](https://github.com/jake32321) - **Jake Reed**
-  * [jonchurch](https://github.com/jonchurch) - **Jon Church**
-  * [lekanikotun](https://github.com/lekanikotun) - **Troy Goode**
-  * [marsonya](https://github.com/marsonya) - **Lekan Ikotun**
-  * [mastermatt](https://github.com/mastermatt) - **Matt R. Wilson**
-  * [maxakuru](https://github.com/maxakuru) - **Max Edell**
-  * [mlrawlings](https://github.com/mlrawlings) - **Michael Rawlings**
-  * [rodion-arr](https://github.com/rodion-arr) - **Rodion Abdurakhimov**
-  * [sheplu](https://github.com/sheplu) - **Jean Burellier**
-  * [tarunyadav1](https://github.com/tarunyadav1) - **Tarun yadav**
-  * [tunniclm](https://github.com/tunniclm) - **Mike Tunnicliffe**
-</details>
-
-
-## License
-
-  [MIT](LICENSE)
-
-[appveyor-image]: https://badgen.net/appveyor/ci/dougwilson/express/master?label=windows
-[appveyor-url]: https://ci.appveyor.com/project/dougwilson/express
-[coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/express/master
-[coveralls-url]: https://coveralls.io/r/expressjs/express?branch=master
-[github-actions-ci-image]: https://badgen.net/github/checks/expressjs/express/master?label=linux
-[github-actions-ci-url]: https://github.com/expressjs/express/actions/workflows/ci.yml
-[npm-downloads-image]: https://badgen.net/npm/dm/express
-[npm-downloads-url]: https://npmcharts.com/compare/express?minimal=true
-[npm-install-size-image]: https://badgen.net/packagephobia/install/express
-[npm-install-size-url]: https://packagephobia.com/result?p=express
-[npm-url]: https://npmjs.org/package/express
-[npm-version-image]: https://badgen.net/npm/v/express
-[ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/express/badge
-[ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/express
-[Code of Conduct]: https://github.com/expressjs/express/blob/master/Code-Of-Conduct.md
diff --git a/node_modules/express/index.js b/node_modules/express/index.js
deleted file mode 100644
index d219b0c878dc6136eb2096cffa140bf6bf2b8e9c..0000000000000000000000000000000000000000
--- a/node_modules/express/index.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/*!
- * express
- * Copyright(c) 2009-2013 TJ Holowaychuk
- * Copyright(c) 2013 Roman Shtylman
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-module.exports = require('./lib/express');
diff --git a/node_modules/express/lib/application.js b/node_modules/express/lib/application.js
deleted file mode 100644
index ebb30b51b3d6e84d33288251d11ab92d8462c181..0000000000000000000000000000000000000000
--- a/node_modules/express/lib/application.js
+++ /dev/null
@@ -1,661 +0,0 @@
-/*!
- * express
- * Copyright(c) 2009-2013 TJ Holowaychuk
- * Copyright(c) 2013 Roman Shtylman
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module dependencies.
- * @private
- */
-
-var finalhandler = require('finalhandler');
-var Router = require('./router');
-var methods = require('methods');
-var middleware = require('./middleware/init');
-var query = require('./middleware/query');
-var debug = require('debug')('express:application');
-var View = require('./view');
-var http = require('http');
-var compileETag = require('./utils').compileETag;
-var compileQueryParser = require('./utils').compileQueryParser;
-var compileTrust = require('./utils').compileTrust;
-var deprecate = require('depd')('express');
-var flatten = require('array-flatten');
-var merge = require('utils-merge');
-var resolve = require('path').resolve;
-var setPrototypeOf = require('setprototypeof')
-
-/**
- * Module variables.
- * @private
- */
-
-var hasOwnProperty = Object.prototype.hasOwnProperty
-var slice = Array.prototype.slice;
-
-/**
- * Application prototype.
- */
-
-var app = exports = module.exports = {};
-
-/**
- * Variable for trust proxy inheritance back-compat
- * @private
- */
-
-var trustProxyDefaultSymbol = '@@symbol:trust_proxy_default';
-
-/**
- * Initialize the server.
- *
- *   - setup default configuration
- *   - setup default middleware
- *   - setup route reflection methods
- *
- * @private
- */
-
-app.init = function init() {
-  this.cache = {};
-  this.engines = {};
-  this.settings = {};
-
-  this.defaultConfiguration();
-};
-
-/**
- * Initialize application configuration.
- * @private
- */
-
-app.defaultConfiguration = function defaultConfiguration() {
-  var env = process.env.NODE_ENV || 'development';
-
-  // default settings
-  this.enable('x-powered-by');
-  this.set('etag', 'weak');
-  this.set('env', env);
-  this.set('query parser', 'extended');
-  this.set('subdomain offset', 2);
-  this.set('trust proxy', false);
-
-  // trust proxy inherit back-compat
-  Object.defineProperty(this.settings, trustProxyDefaultSymbol, {
-    configurable: true,
-    value: true
-  });
-
-  debug('booting in %s mode', env);
-
-  this.on('mount', function onmount(parent) {
-    // inherit trust proxy
-    if (this.settings[trustProxyDefaultSymbol] === true
-      && typeof parent.settings['trust proxy fn'] === 'function') {
-      delete this.settings['trust proxy'];
-      delete this.settings['trust proxy fn'];
-    }
-
-    // inherit protos
-    setPrototypeOf(this.request, parent.request)
-    setPrototypeOf(this.response, parent.response)
-    setPrototypeOf(this.engines, parent.engines)
-    setPrototypeOf(this.settings, parent.settings)
-  });
-
-  // setup locals
-  this.locals = Object.create(null);
-
-  // top-most app is mounted at /
-  this.mountpath = '/';
-
-  // default locals
-  this.locals.settings = this.settings;
-
-  // default configuration
-  this.set('view', View);
-  this.set('views', resolve('views'));
-  this.set('jsonp callback name', 'callback');
-
-  if (env === 'production') {
-    this.enable('view cache');
-  }
-
-  Object.defineProperty(this, 'router', {
-    get: function() {
-      throw new Error('\'app.router\' is deprecated!\nPlease see the 3.x to 4.x migration guide for details on how to update your app.');
-    }
-  });
-};
-
-/**
- * lazily adds the base router if it has not yet been added.
- *
- * We cannot add the base router in the defaultConfiguration because
- * it reads app settings which might be set after that has run.
- *
- * @private
- */
-app.lazyrouter = function lazyrouter() {
-  if (!this._router) {
-    this._router = new Router({
-      caseSensitive: this.enabled('case sensitive routing'),
-      strict: this.enabled('strict routing')
-    });
-
-    this._router.use(query(this.get('query parser fn')));
-    this._router.use(middleware.init(this));
-  }
-};
-
-/**
- * Dispatch a req, res pair into the application. Starts pipeline processing.
- *
- * If no callback is provided, then default error handlers will respond
- * in the event of an error bubbling through the stack.
- *
- * @private
- */
-
-app.handle = function handle(req, res, callback) {
-  var router = this._router;
-
-  // final handler
-  var done = callback || finalhandler(req, res, {
-    env: this.get('env'),
-    onerror: logerror.bind(this)
-  });
-
-  // no routes
-  if (!router) {
-    debug('no routes defined on app');
-    done();
-    return;
-  }
-
-  router.handle(req, res, done);
-};
-
-/**
- * Proxy `Router#use()` to add middleware to the app router.
- * See Router#use() documentation for details.
- *
- * If the _fn_ parameter is an express app, then it will be
- * mounted at the _route_ specified.
- *
- * @public
- */
-
-app.use = function use(fn) {
-  var offset = 0;
-  var path = '/';
-
-  // default path to '/'
-  // disambiguate app.use([fn])
-  if (typeof fn !== 'function') {
-    var arg = fn;
-
-    while (Array.isArray(arg) && arg.length !== 0) {
-      arg = arg[0];
-    }
-
-    // first arg is the path
-    if (typeof arg !== 'function') {
-      offset = 1;
-      path = fn;
-    }
-  }
-
-  var fns = flatten(slice.call(arguments, offset));
-
-  if (fns.length === 0) {
-    throw new TypeError('app.use() requires a middleware function')
-  }
-
-  // setup router
-  this.lazyrouter();
-  var router = this._router;
-
-  fns.forEach(function (fn) {
-    // non-express app
-    if (!fn || !fn.handle || !fn.set) {
-      return router.use(path, fn);
-    }
-
-    debug('.use app under %s', path);
-    fn.mountpath = path;
-    fn.parent = this;
-
-    // restore .app property on req and res
-    router.use(path, function mounted_app(req, res, next) {
-      var orig = req.app;
-      fn.handle(req, res, function (err) {
-        setPrototypeOf(req, orig.request)
-        setPrototypeOf(res, orig.response)
-        next(err);
-      });
-    });
-
-    // mounted an app
-    fn.emit('mount', this);
-  }, this);
-
-  return this;
-};
-
-/**
- * Proxy to the app `Router#route()`
- * Returns a new `Route` instance for the _path_.
- *
- * Routes are isolated middleware stacks for specific paths.
- * See the Route api docs for details.
- *
- * @public
- */
-
-app.route = function route(path) {
-  this.lazyrouter();
-  return this._router.route(path);
-};
-
-/**
- * Register the given template engine callback `fn`
- * as `ext`.
- *
- * By default will `require()` the engine based on the
- * file extension. For example if you try to render
- * a "foo.ejs" file Express will invoke the following internally:
- *
- *     app.engine('ejs', require('ejs').__express);
- *
- * For engines that do not provide `.__express` out of the box,
- * or if you wish to "map" a different extension to the template engine
- * you may use this method. For example mapping the EJS template engine to
- * ".html" files:
- *
- *     app.engine('html', require('ejs').renderFile);
- *
- * In this case EJS provides a `.renderFile()` method with
- * the same signature that Express expects: `(path, options, callback)`,
- * though note that it aliases this method as `ejs.__express` internally
- * so if you're using ".ejs" extensions you don't need to do anything.
- *
- * Some template engines do not follow this convention, the
- * [Consolidate.js](https://github.com/tj/consolidate.js)
- * library was created to map all of node's popular template
- * engines to follow this convention, thus allowing them to
- * work seamlessly within Express.
- *
- * @param {String} ext
- * @param {Function} fn
- * @return {app} for chaining
- * @public
- */
-
-app.engine = function engine(ext, fn) {
-  if (typeof fn !== 'function') {
-    throw new Error('callback function required');
-  }
-
-  // get file extension
-  var extension = ext[0] !== '.'
-    ? '.' + ext
-    : ext;
-
-  // store engine
-  this.engines[extension] = fn;
-
-  return this;
-};
-
-/**
- * Proxy to `Router#param()` with one added api feature. The _name_ parameter
- * can be an array of names.
- *
- * See the Router#param() docs for more details.
- *
- * @param {String|Array} name
- * @param {Function} fn
- * @return {app} for chaining
- * @public
- */
-
-app.param = function param(name, fn) {
-  this.lazyrouter();
-
-  if (Array.isArray(name)) {
-    for (var i = 0; i < name.length; i++) {
-      this.param(name[i], fn);
-    }
-
-    return this;
-  }
-
-  this._router.param(name, fn);
-
-  return this;
-};
-
-/**
- * Assign `setting` to `val`, or return `setting`'s value.
- *
- *    app.set('foo', 'bar');
- *    app.set('foo');
- *    // => "bar"
- *
- * Mounted servers inherit their parent server's settings.
- *
- * @param {String} setting
- * @param {*} [val]
- * @return {Server} for chaining
- * @public
- */
-
-app.set = function set(setting, val) {
-  if (arguments.length === 1) {
-    // app.get(setting)
-    var settings = this.settings
-
-    while (settings && settings !== Object.prototype) {
-      if (hasOwnProperty.call(settings, setting)) {
-        return settings[setting]
-      }
-
-      settings = Object.getPrototypeOf(settings)
-    }
-
-    return undefined
-  }
-
-  debug('set "%s" to %o', setting, val);
-
-  // set value
-  this.settings[setting] = val;
-
-  // trigger matched settings
-  switch (setting) {
-    case 'etag':
-      this.set('etag fn', compileETag(val));
-      break;
-    case 'query parser':
-      this.set('query parser fn', compileQueryParser(val));
-      break;
-    case 'trust proxy':
-      this.set('trust proxy fn', compileTrust(val));
-
-      // trust proxy inherit back-compat
-      Object.defineProperty(this.settings, trustProxyDefaultSymbol, {
-        configurable: true,
-        value: false
-      });
-
-      break;
-  }
-
-  return this;
-};
-
-/**
- * Return the app's absolute pathname
- * based on the parent(s) that have
- * mounted it.
- *
- * For example if the application was
- * mounted as "/admin", which itself
- * was mounted as "/blog" then the
- * return value would be "/blog/admin".
- *
- * @return {String}
- * @private
- */
-
-app.path = function path() {
-  return this.parent
-    ? this.parent.path() + this.mountpath
-    : '';
-};
-
-/**
- * Check if `setting` is enabled (truthy).
- *
- *    app.enabled('foo')
- *    // => false
- *
- *    app.enable('foo')
- *    app.enabled('foo')
- *    // => true
- *
- * @param {String} setting
- * @return {Boolean}
- * @public
- */
-
-app.enabled = function enabled(setting) {
-  return Boolean(this.set(setting));
-};
-
-/**
- * Check if `setting` is disabled.
- *
- *    app.disabled('foo')
- *    // => true
- *
- *    app.enable('foo')
- *    app.disabled('foo')
- *    // => false
- *
- * @param {String} setting
- * @return {Boolean}
- * @public
- */
-
-app.disabled = function disabled(setting) {
-  return !this.set(setting);
-};
-
-/**
- * Enable `setting`.
- *
- * @param {String} setting
- * @return {app} for chaining
- * @public
- */
-
-app.enable = function enable(setting) {
-  return this.set(setting, true);
-};
-
-/**
- * Disable `setting`.
- *
- * @param {String} setting
- * @return {app} for chaining
- * @public
- */
-
-app.disable = function disable(setting) {
-  return this.set(setting, false);
-};
-
-/**
- * Delegate `.VERB(...)` calls to `router.VERB(...)`.
- */
-
-methods.forEach(function(method){
-  app[method] = function(path){
-    if (method === 'get' && arguments.length === 1) {
-      // app.get(setting)
-      return this.set(path);
-    }
-
-    this.lazyrouter();
-
-    var route = this._router.route(path);
-    route[method].apply(route, slice.call(arguments, 1));
-    return this;
-  };
-});
-
-/**
- * Special-cased "all" method, applying the given route `path`,
- * middleware, and callback to _every_ HTTP method.
- *
- * @param {String} path
- * @param {Function} ...
- * @return {app} for chaining
- * @public
- */
-
-app.all = function all(path) {
-  this.lazyrouter();
-
-  var route = this._router.route(path);
-  var args = slice.call(arguments, 1);
-
-  for (var i = 0; i < methods.length; i++) {
-    route[methods[i]].apply(route, args);
-  }
-
-  return this;
-};
-
-// del -> delete alias
-
-app.del = deprecate.function(app.delete, 'app.del: Use app.delete instead');
-
-/**
- * Render the given view `name` name with `options`
- * and a callback accepting an error and the
- * rendered template string.
- *
- * Example:
- *
- *    app.render('email', { name: 'Tobi' }, function(err, html){
- *      // ...
- *    })
- *
- * @param {String} name
- * @param {Object|Function} options or fn
- * @param {Function} callback
- * @public
- */
-
-app.render = function render(name, options, callback) {
-  var cache = this.cache;
-  var done = callback;
-  var engines = this.engines;
-  var opts = options;
-  var renderOptions = {};
-  var view;
-
-  // support callback function as second arg
-  if (typeof options === 'function') {
-    done = options;
-    opts = {};
-  }
-
-  // merge app.locals
-  merge(renderOptions, this.locals);
-
-  // merge options._locals
-  if (opts._locals) {
-    merge(renderOptions, opts._locals);
-  }
-
-  // merge options
-  merge(renderOptions, opts);
-
-  // set .cache unless explicitly provided
-  if (renderOptions.cache == null) {
-    renderOptions.cache = this.enabled('view cache');
-  }
-
-  // primed cache
-  if (renderOptions.cache) {
-    view = cache[name];
-  }
-
-  // view
-  if (!view) {
-    var View = this.get('view');
-
-    view = new View(name, {
-      defaultEngine: this.get('view engine'),
-      root: this.get('views'),
-      engines: engines
-    });
-
-    if (!view.path) {
-      var dirs = Array.isArray(view.root) && view.root.length > 1
-        ? 'directories "' + view.root.slice(0, -1).join('", "') + '" or "' + view.root[view.root.length - 1] + '"'
-        : 'directory "' + view.root + '"'
-      var err = new Error('Failed to lookup view "' + name + '" in views ' + dirs);
-      err.view = view;
-      return done(err);
-    }
-
-    // prime the cache
-    if (renderOptions.cache) {
-      cache[name] = view;
-    }
-  }
-
-  // render
-  tryRender(view, renderOptions, done);
-};
-
-/**
- * Listen for connections.
- *
- * A node `http.Server` is returned, with this
- * application (which is a `Function`) as its
- * callback. If you wish to create both an HTTP
- * and HTTPS server you may do so with the "http"
- * and "https" modules as shown here:
- *
- *    var http = require('http')
- *      , https = require('https')
- *      , express = require('express')
- *      , app = express();
- *
- *    http.createServer(app).listen(80);
- *    https.createServer({ ... }, app).listen(443);
- *
- * @return {http.Server}
- * @public
- */
-
-app.listen = function listen() {
-  var server = http.createServer(this);
-  return server.listen.apply(server, arguments);
-};
-
-/**
- * Log error using console.error.
- *
- * @param {Error} err
- * @private
- */
-
-function logerror(err) {
-  /* istanbul ignore next */
-  if (this.get('env') !== 'test') console.error(err.stack || err.toString());
-}
-
-/**
- * Try rendering a view.
- * @private
- */
-
-function tryRender(view, options, callback) {
-  try {
-    view.render(options, callback);
-  } catch (err) {
-    callback(err);
-  }
-}
diff --git a/node_modules/express/lib/express.js b/node_modules/express/lib/express.js
deleted file mode 100644
index d188a16db70387967e0f913c2ee7c0bf9f7ffb09..0000000000000000000000000000000000000000
--- a/node_modules/express/lib/express.js
+++ /dev/null
@@ -1,116 +0,0 @@
-/*!
- * express
- * Copyright(c) 2009-2013 TJ Holowaychuk
- * Copyright(c) 2013 Roman Shtylman
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module dependencies.
- */
-
-var bodyParser = require('body-parser')
-var EventEmitter = require('events').EventEmitter;
-var mixin = require('merge-descriptors');
-var proto = require('./application');
-var Route = require('./router/route');
-var Router = require('./router');
-var req = require('./request');
-var res = require('./response');
-
-/**
- * Expose `createApplication()`.
- */
-
-exports = module.exports = createApplication;
-
-/**
- * Create an express application.
- *
- * @return {Function}
- * @api public
- */
-
-function createApplication() {
-  var app = function(req, res, next) {
-    app.handle(req, res, next);
-  };
-
-  mixin(app, EventEmitter.prototype, false);
-  mixin(app, proto, false);
-
-  // expose the prototype that will get set on requests
-  app.request = Object.create(req, {
-    app: { configurable: true, enumerable: true, writable: true, value: app }
-  })
-
-  // expose the prototype that will get set on responses
-  app.response = Object.create(res, {
-    app: { configurable: true, enumerable: true, writable: true, value: app }
-  })
-
-  app.init();
-  return app;
-}
-
-/**
- * Expose the prototypes.
- */
-
-exports.application = proto;
-exports.request = req;
-exports.response = res;
-
-/**
- * Expose constructors.
- */
-
-exports.Route = Route;
-exports.Router = Router;
-
-/**
- * Expose middleware
- */
-
-exports.json = bodyParser.json
-exports.query = require('./middleware/query');
-exports.raw = bodyParser.raw
-exports.static = require('serve-static');
-exports.text = bodyParser.text
-exports.urlencoded = bodyParser.urlencoded
-
-/**
- * Replace removed middleware with an appropriate error message.
- */
-
-var removedMiddlewares = [
-  'bodyParser',
-  'compress',
-  'cookieSession',
-  'session',
-  'logger',
-  'cookieParser',
-  'favicon',
-  'responseTime',
-  'errorHandler',
-  'timeout',
-  'methodOverride',
-  'vhost',
-  'csrf',
-  'directory',
-  'limit',
-  'multipart',
-  'staticCache'
-]
-
-removedMiddlewares.forEach(function (name) {
-  Object.defineProperty(exports, name, {
-    get: function () {
-      throw new Error('Most middleware (like ' + name + ') is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.');
-    },
-    configurable: true
-  });
-});
diff --git a/node_modules/express/lib/middleware/init.js b/node_modules/express/lib/middleware/init.js
deleted file mode 100644
index dfd042747bdb971d9760e9575241ddaa1b776cd8..0000000000000000000000000000000000000000
--- a/node_modules/express/lib/middleware/init.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*!
- * express
- * Copyright(c) 2009-2013 TJ Holowaychuk
- * Copyright(c) 2013 Roman Shtylman
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module dependencies.
- * @private
- */
-
-var setPrototypeOf = require('setprototypeof')
-
-/**
- * Initialization middleware, exposing the
- * request and response to each other, as well
- * as defaulting the X-Powered-By header field.
- *
- * @param {Function} app
- * @return {Function}
- * @api private
- */
-
-exports.init = function(app){
-  return function expressInit(req, res, next){
-    if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express');
-    req.res = res;
-    res.req = req;
-    req.next = next;
-
-    setPrototypeOf(req, app.request)
-    setPrototypeOf(res, app.response)
-
-    res.locals = res.locals || Object.create(null);
-
-    next();
-  };
-};
-
diff --git a/node_modules/express/lib/middleware/query.js b/node_modules/express/lib/middleware/query.js
deleted file mode 100644
index 7e9166947aff3be10f7ffec3771c92581ce211da..0000000000000000000000000000000000000000
--- a/node_modules/express/lib/middleware/query.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*!
- * express
- * Copyright(c) 2009-2013 TJ Holowaychuk
- * Copyright(c) 2013 Roman Shtylman
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module dependencies.
- */
-
-var merge = require('utils-merge')
-var parseUrl = require('parseurl');
-var qs = require('qs');
-
-/**
- * @param {Object} options
- * @return {Function}
- * @api public
- */
-
-module.exports = function query(options) {
-  var opts = merge({}, options)
-  var queryparse = qs.parse;
-
-  if (typeof options === 'function') {
-    queryparse = options;
-    opts = undefined;
-  }
-
-  if (opts !== undefined && opts.allowPrototypes === undefined) {
-    // back-compat for qs module
-    opts.allowPrototypes = true;
-  }
-
-  return function query(req, res, next){
-    if (!req.query) {
-      var val = parseUrl(req).query;
-      req.query = queryparse(val, opts);
-    }
-
-    next();
-  };
-};
diff --git a/node_modules/express/lib/request.js b/node_modules/express/lib/request.js
deleted file mode 100644
index 3f1eeca6c1ac502dfb12ae0144a3a5cced4f34a3..0000000000000000000000000000000000000000
--- a/node_modules/express/lib/request.js
+++ /dev/null
@@ -1,525 +0,0 @@
-/*!
- * express
- * Copyright(c) 2009-2013 TJ Holowaychuk
- * Copyright(c) 2013 Roman Shtylman
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module dependencies.
- * @private
- */
-
-var accepts = require('accepts');
-var deprecate = require('depd')('express');
-var isIP = require('net').isIP;
-var typeis = require('type-is');
-var http = require('http');
-var fresh = require('fresh');
-var parseRange = require('range-parser');
-var parse = require('parseurl');
-var proxyaddr = require('proxy-addr');
-
-/**
- * Request prototype.
- * @public
- */
-
-var req = Object.create(http.IncomingMessage.prototype)
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = req
-
-/**
- * Return request header.
- *
- * The `Referrer` header field is special-cased,
- * both `Referrer` and `Referer` are interchangeable.
- *
- * Examples:
- *
- *     req.get('Content-Type');
- *     // => "text/plain"
- *
- *     req.get('content-type');
- *     // => "text/plain"
- *
- *     req.get('Something');
- *     // => undefined
- *
- * Aliased as `req.header()`.
- *
- * @param {String} name
- * @return {String}
- * @public
- */
-
-req.get =
-req.header = function header(name) {
-  if (!name) {
-    throw new TypeError('name argument is required to req.get');
-  }
-
-  if (typeof name !== 'string') {
-    throw new TypeError('name must be a string to req.get');
-  }
-
-  var lc = name.toLowerCase();
-
-  switch (lc) {
-    case 'referer':
-    case 'referrer':
-      return this.headers.referrer
-        || this.headers.referer;
-    default:
-      return this.headers[lc];
-  }
-};
-
-/**
- * To do: update docs.
- *
- * Check if the given `type(s)` is acceptable, returning
- * the best match when true, otherwise `undefined`, in which
- * case you should respond with 406 "Not Acceptable".
- *
- * The `type` value may be a single MIME type string
- * such as "application/json", an extension name
- * such as "json", a comma-delimited list such as "json, html, text/plain",
- * an argument list such as `"json", "html", "text/plain"`,
- * or an array `["json", "html", "text/plain"]`. When a list
- * or array is given, the _best_ match, if any is returned.
- *
- * Examples:
- *
- *     // Accept: text/html
- *     req.accepts('html');
- *     // => "html"
- *
- *     // Accept: text/*, application/json
- *     req.accepts('html');
- *     // => "html"
- *     req.accepts('text/html');
- *     // => "text/html"
- *     req.accepts('json, text');
- *     // => "json"
- *     req.accepts('application/json');
- *     // => "application/json"
- *
- *     // Accept: text/*, application/json
- *     req.accepts('image/png');
- *     req.accepts('png');
- *     // => undefined
- *
- *     // Accept: text/*;q=.5, application/json
- *     req.accepts(['html', 'json']);
- *     req.accepts('html', 'json');
- *     req.accepts('html, json');
- *     // => "json"
- *
- * @param {String|Array} type(s)
- * @return {String|Array|Boolean}
- * @public
- */
-
-req.accepts = function(){
-  var accept = accepts(this);
-  return accept.types.apply(accept, arguments);
-};
-
-/**
- * Check if the given `encoding`s are accepted.
- *
- * @param {String} ...encoding
- * @return {String|Array}
- * @public
- */
-
-req.acceptsEncodings = function(){
-  var accept = accepts(this);
-  return accept.encodings.apply(accept, arguments);
-};
-
-req.acceptsEncoding = deprecate.function(req.acceptsEncodings,
-  'req.acceptsEncoding: Use acceptsEncodings instead');
-
-/**
- * Check if the given `charset`s are acceptable,
- * otherwise you should respond with 406 "Not Acceptable".
- *
- * @param {String} ...charset
- * @return {String|Array}
- * @public
- */
-
-req.acceptsCharsets = function(){
-  var accept = accepts(this);
-  return accept.charsets.apply(accept, arguments);
-};
-
-req.acceptsCharset = deprecate.function(req.acceptsCharsets,
-  'req.acceptsCharset: Use acceptsCharsets instead');
-
-/**
- * Check if the given `lang`s are acceptable,
- * otherwise you should respond with 406 "Not Acceptable".
- *
- * @param {String} ...lang
- * @return {String|Array}
- * @public
- */
-
-req.acceptsLanguages = function(){
-  var accept = accepts(this);
-  return accept.languages.apply(accept, arguments);
-};
-
-req.acceptsLanguage = deprecate.function(req.acceptsLanguages,
-  'req.acceptsLanguage: Use acceptsLanguages instead');
-
-/**
- * Parse Range header field, capping to the given `size`.
- *
- * Unspecified ranges such as "0-" require knowledge of your resource length. In
- * the case of a byte range this is of course the total number of bytes. If the
- * Range header field is not given `undefined` is returned, `-1` when unsatisfiable,
- * and `-2` when syntactically invalid.
- *
- * When ranges are returned, the array has a "type" property which is the type of
- * range that is required (most commonly, "bytes"). Each array element is an object
- * with a "start" and "end" property for the portion of the range.
- *
- * The "combine" option can be set to `true` and overlapping & adjacent ranges
- * will be combined into a single range.
- *
- * NOTE: remember that ranges are inclusive, so for example "Range: users=0-3"
- * should respond with 4 users when available, not 3.
- *
- * @param {number} size
- * @param {object} [options]
- * @param {boolean} [options.combine=false]
- * @return {number|array}
- * @public
- */
-
-req.range = function range(size, options) {
-  var range = this.get('Range');
-  if (!range) return;
-  return parseRange(size, range, options);
-};
-
-/**
- * Return the value of param `name` when present or `defaultValue`.
- *
- *  - Checks route placeholders, ex: _/user/:id_
- *  - Checks body params, ex: id=12, {"id":12}
- *  - Checks query string params, ex: ?id=12
- *
- * To utilize request bodies, `req.body`
- * should be an object. This can be done by using
- * the `bodyParser()` middleware.
- *
- * @param {String} name
- * @param {Mixed} [defaultValue]
- * @return {String}
- * @public
- */
-
-req.param = function param(name, defaultValue) {
-  var params = this.params || {};
-  var body = this.body || {};
-  var query = this.query || {};
-
-  var args = arguments.length === 1
-    ? 'name'
-    : 'name, default';
-  deprecate('req.param(' + args + '): Use req.params, req.body, or req.query instead');
-
-  if (null != params[name] && params.hasOwnProperty(name)) return params[name];
-  if (null != body[name]) return body[name];
-  if (null != query[name]) return query[name];
-
-  return defaultValue;
-};
-
-/**
- * Check if the incoming request contains the "Content-Type"
- * header field, and it contains the given mime `type`.
- *
- * Examples:
- *
- *      // With Content-Type: text/html; charset=utf-8
- *      req.is('html');
- *      req.is('text/html');
- *      req.is('text/*');
- *      // => true
- *
- *      // When Content-Type is application/json
- *      req.is('json');
- *      req.is('application/json');
- *      req.is('application/*');
- *      // => true
- *
- *      req.is('html');
- *      // => false
- *
- * @param {String|Array} types...
- * @return {String|false|null}
- * @public
- */
-
-req.is = function is(types) {
-  var arr = types;
-
-  // support flattened arguments
-  if (!Array.isArray(types)) {
-    arr = new Array(arguments.length);
-    for (var i = 0; i < arr.length; i++) {
-      arr[i] = arguments[i];
-    }
-  }
-
-  return typeis(this, arr);
-};
-
-/**
- * Return the protocol string "http" or "https"
- * when requested with TLS. When the "trust proxy"
- * setting trusts the socket address, the
- * "X-Forwarded-Proto" header field will be trusted
- * and used if present.
- *
- * If you're running behind a reverse proxy that
- * supplies https for you this may be enabled.
- *
- * @return {String}
- * @public
- */
-
-defineGetter(req, 'protocol', function protocol(){
-  var proto = this.connection.encrypted
-    ? 'https'
-    : 'http';
-  var trust = this.app.get('trust proxy fn');
-
-  if (!trust(this.connection.remoteAddress, 0)) {
-    return proto;
-  }
-
-  // Note: X-Forwarded-Proto is normally only ever a
-  //       single value, but this is to be safe.
-  var header = this.get('X-Forwarded-Proto') || proto
-  var index = header.indexOf(',')
-
-  return index !== -1
-    ? header.substring(0, index).trim()
-    : header.trim()
-});
-
-/**
- * Short-hand for:
- *
- *    req.protocol === 'https'
- *
- * @return {Boolean}
- * @public
- */
-
-defineGetter(req, 'secure', function secure(){
-  return this.protocol === 'https';
-});
-
-/**
- * Return the remote address from the trusted proxy.
- *
- * The is the remote address on the socket unless
- * "trust proxy" is set.
- *
- * @return {String}
- * @public
- */
-
-defineGetter(req, 'ip', function ip(){
-  var trust = this.app.get('trust proxy fn');
-  return proxyaddr(this, trust);
-});
-
-/**
- * When "trust proxy" is set, trusted proxy addresses + client.
- *
- * For example if the value were "client, proxy1, proxy2"
- * you would receive the array `["client", "proxy1", "proxy2"]`
- * where "proxy2" is the furthest down-stream and "proxy1" and
- * "proxy2" were trusted.
- *
- * @return {Array}
- * @public
- */
-
-defineGetter(req, 'ips', function ips() {
-  var trust = this.app.get('trust proxy fn');
-  var addrs = proxyaddr.all(this, trust);
-
-  // reverse the order (to farthest -> closest)
-  // and remove socket address
-  addrs.reverse().pop()
-
-  return addrs
-});
-
-/**
- * Return subdomains as an array.
- *
- * Subdomains are the dot-separated parts of the host before the main domain of
- * the app. By default, the domain of the app is assumed to be the last two
- * parts of the host. This can be changed by setting "subdomain offset".
- *
- * For example, if the domain is "tobi.ferrets.example.com":
- * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`.
- * If "subdomain offset" is 3, req.subdomains is `["tobi"]`.
- *
- * @return {Array}
- * @public
- */
-
-defineGetter(req, 'subdomains', function subdomains() {
-  var hostname = this.hostname;
-
-  if (!hostname) return [];
-
-  var offset = this.app.get('subdomain offset');
-  var subdomains = !isIP(hostname)
-    ? hostname.split('.').reverse()
-    : [hostname];
-
-  return subdomains.slice(offset);
-});
-
-/**
- * Short-hand for `url.parse(req.url).pathname`.
- *
- * @return {String}
- * @public
- */
-
-defineGetter(req, 'path', function path() {
-  return parse(this).pathname;
-});
-
-/**
- * Parse the "Host" header field to a hostname.
- *
- * When the "trust proxy" setting trusts the socket
- * address, the "X-Forwarded-Host" header field will
- * be trusted.
- *
- * @return {String}
- * @public
- */
-
-defineGetter(req, 'hostname', function hostname(){
-  var trust = this.app.get('trust proxy fn');
-  var host = this.get('X-Forwarded-Host');
-
-  if (!host || !trust(this.connection.remoteAddress, 0)) {
-    host = this.get('Host');
-  } else if (host.indexOf(',') !== -1) {
-    // Note: X-Forwarded-Host is normally only ever a
-    //       single value, but this is to be safe.
-    host = host.substring(0, host.indexOf(',')).trimRight()
-  }
-
-  if (!host) return;
-
-  // IPv6 literal support
-  var offset = host[0] === '['
-    ? host.indexOf(']') + 1
-    : 0;
-  var index = host.indexOf(':', offset);
-
-  return index !== -1
-    ? host.substring(0, index)
-    : host;
-});
-
-// TODO: change req.host to return host in next major
-
-defineGetter(req, 'host', deprecate.function(function host(){
-  return this.hostname;
-}, 'req.host: Use req.hostname instead'));
-
-/**
- * Check if the request is fresh, aka
- * Last-Modified and/or the ETag
- * still match.
- *
- * @return {Boolean}
- * @public
- */
-
-defineGetter(req, 'fresh', function(){
-  var method = this.method;
-  var res = this.res
-  var status = res.statusCode
-
-  // GET or HEAD for weak freshness validation only
-  if ('GET' !== method && 'HEAD' !== method) return false;
-
-  // 2xx or 304 as per rfc2616 14.26
-  if ((status >= 200 && status < 300) || 304 === status) {
-    return fresh(this.headers, {
-      'etag': res.get('ETag'),
-      'last-modified': res.get('Last-Modified')
-    })
-  }
-
-  return false;
-});
-
-/**
- * Check if the request is stale, aka
- * "Last-Modified" and / or the "ETag" for the
- * resource has changed.
- *
- * @return {Boolean}
- * @public
- */
-
-defineGetter(req, 'stale', function stale(){
-  return !this.fresh;
-});
-
-/**
- * Check if the request was an _XMLHttpRequest_.
- *
- * @return {Boolean}
- * @public
- */
-
-defineGetter(req, 'xhr', function xhr(){
-  var val = this.get('X-Requested-With') || '';
-  return val.toLowerCase() === 'xmlhttprequest';
-});
-
-/**
- * Helper function for creating a getter on an object.
- *
- * @param {Object} obj
- * @param {String} name
- * @param {Function} getter
- * @private
- */
-function defineGetter(obj, name, getter) {
-  Object.defineProperty(obj, name, {
-    configurable: true,
-    enumerable: true,
-    get: getter
-  });
-}
diff --git a/node_modules/express/lib/response.js b/node_modules/express/lib/response.js
deleted file mode 100644
index 2b654f4c6629c821bbeaaeee970b199a420fd8b3..0000000000000000000000000000000000000000
--- a/node_modules/express/lib/response.js
+++ /dev/null
@@ -1,1179 +0,0 @@
-/*!
- * express
- * Copyright(c) 2009-2013 TJ Holowaychuk
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module dependencies.
- * @private
- */
-
-var Buffer = require('safe-buffer').Buffer
-var contentDisposition = require('content-disposition');
-var createError = require('http-errors')
-var deprecate = require('depd')('express');
-var encodeUrl = require('encodeurl');
-var escapeHtml = require('escape-html');
-var http = require('http');
-var isAbsolute = require('./utils').isAbsolute;
-var onFinished = require('on-finished');
-var path = require('path');
-var statuses = require('statuses')
-var merge = require('utils-merge');
-var sign = require('cookie-signature').sign;
-var normalizeType = require('./utils').normalizeType;
-var normalizeTypes = require('./utils').normalizeTypes;
-var setCharset = require('./utils').setCharset;
-var cookie = require('cookie');
-var send = require('send');
-var extname = path.extname;
-var mime = send.mime;
-var resolve = path.resolve;
-var vary = require('vary');
-
-/**
- * Response prototype.
- * @public
- */
-
-var res = Object.create(http.ServerResponse.prototype)
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = res
-
-/**
- * Module variables.
- * @private
- */
-
-var charsetRegExp = /;\s*charset\s*=/;
-
-/**
- * Set status `code`.
- *
- * @param {Number} code
- * @return {ServerResponse}
- * @public
- */
-
-res.status = function status(code) {
-  if ((typeof code === 'string' || Math.floor(code) !== code) && code > 99 && code < 1000) {
-    deprecate('res.status(' + JSON.stringify(code) + '): use res.status(' + Math.floor(code) + ') instead')
-  }
-  this.statusCode = code;
-  return this;
-};
-
-/**
- * Set Link header field with the given `links`.
- *
- * Examples:
- *
- *    res.links({
- *      next: 'http://api.example.com/users?page=2',
- *      last: 'http://api.example.com/users?page=5'
- *    });
- *
- * @param {Object} links
- * @return {ServerResponse}
- * @public
- */
-
-res.links = function(links){
-  var link = this.get('Link') || '';
-  if (link) link += ', ';
-  return this.set('Link', link + Object.keys(links).map(function(rel){
-    return '<' + links[rel] + '>; rel="' + rel + '"';
-  }).join(', '));
-};
-
-/**
- * Send a response.
- *
- * Examples:
- *
- *     res.send(Buffer.from('wahoo'));
- *     res.send({ some: 'json' });
- *     res.send('<p>some html</p>');
- *
- * @param {string|number|boolean|object|Buffer} body
- * @public
- */
-
-res.send = function send(body) {
-  var chunk = body;
-  var encoding;
-  var req = this.req;
-  var type;
-
-  // settings
-  var app = this.app;
-
-  // allow status / body
-  if (arguments.length === 2) {
-    // res.send(body, status) backwards compat
-    if (typeof arguments[0] !== 'number' && typeof arguments[1] === 'number') {
-      deprecate('res.send(body, status): Use res.status(status).send(body) instead');
-      this.statusCode = arguments[1];
-    } else {
-      deprecate('res.send(status, body): Use res.status(status).send(body) instead');
-      this.statusCode = arguments[0];
-      chunk = arguments[1];
-    }
-  }
-
-  // disambiguate res.send(status) and res.send(status, num)
-  if (typeof chunk === 'number' && arguments.length === 1) {
-    // res.send(status) will set status message as text string
-    if (!this.get('Content-Type')) {
-      this.type('txt');
-    }
-
-    deprecate('res.send(status): Use res.sendStatus(status) instead');
-    this.statusCode = chunk;
-    chunk = statuses.message[chunk]
-  }
-
-  switch (typeof chunk) {
-    // string defaulting to html
-    case 'string':
-      if (!this.get('Content-Type')) {
-        this.type('html');
-      }
-      break;
-    case 'boolean':
-    case 'number':
-    case 'object':
-      if (chunk === null) {
-        chunk = '';
-      } else if (Buffer.isBuffer(chunk)) {
-        if (!this.get('Content-Type')) {
-          this.type('bin');
-        }
-      } else {
-        return this.json(chunk);
-      }
-      break;
-  }
-
-  // write strings in utf-8
-  if (typeof chunk === 'string') {
-    encoding = 'utf8';
-    type = this.get('Content-Type');
-
-    // reflect this in content-type
-    if (typeof type === 'string') {
-      this.set('Content-Type', setCharset(type, 'utf-8'));
-    }
-  }
-
-  // determine if ETag should be generated
-  var etagFn = app.get('etag fn')
-  var generateETag = !this.get('ETag') && typeof etagFn === 'function'
-
-  // populate Content-Length
-  var len
-  if (chunk !== undefined) {
-    if (Buffer.isBuffer(chunk)) {
-      // get length of Buffer
-      len = chunk.length
-    } else if (!generateETag && chunk.length < 1000) {
-      // just calculate length when no ETag + small chunk
-      len = Buffer.byteLength(chunk, encoding)
-    } else {
-      // convert chunk to Buffer and calculate
-      chunk = Buffer.from(chunk, encoding)
-      encoding = undefined;
-      len = chunk.length
-    }
-
-    this.set('Content-Length', len);
-  }
-
-  // populate ETag
-  var etag;
-  if (generateETag && len !== undefined) {
-    if ((etag = etagFn(chunk, encoding))) {
-      this.set('ETag', etag);
-    }
-  }
-
-  // freshness
-  if (req.fresh) this.statusCode = 304;
-
-  // strip irrelevant headers
-  if (204 === this.statusCode || 304 === this.statusCode) {
-    this.removeHeader('Content-Type');
-    this.removeHeader('Content-Length');
-    this.removeHeader('Transfer-Encoding');
-    chunk = '';
-  }
-
-  // alter headers for 205
-  if (this.statusCode === 205) {
-    this.set('Content-Length', '0')
-    this.removeHeader('Transfer-Encoding')
-    chunk = ''
-  }
-
-  if (req.method === 'HEAD') {
-    // skip body for HEAD
-    this.end();
-  } else {
-    // respond
-    this.end(chunk, encoding);
-  }
-
-  return this;
-};
-
-/**
- * Send JSON response.
- *
- * Examples:
- *
- *     res.json(null);
- *     res.json({ user: 'tj' });
- *
- * @param {string|number|boolean|object} obj
- * @public
- */
-
-res.json = function json(obj) {
-  var val = obj;
-
-  // allow status / body
-  if (arguments.length === 2) {
-    // res.json(body, status) backwards compat
-    if (typeof arguments[1] === 'number') {
-      deprecate('res.json(obj, status): Use res.status(status).json(obj) instead');
-      this.statusCode = arguments[1];
-    } else {
-      deprecate('res.json(status, obj): Use res.status(status).json(obj) instead');
-      this.statusCode = arguments[0];
-      val = arguments[1];
-    }
-  }
-
-  // settings
-  var app = this.app;
-  var escape = app.get('json escape')
-  var replacer = app.get('json replacer');
-  var spaces = app.get('json spaces');
-  var body = stringify(val, replacer, spaces, escape)
-
-  // content-type
-  if (!this.get('Content-Type')) {
-    this.set('Content-Type', 'application/json');
-  }
-
-  return this.send(body);
-};
-
-/**
- * Send JSON response with JSONP callback support.
- *
- * Examples:
- *
- *     res.jsonp(null);
- *     res.jsonp({ user: 'tj' });
- *
- * @param {string|number|boolean|object} obj
- * @public
- */
-
-res.jsonp = function jsonp(obj) {
-  var val = obj;
-
-  // allow status / body
-  if (arguments.length === 2) {
-    // res.jsonp(body, status) backwards compat
-    if (typeof arguments[1] === 'number') {
-      deprecate('res.jsonp(obj, status): Use res.status(status).jsonp(obj) instead');
-      this.statusCode = arguments[1];
-    } else {
-      deprecate('res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead');
-      this.statusCode = arguments[0];
-      val = arguments[1];
-    }
-  }
-
-  // settings
-  var app = this.app;
-  var escape = app.get('json escape')
-  var replacer = app.get('json replacer');
-  var spaces = app.get('json spaces');
-  var body = stringify(val, replacer, spaces, escape)
-  var callback = this.req.query[app.get('jsonp callback name')];
-
-  // content-type
-  if (!this.get('Content-Type')) {
-    this.set('X-Content-Type-Options', 'nosniff');
-    this.set('Content-Type', 'application/json');
-  }
-
-  // fixup callback
-  if (Array.isArray(callback)) {
-    callback = callback[0];
-  }
-
-  // jsonp
-  if (typeof callback === 'string' && callback.length !== 0) {
-    this.set('X-Content-Type-Options', 'nosniff');
-    this.set('Content-Type', 'text/javascript');
-
-    // restrict callback charset
-    callback = callback.replace(/[^\[\]\w$.]/g, '');
-
-    if (body === undefined) {
-      // empty argument
-      body = ''
-    } else if (typeof body === 'string') {
-      // replace chars not allowed in JavaScript that are in JSON
-      body = body
-        .replace(/\u2028/g, '\\u2028')
-        .replace(/\u2029/g, '\\u2029')
-    }
-
-    // the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse"
-    // the typeof check is just to reduce client error noise
-    body = '/**/ typeof ' + callback + ' === \'function\' && ' + callback + '(' + body + ');';
-  }
-
-  return this.send(body);
-};
-
-/**
- * Send given HTTP status code.
- *
- * Sets the response status to `statusCode` and the body of the
- * response to the standard description from node's http.STATUS_CODES
- * or the statusCode number if no description.
- *
- * Examples:
- *
- *     res.sendStatus(200);
- *
- * @param {number} statusCode
- * @public
- */
-
-res.sendStatus = function sendStatus(statusCode) {
-  var body = statuses.message[statusCode] || String(statusCode)
-
-  this.statusCode = statusCode;
-  this.type('txt');
-
-  return this.send(body);
-};
-
-/**
- * Transfer the file at the given `path`.
- *
- * Automatically sets the _Content-Type_ response header field.
- * The callback `callback(err)` is invoked when the transfer is complete
- * or when an error occurs. Be sure to check `res.headersSent`
- * if you wish to attempt responding, as the header and some data
- * may have already been transferred.
- *
- * Options:
- *
- *   - `maxAge`   defaulting to 0 (can be string converted by `ms`)
- *   - `root`     root directory for relative filenames
- *   - `headers`  object of headers to serve with file
- *   - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them
- *
- * Other options are passed along to `send`.
- *
- * Examples:
- *
- *  The following example illustrates how `res.sendFile()` may
- *  be used as an alternative for the `static()` middleware for
- *  dynamic situations. The code backing `res.sendFile()` is actually
- *  the same code, so HTTP cache support etc is identical.
- *
- *     app.get('/user/:uid/photos/:file', function(req, res){
- *       var uid = req.params.uid
- *         , file = req.params.file;
- *
- *       req.user.mayViewFilesFrom(uid, function(yes){
- *         if (yes) {
- *           res.sendFile('/uploads/' + uid + '/' + file);
- *         } else {
- *           res.send(403, 'Sorry! you cant see that.');
- *         }
- *       });
- *     });
- *
- * @public
- */
-
-res.sendFile = function sendFile(path, options, callback) {
-  var done = callback;
-  var req = this.req;
-  var res = this;
-  var next = req.next;
-  var opts = options || {};
-
-  if (!path) {
-    throw new TypeError('path argument is required to res.sendFile');
-  }
-
-  if (typeof path !== 'string') {
-    throw new TypeError('path must be a string to res.sendFile')
-  }
-
-  // support function as second arg
-  if (typeof options === 'function') {
-    done = options;
-    opts = {};
-  }
-
-  if (!opts.root && !isAbsolute(path)) {
-    throw new TypeError('path must be absolute or specify root to res.sendFile');
-  }
-
-  // create file stream
-  var pathname = encodeURI(path);
-  var file = send(req, pathname, opts);
-
-  // transfer
-  sendfile(res, file, opts, function (err) {
-    if (done) return done(err);
-    if (err && err.code === 'EISDIR') return next();
-
-    // next() all but write errors
-    if (err && err.code !== 'ECONNABORTED' && err.syscall !== 'write') {
-      next(err);
-    }
-  });
-};
-
-/**
- * Transfer the file at the given `path`.
- *
- * Automatically sets the _Content-Type_ response header field.
- * The callback `callback(err)` is invoked when the transfer is complete
- * or when an error occurs. Be sure to check `res.headersSent`
- * if you wish to attempt responding, as the header and some data
- * may have already been transferred.
- *
- * Options:
- *
- *   - `maxAge`   defaulting to 0 (can be string converted by `ms`)
- *   - `root`     root directory for relative filenames
- *   - `headers`  object of headers to serve with file
- *   - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them
- *
- * Other options are passed along to `send`.
- *
- * Examples:
- *
- *  The following example illustrates how `res.sendfile()` may
- *  be used as an alternative for the `static()` middleware for
- *  dynamic situations. The code backing `res.sendfile()` is actually
- *  the same code, so HTTP cache support etc is identical.
- *
- *     app.get('/user/:uid/photos/:file', function(req, res){
- *       var uid = req.params.uid
- *         , file = req.params.file;
- *
- *       req.user.mayViewFilesFrom(uid, function(yes){
- *         if (yes) {
- *           res.sendfile('/uploads/' + uid + '/' + file);
- *         } else {
- *           res.send(403, 'Sorry! you cant see that.');
- *         }
- *       });
- *     });
- *
- * @public
- */
-
-res.sendfile = function (path, options, callback) {
-  var done = callback;
-  var req = this.req;
-  var res = this;
-  var next = req.next;
-  var opts = options || {};
-
-  // support function as second arg
-  if (typeof options === 'function') {
-    done = options;
-    opts = {};
-  }
-
-  // create file stream
-  var file = send(req, path, opts);
-
-  // transfer
-  sendfile(res, file, opts, function (err) {
-    if (done) return done(err);
-    if (err && err.code === 'EISDIR') return next();
-
-    // next() all but write errors
-    if (err && err.code !== 'ECONNABORTED' && err.syscall !== 'write') {
-      next(err);
-    }
-  });
-};
-
-res.sendfile = deprecate.function(res.sendfile,
-  'res.sendfile: Use res.sendFile instead');
-
-/**
- * Transfer the file at the given `path` as an attachment.
- *
- * Optionally providing an alternate attachment `filename`,
- * and optional callback `callback(err)`. The callback is invoked
- * when the data transfer is complete, or when an error has
- * occurred. Be sure to check `res.headersSent` if you plan to respond.
- *
- * Optionally providing an `options` object to use with `res.sendFile()`.
- * This function will set the `Content-Disposition` header, overriding
- * any `Content-Disposition` header passed as header options in order
- * to set the attachment and filename.
- *
- * This method uses `res.sendFile()`.
- *
- * @public
- */
-
-res.download = function download (path, filename, options, callback) {
-  var done = callback;
-  var name = filename;
-  var opts = options || null
-
-  // support function as second or third arg
-  if (typeof filename === 'function') {
-    done = filename;
-    name = null;
-    opts = null
-  } else if (typeof options === 'function') {
-    done = options
-    opts = null
-  }
-
-  // support optional filename, where options may be in it's place
-  if (typeof filename === 'object' &&
-    (typeof options === 'function' || options === undefined)) {
-    name = null
-    opts = filename
-  }
-
-  // set Content-Disposition when file is sent
-  var headers = {
-    'Content-Disposition': contentDisposition(name || path)
-  };
-
-  // merge user-provided headers
-  if (opts && opts.headers) {
-    var keys = Object.keys(opts.headers)
-    for (var i = 0; i < keys.length; i++) {
-      var key = keys[i]
-      if (key.toLowerCase() !== 'content-disposition') {
-        headers[key] = opts.headers[key]
-      }
-    }
-  }
-
-  // merge user-provided options
-  opts = Object.create(opts)
-  opts.headers = headers
-
-  // Resolve the full path for sendFile
-  var fullPath = !opts.root
-    ? resolve(path)
-    : path
-
-  // send file
-  return this.sendFile(fullPath, opts, done)
-};
-
-/**
- * Set _Content-Type_ response header with `type` through `mime.lookup()`
- * when it does not contain "/", or set the Content-Type to `type` otherwise.
- *
- * Examples:
- *
- *     res.type('.html');
- *     res.type('html');
- *     res.type('json');
- *     res.type('application/json');
- *     res.type('png');
- *
- * @param {String} type
- * @return {ServerResponse} for chaining
- * @public
- */
-
-res.contentType =
-res.type = function contentType(type) {
-  var ct = type.indexOf('/') === -1
-    ? mime.lookup(type)
-    : type;
-
-  return this.set('Content-Type', ct);
-};
-
-/**
- * Respond to the Acceptable formats using an `obj`
- * of mime-type callbacks.
- *
- * This method uses `req.accepted`, an array of
- * acceptable types ordered by their quality values.
- * When "Accept" is not present the _first_ callback
- * is invoked, otherwise the first match is used. When
- * no match is performed the server responds with
- * 406 "Not Acceptable".
- *
- * Content-Type is set for you, however if you choose
- * you may alter this within the callback using `res.type()`
- * or `res.set('Content-Type', ...)`.
- *
- *    res.format({
- *      'text/plain': function(){
- *        res.send('hey');
- *      },
- *
- *      'text/html': function(){
- *        res.send('<p>hey</p>');
- *      },
- *
- *      'application/json': function () {
- *        res.send({ message: 'hey' });
- *      }
- *    });
- *
- * In addition to canonicalized MIME types you may
- * also use extnames mapped to these types:
- *
- *    res.format({
- *      text: function(){
- *        res.send('hey');
- *      },
- *
- *      html: function(){
- *        res.send('<p>hey</p>');
- *      },
- *
- *      json: function(){
- *        res.send({ message: 'hey' });
- *      }
- *    });
- *
- * By default Express passes an `Error`
- * with a `.status` of 406 to `next(err)`
- * if a match is not made. If you provide
- * a `.default` callback it will be invoked
- * instead.
- *
- * @param {Object} obj
- * @return {ServerResponse} for chaining
- * @public
- */
-
-res.format = function(obj){
-  var req = this.req;
-  var next = req.next;
-
-  var keys = Object.keys(obj)
-    .filter(function (v) { return v !== 'default' })
-
-  var key = keys.length > 0
-    ? req.accepts(keys)
-    : false;
-
-  this.vary("Accept");
-
-  if (key) {
-    this.set('Content-Type', normalizeType(key).value);
-    obj[key](req, this, next);
-  } else if (obj.default) {
-    obj.default(req, this, next)
-  } else {
-    next(createError(406, {
-      types: normalizeTypes(keys).map(function (o) { return o.value })
-    }))
-  }
-
-  return this;
-};
-
-/**
- * Set _Content-Disposition_ header to _attachment_ with optional `filename`.
- *
- * @param {String} filename
- * @return {ServerResponse}
- * @public
- */
-
-res.attachment = function attachment(filename) {
-  if (filename) {
-    this.type(extname(filename));
-  }
-
-  this.set('Content-Disposition', contentDisposition(filename));
-
-  return this;
-};
-
-/**
- * Append additional header `field` with value `val`.
- *
- * Example:
- *
- *    res.append('Link', ['<http://localhost/>', '<http://localhost:3000/>']);
- *    res.append('Set-Cookie', 'foo=bar; Path=/; HttpOnly');
- *    res.append('Warning', '199 Miscellaneous warning');
- *
- * @param {String} field
- * @param {String|Array} val
- * @return {ServerResponse} for chaining
- * @public
- */
-
-res.append = function append(field, val) {
-  var prev = this.get(field);
-  var value = val;
-
-  if (prev) {
-    // concat the new and prev vals
-    value = Array.isArray(prev) ? prev.concat(val)
-      : Array.isArray(val) ? [prev].concat(val)
-        : [prev, val]
-  }
-
-  return this.set(field, value);
-};
-
-/**
- * Set header `field` to `val`, or pass
- * an object of header fields.
- *
- * Examples:
- *
- *    res.set('Foo', ['bar', 'baz']);
- *    res.set('Accept', 'application/json');
- *    res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' });
- *
- * Aliased as `res.header()`.
- *
- * @param {String|Object} field
- * @param {String|Array} val
- * @return {ServerResponse} for chaining
- * @public
- */
-
-res.set =
-res.header = function header(field, val) {
-  if (arguments.length === 2) {
-    var value = Array.isArray(val)
-      ? val.map(String)
-      : String(val);
-
-    // add charset to content-type
-    if (field.toLowerCase() === 'content-type') {
-      if (Array.isArray(value)) {
-        throw new TypeError('Content-Type cannot be set to an Array');
-      }
-      if (!charsetRegExp.test(value)) {
-        var charset = mime.charsets.lookup(value.split(';')[0]);
-        if (charset) value += '; charset=' + charset.toLowerCase();
-      }
-    }
-
-    this.setHeader(field, value);
-  } else {
-    for (var key in field) {
-      this.set(key, field[key]);
-    }
-  }
-  return this;
-};
-
-/**
- * Get value for header `field`.
- *
- * @param {String} field
- * @return {String}
- * @public
- */
-
-res.get = function(field){
-  return this.getHeader(field);
-};
-
-/**
- * Clear cookie `name`.
- *
- * @param {String} name
- * @param {Object} [options]
- * @return {ServerResponse} for chaining
- * @public
- */
-
-res.clearCookie = function clearCookie(name, options) {
-  if (options) {
-    if (options.maxAge) {
-      deprecate('res.clearCookie: Passing "options.maxAge" is deprecated. In v5.0.0 of Express, this option will be ignored, as res.clearCookie will automatically set cookies to expire immediately. Please update your code to omit this option.');
-    }
-    if (options.expires) {
-      deprecate('res.clearCookie: Passing "options.expires" is deprecated. In v5.0.0 of Express, this option will be ignored, as res.clearCookie will automatically set cookies to expire immediately. Please update your code to omit this option.');
-    }
-  }
-  var opts = merge({ expires: new Date(1), path: '/' }, options);
-
-  return this.cookie(name, '', opts);
-};
-
-/**
- * Set cookie `name` to `value`, with the given `options`.
- *
- * Options:
- *
- *    - `maxAge`   max-age in milliseconds, converted to `expires`
- *    - `signed`   sign the cookie
- *    - `path`     defaults to "/"
- *
- * Examples:
- *
- *    // "Remember Me" for 15 minutes
- *    res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true });
- *
- *    // same as above
- *    res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true })
- *
- * @param {String} name
- * @param {String|Object} value
- * @param {Object} [options]
- * @return {ServerResponse} for chaining
- * @public
- */
-
-res.cookie = function (name, value, options) {
-  var opts = merge({}, options);
-  var secret = this.req.secret;
-  var signed = opts.signed;
-
-  if (signed && !secret) {
-    throw new Error('cookieParser("secret") required for signed cookies');
-  }
-
-  var val = typeof value === 'object'
-    ? 'j:' + JSON.stringify(value)
-    : String(value);
-
-  if (signed) {
-    val = 's:' + sign(val, secret);
-  }
-
-  if (opts.maxAge != null) {
-    var maxAge = opts.maxAge - 0
-
-    if (!isNaN(maxAge)) {
-      opts.expires = new Date(Date.now() + maxAge)
-      opts.maxAge = Math.floor(maxAge / 1000)
-    }
-  }
-
-  if (opts.path == null) {
-    opts.path = '/';
-  }
-
-  this.append('Set-Cookie', cookie.serialize(name, String(val), opts));
-
-  return this;
-};
-
-/**
- * Set the location header to `url`.
- *
- * The given `url` can also be "back", which redirects
- * to the _Referrer_ or _Referer_ headers or "/".
- *
- * Examples:
- *
- *    res.location('/foo/bar').;
- *    res.location('http://example.com');
- *    res.location('../login');
- *
- * @param {String} url
- * @return {ServerResponse} for chaining
- * @public
- */
-
-res.location = function location(url) {
-  var loc;
-
-  // "back" is an alias for the referrer
-  if (url === 'back') {
-    deprecate('res.location("back"): use res.location(req.get("Referrer") || "/") and refer to https://dub.sh/security-redirect for best practices');
-    loc = this.req.get('Referrer') || '/';
-  } else {
-    loc = String(url);
-  }
-
-  return this.set('Location', encodeUrl(loc));
-};
-
-/**
- * Redirect to the given `url` with optional response `status`
- * defaulting to 302.
- *
- * The resulting `url` is determined by `res.location()`, so
- * it will play nicely with mounted apps, relative paths,
- * `"back"` etc.
- *
- * Examples:
- *
- *    res.redirect('/foo/bar');
- *    res.redirect('http://example.com');
- *    res.redirect(301, 'http://example.com');
- *    res.redirect('../login'); // /blog/post/1 -> /blog/login
- *
- * @public
- */
-
-res.redirect = function redirect(url) {
-  var address = url;
-  var body;
-  var status = 302;
-
-  // allow status / url
-  if (arguments.length === 2) {
-    if (typeof arguments[0] === 'number') {
-      status = arguments[0];
-      address = arguments[1];
-    } else {
-      deprecate('res.redirect(url, status): Use res.redirect(status, url) instead');
-      status = arguments[1];
-    }
-  }
-
-  // Set location header
-  address = this.location(address).get('Location');
-
-  // Support text/{plain,html} by default
-  this.format({
-    text: function(){
-      body = statuses.message[status] + '. Redirecting to ' + address
-    },
-
-    html: function(){
-      var u = escapeHtml(address);
-      body = '<p>' + statuses.message[status] + '. Redirecting to ' + u + '</p>'
-    },
-
-    default: function(){
-      body = '';
-    }
-  });
-
-  // Respond
-  this.statusCode = status;
-  this.set('Content-Length', Buffer.byteLength(body));
-
-  if (this.req.method === 'HEAD') {
-    this.end();
-  } else {
-    this.end(body);
-  }
-};
-
-/**
- * Add `field` to Vary. If already present in the Vary set, then
- * this call is simply ignored.
- *
- * @param {Array|String} field
- * @return {ServerResponse} for chaining
- * @public
- */
-
-res.vary = function(field){
-  // checks for back-compat
-  if (!field || (Array.isArray(field) && !field.length)) {
-    deprecate('res.vary(): Provide a field name');
-    return this;
-  }
-
-  vary(this, field);
-
-  return this;
-};
-
-/**
- * Render `view` with the given `options` and optional callback `fn`.
- * When a callback function is given a response will _not_ be made
- * automatically, otherwise a response of _200_ and _text/html_ is given.
- *
- * Options:
- *
- *  - `cache`     boolean hinting to the engine it should cache
- *  - `filename`  filename of the view being rendered
- *
- * @public
- */
-
-res.render = function render(view, options, callback) {
-  var app = this.req.app;
-  var done = callback;
-  var opts = options || {};
-  var req = this.req;
-  var self = this;
-
-  // support callback function as second arg
-  if (typeof options === 'function') {
-    done = options;
-    opts = {};
-  }
-
-  // merge res.locals
-  opts._locals = self.locals;
-
-  // default callback to respond
-  done = done || function (err, str) {
-    if (err) return req.next(err);
-    self.send(str);
-  };
-
-  // render
-  app.render(view, opts, done);
-};
-
-// pipe the send file stream
-function sendfile(res, file, options, callback) {
-  var done = false;
-  var streaming;
-
-  // request aborted
-  function onaborted() {
-    if (done) return;
-    done = true;
-
-    var err = new Error('Request aborted');
-    err.code = 'ECONNABORTED';
-    callback(err);
-  }
-
-  // directory
-  function ondirectory() {
-    if (done) return;
-    done = true;
-
-    var err = new Error('EISDIR, read');
-    err.code = 'EISDIR';
-    callback(err);
-  }
-
-  // errors
-  function onerror(err) {
-    if (done) return;
-    done = true;
-    callback(err);
-  }
-
-  // ended
-  function onend() {
-    if (done) return;
-    done = true;
-    callback();
-  }
-
-  // file
-  function onfile() {
-    streaming = false;
-  }
-
-  // finished
-  function onfinish(err) {
-    if (err && err.code === 'ECONNRESET') return onaborted();
-    if (err) return onerror(err);
-    if (done) return;
-
-    setImmediate(function () {
-      if (streaming !== false && !done) {
-        onaborted();
-        return;
-      }
-
-      if (done) return;
-      done = true;
-      callback();
-    });
-  }
-
-  // streaming
-  function onstream() {
-    streaming = true;
-  }
-
-  file.on('directory', ondirectory);
-  file.on('end', onend);
-  file.on('error', onerror);
-  file.on('file', onfile);
-  file.on('stream', onstream);
-  onFinished(res, onfinish);
-
-  if (options.headers) {
-    // set headers on successful transfer
-    file.on('headers', function headers(res) {
-      var obj = options.headers;
-      var keys = Object.keys(obj);
-
-      for (var i = 0; i < keys.length; i++) {
-        var k = keys[i];
-        res.setHeader(k, obj[k]);
-      }
-    });
-  }
-
-  // pipe
-  file.pipe(res);
-}
-
-/**
- * Stringify JSON, like JSON.stringify, but v8 optimized, with the
- * ability to escape characters that can trigger HTML sniffing.
- *
- * @param {*} value
- * @param {function} replacer
- * @param {number} spaces
- * @param {boolean} escape
- * @returns {string}
- * @private
- */
-
-function stringify (value, replacer, spaces, escape) {
-  // v8 checks arguments.length for optimizing simple call
-  // https://bugs.chromium.org/p/v8/issues/detail?id=4730
-  var json = replacer || spaces
-    ? JSON.stringify(value, replacer, spaces)
-    : JSON.stringify(value);
-
-  if (escape && typeof json === 'string') {
-    json = json.replace(/[<>&]/g, function (c) {
-      switch (c.charCodeAt(0)) {
-        case 0x3c:
-          return '\\u003c'
-        case 0x3e:
-          return '\\u003e'
-        case 0x26:
-          return '\\u0026'
-        /* istanbul ignore next: unreachable default */
-        default:
-          return c
-      }
-    })
-  }
-
-  return json
-}
diff --git a/node_modules/express/lib/router/index.js b/node_modules/express/lib/router/index.js
deleted file mode 100644
index abb3a6f589e834c5e105f2a96907ed2eb6fc0185..0000000000000000000000000000000000000000
--- a/node_modules/express/lib/router/index.js
+++ /dev/null
@@ -1,673 +0,0 @@
-/*!
- * express
- * Copyright(c) 2009-2013 TJ Holowaychuk
- * Copyright(c) 2013 Roman Shtylman
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module dependencies.
- * @private
- */
-
-var Route = require('./route');
-var Layer = require('./layer');
-var methods = require('methods');
-var mixin = require('utils-merge');
-var debug = require('debug')('express:router');
-var deprecate = require('depd')('express');
-var flatten = require('array-flatten');
-var parseUrl = require('parseurl');
-var setPrototypeOf = require('setprototypeof')
-
-/**
- * Module variables.
- * @private
- */
-
-var objectRegExp = /^\[object (\S+)\]$/;
-var slice = Array.prototype.slice;
-var toString = Object.prototype.toString;
-
-/**
- * Initialize a new `Router` with the given `options`.
- *
- * @param {Object} [options]
- * @return {Router} which is a callable function
- * @public
- */
-
-var proto = module.exports = function(options) {
-  var opts = options || {};
-
-  function router(req, res, next) {
-    router.handle(req, res, next);
-  }
-
-  // mixin Router class functions
-  setPrototypeOf(router, proto)
-
-  router.params = {};
-  router._params = [];
-  router.caseSensitive = opts.caseSensitive;
-  router.mergeParams = opts.mergeParams;
-  router.strict = opts.strict;
-  router.stack = [];
-
-  return router;
-};
-
-/**
- * Map the given param placeholder `name`(s) to the given callback.
- *
- * Parameter mapping is used to provide pre-conditions to routes
- * which use normalized placeholders. For example a _:user_id_ parameter
- * could automatically load a user's information from the database without
- * any additional code,
- *
- * The callback uses the same signature as middleware, the only difference
- * being that the value of the placeholder is passed, in this case the _id_
- * of the user. Once the `next()` function is invoked, just like middleware
- * it will continue on to execute the route, or subsequent parameter functions.
- *
- * Just like in middleware, you must either respond to the request or call next
- * to avoid stalling the request.
- *
- *  app.param('user_id', function(req, res, next, id){
- *    User.find(id, function(err, user){
- *      if (err) {
- *        return next(err);
- *      } else if (!user) {
- *        return next(new Error('failed to load user'));
- *      }
- *      req.user = user;
- *      next();
- *    });
- *  });
- *
- * @param {String} name
- * @param {Function} fn
- * @return {app} for chaining
- * @public
- */
-
-proto.param = function param(name, fn) {
-  // param logic
-  if (typeof name === 'function') {
-    deprecate('router.param(fn): Refactor to use path params');
-    this._params.push(name);
-    return;
-  }
-
-  // apply param functions
-  var params = this._params;
-  var len = params.length;
-  var ret;
-
-  if (name[0] === ':') {
-    deprecate('router.param(' + JSON.stringify(name) + ', fn): Use router.param(' + JSON.stringify(name.slice(1)) + ', fn) instead')
-    name = name.slice(1)
-  }
-
-  for (var i = 0; i < len; ++i) {
-    if (ret = params[i](name, fn)) {
-      fn = ret;
-    }
-  }
-
-  // ensure we end up with a
-  // middleware function
-  if ('function' !== typeof fn) {
-    throw new Error('invalid param() call for ' + name + ', got ' + fn);
-  }
-
-  (this.params[name] = this.params[name] || []).push(fn);
-  return this;
-};
-
-/**
- * Dispatch a req, res into the router.
- * @private
- */
-
-proto.handle = function handle(req, res, out) {
-  var self = this;
-
-  debug('dispatching %s %s', req.method, req.url);
-
-  var idx = 0;
-  var protohost = getProtohost(req.url) || ''
-  var removed = '';
-  var slashAdded = false;
-  var sync = 0
-  var paramcalled = {};
-
-  // store options for OPTIONS request
-  // only used if OPTIONS request
-  var options = [];
-
-  // middleware and routes
-  var stack = self.stack;
-
-  // manage inter-router variables
-  var parentParams = req.params;
-  var parentUrl = req.baseUrl || '';
-  var done = restore(out, req, 'baseUrl', 'next', 'params');
-
-  // setup next layer
-  req.next = next;
-
-  // for options requests, respond with a default if nothing else responds
-  if (req.method === 'OPTIONS') {
-    done = wrap(done, function(old, err) {
-      if (err || options.length === 0) return old(err);
-      sendOptionsResponse(res, options, old);
-    });
-  }
-
-  // setup basic req values
-  req.baseUrl = parentUrl;
-  req.originalUrl = req.originalUrl || req.url;
-
-  next();
-
-  function next(err) {
-    var layerError = err === 'route'
-      ? null
-      : err;
-
-    // remove added slash
-    if (slashAdded) {
-      req.url = req.url.slice(1)
-      slashAdded = false;
-    }
-
-    // restore altered req.url
-    if (removed.length !== 0) {
-      req.baseUrl = parentUrl;
-      req.url = protohost + removed + req.url.slice(protohost.length)
-      removed = '';
-    }
-
-    // signal to exit router
-    if (layerError === 'router') {
-      setImmediate(done, null)
-      return
-    }
-
-    // no more matching layers
-    if (idx >= stack.length) {
-      setImmediate(done, layerError);
-      return;
-    }
-
-    // max sync stack
-    if (++sync > 100) {
-      return setImmediate(next, err)
-    }
-
-    // get pathname of request
-    var path = getPathname(req);
-
-    if (path == null) {
-      return done(layerError);
-    }
-
-    // find next matching layer
-    var layer;
-    var match;
-    var route;
-
-    while (match !== true && idx < stack.length) {
-      layer = stack[idx++];
-      match = matchLayer(layer, path);
-      route = layer.route;
-
-      if (typeof match !== 'boolean') {
-        // hold on to layerError
-        layerError = layerError || match;
-      }
-
-      if (match !== true) {
-        continue;
-      }
-
-      if (!route) {
-        // process non-route handlers normally
-        continue;
-      }
-
-      if (layerError) {
-        // routes do not match with a pending error
-        match = false;
-        continue;
-      }
-
-      var method = req.method;
-      var has_method = route._handles_method(method);
-
-      // build up automatic options response
-      if (!has_method && method === 'OPTIONS') {
-        appendMethods(options, route._options());
-      }
-
-      // don't even bother matching route
-      if (!has_method && method !== 'HEAD') {
-        match = false;
-      }
-    }
-
-    // no match
-    if (match !== true) {
-      return done(layerError);
-    }
-
-    // store route for dispatch on change
-    if (route) {
-      req.route = route;
-    }
-
-    // Capture one-time layer values
-    req.params = self.mergeParams
-      ? mergeParams(layer.params, parentParams)
-      : layer.params;
-    var layerPath = layer.path;
-
-    // this should be done for the layer
-    self.process_params(layer, paramcalled, req, res, function (err) {
-      if (err) {
-        next(layerError || err)
-      } else if (route) {
-        layer.handle_request(req, res, next)
-      } else {
-        trim_prefix(layer, layerError, layerPath, path)
-      }
-
-      sync = 0
-    });
-  }
-
-  function trim_prefix(layer, layerError, layerPath, path) {
-    if (layerPath.length !== 0) {
-      // Validate path is a prefix match
-      if (layerPath !== path.slice(0, layerPath.length)) {
-        next(layerError)
-        return
-      }
-
-      // Validate path breaks on a path separator
-      var c = path[layerPath.length]
-      if (c && c !== '/' && c !== '.') return next(layerError)
-
-      // Trim off the part of the url that matches the route
-      // middleware (.use stuff) needs to have the path stripped
-      debug('trim prefix (%s) from url %s', layerPath, req.url);
-      removed = layerPath;
-      req.url = protohost + req.url.slice(protohost.length + removed.length)
-
-      // Ensure leading slash
-      if (!protohost && req.url[0] !== '/') {
-        req.url = '/' + req.url;
-        slashAdded = true;
-      }
-
-      // Setup base URL (no trailing slash)
-      req.baseUrl = parentUrl + (removed[removed.length - 1] === '/'
-        ? removed.substring(0, removed.length - 1)
-        : removed);
-    }
-
-    debug('%s %s : %s', layer.name, layerPath, req.originalUrl);
-
-    if (layerError) {
-      layer.handle_error(layerError, req, res, next);
-    } else {
-      layer.handle_request(req, res, next);
-    }
-  }
-};
-
-/**
- * Process any parameters for the layer.
- * @private
- */
-
-proto.process_params = function process_params(layer, called, req, res, done) {
-  var params = this.params;
-
-  // captured parameters from the layer, keys and values
-  var keys = layer.keys;
-
-  // fast track
-  if (!keys || keys.length === 0) {
-    return done();
-  }
-
-  var i = 0;
-  var name;
-  var paramIndex = 0;
-  var key;
-  var paramVal;
-  var paramCallbacks;
-  var paramCalled;
-
-  // process params in order
-  // param callbacks can be async
-  function param(err) {
-    if (err) {
-      return done(err);
-    }
-
-    if (i >= keys.length ) {
-      return done();
-    }
-
-    paramIndex = 0;
-    key = keys[i++];
-    name = key.name;
-    paramVal = req.params[name];
-    paramCallbacks = params[name];
-    paramCalled = called[name];
-
-    if (paramVal === undefined || !paramCallbacks) {
-      return param();
-    }
-
-    // param previously called with same value or error occurred
-    if (paramCalled && (paramCalled.match === paramVal
-      || (paramCalled.error && paramCalled.error !== 'route'))) {
-      // restore value
-      req.params[name] = paramCalled.value;
-
-      // next param
-      return param(paramCalled.error);
-    }
-
-    called[name] = paramCalled = {
-      error: null,
-      match: paramVal,
-      value: paramVal
-    };
-
-    paramCallback();
-  }
-
-  // single param callbacks
-  function paramCallback(err) {
-    var fn = paramCallbacks[paramIndex++];
-
-    // store updated value
-    paramCalled.value = req.params[key.name];
-
-    if (err) {
-      // store error
-      paramCalled.error = err;
-      param(err);
-      return;
-    }
-
-    if (!fn) return param();
-
-    try {
-      fn(req, res, paramCallback, paramVal, key.name);
-    } catch (e) {
-      paramCallback(e);
-    }
-  }
-
-  param();
-};
-
-/**
- * Use the given middleware function, with optional path, defaulting to "/".
- *
- * Use (like `.all`) will run for any http METHOD, but it will not add
- * handlers for those methods so OPTIONS requests will not consider `.use`
- * functions even if they could respond.
- *
- * The other difference is that _route_ path is stripped and not visible
- * to the handler function. The main effect of this feature is that mounted
- * handlers can operate without any code changes regardless of the "prefix"
- * pathname.
- *
- * @public
- */
-
-proto.use = function use(fn) {
-  var offset = 0;
-  var path = '/';
-
-  // default path to '/'
-  // disambiguate router.use([fn])
-  if (typeof fn !== 'function') {
-    var arg = fn;
-
-    while (Array.isArray(arg) && arg.length !== 0) {
-      arg = arg[0];
-    }
-
-    // first arg is the path
-    if (typeof arg !== 'function') {
-      offset = 1;
-      path = fn;
-    }
-  }
-
-  var callbacks = flatten(slice.call(arguments, offset));
-
-  if (callbacks.length === 0) {
-    throw new TypeError('Router.use() requires a middleware function')
-  }
-
-  for (var i = 0; i < callbacks.length; i++) {
-    var fn = callbacks[i];
-
-    if (typeof fn !== 'function') {
-      throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn))
-    }
-
-    // add the middleware
-    debug('use %o %s', path, fn.name || '<anonymous>')
-
-    var layer = new Layer(path, {
-      sensitive: this.caseSensitive,
-      strict: false,
-      end: false
-    }, fn);
-
-    layer.route = undefined;
-
-    this.stack.push(layer);
-  }
-
-  return this;
-};
-
-/**
- * Create a new Route for the given path.
- *
- * Each route contains a separate middleware stack and VERB handlers.
- *
- * See the Route api documentation for details on adding handlers
- * and middleware to routes.
- *
- * @param {String} path
- * @return {Route}
- * @public
- */
-
-proto.route = function route(path) {
-  var route = new Route(path);
-
-  var layer = new Layer(path, {
-    sensitive: this.caseSensitive,
-    strict: this.strict,
-    end: true
-  }, route.dispatch.bind(route));
-
-  layer.route = route;
-
-  this.stack.push(layer);
-  return route;
-};
-
-// create Router#VERB functions
-methods.concat('all').forEach(function(method){
-  proto[method] = function(path){
-    var route = this.route(path)
-    route[method].apply(route, slice.call(arguments, 1));
-    return this;
-  };
-});
-
-// append methods to a list of methods
-function appendMethods(list, addition) {
-  for (var i = 0; i < addition.length; i++) {
-    var method = addition[i];
-    if (list.indexOf(method) === -1) {
-      list.push(method);
-    }
-  }
-}
-
-// get pathname of request
-function getPathname(req) {
-  try {
-    return parseUrl(req).pathname;
-  } catch (err) {
-    return undefined;
-  }
-}
-
-// Get get protocol + host for a URL
-function getProtohost(url) {
-  if (typeof url !== 'string' || url.length === 0 || url[0] === '/') {
-    return undefined
-  }
-
-  var searchIndex = url.indexOf('?')
-  var pathLength = searchIndex !== -1
-    ? searchIndex
-    : url.length
-  var fqdnIndex = url.slice(0, pathLength).indexOf('://')
-
-  return fqdnIndex !== -1
-    ? url.substring(0, url.indexOf('/', 3 + fqdnIndex))
-    : undefined
-}
-
-// get type for error message
-function gettype(obj) {
-  var type = typeof obj;
-
-  if (type !== 'object') {
-    return type;
-  }
-
-  // inspect [[Class]] for objects
-  return toString.call(obj)
-    .replace(objectRegExp, '$1');
-}
-
-/**
- * Match path to a layer.
- *
- * @param {Layer} layer
- * @param {string} path
- * @private
- */
-
-function matchLayer(layer, path) {
-  try {
-    return layer.match(path);
-  } catch (err) {
-    return err;
-  }
-}
-
-// merge params with parent params
-function mergeParams(params, parent) {
-  if (typeof parent !== 'object' || !parent) {
-    return params;
-  }
-
-  // make copy of parent for base
-  var obj = mixin({}, parent);
-
-  // simple non-numeric merging
-  if (!(0 in params) || !(0 in parent)) {
-    return mixin(obj, params);
-  }
-
-  var i = 0;
-  var o = 0;
-
-  // determine numeric gaps
-  while (i in params) {
-    i++;
-  }
-
-  while (o in parent) {
-    o++;
-  }
-
-  // offset numeric indices in params before merge
-  for (i--; i >= 0; i--) {
-    params[i + o] = params[i];
-
-    // create holes for the merge when necessary
-    if (i < o) {
-      delete params[i];
-    }
-  }
-
-  return mixin(obj, params);
-}
-
-// restore obj props after function
-function restore(fn, obj) {
-  var props = new Array(arguments.length - 2);
-  var vals = new Array(arguments.length - 2);
-
-  for (var i = 0; i < props.length; i++) {
-    props[i] = arguments[i + 2];
-    vals[i] = obj[props[i]];
-  }
-
-  return function () {
-    // restore vals
-    for (var i = 0; i < props.length; i++) {
-      obj[props[i]] = vals[i];
-    }
-
-    return fn.apply(this, arguments);
-  };
-}
-
-// send an OPTIONS response
-function sendOptionsResponse(res, options, next) {
-  try {
-    var body = options.join(',');
-    res.set('Allow', body);
-    res.send(body);
-  } catch (err) {
-    next(err);
-  }
-}
-
-// wrap a function
-function wrap(old, fn) {
-  return function proxy() {
-    var args = new Array(arguments.length + 1);
-
-    args[0] = old;
-    for (var i = 0, len = arguments.length; i < len; i++) {
-      args[i + 1] = arguments[i];
-    }
-
-    fn.apply(this, args);
-  };
-}
diff --git a/node_modules/express/lib/router/layer.js b/node_modules/express/lib/router/layer.js
deleted file mode 100644
index 4dc8e86d4f7fac6a5849ec236359e2300b4e3654..0000000000000000000000000000000000000000
--- a/node_modules/express/lib/router/layer.js
+++ /dev/null
@@ -1,181 +0,0 @@
-/*!
- * express
- * Copyright(c) 2009-2013 TJ Holowaychuk
- * Copyright(c) 2013 Roman Shtylman
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module dependencies.
- * @private
- */
-
-var pathRegexp = require('path-to-regexp');
-var debug = require('debug')('express:router:layer');
-
-/**
- * Module variables.
- * @private
- */
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = Layer;
-
-function Layer(path, options, fn) {
-  if (!(this instanceof Layer)) {
-    return new Layer(path, options, fn);
-  }
-
-  debug('new %o', path)
-  var opts = options || {};
-
-  this.handle = fn;
-  this.name = fn.name || '<anonymous>';
-  this.params = undefined;
-  this.path = undefined;
-  this.regexp = pathRegexp(path, this.keys = [], opts);
-
-  // set fast path flags
-  this.regexp.fast_star = path === '*'
-  this.regexp.fast_slash = path === '/' && opts.end === false
-}
-
-/**
- * Handle the error for the layer.
- *
- * @param {Error} error
- * @param {Request} req
- * @param {Response} res
- * @param {function} next
- * @api private
- */
-
-Layer.prototype.handle_error = function handle_error(error, req, res, next) {
-  var fn = this.handle;
-
-  if (fn.length !== 4) {
-    // not a standard error handler
-    return next(error);
-  }
-
-  try {
-    fn(error, req, res, next);
-  } catch (err) {
-    next(err);
-  }
-};
-
-/**
- * Handle the request for the layer.
- *
- * @param {Request} req
- * @param {Response} res
- * @param {function} next
- * @api private
- */
-
-Layer.prototype.handle_request = function handle(req, res, next) {
-  var fn = this.handle;
-
-  if (fn.length > 3) {
-    // not a standard request handler
-    return next();
-  }
-
-  try {
-    fn(req, res, next);
-  } catch (err) {
-    next(err);
-  }
-};
-
-/**
- * Check if this route matches `path`, if so
- * populate `.params`.
- *
- * @param {String} path
- * @return {Boolean}
- * @api private
- */
-
-Layer.prototype.match = function match(path) {
-  var match
-
-  if (path != null) {
-    // fast path non-ending match for / (any path matches)
-    if (this.regexp.fast_slash) {
-      this.params = {}
-      this.path = ''
-      return true
-    }
-
-    // fast path for * (everything matched in a param)
-    if (this.regexp.fast_star) {
-      this.params = {'0': decode_param(path)}
-      this.path = path
-      return true
-    }
-
-    // match the path
-    match = this.regexp.exec(path)
-  }
-
-  if (!match) {
-    this.params = undefined;
-    this.path = undefined;
-    return false;
-  }
-
-  // store values
-  this.params = {};
-  this.path = match[0]
-
-  var keys = this.keys;
-  var params = this.params;
-
-  for (var i = 1; i < match.length; i++) {
-    var key = keys[i - 1];
-    var prop = key.name;
-    var val = decode_param(match[i])
-
-    if (val !== undefined || !(hasOwnProperty.call(params, prop))) {
-      params[prop] = val;
-    }
-  }
-
-  return true;
-};
-
-/**
- * Decode param value.
- *
- * @param {string} val
- * @return {string}
- * @private
- */
-
-function decode_param(val) {
-  if (typeof val !== 'string' || val.length === 0) {
-    return val;
-  }
-
-  try {
-    return decodeURIComponent(val);
-  } catch (err) {
-    if (err instanceof URIError) {
-      err.message = 'Failed to decode param \'' + val + '\'';
-      err.status = err.statusCode = 400;
-    }
-
-    throw err;
-  }
-}
diff --git a/node_modules/express/lib/router/route.js b/node_modules/express/lib/router/route.js
deleted file mode 100644
index a65756d6de6f34ae4b2f799cc33a07d589a2e464..0000000000000000000000000000000000000000
--- a/node_modules/express/lib/router/route.js
+++ /dev/null
@@ -1,230 +0,0 @@
-/*!
- * express
- * Copyright(c) 2009-2013 TJ Holowaychuk
- * Copyright(c) 2013 Roman Shtylman
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module dependencies.
- * @private
- */
-
-var debug = require('debug')('express:router:route');
-var flatten = require('array-flatten');
-var Layer = require('./layer');
-var methods = require('methods');
-
-/**
- * Module variables.
- * @private
- */
-
-var slice = Array.prototype.slice;
-var toString = Object.prototype.toString;
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = Route;
-
-/**
- * Initialize `Route` with the given `path`,
- *
- * @param {String} path
- * @public
- */
-
-function Route(path) {
-  this.path = path;
-  this.stack = [];
-
-  debug('new %o', path)
-
-  // route handlers for various http methods
-  this.methods = {};
-}
-
-/**
- * Determine if the route handles a given method.
- * @private
- */
-
-Route.prototype._handles_method = function _handles_method(method) {
-  if (this.methods._all) {
-    return true;
-  }
-
-  // normalize name
-  var name = typeof method === 'string'
-    ? method.toLowerCase()
-    : method
-
-  if (name === 'head' && !this.methods['head']) {
-    name = 'get';
-  }
-
-  return Boolean(this.methods[name]);
-};
-
-/**
- * @return {Array} supported HTTP methods
- * @private
- */
-
-Route.prototype._options = function _options() {
-  var methods = Object.keys(this.methods);
-
-  // append automatic head
-  if (this.methods.get && !this.methods.head) {
-    methods.push('head');
-  }
-
-  for (var i = 0; i < methods.length; i++) {
-    // make upper case
-    methods[i] = methods[i].toUpperCase();
-  }
-
-  return methods;
-};
-
-/**
- * dispatch req, res into this route
- * @private
- */
-
-Route.prototype.dispatch = function dispatch(req, res, done) {
-  var idx = 0;
-  var stack = this.stack;
-  var sync = 0
-
-  if (stack.length === 0) {
-    return done();
-  }
-  var method = typeof req.method === 'string'
-    ? req.method.toLowerCase()
-    : req.method
-
-  if (method === 'head' && !this.methods['head']) {
-    method = 'get';
-  }
-
-  req.route = this;
-
-  next();
-
-  function next(err) {
-    // signal to exit route
-    if (err && err === 'route') {
-      return done();
-    }
-
-    // signal to exit router
-    if (err && err === 'router') {
-      return done(err)
-    }
-
-    // max sync stack
-    if (++sync > 100) {
-      return setImmediate(next, err)
-    }
-
-    var layer = stack[idx++]
-
-    // end of layers
-    if (!layer) {
-      return done(err)
-    }
-
-    if (layer.method && layer.method !== method) {
-      next(err)
-    } else if (err) {
-      layer.handle_error(err, req, res, next);
-    } else {
-      layer.handle_request(req, res, next);
-    }
-
-    sync = 0
-  }
-};
-
-/**
- * Add a handler for all HTTP verbs to this route.
- *
- * Behaves just like middleware and can respond or call `next`
- * to continue processing.
- *
- * You can use multiple `.all` call to add multiple handlers.
- *
- *   function check_something(req, res, next){
- *     next();
- *   };
- *
- *   function validate_user(req, res, next){
- *     next();
- *   };
- *
- *   route
- *   .all(validate_user)
- *   .all(check_something)
- *   .get(function(req, res, next){
- *     res.send('hello world');
- *   });
- *
- * @param {function} handler
- * @return {Route} for chaining
- * @api public
- */
-
-Route.prototype.all = function all() {
-  var handles = flatten(slice.call(arguments));
-
-  for (var i = 0; i < handles.length; i++) {
-    var handle = handles[i];
-
-    if (typeof handle !== 'function') {
-      var type = toString.call(handle);
-      var msg = 'Route.all() requires a callback function but got a ' + type
-      throw new TypeError(msg);
-    }
-
-    var layer = Layer('/', {}, handle);
-    layer.method = undefined;
-
-    this.methods._all = true;
-    this.stack.push(layer);
-  }
-
-  return this;
-};
-
-methods.forEach(function(method){
-  Route.prototype[method] = function(){
-    var handles = flatten(slice.call(arguments));
-
-    for (var i = 0; i < handles.length; i++) {
-      var handle = handles[i];
-
-      if (typeof handle !== 'function') {
-        var type = toString.call(handle);
-        var msg = 'Route.' + method + '() requires a callback function but got a ' + type
-        throw new Error(msg);
-      }
-
-      debug('%s %o', method, this.path)
-
-      var layer = Layer('/', {}, handle);
-      layer.method = method;
-
-      this.methods[method] = true;
-      this.stack.push(layer);
-    }
-
-    return this;
-  };
-});
diff --git a/node_modules/express/lib/utils.js b/node_modules/express/lib/utils.js
deleted file mode 100644
index 56e12b9b54197602ebec2cf277c277e398c33643..0000000000000000000000000000000000000000
--- a/node_modules/express/lib/utils.js
+++ /dev/null
@@ -1,303 +0,0 @@
-/*!
- * express
- * Copyright(c) 2009-2013 TJ Holowaychuk
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module dependencies.
- * @api private
- */
-
-var Buffer = require('safe-buffer').Buffer
-var contentDisposition = require('content-disposition');
-var contentType = require('content-type');
-var deprecate = require('depd')('express');
-var flatten = require('array-flatten');
-var mime = require('send').mime;
-var etag = require('etag');
-var proxyaddr = require('proxy-addr');
-var qs = require('qs');
-var querystring = require('querystring');
-
-/**
- * Return strong ETag for `body`.
- *
- * @param {String|Buffer} body
- * @param {String} [encoding]
- * @return {String}
- * @api private
- */
-
-exports.etag = createETagGenerator({ weak: false })
-
-/**
- * Return weak ETag for `body`.
- *
- * @param {String|Buffer} body
- * @param {String} [encoding]
- * @return {String}
- * @api private
- */
-
-exports.wetag = createETagGenerator({ weak: true })
-
-/**
- * Check if `path` looks absolute.
- *
- * @param {String} path
- * @return {Boolean}
- * @api private
- */
-
-exports.isAbsolute = function(path){
-  if ('/' === path[0]) return true;
-  if (':' === path[1] && ('\\' === path[2] || '/' === path[2])) return true; // Windows device path
-  if ('\\\\' === path.substring(0, 2)) return true; // Microsoft Azure absolute path
-};
-
-/**
- * Flatten the given `arr`.
- *
- * @param {Array} arr
- * @return {Array}
- * @api private
- */
-
-exports.flatten = deprecate.function(flatten,
-  'utils.flatten: use array-flatten npm module instead');
-
-/**
- * Normalize the given `type`, for example "html" becomes "text/html".
- *
- * @param {String} type
- * @return {Object}
- * @api private
- */
-
-exports.normalizeType = function(type){
-  return ~type.indexOf('/')
-    ? acceptParams(type)
-    : { value: mime.lookup(type), params: {} };
-};
-
-/**
- * Normalize `types`, for example "html" becomes "text/html".
- *
- * @param {Array} types
- * @return {Array}
- * @api private
- */
-
-exports.normalizeTypes = function(types){
-  var ret = [];
-
-  for (var i = 0; i < types.length; ++i) {
-    ret.push(exports.normalizeType(types[i]));
-  }
-
-  return ret;
-};
-
-/**
- * Generate Content-Disposition header appropriate for the filename.
- * non-ascii filenames are urlencoded and a filename* parameter is added
- *
- * @param {String} filename
- * @return {String}
- * @api private
- */
-
-exports.contentDisposition = deprecate.function(contentDisposition,
-  'utils.contentDisposition: use content-disposition npm module instead');
-
-/**
- * Parse accept params `str` returning an
- * object with `.value`, `.quality` and `.params`.
- *
- * @param {String} str
- * @return {Object}
- * @api private
- */
-
-function acceptParams (str) {
-  var parts = str.split(/ *; */);
-  var ret = { value: parts[0], quality: 1, params: {} }
-
-  for (var i = 1; i < parts.length; ++i) {
-    var pms = parts[i].split(/ *= */);
-    if ('q' === pms[0]) {
-      ret.quality = parseFloat(pms[1]);
-    } else {
-      ret.params[pms[0]] = pms[1];
-    }
-  }
-
-  return ret;
-}
-
-/**
- * Compile "etag" value to function.
- *
- * @param  {Boolean|String|Function} val
- * @return {Function}
- * @api private
- */
-
-exports.compileETag = function(val) {
-  var fn;
-
-  if (typeof val === 'function') {
-    return val;
-  }
-
-  switch (val) {
-    case true:
-    case 'weak':
-      fn = exports.wetag;
-      break;
-    case false:
-      break;
-    case 'strong':
-      fn = exports.etag;
-      break;
-    default:
-      throw new TypeError('unknown value for etag function: ' + val);
-  }
-
-  return fn;
-}
-
-/**
- * Compile "query parser" value to function.
- *
- * @param  {String|Function} val
- * @return {Function}
- * @api private
- */
-
-exports.compileQueryParser = function compileQueryParser(val) {
-  var fn;
-
-  if (typeof val === 'function') {
-    return val;
-  }
-
-  switch (val) {
-    case true:
-    case 'simple':
-      fn = querystring.parse;
-      break;
-    case false:
-      fn = newObject;
-      break;
-    case 'extended':
-      fn = parseExtendedQueryString;
-      break;
-    default:
-      throw new TypeError('unknown value for query parser function: ' + val);
-  }
-
-  return fn;
-}
-
-/**
- * Compile "proxy trust" value to function.
- *
- * @param  {Boolean|String|Number|Array|Function} val
- * @return {Function}
- * @api private
- */
-
-exports.compileTrust = function(val) {
-  if (typeof val === 'function') return val;
-
-  if (val === true) {
-    // Support plain true/false
-    return function(){ return true };
-  }
-
-  if (typeof val === 'number') {
-    // Support trusting hop count
-    return function(a, i){ return i < val };
-  }
-
-  if (typeof val === 'string') {
-    // Support comma-separated values
-    val = val.split(',')
-      .map(function (v) { return v.trim() })
-  }
-
-  return proxyaddr.compile(val || []);
-}
-
-/**
- * Set the charset in a given Content-Type string.
- *
- * @param {String} type
- * @param {String} charset
- * @return {String}
- * @api private
- */
-
-exports.setCharset = function setCharset(type, charset) {
-  if (!type || !charset) {
-    return type;
-  }
-
-  // parse type
-  var parsed = contentType.parse(type);
-
-  // set charset
-  parsed.parameters.charset = charset;
-
-  // format type
-  return contentType.format(parsed);
-};
-
-/**
- * Create an ETag generator function, generating ETags with
- * the given options.
- *
- * @param {object} options
- * @return {function}
- * @private
- */
-
-function createETagGenerator (options) {
-  return function generateETag (body, encoding) {
-    var buf = !Buffer.isBuffer(body)
-      ? Buffer.from(body, encoding)
-      : body
-
-    return etag(buf, options)
-  }
-}
-
-/**
- * Parse an extended query string with qs.
- *
- * @param {String} str
- * @return {Object}
- * @private
- */
-
-function parseExtendedQueryString(str) {
-  return qs.parse(str, {
-    allowPrototypes: true
-  });
-}
-
-/**
- * Return new empty object.
- *
- * @return {Object}
- * @api private
- */
-
-function newObject() {
-  return {};
-}
diff --git a/node_modules/express/lib/view.js b/node_modules/express/lib/view.js
deleted file mode 100644
index c08ab4d8d521cc18cbb89c3a705d8f137d12d056..0000000000000000000000000000000000000000
--- a/node_modules/express/lib/view.js
+++ /dev/null
@@ -1,182 +0,0 @@
-/*!
- * express
- * Copyright(c) 2009-2013 TJ Holowaychuk
- * Copyright(c) 2013 Roman Shtylman
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module dependencies.
- * @private
- */
-
-var debug = require('debug')('express:view');
-var path = require('path');
-var fs = require('fs');
-
-/**
- * Module variables.
- * @private
- */
-
-var dirname = path.dirname;
-var basename = path.basename;
-var extname = path.extname;
-var join = path.join;
-var resolve = path.resolve;
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = View;
-
-/**
- * Initialize a new `View` with the given `name`.
- *
- * Options:
- *
- *   - `defaultEngine` the default template engine name
- *   - `engines` template engine require() cache
- *   - `root` root path for view lookup
- *
- * @param {string} name
- * @param {object} options
- * @public
- */
-
-function View(name, options) {
-  var opts = options || {};
-
-  this.defaultEngine = opts.defaultEngine;
-  this.ext = extname(name);
-  this.name = name;
-  this.root = opts.root;
-
-  if (!this.ext && !this.defaultEngine) {
-    throw new Error('No default engine was specified and no extension was provided.');
-  }
-
-  var fileName = name;
-
-  if (!this.ext) {
-    // get extension from default engine name
-    this.ext = this.defaultEngine[0] !== '.'
-      ? '.' + this.defaultEngine
-      : this.defaultEngine;
-
-    fileName += this.ext;
-  }
-
-  if (!opts.engines[this.ext]) {
-    // load engine
-    var mod = this.ext.slice(1)
-    debug('require "%s"', mod)
-
-    // default engine export
-    var fn = require(mod).__express
-
-    if (typeof fn !== 'function') {
-      throw new Error('Module "' + mod + '" does not provide a view engine.')
-    }
-
-    opts.engines[this.ext] = fn
-  }
-
-  // store loaded engine
-  this.engine = opts.engines[this.ext];
-
-  // lookup path
-  this.path = this.lookup(fileName);
-}
-
-/**
- * Lookup view by the given `name`
- *
- * @param {string} name
- * @private
- */
-
-View.prototype.lookup = function lookup(name) {
-  var path;
-  var roots = [].concat(this.root);
-
-  debug('lookup "%s"', name);
-
-  for (var i = 0; i < roots.length && !path; i++) {
-    var root = roots[i];
-
-    // resolve the path
-    var loc = resolve(root, name);
-    var dir = dirname(loc);
-    var file = basename(loc);
-
-    // resolve the file
-    path = this.resolve(dir, file);
-  }
-
-  return path;
-};
-
-/**
- * Render with the given options.
- *
- * @param {object} options
- * @param {function} callback
- * @private
- */
-
-View.prototype.render = function render(options, callback) {
-  debug('render "%s"', this.path);
-  this.engine(this.path, options, callback);
-};
-
-/**
- * Resolve the file within the given directory.
- *
- * @param {string} dir
- * @param {string} file
- * @private
- */
-
-View.prototype.resolve = function resolve(dir, file) {
-  var ext = this.ext;
-
-  // <path>.<ext>
-  var path = join(dir, file);
-  var stat = tryStat(path);
-
-  if (stat && stat.isFile()) {
-    return path;
-  }
-
-  // <path>/index.<ext>
-  path = join(dir, basename(file, ext), 'index' + ext);
-  stat = tryStat(path);
-
-  if (stat && stat.isFile()) {
-    return path;
-  }
-};
-
-/**
- * Return a stat, maybe.
- *
- * @param {string} path
- * @return {fs.Stats}
- * @private
- */
-
-function tryStat(path) {
-  debug('stat "%s"', path);
-
-  try {
-    return fs.statSync(path);
-  } catch (e) {
-    return undefined;
-  }
-}
diff --git a/node_modules/express/package.json b/node_modules/express/package.json
deleted file mode 100644
index 60f65fe2d379dc11b08fc61578251867408b5ec0..0000000000000000000000000000000000000000
--- a/node_modules/express/package.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
-  "name": "express",
-  "description": "Fast, unopinionated, minimalist web framework",
-  "version": "4.21.2",
-  "author": "TJ Holowaychuk <tj@vision-media.ca>",
-  "contributors": [
-    "Aaron Heckmann <aaron.heckmann+github@gmail.com>",
-    "Ciaran Jessup <ciaranj@gmail.com>",
-    "Douglas Christopher Wilson <doug@somethingdoug.com>",
-    "Guillermo Rauch <rauchg@gmail.com>",
-    "Jonathan Ong <me@jongleberry.com>",
-    "Roman Shtylman <shtylman+expressjs@gmail.com>",
-    "Young Jae Sim <hanul@hanul.me>"
-  ],
-  "license": "MIT",
-  "repository": "expressjs/express",
-  "homepage": "http://expressjs.com/",
-  "funding": {
-    "type": "opencollective",
-    "url": "https://opencollective.com/express"
-  },
-  "keywords": [
-    "express",
-    "framework",
-    "sinatra",
-    "web",
-    "http",
-    "rest",
-    "restful",
-    "router",
-    "app",
-    "api"
-  ],
-  "dependencies": {
-    "accepts": "~1.3.8",
-    "array-flatten": "1.1.1",
-    "body-parser": "1.20.3",
-    "content-disposition": "0.5.4",
-    "content-type": "~1.0.4",
-    "cookie": "0.7.1",
-    "cookie-signature": "1.0.6",
-    "debug": "2.6.9",
-    "depd": "2.0.0",
-    "encodeurl": "~2.0.0",
-    "escape-html": "~1.0.3",
-    "etag": "~1.8.1",
-    "finalhandler": "1.3.1",
-    "fresh": "0.5.2",
-    "http-errors": "2.0.0",
-    "merge-descriptors": "1.0.3",
-    "methods": "~1.1.2",
-    "on-finished": "2.4.1",
-    "parseurl": "~1.3.3",
-    "path-to-regexp": "0.1.12",
-    "proxy-addr": "~2.0.7",
-    "qs": "6.13.0",
-    "range-parser": "~1.2.1",
-    "safe-buffer": "5.2.1",
-    "send": "0.19.0",
-    "serve-static": "1.16.2",
-    "setprototypeof": "1.2.0",
-    "statuses": "2.0.1",
-    "type-is": "~1.6.18",
-    "utils-merge": "1.0.1",
-    "vary": "~1.1.2"
-  },
-  "devDependencies": {
-    "after": "0.8.2",
-    "connect-redis": "3.4.2",
-    "cookie-parser": "1.4.6",
-    "cookie-session": "2.0.0",
-    "ejs": "3.1.9",
-    "eslint": "8.47.0",
-    "express-session": "1.17.2",
-    "hbs": "4.2.0",
-    "marked": "0.7.0",
-    "method-override": "3.0.0",
-    "mocha": "10.2.0",
-    "morgan": "1.10.0",
-    "nyc": "15.1.0",
-    "pbkdf2-password": "1.2.1",
-    "supertest": "6.3.0",
-    "vhost": "~3.0.2"
-  },
-  "engines": {
-    "node": ">= 0.10.0"
-  },
-  "files": [
-    "LICENSE",
-    "History.md",
-    "Readme.md",
-    "index.js",
-    "lib/"
-  ],
-  "scripts": {
-    "lint": "eslint .",
-    "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/",
-    "test-ci": "nyc --exclude examples --exclude test --exclude benchmarks --reporter=lcovonly --reporter=text npm test",
-    "test-cov": "nyc --exclude examples --exclude test --exclude benchmarks --reporter=html --reporter=text npm test",
-    "test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/"
-  }
-}
diff --git a/node_modules/fill-range/LICENSE b/node_modules/fill-range/LICENSE
deleted file mode 100644
index 9af4a67d206f24ecdbb5fdff2839041ca0bbd346..0000000000000000000000000000000000000000
--- a/node_modules/fill-range/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014-present, Jon Schlinkert.
-
-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/fill-range/README.md b/node_modules/fill-range/README.md
deleted file mode 100644
index 8d756fe9016aec005378ea1b61e599d944ffa4d3..0000000000000000000000000000000000000000
--- a/node_modules/fill-range/README.md
+++ /dev/null
@@ -1,237 +0,0 @@
-# fill-range [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![NPM version](https://img.shields.io/npm/v/fill-range.svg?style=flat)](https://www.npmjs.com/package/fill-range) [![NPM monthly downloads](https://img.shields.io/npm/dm/fill-range.svg?style=flat)](https://npmjs.org/package/fill-range) [![NPM total downloads](https://img.shields.io/npm/dt/fill-range.svg?style=flat)](https://npmjs.org/package/fill-range) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/fill-range.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/fill-range)
-
-> Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`
-
-Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-$ npm install --save fill-range
-```
-
-## Usage
-
-Expands numbers and letters, optionally using a `step` as the last argument. _(Numbers may be defined as JavaScript numbers or strings)_.
-
-```js
-const fill = require('fill-range');
-// fill(from, to[, step, options]);
-
-console.log(fill('1', '10')); //=> ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
-console.log(fill('1', '10', { toRegex: true })); //=> [1-9]|10
-```
-
-**Params**
-
-* `from`: **{String|Number}** the number or letter to start with
-* `to`: **{String|Number}** the number or letter to end with
-* `step`: **{String|Number|Object|Function}** Optionally pass a [step](#optionsstep) to use.
-* `options`: **{Object|Function}**: See all available [options](#options)
-
-## Examples
-
-By default, an array of values is returned.
-
-**Alphabetical ranges**
-
-```js
-console.log(fill('a', 'e')); //=> ['a', 'b', 'c', 'd', 'e']
-console.log(fill('A', 'E')); //=> [ 'A', 'B', 'C', 'D', 'E' ]
-```
-
-**Numerical ranges**
-
-Numbers can be defined as actual numbers or strings.
-
-```js
-console.log(fill(1, 5));     //=> [ 1, 2, 3, 4, 5 ]
-console.log(fill('1', '5')); //=> [ 1, 2, 3, 4, 5 ]
-```
-
-**Negative ranges**
-
-Numbers can be defined as actual numbers or strings.
-
-```js
-console.log(fill('-5', '-1')); //=> [ '-5', '-4', '-3', '-2', '-1' ]
-console.log(fill('-5', '5')); //=> [ '-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5' ]
-```
-
-**Steps (increments)**
-
-```js
-// numerical ranges with increments
-console.log(fill('0', '25', 4)); //=> [ '0', '4', '8', '12', '16', '20', '24' ]
-console.log(fill('0', '25', 5)); //=> [ '0', '5', '10', '15', '20', '25' ]
-console.log(fill('0', '25', 6)); //=> [ '0', '6', '12', '18', '24' ]
-
-// alphabetical ranges with increments
-console.log(fill('a', 'z', 4)); //=> [ 'a', 'e', 'i', 'm', 'q', 'u', 'y' ]
-console.log(fill('a', 'z', 5)); //=> [ 'a', 'f', 'k', 'p', 'u', 'z' ]
-console.log(fill('a', 'z', 6)); //=> [ 'a', 'g', 'm', 's', 'y' ]
-```
-
-## Options
-
-### options.step
-
-**Type**: `number` (formatted as a string or number)
-
-**Default**: `undefined`
-
-**Description**: The increment to use for the range. Can be used with letters or numbers.
-
-**Example(s)**
-
-```js
-// numbers
-console.log(fill('1', '10', 2)); //=> [ '1', '3', '5', '7', '9' ]
-console.log(fill('1', '10', 3)); //=> [ '1', '4', '7', '10' ]
-console.log(fill('1', '10', 4)); //=> [ '1', '5', '9' ]
-
-// letters
-console.log(fill('a', 'z', 5)); //=> [ 'a', 'f', 'k', 'p', 'u', 'z' ]
-console.log(fill('a', 'z', 7)); //=> [ 'a', 'h', 'o', 'v' ]
-console.log(fill('a', 'z', 9)); //=> [ 'a', 'j', 's' ]
-```
-
-### options.strictRanges
-
-**Type**: `boolean`
-
-**Default**: `false`
-
-**Description**: By default, `null` is returned when an invalid range is passed. Enable this option to throw a `RangeError` on invalid ranges.
-
-**Example(s)**
-
-The following are all invalid:
-
-```js
-fill('1.1', '2');   // decimals not supported in ranges
-fill('a', '2');     // incompatible range values
-fill(1, 10, 'foo'); // invalid "step" argument
-```
-
-### options.stringify
-
-**Type**: `boolean`
-
-**Default**: `undefined`
-
-**Description**: Cast all returned values to strings. By default, integers are returned as numbers.
-
-**Example(s)**
-
-```js
-console.log(fill(1, 5));                    //=> [ 1, 2, 3, 4, 5 ]
-console.log(fill(1, 5, { stringify: true })); //=> [ '1', '2', '3', '4', '5' ]
-```
-
-### options.toRegex
-
-**Type**: `boolean`
-
-**Default**: `undefined`
-
-**Description**: Create a regex-compatible source string, instead of expanding values to an array.
-
-**Example(s)**
-
-```js
-// alphabetical range
-console.log(fill('a', 'e', { toRegex: true })); //=> '[a-e]'
-// alphabetical with step
-console.log(fill('a', 'z', 3, { toRegex: true })); //=> 'a|d|g|j|m|p|s|v|y'
-// numerical range
-console.log(fill('1', '100', { toRegex: true })); //=> '[1-9]|[1-9][0-9]|100'
-// numerical range with zero padding
-console.log(fill('000001', '100000', { toRegex: true }));
-//=> '0{5}[1-9]|0{4}[1-9][0-9]|0{3}[1-9][0-9]{2}|0{2}[1-9][0-9]{3}|0[1-9][0-9]{4}|100000'
-```
-
-### options.transform
-
-**Type**: `function`
-
-**Default**: `undefined`
-
-**Description**: Customize each value in the returned array (or [string](#optionstoRegex)). _(you can also pass this function as the last argument to `fill()`)_.
-
-**Example(s)**
-
-```js
-// add zero padding
-console.log(fill(1, 5, value => String(value).padStart(4, '0')));
-//=> ['0001', '0002', '0003', '0004', '0005']
-```
-
-## About
-
-<details>
-<summary><strong>Contributing</strong></summary>
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-</details>
-
-<details>
-<summary><strong>Running Tests</strong></summary>
-
-Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
-
-```sh
-$ npm install && npm test
-```
-
-</details>
-
-<details>
-<summary><strong>Building docs</strong></summary>
-
-_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
-
-To generate the readme, run the following command:
-
-```sh
-$ npm install -g verbose/verb#dev verb-generate-readme && verb
-```
-
-</details>
-
-### Contributors
-
-| **Commits** | **Contributor** |  
-| --- | --- |  
-| 116 | [jonschlinkert](https://github.com/jonschlinkert) |  
-| 4   | [paulmillr](https://github.com/paulmillr) |  
-| 2   | [realityking](https://github.com/realityking) |  
-| 2   | [bluelovers](https://github.com/bluelovers) |  
-| 1   | [edorivai](https://github.com/edorivai) |  
-| 1   | [wtgtybhertgeghgtwtg](https://github.com/wtgtybhertgeghgtwtg) |  
-
-### Author
-
-**Jon Schlinkert**
-
-* [GitHub Profile](https://github.com/jonschlinkert)
-* [Twitter Profile](https://twitter.com/jonschlinkert)
-* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
-
-Please consider supporting me on Patreon, or [start your own Patreon page](https://patreon.com/invite/bxpbvm)!
-
-<a href="https://www.patreon.com/jonschlinkert">
-<img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" height="50">
-</a>
-
-### License
-
-Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT License](LICENSE).
-
-***
-
-_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 08, 2019._
\ No newline at end of file
diff --git a/node_modules/fill-range/index.js b/node_modules/fill-range/index.js
deleted file mode 100644
index ddb212ee2873d7c13624c47265c56f38fbb4ed1c..0000000000000000000000000000000000000000
--- a/node_modules/fill-range/index.js
+++ /dev/null
@@ -1,248 +0,0 @@
-/*!
- * fill-range <https://github.com/jonschlinkert/fill-range>
- *
- * Copyright (c) 2014-present, Jon Schlinkert.
- * Licensed under the MIT License.
- */
-
-'use strict';
-
-const util = require('util');
-const toRegexRange = require('to-regex-range');
-
-const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);
-
-const transform = toNumber => {
-  return value => toNumber === true ? Number(value) : String(value);
-};
-
-const isValidValue = value => {
-  return typeof value === 'number' || (typeof value === 'string' && value !== '');
-};
-
-const isNumber = num => Number.isInteger(+num);
-
-const zeros = input => {
-  let value = `${input}`;
-  let index = -1;
-  if (value[0] === '-') value = value.slice(1);
-  if (value === '0') return false;
-  while (value[++index] === '0');
-  return index > 0;
-};
-
-const stringify = (start, end, options) => {
-  if (typeof start === 'string' || typeof end === 'string') {
-    return true;
-  }
-  return options.stringify === true;
-};
-
-const pad = (input, maxLength, toNumber) => {
-  if (maxLength > 0) {
-    let dash = input[0] === '-' ? '-' : '';
-    if (dash) input = input.slice(1);
-    input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0'));
-  }
-  if (toNumber === false) {
-    return String(input);
-  }
-  return input;
-};
-
-const toMaxLen = (input, maxLength) => {
-  let negative = input[0] === '-' ? '-' : '';
-  if (negative) {
-    input = input.slice(1);
-    maxLength--;
-  }
-  while (input.length < maxLength) input = '0' + input;
-  return negative ? ('-' + input) : input;
-};
-
-const toSequence = (parts, options, maxLen) => {
-  parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
-  parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
-
-  let prefix = options.capture ? '' : '?:';
-  let positives = '';
-  let negatives = '';
-  let result;
-
-  if (parts.positives.length) {
-    positives = parts.positives.map(v => toMaxLen(String(v), maxLen)).join('|');
-  }
-
-  if (parts.negatives.length) {
-    negatives = `-(${prefix}${parts.negatives.map(v => toMaxLen(String(v), maxLen)).join('|')})`;
-  }
-
-  if (positives && negatives) {
-    result = `${positives}|${negatives}`;
-  } else {
-    result = positives || negatives;
-  }
-
-  if (options.wrap) {
-    return `(${prefix}${result})`;
-  }
-
-  return result;
-};
-
-const toRange = (a, b, isNumbers, options) => {
-  if (isNumbers) {
-    return toRegexRange(a, b, { wrap: false, ...options });
-  }
-
-  let start = String.fromCharCode(a);
-  if (a === b) return start;
-
-  let stop = String.fromCharCode(b);
-  return `[${start}-${stop}]`;
-};
-
-const toRegex = (start, end, options) => {
-  if (Array.isArray(start)) {
-    let wrap = options.wrap === true;
-    let prefix = options.capture ? '' : '?:';
-    return wrap ? `(${prefix}${start.join('|')})` : start.join('|');
-  }
-  return toRegexRange(start, end, options);
-};
-
-const rangeError = (...args) => {
-  return new RangeError('Invalid range arguments: ' + util.inspect(...args));
-};
-
-const invalidRange = (start, end, options) => {
-  if (options.strictRanges === true) throw rangeError([start, end]);
-  return [];
-};
-
-const invalidStep = (step, options) => {
-  if (options.strictRanges === true) {
-    throw new TypeError(`Expected step "${step}" to be a number`);
-  }
-  return [];
-};
-
-const fillNumbers = (start, end, step = 1, options = {}) => {
-  let a = Number(start);
-  let b = Number(end);
-
-  if (!Number.isInteger(a) || !Number.isInteger(b)) {
-    if (options.strictRanges === true) throw rangeError([start, end]);
-    return [];
-  }
-
-  // fix negative zero
-  if (a === 0) a = 0;
-  if (b === 0) b = 0;
-
-  let descending = a > b;
-  let startString = String(start);
-  let endString = String(end);
-  let stepString = String(step);
-  step = Math.max(Math.abs(step), 1);
-
-  let padded = zeros(startString) || zeros(endString) || zeros(stepString);
-  let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0;
-  let toNumber = padded === false && stringify(start, end, options) === false;
-  let format = options.transform || transform(toNumber);
-
-  if (options.toRegex && step === 1) {
-    return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options);
-  }
-
-  let parts = { negatives: [], positives: [] };
-  let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num));
-  let range = [];
-  let index = 0;
-
-  while (descending ? a >= b : a <= b) {
-    if (options.toRegex === true && step > 1) {
-      push(a);
-    } else {
-      range.push(pad(format(a, index), maxLen, toNumber));
-    }
-    a = descending ? a - step : a + step;
-    index++;
-  }
-
-  if (options.toRegex === true) {
-    return step > 1
-      ? toSequence(parts, options, maxLen)
-      : toRegex(range, null, { wrap: false, ...options });
-  }
-
-  return range;
-};
-
-const fillLetters = (start, end, step = 1, options = {}) => {
-  if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) {
-    return invalidRange(start, end, options);
-  }
-
-  let format = options.transform || (val => String.fromCharCode(val));
-  let a = `${start}`.charCodeAt(0);
-  let b = `${end}`.charCodeAt(0);
-
-  let descending = a > b;
-  let min = Math.min(a, b);
-  let max = Math.max(a, b);
-
-  if (options.toRegex && step === 1) {
-    return toRange(min, max, false, options);
-  }
-
-  let range = [];
-  let index = 0;
-
-  while (descending ? a >= b : a <= b) {
-    range.push(format(a, index));
-    a = descending ? a - step : a + step;
-    index++;
-  }
-
-  if (options.toRegex === true) {
-    return toRegex(range, null, { wrap: false, options });
-  }
-
-  return range;
-};
-
-const fill = (start, end, step, options = {}) => {
-  if (end == null && isValidValue(start)) {
-    return [start];
-  }
-
-  if (!isValidValue(start) || !isValidValue(end)) {
-    return invalidRange(start, end, options);
-  }
-
-  if (typeof step === 'function') {
-    return fill(start, end, 1, { transform: step });
-  }
-
-  if (isObject(step)) {
-    return fill(start, end, 0, step);
-  }
-
-  let opts = { ...options };
-  if (opts.capture === true) opts.wrap = true;
-  step = step || opts.step || 1;
-
-  if (!isNumber(step)) {
-    if (step != null && !isObject(step)) return invalidStep(step, opts);
-    return fill(start, end, 1, step);
-  }
-
-  if (isNumber(start) && isNumber(end)) {
-    return fillNumbers(start, end, step, opts);
-  }
-
-  return fillLetters(start, end, Math.max(Math.abs(step), 1), opts);
-};
-
-module.exports = fill;
diff --git a/node_modules/fill-range/package.json b/node_modules/fill-range/package.json
deleted file mode 100644
index 582357fb50baf6d7ceb473732ae6f2179ab4ff7b..0000000000000000000000000000000000000000
--- a/node_modules/fill-range/package.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
-  "name": "fill-range",
-  "description": "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`",
-  "version": "7.1.1",
-  "homepage": "https://github.com/jonschlinkert/fill-range",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "contributors": [
-    "Edo Rivai (edo.rivai.nl)",
-    "Jon Schlinkert (http://twitter.com/jonschlinkert)",
-    "Paul Miller (paulmillr.com)",
-    "Rouven Weßling (www.rouvenwessling.de)",
-    "(https://github.com/wtgtybhertgeghgtwtg)"
-  ],
-  "repository": "jonschlinkert/fill-range",
-  "bugs": {
-    "url": "https://github.com/jonschlinkert/fill-range/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=8"
-  },
-  "scripts": {
-    "lint": "eslint --cache --cache-location node_modules/.cache/.eslintcache --report-unused-disable-directives --ignore-path .gitignore .",
-    "mocha": "mocha --reporter dot",
-    "test": "npm run lint && npm run mocha",
-    "test:ci": "npm run test:cover",
-    "test:cover": "nyc npm run mocha"
-  },
-  "dependencies": {
-    "to-regex-range": "^5.0.1"
-  },
-  "devDependencies": {
-    "gulp-format-md": "^2.0.0",
-    "mocha": "^6.1.1",
-    "nyc": "^15.1.0"
-  },
-  "keywords": [
-    "alpha",
-    "alphabetical",
-    "array",
-    "bash",
-    "brace",
-    "expand",
-    "expansion",
-    "fill",
-    "glob",
-    "match",
-    "matches",
-    "matching",
-    "number",
-    "numerical",
-    "range",
-    "ranges",
-    "regex",
-    "sh"
-  ],
-  "verb": {
-    "toc": false,
-    "layout": "default",
-    "tasks": [
-      "readme"
-    ],
-    "plugins": [
-      "gulp-format-md"
-    ],
-    "lint": {
-      "reflinks": true
-    }
-  }
-}
diff --git a/node_modules/finalhandler/HISTORY.md b/node_modules/finalhandler/HISTORY.md
deleted file mode 100644
index 7faa4f0afc70b7bf07d568ad6abfcdbd4ba0d72b..0000000000000000000000000000000000000000
--- a/node_modules/finalhandler/HISTORY.md
+++ /dev/null
@@ -1,210 +0,0 @@
-v1.3.1 / 2024-09-11
-==================
-
-  * deps: encodeurl@~2.0.0
-
-v1.3.0 / 2024-09-03
-==================
-
-  * ignore status message for HTTP/2 (#53)
-
-v1.2.1 / 2024-09-02
-==================
-
-  * Gracefully handle when handling an error and socket is null
-
-1.2.0 / 2022-03-22
-==================
-
-  * Remove set content headers that break response
-  * deps: on-finished@2.4.1
-  * deps: statuses@2.0.1
-    - Rename `425 Unordered Collection` to standard `425 Too Early`
-
-1.1.2 / 2019-05-09
-==================
-
-  * Set stricter `Content-Security-Policy` header
-  * deps: parseurl@~1.3.3
-  * deps: statuses@~1.5.0
-
-1.1.1 / 2018-03-06
-==================
-
-  * Fix 404 output for bad / missing pathnames
-  * deps: encodeurl@~1.0.2
-    - Fix encoding `%` as last character
-  * deps: statuses@~1.4.0
-
-1.1.0 / 2017-09-24
-==================
-
-  * Use `res.headersSent` when available
-
-1.0.6 / 2017-09-22
-==================
-
-  * deps: debug@2.6.9
-
-1.0.5 / 2017-09-15
-==================
-
-  * deps: parseurl@~1.3.2
-    - perf: reduce overhead for full URLs
-    - perf: unroll the "fast-path" `RegExp`
-
-1.0.4 / 2017-08-03
-==================
-
-  * deps: debug@2.6.8
-
-1.0.3 / 2017-05-16
-==================
-
-  * deps: debug@2.6.7
-    - deps: ms@2.0.0
-
-1.0.2 / 2017-04-22
-==================
-
-  * deps: debug@2.6.4
-    - deps: ms@0.7.3
-
-1.0.1 / 2017-03-21
-==================
-
-  * Fix missing `</html>` in HTML document
-  * deps: debug@2.6.3
-    - Fix: `DEBUG_MAX_ARRAY_LENGTH`
-
-1.0.0 / 2017-02-15
-==================
-
-  * Fix exception when `err` cannot be converted to a string
-  * Fully URL-encode the pathname in the 404 message
-  * Only include the pathname in the 404 message
-  * Send complete HTML document
-  * Set `Content-Security-Policy: default-src 'self'` header
-  * deps: debug@2.6.1
-    - Allow colors in workers
-    - Deprecated `DEBUG_FD` environment variable set to `3` or higher
-    - Fix error when running under React Native
-    - Use same color for same namespace
-    - deps: ms@0.7.2
-
-0.5.1 / 2016-11-12
-==================
-
-  * Fix exception when `err.headers` is not an object
-  * deps: statuses@~1.3.1
-  * perf: hoist regular expressions
-  * perf: remove duplicate validation path
-
-0.5.0 / 2016-06-15
-==================
-
-  * Change invalid or non-numeric status code to 500
-  * Overwrite status message to match set status code
-  * Prefer `err.statusCode` if `err.status` is invalid
-  * Set response headers from `err.headers` object
-  * Use `statuses` instead of `http` module for status messages
-    - Includes all defined status messages
-
-0.4.1 / 2015-12-02
-==================
-
-  * deps: escape-html@~1.0.3
-    - perf: enable strict mode
-    - perf: optimize string replacement
-    - perf: use faster string coercion
-
-0.4.0 / 2015-06-14
-==================
-
-  * Fix a false-positive when unpiping in Node.js 0.8
-  * Support `statusCode` property on `Error` objects
-  * Use `unpipe` module for unpiping requests
-  * deps: escape-html@1.0.2
-  * deps: on-finished@~2.3.0
-    - Add defined behavior for HTTP `CONNECT` requests
-    - Add defined behavior for HTTP `Upgrade` requests
-    - deps: ee-first@1.1.1
-  * perf: enable strict mode
-  * perf: remove argument reassignment
-
-0.3.6 / 2015-05-11
-==================
-
-  * deps: debug@~2.2.0
-    - deps: ms@0.7.1
-
-0.3.5 / 2015-04-22
-==================
-
-  * deps: on-finished@~2.2.1
-    - Fix `isFinished(req)` when data buffered
-
-0.3.4 / 2015-03-15
-==================
-
-  * deps: debug@~2.1.3
-    - Fix high intensity foreground color for bold
-    - deps: ms@0.7.0
-
-0.3.3 / 2015-01-01
-==================
-
-  * deps: debug@~2.1.1
-  * deps: on-finished@~2.2.0
-
-0.3.2 / 2014-10-22
-==================
-
-  * deps: on-finished@~2.1.1
-    - Fix handling of pipelined requests
-
-0.3.1 / 2014-10-16
-==================
-
-  * deps: debug@~2.1.0
-    - Implement `DEBUG_FD` env variable support
-
-0.3.0 / 2014-09-17
-==================
-
-  * Terminate in progress response only on error
-  * Use `on-finished` to determine request status
-
-0.2.0 / 2014-09-03
-==================
-
-  * Set `X-Content-Type-Options: nosniff` header
-  * deps: debug@~2.0.0
-
-0.1.0 / 2014-07-16
-==================
-
-  * Respond after request fully read
-    - prevents hung responses and socket hang ups
-  * deps: debug@1.0.4
-
-0.0.3 / 2014-07-11
-==================
-
-  * deps: debug@1.0.3
-    - Add support for multiple wildcards in namespaces
-
-0.0.2 / 2014-06-19
-==================
-
-  * Handle invalid status codes
-
-0.0.1 / 2014-06-05
-==================
-
-  * deps: debug@1.0.2
-
-0.0.0 / 2014-06-05
-==================
-
-  * Extracted from connect/express
diff --git a/node_modules/finalhandler/LICENSE b/node_modules/finalhandler/LICENSE
deleted file mode 100644
index 60221067c4d591554407b4700033aab9669a9b0e..0000000000000000000000000000000000000000
--- a/node_modules/finalhandler/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014-2022 Douglas Christopher Wilson <doug@somethingdoug.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/finalhandler/README.md b/node_modules/finalhandler/README.md
deleted file mode 100644
index 6244a13eb656346f2ff668c4742aee06bed35a62..0000000000000000000000000000000000000000
--- a/node_modules/finalhandler/README.md
+++ /dev/null
@@ -1,147 +0,0 @@
-# finalhandler
-
-[![NPM Version][npm-image]][npm-url]
-[![NPM Downloads][downloads-image]][downloads-url]
-[![Node.js Version][node-image]][node-url]
-[![Build Status][github-actions-ci-image]][github-actions-ci-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-Node.js function to invoke as the final step to respond to HTTP request.
-
-## Installation
-
-This is a [Node.js](https://nodejs.org/en/) module available through the
-[npm registry](https://www.npmjs.com/). Installation is done using the
-[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
-
-```sh
-$ npm install finalhandler
-```
-
-## API
-
-```js
-var finalhandler = require('finalhandler')
-```
-
-### finalhandler(req, res, [options])
-
-Returns function to be invoked as the final step for the given `req` and `res`.
-This function is to be invoked as `fn(err)`. If `err` is falsy, the handler will
-write out a 404 response to the `res`. If it is truthy, an error response will
-be written out to the `res` or `res` will be terminated if a response has already
-started.
-
-When an error is written, the following information is added to the response:
-
-  * The `res.statusCode` is set from `err.status` (or `err.statusCode`). If
-    this value is outside the 4xx or 5xx range, it will be set to 500.
-  * The `res.statusMessage` is set according to the status code.
-  * The body will be the HTML of the status code message if `env` is
-    `'production'`, otherwise will be `err.stack`.
-  * Any headers specified in an `err.headers` object.
-
-The final handler will also unpipe anything from `req` when it is invoked.
-
-#### options.env
-
-By default, the environment is determined by `NODE_ENV` variable, but it can be
-overridden by this option.
-
-#### options.onerror
-
-Provide a function to be called with the `err` when it exists. Can be used for
-writing errors to a central location without excessive function generation. Called
-as `onerror(err, req, res)`.
-
-## Examples
-
-### always 404
-
-```js
-var finalhandler = require('finalhandler')
-var http = require('http')
-
-var server = http.createServer(function (req, res) {
-  var done = finalhandler(req, res)
-  done()
-})
-
-server.listen(3000)
-```
-
-### perform simple action
-
-```js
-var finalhandler = require('finalhandler')
-var fs = require('fs')
-var http = require('http')
-
-var server = http.createServer(function (req, res) {
-  var done = finalhandler(req, res)
-
-  fs.readFile('index.html', function (err, buf) {
-    if (err) return done(err)
-    res.setHeader('Content-Type', 'text/html')
-    res.end(buf)
-  })
-})
-
-server.listen(3000)
-```
-
-### use with middleware-style functions
-
-```js
-var finalhandler = require('finalhandler')
-var http = require('http')
-var serveStatic = require('serve-static')
-
-var serve = serveStatic('public')
-
-var server = http.createServer(function (req, res) {
-  var done = finalhandler(req, res)
-  serve(req, res, done)
-})
-
-server.listen(3000)
-```
-
-### keep log of all errors
-
-```js
-var finalhandler = require('finalhandler')
-var fs = require('fs')
-var http = require('http')
-
-var server = http.createServer(function (req, res) {
-  var done = finalhandler(req, res, { onerror: logerror })
-
-  fs.readFile('index.html', function (err, buf) {
-    if (err) return done(err)
-    res.setHeader('Content-Type', 'text/html')
-    res.end(buf)
-  })
-})
-
-server.listen(3000)
-
-function logerror (err) {
-  console.error(err.stack || err.toString())
-}
-```
-
-## License
-
-[MIT](LICENSE)
-
-[npm-image]: https://img.shields.io/npm/v/finalhandler.svg
-[npm-url]: https://npmjs.org/package/finalhandler
-[node-image]: https://img.shields.io/node/v/finalhandler.svg
-[node-url]: https://nodejs.org/en/download
-[coveralls-image]: https://img.shields.io/coveralls/pillarjs/finalhandler.svg
-[coveralls-url]: https://coveralls.io/r/pillarjs/finalhandler?branch=master
-[downloads-image]: https://img.shields.io/npm/dm/finalhandler.svg
-[downloads-url]: https://npmjs.org/package/finalhandler
-[github-actions-ci-image]: https://github.com/pillarjs/finalhandler/actions/workflows/ci.yml/badge.svg
-[github-actions-ci-url]: https://github.com/pillarjs/finalhandler/actions/workflows/ci.yml
diff --git a/node_modules/finalhandler/SECURITY.md b/node_modules/finalhandler/SECURITY.md
deleted file mode 100644
index 6e23249f5f93bb2bbe1cc15990d1f9c8975da269..0000000000000000000000000000000000000000
--- a/node_modules/finalhandler/SECURITY.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Security Policies and Procedures
-
-## Reporting a Bug
-
-The `finalhandler` team and community take all security bugs seriously. Thank
-you for improving the security of Express. We appreciate your efforts and
-responsible disclosure and will make every effort to acknowledge your
-contributions.
-
-Report security bugs by emailing the current owner(s) of `finalhandler`. This
-information can be found in the npm registry using the command
-`npm owner ls finalhandler`.
-If unsure or unable to get the information from the above, open an issue
-in the [project issue tracker](https://github.com/pillarjs/finalhandler/issues)
-asking for the current contact information.
-
-To ensure the timely response to your report, please ensure that the entirety
-of the report is contained within the email body and not solely behind a web
-link or an attachment.
-
-At least one owner will acknowledge your email within 48 hours, and will send a
-more detailed response within 48 hours indicating the next steps in handling
-your report. After the initial reply to your report, the owners will
-endeavor to keep you informed of the progress towards a fix and full
-announcement, and may ask for additional information or guidance.
diff --git a/node_modules/finalhandler/index.js b/node_modules/finalhandler/index.js
deleted file mode 100644
index ec34be90d153051156a8558c90f1564b84857d06..0000000000000000000000000000000000000000
--- a/node_modules/finalhandler/index.js
+++ /dev/null
@@ -1,341 +0,0 @@
-/*!
- * finalhandler
- * Copyright(c) 2014-2022 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module dependencies.
- * @private
- */
-
-var debug = require('debug')('finalhandler')
-var encodeUrl = require('encodeurl')
-var escapeHtml = require('escape-html')
-var onFinished = require('on-finished')
-var parseUrl = require('parseurl')
-var statuses = require('statuses')
-var unpipe = require('unpipe')
-
-/**
- * Module variables.
- * @private
- */
-
-var DOUBLE_SPACE_REGEXP = /\x20{2}/g
-var NEWLINE_REGEXP = /\n/g
-
-/* istanbul ignore next */
-var defer = typeof setImmediate === 'function'
-  ? setImmediate
-  : function (fn) { process.nextTick(fn.bind.apply(fn, arguments)) }
-var isFinished = onFinished.isFinished
-
-/**
- * Create a minimal HTML document.
- *
- * @param {string} message
- * @private
- */
-
-function createHtmlDocument (message) {
-  var body = escapeHtml(message)
-    .replace(NEWLINE_REGEXP, '<br>')
-    .replace(DOUBLE_SPACE_REGEXP, ' &nbsp;')
-
-  return '<!DOCTYPE html>\n' +
-    '<html lang="en">\n' +
-    '<head>\n' +
-    '<meta charset="utf-8">\n' +
-    '<title>Error</title>\n' +
-    '</head>\n' +
-    '<body>\n' +
-    '<pre>' + body + '</pre>\n' +
-    '</body>\n' +
-    '</html>\n'
-}
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = finalhandler
-
-/**
- * Create a function to handle the final response.
- *
- * @param {Request} req
- * @param {Response} res
- * @param {Object} [options]
- * @return {Function}
- * @public
- */
-
-function finalhandler (req, res, options) {
-  var opts = options || {}
-
-  // get environment
-  var env = opts.env || process.env.NODE_ENV || 'development'
-
-  // get error callback
-  var onerror = opts.onerror
-
-  return function (err) {
-    var headers
-    var msg
-    var status
-
-    // ignore 404 on in-flight response
-    if (!err && headersSent(res)) {
-      debug('cannot 404 after headers sent')
-      return
-    }
-
-    // unhandled error
-    if (err) {
-      // respect status code from error
-      status = getErrorStatusCode(err)
-
-      if (status === undefined) {
-        // fallback to status code on response
-        status = getResponseStatusCode(res)
-      } else {
-        // respect headers from error
-        headers = getErrorHeaders(err)
-      }
-
-      // get error message
-      msg = getErrorMessage(err, status, env)
-    } else {
-      // not found
-      status = 404
-      msg = 'Cannot ' + req.method + ' ' + encodeUrl(getResourceName(req))
-    }
-
-    debug('default %s', status)
-
-    // schedule onerror callback
-    if (err && onerror) {
-      defer(onerror, err, req, res)
-    }
-
-    // cannot actually respond
-    if (headersSent(res)) {
-      debug('cannot %d after headers sent', status)
-      if (req.socket) {
-        req.socket.destroy()
-      }
-      return
-    }
-
-    // send response
-    send(req, res, status, headers, msg)
-  }
-}
-
-/**
- * Get headers from Error object.
- *
- * @param {Error} err
- * @return {object}
- * @private
- */
-
-function getErrorHeaders (err) {
-  if (!err.headers || typeof err.headers !== 'object') {
-    return undefined
-  }
-
-  var headers = Object.create(null)
-  var keys = Object.keys(err.headers)
-
-  for (var i = 0; i < keys.length; i++) {
-    var key = keys[i]
-    headers[key] = err.headers[key]
-  }
-
-  return headers
-}
-
-/**
- * Get message from Error object, fallback to status message.
- *
- * @param {Error} err
- * @param {number} status
- * @param {string} env
- * @return {string}
- * @private
- */
-
-function getErrorMessage (err, status, env) {
-  var msg
-
-  if (env !== 'production') {
-    // use err.stack, which typically includes err.message
-    msg = err.stack
-
-    // fallback to err.toString() when possible
-    if (!msg && typeof err.toString === 'function') {
-      msg = err.toString()
-    }
-  }
-
-  return msg || statuses.message[status]
-}
-
-/**
- * Get status code from Error object.
- *
- * @param {Error} err
- * @return {number}
- * @private
- */
-
-function getErrorStatusCode (err) {
-  // check err.status
-  if (typeof err.status === 'number' && err.status >= 400 && err.status < 600) {
-    return err.status
-  }
-
-  // check err.statusCode
-  if (typeof err.statusCode === 'number' && err.statusCode >= 400 && err.statusCode < 600) {
-    return err.statusCode
-  }
-
-  return undefined
-}
-
-/**
- * Get resource name for the request.
- *
- * This is typically just the original pathname of the request
- * but will fallback to "resource" is that cannot be determined.
- *
- * @param {IncomingMessage} req
- * @return {string}
- * @private
- */
-
-function getResourceName (req) {
-  try {
-    return parseUrl.original(req).pathname
-  } catch (e) {
-    return 'resource'
-  }
-}
-
-/**
- * Get status code from response.
- *
- * @param {OutgoingMessage} res
- * @return {number}
- * @private
- */
-
-function getResponseStatusCode (res) {
-  var status = res.statusCode
-
-  // default status code to 500 if outside valid range
-  if (typeof status !== 'number' || status < 400 || status > 599) {
-    status = 500
-  }
-
-  return status
-}
-
-/**
- * Determine if the response headers have been sent.
- *
- * @param {object} res
- * @returns {boolean}
- * @private
- */
-
-function headersSent (res) {
-  return typeof res.headersSent !== 'boolean'
-    ? Boolean(res._header)
-    : res.headersSent
-}
-
-/**
- * Send response.
- *
- * @param {IncomingMessage} req
- * @param {OutgoingMessage} res
- * @param {number} status
- * @param {object} headers
- * @param {string} message
- * @private
- */
-
-function send (req, res, status, headers, message) {
-  function write () {
-    // response body
-    var body = createHtmlDocument(message)
-
-    // response status
-    res.statusCode = status
-
-    if (req.httpVersionMajor < 2) {
-      res.statusMessage = statuses.message[status]
-    }
-
-    // remove any content headers
-    res.removeHeader('Content-Encoding')
-    res.removeHeader('Content-Language')
-    res.removeHeader('Content-Range')
-
-    // response headers
-    setHeaders(res, headers)
-
-    // security headers
-    res.setHeader('Content-Security-Policy', "default-src 'none'")
-    res.setHeader('X-Content-Type-Options', 'nosniff')
-
-    // standard headers
-    res.setHeader('Content-Type', 'text/html; charset=utf-8')
-    res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8'))
-
-    if (req.method === 'HEAD') {
-      res.end()
-      return
-    }
-
-    res.end(body, 'utf8')
-  }
-
-  if (isFinished(req)) {
-    write()
-    return
-  }
-
-  // unpipe everything from the request
-  unpipe(req)
-
-  // flush the request
-  onFinished(req, write)
-  req.resume()
-}
-
-/**
- * Set response headers from an object.
- *
- * @param {OutgoingMessage} res
- * @param {object} headers
- * @private
- */
-
-function setHeaders (res, headers) {
-  if (!headers) {
-    return
-  }
-
-  var keys = Object.keys(headers)
-  for (var i = 0; i < keys.length; i++) {
-    var key = keys[i]
-    res.setHeader(key, headers[key])
-  }
-}
diff --git a/node_modules/finalhandler/package.json b/node_modules/finalhandler/package.json
deleted file mode 100644
index 2363eb4dac2f790aaa1ddfbaae88a3b964f72192..0000000000000000000000000000000000000000
--- a/node_modules/finalhandler/package.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "name": "finalhandler",
-  "description": "Node.js final http responder",
-  "version": "1.3.1",
-  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
-  "license": "MIT",
-  "repository": "pillarjs/finalhandler",
-  "dependencies": {
-    "debug": "2.6.9",
-    "encodeurl": "~2.0.0",
-    "escape-html": "~1.0.3",
-    "on-finished": "2.4.1",
-    "parseurl": "~1.3.3",
-    "statuses": "2.0.1",
-    "unpipe": "~1.0.0"
-  },
-  "devDependencies": {
-    "eslint": "7.32.0",
-    "eslint-config-standard": "14.1.1",
-    "eslint-plugin-import": "2.26.0",
-    "eslint-plugin-markdown": "2.2.1",
-    "eslint-plugin-node": "11.1.0",
-    "eslint-plugin-promise": "5.2.0",
-    "eslint-plugin-standard": "4.1.0",
-    "mocha": "10.0.0",
-    "nyc": "15.1.0",
-    "readable-stream": "2.3.6",
-    "safe-buffer": "5.2.1",
-    "supertest": "6.2.4"
-  },
-  "files": [
-    "LICENSE",
-    "HISTORY.md",
-    "SECURITY.md",
-    "index.js"
-  ],
-  "engines": {
-    "node": ">= 0.8"
-  },
-  "scripts": {
-    "lint": "eslint .",
-    "test": "mocha --reporter spec --check-leaks test/",
-    "test-ci": "nyc --reporter=lcovonly --reporter=text npm test",
-    "test-cov": "nyc --reporter=html --reporter=text npm test",
-    "test-inspect": "mocha --reporter spec --inspect --inspect-brk test/"
-  }
-}
diff --git a/node_modules/forwarded/HISTORY.md b/node_modules/forwarded/HISTORY.md
deleted file mode 100644
index 381e6aad4619cbed1e74bf64a0dc3fe216dc0abe..0000000000000000000000000000000000000000
--- a/node_modules/forwarded/HISTORY.md
+++ /dev/null
@@ -1,21 +0,0 @@
-0.2.0 / 2021-05-31
-==================
-
-  * Use `req.socket` over deprecated `req.connection`
-
-0.1.2 / 2017-09-14
-==================
-
-  * perf: improve header parsing
-  * perf: reduce overhead when no `X-Forwarded-For` header
-
-0.1.1 / 2017-09-10
-==================
-
-  * Fix trimming leading / trailing OWS
-  * perf: hoist regular expression
-
-0.1.0 / 2014-09-21
-==================
-
-  * Initial release
diff --git a/node_modules/forwarded/LICENSE b/node_modules/forwarded/LICENSE
deleted file mode 100644
index 84441fbb5709262c2bfc9b5ff0166ad4f024a1b8..0000000000000000000000000000000000000000
--- a/node_modules/forwarded/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014-2017 Douglas Christopher Wilson
-
-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/forwarded/README.md b/node_modules/forwarded/README.md
deleted file mode 100644
index fdd220bcaab88b00b844736404c326fa6bdfbc0e..0000000000000000000000000000000000000000
--- a/node_modules/forwarded/README.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# forwarded
-
-[![NPM Version][npm-image]][npm-url]
-[![NPM Downloads][downloads-image]][downloads-url]
-[![Node.js Version][node-version-image]][node-version-url]
-[![Build Status][ci-image]][ci-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-Parse HTTP X-Forwarded-For header
-
-## Installation
-
-This is a [Node.js](https://nodejs.org/en/) module available through the
-[npm registry](https://www.npmjs.com/). Installation is done using the
-[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
-
-```sh
-$ npm install forwarded
-```
-
-## API
-
-```js
-var forwarded = require('forwarded')
-```
-
-### forwarded(req)
-
-```js
-var addresses = forwarded(req)
-```
-
-Parse the `X-Forwarded-For` header from the request. Returns an array
-of the addresses, including the socket address for the `req`, in reverse
-order (i.e. index `0` is the socket address and the last index is the
-furthest address, typically the end-user).
-
-## Testing
-
-```sh
-$ npm test
-```
-
-## License
-
-[MIT](LICENSE)
-
-[ci-image]: https://badgen.net/github/checks/jshttp/forwarded/master?label=ci
-[ci-url]: https://github.com/jshttp/forwarded/actions?query=workflow%3Aci
-[npm-image]: https://img.shields.io/npm/v/forwarded.svg
-[npm-url]: https://npmjs.org/package/forwarded
-[node-version-image]: https://img.shields.io/node/v/forwarded.svg
-[node-version-url]: https://nodejs.org/en/download/
-[coveralls-image]: https://img.shields.io/coveralls/jshttp/forwarded/master.svg
-[coveralls-url]: https://coveralls.io/r/jshttp/forwarded?branch=master
-[downloads-image]: https://img.shields.io/npm/dm/forwarded.svg
-[downloads-url]: https://npmjs.org/package/forwarded
diff --git a/node_modules/forwarded/index.js b/node_modules/forwarded/index.js
deleted file mode 100644
index b2b6bdd3c98349ba48b5dc150e66746dab1beec1..0000000000000000000000000000000000000000
--- a/node_modules/forwarded/index.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/*!
- * forwarded
- * Copyright(c) 2014-2017 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = forwarded
-
-/**
- * Get all addresses in the request, using the `X-Forwarded-For` header.
- *
- * @param {object} req
- * @return {array}
- * @public
- */
-
-function forwarded (req) {
-  if (!req) {
-    throw new TypeError('argument req is required')
-  }
-
-  // simple header parsing
-  var proxyAddrs = parse(req.headers['x-forwarded-for'] || '')
-  var socketAddr = getSocketAddr(req)
-  var addrs = [socketAddr].concat(proxyAddrs)
-
-  // return all addresses
-  return addrs
-}
-
-/**
- * Get the socket address for a request.
- *
- * @param {object} req
- * @return {string}
- * @private
- */
-
-function getSocketAddr (req) {
-  return req.socket
-    ? req.socket.remoteAddress
-    : req.connection.remoteAddress
-}
-
-/**
- * Parse the X-Forwarded-For header.
- *
- * @param {string} header
- * @private
- */
-
-function parse (header) {
-  var end = header.length
-  var list = []
-  var start = header.length
-
-  // gather addresses, backwards
-  for (var i = header.length - 1; i >= 0; i--) {
-    switch (header.charCodeAt(i)) {
-      case 0x20: /*   */
-        if (start === end) {
-          start = end = i
-        }
-        break
-      case 0x2c: /* , */
-        if (start !== end) {
-          list.push(header.substring(start, end))
-        }
-        start = end = i
-        break
-      default:
-        start = i
-        break
-    }
-  }
-
-  // final address
-  if (start !== end) {
-    list.push(header.substring(start, end))
-  }
-
-  return list
-}
diff --git a/node_modules/forwarded/package.json b/node_modules/forwarded/package.json
deleted file mode 100644
index bf9c7d6550b4efceee2f6f55350860097b218a0a..0000000000000000000000000000000000000000
--- a/node_modules/forwarded/package.json
+++ /dev/null
@@ -1,45 +0,0 @@
-{
-  "name": "forwarded",
-  "description": "Parse HTTP X-Forwarded-For header",
-  "version": "0.2.0",
-  "contributors": [
-    "Douglas Christopher Wilson <doug@somethingdoug.com>"
-  ],
-  "license": "MIT",
-  "keywords": [
-    "x-forwarded-for",
-    "http",
-    "req"
-  ],
-  "repository": "jshttp/forwarded",
-  "devDependencies": {
-    "beautify-benchmark": "0.2.4",
-    "benchmark": "2.1.4",
-    "deep-equal": "1.0.1",
-    "eslint": "7.27.0",
-    "eslint-config-standard": "14.1.1",
-    "eslint-plugin-import": "2.23.4",
-    "eslint-plugin-node": "11.1.0",
-    "eslint-plugin-promise": "4.3.1",
-    "eslint-plugin-standard": "4.1.0",
-    "mocha": "8.4.0",
-    "nyc": "15.1.0"
-  },
-  "files": [
-    "LICENSE",
-    "HISTORY.md",
-    "README.md",
-    "index.js"
-  ],
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "scripts": {
-    "bench": "node benchmark/index.js",
-    "lint": "eslint .",
-    "test": "mocha --reporter spec --bail --check-leaks test/",
-    "test-ci": "nyc --reporter=lcov --reporter=text npm test",
-    "test-cov": "nyc --reporter=html --reporter=text npm test",
-    "version": "node scripts/version-history.js && git add HISTORY.md"
-  }
-}
diff --git a/node_modules/fresh/HISTORY.md b/node_modules/fresh/HISTORY.md
deleted file mode 100644
index 4586996a3c6e13633a678339ff6075c60567c233..0000000000000000000000000000000000000000
--- a/node_modules/fresh/HISTORY.md
+++ /dev/null
@@ -1,70 +0,0 @@
-0.5.2 / 2017-09-13
-==================
-
-  * Fix regression matching multiple ETags in `If-None-Match`
-  * perf: improve `If-None-Match` token parsing
-
-0.5.1 / 2017-09-11
-==================
-
-  * Fix handling of modified headers with invalid dates
-  * perf: improve ETag match loop
-
-0.5.0 / 2017-02-21
-==================
-
-  * Fix incorrect result when `If-None-Match` has both `*` and ETags
-  * Fix weak `ETag` matching to match spec
-  * perf: delay reading header values until needed
-  * perf: skip checking modified time if ETag check failed
-  * perf: skip parsing `If-None-Match` when no `ETag` header
-  * perf: use `Date.parse` instead of `new Date`
-
-0.4.0 / 2017-02-05
-==================
-
-  * Fix false detection of `no-cache` request directive
-  * perf: enable strict mode
-  * perf: hoist regular expressions
-  * perf: remove duplicate conditional
-  * perf: remove unnecessary boolean coercions
-
-0.3.0 / 2015-05-12
-==================
-
-  * Add weak `ETag` matching support
-
-0.2.4 / 2014-09-07
-==================
-
-  * Support Node.js 0.6
-
-0.2.3 / 2014-09-07
-==================
-
-  * Move repository to jshttp
-
-0.2.2 / 2014-02-19
-==================
-
-  * Revert "Fix for blank page on Safari reload"
-
-0.2.1 / 2014-01-29
-==================
-
-  * Fix for blank page on Safari reload
-
-0.2.0 / 2013-08-11
-==================
-
-  * Return stale for `Cache-Control: no-cache`
-
-0.1.0 / 2012-06-15
-==================
-
-  * Add `If-None-Match: *` support
-
-0.0.1 / 2012-06-10
-==================
-
-  * Initial release
diff --git a/node_modules/fresh/LICENSE b/node_modules/fresh/LICENSE
deleted file mode 100644
index 1434ade75d1fc4faf25a6ac5daed813e12eaed28..0000000000000000000000000000000000000000
--- a/node_modules/fresh/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>
-Copyright (c) 2016-2017 Douglas Christopher Wilson <doug@somethingdoug.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/fresh/README.md b/node_modules/fresh/README.md
deleted file mode 100644
index 1c1c680d151e5a64ab39cb88afc4600f554f00d5..0000000000000000000000000000000000000000
--- a/node_modules/fresh/README.md
+++ /dev/null
@@ -1,119 +0,0 @@
-# fresh
-
-[![NPM Version][npm-image]][npm-url]
-[![NPM Downloads][downloads-image]][downloads-url]
-[![Node.js Version][node-version-image]][node-version-url]
-[![Build Status][travis-image]][travis-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-HTTP response freshness testing
-
-## Installation
-
-This is a [Node.js](https://nodejs.org/en/) module available through the
-[npm registry](https://www.npmjs.com/). Installation is done using the
-[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
-
-```
-$ npm install fresh
-```
-
-## API
-
-<!-- eslint-disable no-unused-vars -->
-
-```js
-var fresh = require('fresh')
-```
-
-### fresh(reqHeaders, resHeaders)
-
-Check freshness of the response using request and response headers.
-
-When the response is still "fresh" in the client's cache `true` is
-returned, otherwise `false` is returned to indicate that the client
-cache is now stale and the full response should be sent.
-
-When a client sends the `Cache-Control: no-cache` request header to
-indicate an end-to-end reload request, this module will return `false`
-to make handling these requests transparent.
-
-## Known Issues
-
-This module is designed to only follow the HTTP specifications, not
-to work-around all kinda of client bugs (especially since this module
-typically does not recieve enough information to understand what the
-client actually is).
-
-There is a known issue that in certain versions of Safari, Safari
-will incorrectly make a request that allows this module to validate
-freshness of the resource even when Safari does not have a
-representation of the resource in the cache. The module
-[jumanji](https://www.npmjs.com/package/jumanji) can be used in
-an Express application to work-around this issue and also provides
-links to further reading on this Safari bug.
-
-## Example
-
-### API usage
-
-<!-- eslint-disable no-redeclare, no-undef -->
-
-```js
-var reqHeaders = { 'if-none-match': '"foo"' }
-var resHeaders = { 'etag': '"bar"' }
-fresh(reqHeaders, resHeaders)
-// => false
-
-var reqHeaders = { 'if-none-match': '"foo"' }
-var resHeaders = { 'etag': '"foo"' }
-fresh(reqHeaders, resHeaders)
-// => true
-```
-
-### Using with Node.js http server
-
-```js
-var fresh = require('fresh')
-var http = require('http')
-
-var server = http.createServer(function (req, res) {
-  // perform server logic
-  // ... including adding ETag / Last-Modified response headers
-
-  if (isFresh(req, res)) {
-    // client has a fresh copy of resource
-    res.statusCode = 304
-    res.end()
-    return
-  }
-
-  // send the resource
-  res.statusCode = 200
-  res.end('hello, world!')
-})
-
-function isFresh (req, res) {
-  return fresh(req.headers, {
-    'etag': res.getHeader('ETag'),
-    'last-modified': res.getHeader('Last-Modified')
-  })
-}
-
-server.listen(3000)
-```
-
-## License
-
-[MIT](LICENSE)
-
-[npm-image]: https://img.shields.io/npm/v/fresh.svg
-[npm-url]: https://npmjs.org/package/fresh
-[node-version-image]: https://img.shields.io/node/v/fresh.svg
-[node-version-url]: https://nodejs.org/en/
-[travis-image]: https://img.shields.io/travis/jshttp/fresh/master.svg
-[travis-url]: https://travis-ci.org/jshttp/fresh
-[coveralls-image]: https://img.shields.io/coveralls/jshttp/fresh/master.svg
-[coveralls-url]: https://coveralls.io/r/jshttp/fresh?branch=master
-[downloads-image]: https://img.shields.io/npm/dm/fresh.svg
-[downloads-url]: https://npmjs.org/package/fresh
diff --git a/node_modules/fresh/index.js b/node_modules/fresh/index.js
deleted file mode 100644
index d154f5a7d23975af101646b65e74abf8490f50a5..0000000000000000000000000000000000000000
--- a/node_modules/fresh/index.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/*!
- * fresh
- * Copyright(c) 2012 TJ Holowaychuk
- * Copyright(c) 2016-2017 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * RegExp to check for no-cache token in Cache-Control.
- * @private
- */
-
-var CACHE_CONTROL_NO_CACHE_REGEXP = /(?:^|,)\s*?no-cache\s*?(?:,|$)/
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = fresh
-
-/**
- * Check freshness of the response using request and response headers.
- *
- * @param {Object} reqHeaders
- * @param {Object} resHeaders
- * @return {Boolean}
- * @public
- */
-
-function fresh (reqHeaders, resHeaders) {
-  // fields
-  var modifiedSince = reqHeaders['if-modified-since']
-  var noneMatch = reqHeaders['if-none-match']
-
-  // unconditional request
-  if (!modifiedSince && !noneMatch) {
-    return false
-  }
-
-  // Always return stale when Cache-Control: no-cache
-  // to support end-to-end reload requests
-  // https://tools.ietf.org/html/rfc2616#section-14.9.4
-  var cacheControl = reqHeaders['cache-control']
-  if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl)) {
-    return false
-  }
-
-  // if-none-match
-  if (noneMatch && noneMatch !== '*') {
-    var etag = resHeaders['etag']
-
-    if (!etag) {
-      return false
-    }
-
-    var etagStale = true
-    var matches = parseTokenList(noneMatch)
-    for (var i = 0; i < matches.length; i++) {
-      var match = matches[i]
-      if (match === etag || match === 'W/' + etag || 'W/' + match === etag) {
-        etagStale = false
-        break
-      }
-    }
-
-    if (etagStale) {
-      return false
-    }
-  }
-
-  // if-modified-since
-  if (modifiedSince) {
-    var lastModified = resHeaders['last-modified']
-    var modifiedStale = !lastModified || !(parseHttpDate(lastModified) <= parseHttpDate(modifiedSince))
-
-    if (modifiedStale) {
-      return false
-    }
-  }
-
-  return true
-}
-
-/**
- * Parse an HTTP Date into a number.
- *
- * @param {string} date
- * @private
- */
-
-function parseHttpDate (date) {
-  var timestamp = date && Date.parse(date)
-
-  // istanbul ignore next: guard against date.js Date.parse patching
-  return typeof timestamp === 'number'
-    ? timestamp
-    : NaN
-}
-
-/**
- * Parse a HTTP token list.
- *
- * @param {string} str
- * @private
- */
-
-function parseTokenList (str) {
-  var end = 0
-  var list = []
-  var start = 0
-
-  // gather tokens
-  for (var i = 0, len = str.length; i < len; i++) {
-    switch (str.charCodeAt(i)) {
-      case 0x20: /*   */
-        if (start === end) {
-          start = end = i + 1
-        }
-        break
-      case 0x2c: /* , */
-        list.push(str.substring(start, end))
-        start = end = i + 1
-        break
-      default:
-        end = i + 1
-        break
-    }
-  }
-
-  // final token
-  list.push(str.substring(start, end))
-
-  return list
-}
diff --git a/node_modules/fresh/package.json b/node_modules/fresh/package.json
deleted file mode 100644
index c2fa0f4870b44895b8d59f1de9d14da0319f5793..0000000000000000000000000000000000000000
--- a/node_modules/fresh/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "name": "fresh",
-  "description": "HTTP response freshness testing",
-  "version": "0.5.2",
-  "author": "TJ Holowaychuk <tj@vision-media.ca> (http://tjholowaychuk.com)",
-  "contributors": [
-    "Douglas Christopher Wilson <doug@somethingdoug.com>",
-    "Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"
-  ],
-  "license": "MIT",
-  "keywords": [
-    "fresh",
-    "http",
-    "conditional",
-    "cache"
-  ],
-  "repository": "jshttp/fresh",
-  "devDependencies": {
-    "beautify-benchmark": "0.2.4",
-    "benchmark": "2.1.4",
-    "eslint": "3.19.0",
-    "eslint-config-standard": "10.2.1",
-    "eslint-plugin-import": "2.7.0",
-    "eslint-plugin-markdown": "1.0.0-beta.6",
-    "eslint-plugin-node": "5.1.1",
-    "eslint-plugin-promise": "3.5.0",
-    "eslint-plugin-standard": "3.0.1",
-    "istanbul": "0.4.5",
-    "mocha": "1.21.5"
-  },
-  "files": [
-    "HISTORY.md",
-    "LICENSE",
-    "index.js"
-  ],
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "scripts": {
-    "bench": "node benchmark/index.js",
-    "lint": "eslint --plugin markdown --ext js,md .",
-    "test": "mocha --reporter spec --bail --check-leaks test/",
-    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
-    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/"
-  }
-}
diff --git a/node_modules/glob-parent/CHANGELOG.md b/node_modules/glob-parent/CHANGELOG.md
deleted file mode 100644
index fb9de9618b9dd9a7e239c148fc60a55197ab8f6a..0000000000000000000000000000000000000000
--- a/node_modules/glob-parent/CHANGELOG.md
+++ /dev/null
@@ -1,110 +0,0 @@
-### [5.1.2](https://github.com/gulpjs/glob-parent/compare/v5.1.1...v5.1.2) (2021-03-06)
-
-
-### Bug Fixes
-
-* eliminate ReDoS ([#36](https://github.com/gulpjs/glob-parent/issues/36)) ([f923116](https://github.com/gulpjs/glob-parent/commit/f9231168b0041fea3f8f954b3cceb56269fc6366))
-
-### [5.1.1](https://github.com/gulpjs/glob-parent/compare/v5.1.0...v5.1.1) (2021-01-27)
-
-
-### Bug Fixes
-
-* unescape exclamation mark ([#26](https://github.com/gulpjs/glob-parent/issues/26)) ([a98874f](https://github.com/gulpjs/glob-parent/commit/a98874f1a59e407f4fb1beb0db4efa8392da60bb))
-
-## [5.1.0](https://github.com/gulpjs/glob-parent/compare/v5.0.0...v5.1.0) (2021-01-27)
-
-
-### Features
-
-* add `flipBackslashes` option to disable auto conversion of slashes (closes [#24](https://github.com/gulpjs/glob-parent/issues/24)) ([#25](https://github.com/gulpjs/glob-parent/issues/25)) ([eecf91d](https://github.com/gulpjs/glob-parent/commit/eecf91d5e3834ed78aee39c4eaaae654d76b87b3))
-
-## [5.0.0](https://github.com/gulpjs/glob-parent/compare/v4.0.0...v5.0.0) (2021-01-27)
-
-
-### ⚠ BREAKING CHANGES
-
-* Drop support for node <6 & bump dependencies
-
-### Miscellaneous Chores
-
-* Drop support for node <6 & bump dependencies ([896c0c0](https://github.com/gulpjs/glob-parent/commit/896c0c00b4e7362f60b96e7fc295ae929245255a))
-
-## [4.0.0](https://github.com/gulpjs/glob-parent/compare/v3.1.0...v4.0.0) (2021-01-27)
-
-
-### ⚠ BREAKING CHANGES
-
-* question marks are valid path characters on Windows so avoid flagging as a glob when alone
-* Update is-glob dependency
-
-### Features
-
-* hoist regexps and strings for performance gains ([4a80667](https://github.com/gulpjs/glob-parent/commit/4a80667c69355c76a572a5892b0f133c8e1f457e))
-* question marks are valid path characters on Windows so avoid flagging as a glob when alone ([2a551dd](https://github.com/gulpjs/glob-parent/commit/2a551dd0dc3235e78bf3c94843d4107072d17841))
-* Update is-glob dependency ([e41fcd8](https://github.com/gulpjs/glob-parent/commit/e41fcd895d1f7bc617dba45c9d935a7949b9c281))
-
-## [3.1.0](https://github.com/gulpjs/glob-parent/compare/v3.0.1...v3.1.0) (2021-01-27)
-
-
-### Features
-
-* allow basic win32 backslash use ([272afa5](https://github.com/gulpjs/glob-parent/commit/272afa5fd070fc0f796386a5993d4ee4a846988b))
-* handle extglobs (parentheses) containing separators ([7db1bdb](https://github.com/gulpjs/glob-parent/commit/7db1bdb0756e55fd14619e8ce31aa31b17b117fd))
-* new approach to braces/brackets handling ([8269bd8](https://github.com/gulpjs/glob-parent/commit/8269bd89290d99fac9395a354fb56fdcdb80f0be))
-* pre-process braces/brackets sections ([9ef8a87](https://github.com/gulpjs/glob-parent/commit/9ef8a87f66b1a43d0591e7a8e4fc5a18415ee388))
-* preserve escaped brace/bracket at end of string ([8cfb0ba](https://github.com/gulpjs/glob-parent/commit/8cfb0ba84202d51571340dcbaf61b79d16a26c76))
-
-
-### Bug Fixes
-
-* trailing escaped square brackets ([99ec9fe](https://github.com/gulpjs/glob-parent/commit/99ec9fecc60ee488ded20a94dd4f18b4f55c4ccf))
-
-### [3.0.1](https://github.com/gulpjs/glob-parent/compare/v3.0.0...v3.0.1) (2021-01-27)
-
-
-### Features
-
-* use path-dirname ponyfill ([cdbea5f](https://github.com/gulpjs/glob-parent/commit/cdbea5f32a58a54e001a75ddd7c0fccd4776aacc))
-
-
-### Bug Fixes
-
-* unescape glob-escaped dirnames on output ([598c533](https://github.com/gulpjs/glob-parent/commit/598c533bdf49c1428bc063aa9b8db40c5a86b030))
-
-## [3.0.0](https://github.com/gulpjs/glob-parent/compare/v2.0.0...v3.0.0) (2021-01-27)
-
-
-### ⚠ BREAKING CHANGES
-
-* update is-glob dependency
-
-### Features
-
-* update is-glob dependency ([5c5f8ef](https://github.com/gulpjs/glob-parent/commit/5c5f8efcee362a8e7638cf8220666acd8784f6bd))
-
-## [2.0.0](https://github.com/gulpjs/glob-parent/compare/v1.3.0...v2.0.0) (2021-01-27)
-
-
-### Features
-
-* move up to dirname regardless of glob characters ([f97fb83](https://github.com/gulpjs/glob-parent/commit/f97fb83be2e0a9fc8d3b760e789d2ecadd6aa0c2))
-
-## [1.3.0](https://github.com/gulpjs/glob-parent/compare/v1.2.0...v1.3.0) (2021-01-27)
-
-## [1.2.0](https://github.com/gulpjs/glob-parent/compare/v1.1.0...v1.2.0) (2021-01-27)
-
-
-### Reverts
-
-* feat: make regex test strings smaller ([dc80fa9](https://github.com/gulpjs/glob-parent/commit/dc80fa9658dca20549cfeba44bbd37d5246fcce0))
-
-## [1.1.0](https://github.com/gulpjs/glob-parent/compare/v1.0.0...v1.1.0) (2021-01-27)
-
-
-### Features
-
-* make regex test strings smaller ([cd83220](https://github.com/gulpjs/glob-parent/commit/cd832208638f45169f986d80fcf66e401f35d233))
-
-## 1.0.0 (2021-01-27)
-
diff --git a/node_modules/glob-parent/LICENSE b/node_modules/glob-parent/LICENSE
deleted file mode 100644
index 63222d7a8f9f5cd8bf912764cc10b6b51a5940ae..0000000000000000000000000000000000000000
--- a/node_modules/glob-parent/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) 2015, 2019 Elan Shanker
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/glob-parent/README.md b/node_modules/glob-parent/README.md
deleted file mode 100644
index 36a279384b14a8ea5b723b1d952c283a109f690e..0000000000000000000000000000000000000000
--- a/node_modules/glob-parent/README.md
+++ /dev/null
@@ -1,137 +0,0 @@
-<p align="center">
-  <a href="https://gulpjs.com">
-    <img height="257" width="114" src="https://raw.githubusercontent.com/gulpjs/artwork/master/gulp-2x.png">
-  </a>
-</p>
-
-# glob-parent
-
-[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Azure Pipelines Build Status][azure-pipelines-image]][azure-pipelines-url] [![Travis Build Status][travis-image]][travis-url] [![AppVeyor Build Status][appveyor-image]][appveyor-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url]
-
-Extract the non-magic parent path from a glob string.
-
-## Usage
-
-```js
-var globParent = require('glob-parent');
-
-globParent('path/to/*.js'); // 'path/to'
-globParent('/root/path/to/*.js'); // '/root/path/to'
-globParent('/*.js'); // '/'
-globParent('*.js'); // '.'
-globParent('**/*.js'); // '.'
-globParent('path/{to,from}'); // 'path'
-globParent('path/!(to|from)'); // 'path'
-globParent('path/?(to|from)'); // 'path'
-globParent('path/+(to|from)'); // 'path'
-globParent('path/*(to|from)'); // 'path'
-globParent('path/@(to|from)'); // 'path'
-globParent('path/**/*'); // 'path'
-
-// if provided a non-glob path, returns the nearest dir
-globParent('path/foo/bar.js'); // 'path/foo'
-globParent('path/foo/'); // 'path/foo'
-globParent('path/foo'); // 'path' (see issue #3 for details)
-```
-
-## API
-
-### `globParent(maybeGlobString, [options])`
-
-Takes a string and returns the part of the path before the glob begins. Be aware of Escaping rules and Limitations below.
-
-#### options
-
-```js
-{
-  // Disables the automatic conversion of slashes for Windows
-  flipBackslashes: true
-}
-```
-
-## Escaping
-
-The following characters have special significance in glob patterns and must be escaped if you want them to be treated as regular path characters:
-
-- `?` (question mark) unless used as a path segment alone
-- `*` (asterisk)
-- `|` (pipe)
-- `(` (opening parenthesis)
-- `)` (closing parenthesis)
-- `{` (opening curly brace)
-- `}` (closing curly brace)
-- `[` (opening bracket)
-- `]` (closing bracket)
-
-**Example**
-
-```js
-globParent('foo/[bar]/') // 'foo'
-globParent('foo/\\[bar]/') // 'foo/[bar]'
-```
-
-## Limitations
-
-### Braces & Brackets
-This library attempts a quick and imperfect method of determining which path
-parts have glob magic without fully parsing/lexing the pattern. There are some
-advanced use cases that can trip it up, such as nested braces where the outer
-pair is escaped and the inner one contains a path separator. If you find
-yourself in the unlikely circumstance of being affected by this or need to
-ensure higher-fidelity glob handling in your library, it is recommended that you
-pre-process your input with [expand-braces] and/or [expand-brackets].
-
-### Windows
-Backslashes are not valid path separators for globs. If a path with backslashes
-is provided anyway, for simple cases, glob-parent will replace the path
-separator for you and return the non-glob parent path (now with
-forward-slashes, which are still valid as Windows path separators).
-
-This cannot be used in conjunction with escape characters.
-
-```js
-// BAD
-globParent('C:\\Program Files \\(x86\\)\\*.ext') // 'C:/Program Files /(x86/)'
-
-// GOOD
-globParent('C:/Program Files\\(x86\\)/*.ext') // 'C:/Program Files (x86)'
-```
-
-If you are using escape characters for a pattern without path parts (i.e.
-relative to `cwd`), prefix with `./` to avoid confusing glob-parent.
-
-```js
-// BAD
-globParent('foo \\[bar]') // 'foo '
-globParent('foo \\[bar]*') // 'foo '
-
-// GOOD
-globParent('./foo \\[bar]') // 'foo [bar]'
-globParent('./foo \\[bar]*') // '.'
-```
-
-## License
-
-ISC
-
-[expand-braces]: https://github.com/jonschlinkert/expand-braces
-[expand-brackets]: https://github.com/jonschlinkert/expand-brackets
-
-[downloads-image]: https://img.shields.io/npm/dm/glob-parent.svg
-[npm-url]: https://www.npmjs.com/package/glob-parent
-[npm-image]: https://img.shields.io/npm/v/glob-parent.svg
-
-[azure-pipelines-url]: https://dev.azure.com/gulpjs/gulp/_build/latest?definitionId=2&branchName=master
-[azure-pipelines-image]: https://dev.azure.com/gulpjs/gulp/_apis/build/status/glob-parent?branchName=master
-
-[travis-url]: https://travis-ci.org/gulpjs/glob-parent
-[travis-image]: https://img.shields.io/travis/gulpjs/glob-parent.svg?label=travis-ci
-
-[appveyor-url]: https://ci.appveyor.com/project/gulpjs/glob-parent
-[appveyor-image]: https://img.shields.io/appveyor/ci/gulpjs/glob-parent.svg?label=appveyor
-
-[coveralls-url]: https://coveralls.io/r/gulpjs/glob-parent
-[coveralls-image]: https://img.shields.io/coveralls/gulpjs/glob-parent/master.svg
-
-[gitter-url]: https://gitter.im/gulpjs/gulp
-[gitter-image]: https://badges.gitter.im/gulpjs/gulp.svg
diff --git a/node_modules/glob-parent/index.js b/node_modules/glob-parent/index.js
deleted file mode 100644
index 09e257ea306cd41c63cc1a59a86653d098bda0f9..0000000000000000000000000000000000000000
--- a/node_modules/glob-parent/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-'use strict';
-
-var isGlob = require('is-glob');
-var pathPosixDirname = require('path').posix.dirname;
-var isWin32 = require('os').platform() === 'win32';
-
-var slash = '/';
-var backslash = /\\/g;
-var enclosure = /[\{\[].*[\}\]]$/;
-var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/;
-var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g;
-
-/**
- * @param {string} str
- * @param {Object} opts
- * @param {boolean} [opts.flipBackslashes=true]
- * @returns {string}
- */
-module.exports = function globParent(str, opts) {
-  var options = Object.assign({ flipBackslashes: true }, opts);
-
-  // flip windows path separators
-  if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) {
-    str = str.replace(backslash, slash);
-  }
-
-  // special case for strings ending in enclosure containing path separator
-  if (enclosure.test(str)) {
-    str += slash;
-  }
-
-  // preserves full path in case of trailing path separator
-  str += 'a';
-
-  // remove path parts that are globby
-  do {
-    str = pathPosixDirname(str);
-  } while (isGlob(str) || globby.test(str));
-
-  // remove escape chars and return result
-  return str.replace(escaped, '$1');
-};
diff --git a/node_modules/glob-parent/package.json b/node_modules/glob-parent/package.json
deleted file mode 100644
index 125c971c2701983e5569b097af23dc98a29525ff..0000000000000000000000000000000000000000
--- a/node_modules/glob-parent/package.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
-  "name": "glob-parent",
-  "version": "5.1.2",
-  "description": "Extract the non-magic parent path from a glob string.",
-  "author": "Gulp Team <team@gulpjs.com> (https://gulpjs.com/)",
-  "contributors": [
-    "Elan Shanker (https://github.com/es128)",
-    "Blaine Bublitz <blaine.bublitz@gmail.com>"
-  ],
-  "repository": "gulpjs/glob-parent",
-  "license": "ISC",
-  "engines": {
-    "node": ">= 6"
-  },
-  "main": "index.js",
-  "files": [
-    "LICENSE",
-    "index.js"
-  ],
-  "scripts": {
-    "lint": "eslint .",
-    "pretest": "npm run lint",
-    "test": "nyc mocha --async-only",
-    "azure-pipelines": "nyc mocha --async-only --reporter xunit -O output=test.xunit",
-    "coveralls": "nyc report --reporter=text-lcov | coveralls"
-  },
-  "dependencies": {
-    "is-glob": "^4.0.1"
-  },
-  "devDependencies": {
-    "coveralls": "^3.0.11",
-    "eslint": "^2.13.1",
-    "eslint-config-gulp": "^3.0.1",
-    "expect": "^1.20.2",
-    "mocha": "^6.0.2",
-    "nyc": "^13.3.0"
-  },
-  "keywords": [
-    "glob",
-    "parent",
-    "strip",
-    "path",
-    "dirname",
-    "directory",
-    "base",
-    "wildcard"
-  ]
-}
diff --git a/node_modules/ignore-by-default/LICENSE b/node_modules/ignore-by-default/LICENSE
deleted file mode 100644
index ee1e367897fb23db63bccadd30f413c1eb957634..0000000000000000000000000000000000000000
--- a/node_modules/ignore-by-default/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-ISC License (ISC)
-Copyright (c) 2016, Mark Wubben
-
-Permission to use, copy, modify, and/or distribute this software for any purpose
-with or without fee is hereby granted, provided that the above copyright notice
-and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
-THIS SOFTWARE.
diff --git a/node_modules/ignore-by-default/README.md b/node_modules/ignore-by-default/README.md
deleted file mode 100644
index ee7719119afd01fae8a44ce7d6ffd24c8b1e9ca0..0000000000000000000000000000000000000000
--- a/node_modules/ignore-by-default/README.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# ignore-by-default
-
-This is a package aimed at Node.js development tools. It provides a list of
-directories that should probably be ignored by such tools, e.g. when watching
-for file changes.
-
-It's used by [AVA](https://www.npmjs.com/package/ava) and
-[nodemon](https://www.npmjs.com/package/nodemon).
-
-[Please contribute!](./CONTRIBUTING.md)
-
-## Installation
-
-```
-npm install --save ignore-by-default
-```
-
-## Usage
-
-The `ignore-by-default` module exports a `directories()` function, which will
-return an array of directory names. These are the ones you should ignore.
-
-```js
-// ['.git', '.sass_cache', …]
-var ignoredDirectories = require('ignore-by-default').directories()
-```
diff --git a/node_modules/ignore-by-default/index.js b/node_modules/ignore-by-default/index.js
deleted file mode 100644
index c65857da5045684fdf29413d2f18b9bda62b0cb3..0000000000000000000000000000000000000000
--- a/node_modules/ignore-by-default/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict'
-
-exports.directories = function () {
-  return [
-    '.git', // Git repository files, see <https://git-scm.com/>
-    '.nyc_output', // Temporary directory where nyc stores coverage data, see <https://github.com/bcoe/nyc>
-    '.sass-cache', // Cache folder for node-sass, see <https://github.com/sass/node-sass>
-    'bower_components', // Where Bower packages are installed, see <http://bower.io/>
-    'coverage', // Standard output directory for code coverage reports, see <https://github.com/gotwarlost/istanbul>
-    'node_modules' // Where Node modules are installed, see <https://nodejs.org/>
-  ]
-}
diff --git a/node_modules/ignore-by-default/package.json b/node_modules/ignore-by-default/package.json
deleted file mode 100644
index 38e0d2b4a1b15f6f467435b936dadbe1eab70960..0000000000000000000000000000000000000000
--- a/node_modules/ignore-by-default/package.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "name": "ignore-by-default",
-  "version": "1.0.1",
-  "description": "A list of directories you should ignore by default",
-  "main": "index.js",
-  "files": [
-    "index.js"
-  ],
-  "scripts": {
-    "test": "standard && node test.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/novemberborn/ignore-by-default.git"
-  },
-  "keywords": [
-    "ignore",
-    "chokidar",
-    "watcher",
-    "exclude",
-    "glob",
-    "pattern"
-  ],
-  "author": "Mark Wubben (https://novemberborn.net/)",
-  "license": "ISC",
-  "bugs": {
-    "url": "https://github.com/novemberborn/ignore-by-default/issues"
-  },
-  "homepage": "https://github.com/novemberborn/ignore-by-default#readme",
-  "devDependencies": {
-    "figures": "^1.4.0",
-    "standard": "^6.0.4"
-  }
-}
diff --git a/node_modules/ipaddr.js/LICENSE b/node_modules/ipaddr.js/LICENSE
deleted file mode 100644
index f6b37b52dec6faa7f48b9d1be5da2ad9b883be2f..0000000000000000000000000000000000000000
--- a/node_modules/ipaddr.js/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2011-2017 whitequark <whitequark@whitequark.org>
-
-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/ipaddr.js/README.md b/node_modules/ipaddr.js/README.md
deleted file mode 100644
index f57725b0fed3b74b2ed13d99c0fe8ee65ab29f3c..0000000000000000000000000000000000000000
--- a/node_modules/ipaddr.js/README.md
+++ /dev/null
@@ -1,233 +0,0 @@
-# ipaddr.js — an IPv6 and IPv4 address manipulation library [![Build Status](https://travis-ci.org/whitequark/ipaddr.js.svg)](https://travis-ci.org/whitequark/ipaddr.js)
-
-ipaddr.js is a small (1.9K minified and gzipped) library for manipulating
-IP addresses in JavaScript environments. It runs on both CommonJS runtimes
-(e.g. [nodejs]) and in a web browser.
-
-ipaddr.js allows you to verify and parse string representation of an IP
-address, match it against a CIDR range or range list, determine if it falls
-into some reserved ranges (examples include loopback and private ranges),
-and convert between IPv4 and IPv4-mapped IPv6 addresses.
-
-[nodejs]: http://nodejs.org
-
-## Installation
-
-`npm install ipaddr.js`
-
-or
-
-`bower install ipaddr.js`
-
-## API
-
-ipaddr.js defines one object in the global scope: `ipaddr`. In CommonJS,
-it is exported from the module:
-
-```js
-var ipaddr = require('ipaddr.js');
-```
-
-The API consists of several global methods and two classes: ipaddr.IPv6 and ipaddr.IPv4.
-
-### Global methods
-
-There are three global methods defined: `ipaddr.isValid`, `ipaddr.parse` and
-`ipaddr.process`. All of them receive a string as a single parameter.
-
-The `ipaddr.isValid` method returns `true` if the address is a valid IPv4 or
-IPv6 address, and `false` otherwise. It does not throw any exceptions.
-
-The `ipaddr.parse` method returns an object representing the IP address,
-or throws an `Error` if the passed string is not a valid representation of an
-IP address.
-
-The `ipaddr.process` method works just like the `ipaddr.parse` one, but it
-automatically converts IPv4-mapped IPv6 addresses to their IPv4 counterparts
-before returning. It is useful when you have a Node.js instance listening
-on an IPv6 socket, and the `net.ivp6.bindv6only` sysctl parameter (or its
-equivalent on non-Linux OS) is set to 0. In this case, you can accept IPv4
-connections on your IPv6-only socket, but the remote address will be mangled.
-Use `ipaddr.process` method to automatically demangle it.
-
-### Object representation
-
-Parsing methods return an object which descends from `ipaddr.IPv6` or
-`ipaddr.IPv4`. These objects share some properties, but most of them differ.
-
-#### Shared properties
-
-One can determine the type of address by calling `addr.kind()`. It will return
-either `"ipv6"` or `"ipv4"`.
-
-An address can be converted back to its string representation with `addr.toString()`.
-Note that this method:
- * does not return the original string used to create the object (in fact, there is
-   no way of getting that string)
- * returns a compact representation (when it is applicable)
-
-A `match(range, bits)` method can be used to check if the address falls into a
-certain CIDR range.
-Note that an address can be (obviously) matched only against an address of the same type.
-
-For example:
-
-```js
-var addr = ipaddr.parse("2001:db8:1234::1");
-var range = ipaddr.parse("2001:db8::");
-
-addr.match(range, 32); // => true
-```
-
-Alternatively, `match` can also be called as `match([range, bits])`. In this way,
-it can be used together with the `parseCIDR(string)` method, which parses an IP
-address together with a CIDR range.
-
-For example:
-
-```js
-var addr = ipaddr.parse("2001:db8:1234::1");
-
-addr.match(ipaddr.parseCIDR("2001:db8::/32")); // => true
-```
-
-A `range()` method returns one of predefined names for several special ranges defined
-by IP protocols. The exact names (and their respective CIDR ranges) can be looked up
-in the source: [IPv6 ranges] and [IPv4 ranges]. Some common ones include `"unicast"`
-(the default one) and `"reserved"`.
-
-You can match against your own range list by using
-`ipaddr.subnetMatch(address, rangeList, defaultName)` method. It can work with a mix of IPv6 or IPv4 addresses, and accepts a name-to-subnet map as the range list. For example:
-
-```js
-var rangeList = {
-  documentationOnly: [ ipaddr.parse('2001:db8::'), 32 ],
-  tunnelProviders: [
-    [ ipaddr.parse('2001:470::'), 32 ], // he.net
-    [ ipaddr.parse('2001:5c0::'), 32 ]  // freenet6
-  ]
-};
-ipaddr.subnetMatch(ipaddr.parse('2001:470:8:66::1'), rangeList, 'unknown'); // => "tunnelProviders"
-```
-
-The addresses can be converted to their byte representation with `toByteArray()`.
-(Actually, JavaScript mostly does not know about byte buffers. They are emulated with
-arrays of numbers, each in range of 0..255.)
-
-```js
-var bytes = ipaddr.parse('2a00:1450:8007::68').toByteArray(); // ipv6.google.com
-bytes // => [42, 0x00, 0x14, 0x50, 0x80, 0x07, 0x00, <zeroes...>, 0x00, 0x68 ]
-```
-
-The `ipaddr.IPv4` and `ipaddr.IPv6` objects have some methods defined, too. All of them
-have the same interface for both protocols, and are similar to global methods.
-
-`ipaddr.IPvX.isValid(string)` can be used to check if the string is a valid address
-for particular protocol, and `ipaddr.IPvX.parse(string)` is the error-throwing parser.
-
-`ipaddr.IPvX.isValid(string)` uses the same format for parsing as the POSIX `inet_ntoa` function, which accepts unusual formats like `0xc0.168.1.1` or `0x10000000`. The function `ipaddr.IPv4.isValidFourPartDecimal(string)` validates the IPv4 address and also ensures that it is written in four-part decimal format.
-
-[IPv6 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L186
-[IPv4 ranges]: https://github.com/whitequark/ipaddr.js/blob/master/src/ipaddr.coffee#L71
-
-#### IPv6 properties
-
-Sometimes you will want to convert IPv6 not to a compact string representation (with
-the `::` substitution); the `toNormalizedString()` method will return an address where
-all zeroes are explicit.
-
-For example:
-
-```js
-var addr = ipaddr.parse("2001:0db8::0001");
-addr.toString(); // => "2001:db8::1"
-addr.toNormalizedString(); // => "2001:db8:0:0:0:0:0:1"
-```
-
-The `isIPv4MappedAddress()` method will return `true` if this address is an IPv4-mapped
-one, and `toIPv4Address()` will return an IPv4 object address.
-
-To access the underlying binary representation of the address, use `addr.parts`.
-
-```js
-var addr = ipaddr.parse("2001:db8:10::1234:DEAD");
-addr.parts // => [0x2001, 0xdb8, 0x10, 0, 0, 0, 0x1234, 0xdead]
-```
-
-A IPv6 zone index can be accessed via `addr.zoneId`:
-
-```js
-var addr = ipaddr.parse("2001:db8::%eth0");
-addr.zoneId // => 'eth0'
-```
-
-#### IPv4 properties
-
-`toIPv4MappedAddress()` will return a corresponding IPv4-mapped IPv6 address.
-
-To access the underlying representation of the address, use `addr.octets`.
-
-```js
-var addr = ipaddr.parse("192.168.1.1");
-addr.octets // => [192, 168, 1, 1]
-```
-
-`prefixLengthFromSubnetMask()` will return a CIDR prefix length for a valid IPv4 netmask or
-null if the netmask is not valid.
-
-```js
-ipaddr.IPv4.parse('255.255.255.240').prefixLengthFromSubnetMask() == 28
-ipaddr.IPv4.parse('255.192.164.0').prefixLengthFromSubnetMask()  == null
-```
-
-`subnetMaskFromPrefixLength()` will return an IPv4 netmask for a valid CIDR prefix length.
-
-```js
-ipaddr.IPv4.subnetMaskFromPrefixLength(24) == "255.255.255.0"
-ipaddr.IPv4.subnetMaskFromPrefixLength(29) == "255.255.255.248"
-```
-
-`broadcastAddressFromCIDR()` will return the broadcast address for a given IPv4 interface and netmask in CIDR notation.
-```js
-ipaddr.IPv4.broadcastAddressFromCIDR("172.0.0.1/24") == "172.0.0.255"
-```
-`networkAddressFromCIDR()` will return the network address for a given IPv4 interface and netmask in CIDR notation.
-```js
-ipaddr.IPv4.networkAddressFromCIDR("172.0.0.1/24") == "172.0.0.0"
-```
-
-#### Conversion
-
-IPv4 and IPv6 can be converted bidirectionally to and from network byte order (MSB) byte arrays.
-
-The `fromByteArray()` method will take an array and create an appropriate IPv4 or IPv6 object
-if the input satisfies the requirements. For IPv4 it has to be an array of four 8-bit values,
-while for IPv6 it has to be an array of sixteen 8-bit values.
-
-For example:
-```js
-var addr = ipaddr.fromByteArray([0x7f, 0, 0, 1]);
-addr.toString(); // => "127.0.0.1"
-```
-
-or
-
-```js
-var addr = ipaddr.fromByteArray([0x20, 1, 0xd, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
-addr.toString(); // => "2001:db8::1"
-```
-
-Both objects also offer a `toByteArray()` method, which returns an array in network byte order (MSB).
-
-For example:
-```js
-var addr = ipaddr.parse("127.0.0.1");
-addr.toByteArray(); // => [0x7f, 0, 0, 1]
-```
-
-or
-
-```js
-var addr = ipaddr.parse("2001:db8::1");
-addr.toByteArray(); // => [0x20, 1, 0xd, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
-```
diff --git a/node_modules/ipaddr.js/ipaddr.min.js b/node_modules/ipaddr.js/ipaddr.min.js
deleted file mode 100644
index b54a7cc42ac48524d2de2fa43979367e09fbe385..0000000000000000000000000000000000000000
--- a/node_modules/ipaddr.js/ipaddr.min.js
+++ /dev/null
@@ -1 +0,0 @@
-(function(){var r,t,n,e,i,o,a,s;t={},s=this,"undefined"!=typeof module&&null!==module&&module.exports?module.exports=t:s.ipaddr=t,a=function(r,t,n,e){var i,o;if(r.length!==t.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(i=0;e>0;){if((o=n-e)<0&&(o=0),r[i]>>o!=t[i]>>o)return!1;e-=n,i+=1}return!0},t.subnetMatch=function(r,t,n){var e,i,o,a,s;null==n&&(n="unicast");for(o in t)for(!(a=t[o])[0]||a[0]instanceof Array||(a=[a]),e=0,i=a.length;e<i;e++)if(s=a[e],r.kind()===s[0].kind()&&r.match.apply(r,s))return o;return n},t.IPv4=function(){function r(r){var t,n,e;if(4!==r.length)throw new Error("ipaddr: ipv4 octet count should be 4");for(t=0,n=r.length;t<n;t++)if(!(0<=(e=r[t])&&e<=255))throw new Error("ipaddr: ipv4 octet should fit in 8 bits");this.octets=r}return r.prototype.kind=function(){return"ipv4"},r.prototype.toString=function(){return this.octets.join(".")},r.prototype.toNormalizedString=function(){return this.toString()},r.prototype.toByteArray=function(){return this.octets.slice(0)},r.prototype.match=function(r,t){var n;if(void 0===t&&(r=(n=r)[0],t=n[1]),"ipv4"!==r.kind())throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");return a(this.octets,r.octets,8,t)},r.prototype.SpecialRanges={unspecified:[[new r([0,0,0,0]),8]],broadcast:[[new r([255,255,255,255]),32]],multicast:[[new r([224,0,0,0]),4]],linkLocal:[[new r([169,254,0,0]),16]],loopback:[[new r([127,0,0,0]),8]],carrierGradeNat:[[new r([100,64,0,0]),10]],private:[[new r([10,0,0,0]),8],[new r([172,16,0,0]),12],[new r([192,168,0,0]),16]],reserved:[[new r([192,0,0,0]),24],[new r([192,0,2,0]),24],[new r([192,88,99,0]),24],[new r([198,51,100,0]),24],[new r([203,0,113,0]),24],[new r([240,0,0,0]),4]]},r.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},r.prototype.toIPv4MappedAddress=function(){return t.IPv6.parse("::ffff:"+this.toString())},r.prototype.prefixLengthFromSubnetMask=function(){var r,t,n,e,i,o,a;for(a={0:8,128:7,192:6,224:5,240:4,248:3,252:2,254:1,255:0},r=0,i=!1,t=n=3;n>=0;t=n+=-1){if(!((e=this.octets[t])in a))return null;if(o=a[e],i&&0!==o)return null;8!==o&&(i=!0),r+=o}return 32-r},r}(),n="(0?\\d+|0x[a-f0-9]+)",e={fourOctet:new RegExp("^"+n+"\\."+n+"\\."+n+"\\."+n+"$","i"),longValue:new RegExp("^"+n+"$","i")},t.IPv4.parser=function(r){var t,n,i,o,a;if(n=function(r){return"0"===r[0]&&"x"!==r[1]?parseInt(r,8):parseInt(r)},t=r.match(e.fourOctet))return function(){var r,e,o,a;for(a=[],r=0,e=(o=t.slice(1,6)).length;r<e;r++)i=o[r],a.push(n(i));return a}();if(t=r.match(e.longValue)){if((a=n(t[1]))>4294967295||a<0)throw new Error("ipaddr: address outside defined range");return function(){var r,t;for(t=[],o=r=0;r<=24;o=r+=8)t.push(a>>o&255);return t}().reverse()}return null},t.IPv6=function(){function r(r,t){var n,e,i,o,a,s;if(16===r.length)for(this.parts=[],n=e=0;e<=14;n=e+=2)this.parts.push(r[n]<<8|r[n+1]);else{if(8!==r.length)throw new Error("ipaddr: ipv6 part count should be 8 or 16");this.parts=r}for(i=0,o=(s=this.parts).length;i<o;i++)if(!(0<=(a=s[i])&&a<=65535))throw new Error("ipaddr: ipv6 part should fit in 16 bits");t&&(this.zoneId=t)}return r.prototype.kind=function(){return"ipv6"},r.prototype.toString=function(){return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/,"::")},r.prototype.toRFC5952String=function(){var r,t,n,e,i;for(e=/((^|:)(0(:|$)){2,})/g,i=this.toNormalizedString(),r=0,t=-1;n=e.exec(i);)n[0].length>t&&(r=n.index,t=n[0].length);return t<0?i:i.substring(0,r)+"::"+i.substring(r+t)},r.prototype.toByteArray=function(){var r,t,n,e,i;for(r=[],t=0,n=(i=this.parts).length;t<n;t++)e=i[t],r.push(e>>8),r.push(255&e);return r},r.prototype.toNormalizedString=function(){var r,t,n;return r=function(){var r,n,e,i;for(i=[],r=0,n=(e=this.parts).length;r<n;r++)t=e[r],i.push(t.toString(16));return i}.call(this).join(":"),n="",this.zoneId&&(n="%"+this.zoneId),r+n},r.prototype.toFixedLengthString=function(){var r,t,n;return r=function(){var r,n,e,i;for(i=[],r=0,n=(e=this.parts).length;r<n;r++)t=e[r],i.push(t.toString(16).padStart(4,"0"));return i}.call(this).join(":"),n="",this.zoneId&&(n="%"+this.zoneId),r+n},r.prototype.match=function(r,t){var n;if(void 0===t&&(r=(n=r)[0],t=n[1]),"ipv6"!==r.kind())throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");return a(this.parts,r.parts,16,t)},r.prototype.SpecialRanges={unspecified:[new r([0,0,0,0,0,0,0,0]),128],linkLocal:[new r([65152,0,0,0,0,0,0,0]),10],multicast:[new r([65280,0,0,0,0,0,0,0]),8],loopback:[new r([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new r([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new r([0,0,0,0,0,65535,0,0]),96],rfc6145:[new r([0,0,0,0,65535,0,0,0]),96],rfc6052:[new r([100,65435,0,0,0,0,0,0]),96],"6to4":[new r([8194,0,0,0,0,0,0,0]),16],teredo:[new r([8193,0,0,0,0,0,0,0]),32],reserved:[[new r([8193,3512,0,0,0,0,0,0]),32]]},r.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},r.prototype.isIPv4MappedAddress=function(){return"ipv4Mapped"===this.range()},r.prototype.toIPv4Address=function(){var r,n,e;if(!this.isIPv4MappedAddress())throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");return e=this.parts.slice(-2),r=e[0],n=e[1],new t.IPv4([r>>8,255&r,n>>8,255&n])},r.prototype.prefixLengthFromSubnetMask=function(){var r,t,n,e,i,o,a;for(a={0:16,32768:15,49152:14,57344:13,61440:12,63488:11,64512:10,65024:9,65280:8,65408:7,65472:6,65504:5,65520:4,65528:3,65532:2,65534:1,65535:0},r=0,i=!1,t=n=7;n>=0;t=n+=-1){if(!((e=this.parts[t])in a))return null;if(o=a[e],i&&0!==o)return null;16!==o&&(i=!0),r+=o}return 128-r},r}(),i="(?:[0-9a-f]+::?)+",o={zoneIndex:new RegExp("%[0-9a-z]{1,}","i"),native:new RegExp("^(::)?("+i+")?([0-9a-f]+)?(::)?(%[0-9a-z]{1,})?$","i"),transitional:new RegExp("^((?:"+i+")|(?:::)(?:"+i+")?)"+n+"\\."+n+"\\."+n+"\\."+n+"(%[0-9a-z]{1,})?$","i")},r=function(r,t){var n,e,i,a,s,p;if(r.indexOf("::")!==r.lastIndexOf("::"))return null;for((p=(r.match(o.zoneIndex)||[])[0])&&(p=p.substring(1),r=r.replace(/%.+$/,"")),n=0,e=-1;(e=r.indexOf(":",e+1))>=0;)n++;if("::"===r.substr(0,2)&&n--,"::"===r.substr(-2,2)&&n--,n>t)return null;for(s=t-n,a=":";s--;)a+="0:";return":"===(r=r.replace("::",a))[0]&&(r=r.slice(1)),":"===r[r.length-1]&&(r=r.slice(0,-1)),t=function(){var t,n,e,o;for(o=[],t=0,n=(e=r.split(":")).length;t<n;t++)i=e[t],o.push(parseInt(i,16));return o}(),{parts:t,zoneId:p}},t.IPv6.parser=function(t){var n,e,i,a,s,p,u;if(o.native.test(t))return r(t,8);if((a=t.match(o.transitional))&&(u=a[6]||"",(n=r(a[1].slice(0,-1)+u,6)).parts)){for(e=0,i=(p=[parseInt(a[2]),parseInt(a[3]),parseInt(a[4]),parseInt(a[5])]).length;e<i;e++)if(!(0<=(s=p[e])&&s<=255))return null;return n.parts.push(p[0]<<8|p[1]),n.parts.push(p[2]<<8|p[3]),{parts:n.parts,zoneId:n.zoneId}}return null},t.IPv4.isIPv4=t.IPv6.isIPv6=function(r){return null!==this.parser(r)},t.IPv4.isValid=function(r){try{return new this(this.parser(r)),!0}catch(r){return r,!1}},t.IPv4.isValidFourPartDecimal=function(r){return!(!t.IPv4.isValid(r)||!r.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/))},t.IPv6.isValid=function(r){var t;if("string"==typeof r&&-1===r.indexOf(":"))return!1;try{return t=this.parser(r),new this(t.parts,t.zoneId),!0}catch(r){return r,!1}},t.IPv4.parse=function(r){var t;if(null===(t=this.parser(r)))throw new Error("ipaddr: string is not formatted like ip address");return new this(t)},t.IPv6.parse=function(r){var t;if(null===(t=this.parser(r)).parts)throw new Error("ipaddr: string is not formatted like ip address");return new this(t.parts,t.zoneId)},t.IPv4.parseCIDR=function(r){var t,n,e;if((n=r.match(/^(.+)\/(\d+)$/))&&(t=parseInt(n[2]))>=0&&t<=32)return e=[this.parse(n[1]),t],Object.defineProperty(e,"toString",{value:function(){return this.join("/")}}),e;throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range")},t.IPv4.subnetMaskFromPrefixLength=function(r){var t,n,e;if((r=parseInt(r))<0||r>32)throw new Error("ipaddr: invalid IPv4 prefix length");for(e=[0,0,0,0],n=0,t=Math.floor(r/8);n<t;)e[n]=255,n++;return t<4&&(e[t]=Math.pow(2,r%8)-1<<8-r%8),new this(e)},t.IPv4.broadcastAddressFromCIDR=function(r){var t,n,e,i,o;try{for(e=(t=this.parseCIDR(r))[0].toByteArray(),o=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],n=0;n<4;)i.push(parseInt(e[n],10)|255^parseInt(o[n],10)),n++;return new this(i)}catch(r){throw r,new Error("ipaddr: the address does not have IPv4 CIDR format")}},t.IPv4.networkAddressFromCIDR=function(r){var t,n,e,i,o;try{for(e=(t=this.parseCIDR(r))[0].toByteArray(),o=this.subnetMaskFromPrefixLength(t[1]).toByteArray(),i=[],n=0;n<4;)i.push(parseInt(e[n],10)&parseInt(o[n],10)),n++;return new this(i)}catch(r){throw r,new Error("ipaddr: the address does not have IPv4 CIDR format")}},t.IPv6.parseCIDR=function(r){var t,n,e;if((n=r.match(/^(.+)\/(\d+)$/))&&(t=parseInt(n[2]))>=0&&t<=128)return e=[this.parse(n[1]),t],Object.defineProperty(e,"toString",{value:function(){return this.join("/")}}),e;throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range")},t.isValid=function(r){return t.IPv6.isValid(r)||t.IPv4.isValid(r)},t.parse=function(r){if(t.IPv6.isValid(r))return t.IPv6.parse(r);if(t.IPv4.isValid(r))return t.IPv4.parse(r);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},t.parseCIDR=function(r){try{return t.IPv6.parseCIDR(r)}catch(n){n;try{return t.IPv4.parseCIDR(r)}catch(r){throw r,new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format")}}},t.fromByteArray=function(r){var n;if(4===(n=r.length))return new t.IPv4(r);if(16===n)return new t.IPv6(r);throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address")},t.process=function(r){var t;return t=this.parse(r),"ipv6"===t.kind()&&t.isIPv4MappedAddress()?t.toIPv4Address():t}}).call(this);
\ No newline at end of file
diff --git a/node_modules/ipaddr.js/lib/ipaddr.js b/node_modules/ipaddr.js/lib/ipaddr.js
deleted file mode 100644
index 18bd93b5e6dfd2af35147a656b913b952cfc7043..0000000000000000000000000000000000000000
--- a/node_modules/ipaddr.js/lib/ipaddr.js
+++ /dev/null
@@ -1,673 +0,0 @@
-(function() {
-  var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root, zoneIndex;
-
-  ipaddr = {};
-
-  root = this;
-
-  if ((typeof module !== "undefined" && module !== null) && module.exports) {
-    module.exports = ipaddr;
-  } else {
-    root['ipaddr'] = ipaddr;
-  }
-
-  matchCIDR = function(first, second, partSize, cidrBits) {
-    var part, shift;
-    if (first.length !== second.length) {
-      throw new Error("ipaddr: cannot match CIDR for objects with different lengths");
-    }
-    part = 0;
-    while (cidrBits > 0) {
-      shift = partSize - cidrBits;
-      if (shift < 0) {
-        shift = 0;
-      }
-      if (first[part] >> shift !== second[part] >> shift) {
-        return false;
-      }
-      cidrBits -= partSize;
-      part += 1;
-    }
-    return true;
-  };
-
-  ipaddr.subnetMatch = function(address, rangeList, defaultName) {
-    var k, len, rangeName, rangeSubnets, subnet;
-    if (defaultName == null) {
-      defaultName = 'unicast';
-    }
-    for (rangeName in rangeList) {
-      rangeSubnets = rangeList[rangeName];
-      if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) {
-        rangeSubnets = [rangeSubnets];
-      }
-      for (k = 0, len = rangeSubnets.length; k < len; k++) {
-        subnet = rangeSubnets[k];
-        if (address.kind() === subnet[0].kind()) {
-          if (address.match.apply(address, subnet)) {
-            return rangeName;
-          }
-        }
-      }
-    }
-    return defaultName;
-  };
-
-  ipaddr.IPv4 = (function() {
-    function IPv4(octets) {
-      var k, len, octet;
-      if (octets.length !== 4) {
-        throw new Error("ipaddr: ipv4 octet count should be 4");
-      }
-      for (k = 0, len = octets.length; k < len; k++) {
-        octet = octets[k];
-        if (!((0 <= octet && octet <= 255))) {
-          throw new Error("ipaddr: ipv4 octet should fit in 8 bits");
-        }
-      }
-      this.octets = octets;
-    }
-
-    IPv4.prototype.kind = function() {
-      return 'ipv4';
-    };
-
-    IPv4.prototype.toString = function() {
-      return this.octets.join(".");
-    };
-
-    IPv4.prototype.toNormalizedString = function() {
-      return this.toString();
-    };
-
-    IPv4.prototype.toByteArray = function() {
-      return this.octets.slice(0);
-    };
-
-    IPv4.prototype.match = function(other, cidrRange) {
-      var ref;
-      if (cidrRange === void 0) {
-        ref = other, other = ref[0], cidrRange = ref[1];
-      }
-      if (other.kind() !== 'ipv4') {
-        throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");
-      }
-      return matchCIDR(this.octets, other.octets, 8, cidrRange);
-    };
-
-    IPv4.prototype.SpecialRanges = {
-      unspecified: [[new IPv4([0, 0, 0, 0]), 8]],
-      broadcast: [[new IPv4([255, 255, 255, 255]), 32]],
-      multicast: [[new IPv4([224, 0, 0, 0]), 4]],
-      linkLocal: [[new IPv4([169, 254, 0, 0]), 16]],
-      loopback: [[new IPv4([127, 0, 0, 0]), 8]],
-      carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]],
-      "private": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]],
-      reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]]
-    };
-
-    IPv4.prototype.range = function() {
-      return ipaddr.subnetMatch(this, this.SpecialRanges);
-    };
-
-    IPv4.prototype.toIPv4MappedAddress = function() {
-      return ipaddr.IPv6.parse("::ffff:" + (this.toString()));
-    };
-
-    IPv4.prototype.prefixLengthFromSubnetMask = function() {
-      var cidr, i, k, octet, stop, zeros, zerotable;
-      zerotable = {
-        0: 8,
-        128: 7,
-        192: 6,
-        224: 5,
-        240: 4,
-        248: 3,
-        252: 2,
-        254: 1,
-        255: 0
-      };
-      cidr = 0;
-      stop = false;
-      for (i = k = 3; k >= 0; i = k += -1) {
-        octet = this.octets[i];
-        if (octet in zerotable) {
-          zeros = zerotable[octet];
-          if (stop && zeros !== 0) {
-            return null;
-          }
-          if (zeros !== 8) {
-            stop = true;
-          }
-          cidr += zeros;
-        } else {
-          return null;
-        }
-      }
-      return 32 - cidr;
-    };
-
-    return IPv4;
-
-  })();
-
-  ipv4Part = "(0?\\d+|0x[a-f0-9]+)";
-
-  ipv4Regexes = {
-    fourOctet: new RegExp("^" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$", 'i'),
-    longValue: new RegExp("^" + ipv4Part + "$", 'i')
-  };
-
-  ipaddr.IPv4.parser = function(string) {
-    var match, parseIntAuto, part, shift, value;
-    parseIntAuto = function(string) {
-      if (string[0] === "0" && string[1] !== "x") {
-        return parseInt(string, 8);
-      } else {
-        return parseInt(string);
-      }
-    };
-    if (match = string.match(ipv4Regexes.fourOctet)) {
-      return (function() {
-        var k, len, ref, results;
-        ref = match.slice(1, 6);
-        results = [];
-        for (k = 0, len = ref.length; k < len; k++) {
-          part = ref[k];
-          results.push(parseIntAuto(part));
-        }
-        return results;
-      })();
-    } else if (match = string.match(ipv4Regexes.longValue)) {
-      value = parseIntAuto(match[1]);
-      if (value > 0xffffffff || value < 0) {
-        throw new Error("ipaddr: address outside defined range");
-      }
-      return ((function() {
-        var k, results;
-        results = [];
-        for (shift = k = 0; k <= 24; shift = k += 8) {
-          results.push((value >> shift) & 0xff);
-        }
-        return results;
-      })()).reverse();
-    } else {
-      return null;
-    }
-  };
-
-  ipaddr.IPv6 = (function() {
-    function IPv6(parts, zoneId) {
-      var i, k, l, len, part, ref;
-      if (parts.length === 16) {
-        this.parts = [];
-        for (i = k = 0; k <= 14; i = k += 2) {
-          this.parts.push((parts[i] << 8) | parts[i + 1]);
-        }
-      } else if (parts.length === 8) {
-        this.parts = parts;
-      } else {
-        throw new Error("ipaddr: ipv6 part count should be 8 or 16");
-      }
-      ref = this.parts;
-      for (l = 0, len = ref.length; l < len; l++) {
-        part = ref[l];
-        if (!((0 <= part && part <= 0xffff))) {
-          throw new Error("ipaddr: ipv6 part should fit in 16 bits");
-        }
-      }
-      if (zoneId) {
-        this.zoneId = zoneId;
-      }
-    }
-
-    IPv6.prototype.kind = function() {
-      return 'ipv6';
-    };
-
-    IPv6.prototype.toString = function() {
-      return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::');
-    };
-
-    IPv6.prototype.toRFC5952String = function() {
-      var bestMatchIndex, bestMatchLength, match, regex, string;
-      regex = /((^|:)(0(:|$)){2,})/g;
-      string = this.toNormalizedString();
-      bestMatchIndex = 0;
-      bestMatchLength = -1;
-      while ((match = regex.exec(string))) {
-        if (match[0].length > bestMatchLength) {
-          bestMatchIndex = match.index;
-          bestMatchLength = match[0].length;
-        }
-      }
-      if (bestMatchLength < 0) {
-        return string;
-      }
-      return string.substring(0, bestMatchIndex) + '::' + string.substring(bestMatchIndex + bestMatchLength);
-    };
-
-    IPv6.prototype.toByteArray = function() {
-      var bytes, k, len, part, ref;
-      bytes = [];
-      ref = this.parts;
-      for (k = 0, len = ref.length; k < len; k++) {
-        part = ref[k];
-        bytes.push(part >> 8);
-        bytes.push(part & 0xff);
-      }
-      return bytes;
-    };
-
-    IPv6.prototype.toNormalizedString = function() {
-      var addr, part, suffix;
-      addr = ((function() {
-        var k, len, ref, results;
-        ref = this.parts;
-        results = [];
-        for (k = 0, len = ref.length; k < len; k++) {
-          part = ref[k];
-          results.push(part.toString(16));
-        }
-        return results;
-      }).call(this)).join(":");
-      suffix = '';
-      if (this.zoneId) {
-        suffix = '%' + this.zoneId;
-      }
-      return addr + suffix;
-    };
-
-    IPv6.prototype.toFixedLengthString = function() {
-      var addr, part, suffix;
-      addr = ((function() {
-        var k, len, ref, results;
-        ref = this.parts;
-        results = [];
-        for (k = 0, len = ref.length; k < len; k++) {
-          part = ref[k];
-          results.push(part.toString(16).padStart(4, '0'));
-        }
-        return results;
-      }).call(this)).join(":");
-      suffix = '';
-      if (this.zoneId) {
-        suffix = '%' + this.zoneId;
-      }
-      return addr + suffix;
-    };
-
-    IPv6.prototype.match = function(other, cidrRange) {
-      var ref;
-      if (cidrRange === void 0) {
-        ref = other, other = ref[0], cidrRange = ref[1];
-      }
-      if (other.kind() !== 'ipv6') {
-        throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");
-      }
-      return matchCIDR(this.parts, other.parts, 16, cidrRange);
-    };
-
-    IPv6.prototype.SpecialRanges = {
-      unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128],
-      linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10],
-      multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8],
-      loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128],
-      uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7],
-      ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96],
-      rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96],
-      rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96],
-      '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16],
-      teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32],
-      reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]]
-    };
-
-    IPv6.prototype.range = function() {
-      return ipaddr.subnetMatch(this, this.SpecialRanges);
-    };
-
-    IPv6.prototype.isIPv4MappedAddress = function() {
-      return this.range() === 'ipv4Mapped';
-    };
-
-    IPv6.prototype.toIPv4Address = function() {
-      var high, low, ref;
-      if (!this.isIPv4MappedAddress()) {
-        throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");
-      }
-      ref = this.parts.slice(-2), high = ref[0], low = ref[1];
-      return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]);
-    };
-
-    IPv6.prototype.prefixLengthFromSubnetMask = function() {
-      var cidr, i, k, part, stop, zeros, zerotable;
-      zerotable = {
-        0: 16,
-        32768: 15,
-        49152: 14,
-        57344: 13,
-        61440: 12,
-        63488: 11,
-        64512: 10,
-        65024: 9,
-        65280: 8,
-        65408: 7,
-        65472: 6,
-        65504: 5,
-        65520: 4,
-        65528: 3,
-        65532: 2,
-        65534: 1,
-        65535: 0
-      };
-      cidr = 0;
-      stop = false;
-      for (i = k = 7; k >= 0; i = k += -1) {
-        part = this.parts[i];
-        if (part in zerotable) {
-          zeros = zerotable[part];
-          if (stop && zeros !== 0) {
-            return null;
-          }
-          if (zeros !== 16) {
-            stop = true;
-          }
-          cidr += zeros;
-        } else {
-          return null;
-        }
-      }
-      return 128 - cidr;
-    };
-
-    return IPv6;
-
-  })();
-
-  ipv6Part = "(?:[0-9a-f]+::?)+";
-
-  zoneIndex = "%[0-9a-z]{1,}";
-
-  ipv6Regexes = {
-    zoneIndex: new RegExp(zoneIndex, 'i'),
-    "native": new RegExp("^(::)?(" + ipv6Part + ")?([0-9a-f]+)?(::)?(" + zoneIndex + ")?$", 'i'),
-    transitional: new RegExp(("^((?:" + ipv6Part + ")|(?:::)(?:" + ipv6Part + ")?)") + (ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part) + ("(" + zoneIndex + ")?$"), 'i')
-  };
-
-  expandIPv6 = function(string, parts) {
-    var colonCount, lastColon, part, replacement, replacementCount, zoneId;
-    if (string.indexOf('::') !== string.lastIndexOf('::')) {
-      return null;
-    }
-    zoneId = (string.match(ipv6Regexes['zoneIndex']) || [])[0];
-    if (zoneId) {
-      zoneId = zoneId.substring(1);
-      string = string.replace(/%.+$/, '');
-    }
-    colonCount = 0;
-    lastColon = -1;
-    while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) {
-      colonCount++;
-    }
-    if (string.substr(0, 2) === '::') {
-      colonCount--;
-    }
-    if (string.substr(-2, 2) === '::') {
-      colonCount--;
-    }
-    if (colonCount > parts) {
-      return null;
-    }
-    replacementCount = parts - colonCount;
-    replacement = ':';
-    while (replacementCount--) {
-      replacement += '0:';
-    }
-    string = string.replace('::', replacement);
-    if (string[0] === ':') {
-      string = string.slice(1);
-    }
-    if (string[string.length - 1] === ':') {
-      string = string.slice(0, -1);
-    }
-    parts = (function() {
-      var k, len, ref, results;
-      ref = string.split(":");
-      results = [];
-      for (k = 0, len = ref.length; k < len; k++) {
-        part = ref[k];
-        results.push(parseInt(part, 16));
-      }
-      return results;
-    })();
-    return {
-      parts: parts,
-      zoneId: zoneId
-    };
-  };
-
-  ipaddr.IPv6.parser = function(string) {
-    var addr, k, len, match, octet, octets, zoneId;
-    if (ipv6Regexes['native'].test(string)) {
-      return expandIPv6(string, 8);
-    } else if (match = string.match(ipv6Regexes['transitional'])) {
-      zoneId = match[6] || '';
-      addr = expandIPv6(match[1].slice(0, -1) + zoneId, 6);
-      if (addr.parts) {
-        octets = [parseInt(match[2]), parseInt(match[3]), parseInt(match[4]), parseInt(match[5])];
-        for (k = 0, len = octets.length; k < len; k++) {
-          octet = octets[k];
-          if (!((0 <= octet && octet <= 255))) {
-            return null;
-          }
-        }
-        addr.parts.push(octets[0] << 8 | octets[1]);
-        addr.parts.push(octets[2] << 8 | octets[3]);
-        return {
-          parts: addr.parts,
-          zoneId: addr.zoneId
-        };
-      }
-    }
-    return null;
-  };
-
-  ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) {
-    return this.parser(string) !== null;
-  };
-
-  ipaddr.IPv4.isValid = function(string) {
-    var e;
-    try {
-      new this(this.parser(string));
-      return true;
-    } catch (error1) {
-      e = error1;
-      return false;
-    }
-  };
-
-  ipaddr.IPv4.isValidFourPartDecimal = function(string) {
-    if (ipaddr.IPv4.isValid(string) && string.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/)) {
-      return true;
-    } else {
-      return false;
-    }
-  };
-
-  ipaddr.IPv6.isValid = function(string) {
-    var addr, e;
-    if (typeof string === "string" && string.indexOf(":") === -1) {
-      return false;
-    }
-    try {
-      addr = this.parser(string);
-      new this(addr.parts, addr.zoneId);
-      return true;
-    } catch (error1) {
-      e = error1;
-      return false;
-    }
-  };
-
-  ipaddr.IPv4.parse = function(string) {
-    var parts;
-    parts = this.parser(string);
-    if (parts === null) {
-      throw new Error("ipaddr: string is not formatted like ip address");
-    }
-    return new this(parts);
-  };
-
-  ipaddr.IPv6.parse = function(string) {
-    var addr;
-    addr = this.parser(string);
-    if (addr.parts === null) {
-      throw new Error("ipaddr: string is not formatted like ip address");
-    }
-    return new this(addr.parts, addr.zoneId);
-  };
-
-  ipaddr.IPv4.parseCIDR = function(string) {
-    var maskLength, match, parsed;
-    if (match = string.match(/^(.+)\/(\d+)$/)) {
-      maskLength = parseInt(match[2]);
-      if (maskLength >= 0 && maskLength <= 32) {
-        parsed = [this.parse(match[1]), maskLength];
-        Object.defineProperty(parsed, 'toString', {
-          value: function() {
-            return this.join('/');
-          }
-        });
-        return parsed;
-      }
-    }
-    throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range");
-  };
-
-  ipaddr.IPv4.subnetMaskFromPrefixLength = function(prefix) {
-    var filledOctetCount, j, octets;
-    prefix = parseInt(prefix);
-    if (prefix < 0 || prefix > 32) {
-      throw new Error('ipaddr: invalid IPv4 prefix length');
-    }
-    octets = [0, 0, 0, 0];
-    j = 0;
-    filledOctetCount = Math.floor(prefix / 8);
-    while (j < filledOctetCount) {
-      octets[j] = 255;
-      j++;
-    }
-    if (filledOctetCount < 4) {
-      octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);
-    }
-    return new this(octets);
-  };
-
-  ipaddr.IPv4.broadcastAddressFromCIDR = function(string) {
-    var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;
-    try {
-      cidr = this.parseCIDR(string);
-      ipInterfaceOctets = cidr[0].toByteArray();
-      subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();
-      octets = [];
-      i = 0;
-      while (i < 4) {
-        octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);
-        i++;
-      }
-      return new this(octets);
-    } catch (error1) {
-      error = error1;
-      throw new Error('ipaddr: the address does not have IPv4 CIDR format');
-    }
-  };
-
-  ipaddr.IPv4.networkAddressFromCIDR = function(string) {
-    var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;
-    try {
-      cidr = this.parseCIDR(string);
-      ipInterfaceOctets = cidr[0].toByteArray();
-      subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();
-      octets = [];
-      i = 0;
-      while (i < 4) {
-        octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));
-        i++;
-      }
-      return new this(octets);
-    } catch (error1) {
-      error = error1;
-      throw new Error('ipaddr: the address does not have IPv4 CIDR format');
-    }
-  };
-
-  ipaddr.IPv6.parseCIDR = function(string) {
-    var maskLength, match, parsed;
-    if (match = string.match(/^(.+)\/(\d+)$/)) {
-      maskLength = parseInt(match[2]);
-      if (maskLength >= 0 && maskLength <= 128) {
-        parsed = [this.parse(match[1]), maskLength];
-        Object.defineProperty(parsed, 'toString', {
-          value: function() {
-            return this.join('/');
-          }
-        });
-        return parsed;
-      }
-    }
-    throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range");
-  };
-
-  ipaddr.isValid = function(string) {
-    return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string);
-  };
-
-  ipaddr.parse = function(string) {
-    if (ipaddr.IPv6.isValid(string)) {
-      return ipaddr.IPv6.parse(string);
-    } else if (ipaddr.IPv4.isValid(string)) {
-      return ipaddr.IPv4.parse(string);
-    } else {
-      throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format");
-    }
-  };
-
-  ipaddr.parseCIDR = function(string) {
-    var e;
-    try {
-      return ipaddr.IPv6.parseCIDR(string);
-    } catch (error1) {
-      e = error1;
-      try {
-        return ipaddr.IPv4.parseCIDR(string);
-      } catch (error1) {
-        e = error1;
-        throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format");
-      }
-    }
-  };
-
-  ipaddr.fromByteArray = function(bytes) {
-    var length;
-    length = bytes.length;
-    if (length === 4) {
-      return new ipaddr.IPv4(bytes);
-    } else if (length === 16) {
-      return new ipaddr.IPv6(bytes);
-    } else {
-      throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address");
-    }
-  };
-
-  ipaddr.process = function(string) {
-    var addr;
-    addr = this.parse(string);
-    if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) {
-      return addr.toIPv4Address();
-    } else {
-      return addr;
-    }
-  };
-
-}).call(this);
diff --git a/node_modules/ipaddr.js/lib/ipaddr.js.d.ts b/node_modules/ipaddr.js/lib/ipaddr.js.d.ts
deleted file mode 100644
index 52174b6b6b28411c03f230e779c6f1edf93f9423..0000000000000000000000000000000000000000
--- a/node_modules/ipaddr.js/lib/ipaddr.js.d.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-declare module "ipaddr.js" {
-    type IPv4Range = 'unicast' | 'unspecified' | 'broadcast' | 'multicast' | 'linkLocal' | 'loopback' | 'carrierGradeNat' | 'private' | 'reserved';
-    type IPv6Range = 'unicast' | 'unspecified' | 'linkLocal' | 'multicast' | 'loopback' | 'uniqueLocal' | 'ipv4Mapped' | 'rfc6145' | 'rfc6052' | '6to4' | 'teredo' | 'reserved';
-
-    interface RangeList<T> {
-        [name: string]: [T, number] | [T, number][];
-    }
-
-    // Common methods/properties for IPv4 and IPv6 classes.
-    class IP {
-        prefixLengthFromSubnetMask(): number | null;
-        toByteArray(): number[];
-        toNormalizedString(): string;
-        toString(): string;
-    }
-
-    namespace Address {
-        export function isValid(addr: string): boolean;
-        export function fromByteArray(bytes: number[]): IPv4 | IPv6;
-        export function parse(addr: string): IPv4 | IPv6;
-        export function parseCIDR(mask: string): [IPv4 | IPv6, number];
-        export function process(addr: string): IPv4 | IPv6;
-        export function subnetMatch(addr: IPv4, rangeList: RangeList<IPv4>, defaultName?: string): string;
-        export function subnetMatch(addr: IPv6, rangeList: RangeList<IPv6>, defaultName?: string): string;
-
-        export class IPv4 extends IP {
-            static broadcastAddressFromCIDR(addr: string): IPv4;
-            static isIPv4(addr: string): boolean;
-            static isValidFourPartDecimal(addr: string): boolean;
-            static isValid(addr: string): boolean;
-            static networkAddressFromCIDR(addr: string): IPv4;
-            static parse(addr: string): IPv4;
-            static parseCIDR(addr: string): [IPv4, number];
-            static subnetMaskFromPrefixLength(prefix: number): IPv4;
-            constructor(octets: number[]);
-            octets: number[]
-
-            kind(): 'ipv4';
-            match(addr: IPv4, bits: number): boolean;
-            match(mask: [IPv4, number]): boolean;
-            range(): IPv4Range;
-            subnetMatch(rangeList: RangeList<IPv4>, defaultName?: string): string;
-            toIPv4MappedAddress(): IPv6;
-        }
-
-        export class IPv6 extends IP {
-            static broadcastAddressFromCIDR(addr: string): IPv6;
-            static isIPv6(addr: string): boolean;
-            static isValid(addr: string): boolean;
-            static parse(addr: string): IPv6;
-            static parseCIDR(addr: string): [IPv6, number];
-            static subnetMaskFromPrefixLength(prefix: number): IPv6;
-            constructor(parts: number[]);
-            parts: number[]
-            zoneId?: string
-
-            isIPv4MappedAddress(): boolean;
-            kind(): 'ipv6';
-            match(addr: IPv6, bits: number): boolean;
-            match(mask: [IPv6, number]): boolean;
-            range(): IPv6Range;
-            subnetMatch(rangeList: RangeList<IPv6>, defaultName?: string): string;
-            toIPv4Address(): IPv4;
-        }
-    }
-
-    export = Address;
-}
diff --git a/node_modules/ipaddr.js/package.json b/node_modules/ipaddr.js/package.json
deleted file mode 100644
index f4d35475d17abd96f03b0e1133258703b284c785..0000000000000000000000000000000000000000
--- a/node_modules/ipaddr.js/package.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "name": "ipaddr.js",
-  "description": "A library for manipulating IPv4 and IPv6 addresses in JavaScript.",
-  "version": "1.9.1",
-  "author": "whitequark <whitequark@whitequark.org>",
-  "directories": {
-    "lib": "./lib"
-  },
-  "dependencies": {},
-  "devDependencies": {
-    "coffee-script": "~1.12.6",
-    "nodeunit": "^0.11.3",
-    "uglify-js": "~3.0.19"
-  },
-  "scripts": {
-    "test": "cake build test"
-  },
-  "files": [
-    "lib/",
-    "LICENSE",
-    "ipaddr.min.js"
-  ],
-  "keywords": [
-    "ip",
-    "ipv4",
-    "ipv6"
-  ],
-  "repository": "git://github.com/whitequark/ipaddr.js",
-  "main": "./lib/ipaddr.js",
-  "engines": {
-    "node": ">= 0.10"
-  },
-  "license": "MIT",
-  "types": "./lib/ipaddr.js.d.ts"
-}
diff --git a/node_modules/is-binary-path/index.d.ts b/node_modules/is-binary-path/index.d.ts
deleted file mode 100644
index 19dcd4327beddb4d48ffc5a79eb8c306903574b4..0000000000000000000000000000000000000000
--- a/node_modules/is-binary-path/index.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
-Check if a file path is a binary file.
-
-@example
-```
-import isBinaryPath = require('is-binary-path');
-
-isBinaryPath('source/unicorn.png');
-//=> true
-
-isBinaryPath('source/unicorn.txt');
-//=> false
-```
-*/
-declare function isBinaryPath(filePath: string): boolean;
-
-export = isBinaryPath;
diff --git a/node_modules/is-binary-path/index.js b/node_modules/is-binary-path/index.js
deleted file mode 100644
index ef7548c8303298520e15e7e680bf99aee21f787a..0000000000000000000000000000000000000000
--- a/node_modules/is-binary-path/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-'use strict';
-const path = require('path');
-const binaryExtensions = require('binary-extensions');
-
-const extensions = new Set(binaryExtensions);
-
-module.exports = filePath => extensions.has(path.extname(filePath).slice(1).toLowerCase());
diff --git a/node_modules/is-binary-path/license b/node_modules/is-binary-path/license
deleted file mode 100644
index 401b1c731bcd3ed3193b94d7cbb81bd3b4a1dd47..0000000000000000000000000000000000000000
--- a/node_modules/is-binary-path/license
+++ /dev/null
@@ -1,9 +0,0 @@
-MIT License
-
-Copyright (c) 2019 Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com), Paul Miller (https://paulmillr.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/is-binary-path/package.json b/node_modules/is-binary-path/package.json
deleted file mode 100644
index a8d005aed80f8729749e0302d16bf0a6f2ab7eb6..0000000000000000000000000000000000000000
--- a/node_modules/is-binary-path/package.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-	"name": "is-binary-path",
-	"version": "2.1.0",
-	"description": "Check if a file path is a binary file",
-	"license": "MIT",
-	"repository": "sindresorhus/is-binary-path",
-	"author": {
-		"name": "Sindre Sorhus",
-		"email": "sindresorhus@gmail.com",
-		"url": "sindresorhus.com"
-	},
-	"engines": {
-		"node": ">=8"
-	},
-	"scripts": {
-		"test": "xo && ava && tsd"
-	},
-	"files": [
-		"index.js",
-		"index.d.ts"
-	],
-	"keywords": [
-		"binary",
-		"extensions",
-		"extension",
-		"file",
-		"path",
-		"check",
-		"detect",
-		"is"
-	],
-	"dependencies": {
-		"binary-extensions": "^2.0.0"
-	},
-	"devDependencies": {
-		"ava": "^1.4.1",
-		"tsd": "^0.7.2",
-		"xo": "^0.24.0"
-	}
-}
diff --git a/node_modules/is-binary-path/readme.md b/node_modules/is-binary-path/readme.md
deleted file mode 100644
index b4ab02519b0fdefb0f64748adcc1d35111a2cf75..0000000000000000000000000000000000000000
--- a/node_modules/is-binary-path/readme.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# is-binary-path [![Build Status](https://travis-ci.org/sindresorhus/is-binary-path.svg?branch=master)](https://travis-ci.org/sindresorhus/is-binary-path)
-
-> Check if a file path is a binary file
-
-
-## Install
-
-```
-$ npm install is-binary-path
-```
-
-
-## Usage
-
-```js
-const isBinaryPath = require('is-binary-path');
-
-isBinaryPath('source/unicorn.png');
-//=> true
-
-isBinaryPath('source/unicorn.txt');
-//=> false
-```
-
-
-## Related
-
-- [binary-extensions](https://github.com/sindresorhus/binary-extensions) - List of binary file extensions
-- [is-text-path](https://github.com/sindresorhus/is-text-path) - Check if a filepath is a text file
-
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com), [Paul Miller](https://paulmillr.com)
diff --git a/node_modules/is-extglob/LICENSE b/node_modules/is-extglob/LICENSE
deleted file mode 100644
index 842218cf09a20282e926305e01162174ab371a52..0000000000000000000000000000000000000000
--- a/node_modules/is-extglob/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014-2016, Jon Schlinkert
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/node_modules/is-extglob/README.md b/node_modules/is-extglob/README.md
deleted file mode 100644
index 0416af5c326983f8817331b7a08f1cbbe22490e5..0000000000000000000000000000000000000000
--- a/node_modules/is-extglob/README.md
+++ /dev/null
@@ -1,107 +0,0 @@
-# is-extglob [![NPM version](https://img.shields.io/npm/v/is-extglob.svg?style=flat)](https://www.npmjs.com/package/is-extglob) [![NPM downloads](https://img.shields.io/npm/dm/is-extglob.svg?style=flat)](https://npmjs.org/package/is-extglob) [![Build Status](https://img.shields.io/travis/jonschlinkert/is-extglob.svg?style=flat)](https://travis-ci.org/jonschlinkert/is-extglob)
-
-> Returns true if a string has an extglob.
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-$ npm install --save is-extglob
-```
-
-## Usage
-
-```js
-var isExtglob = require('is-extglob');
-```
-
-**True**
-
-```js
-isExtglob('?(abc)');
-isExtglob('@(abc)');
-isExtglob('!(abc)');
-isExtglob('*(abc)');
-isExtglob('+(abc)');
-```
-
-**False**
-
-Escaped extglobs:
-
-```js
-isExtglob('\\?(abc)');
-isExtglob('\\@(abc)');
-isExtglob('\\!(abc)');
-isExtglob('\\*(abc)');
-isExtglob('\\+(abc)');
-```
-
-Everything else...
-
-```js
-isExtglob('foo.js');
-isExtglob('!foo.js');
-isExtglob('*.js');
-isExtglob('**/abc.js');
-isExtglob('abc/*.js');
-isExtglob('abc/(aaa|bbb).js');
-isExtglob('abc/[a-z].js');
-isExtglob('abc/{a,b}.js');
-isExtglob('abc/?.js');
-isExtglob('abc.js');
-isExtglob('abc/def/ghi.js');
-```
-
-## History
-
-**v2.0**
-
-Adds support for escaping. Escaped exglobs no longer return true.
-
-## About
-
-### Related projects
-
-* [has-glob](https://www.npmjs.com/package/has-glob): Returns `true` if an array has a glob pattern. | [homepage](https://github.com/jonschlinkert/has-glob "Returns `true` if an array has a glob pattern.")
-* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet")
-* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/jonschlinkert/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.")
-
-### Contributing
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-### Building docs
-
-_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_
-
-To generate the readme and API documentation with [verb](https://github.com/verbose/verb):
-
-```sh
-$ npm install -g verb verb-generate-readme && verb
-```
-
-### Running tests
-
-Install dev dependencies:
-
-```sh
-$ npm install -d && npm test
-```
-
-### Author
-
-**Jon Schlinkert**
-
-* [github/jonschlinkert](https://github.com/jonschlinkert)
-* [twitter/jonschlinkert](http://twitter.com/jonschlinkert)
-
-### License
-
-Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT license](https://github.com/jonschlinkert/is-extglob/blob/master/LICENSE).
-
-***
-
-_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.1.31, on October 12, 2016._
\ No newline at end of file
diff --git a/node_modules/is-extglob/index.js b/node_modules/is-extglob/index.js
deleted file mode 100644
index c1d986fc5120301c654f87ee329241190b6e1987..0000000000000000000000000000000000000000
--- a/node_modules/is-extglob/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/*!
- * is-extglob <https://github.com/jonschlinkert/is-extglob>
- *
- * Copyright (c) 2014-2016, Jon Schlinkert.
- * Licensed under the MIT License.
- */
-
-module.exports = function isExtglob(str) {
-  if (typeof str !== 'string' || str === '') {
-    return false;
-  }
-
-  var match;
-  while ((match = /(\\).|([@?!+*]\(.*\))/g.exec(str))) {
-    if (match[2]) return true;
-    str = str.slice(match.index + match[0].length);
-  }
-
-  return false;
-};
diff --git a/node_modules/is-extglob/package.json b/node_modules/is-extglob/package.json
deleted file mode 100644
index 7a908369d39f558028f5345dd89b27c62d4d693c..0000000000000000000000000000000000000000
--- a/node_modules/is-extglob/package.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
-  "name": "is-extglob",
-  "description": "Returns true if a string has an extglob.",
-  "version": "2.1.1",
-  "homepage": "https://github.com/jonschlinkert/is-extglob",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "repository": "jonschlinkert/is-extglob",
-  "bugs": {
-    "url": "https://github.com/jonschlinkert/is-extglob/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "scripts": {
-    "test": "mocha"
-  },
-  "devDependencies": {
-    "gulp-format-md": "^0.1.10",
-    "mocha": "^3.0.2"
-  },
-  "keywords": [
-    "bash",
-    "braces",
-    "check",
-    "exec",
-    "expression",
-    "extglob",
-    "glob",
-    "globbing",
-    "globstar",
-    "is",
-    "match",
-    "matches",
-    "pattern",
-    "regex",
-    "regular",
-    "string",
-    "test"
-  ],
-  "verb": {
-    "toc": false,
-    "layout": "default",
-    "tasks": [
-      "readme"
-    ],
-    "plugins": [
-      "gulp-format-md"
-    ],
-    "related": {
-      "list": [
-        "has-glob",
-        "is-glob",
-        "micromatch"
-      ]
-    },
-    "reflinks": [
-      "verb",
-      "verb-generate-readme"
-    ],
-    "lint": {
-      "reflinks": true
-    }
-  }
-}
diff --git a/node_modules/is-glob/LICENSE b/node_modules/is-glob/LICENSE
deleted file mode 100644
index 3f2eca18f1bc0f3117748e2cea9251e5182db2f7..0000000000000000000000000000000000000000
--- a/node_modules/is-glob/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014-2017, Jon Schlinkert.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/node_modules/is-glob/README.md b/node_modules/is-glob/README.md
deleted file mode 100644
index 740724b276e289aec14ee6ce99d42ab9a6eb4b48..0000000000000000000000000000000000000000
--- a/node_modules/is-glob/README.md
+++ /dev/null
@@ -1,206 +0,0 @@
-# is-glob [![NPM version](https://img.shields.io/npm/v/is-glob.svg?style=flat)](https://www.npmjs.com/package/is-glob) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-glob.svg?style=flat)](https://npmjs.org/package/is-glob) [![NPM total downloads](https://img.shields.io/npm/dt/is-glob.svg?style=flat)](https://npmjs.org/package/is-glob) [![Build Status](https://img.shields.io/github/workflow/status/micromatch/is-glob/dev)](https://github.com/micromatch/is-glob/actions)
-
-> Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a better user experience.
-
-Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-$ npm install --save is-glob
-```
-
-You might also be interested in [is-valid-glob](https://github.com/jonschlinkert/is-valid-glob) and [has-glob](https://github.com/jonschlinkert/has-glob).
-
-## Usage
-
-```js
-var isGlob = require('is-glob');
-```
-
-### Default behavior
-
-**True**
-
-Patterns that have glob characters or regex patterns will return `true`:
-
-```js
-isGlob('!foo.js');
-isGlob('*.js');
-isGlob('**/abc.js');
-isGlob('abc/*.js');
-isGlob('abc/(aaa|bbb).js');
-isGlob('abc/[a-z].js');
-isGlob('abc/{a,b}.js');
-//=> true
-```
-
-Extglobs
-
-```js
-isGlob('abc/@(a).js');
-isGlob('abc/!(a).js');
-isGlob('abc/+(a).js');
-isGlob('abc/*(a).js');
-isGlob('abc/?(a).js');
-//=> true
-```
-
-**False**
-
-Escaped globs or extglobs return `false`:
-
-```js
-isGlob('abc/\\@(a).js');
-isGlob('abc/\\!(a).js');
-isGlob('abc/\\+(a).js');
-isGlob('abc/\\*(a).js');
-isGlob('abc/\\?(a).js');
-isGlob('\\!foo.js');
-isGlob('\\*.js');
-isGlob('\\*\\*/abc.js');
-isGlob('abc/\\*.js');
-isGlob('abc/\\(aaa|bbb).js');
-isGlob('abc/\\[a-z].js');
-isGlob('abc/\\{a,b}.js');
-//=> false
-```
-
-Patterns that do not have glob patterns return `false`:
-
-```js
-isGlob('abc.js');
-isGlob('abc/def/ghi.js');
-isGlob('foo.js');
-isGlob('abc/@.js');
-isGlob('abc/+.js');
-isGlob('abc/?.js');
-isGlob();
-isGlob(null);
-//=> false
-```
-
-Arrays are also `false` (If you want to check if an array has a glob pattern, use [has-glob](https://github.com/jonschlinkert/has-glob)):
-
-```js
-isGlob(['**/*.js']);
-isGlob(['foo.js']);
-//=> false
-```
-
-### Option strict
-
-When `options.strict === false` the behavior is less strict in determining if a pattern is a glob. Meaning that
-some patterns that would return `false` may return `true`. This is done so that matching libraries like [micromatch](https://github.com/micromatch/micromatch) have a chance at determining if the pattern is a glob or not.
-
-**True**
-
-Patterns that have glob characters or regex patterns will return `true`:
-
-```js
-isGlob('!foo.js', {strict: false});
-isGlob('*.js', {strict: false});
-isGlob('**/abc.js', {strict: false});
-isGlob('abc/*.js', {strict: false});
-isGlob('abc/(aaa|bbb).js', {strict: false});
-isGlob('abc/[a-z].js', {strict: false});
-isGlob('abc/{a,b}.js', {strict: false});
-//=> true
-```
-
-Extglobs
-
-```js
-isGlob('abc/@(a).js', {strict: false});
-isGlob('abc/!(a).js', {strict: false});
-isGlob('abc/+(a).js', {strict: false});
-isGlob('abc/*(a).js', {strict: false});
-isGlob('abc/?(a).js', {strict: false});
-//=> true
-```
-
-**False**
-
-Escaped globs or extglobs return `false`:
-
-```js
-isGlob('\\!foo.js', {strict: false});
-isGlob('\\*.js', {strict: false});
-isGlob('\\*\\*/abc.js', {strict: false});
-isGlob('abc/\\*.js', {strict: false});
-isGlob('abc/\\(aaa|bbb).js', {strict: false});
-isGlob('abc/\\[a-z].js', {strict: false});
-isGlob('abc/\\{a,b}.js', {strict: false});
-//=> false
-```
-
-## About
-
-<details>
-<summary><strong>Contributing</strong></summary>
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-</details>
-
-<details>
-<summary><strong>Running Tests</strong></summary>
-
-Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
-
-```sh
-$ npm install && npm test
-```
-
-</details>
-
-<details>
-<summary><strong>Building docs</strong></summary>
-
-_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
-
-To generate the readme, run the following command:
-
-```sh
-$ npm install -g verbose/verb#dev verb-generate-readme && verb
-```
-
-</details>
-
-### Related projects
-
-You might also be interested in these projects:
-
-* [assemble](https://www.npmjs.com/package/assemble): Get the rocks out of your socks! Assemble makes you fast at creating web projects… [more](https://github.com/assemble/assemble) | [homepage](https://github.com/assemble/assemble "Get the rocks out of your socks! Assemble makes you fast at creating web projects. Assemble is used by thousands of projects for rapid prototyping, creating themes, scaffolds, boilerplates, e-books, UI components, API documentation, blogs, building websit")
-* [base](https://www.npmjs.com/package/base): Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks | [homepage](https://github.com/node-base/base "Framework for rapidly creating high quality, server-side node.js applications, using plugins like building blocks")
-* [update](https://www.npmjs.com/package/update): Be scalable! Update is a new, open source developer framework and CLI for automating updates… [more](https://github.com/update/update) | [homepage](https://github.com/update/update "Be scalable! Update is a new, open source developer framework and CLI for automating updates of any kind in code projects.")
-* [verb](https://www.npmjs.com/package/verb): Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used… [more](https://github.com/verbose/verb) | [homepage](https://github.com/verbose/verb "Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used on hundreds of projects of all sizes to generate everything from API docs to readmes.")
-
-### Contributors
-
-| **Commits** | **Contributor** |  
-| --- | --- |  
-| 47 | [jonschlinkert](https://github.com/jonschlinkert) |  
-| 5  | [doowb](https://github.com/doowb) |  
-| 1  | [phated](https://github.com/phated) |  
-| 1  | [danhper](https://github.com/danhper) |  
-| 1  | [paulmillr](https://github.com/paulmillr) |  
-
-### Author
-
-**Jon Schlinkert**
-
-* [GitHub Profile](https://github.com/jonschlinkert)
-* [Twitter Profile](https://twitter.com/jonschlinkert)
-* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
-
-### License
-
-Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT License](LICENSE).
-
-***
-
-_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on March 27, 2019._
\ No newline at end of file
diff --git a/node_modules/is-glob/index.js b/node_modules/is-glob/index.js
deleted file mode 100644
index 620f563eccf081ce0d2db2dda5c9989baf778183..0000000000000000000000000000000000000000
--- a/node_modules/is-glob/index.js
+++ /dev/null
@@ -1,150 +0,0 @@
-/*!
- * is-glob <https://github.com/jonschlinkert/is-glob>
- *
- * Copyright (c) 2014-2017, Jon Schlinkert.
- * Released under the MIT License.
- */
-
-var isExtglob = require('is-extglob');
-var chars = { '{': '}', '(': ')', '[': ']'};
-var strictCheck = function(str) {
-  if (str[0] === '!') {
-    return true;
-  }
-  var index = 0;
-  var pipeIndex = -2;
-  var closeSquareIndex = -2;
-  var closeCurlyIndex = -2;
-  var closeParenIndex = -2;
-  var backSlashIndex = -2;
-  while (index < str.length) {
-    if (str[index] === '*') {
-      return true;
-    }
-
-    if (str[index + 1] === '?' && /[\].+)]/.test(str[index])) {
-      return true;
-    }
-
-    if (closeSquareIndex !== -1 && str[index] === '[' && str[index + 1] !== ']') {
-      if (closeSquareIndex < index) {
-        closeSquareIndex = str.indexOf(']', index);
-      }
-      if (closeSquareIndex > index) {
-        if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {
-          return true;
-        }
-        backSlashIndex = str.indexOf('\\', index);
-        if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {
-          return true;
-        }
-      }
-    }
-
-    if (closeCurlyIndex !== -1 && str[index] === '{' && str[index + 1] !== '}') {
-      closeCurlyIndex = str.indexOf('}', index);
-      if (closeCurlyIndex > index) {
-        backSlashIndex = str.indexOf('\\', index);
-        if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) {
-          return true;
-        }
-      }
-    }
-
-    if (closeParenIndex !== -1 && str[index] === '(' && str[index + 1] === '?' && /[:!=]/.test(str[index + 2]) && str[index + 3] !== ')') {
-      closeParenIndex = str.indexOf(')', index);
-      if (closeParenIndex > index) {
-        backSlashIndex = str.indexOf('\\', index);
-        if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {
-          return true;
-        }
-      }
-    }
-
-    if (pipeIndex !== -1 && str[index] === '(' && str[index + 1] !== '|') {
-      if (pipeIndex < index) {
-        pipeIndex = str.indexOf('|', index);
-      }
-      if (pipeIndex !== -1 && str[pipeIndex + 1] !== ')') {
-        closeParenIndex = str.indexOf(')', pipeIndex);
-        if (closeParenIndex > pipeIndex) {
-          backSlashIndex = str.indexOf('\\', pipeIndex);
-          if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {
-            return true;
-          }
-        }
-      }
-    }
-
-    if (str[index] === '\\') {
-      var open = str[index + 1];
-      index += 2;
-      var close = chars[open];
-
-      if (close) {
-        var n = str.indexOf(close, index);
-        if (n !== -1) {
-          index = n + 1;
-        }
-      }
-
-      if (str[index] === '!') {
-        return true;
-      }
-    } else {
-      index++;
-    }
-  }
-  return false;
-};
-
-var relaxedCheck = function(str) {
-  if (str[0] === '!') {
-    return true;
-  }
-  var index = 0;
-  while (index < str.length) {
-    if (/[*?{}()[\]]/.test(str[index])) {
-      return true;
-    }
-
-    if (str[index] === '\\') {
-      var open = str[index + 1];
-      index += 2;
-      var close = chars[open];
-
-      if (close) {
-        var n = str.indexOf(close, index);
-        if (n !== -1) {
-          index = n + 1;
-        }
-      }
-
-      if (str[index] === '!') {
-        return true;
-      }
-    } else {
-      index++;
-    }
-  }
-  return false;
-};
-
-module.exports = function isGlob(str, options) {
-  if (typeof str !== 'string' || str === '') {
-    return false;
-  }
-
-  if (isExtglob(str)) {
-    return true;
-  }
-
-  var check = strictCheck;
-
-  // optionally relax check
-  if (options && options.strict === false) {
-    check = relaxedCheck;
-  }
-
-  return check(str);
-};
diff --git a/node_modules/is-glob/package.json b/node_modules/is-glob/package.json
deleted file mode 100644
index 858af0378e9d36813353b51271aec88ee0d3328b..0000000000000000000000000000000000000000
--- a/node_modules/is-glob/package.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
-  "name": "is-glob",
-  "description": "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a better user experience.",
-  "version": "4.0.3",
-  "homepage": "https://github.com/micromatch/is-glob",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "contributors": [
-    "Brian Woodward (https://twitter.com/doowb)",
-    "Daniel Perez (https://tuvistavie.com)",
-    "Jon Schlinkert (http://twitter.com/jonschlinkert)"
-  ],
-  "repository": "micromatch/is-glob",
-  "bugs": {
-    "url": "https://github.com/micromatch/is-glob/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "scripts": {
-    "test": "mocha && node benchmark.js"
-  },
-  "dependencies": {
-    "is-extglob": "^2.1.1"
-  },
-  "devDependencies": {
-    "gulp-format-md": "^0.1.10",
-    "mocha": "^3.0.2"
-  },
-  "keywords": [
-    "bash",
-    "braces",
-    "check",
-    "exec",
-    "expression",
-    "extglob",
-    "glob",
-    "globbing",
-    "globstar",
-    "is",
-    "match",
-    "matches",
-    "pattern",
-    "regex",
-    "regular",
-    "string",
-    "test"
-  ],
-  "verb": {
-    "layout": "default",
-    "plugins": [
-      "gulp-format-md"
-    ],
-    "related": {
-      "list": [
-        "assemble",
-        "base",
-        "update",
-        "verb"
-      ]
-    },
-    "reflinks": [
-      "assemble",
-      "bach",
-      "base",
-      "composer",
-      "gulp",
-      "has-glob",
-      "is-valid-glob",
-      "micromatch",
-      "npm",
-      "scaffold",
-      "verb",
-      "vinyl"
-    ]
-  }
-}
diff --git a/node_modules/is-number/LICENSE b/node_modules/is-number/LICENSE
deleted file mode 100644
index 9af4a67d206f24ecdbb5fdff2839041ca0bbd346..0000000000000000000000000000000000000000
--- a/node_modules/is-number/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014-present, Jon Schlinkert.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/node_modules/is-number/README.md b/node_modules/is-number/README.md
deleted file mode 100644
index eb8149e8cf5f148f16ba21b2d5b452e19f984696..0000000000000000000000000000000000000000
--- a/node_modules/is-number/README.md
+++ /dev/null
@@ -1,187 +0,0 @@
-# is-number [![NPM version](https://img.shields.io/npm/v/is-number.svg?style=flat)](https://www.npmjs.com/package/is-number) [![NPM monthly downloads](https://img.shields.io/npm/dm/is-number.svg?style=flat)](https://npmjs.org/package/is-number) [![NPM total downloads](https://img.shields.io/npm/dt/is-number.svg?style=flat)](https://npmjs.org/package/is-number) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/is-number.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/is-number)
-
-> Returns true if the value is a finite number.
-
-Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-$ npm install --save is-number
-```
-
-## Why is this needed?
-
-In JavaScript, it's not always as straightforward as it should be to reliably check if a value is a number. It's common for devs to use `+`, `-`, or `Number()` to cast a string value to a number (for example, when values are returned from user input, regex matches, parsers, etc). But there are many non-intuitive edge cases that yield unexpected results:
-
-```js
-console.log(+[]); //=> 0
-console.log(+''); //=> 0
-console.log(+'   '); //=> 0
-console.log(typeof NaN); //=> 'number'
-```
-
-This library offers a performant way to smooth out edge cases like these.
-
-## Usage
-
-```js
-const isNumber = require('is-number');
-```
-
-See the [tests](./test.js) for more examples.
-
-### true
-
-```js
-isNumber(5e3);               // true
-isNumber(0xff);              // true
-isNumber(-1.1);              // true
-isNumber(0);                 // true
-isNumber(1);                 // true
-isNumber(1.1);               // true
-isNumber(10);                // true
-isNumber(10.10);             // true
-isNumber(100);               // true
-isNumber('-1.1');            // true
-isNumber('0');               // true
-isNumber('012');             // true
-isNumber('0xff');            // true
-isNumber('1');               // true
-isNumber('1.1');             // true
-isNumber('10');              // true
-isNumber('10.10');           // true
-isNumber('100');             // true
-isNumber('5e3');             // true
-isNumber(parseInt('012'));   // true
-isNumber(parseFloat('012')); // true
-```
-
-### False
-
-Everything else is false, as you would expect:
-
-```js
-isNumber(Infinity);          // false
-isNumber(NaN);               // false
-isNumber(null);              // false
-isNumber(undefined);         // false
-isNumber('');                // false
-isNumber('   ');             // false
-isNumber('foo');             // false
-isNumber([1]);               // false
-isNumber([]);                // false
-isNumber(function () {});    // false
-isNumber({});                // false
-```
-
-## Release history
-
-### 7.0.0
-
-* Refactor. Now uses `.isFinite` if it exists.
-* Performance is about the same as v6.0 when the value is a string or number. But it's now 3x-4x faster when the value is not a string or number.
-
-### 6.0.0
-
-* Optimizations, thanks to @benaadams.
-
-### 5.0.0
-
-**Breaking changes**
-
-* removed support for `instanceof Number` and `instanceof String`
-
-## Benchmarks
-
-As with all benchmarks, take these with a grain of salt. See the [benchmarks](./benchmark/index.js) for more detail.
-
-```
-# all
-v7.0 x 413,222 ops/sec ±2.02% (86 runs sampled)
-v6.0 x 111,061 ops/sec ±1.29% (85 runs sampled)
-parseFloat x 317,596 ops/sec ±1.36% (86 runs sampled)
-fastest is 'v7.0'
-
-# string
-v7.0 x 3,054,496 ops/sec ±1.05% (89 runs sampled)
-v6.0 x 2,957,781 ops/sec ±0.98% (88 runs sampled)
-parseFloat x 3,071,060 ops/sec ±1.13% (88 runs sampled)
-fastest is 'parseFloat,v7.0'
-
-# number
-v7.0 x 3,146,895 ops/sec ±0.89% (89 runs sampled)
-v6.0 x 3,214,038 ops/sec ±1.07% (89 runs sampled)
-parseFloat x 3,077,588 ops/sec ±1.07% (87 runs sampled)
-fastest is 'v6.0'
-```
-
-## About
-
-<details>
-<summary><strong>Contributing</strong></summary>
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-</details>
-
-<details>
-<summary><strong>Running Tests</strong></summary>
-
-Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
-
-```sh
-$ npm install && npm test
-```
-
-</details>
-
-<details>
-<summary><strong>Building docs</strong></summary>
-
-_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
-
-To generate the readme, run the following command:
-
-```sh
-$ npm install -g verbose/verb#dev verb-generate-readme && verb
-```
-
-</details>
-
-### Related projects
-
-You might also be interested in these projects:
-
-* [is-plain-object](https://www.npmjs.com/package/is-plain-object): Returns true if an object was created by the `Object` constructor. | [homepage](https://github.com/jonschlinkert/is-plain-object "Returns true if an object was created by the `Object` constructor.")
-* [is-primitive](https://www.npmjs.com/package/is-primitive): Returns `true` if the value is a primitive.  | [homepage](https://github.com/jonschlinkert/is-primitive "Returns `true` if the value is a primitive. ")
-* [isobject](https://www.npmjs.com/package/isobject): Returns true if the value is an object and not an array or null. | [homepage](https://github.com/jonschlinkert/isobject "Returns true if the value is an object and not an array or null.")
-* [kind-of](https://www.npmjs.com/package/kind-of): Get the native type of a value. | [homepage](https://github.com/jonschlinkert/kind-of "Get the native type of a value.")
-
-### Contributors
-
-| **Commits** | **Contributor** | 
-| --- | --- |
-| 49 | [jonschlinkert](https://github.com/jonschlinkert) |
-| 5 | [charlike-old](https://github.com/charlike-old) |
-| 1 | [benaadams](https://github.com/benaadams) |
-| 1 | [realityking](https://github.com/realityking) |
-
-### Author
-
-**Jon Schlinkert**
-
-* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
-* [GitHub Profile](https://github.com/jonschlinkert)
-* [Twitter Profile](https://twitter.com/jonschlinkert)
-
-### License
-
-Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT License](LICENSE).
-
-***
-
-_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on June 15, 2018._
\ No newline at end of file
diff --git a/node_modules/is-number/index.js b/node_modules/is-number/index.js
deleted file mode 100644
index 27f19b757f7c1186b92c405a213bf0dd9b6cbe95..0000000000000000000000000000000000000000
--- a/node_modules/is-number/index.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/*!
- * is-number <https://github.com/jonschlinkert/is-number>
- *
- * Copyright (c) 2014-present, Jon Schlinkert.
- * Released under the MIT License.
- */
-
-'use strict';
-
-module.exports = function(num) {
-  if (typeof num === 'number') {
-    return num - num === 0;
-  }
-  if (typeof num === 'string' && num.trim() !== '') {
-    return Number.isFinite ? Number.isFinite(+num) : isFinite(+num);
-  }
-  return false;
-};
diff --git a/node_modules/is-number/package.json b/node_modules/is-number/package.json
deleted file mode 100644
index 3715072609d61a010bff7116331b71f04206af96..0000000000000000000000000000000000000000
--- a/node_modules/is-number/package.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
-  "name": "is-number",
-  "description": "Returns true if a number or string value is a finite number. Useful for regex matches, parsing, user input, etc.",
-  "version": "7.0.0",
-  "homepage": "https://github.com/jonschlinkert/is-number",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "contributors": [
-    "Jon Schlinkert (http://twitter.com/jonschlinkert)",
-    "Olsten Larck (https://i.am.charlike.online)",
-    "Rouven Weßling (www.rouvenwessling.de)"
-  ],
-  "repository": "jonschlinkert/is-number",
-  "bugs": {
-    "url": "https://github.com/jonschlinkert/is-number/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=0.12.0"
-  },
-  "scripts": {
-    "test": "mocha"
-  },
-  "devDependencies": {
-    "ansi": "^0.3.1",
-    "benchmark": "^2.1.4",
-    "gulp-format-md": "^1.0.0",
-    "mocha": "^3.5.3"
-  },
-  "keywords": [
-    "cast",
-    "check",
-    "coerce",
-    "coercion",
-    "finite",
-    "integer",
-    "is",
-    "isnan",
-    "is-nan",
-    "is-num",
-    "is-number",
-    "isnumber",
-    "isfinite",
-    "istype",
-    "kind",
-    "math",
-    "nan",
-    "num",
-    "number",
-    "numeric",
-    "parseFloat",
-    "parseInt",
-    "test",
-    "type",
-    "typeof",
-    "value"
-  ],
-  "verb": {
-    "toc": false,
-    "layout": "default",
-    "tasks": [
-      "readme"
-    ],
-    "related": {
-      "list": [
-        "is-plain-object",
-        "is-primitive",
-        "isobject",
-        "kind-of"
-      ]
-    },
-    "plugins": [
-      "gulp-format-md"
-    ],
-    "lint": {
-      "reflinks": true
-    }
-  }
-}
diff --git a/node_modules/isarray/README.md b/node_modules/isarray/README.md
deleted file mode 100644
index 052a62b8d7b7ae2c6016d173319db607453659f8..0000000000000000000000000000000000000000
--- a/node_modules/isarray/README.md
+++ /dev/null
@@ -1,54 +0,0 @@
-
-# isarray
-
-`Array#isArray` for older browsers.
-
-## Usage
-
-```js
-var isArray = require('isarray');
-
-console.log(isArray([])); // => true
-console.log(isArray({})); // => false
-```
-
-## Installation
-
-With [npm](http://npmjs.org) do
-
-```bash
-$ npm install isarray
-```
-
-Then bundle for the browser with
-[browserify](https://github.com/substack/browserify).
-
-With [component](http://component.io) do
-
-```bash
-$ component install juliangruber/isarray
-```
-
-## License
-
-(MIT)
-
-Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/node_modules/isarray/build/build.js b/node_modules/isarray/build/build.js
deleted file mode 100644
index ec58596aeebe4eadcd7b5eeb5bd992233391d422..0000000000000000000000000000000000000000
--- a/node_modules/isarray/build/build.js
+++ /dev/null
@@ -1,209 +0,0 @@
-
-/**
- * Require the given path.
- *
- * @param {String} path
- * @return {Object} exports
- * @api public
- */
-
-function require(path, parent, orig) {
-  var resolved = require.resolve(path);
-
-  // lookup failed
-  if (null == resolved) {
-    orig = orig || path;
-    parent = parent || 'root';
-    var err = new Error('Failed to require "' + orig + '" from "' + parent + '"');
-    err.path = orig;
-    err.parent = parent;
-    err.require = true;
-    throw err;
-  }
-
-  var module = require.modules[resolved];
-
-  // perform real require()
-  // by invoking the module's
-  // registered function
-  if (!module.exports) {
-    module.exports = {};
-    module.client = module.component = true;
-    module.call(this, module.exports, require.relative(resolved), module);
-  }
-
-  return module.exports;
-}
-
-/**
- * Registered modules.
- */
-
-require.modules = {};
-
-/**
- * Registered aliases.
- */
-
-require.aliases = {};
-
-/**
- * Resolve `path`.
- *
- * Lookup:
- *
- *   - PATH/index.js
- *   - PATH.js
- *   - PATH
- *
- * @param {String} path
- * @return {String} path or null
- * @api private
- */
-
-require.resolve = function(path) {
-  if (path.charAt(0) === '/') path = path.slice(1);
-  var index = path + '/index.js';
-
-  var paths = [
-    path,
-    path + '.js',
-    path + '.json',
-    path + '/index.js',
-    path + '/index.json'
-  ];
-
-  for (var i = 0; i < paths.length; i++) {
-    var path = paths[i];
-    if (require.modules.hasOwnProperty(path)) return path;
-  }
-
-  if (require.aliases.hasOwnProperty(index)) {
-    return require.aliases[index];
-  }
-};
-
-/**
- * Normalize `path` relative to the current path.
- *
- * @param {String} curr
- * @param {String} path
- * @return {String}
- * @api private
- */
-
-require.normalize = function(curr, path) {
-  var segs = [];
-
-  if ('.' != path.charAt(0)) return path;
-
-  curr = curr.split('/');
-  path = path.split('/');
-
-  for (var i = 0; i < path.length; ++i) {
-    if ('..' == path[i]) {
-      curr.pop();
-    } else if ('.' != path[i] && '' != path[i]) {
-      segs.push(path[i]);
-    }
-  }
-
-  return curr.concat(segs).join('/');
-};
-
-/**
- * Register module at `path` with callback `definition`.
- *
- * @param {String} path
- * @param {Function} definition
- * @api private
- */
-
-require.register = function(path, definition) {
-  require.modules[path] = definition;
-};
-
-/**
- * Alias a module definition.
- *
- * @param {String} from
- * @param {String} to
- * @api private
- */
-
-require.alias = function(from, to) {
-  if (!require.modules.hasOwnProperty(from)) {
-    throw new Error('Failed to alias "' + from + '", it does not exist');
-  }
-  require.aliases[to] = from;
-};
-
-/**
- * Return a require function relative to the `parent` path.
- *
- * @param {String} parent
- * @return {Function}
- * @api private
- */
-
-require.relative = function(parent) {
-  var p = require.normalize(parent, '..');
-
-  /**
-   * lastIndexOf helper.
-   */
-
-  function lastIndexOf(arr, obj) {
-    var i = arr.length;
-    while (i--) {
-      if (arr[i] === obj) return i;
-    }
-    return -1;
-  }
-
-  /**
-   * The relative require() itself.
-   */
-
-  function localRequire(path) {
-    var resolved = localRequire.resolve(path);
-    return require(resolved, parent, path);
-  }
-
-  /**
-   * Resolve relative to the parent.
-   */
-
-  localRequire.resolve = function(path) {
-    var c = path.charAt(0);
-    if ('/' == c) return path.slice(1);
-    if ('.' == c) return require.normalize(p, path);
-
-    // resolve deps by returning
-    // the dep in the nearest "deps"
-    // directory
-    var segs = parent.split('/');
-    var i = lastIndexOf(segs, 'deps') + 1;
-    if (!i) i = 0;
-    path = segs.slice(0, i + 1).join('/') + '/deps/' + path;
-    return path;
-  };
-
-  /**
-   * Check if module is defined at `path`.
-   */
-
-  localRequire.exists = function(path) {
-    return require.modules.hasOwnProperty(localRequire.resolve(path));
-  };
-
-  return localRequire;
-};
-require.register("isarray/index.js", function(exports, require, module){
-module.exports = Array.isArray || function (arr) {
-  return Object.prototype.toString.call(arr) == '[object Array]';
-};
-
-});
-require.alias("isarray/index.js", "isarray/index.js");
-
diff --git a/node_modules/isarray/component.json b/node_modules/isarray/component.json
deleted file mode 100644
index 9e31b6838890159e397063bdd2ea7de80b4e4a42..0000000000000000000000000000000000000000
--- a/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/isarray/index.js b/node_modules/isarray/index.js
deleted file mode 100644
index 5f5ad45d46dda97cc2ae37932e0dacf25d06352d..0000000000000000000000000000000000000000
--- a/node_modules/isarray/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = Array.isArray || function (arr) {
-  return Object.prototype.toString.call(arr) == '[object Array]';
-};
diff --git a/node_modules/isarray/package.json b/node_modules/isarray/package.json
deleted file mode 100644
index 5a1e9c1098d0ff8bdb4955e5e714bb2270e6a25c..0000000000000000000000000000000000000000
--- a/node_modules/isarray/package.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "name" : "isarray",
-  "description" : "Array#isArray for older browsers",
-  "version" : "0.0.1",
-  "repository" : {
-    "type" : "git",
-    "url" : "git://github.com/juliangruber/isarray.git"
-  },
-  "homepage": "https://github.com/juliangruber/isarray",
-  "main" : "index.js",
-  "scripts" : {
-    "test" : "tap test/*.js"
-  },
-  "dependencies" : {},
-  "devDependencies" : {
-    "tap" : "*"
-  },
-  "keywords": ["browser","isarray","array"],
-  "author": {
-    "name": "Julian Gruber",
-    "email": "mail@juliangruber.com",
-    "url": "http://juliangruber.com"
-  },
-  "license": "MIT"
-}
diff --git a/node_modules/merge-descriptors/HISTORY.md b/node_modules/merge-descriptors/HISTORY.md
deleted file mode 100644
index 486771f08bcb1c31a5f6cf0125ad8c422a2b2fcc..0000000000000000000000000000000000000000
--- a/node_modules/merge-descriptors/HISTORY.md
+++ /dev/null
@@ -1,21 +0,0 @@
-1.0.1 / 2016-01-17
-==================
-
-  * perf: enable strict mode
-
-1.0.0 / 2015-03-01
-==================
-
-  * Add option to only add new descriptors
-  * Add simple argument validation
-  * Add jsdoc to source file
-
-0.0.2 / 2013-12-14
-==================
-
-  * Move repository to `component` organization
-
-0.0.1 / 2013-10-29
-==================
-
-  * Initial release
diff --git a/node_modules/merge-descriptors/LICENSE b/node_modules/merge-descriptors/LICENSE
deleted file mode 100644
index 274bfd82b2e075c7a264f01c10324d91d636403f..0000000000000000000000000000000000000000
--- a/node_modules/merge-descriptors/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2013 Jonathan Ong <me@jongleberry.com>
-Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.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/merge-descriptors/README.md b/node_modules/merge-descriptors/README.md
deleted file mode 100644
index 3403f4a0cca592db4d3918bc5bef567e1ae48d17..0000000000000000000000000000000000000000
--- a/node_modules/merge-descriptors/README.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# merge-descriptors
-
-[![NPM Version][npm-image]][npm-url]
-[![NPM Downloads][downloads-image]][downloads-url]
-[![Build Status][travis-image]][travis-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-Merge objects using descriptors.
-
-```js
-var thing = {
-  get name() {
-    return 'jon'
-  }
-}
-
-var animal = {
-
-}
-
-merge(animal, thing)
-
-animal.name === 'jon'
-```
-
-## API
-
-### merge(destination, source)
-
-Redefines `destination`'s descriptors with `source`'s. The return value is the
-`destination` object.
-
-### merge(destination, source, false)
-
-Defines `source`'s descriptors on `destination` if `destination` does not have
-a descriptor by the same name. The return value is the `destination` object.
-
-## License
-
-[MIT](LICENSE)
-
-[npm-image]: https://img.shields.io/npm/v/merge-descriptors.svg
-[npm-url]: https://npmjs.org/package/merge-descriptors
-[travis-image]: https://img.shields.io/travis/component/merge-descriptors/master.svg
-[travis-url]: https://travis-ci.org/component/merge-descriptors
-[coveralls-image]: https://img.shields.io/coveralls/component/merge-descriptors/master.svg
-[coveralls-url]: https://coveralls.io/r/component/merge-descriptors?branch=master
-[downloads-image]: https://img.shields.io/npm/dm/merge-descriptors.svg
-[downloads-url]: https://npmjs.org/package/merge-descriptors
diff --git a/node_modules/merge-descriptors/index.js b/node_modules/merge-descriptors/index.js
deleted file mode 100644
index f22ebab4c6b9c11ff31cce8ccadcca0b11a1c4e5..0000000000000000000000000000000000000000
--- a/node_modules/merge-descriptors/index.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/*!
- * merge-descriptors
- * Copyright(c) 2014 Jonathan Ong
- * Copyright(c) 2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = merge
-
-/**
- * Module variables.
- * @private
- */
-
-var hasOwnProperty = Object.prototype.hasOwnProperty
-
-/**
- * Merge the property descriptors of `src` into `dest`
- *
- * @param {object} dest Object to add descriptors to
- * @param {object} src Object to clone descriptors from
- * @param {boolean} [redefine=true] Redefine `dest` properties with `src` properties
- * @returns {object} Reference to dest
- * @public
- */
-
-function merge (dest, src, redefine) {
-  if (!dest) {
-    throw new TypeError('argument dest is required')
-  }
-
-  if (!src) {
-    throw new TypeError('argument src is required')
-  }
-
-  if (redefine === undefined) {
-    // Default to true
-    redefine = true
-  }
-
-  Object.getOwnPropertyNames(src).forEach(function forEachOwnPropertyName (name) {
-    if (!redefine && hasOwnProperty.call(dest, name)) {
-      // Skip descriptor
-      return
-    }
-
-    // Copy descriptor
-    var descriptor = Object.getOwnPropertyDescriptor(src, name)
-    Object.defineProperty(dest, name, descriptor)
-  })
-
-  return dest
-}
diff --git a/node_modules/merge-descriptors/package.json b/node_modules/merge-descriptors/package.json
deleted file mode 100644
index aa9af0a85f45b460d6c06a6dd189dc42aad58460..0000000000000000000000000000000000000000
--- a/node_modules/merge-descriptors/package.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
-  "name": "merge-descriptors",
-  "description": "Merge objects using descriptors",
-  "version": "1.0.3",
-  "author": {
-    "name": "Jonathan Ong",
-    "email": "me@jongleberry.com",
-    "url": "http://jongleberry.com",
-    "twitter": "https://twitter.com/jongleberry"
-  },
-  "contributors": [
-    "Douglas Christopher Wilson <doug@somethingdoug.com>",
-    "Mike Grabowski <grabbou@gmail.com>"
-  ],
-  "license": "MIT",
-  "repository": "sindresorhus/merge-descriptors",
-  "funding": "https://github.com/sponsors/sindresorhus",
-  "devDependencies": {
-    "eslint": "5.9.0",
-    "eslint-config-standard": "12.0.0",
-    "eslint-plugin-import": "2.14.0",
-    "eslint-plugin-node": "7.0.1",
-    "eslint-plugin-promise": "4.0.1",
-    "eslint-plugin-standard": "4.0.0",
-    "mocha": "5.2.0",
-    "nyc": "13.1.0"
-  },
-  "files": [
-    "HISTORY.md",
-    "LICENSE",
-    "README.md",
-    "index.js"
-  ],
-  "scripts": {
-    "lint": "eslint .",
-    "test": "mocha test/",
-    "test-cov": "nyc --reporter=html --reporter=text npm test"
-  }
-}
diff --git a/node_modules/methods/HISTORY.md b/node_modules/methods/HISTORY.md
deleted file mode 100644
index c0ecf072db3f9809c46c83f5641b5df99c686bbf..0000000000000000000000000000000000000000
--- a/node_modules/methods/HISTORY.md
+++ /dev/null
@@ -1,29 +0,0 @@
-1.1.2 / 2016-01-17
-==================
-
-  * perf: enable strict mode
-
-1.1.1 / 2014-12-30
-==================
-
-  * Improve `browserify` support
-
-1.1.0 / 2014-07-05
-==================
-
-  * Add `CONNECT` method
- 
-1.0.1 / 2014-06-02
-==================
-
-  * Fix module to work with harmony transform
-
-1.0.0 / 2014-05-08
-==================
-
-  * Add `PURGE` method
-
-0.1.0 / 2013-10-28
-==================
-
-  * Add `http.METHODS` support
diff --git a/node_modules/methods/LICENSE b/node_modules/methods/LICENSE
deleted file mode 100644
index 220dc1a247943ef3837b65754455dfb179260070..0000000000000000000000000000000000000000
--- a/node_modules/methods/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2013-2014 TJ Holowaychuk <tj@vision-media.ca>
-Copyright (c) 2015-2016 Douglas Christopher Wilson <doug@somethingdoug.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/methods/README.md b/node_modules/methods/README.md
deleted file mode 100644
index 672a32bfe5d685306f18b7a81a15af9fbbd00a0f..0000000000000000000000000000000000000000
--- a/node_modules/methods/README.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# Methods
-
-[![NPM Version][npm-image]][npm-url]
-[![NPM Downloads][downloads-image]][downloads-url]
-[![Node.js Version][node-version-image]][node-version-url]
-[![Build Status][travis-image]][travis-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-HTTP verbs that Node.js core's HTTP parser supports.
-
-This module provides an export that is just like `http.METHODS` from Node.js core,
-with the following differences:
-
-  * All method names are lower-cased.
-  * Contains a fallback list of methods for Node.js versions that do not have a
-    `http.METHODS` export (0.10 and lower).
-  * Provides the fallback list when using tools like `browserify` without pulling
-    in the `http` shim module.
-
-## Install
-
-```bash
-$ npm install methods
-```
-
-## API
-
-```js
-var methods = require('methods')
-```
-
-### methods
-
-This is an array of lower-cased method names that Node.js supports. If Node.js
-provides the `http.METHODS` export, then this is the same array lower-cased,
-otherwise it is a snapshot of the verbs from Node.js 0.10.
-
-## License
-
-[MIT](LICENSE)
-
-[npm-image]: https://img.shields.io/npm/v/methods.svg?style=flat
-[npm-url]: https://npmjs.org/package/methods
-[node-version-image]: https://img.shields.io/node/v/methods.svg?style=flat
-[node-version-url]: https://nodejs.org/en/download/
-[travis-image]: https://img.shields.io/travis/jshttp/methods.svg?style=flat
-[travis-url]: https://travis-ci.org/jshttp/methods
-[coveralls-image]: https://img.shields.io/coveralls/jshttp/methods.svg?style=flat
-[coveralls-url]: https://coveralls.io/r/jshttp/methods?branch=master
-[downloads-image]: https://img.shields.io/npm/dm/methods.svg?style=flat
-[downloads-url]: https://npmjs.org/package/methods
diff --git a/node_modules/methods/index.js b/node_modules/methods/index.js
deleted file mode 100644
index 667a50bde7d852359b1ebd9fa8ea8b8582bc64ac..0000000000000000000000000000000000000000
--- a/node_modules/methods/index.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/*!
- * methods
- * Copyright(c) 2013-2014 TJ Holowaychuk
- * Copyright(c) 2015-2016 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module dependencies.
- * @private
- */
-
-var http = require('http');
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = getCurrentNodeMethods() || getBasicNodeMethods();
-
-/**
- * Get the current Node.js methods.
- * @private
- */
-
-function getCurrentNodeMethods() {
-  return http.METHODS && http.METHODS.map(function lowerCaseMethod(method) {
-    return method.toLowerCase();
-  });
-}
-
-/**
- * Get the "basic" Node.js methods, a snapshot from Node.js 0.10.
- * @private
- */
-
-function getBasicNodeMethods() {
-  return [
-    'get',
-    'post',
-    'put',
-    'head',
-    'delete',
-    'options',
-    'trace',
-    'copy',
-    'lock',
-    'mkcol',
-    'move',
-    'purge',
-    'propfind',
-    'proppatch',
-    'unlock',
-    'report',
-    'mkactivity',
-    'checkout',
-    'merge',
-    'm-search',
-    'notify',
-    'subscribe',
-    'unsubscribe',
-    'patch',
-    'search',
-    'connect'
-  ];
-}
diff --git a/node_modules/methods/package.json b/node_modules/methods/package.json
deleted file mode 100644
index c4ce6f053c68581068898fd2a4be53a861e5b1b5..0000000000000000000000000000000000000000
--- a/node_modules/methods/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "name": "methods",
-  "description": "HTTP methods that node supports",
-  "version": "1.1.2",
-  "contributors": [
-    "Douglas Christopher Wilson <doug@somethingdoug.com>",
-    "Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)",
-    "TJ Holowaychuk <tj@vision-media.ca> (http://tjholowaychuk.com)"
-  ],
-  "license": "MIT",
-  "repository": "jshttp/methods",
-  "devDependencies": {
-    "istanbul": "0.4.1",
-    "mocha": "1.21.5"
-  },
-  "files": [
-    "index.js",
-    "HISTORY.md",
-    "LICENSE"
-  ],
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "scripts": {
-    "test": "mocha --reporter spec --bail --check-leaks test/",
-    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
-    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/"
-  },
-  "browser": {
-    "http": false
-  },
-  "keywords": [
-    "http",
-    "methods"
-  ]
-}
diff --git a/node_modules/mime/.npmignore b/node_modules/mime/.npmignore
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/node_modules/mime/CHANGELOG.md b/node_modules/mime/CHANGELOG.md
deleted file mode 100644
index f1275350531d30ca6dd665cbb5fe78fc5e702948..0000000000000000000000000000000000000000
--- a/node_modules/mime/CHANGELOG.md
+++ /dev/null
@@ -1,164 +0,0 @@
-# Changelog
-
-## v1.6.0 (24/11/2017)
-*No changelog for this release.*
-
----
-
-## v2.0.4 (24/11/2017)
-- [**closed**] Switch to mime-score module for resolving extension contention issues. [#182](https://github.com/broofa/node-mime/issues/182)
-- [**closed**] Update mime-db to 1.31.0 in v1.x branch [#181](https://github.com/broofa/node-mime/issues/181)
-
----
-
-## v1.5.0 (22/11/2017)
-- [**closed**] need ES5 version ready in npm package [#179](https://github.com/broofa/node-mime/issues/179)
-- [**closed**] mime-db no trace of iWork - pages / numbers / etc. [#178](https://github.com/broofa/node-mime/issues/178)
-- [**closed**] How it works in brownser ? [#176](https://github.com/broofa/node-mime/issues/176)
-- [**closed**] Missing `./Mime` [#175](https://github.com/broofa/node-mime/issues/175)
-- [**closed**] Vulnerable Regular Expression [#167](https://github.com/broofa/node-mime/issues/167)
-
----
-
-## v2.0.3 (25/09/2017)
-*No changelog for this release.*
-
----
-
-## v1.4.1 (25/09/2017)
-- [**closed**] Issue when bundling with webpack [#172](https://github.com/broofa/node-mime/issues/172)
-
----
-
-## v2.0.2 (15/09/2017)
-- [**V2**] fs.readFileSync is not a function [#165](https://github.com/broofa/node-mime/issues/165)
-- [**closed**] The extension for video/quicktime should map to .mov, not .qt [#164](https://github.com/broofa/node-mime/issues/164)
-- [**V2**] [v2 Feedback request] Mime class API [#163](https://github.com/broofa/node-mime/issues/163)
-- [**V2**] [v2 Feedback request] Resolving conflicts over extensions [#162](https://github.com/broofa/node-mime/issues/162)
-- [**V2**] Allow callers to load module with official, full, or no defined types.  [#161](https://github.com/broofa/node-mime/issues/161)
-- [**V2**] Use "facets" to resolve extension conflicts [#160](https://github.com/broofa/node-mime/issues/160)
-- [**V2**] Remove fs and path dependencies [#152](https://github.com/broofa/node-mime/issues/152)
-- [**V2**] Default content-type should not be application/octet-stream [#139](https://github.com/broofa/node-mime/issues/139)
-- [**V2**] reset mime-types [#124](https://github.com/broofa/node-mime/issues/124)
-- [**V2**] Extensionless paths should return null or false [#113](https://github.com/broofa/node-mime/issues/113)
-
----
-
-## v2.0.1 (14/09/2017)
-- [**closed**] Changelog for v2.0 does not mention breaking changes [#171](https://github.com/broofa/node-mime/issues/171)
-- [**closed**] MIME breaking with 'class' declaration as it is without 'use strict mode' [#170](https://github.com/broofa/node-mime/issues/170)
-
----
-
-## v2.0.0 (12/09/2017)
-- [**closed**] woff and woff2 [#168](https://github.com/broofa/node-mime/issues/168)
-
----
-
-## v1.4.0 (28/08/2017)
-- [**closed**] support for ac3 voc files [#159](https://github.com/broofa/node-mime/issues/159)
-- [**closed**] Help understanding change from application/xml to text/xml [#158](https://github.com/broofa/node-mime/issues/158)
-- [**closed**] no longer able to override mimetype [#157](https://github.com/broofa/node-mime/issues/157)
-- [**closed**] application/vnd.adobe.photoshop [#147](https://github.com/broofa/node-mime/issues/147)
-- [**closed**] Directories should appear as something other than application/octet-stream [#135](https://github.com/broofa/node-mime/issues/135)
-- [**closed**] requested features [#131](https://github.com/broofa/node-mime/issues/131)
-- [**closed**] Make types.json loading optional? [#129](https://github.com/broofa/node-mime/issues/129)
-- [**closed**] Cannot find module './types.json' [#120](https://github.com/broofa/node-mime/issues/120)
-- [**V2**] .wav files show up as "audio/x-wav" instead of "audio/x-wave" [#118](https://github.com/broofa/node-mime/issues/118)
-- [**closed**] Don't be a pain in the ass for node community [#108](https://github.com/broofa/node-mime/issues/108)
-- [**closed**] don't make default_type global [#78](https://github.com/broofa/node-mime/issues/78)
-- [**closed**] mime.extension() fails if the content-type is parameterized [#74](https://github.com/broofa/node-mime/issues/74)
-
----
-
-## v1.3.6 (11/05/2017)
-- [**closed**] .md should be text/markdown as of March 2016 [#154](https://github.com/broofa/node-mime/issues/154)
-- [**closed**] Error while installing mime [#153](https://github.com/broofa/node-mime/issues/153)
-- [**closed**] application/manifest+json [#149](https://github.com/broofa/node-mime/issues/149)
-- [**closed**] Dynamic adaptive streaming over HTTP (DASH) file extension typo [#141](https://github.com/broofa/node-mime/issues/141)
-- [**closed**] charsets image/png undefined [#140](https://github.com/broofa/node-mime/issues/140)
-- [**closed**] Mime-db dependency out of date [#130](https://github.com/broofa/node-mime/issues/130)
-- [**closed**] how to support plist? [#126](https://github.com/broofa/node-mime/issues/126)
-- [**closed**] how does .types file format look like? [#123](https://github.com/broofa/node-mime/issues/123)
-- [**closed**] Feature: support for expanding MIME patterns [#121](https://github.com/broofa/node-mime/issues/121)
-- [**closed**] DEBUG_MIME doesn't work [#117](https://github.com/broofa/node-mime/issues/117)
-
----
-
-## v1.3.4 (06/02/2015)
-*No changelog for this release.*
-
----
-
-## v1.3.3 (06/02/2015)
-*No changelog for this release.*
-
----
-
-## v1.3.1 (05/02/2015)
-- [**closed**] Consider adding support for Handlebars .hbs file ending [#111](https://github.com/broofa/node-mime/issues/111)
-- [**closed**] Consider adding support for hjson. [#110](https://github.com/broofa/node-mime/issues/110)
-- [**closed**] Add mime type for Opus audio files [#94](https://github.com/broofa/node-mime/issues/94)
-- [**closed**] Consider making the `Requesting New Types` information more visible [#77](https://github.com/broofa/node-mime/issues/77)
-
----
-
-## v1.3.0 (05/02/2015)
-- [**closed**] Add common name? [#114](https://github.com/broofa/node-mime/issues/114)
-- [**closed**] application/x-yaml [#104](https://github.com/broofa/node-mime/issues/104)
-- [**closed**] Add mime type for WOFF file format 2.0 [#102](https://github.com/broofa/node-mime/issues/102)
-- [**closed**] application/x-msi for .msi [#99](https://github.com/broofa/node-mime/issues/99)
-- [**closed**] Add mimetype for gettext translation files [#98](https://github.com/broofa/node-mime/issues/98)
-- [**closed**] collaborators [#88](https://github.com/broofa/node-mime/issues/88)
-- [**closed**] getting errot in installation of mime module...any1 can help? [#87](https://github.com/broofa/node-mime/issues/87)
-- [**closed**] should application/json's charset be utf8? [#86](https://github.com/broofa/node-mime/issues/86)
-- [**closed**] Add "license" and "licenses" to package.json [#81](https://github.com/broofa/node-mime/issues/81)
-- [**closed**] lookup with extension-less file on Windows returns wrong type [#68](https://github.com/broofa/node-mime/issues/68)
-
----
-
-## v1.2.11 (15/08/2013)
-- [**closed**] Update mime.types [#65](https://github.com/broofa/node-mime/issues/65)
-- [**closed**] Publish a new version [#63](https://github.com/broofa/node-mime/issues/63)
-- [**closed**] README should state upfront that "application/octet-stream" is default for unknown extension [#55](https://github.com/broofa/node-mime/issues/55)
-- [**closed**] Suggested improvement to the charset API [#52](https://github.com/broofa/node-mime/issues/52)
-
----
-
-## v1.2.10 (25/07/2013)
-- [**closed**] Mime type for woff files should be application/font-woff and not application/x-font-woff [#62](https://github.com/broofa/node-mime/issues/62)
-- [**closed**] node.types in conflict with mime.types [#51](https://github.com/broofa/node-mime/issues/51)
-
----
-
-## v1.2.9 (17/01/2013)
-- [**closed**] Please update "mime" NPM [#49](https://github.com/broofa/node-mime/issues/49)
-- [**closed**] Please add semicolon [#46](https://github.com/broofa/node-mime/issues/46)
-- [**closed**] parse full mime types [#43](https://github.com/broofa/node-mime/issues/43)
-
----
-
-## v1.2.8 (10/01/2013)
-- [**closed**] /js directory mime is application/javascript. Is it correct? [#47](https://github.com/broofa/node-mime/issues/47)
-- [**closed**] Add mime types for lua code. [#45](https://github.com/broofa/node-mime/issues/45)
-
----
-
-## v1.2.7 (19/10/2012)
-- [**closed**] cannot install 1.2.7 via npm [#41](https://github.com/broofa/node-mime/issues/41)
-- [**closed**] Transfer ownership to @broofa [#36](https://github.com/broofa/node-mime/issues/36)
-- [**closed**] it's wrong to set charset to UTF-8 for text [#30](https://github.com/broofa/node-mime/issues/30)
-- [**closed**] Allow multiple instances of MIME types container [#27](https://github.com/broofa/node-mime/issues/27)
-
----
-
-## v1.2.5 (16/02/2012)
-- [**closed**] When looking up a types, check hasOwnProperty [#23](https://github.com/broofa/node-mime/issues/23)
-- [**closed**] Bump version to 1.2.2 [#18](https://github.com/broofa/node-mime/issues/18)
-- [**closed**] No license [#16](https://github.com/broofa/node-mime/issues/16)
-- [**closed**] Some types missing that are used by html5/css3 [#13](https://github.com/broofa/node-mime/issues/13)
-- [**closed**] npm install fails for 1.2.1 [#12](https://github.com/broofa/node-mime/issues/12)
-- [**closed**] image/pjpeg + image/x-png [#10](https://github.com/broofa/node-mime/issues/10)
-- [**closed**] symlink [#8](https://github.com/broofa/node-mime/issues/8)
-- [**closed**] gzip [#2](https://github.com/broofa/node-mime/issues/2)
-- [**closed**] ALL CAPS filenames return incorrect mime type [#1](https://github.com/broofa/node-mime/issues/1)
diff --git a/node_modules/mime/LICENSE b/node_modules/mime/LICENSE
deleted file mode 100644
index d3f46f7e145990dad5954d78c5da9a2c2bdcbe36..0000000000000000000000000000000000000000
--- a/node_modules/mime/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2010 Benjamin Thomas, Robert Kieffer
-
-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/mime/README.md b/node_modules/mime/README.md
deleted file mode 100644
index 506fbe550a8dee9f0bde702fda6a040dfed3aba8..0000000000000000000000000000000000000000
--- a/node_modules/mime/README.md
+++ /dev/null
@@ -1,90 +0,0 @@
-# mime
-
-Comprehensive MIME type mapping API based on mime-db module.
-
-## Install
-
-Install with [npm](http://github.com/isaacs/npm):
-
-    npm install mime
-
-## Contributing / Testing
-
-    npm run test
-
-## Command Line
-
-    mime [path_string]
-
-E.g.
-
-    > mime scripts/jquery.js
-    application/javascript
-
-## API - Queries
-
-### mime.lookup(path)
-Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.').  E.g.
-
-```js
-var mime = require('mime');
-
-mime.lookup('/path/to/file.txt');         // => 'text/plain'
-mime.lookup('file.txt');                  // => 'text/plain'
-mime.lookup('.TXT');                      // => 'text/plain'
-mime.lookup('htm');                       // => 'text/html'
-```
-
-### mime.default_type
-Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.)
-
-### mime.extension(type)
-Get the default extension for `type`
-
-```js
-mime.extension('text/html');                 // => 'html'
-mime.extension('application/octet-stream');  // => 'bin'
-```
-
-### mime.charsets.lookup()
-
-Map mime-type to charset
-
-```js
-mime.charsets.lookup('text/plain');        // => 'UTF-8'
-```
-
-(The logic for charset lookups is pretty rudimentary.  Feel free to suggest improvements.)
-
-## API - Defining Custom Types
-
-Custom type mappings can be added on a per-project basis via the following APIs.
-
-### mime.define()
-
-Add custom mime/extension mappings
-
-```js
-mime.define({
-    'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],
-    'application/x-my-type': ['x-mt', 'x-mtt'],
-    // etc ...
-});
-
-mime.lookup('x-sft');                 // => 'text/x-some-format'
-```
-
-The first entry in the extensions array is returned by `mime.extension()`. E.g.
-
-```js
-mime.extension('text/x-some-format'); // => 'x-sf'
-```
-
-### mime.load(filepath)
-
-Load mappings from an Apache ".types" format file
-
-```js
-mime.load('./my_project.types');
-```
-The .types file format is simple -  See the `types` dir for examples.
diff --git a/node_modules/mime/cli.js b/node_modules/mime/cli.js
deleted file mode 100644
index 20b1ffeb2f97648e0faa7e022c98ed9e6a8e9a0d..0000000000000000000000000000000000000000
--- a/node_modules/mime/cli.js
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env node
-
-var mime = require('./mime.js');
-var file = process.argv[2];
-var type = mime.lookup(file);
-
-process.stdout.write(type + '\n');
-
diff --git a/node_modules/mime/mime.js b/node_modules/mime/mime.js
deleted file mode 100644
index d7efbde70b8e95fb7f67da9c8cfed11ce8ce4133..0000000000000000000000000000000000000000
--- a/node_modules/mime/mime.js
+++ /dev/null
@@ -1,108 +0,0 @@
-var path = require('path');
-var fs = require('fs');
-
-function Mime() {
-  // Map of extension -> mime type
-  this.types = Object.create(null);
-
-  // Map of mime type -> extension
-  this.extensions = Object.create(null);
-}
-
-/**
- * Define mimetype -> extension mappings.  Each key is a mime-type that maps
- * to an array of extensions associated with the type.  The first extension is
- * used as the default extension for the type.
- *
- * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']});
- *
- * @param map (Object) type definitions
- */
-Mime.prototype.define = function (map) {
-  for (var type in map) {
-    var exts = map[type];
-    for (var i = 0; i < exts.length; i++) {
-      if (process.env.DEBUG_MIME && this.types[exts[i]]) {
-        console.warn((this._loading || "define()").replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' +
-          this.types[exts[i]] + ' to ' + type);
-      }
-
-      this.types[exts[i]] = type;
-    }
-
-    // Default extension is the first one we encounter
-    if (!this.extensions[type]) {
-      this.extensions[type] = exts[0];
-    }
-  }
-};
-
-/**
- * Load an Apache2-style ".types" file
- *
- * This may be called multiple times (it's expected).  Where files declare
- * overlapping types/extensions, the last file wins.
- *
- * @param file (String) path of file to load.
- */
-Mime.prototype.load = function(file) {
-  this._loading = file;
-  // Read file and split into lines
-  var map = {},
-      content = fs.readFileSync(file, 'ascii'),
-      lines = content.split(/[\r\n]+/);
-
-  lines.forEach(function(line) {
-    // Clean up whitespace/comments, and split into fields
-    var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/);
-    map[fields.shift()] = fields;
-  });
-
-  this.define(map);
-
-  this._loading = null;
-};
-
-/**
- * Lookup a mime type based on extension
- */
-Mime.prototype.lookup = function(path, fallback) {
-  var ext = path.replace(/^.*[\.\/\\]/, '').toLowerCase();
-
-  return this.types[ext] || fallback || this.default_type;
-};
-
-/**
- * Return file extension associated with a mime type
- */
-Mime.prototype.extension = function(mimeType) {
-  var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase();
-  return this.extensions[type];
-};
-
-// Default instance
-var mime = new Mime();
-
-// Define built-in types
-mime.define(require('./types.json'));
-
-// Default type
-mime.default_type = mime.lookup('bin');
-
-//
-// Additional API specific to the default instance
-//
-
-mime.Mime = Mime;
-
-/**
- * Lookup a charset based on mime type.
- */
-mime.charsets = {
-  lookup: function(mimeType, fallback) {
-    // Assume text types are utf8
-    return (/^text\/|^application\/(javascript|json)/).test(mimeType) ? 'UTF-8' : fallback;
-  }
-};
-
-module.exports = mime;
diff --git a/node_modules/mime/package.json b/node_modules/mime/package.json
deleted file mode 100644
index 6bd24bc53c1a7067b60f43e559d1739d138b987f..0000000000000000000000000000000000000000
--- a/node_modules/mime/package.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "author": {
-    "name": "Robert Kieffer",
-    "url": "http://github.com/broofa",
-    "email": "robert@broofa.com"
-  },
-  "bin": {
-    "mime": "cli.js"
-  },
-  "engines": {
-    "node": ">=4"
-  },
-  "contributors": [
-    {
-      "name": "Benjamin Thomas",
-      "url": "http://github.com/bentomas",
-      "email": "benjamin@benjaminthomas.org"
-    }
-  ],
-  "description": "A comprehensive library for mime-type mapping",
-  "license": "MIT",
-  "dependencies": {},
-  "devDependencies": {
-    "github-release-notes": "0.13.1",
-    "mime-db": "1.31.0",
-    "mime-score": "1.1.0"
-  },
-  "scripts": {
-    "prepare": "node src/build.js",
-    "changelog": "gren changelog --tags=all --generate --override",
-    "test": "node src/test.js"
-  },
-  "keywords": [
-    "util",
-    "mime"
-  ],
-  "main": "mime.js",
-  "name": "mime",
-  "repository": {
-    "url": "https://github.com/broofa/node-mime",
-    "type": "git"
-  },
-  "version": "1.6.0"
-}
diff --git a/node_modules/mime/src/build.js b/node_modules/mime/src/build.js
deleted file mode 100644
index 4928e48bcd5db783074ca4d842ba24931645e1f6..0000000000000000000000000000000000000000
--- a/node_modules/mime/src/build.js
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/env node
-
-'use strict';
-
-const fs = require('fs');
-const path = require('path');
-const mimeScore = require('mime-score');
-
-let db = require('mime-db');
-let chalk = require('chalk');
-
-const STANDARD_FACET_SCORE = 900;
-
-const byExtension = {};
-
-// Clear out any conflict extensions in mime-db
-for (let type in db) {
-  let entry = db[type];
-  entry.type = type;
-
-  if (!entry.extensions) continue;
-
-  entry.extensions.forEach(ext => {
-    if (ext in byExtension) {
-      const e0 = entry;
-      const e1 = byExtension[ext];
-      e0.pri = mimeScore(e0.type, e0.source);
-      e1.pri = mimeScore(e1.type, e1.source);
-
-      let drop = e0.pri < e1.pri ? e0 : e1;
-      let keep = e0.pri >= e1.pri ? e0 : e1;
-      drop.extensions = drop.extensions.filter(e => e !== ext);
-
-      console.log(`${ext}: Keeping ${chalk.green(keep.type)} (${keep.pri}), dropping ${chalk.red(drop.type)} (${drop.pri})`);
-    }
-    byExtension[ext] = entry;
-  });
-}
-
-function writeTypesFile(types, path) {
-  fs.writeFileSync(path, JSON.stringify(types));
-}
-
-// Segregate into standard and non-standard types based on facet per
-// https://tools.ietf.org/html/rfc6838#section-3.1
-const types = {};
-
-Object.keys(db).sort().forEach(k => {
-  const entry = db[k];
-  types[entry.type] = entry.extensions;
-});
-
-writeTypesFile(types, path.join(__dirname, '..', 'types.json'));
diff --git a/node_modules/mime/src/test.js b/node_modules/mime/src/test.js
deleted file mode 100644
index 42958a20d5bdbae6a4724c6a8cc99f292b00b265..0000000000000000000000000000000000000000
--- a/node_modules/mime/src/test.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Usage: node test.js
- */
-
-var mime = require('../mime');
-var assert = require('assert');
-var path = require('path');
-
-//
-// Test mime lookups
-//
-
-assert.equal('text/plain', mime.lookup('text.txt'));     // normal file
-assert.equal('text/plain', mime.lookup('TEXT.TXT'));     // uppercase
-assert.equal('text/plain', mime.lookup('dir/text.txt')); // dir + file
-assert.equal('text/plain', mime.lookup('.text.txt'));    // hidden file
-assert.equal('text/plain', mime.lookup('.txt'));         // nameless
-assert.equal('text/plain', mime.lookup('txt'));          // extension-only
-assert.equal('text/plain', mime.lookup('/txt'));         // extension-less ()
-assert.equal('text/plain', mime.lookup('\\txt'));        // Windows, extension-less
-assert.equal('application/octet-stream', mime.lookup('text.nope')); // unrecognized
-assert.equal('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default
-
-//
-// Test extensions
-//
-
-assert.equal('txt', mime.extension(mime.types.text));
-assert.equal('html', mime.extension(mime.types.htm));
-assert.equal('bin', mime.extension('application/octet-stream'));
-assert.equal('bin', mime.extension('application/octet-stream '));
-assert.equal('html', mime.extension(' text/html; charset=UTF-8'));
-assert.equal('html', mime.extension('text/html; charset=UTF-8 '));
-assert.equal('html', mime.extension('text/html; charset=UTF-8'));
-assert.equal('html', mime.extension('text/html ; charset=UTF-8'));
-assert.equal('html', mime.extension('text/html;charset=UTF-8'));
-assert.equal('html', mime.extension('text/Html;charset=UTF-8'));
-assert.equal(undefined, mime.extension('unrecognized'));
-
-//
-// Test node.types lookups
-//
-
-assert.equal('font/woff', mime.lookup('file.woff'));
-assert.equal('application/octet-stream', mime.lookup('file.buffer'));
-// TODO: Uncomment once #157 is resolved
-// assert.equal('audio/mp4', mime.lookup('file.m4a'));
-assert.equal('font/otf', mime.lookup('file.otf'));
-
-//
-// Test charsets
-//
-
-assert.equal('UTF-8', mime.charsets.lookup('text/plain'));
-assert.equal('UTF-8', mime.charsets.lookup(mime.types.js));
-assert.equal('UTF-8', mime.charsets.lookup(mime.types.json));
-assert.equal(undefined, mime.charsets.lookup(mime.types.bin));
-assert.equal('fallback', mime.charsets.lookup('application/octet-stream', 'fallback'));
-
-console.log('\nAll tests passed');
diff --git a/node_modules/mime/types.json b/node_modules/mime/types.json
deleted file mode 100644
index bec78abd491e093599b2615533687a6b3c360526..0000000000000000000000000000000000000000
--- a/node_modules/mime/types.json
+++ /dev/null
@@ -1 +0,0 @@
-{"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomsvc+xml":["atomsvc"],"application/bdoc":["bdoc"],"application/ccxml+xml":["ccxml"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cu-seeme":["cu"],"application/dash+xml":["mpd"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/font-tdpfr":["pfr"],"application/font-woff":[],"application/font-woff2":[],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js","mjs"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/prs.cww":["cww"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":[],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":[],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":[],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":[],"application/x-msdownload":["com","bat"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["wmf","emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":[],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"application/xaml+xml":["xaml"],"application/xcap-diff+xml":["xdf"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":[],"audio/adpcm":["adp"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mp3":[],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/wav":["wav"],"audio/wave":[],"audio/webm":["weba"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":[],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":[],"audio/x-wav":[],"audio/xm":["xm"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/apng":["apng"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/g3fax":["g3"],"image/gif":["gif"],"image/ief":["ief"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jpm":["jpm"],"image/jpx":["jpx","jpf"],"image/ktx":["ktx"],"image/png":["png"],"image/prs.btif":["btif"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/tiff":["tiff","tif"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":[],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/webp":["webp"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":[],"image/x-pcx":["pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/rfc822":["eml","mime"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.vtu":["vtu"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["x3db","x3dbz"],"model/x3d+vrml":["x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/hjson":["hjson"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["markdown","md"],"text/mathml":["mml"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/prs.lines.tag":["dsc"],"text/richtext":["rtx"],"text/rtf":[],"text/sgml":["sgml","sgm"],"text/slim":["slim","slm"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/vtt":["vtt"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":[],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"text/xml":[],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/jpeg":["jpgv"],"video/jpm":["jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/webm":["webm"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]}
\ No newline at end of file
diff --git a/node_modules/minimatch/LICENSE b/node_modules/minimatch/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/node_modules/minimatch/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/minimatch/README.md b/node_modules/minimatch/README.md
deleted file mode 100644
index 33ede1d6eef25201cc1c14aab2bf3932ebb62d21..0000000000000000000000000000000000000000
--- a/node_modules/minimatch/README.md
+++ /dev/null
@@ -1,230 +0,0 @@
-# minimatch
-
-A minimal matching utility.
-
-[![Build Status](https://travis-ci.org/isaacs/minimatch.svg?branch=master)](http://travis-ci.org/isaacs/minimatch)
-
-
-This is the matching library used internally by npm.
-
-It works by converting glob expressions into JavaScript `RegExp`
-objects.
-
-## Usage
-
-```javascript
-var minimatch = require("minimatch")
-
-minimatch("bar.foo", "*.foo") // true!
-minimatch("bar.foo", "*.bar") // false!
-minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
-```
-
-## Features
-
-Supports these glob features:
-
-* Brace Expansion
-* Extended glob matching
-* "Globstar" `**` matching
-
-See:
-
-* `man sh`
-* `man bash`
-* `man 3 fnmatch`
-* `man 5 gitignore`
-
-## Minimatch Class
-
-Create a minimatch object by instantiating the `minimatch.Minimatch` class.
-
-```javascript
-var Minimatch = require("minimatch").Minimatch
-var mm = new Minimatch(pattern, options)
-```
-
-### Properties
-
-* `pattern` The original pattern the minimatch object represents.
-* `options` The options supplied to the constructor.
-* `set` A 2-dimensional array of regexp or string expressions.
-  Each row in the
-  array corresponds to a brace-expanded pattern.  Each item in the row
-  corresponds to a single path-part.  For example, the pattern
-  `{a,b/c}/d` would expand to a set of patterns like:
-
-        [ [ a, d ]
-        , [ b, c, d ] ]
-
-    If a portion of the pattern doesn't have any "magic" in it
-    (that is, it's something like `"foo"` rather than `fo*o?`), then it
-    will be left as a string rather than converted to a regular
-    expression.
-
-* `regexp` Created by the `makeRe` method.  A single regular expression
-  expressing the entire pattern.  This is useful in cases where you wish
-  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.
-* `negate` True if the pattern is negated.
-* `comment` True if the pattern is a comment.
-* `empty` True if the pattern is `""`.
-
-### Methods
-
-* `makeRe` Generate the `regexp` member if necessary, and return it.
-  Will return `false` if the pattern is invalid.
-* `match(fname)` Return true if the filename matches the pattern, or
-  false otherwise.
-* `matchOne(fileArray, patternArray, partial)` Take a `/`-split
-  filename, and match it against a single row in the `regExpSet`.  This
-  method is mainly for internal use, but is exposed so that it can be
-  used by a glob-walker that needs to avoid excessive filesystem calls.
-
-All other methods are internal, and will be called as necessary.
-
-### minimatch(path, pattern, options)
-
-Main export.  Tests a path against the pattern using the options.
-
-```javascript
-var isJS = minimatch(file, "*.js", { matchBase: true })
-```
-
-### minimatch.filter(pattern, options)
-
-Returns a function that tests its
-supplied argument, suitable for use with `Array.filter`.  Example:
-
-```javascript
-var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true}))
-```
-
-### minimatch.match(list, pattern, options)
-
-Match against the list of
-files, in the style of fnmatch or glob.  If nothing is matched, and
-options.nonull is set, then return a list containing the pattern itself.
-
-```javascript
-var javascripts = minimatch.match(fileList, "*.js", {matchBase: true}))
-```
-
-### minimatch.makeRe(pattern, options)
-
-Make a regular expression object from the pattern.
-
-## Options
-
-All options are `false` by default.
-
-### debug
-
-Dump a ton of stuff to stderr.
-
-### nobrace
-
-Do not expand `{a,b}` and `{1..3}` brace sets.
-
-### noglobstar
-
-Disable `**` matching against multiple folder names.
-
-### dot
-
-Allow patterns to match filenames starting with a period, even if
-the pattern does not explicitly have a period in that spot.
-
-Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`
-is set.
-
-### noext
-
-Disable "extglob" style patterns like `+(a|b)`.
-
-### nocase
-
-Perform a case-insensitive match.
-
-### nonull
-
-When a match is not found by `minimatch.match`, return a list containing
-the pattern itself if this option is set.  When not set, an empty list
-is returned if there are no matches.
-
-### matchBase
-
-If set, then patterns without slashes will be matched
-against the basename of the path if it contains slashes.  For example,
-`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.
-
-### nocomment
-
-Suppress the behavior of treating `#` at the start of a pattern as a
-comment.
-
-### nonegate
-
-Suppress the behavior of treating a leading `!` character as negation.
-
-### flipNegate
-
-Returns from negate expressions the same as if they were not negated.
-(Ie, true on a hit, false on a miss.)
-
-### partial
-
-Compare a partial path to a pattern.  As long as the parts of the path that
-are present are not contradicted by the pattern, it will be treated as a
-match.  This is useful in applications where you're walking through a
-folder structure, and don't yet have the full path, but want to ensure that
-you do not walk down paths that can never be a match.
-
-For example,
-
-```js
-minimatch('/a/b', '/a/*/c/d', { partial: true })  // true, might be /a/b/c/d
-minimatch('/a/b', '/**/d', { partial: true })     // true, might be /a/b/.../d
-minimatch('/x/y/z', '/a/**/z', { partial: true }) // false, because x !== a
-```
-
-### allowWindowsEscape
-
-Windows path separator `\` is by default converted to `/`, which
-prohibits the usage of `\` as a escape character. This flag skips that
-behavior and allows using the escape character.
-
-## Comparisons to other fnmatch/glob implementations
-
-While strict compliance with the existing standards is a worthwhile
-goal, some discrepancies exist between minimatch and other
-implementations, and are intentional.
-
-If the pattern starts with a `!` character, then it is negated.  Set the
-`nonegate` flag to suppress this behavior, and treat leading `!`
-characters normally.  This is perhaps relevant if you wish to start the
-pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
-characters at the start of a pattern will negate the pattern multiple
-times.
-
-If a pattern starts with `#`, then it is treated as a comment, and
-will not match anything.  Use `\#` to match a literal `#` at the
-start of a line, or set the `nocomment` flag to suppress this behavior.
-
-The double-star character `**` is supported by default, unless the
-`noglobstar` flag is set.  This is supported in the manner of bsdglob
-and bash 4.1, where `**` only has special significance if it is the only
-thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
-`a/**b` will not.
-
-If an escaped pattern has no matches, and the `nonull` flag is set,
-then minimatch.match returns the pattern as-provided, rather than
-interpreting the character escapes.  For example,
-`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
-`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
-that it does not resolve escaped pattern characters.
-
-If brace expansion is not disabled, then it is performed before any
-other interpretation of the glob pattern.  Thus, a pattern like
-`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
-**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
-checked for validity.  Since those two are valid, matching proceeds.
diff --git a/node_modules/minimatch/minimatch.js b/node_modules/minimatch/minimatch.js
deleted file mode 100644
index fda45ade7cfc351fbcd76877d50b4b5f643c37a3..0000000000000000000000000000000000000000
--- a/node_modules/minimatch/minimatch.js
+++ /dev/null
@@ -1,947 +0,0 @@
-module.exports = minimatch
-minimatch.Minimatch = Minimatch
-
-var path = (function () { try { return require('path') } catch (e) {}}()) || {
-  sep: '/'
-}
-minimatch.sep = path.sep
-
-var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
-var expand = require('brace-expansion')
-
-var plTypes = {
-  '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
-  '?': { open: '(?:', close: ')?' },
-  '+': { open: '(?:', close: ')+' },
-  '*': { open: '(?:', close: ')*' },
-  '@': { open: '(?:', close: ')' }
-}
-
-// any single thing other than /
-// don't need to escape / when using new RegExp()
-var qmark = '[^/]'
-
-// * => any number of characters
-var star = qmark + '*?'
-
-// ** when dots are allowed.  Anything goes, except .. and .
-// not (^ or / followed by one or two dots followed by $ or /),
-// followed by anything, any number of times.
-var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
-
-// not a ^ or / followed by a dot,
-// followed by anything, any number of times.
-var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
-
-// characters that need to be escaped in RegExp.
-var reSpecials = charSet('().*{}+?[]^$\\!')
-
-// "abc" -> { a:true, b:true, c:true }
-function charSet (s) {
-  return s.split('').reduce(function (set, c) {
-    set[c] = true
-    return set
-  }, {})
-}
-
-// normalizes slashes.
-var slashSplit = /\/+/
-
-minimatch.filter = filter
-function filter (pattern, options) {
-  options = options || {}
-  return function (p, i, list) {
-    return minimatch(p, pattern, options)
-  }
-}
-
-function ext (a, b) {
-  b = b || {}
-  var t = {}
-  Object.keys(a).forEach(function (k) {
-    t[k] = a[k]
-  })
-  Object.keys(b).forEach(function (k) {
-    t[k] = b[k]
-  })
-  return t
-}
-
-minimatch.defaults = function (def) {
-  if (!def || typeof def !== 'object' || !Object.keys(def).length) {
-    return minimatch
-  }
-
-  var orig = minimatch
-
-  var m = function minimatch (p, pattern, options) {
-    return orig(p, pattern, ext(def, options))
-  }
-
-  m.Minimatch = function Minimatch (pattern, options) {
-    return new orig.Minimatch(pattern, ext(def, options))
-  }
-  m.Minimatch.defaults = function defaults (options) {
-    return orig.defaults(ext(def, options)).Minimatch
-  }
-
-  m.filter = function filter (pattern, options) {
-    return orig.filter(pattern, ext(def, options))
-  }
-
-  m.defaults = function defaults (options) {
-    return orig.defaults(ext(def, options))
-  }
-
-  m.makeRe = function makeRe (pattern, options) {
-    return orig.makeRe(pattern, ext(def, options))
-  }
-
-  m.braceExpand = function braceExpand (pattern, options) {
-    return orig.braceExpand(pattern, ext(def, options))
-  }
-
-  m.match = function (list, pattern, options) {
-    return orig.match(list, pattern, ext(def, options))
-  }
-
-  return m
-}
-
-Minimatch.defaults = function (def) {
-  return minimatch.defaults(def).Minimatch
-}
-
-function minimatch (p, pattern, options) {
-  assertValidPattern(pattern)
-
-  if (!options) options = {}
-
-  // shortcut: comments match nothing.
-  if (!options.nocomment && pattern.charAt(0) === '#') {
-    return false
-  }
-
-  return new Minimatch(pattern, options).match(p)
-}
-
-function Minimatch (pattern, options) {
-  if (!(this instanceof Minimatch)) {
-    return new Minimatch(pattern, options)
-  }
-
-  assertValidPattern(pattern)
-
-  if (!options) options = {}
-
-  pattern = pattern.trim()
-
-  // windows support: need to use /, not \
-  if (!options.allowWindowsEscape && path.sep !== '/') {
-    pattern = pattern.split(path.sep).join('/')
-  }
-
-  this.options = options
-  this.set = []
-  this.pattern = pattern
-  this.regexp = null
-  this.negate = false
-  this.comment = false
-  this.empty = false
-  this.partial = !!options.partial
-
-  // make the set of regexps etc.
-  this.make()
-}
-
-Minimatch.prototype.debug = function () {}
-
-Minimatch.prototype.make = make
-function make () {
-  var pattern = this.pattern
-  var options = this.options
-
-  // empty patterns and comments match nothing.
-  if (!options.nocomment && pattern.charAt(0) === '#') {
-    this.comment = true
-    return
-  }
-  if (!pattern) {
-    this.empty = true
-    return
-  }
-
-  // step 1: figure out negation, etc.
-  this.parseNegate()
-
-  // step 2: expand braces
-  var set = this.globSet = this.braceExpand()
-
-  if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }
-
-  this.debug(this.pattern, set)
-
-  // step 3: now we have a set, so turn each one into a series of path-portion
-  // matching patterns.
-  // These will be regexps, except in the case of "**", which is
-  // set to the GLOBSTAR object for globstar behavior,
-  // and will not contain any / characters
-  set = this.globParts = set.map(function (s) {
-    return s.split(slashSplit)
-  })
-
-  this.debug(this.pattern, set)
-
-  // glob --> regexps
-  set = set.map(function (s, si, set) {
-    return s.map(this.parse, this)
-  }, this)
-
-  this.debug(this.pattern, set)
-
-  // filter out everything that didn't compile properly.
-  set = set.filter(function (s) {
-    return s.indexOf(false) === -1
-  })
-
-  this.debug(this.pattern, set)
-
-  this.set = set
-}
-
-Minimatch.prototype.parseNegate = parseNegate
-function parseNegate () {
-  var pattern = this.pattern
-  var negate = false
-  var options = this.options
-  var negateOffset = 0
-
-  if (options.nonegate) return
-
-  for (var i = 0, l = pattern.length
-    ; i < l && pattern.charAt(i) === '!'
-    ; i++) {
-    negate = !negate
-    negateOffset++
-  }
-
-  if (negateOffset) this.pattern = pattern.substr(negateOffset)
-  this.negate = negate
-}
-
-// Brace expansion:
-// a{b,c}d -> abd acd
-// a{b,}c -> abc ac
-// a{0..3}d -> a0d a1d a2d a3d
-// a{b,c{d,e}f}g -> abg acdfg acefg
-// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
-//
-// Invalid sets are not expanded.
-// a{2..}b -> a{2..}b
-// a{b}c -> a{b}c
-minimatch.braceExpand = function (pattern, options) {
-  return braceExpand(pattern, options)
-}
-
-Minimatch.prototype.braceExpand = braceExpand
-
-function braceExpand (pattern, options) {
-  if (!options) {
-    if (this instanceof Minimatch) {
-      options = this.options
-    } else {
-      options = {}
-    }
-  }
-
-  pattern = typeof pattern === 'undefined'
-    ? this.pattern : pattern
-
-  assertValidPattern(pattern)
-
-  // Thanks to Yeting Li <https://github.com/yetingli> for
-  // improving this regexp to avoid a ReDOS vulnerability.
-  if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
-    // shortcut. no need to expand.
-    return [pattern]
-  }
-
-  return expand(pattern)
-}
-
-var MAX_PATTERN_LENGTH = 1024 * 64
-var assertValidPattern = function (pattern) {
-  if (typeof pattern !== 'string') {
-    throw new TypeError('invalid pattern')
-  }
-
-  if (pattern.length > MAX_PATTERN_LENGTH) {
-    throw new TypeError('pattern is too long')
-  }
-}
-
-// parse a component of the expanded set.
-// At this point, no pattern may contain "/" in it
-// so we're going to return a 2d array, where each entry is the full
-// pattern, split on '/', and then turned into a regular expression.
-// A regexp is made at the end which joins each array with an
-// escaped /, and another full one which joins each regexp with |.
-//
-// Following the lead of Bash 4.1, note that "**" only has special meaning
-// when it is the *only* thing in a path portion.  Otherwise, any series
-// of * is equivalent to a single *.  Globstar behavior is enabled by
-// default, and can be disabled by setting options.noglobstar.
-Minimatch.prototype.parse = parse
-var SUBPARSE = {}
-function parse (pattern, isSub) {
-  assertValidPattern(pattern)
-
-  var options = this.options
-
-  // shortcuts
-  if (pattern === '**') {
-    if (!options.noglobstar)
-      return GLOBSTAR
-    else
-      pattern = '*'
-  }
-  if (pattern === '') return ''
-
-  var re = ''
-  var hasMagic = !!options.nocase
-  var escaping = false
-  // ? => one single character
-  var patternListStack = []
-  var negativeLists = []
-  var stateChar
-  var inClass = false
-  var reClassStart = -1
-  var classStart = -1
-  // . and .. never match anything that doesn't start with .,
-  // even when options.dot is set.
-  var patternStart = pattern.charAt(0) === '.' ? '' // anything
-  // not (start or / followed by . or .. followed by / or end)
-  : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
-  : '(?!\\.)'
-  var self = this
-
-  function clearStateChar () {
-    if (stateChar) {
-      // we had some state-tracking character
-      // that wasn't consumed by this pass.
-      switch (stateChar) {
-        case '*':
-          re += star
-          hasMagic = true
-        break
-        case '?':
-          re += qmark
-          hasMagic = true
-        break
-        default:
-          re += '\\' + stateChar
-        break
-      }
-      self.debug('clearStateChar %j %j', stateChar, re)
-      stateChar = false
-    }
-  }
-
-  for (var i = 0, len = pattern.length, c
-    ; (i < len) && (c = pattern.charAt(i))
-    ; i++) {
-    this.debug('%s\t%s %s %j', pattern, i, re, c)
-
-    // skip over any that are escaped.
-    if (escaping && reSpecials[c]) {
-      re += '\\' + c
-      escaping = false
-      continue
-    }
-
-    switch (c) {
-      /* istanbul ignore next */
-      case '/': {
-        // completely not allowed, even escaped.
-        // Should already be path-split by now.
-        return false
-      }
-
-      case '\\':
-        clearStateChar()
-        escaping = true
-      continue
-
-      // the various stateChar values
-      // for the "extglob" stuff.
-      case '?':
-      case '*':
-      case '+':
-      case '@':
-      case '!':
-        this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
-
-        // all of those are literals inside a class, except that
-        // the glob [!a] means [^a] in regexp
-        if (inClass) {
-          this.debug('  in class')
-          if (c === '!' && i === classStart + 1) c = '^'
-          re += c
-          continue
-        }
-
-        // if we already have a stateChar, then it means
-        // that there was something like ** or +? in there.
-        // Handle the stateChar, then proceed with this one.
-        self.debug('call clearStateChar %j', stateChar)
-        clearStateChar()
-        stateChar = c
-        // if extglob is disabled, then +(asdf|foo) isn't a thing.
-        // just clear the statechar *now*, rather than even diving into
-        // the patternList stuff.
-        if (options.noext) clearStateChar()
-      continue
-
-      case '(':
-        if (inClass) {
-          re += '('
-          continue
-        }
-
-        if (!stateChar) {
-          re += '\\('
-          continue
-        }
-
-        patternListStack.push({
-          type: stateChar,
-          start: i - 1,
-          reStart: re.length,
-          open: plTypes[stateChar].open,
-          close: plTypes[stateChar].close
-        })
-        // negation is (?:(?!js)[^/]*)
-        re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
-        this.debug('plType %j %j', stateChar, re)
-        stateChar = false
-      continue
-
-      case ')':
-        if (inClass || !patternListStack.length) {
-          re += '\\)'
-          continue
-        }
-
-        clearStateChar()
-        hasMagic = true
-        var pl = patternListStack.pop()
-        // negation is (?:(?!js)[^/]*)
-        // The others are (?:<pattern>)<type>
-        re += pl.close
-        if (pl.type === '!') {
-          negativeLists.push(pl)
-        }
-        pl.reEnd = re.length
-      continue
-
-      case '|':
-        if (inClass || !patternListStack.length || escaping) {
-          re += '\\|'
-          escaping = false
-          continue
-        }
-
-        clearStateChar()
-        re += '|'
-      continue
-
-      // these are mostly the same in regexp and glob
-      case '[':
-        // swallow any state-tracking char before the [
-        clearStateChar()
-
-        if (inClass) {
-          re += '\\' + c
-          continue
-        }
-
-        inClass = true
-        classStart = i
-        reClassStart = re.length
-        re += c
-      continue
-
-      case ']':
-        //  a right bracket shall lose its special
-        //  meaning and represent itself in
-        //  a bracket expression if it occurs
-        //  first in the list.  -- POSIX.2 2.8.3.2
-        if (i === classStart + 1 || !inClass) {
-          re += '\\' + c
-          escaping = false
-          continue
-        }
-
-        // handle the case where we left a class open.
-        // "[z-a]" is valid, equivalent to "\[z-a\]"
-        // split where the last [ was, make sure we don't have
-        // an invalid re. if so, re-walk the contents of the
-        // would-be class to re-translate any characters that
-        // were passed through as-is
-        // TODO: It would probably be faster to determine this
-        // without a try/catch and a new RegExp, but it's tricky
-        // to do safely.  For now, this is safe and works.
-        var cs = pattern.substring(classStart + 1, i)
-        try {
-          RegExp('[' + cs + ']')
-        } catch (er) {
-          // not a valid class!
-          var sp = this.parse(cs, SUBPARSE)
-          re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
-          hasMagic = hasMagic || sp[1]
-          inClass = false
-          continue
-        }
-
-        // finish up the class.
-        hasMagic = true
-        inClass = false
-        re += c
-      continue
-
-      default:
-        // swallow any state char that wasn't consumed
-        clearStateChar()
-
-        if (escaping) {
-          // no need
-          escaping = false
-        } else if (reSpecials[c]
-          && !(c === '^' && inClass)) {
-          re += '\\'
-        }
-
-        re += c
-
-    } // switch
-  } // for
-
-  // handle the case where we left a class open.
-  // "[abc" is valid, equivalent to "\[abc"
-  if (inClass) {
-    // split where the last [ was, and escape it
-    // this is a huge pita.  We now have to re-walk
-    // the contents of the would-be class to re-translate
-    // any characters that were passed through as-is
-    cs = pattern.substr(classStart + 1)
-    sp = this.parse(cs, SUBPARSE)
-    re = re.substr(0, reClassStart) + '\\[' + sp[0]
-    hasMagic = hasMagic || sp[1]
-  }
-
-  // handle the case where we had a +( thing at the *end*
-  // of the pattern.
-  // each pattern list stack adds 3 chars, and we need to go through
-  // and escape any | chars that were passed through as-is for the regexp.
-  // Go through and escape them, taking care not to double-escape any
-  // | chars that were already escaped.
-  for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
-    var tail = re.slice(pl.reStart + pl.open.length)
-    this.debug('setting tail', re, pl)
-    // maybe some even number of \, then maybe 1 \, followed by a |
-    tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
-      if (!$2) {
-        // the | isn't already escaped, so escape it.
-        $2 = '\\'
-      }
-
-      // need to escape all those slashes *again*, without escaping the
-      // one that we need for escaping the | character.  As it works out,
-      // escaping an even number of slashes can be done by simply repeating
-      // it exactly after itself.  That's why this trick works.
-      //
-      // I am sorry that you have to see this.
-      return $1 + $1 + $2 + '|'
-    })
-
-    this.debug('tail=%j\n   %s', tail, tail, pl, re)
-    var t = pl.type === '*' ? star
-      : pl.type === '?' ? qmark
-      : '\\' + pl.type
-
-    hasMagic = true
-    re = re.slice(0, pl.reStart) + t + '\\(' + tail
-  }
-
-  // handle trailing things that only matter at the very end.
-  clearStateChar()
-  if (escaping) {
-    // trailing \\
-    re += '\\\\'
-  }
-
-  // only need to apply the nodot start if the re starts with
-  // something that could conceivably capture a dot
-  var addPatternStart = false
-  switch (re.charAt(0)) {
-    case '[': case '.': case '(': addPatternStart = true
-  }
-
-  // Hack to work around lack of negative lookbehind in JS
-  // A pattern like: *.!(x).!(y|z) needs to ensure that a name
-  // like 'a.xyz.yz' doesn't match.  So, the first negative
-  // lookahead, has to look ALL the way ahead, to the end of
-  // the pattern.
-  for (var n = negativeLists.length - 1; n > -1; n--) {
-    var nl = negativeLists[n]
-
-    var nlBefore = re.slice(0, nl.reStart)
-    var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
-    var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
-    var nlAfter = re.slice(nl.reEnd)
-
-    nlLast += nlAfter
-
-    // Handle nested stuff like *(*.js|!(*.json)), where open parens
-    // mean that we should *not* include the ) in the bit that is considered
-    // "after" the negated section.
-    var openParensBefore = nlBefore.split('(').length - 1
-    var cleanAfter = nlAfter
-    for (i = 0; i < openParensBefore; i++) {
-      cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
-    }
-    nlAfter = cleanAfter
-
-    var dollar = ''
-    if (nlAfter === '' && isSub !== SUBPARSE) {
-      dollar = '$'
-    }
-    var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
-    re = newRe
-  }
-
-  // if the re is not "" at this point, then we need to make sure
-  // it doesn't match against an empty path part.
-  // Otherwise a/* will match a/, which it should not.
-  if (re !== '' && hasMagic) {
-    re = '(?=.)' + re
-  }
-
-  if (addPatternStart) {
-    re = patternStart + re
-  }
-
-  // parsing just a piece of a larger pattern.
-  if (isSub === SUBPARSE) {
-    return [re, hasMagic]
-  }
-
-  // skip the regexp for non-magical patterns
-  // unescape anything in it, though, so that it'll be
-  // an exact match against a file etc.
-  if (!hasMagic) {
-    return globUnescape(pattern)
-  }
-
-  var flags = options.nocase ? 'i' : ''
-  try {
-    var regExp = new RegExp('^' + re + '$', flags)
-  } catch (er) /* istanbul ignore next - should be impossible */ {
-    // If it was an invalid regular expression, then it can't match
-    // anything.  This trick looks for a character after the end of
-    // the string, which is of course impossible, except in multi-line
-    // mode, but it's not a /m regex.
-    return new RegExp('$.')
-  }
-
-  regExp._glob = pattern
-  regExp._src = re
-
-  return regExp
-}
-
-minimatch.makeRe = function (pattern, options) {
-  return new Minimatch(pattern, options || {}).makeRe()
-}
-
-Minimatch.prototype.makeRe = makeRe
-function makeRe () {
-  if (this.regexp || this.regexp === false) return this.regexp
-
-  // at this point, this.set is a 2d array of partial
-  // pattern strings, or "**".
-  //
-  // It's better to use .match().  This function shouldn't
-  // be used, really, but it's pretty convenient sometimes,
-  // when you just want to work with a regex.
-  var set = this.set
-
-  if (!set.length) {
-    this.regexp = false
-    return this.regexp
-  }
-  var options = this.options
-
-  var twoStar = options.noglobstar ? star
-    : options.dot ? twoStarDot
-    : twoStarNoDot
-  var flags = options.nocase ? 'i' : ''
-
-  var re = set.map(function (pattern) {
-    return pattern.map(function (p) {
-      return (p === GLOBSTAR) ? twoStar
-      : (typeof p === 'string') ? regExpEscape(p)
-      : p._src
-    }).join('\\\/')
-  }).join('|')
-
-  // must match entire pattern
-  // ending in a * or ** will make it less strict.
-  re = '^(?:' + re + ')$'
-
-  // can match anything, as long as it's not this.
-  if (this.negate) re = '^(?!' + re + ').*$'
-
-  try {
-    this.regexp = new RegExp(re, flags)
-  } catch (ex) /* istanbul ignore next - should be impossible */ {
-    this.regexp = false
-  }
-  return this.regexp
-}
-
-minimatch.match = function (list, pattern, options) {
-  options = options || {}
-  var mm = new Minimatch(pattern, options)
-  list = list.filter(function (f) {
-    return mm.match(f)
-  })
-  if (mm.options.nonull && !list.length) {
-    list.push(pattern)
-  }
-  return list
-}
-
-Minimatch.prototype.match = function match (f, partial) {
-  if (typeof partial === 'undefined') partial = this.partial
-  this.debug('match', f, this.pattern)
-  // short-circuit in the case of busted things.
-  // comments, etc.
-  if (this.comment) return false
-  if (this.empty) return f === ''
-
-  if (f === '/' && partial) return true
-
-  var options = this.options
-
-  // windows: need to use /, not \
-  if (path.sep !== '/') {
-    f = f.split(path.sep).join('/')
-  }
-
-  // treat the test path as a set of pathparts.
-  f = f.split(slashSplit)
-  this.debug(this.pattern, 'split', f)
-
-  // just ONE of the pattern sets in this.set needs to match
-  // in order for it to be valid.  If negating, then just one
-  // match means that we have failed.
-  // Either way, return on the first hit.
-
-  var set = this.set
-  this.debug(this.pattern, 'set', set)
-
-  // Find the basename of the path by looking for the last non-empty segment
-  var filename
-  var i
-  for (i = f.length - 1; i >= 0; i--) {
-    filename = f[i]
-    if (filename) break
-  }
-
-  for (i = 0; i < set.length; i++) {
-    var pattern = set[i]
-    var file = f
-    if (options.matchBase && pattern.length === 1) {
-      file = [filename]
-    }
-    var hit = this.matchOne(file, pattern, partial)
-    if (hit) {
-      if (options.flipNegate) return true
-      return !this.negate
-    }
-  }
-
-  // didn't get any hits.  this is success if it's a negative
-  // pattern, failure otherwise.
-  if (options.flipNegate) return false
-  return this.negate
-}
-
-// set partial to true to test if, for example,
-// "/a/b" matches the start of "/*/b/*/d"
-// Partial means, if you run out of file before you run
-// out of pattern, then that's fine, as long as all
-// the parts match.
-Minimatch.prototype.matchOne = function (file, pattern, partial) {
-  var options = this.options
-
-  this.debug('matchOne',
-    { 'this': this, file: file, pattern: pattern })
-
-  this.debug('matchOne', file.length, pattern.length)
-
-  for (var fi = 0,
-      pi = 0,
-      fl = file.length,
-      pl = pattern.length
-      ; (fi < fl) && (pi < pl)
-      ; fi++, pi++) {
-    this.debug('matchOne loop')
-    var p = pattern[pi]
-    var f = file[fi]
-
-    this.debug(pattern, p, f)
-
-    // should be impossible.
-    // some invalid regexp stuff in the set.
-    /* istanbul ignore if */
-    if (p === false) return false
-
-    if (p === GLOBSTAR) {
-      this.debug('GLOBSTAR', [pattern, p, f])
-
-      // "**"
-      // a/**/b/**/c would match the following:
-      // a/b/x/y/z/c
-      // a/x/y/z/b/c
-      // a/b/x/b/x/c
-      // a/b/c
-      // To do this, take the rest of the pattern after
-      // the **, and see if it would match the file remainder.
-      // If so, return success.
-      // If not, the ** "swallows" a segment, and try again.
-      // This is recursively awful.
-      //
-      // a/**/b/**/c matching a/b/x/y/z/c
-      // - a matches a
-      // - doublestar
-      //   - matchOne(b/x/y/z/c, b/**/c)
-      //     - b matches b
-      //     - doublestar
-      //       - matchOne(x/y/z/c, c) -> no
-      //       - matchOne(y/z/c, c) -> no
-      //       - matchOne(z/c, c) -> no
-      //       - matchOne(c, c) yes, hit
-      var fr = fi
-      var pr = pi + 1
-      if (pr === pl) {
-        this.debug('** at the end')
-        // a ** at the end will just swallow the rest.
-        // We have found a match.
-        // however, it will not swallow /.x, unless
-        // options.dot is set.
-        // . and .. are *never* matched by **, for explosively
-        // exponential reasons.
-        for (; fi < fl; fi++) {
-          if (file[fi] === '.' || file[fi] === '..' ||
-            (!options.dot && file[fi].charAt(0) === '.')) return false
-        }
-        return true
-      }
-
-      // ok, let's see if we can swallow whatever we can.
-      while (fr < fl) {
-        var swallowee = file[fr]
-
-        this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
-
-        // XXX remove this slice.  Just pass the start index.
-        if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
-          this.debug('globstar found match!', fr, fl, swallowee)
-          // found a match.
-          return true
-        } else {
-          // can't swallow "." or ".." ever.
-          // can only swallow ".foo" when explicitly asked.
-          if (swallowee === '.' || swallowee === '..' ||
-            (!options.dot && swallowee.charAt(0) === '.')) {
-            this.debug('dot detected!', file, fr, pattern, pr)
-            break
-          }
-
-          // ** swallows a segment, and continue.
-          this.debug('globstar swallow a segment, and continue')
-          fr++
-        }
-      }
-
-      // no match was found.
-      // However, in partial mode, we can't say this is necessarily over.
-      // If there's more *pattern* left, then
-      /* istanbul ignore if */
-      if (partial) {
-        // ran out of file
-        this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
-        if (fr === fl) return true
-      }
-      return false
-    }
-
-    // something other than **
-    // non-magic patterns just have to match exactly
-    // patterns with magic have been turned into regexps.
-    var hit
-    if (typeof p === 'string') {
-      hit = f === p
-      this.debug('string match', p, f, hit)
-    } else {
-      hit = f.match(p)
-      this.debug('pattern match', p, f, hit)
-    }
-
-    if (!hit) return false
-  }
-
-  // Note: ending in / means that we'll get a final ""
-  // at the end of the pattern.  This can only match a
-  // corresponding "" at the end of the file.
-  // If the file ends in /, then it can only match a
-  // a pattern that ends in /, unless the pattern just
-  // doesn't have any more for it. But, a/b/ should *not*
-  // match "a/b/*", even though "" matches against the
-  // [^/]*? pattern, except in partial mode, where it might
-  // simply not be reached yet.
-  // However, a/b/ should still satisfy a/*
-
-  // now either we fell off the end of the pattern, or we're done.
-  if (fi === fl && pi === pl) {
-    // ran out of pattern and filename at the same time.
-    // an exact hit!
-    return true
-  } else if (fi === fl) {
-    // ran out of file, but still had pattern left.
-    // this is ok if we're doing the match as part of
-    // a glob fs traversal.
-    return partial
-  } else /* istanbul ignore else */ if (pi === pl) {
-    // ran out of pattern, still have file left.
-    // this is only acceptable if we're on the very last
-    // empty segment of a file with a trailing slash.
-    // a/* should match a/b/
-    return (fi === fl - 1) && (file[fi] === '')
-  }
-
-  // should be unreachable.
-  /* istanbul ignore next */
-  throw new Error('wtf?')
-}
-
-// replace stuff like \* with *
-function globUnescape (s) {
-  return s.replace(/\\(.)/g, '$1')
-}
-
-function regExpEscape (s) {
-  return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
-}
diff --git a/node_modules/minimatch/package.json b/node_modules/minimatch/package.json
deleted file mode 100644
index 566efdfe45cb80710f6a14075f7e360d392edbd7..0000000000000000000000000000000000000000
--- a/node_modules/minimatch/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)",
-  "name": "minimatch",
-  "description": "a glob matcher in javascript",
-  "version": "3.1.2",
-  "publishConfig": {
-    "tag": "v3-legacy"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/minimatch.git"
-  },
-  "main": "minimatch.js",
-  "scripts": {
-    "test": "tap",
-    "preversion": "npm test",
-    "postversion": "npm publish",
-    "postpublish": "git push origin --all; git push origin --tags"
-  },
-  "engines": {
-    "node": "*"
-  },
-  "dependencies": {
-    "brace-expansion": "^1.1.7"
-  },
-  "devDependencies": {
-    "tap": "^15.1.6"
-  },
-  "license": "ISC",
-  "files": [
-    "minimatch.js"
-  ]
-}
diff --git a/node_modules/mysql2-promise/.idea/copyright/profiles_settings.xml b/node_modules/mysql2-promise/.idea/copyright/profiles_settings.xml
deleted file mode 100644
index e7bedf3377d40335424fd605124d4761390218bb..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/.idea/copyright/profiles_settings.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<component name="CopyrightManager">
-  <settings default="" />
-</component>
\ No newline at end of file
diff --git a/node_modules/mysql2-promise/.idea/modules.xml b/node_modules/mysql2-promise/.idea/modules.xml
deleted file mode 100644
index c1c1b4f67d555d4d7e1bdc254682a3d020aec65d..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/.idea/node-mysql2-promise.iml" filepath="$PROJECT_DIR$/.idea/node-mysql2-promise.iml" />
-    </modules>
-  </component>
-</project>
\ No newline at end of file
diff --git a/node_modules/mysql2-promise/.idea/node-mysql2-promise.iml b/node_modules/mysql2-promise/.idea/node-mysql2-promise.iml
deleted file mode 100644
index c956989b29ad0767edc6cf3a202545927c3d1e76..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/.idea/node-mysql2-promise.iml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="WEB_MODULE" version="4">
-  <component name="NewModuleRootManager">
-    <content url="file://$MODULE_DIR$" />
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/node_modules/mysql2-promise/.idea/vcs.xml b/node_modules/mysql2-promise/.idea/vcs.xml
deleted file mode 100644
index 94a25f7f4cb416c083d265558da75d457237d671..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$" vcs="Git" />
-  </component>
-</project>
\ No newline at end of file
diff --git a/node_modules/mysql2-promise/.idea/workspace.xml b/node_modules/mysql2-promise/.idea/workspace.xml
deleted file mode 100644
index eff435bf902dc486690c09a895001dfe6e40c6db..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/.idea/workspace.xml
+++ /dev/null
@@ -1,278 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ChangeListManager">
-    <list default="true" id="b88757a0-d7e9-46c9-9990-7bb15467a648" name="Default" comment="" />
-    <ignored path="node-mysql2-promise.iws" />
-    <ignored path=".idea/workspace.xml" />
-    <ignored path=".idea/dataSources.local.xml" />
-    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
-    <option name="TRACKING_ENABLED" value="true" />
-    <option name="SHOW_DIALOG" value="false" />
-    <option name="HIGHLIGHT_CONFLICTS" value="true" />
-    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
-    <option name="LAST_RESOLUTION" value="IGNORE" />
-  </component>
-  <component name="CreatePatchCommitExecutor">
-    <option name="PATCH_PATH" value="" />
-  </component>
-  <component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
-  <component name="FavoritesManager">
-    <favorites_list name="node-mysql2-promise" />
-  </component>
-  <component name="FileEditorManager">
-    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
-      <file leaf-file-name="index.js" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/index.js">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="193">
-              <caret line="60" column="20" selection-start-line="60" selection-start-column="20" selection-end-line="60" selection-end-column="20" />
-              <folding>
-                <element signature="n#!!doc" expanded="true" />
-              </folding>
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="npm-debug.log" pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/npm-debug.log">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="553">
-              <caret line="97" column="33" selection-start-line="97" selection-start-column="24" selection-end-line="97" selection-end-column="33" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-    </leaf>
-  </component>
-  <component name="Git.Settings">
-    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
-  </component>
-  <component name="IdeDocumentHistory">
-    <option name="CHANGED_PATHS">
-      <list>
-        <option value="$PROJECT_DIR$/package.json" />
-        <option value="$PROJECT_DIR$/index.js" />
-        <option value="$PROJECT_DIR$/npm-debug.log" />
-      </list>
-    </option>
-  </component>
-  <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
-  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER">
-    <package-json value="$PROJECT_DIR$/package.json" />
-  </component>
-  <component name="JsGulpfileManager">
-    <detection-done>true</detection-done>
-    <sorting>DEFINITION_ORDER</sorting>
-  </component>
-  <component name="PhpWorkspaceProjectConfiguration" backward_compatibility_performed="true" />
-  <component name="ProjectFrameBounds">
-    <option name="x" value="65" />
-    <option name="y" value="24" />
-    <option name="width" value="1845" />
-    <option name="height" value="1054" />
-  </component>
-  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
-    <OptionsSetting value="true" id="Add" />
-    <OptionsSetting value="true" id="Remove" />
-    <OptionsSetting value="true" id="Checkout" />
-    <OptionsSetting value="true" id="Update" />
-    <OptionsSetting value="true" id="Status" />
-    <OptionsSetting value="true" id="Edit" />
-    <ConfirmationsSetting value="0" id="Add" />
-    <ConfirmationsSetting value="0" id="Remove" />
-  </component>
-  <component name="ProjectView">
-    <navigator currentView="ProjectPane" proportions="" version="1">
-      <flattenPackages />
-      <showMembers />
-      <showModules />
-      <showLibraryContents />
-      <hideEmptyPackages />
-      <abbreviatePackageNames />
-      <autoscrollToSource />
-      <autoscrollFromSource />
-      <sortByType />
-      <manualOrder />
-      <foldersAlwaysOnTop value="true" />
-    </navigator>
-    <panes>
-      <pane id="ProjectPane">
-        <subPane>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="node-mysql2-promise" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="node-mysql2-promise" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="node-mysql2-promise" />
-              <option name="myItemType" value="com.jetbrains.php.projectView.PhpTreeStructureProvider$1" />
-            </PATH_ELEMENT>
-          </PATH>
-        </subPane>
-      </pane>
-      <pane id="Scratches" />
-      <pane id="Scope" />
-    </panes>
-  </component>
-  <component name="PropertiesComponent">
-    <property name="WebServerToolWindowFactoryState" value="false" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$/../cerberus" />
-    <property name="nodejs_interpreter_path" value="/usr/bin/node" />
-  </component>
-  <component name="RunManager">
-    <configuration default="true" type="BashConfigurationType" factoryName="Bash">
-      <option name="INTERPRETER_OPTIONS" value="" />
-      <option name="INTERPRETER_PATH" value="/bin/bash" />
-      <option name="WORKING_DIRECTORY" value="" />
-      <option name="PARENT_ENVS" value="true" />
-      <option name="SCRIPT_NAME" value="" />
-      <option name="PARAMETERS" value="" />
-      <module name="" />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="true" type="JavascriptDebugType" factoryName="JavaScript Debug">
-      <method />
-    </configuration>
-    <configuration default="true" type="NodeJSConfigurationType" factoryName="Node.js" path-to-node="project" working-dir="">
-      <method />
-    </configuration>
-    <configuration default="true" type="PHPUnitRunConfigurationType" factoryName="PHPUnit">
-      <TestRunner />
-      <method />
-    </configuration>
-    <configuration default="true" type="PhpLocalRunConfigurationType" factoryName="PHP Console">
-      <method />
-    </configuration>
-    <configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js">
-      <node-interpreter>project</node-interpreter>
-      <node-options />
-      <gulpfile />
-      <tasks />
-      <arguments />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="true" type="js.build_tools.npm" factoryName="npm">
-      <command value="run-script" />
-      <scripts />
-      <node-interpreter value="project" />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="true" type="mocha-javascript-test-runner" factoryName="Mocha">
-      <node-interpreter>project</node-interpreter>
-      <node-options />
-      <working-directory />
-      <pass-parent-env>true</pass-parent-env>
-      <envs />
-      <ui />
-      <extra-mocha-options />
-      <test-kind>DIRECTORY</test-kind>
-      <test-directory />
-      <recursive>false</recursive>
-      <method />
-    </configuration>
-  </component>
-  <component name="ShelveChangesManager" show_recycled="false">
-    <option name="remove_strategy" value="false" />
-  </component>
-  <component name="TaskManager">
-    <task active="true" id="Default" summary="Default task">
-      <changelist id="b88757a0-d7e9-46c9-9990-7bb15467a648" name="Default" comment="" />
-      <created>1472370576014</created>
-      <option name="number" value="Default" />
-      <option name="presentableId" value="Default" />
-      <updated>1472370576014</updated>
-      <workItem from="1472370577168" duration="2074000" />
-      <workItem from="1472378210391" duration="358000" />
-    </task>
-    <servers />
-  </component>
-  <component name="TimeTrackingManager">
-    <option name="totallyTimeSpent" value="2432000" />
-  </component>
-  <component name="ToolWindowManager">
-    <frame x="65" y="24" width="1845" height="1054" extended-state="0" />
-    <editor active="false" />
-    <layout>
-      <window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.25291827" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
-      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
-      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
-      <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
-      <window_info id="npm" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
-      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
-      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
-      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
-      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
-      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
-      <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
-      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
-      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
-      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
-      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
-    </layout>
-  </component>
-  <component name="Vcs.Log.UiProperties">
-    <option name="RECENTLY_FILTERED_USER_GROUPS">
-      <collection />
-    </option>
-    <option name="RECENTLY_FILTERED_BRANCH_GROUPS">
-      <collection />
-    </option>
-  </component>
-  <component name="VcsContentAnnotationSettings">
-    <option name="myLimit" value="2678400000" />
-  </component>
-  <component name="XDebuggerManager">
-    <breakpoint-manager />
-    <watches-manager />
-  </component>
-  <component name="editorHistoryManager">
-    <entry file="file://$PROJECT_DIR$/index.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding>
-            <element signature="n#!!doc" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/package.json">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="660">
-          <caret line="44" column="0" selection-start-line="44" selection-start-column="0" selection-end-line="44" selection-end-column="0" />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/index.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="193">
-          <caret line="60" column="20" selection-start-line="60" selection-start-column="20" selection-end-line="60" selection-end-column="20" />
-          <folding>
-            <element signature="n#!!doc" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/npm-debug.log">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="553">
-          <caret line="97" column="33" selection-start-line="97" selection-start-column="24" selection-end-line="97" selection-end-column="33" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-  </component>
-</project>
\ No newline at end of file
diff --git a/node_modules/mysql2-promise/.jshintrc b/node_modules/mysql2-promise/.jshintrc
deleted file mode 100644
index 443b102928d4df5fd8fc35019aab7a84b6e4bb98..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/.jshintrc
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-    "node":         true,
-    "bitwise":      true,
-    "browser":      true,
-    "camelcase":    true,
-    "curly":        true,
-    "eqeqeq":       true,
-    "esnext":       true,
-    "immed":        true,
-    "indent":       2,
-    "latedef":      true,
-    "newcap":       true,
-    "noarg":        true,
-    "quotmark":     "single",
-    "regexp":       true,
-    "smarttabs":    true,
-    "strict":       true,
-    "sub":          true,
-    "trailing":     true,
-    "undef":        true,
-    "unused":       true,
-    "jquery":       true,
-    "globalstrict": true,
-    "laxcomma":     true,
-    "predef":   {
-        "vpo":          true,
-        "_":            true,
-        "angular":      true,
-        "window":       true,
-        "app":          true,
-        "moment":       true,
-        "inject":       true,
-        "alert":        true
-    }
-}
\ No newline at end of file
diff --git a/node_modules/mysql2-promise/.npmignore b/node_modules/mysql2-promise/.npmignore
deleted file mode 100644
index c2658d7d1b31848c3b71960543cb0368e56cd4c7..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
diff --git a/node_modules/mysql2-promise/.travis.yml b/node_modules/mysql2-promise/.travis.yml
deleted file mode 100644
index 12e3c228bf70d082bc42fe10ac171351eded2ca7..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/.travis.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-language: node_js
-node_js:
-  - "0.10"
-script:
-  - npm test
-notifications:
-  email: dev@namshi.com
-
diff --git a/node_modules/mysql2-promise/README.md b/node_modules/mysql2-promise/README.md
deleted file mode 100644
index 383ae0f97b8fca5be86c4e64c4362b06db6199b5..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/README.md
+++ /dev/null
@@ -1,97 +0,0 @@
-# mysql-promise
-
-Small promises wrapper for [`mysql2`](https://github.com/sidorares/node-mysql2), 
-it's forked and compatible with [`mysql-promise`](https://github.com/martinj/node-mysql-promise).
-
-[![build status](https://travis-ci.org/namshi/node-mysql2-promise.svg)](http://travis-ci.org/namshi/node-mysql2-promise)
-[![NPM](https://img.shields.io/npm/v/mysql2-promise.svg)](https://www.npmjs.com/package/mysql2-promise)
-[![NPM](https://img.shields.io/npm/dm/mysql2-promise.svg)](https://www.npmjs.com/package/mysql2-promise)
-
-## Installation
-
-This module is installed via npm:
-
-``` bash
-$ npm install mysql2-promise --save
-```
-
-## Example Usage of query
-
-``` js
-var db = require('mysql2-promise')();
-
-db.configure({
-	"host": "localhost",
-	"user": "foo",
-	"password": "bar",
-	"database": "db"
-});
-
-db.query('UPDATE foo SET key = ?', ['value']).then(function () {
-	return db.query('SELECT * FROM foo');
-}).spread(function (rows) {
-	console.log('Look at all the foo', rows);
-});
-
-//using multiple databases, giving it a name 'second-db' so it can be retrieved inside other modules/files.
-var db2 = require('mysql-promise')('second-db');
-
-db2.configure({
-	"host": "localhost",
-	"user": "foo",
-	"password": "bar",
-	"database": "another-db"
-});
-
-db2.query('SELECT * FROM users').spread(function (users) {
-	console.log('Hello users', users);
-});
-
-
-```
-
-## Example Usage of execute
-
-`execute()` function is similar to `query` but it use [prepared-statements](https://github.com/sidorares/node-mysql2#prepared-statements).
-
-``` js
-var db = require('mysql2-promise')();
-
-db.configure({
-	"host": "localhost",
-	"user": "foo",
-	"password": "bar",
-	"database": "db"
-});
-
-db.execute('SELECT * FROM users WHERE LIMIT = ?', [10]).spread(function (users) {
-	console.log('Hello users', users);
-});
-
-```
-
-## Example usage of [namedPlaceholders]((https://github.com/sidorares/node-mysql2#named-placeholders))
-
-``` js
-var db = require('mysql2-promise')();
-
-db.configure({
-	"host": "localhost",
-	"user": "foo",
-	"password": "bar",
-	"database": "db"
-});
-
-db.pool.on('connection', function (poolConnection) {
-    poolConnection.config.namedPlaceholders = true;
-});
-
-db.execute('SELECT * FROM users WHERE LIMIT = :limit', {limit: 10}).spread(function (users) {
-	console.log('Hello users', users);
-});
-
-```
-
-## Credits
-
-This library is forked from [`mysql-promise`](https://github.com/martinj/node-mysql-promise)
diff --git a/node_modules/mysql2-promise/index.js b/node_modules/mysql2-promise/index.js
deleted file mode 100644
index 6d3c0cb429821a1e50421a6782a36965b3b246ec..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/index.js
+++ /dev/null
@@ -1,103 +0,0 @@
-/* jshint strict: true */
-
-'use strict';
-
-var Q = require('q');
-var mysql2 = require('mysql2');
-var instances = {};
-
-function DB() {
-  this.pool = null;
-}
-
-/**
- * Setup the Database connection pool for this instance
- * @param  {Object} config
- */
-DB.prototype.configure = function (config) {
-  this.pool = mysql2.createPool(config);
-};
-
-/**
- * Run DB query
- * @param  {String} query
- * @param  {Object} [params]
- * @return {Promise}
- */
-DB.prototype.query = function (query, params) {
-  params = params || {};
-  var db = this;
-
-  return Q.Promise(function (resolve, reject) {
-    db.pool.getConnection(function (err, con) {
-      if (err) {
-        if (con) {
-          con.release();
-        }
-
-        return reject(err);
-      }
-
-      con.query(query, params, function (err) {
-        if (err) {
-          if (con) {
-            con.release();
-          }
-
-          return reject(err);
-        }
-
-        resolve([].splice.call(arguments, 1));
-        con.release();
-      });
-    });
-  });
-};
-
-/**
- * Run DB execute
- * @param  {String} query
- * @param  {Object} [params]
- * @return {Promise}
- */
-DB.prototype.execute = function (query, params) {
-  params = params || {};
-  var db = this;
-
-  return Q.Promise(function (resolve, reject) {
-    db.pool.getConnection(function (err, con) {
-      if (err) {
-        if (con) {
-          con.release();
-        }
-
-        return reject(err);
-      }
-
-      con.execute(query, params, function (err) {
-        if (err) {
-          if (con) {
-            con.unprepare(query);
-            con.release();
-          }
-
-          return reject(err);
-        }
-
-        resolve([].splice.call(arguments, 1));
-        con.unprepare(query);
-        con.release();
-      });
-    });
-  });
-};
-
-module.exports = function (name) {
-  name = name || '_default_';
-
-  if (!instances[name]) {
-    instances[name] = new DB();
-  }
-
-  return instances[name];
-};
diff --git a/node_modules/mysql2-promise/node_modules/lru-cache/.npmignore b/node_modules/mysql2-promise/node_modules/lru-cache/.npmignore
deleted file mode 100644
index 07e6e472cc75fafa944e2a6d4b0f101bc476c060..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/lru-cache/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-/node_modules
diff --git a/node_modules/mysql2-promise/node_modules/lru-cache/CONTRIBUTORS b/node_modules/mysql2-promise/node_modules/lru-cache/CONTRIBUTORS
deleted file mode 100644
index 4a0bc5033a06e76a9cf5c42a0357946825a4f613..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/lru-cache/CONTRIBUTORS
+++ /dev/null
@@ -1,14 +0,0 @@
-# Authors, sorted by whether or not they are me
-Isaac Z. Schlueter <i@izs.me>
-Brian Cottingham <spiffytech@gmail.com>
-Carlos Brito Lage <carlos@carloslage.net>
-Jesse Dailey <jesse.dailey@gmail.com>
-Kevin O'Hara <kevinohara80@gmail.com>
-Marco Rogers <marco.rogers@gmail.com>
-Mark Cavage <mcavage@gmail.com>
-Marko Mikulicic <marko.mikulicic@isti.cnr.it>
-Nathan Rajlich <nathan@tootallnate.net>
-Satheesh Natesan <snateshan@myspace-inc.com>
-Trent Mick <trentm@gmail.com>
-ashleybrener <ashley@starlogik.com>
-n4kz <n4kz@n4kz.com>
diff --git a/node_modules/mysql2-promise/node_modules/lru-cache/LICENSE b/node_modules/mysql2-promise/node_modules/lru-cache/LICENSE
deleted file mode 100644
index 05a4010949cac33c91988978137261559ed853f8..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/lru-cache/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-Copyright 2009, 2010, 2011 Isaac Z. Schlueter.
-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/mysql2-promise/node_modules/lru-cache/README.md b/node_modules/mysql2-promise/node_modules/lru-cache/README.md
deleted file mode 100644
index 03ee0f9850237428b1fb99b93592e9a5cee85205..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/lru-cache/README.md
+++ /dev/null
@@ -1,97 +0,0 @@
-# lru cache
-
-A cache object that deletes the least-recently-used items.
-
-## Usage:
-
-```javascript
-var LRU = require("lru-cache")
-  , options = { max: 500
-              , length: function (n) { return n * 2 }
-              , dispose: function (key, n) { n.close() }
-              , maxAge: 1000 * 60 * 60 }
-  , cache = LRU(options)
-  , otherCache = LRU(50) // sets just the max size
-
-cache.set("key", "value")
-cache.get("key") // "value"
-
-cache.reset()    // empty the cache
-```
-
-If you put more stuff in it, then items will fall out.
-
-If you try to put an oversized thing in it, then it'll fall out right
-away.
-
-## Options
-
-* `max` The maximum size of the cache, checked by applying the length
-  function to all values in the cache.  Not setting this is kind of
-  silly, since that's the whole purpose of this lib, but it defaults
-  to `Infinity`.
-* `maxAge` Maximum age in ms.  Items are not pro-actively pruned out
-  as they age, but if you try to get an item that is too old, it'll
-  drop it and return undefined instead of giving it to you.
-* `length` Function that is used to calculate the length of stored
-  items.  If you're storing strings or buffers, then you probably want
-  to do something like `function(n){return n.length}`.  The default is
-  `function(n){return 1}`, which is fine if you want to store `n`
-  like-sized things.
-* `dispose` Function that is called on items when they are dropped
-  from the cache.  This can be handy if you want to close file
-  descriptors or do other cleanup tasks when items are no longer
-  accessible.  Called with `key, value`.  It's called *before*
-  actually removing the item from the internal cache, so if you want
-  to immediately put it back in, you'll have to do that in a
-  `nextTick` or `setTimeout` callback or it won't do anything.
-* `stale` By default, if you set a `maxAge`, it'll only actually pull
-  stale items out of the cache when you `get(key)`.  (That is, it's
-  not pre-emptively doing a `setTimeout` or anything.)  If you set
-  `stale:true`, it'll return the stale value before deleting it.  If
-  you don't set this, then it'll return `undefined` when you try to
-  get a stale entry, as if it had already been deleted.
-
-## API
-
-* `set(key, value)`
-* `get(key) => value`
-
-    Both of these will update the "recently used"-ness of the key.
-    They do what you think.
-
-* `peek(key)`
-
-    Returns the key value (or `undefined` if not found) without
-    updating the "recently used"-ness of the key.
-
-    (If you find yourself using this a lot, you *might* be using the
-    wrong sort of data structure, but there are some use cases where
-    it's handy.)
-
-* `del(key)`
-
-    Deletes a key out of the cache.
-
-* `reset()`
-
-    Clear the cache entirely, throwing away all values.
-
-* `has(key)`
-
-    Check if a key is in the cache, without updating the recent-ness
-    or deleting it for being stale.
-
-* `forEach(function(value,key,cache), [thisp])`
-
-    Just like `Array.prototype.forEach`.  Iterates over all the keys
-    in the cache, in order of recent-ness.  (Ie, more recently used
-    items are iterated over first.)
-
-* `keys()`
-
-    Return an array of the keys in the cache.
-
-* `values()`
-
-    Return an array of the values in the cache.
diff --git a/node_modules/mysql2-promise/node_modules/lru-cache/lib/lru-cache.js b/node_modules/mysql2-promise/node_modules/lru-cache/lib/lru-cache.js
deleted file mode 100644
index d1d1381720cd749c562cc4a5504d9b2b9f6ca3bf..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/lru-cache/lib/lru-cache.js
+++ /dev/null
@@ -1,252 +0,0 @@
-;(function () { // closure for web browsers
-
-if (typeof module === 'object' && module.exports) {
-  module.exports = LRUCache
-} else {
-  // just set the global for non-node platforms.
-  this.LRUCache = LRUCache
-}
-
-function hOP (obj, key) {
-  return Object.prototype.hasOwnProperty.call(obj, key)
-}
-
-function naiveLength () { return 1 }
-
-function LRUCache (options) {
-  if (!(this instanceof LRUCache))
-    return new LRUCache(options)
-
-  if (typeof options === 'number')
-    options = { max: options }
-
-  if (!options)
-    options = {}
-
-  this._max = options.max
-  // Kind of weird to have a default max of Infinity, but oh well.
-  if (!this._max || !(typeof this._max === "number") || this._max <= 0 )
-    this._max = Infinity
-
-  this._lengthCalculator = options.length || naiveLength
-  if (typeof this._lengthCalculator !== "function")
-    this._lengthCalculator = naiveLength
-
-  this._allowStale = options.stale || false
-  this._maxAge = options.maxAge || null
-  this._dispose = options.dispose
-  this.reset()
-}
-
-// resize the cache when the max changes.
-Object.defineProperty(LRUCache.prototype, "max",
-  { set : function (mL) {
-      if (!mL || !(typeof mL === "number") || mL <= 0 ) mL = Infinity
-      this._max = mL
-      if (this._length > this._max) trim(this)
-    }
-  , get : function () { return this._max }
-  , enumerable : true
-  })
-
-// resize the cache when the lengthCalculator changes.
-Object.defineProperty(LRUCache.prototype, "lengthCalculator",
-  { set : function (lC) {
-      if (typeof lC !== "function") {
-        this._lengthCalculator = naiveLength
-        this._length = this._itemCount
-        for (var key in this._cache) {
-          this._cache[key].length = 1
-        }
-      } else {
-        this._lengthCalculator = lC
-        this._length = 0
-        for (var key in this._cache) {
-          this._cache[key].length = this._lengthCalculator(this._cache[key].value)
-          this._length += this._cache[key].length
-        }
-      }
-
-      if (this._length > this._max) trim(this)
-    }
-  , get : function () { return this._lengthCalculator }
-  , enumerable : true
-  })
-
-Object.defineProperty(LRUCache.prototype, "length",
-  { get : function () { return this._length }
-  , enumerable : true
-  })
-
-
-Object.defineProperty(LRUCache.prototype, "itemCount",
-  { get : function () { return this._itemCount }
-  , enumerable : true
-  })
-
-LRUCache.prototype.forEach = function (fn, thisp) {
-  thisp = thisp || this
-  var i = 0;
-  for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) {
-    i++
-    var hit = this._lruList[k]
-    if (this._maxAge && (Date.now() - hit.now > this._maxAge)) {
-      del(this, hit)
-      if (!this._allowStale) hit = undefined
-    }
-    if (hit) {
-      fn.call(thisp, hit.value, hit.key, this)
-    }
-  }
-}
-
-LRUCache.prototype.keys = function () {
-  var keys = new Array(this._itemCount)
-  var i = 0
-  for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) {
-    var hit = this._lruList[k]
-    keys[i++] = hit.key
-  }
-  return keys
-}
-
-LRUCache.prototype.values = function () {
-  var values = new Array(this._itemCount)
-  var i = 0
-  for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) {
-    var hit = this._lruList[k]
-    values[i++] = hit.value
-  }
-  return values
-}
-
-LRUCache.prototype.reset = function () {
-  if (this._dispose && this._cache) {
-    for (var k in this._cache) {
-      this._dispose(k, this._cache[k].value)
-    }
-  }
-
-  this._cache = Object.create(null) // hash of items by key
-  this._lruList = Object.create(null) // list of items in order of use recency
-  this._mru = 0 // most recently used
-  this._lru = 0 // least recently used
-  this._length = 0 // number of items in the list
-  this._itemCount = 0
-}
-
-// Provided for debugging/dev purposes only. No promises whatsoever that
-// this API stays stable.
-LRUCache.prototype.dump = function () {
-  return this._cache
-}
-
-LRUCache.prototype.dumpLru = function () {
-  return this._lruList
-}
-
-LRUCache.prototype.set = function (key, value) {
-  if (hOP(this._cache, key)) {
-    // dispose of the old one before overwriting
-    if (this._dispose) this._dispose(key, this._cache[key].value)
-    if (this._maxAge) this._cache[key].now = Date.now()
-    this._cache[key].value = value
-    this.get(key)
-    return true
-  }
-
-  var len = this._lengthCalculator(value)
-  var age = this._maxAge ? Date.now() : 0
-  var hit = new Entry(key, value, this._mru++, len, age)
-
-  // oversized objects fall out of cache automatically.
-  if (hit.length > this._max) {
-    if (this._dispose) this._dispose(key, value)
-    return false
-  }
-
-  this._length += hit.length
-  this._lruList[hit.lu] = this._cache[key] = hit
-  this._itemCount ++
-
-  if (this._length > this._max) trim(this)
-  return true
-}
-
-LRUCache.prototype.has = function (key) {
-  if (!hOP(this._cache, key)) return false
-  var hit = this._cache[key]
-  if (this._maxAge && (Date.now() - hit.now > this._maxAge)) {
-    return false
-  }
-  return true
-}
-
-LRUCache.prototype.get = function (key) {
-  return get(this, key, true)
-}
-
-LRUCache.prototype.peek = function (key) {
-  return get(this, key, false)
-}
-
-LRUCache.prototype.pop = function () {
-  var hit = this._lruList[this._lru]
-  del(this, hit)
-  return hit || null
-}
-
-LRUCache.prototype.del = function (key) {
-  del(this, this._cache[key])
-}
-
-function get (self, key, doUse) {
-  var hit = self._cache[key]
-  if (hit) {
-    if (self._maxAge && (Date.now() - hit.now > self._maxAge)) {
-      del(self, hit)
-      if (!self._allowStale) hit = undefined
-    } else {
-      if (doUse) use(self, hit)
-    }
-    if (hit) hit = hit.value
-  }
-  return hit
-}
-
-function use (self, hit) {
-  shiftLU(self, hit)
-  hit.lu = self._mru ++
-  self._lruList[hit.lu] = hit
-}
-
-function trim (self) {
-  while (self._lru < self._mru && self._length > self._max)
-    del(self, self._lruList[self._lru])
-}
-
-function shiftLU (self, hit) {
-  delete self._lruList[ hit.lu ]
-  while (self._lru < self._mru && !self._lruList[self._lru]) self._lru ++
-}
-
-function del (self, hit) {
-  if (hit) {
-    if (self._dispose) self._dispose(hit.key, hit.value)
-    self._length -= hit.length
-    self._itemCount --
-    delete self._cache[ hit.key ]
-    shiftLU(self, hit)
-  }
-}
-
-// classy, since V8 prefers predictable objects.
-function Entry (key, value, lu, length, now) {
-  this.key = key
-  this.value = value
-  this.lu = lu
-  this.length = length
-  this.now = now
-}
-
-})()
diff --git a/node_modules/mysql2-promise/node_modules/lru-cache/package.json b/node_modules/mysql2-promise/node_modules/lru-cache/package.json
deleted file mode 100644
index 24b0a6604f321e641721aef4bb7947b0c130f01d..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/lru-cache/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "lru-cache",
-  "description": "A cache object that deletes the least-recently-used items.",
-  "version": "2.5.0",
-  "author": "Isaac Z. Schlueter <i@izs.me>",
-  "scripts": {
-    "test": "tap test --gc"
-  },
-  "main": "lib/lru-cache.js",
-  "repository": "git://github.com/isaacs/node-lru-cache.git",
-  "devDependencies": {
-    "tap": "",
-    "weak": ""
-  },
-  "license": {
-    "type": "MIT",
-    "url": "http://github.com/isaacs/node-lru-cache/raw/master/LICENSE"
-  }
-}
diff --git a/node_modules/mysql2-promise/node_modules/lru-cache/test/basic.js b/node_modules/mysql2-promise/node_modules/lru-cache/test/basic.js
deleted file mode 100644
index f72697c4611a3cbb282c281cfa46cc6723d584f3..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/lru-cache/test/basic.js
+++ /dev/null
@@ -1,369 +0,0 @@
-var test = require("tap").test
-  , LRU = require("../")
-
-test("basic", function (t) {
-  var cache = new LRU({max: 10})
-  cache.set("key", "value")
-  t.equal(cache.get("key"), "value")
-  t.equal(cache.get("nada"), undefined)
-  t.equal(cache.length, 1)
-  t.equal(cache.max, 10)
-  t.end()
-})
-
-test("least recently set", function (t) {
-  var cache = new LRU(2)
-  cache.set("a", "A")
-  cache.set("b", "B")
-  cache.set("c", "C")
-  t.equal(cache.get("c"), "C")
-  t.equal(cache.get("b"), "B")
-  t.equal(cache.get("a"), undefined)
-  t.end()
-})
-
-test("lru recently gotten", function (t) {
-  var cache = new LRU(2)
-  cache.set("a", "A")
-  cache.set("b", "B")
-  cache.get("a")
-  cache.set("c", "C")
-  t.equal(cache.get("c"), "C")
-  t.equal(cache.get("b"), undefined)
-  t.equal(cache.get("a"), "A")
-  t.end()
-})
-
-test("del", function (t) {
-  var cache = new LRU(2)
-  cache.set("a", "A")
-  cache.del("a")
-  t.equal(cache.get("a"), undefined)
-  t.end()
-})
-
-test("max", function (t) {
-  var cache = new LRU(3)
-
-  // test changing the max, verify that the LRU items get dropped.
-  cache.max = 100
-  for (var i = 0; i < 100; i ++) cache.set(i, i)
-  t.equal(cache.length, 100)
-  for (var i = 0; i < 100; i ++) {
-    t.equal(cache.get(i), i)
-  }
-  cache.max = 3
-  t.equal(cache.length, 3)
-  for (var i = 0; i < 97; i ++) {
-    t.equal(cache.get(i), undefined)
-  }
-  for (var i = 98; i < 100; i ++) {
-    t.equal(cache.get(i), i)
-  }
-
-  // now remove the max restriction, and try again.
-  cache.max = "hello"
-  for (var i = 0; i < 100; i ++) cache.set(i, i)
-  t.equal(cache.length, 100)
-  for (var i = 0; i < 100; i ++) {
-    t.equal(cache.get(i), i)
-  }
-  // should trigger an immediate resize
-  cache.max = 3
-  t.equal(cache.length, 3)
-  for (var i = 0; i < 97; i ++) {
-    t.equal(cache.get(i), undefined)
-  }
-  for (var i = 98; i < 100; i ++) {
-    t.equal(cache.get(i), i)
-  }
-  t.end()
-})
-
-test("reset", function (t) {
-  var cache = new LRU(10)
-  cache.set("a", "A")
-  cache.set("b", "B")
-  cache.reset()
-  t.equal(cache.length, 0)
-  t.equal(cache.max, 10)
-  t.equal(cache.get("a"), undefined)
-  t.equal(cache.get("b"), undefined)
-  t.end()
-})
-
-
-// Note: `<cache>.dump()` is a debugging tool only. No guarantees are made
-// about the format/layout of the response.
-test("dump", function (t) {
-  var cache = new LRU(10)
-  var d = cache.dump();
-  t.equal(Object.keys(d).length, 0, "nothing in dump for empty cache")
-  cache.set("a", "A")
-  var d = cache.dump()  // { a: { key: "a", value: "A", lu: 0 } }
-  t.ok(d.a)
-  t.equal(d.a.key, "a")
-  t.equal(d.a.value, "A")
-  t.equal(d.a.lu, 0)
-
-  cache.set("b", "B")
-  cache.get("b")
-  d = cache.dump()
-  t.ok(d.b)
-  t.equal(d.b.key, "b")
-  t.equal(d.b.value, "B")
-  t.equal(d.b.lu, 2)
-
-  t.end()
-})
-
-
-test("basic with weighed length", function (t) {
-  var cache = new LRU({
-    max: 100,
-    length: function (item) { return item.size }
-  })
-  cache.set("key", {val: "value", size: 50})
-  t.equal(cache.get("key").val, "value")
-  t.equal(cache.get("nada"), undefined)
-  t.equal(cache.lengthCalculator(cache.get("key")), 50)
-  t.equal(cache.length, 50)
-  t.equal(cache.max, 100)
-  t.end()
-})
-
-
-test("weighed length item too large", function (t) {
-  var cache = new LRU({
-    max: 10,
-    length: function (item) { return item.size }
-  })
-  t.equal(cache.max, 10)
-
-  // should fall out immediately
-  cache.set("key", {val: "value", size: 50})
-
-  t.equal(cache.length, 0)
-  t.equal(cache.get("key"), undefined)
-  t.end()
-})
-
-test("least recently set with weighed length", function (t) {
-  var cache = new LRU({
-    max:8,
-    length: function (item) { return item.length }
-  })
-  cache.set("a", "A")
-  cache.set("b", "BB")
-  cache.set("c", "CCC")
-  cache.set("d", "DDDD")
-  t.equal(cache.get("d"), "DDDD")
-  t.equal(cache.get("c"), "CCC")
-  t.equal(cache.get("b"), undefined)
-  t.equal(cache.get("a"), undefined)
-  t.end()
-})
-
-test("lru recently gotten with weighed length", function (t) {
-  var cache = new LRU({
-    max: 8,
-    length: function (item) { return item.length }
-  })
-  cache.set("a", "A")
-  cache.set("b", "BB")
-  cache.set("c", "CCC")
-  cache.get("a")
-  cache.get("b")
-  cache.set("d", "DDDD")
-  t.equal(cache.get("c"), undefined)
-  t.equal(cache.get("d"), "DDDD")
-  t.equal(cache.get("b"), "BB")
-  t.equal(cache.get("a"), "A")
-  t.end()
-})
-
-test("set returns proper booleans", function(t) {
-  var cache = new LRU({
-    max: 5,
-    length: function (item) { return item.length }
-  })
-
-  t.equal(cache.set("a", "A"), true)
-
-  // should return false for max exceeded
-  t.equal(cache.set("b", "donuts"), false)
-
-  t.equal(cache.set("b", "B"), true)
-  t.equal(cache.set("c", "CCCC"), true)
-  t.end()
-})
-
-test("drop the old items", function(t) {
-  var cache = new LRU({
-    max: 5,
-    maxAge: 50
-  })
-
-  cache.set("a", "A")
-
-  setTimeout(function () {
-    cache.set("b", "b")
-    t.equal(cache.get("a"), "A")
-  }, 25)
-
-  setTimeout(function () {
-    cache.set("c", "C")
-    // timed out
-    t.notOk(cache.get("a"))
-  }, 60)
-
-  setTimeout(function () {
-    t.notOk(cache.get("b"))
-    t.equal(cache.get("c"), "C")
-  }, 90)
-
-  setTimeout(function () {
-    t.notOk(cache.get("c"))
-    t.end()
-  }, 155)
-})
-
-test("disposal function", function(t) {
-  var disposed = false
-  var cache = new LRU({
-    max: 1,
-    dispose: function (k, n) {
-      disposed = n
-    }
-  })
-
-  cache.set(1, 1)
-  cache.set(2, 2)
-  t.equal(disposed, 1)
-  cache.set(3, 3)
-  t.equal(disposed, 2)
-  cache.reset()
-  t.equal(disposed, 3)
-  t.end()
-})
-
-test("disposal function on too big of item", function(t) {
-  var disposed = false
-  var cache = new LRU({
-    max: 1,
-    length: function (k) {
-      return k.length
-    },
-    dispose: function (k, n) {
-      disposed = n
-    }
-  })
-  var obj = [ 1, 2 ]
-
-  t.equal(disposed, false)
-  cache.set("obj", obj)
-  t.equal(disposed, obj)
-  t.end()
-})
-
-test("has()", function(t) {
-  var cache = new LRU({
-    max: 1,
-    maxAge: 10
-  })
-
-  cache.set('foo', 'bar')
-  t.equal(cache.has('foo'), true)
-  cache.set('blu', 'baz')
-  t.equal(cache.has('foo'), false)
-  t.equal(cache.has('blu'), true)
-  setTimeout(function() {
-    t.equal(cache.has('blu'), false)
-    t.end()
-  }, 15)
-})
-
-test("stale", function(t) {
-  var cache = new LRU({
-    maxAge: 10,
-    stale: true
-  })
-
-  cache.set('foo', 'bar')
-  t.equal(cache.get('foo'), 'bar')
-  t.equal(cache.has('foo'), true)
-  setTimeout(function() {
-    t.equal(cache.has('foo'), false)
-    t.equal(cache.get('foo'), 'bar')
-    t.equal(cache.get('foo'), undefined)
-    t.end()
-  }, 15)
-})
-
-test("lru update via set", function(t) {
-  var cache = LRU({ max: 2 });
-
-  cache.set('foo', 1);
-  cache.set('bar', 2);
-  cache.del('bar');
-  cache.set('baz', 3);
-  cache.set('qux', 4);
-
-  t.equal(cache.get('foo'), undefined)
-  t.equal(cache.get('bar'), undefined)
-  t.equal(cache.get('baz'), 3)
-  t.equal(cache.get('qux'), 4)
-  t.end()
-})
-
-test("least recently set w/ peek", function (t) {
-  var cache = new LRU(2)
-  cache.set("a", "A")
-  cache.set("b", "B")
-  t.equal(cache.peek("a"), "A")
-  cache.set("c", "C")
-  t.equal(cache.get("c"), "C")
-  t.equal(cache.get("b"), "B")
-  t.equal(cache.get("a"), undefined)
-  t.end()
-})
-
-test("pop the least used item", function (t) {
-  var cache = new LRU(3)
-  , last
-
-  cache.set("a", "A")
-  cache.set("b", "B")
-  cache.set("c", "C")
-
-  t.equal(cache.length, 3)
-  t.equal(cache.max, 3)
-
-  // Ensure we pop a, c, b
-  cache.get("b", "B")
-
-  last = cache.pop()
-  t.equal(last.key, "a")
-  t.equal(last.value, "A")
-  t.equal(cache.length, 2)
-  t.equal(cache.max, 3)
-
-  last = cache.pop()
-  t.equal(last.key, "c")
-  t.equal(last.value, "C")
-  t.equal(cache.length, 1)
-  t.equal(cache.max, 3)
-
-  last = cache.pop()
-  t.equal(last.key, "b")
-  t.equal(last.value, "B")
-  t.equal(cache.length, 0)
-  t.equal(cache.max, 3)
-
-  last = cache.pop()
-  t.equal(last, null)
-  t.equal(cache.length, 0)
-  t.equal(cache.max, 3)
-
-  t.end()
-})
diff --git a/node_modules/mysql2-promise/node_modules/lru-cache/test/foreach.js b/node_modules/mysql2-promise/node_modules/lru-cache/test/foreach.js
deleted file mode 100644
index eefb80d9d1564424f483a355136363bf6816be63..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/lru-cache/test/foreach.js
+++ /dev/null
@@ -1,52 +0,0 @@
-var test = require('tap').test
-var LRU = require('../')
-
-test('forEach', function (t) {
-  var l = new LRU(5)
-  for (var i = 0; i < 10; i ++) {
-    l.set(i.toString(), i.toString(2))
-  }
-
-  var i = 9
-  l.forEach(function (val, key, cache) {
-    t.equal(cache, l)
-    t.equal(key, i.toString())
-    t.equal(val, i.toString(2))
-    i -= 1
-  })
-
-  // get in order of most recently used
-  l.get(6)
-  l.get(8)
-
-  var order = [ 8, 6, 9, 7, 5 ]
-  var i = 0
-
-  l.forEach(function (val, key, cache) {
-    var j = order[i ++]
-    t.equal(cache, l)
-    t.equal(key, j.toString())
-    t.equal(val, j.toString(2))
-  })
-
-  t.end()
-})
-
-test('keys() and values()', function (t) {
-  var l = new LRU(5)
-  for (var i = 0; i < 10; i ++) {
-    l.set(i.toString(), i.toString(2))
-  }
-
-  t.similar(l.keys(), ['9', '8', '7', '6', '5'])
-  t.similar(l.values(), ['1001', '1000', '111', '110', '101'])
-
-  // get in order of most recently used
-  l.get(6)
-  l.get(8)
-
-  t.similar(l.keys(), ['8', '6', '9', '7', '5'])
-  t.similar(l.values(), ['1000', '110', '1001', '111', '101'])
-
-  t.end()
-})
diff --git a/node_modules/mysql2-promise/node_modules/lru-cache/test/memory-leak.js b/node_modules/mysql2-promise/node_modules/lru-cache/test/memory-leak.js
deleted file mode 100644
index 7af45b0221c1ff93b188c398ff31669f06f7ce0e..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/lru-cache/test/memory-leak.js
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env node --expose_gc
-
-var weak = require('weak');
-var test = require('tap').test
-var LRU = require('../')
-var l = new LRU({ max: 10 })
-var refs = 0
-function X() {
-  refs ++
-  weak(this, deref)
-}
-
-function deref() {
-  refs --
-}
-
-test('no leaks', function (t) {
-  // fill up the cache
-  for (var i = 0; i < 100; i++) {
-    l.set(i, new X);
-    // throw some gets in there, too.
-    if (i % 2 === 0)
-      l.get(i / 2)
-  }
-
-  gc()
-
-  var start = process.memoryUsage()
-
-  // capture the memory
-  var startRefs = refs
-
-  // do it again, but more
-  for (var i = 0; i < 10000; i++) {
-    l.set(i, new X);
-    // throw some gets in there, too.
-    if (i % 2 === 0)
-      l.get(i / 2)
-  }
-
-  gc()
-
-  var end = process.memoryUsage()
-  t.equal(refs, startRefs, 'no leaky refs')
-
-  console.error('start: %j\n' +
-                'end:   %j', start, end);
-  t.pass();
-  t.end();
-})
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/.npmignore b/node_modules/mysql2-promise/node_modules/mysql2/.npmignore
deleted file mode 100644
index 59ee6765f9ca3cebfa7c0e0258f22512333455c3..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/.npmignore
+++ /dev/null
@@ -1,17 +0,0 @@
-lib-cov
-*.seed
-*.log
-*.csv
-*.dat
-*.out
-*.pid
-*.gz
-.DS_Store
-
-tmp
-pids
-logs
-
-node_modules
-npm-debug.log
-
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/.travis.yml b/node_modules/mysql2-promise/node_modules/mysql2/.travis.yml
deleted file mode 100644
index 322cc7c888bb6b09c8f81f5151a0e86a18db6e3b..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: node_js
-before_script:
-  - mysql -e 'create database if not exists test;'
-node_js:
-  - '0.8'
-  - '0.10'
-  - '0.12'
-  - '1.0'
-  - '2.3'
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/Changelog.md b/node_modules/mysql2-promise/node_modules/mysql2/Changelog.md
deleted file mode 100644
index 88b757cf86b67472e0788761e97bf9140104fdb9..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/Changelog.md
+++ /dev/null
@@ -1,187 +0,0 @@
-0.15.7 - 22/06/2015
-- Add .escapeId() to Connection and Pool                     #180
-- Build: iojs 2.2.1 & 2.3.0
-- Binary protocol: fix crash when server return null
-  for 'NOT NULL' column                                      #178
-
-0.15.6 - 04/06/2015
-- Include errno in error object                              #168
-- server: fix fields in OK and column header packets
-  (fix errors when connecting with node-mysql)
-- build: add iojs 1.8.x to matrix
-
-0.15.5 - 08/04/2015
-- fix broken 'stream rows' functionality                     #165, #166
-- add io.js 1.6 to build matrix
-
-0.15.4 - 11/03/2015
-- added COM_QUIT command, sent from conn.end()               #163, #150
-- io.js 1.5
-- don't crash on unexpected protocol packets, emit           #164, #160
-  connection error event instead
-
-0.15.3 - 24/02/2015
- - multiple results support in binary protocol               #157 #26 #27
- - add io.js 1.4 to CI matrix
-
-0.15.2 - 24/02/2015
- - update Amazon RDS certificates                           #154
- - add io.js 1.3 to CI matrix
- - fix packet parser bug                                     #155
-
-0.15.1 - 18/02/2015
- - add io.js 1.0 - 1.2 to build matrix
- - add windows CI using Appveyor                             #151 #152
-
-0.15.0 - 1/10/2015
- - connection.threadId
- - connection.changeUser()                                   #63
- - named placeholders                                        #117
- - new prepared statements api                               #132 #139
- - support LOAD INFILE                                       #64 #142
- - refactored faster packet parser                           #140
- - lazy parse rarely used column definition fields           #137
-
-0.14.1 - 9/12/2014
- - stream connection option now can be a function            #80
- - bugfix/prepared statements: fix case when no columns
-   in statement header but there are columns in results      #130
-
-0.14.0 - 26/11/2014
-  - added connection.pause() and connection.resume()         #129
-
-0.13.0
-  - connection errors sent to all commands in queue
-  - server-side authentication support                       #122
-  - server.listen() is now chainable (returns server)
-  - allow to login using sha1(password)                      #124
-  - Query.sql as alias to Query.query                        #121
-
-0.12.5 - 30/07/2014
-  - add 'execute' pool method similar to Pool##query         #114
-  - more debug output behind debug flag
-
-0.12.4 - 17/07/2014
-  - 'debug' connection option now result in lots of
-     debug output                                            #112 #77
-  - send corectly compression flag if compression is on      #102
-
-
-0.12.3 - 11/07/2014
-  - fix node 0.8 - incompatible dependency version
-
-0.12.2 - 11/07/2014
-
-  - output milliseconds in date type                         #107
-  - deserialise length coded int with > 24 bit numbers
-    to js int / float (and not throw "Bignts not supported") #108
-  - support for Bigint numbers in insertId
-
-0.12.1 - 30/04/2014
-
-  - 'dateStrings' connection option support                  #99
-  - use anonymous function for packet routing instead
-    of .bind() 3-5% speed improvement
-  - GEOMETRY type support in binary protocol                 #97
-
-0.12.0 - 29/04/2014
-
-  - route connection time errors from handshke command to
-    connection                                               #96
-
-  - support for nestTables and rowsAsArray options in query()
-    and execute()                                            #95, #94
-
-  - bugfix: date as parameter in prepared statement,
-    day of week was used incorrectly
-    instead of day of month                                  #89     ab28dfca839728dfe40d941091902185d7c19b57
-
-   - GEOMETRY type support ported from node-mysql            #93     ebd30fd12b3b7f53d97b9d09f947b12f61e0c2c5
-
-0.11.8
-
-  - add DATE type support                                    #84     1d49651d8e40bf43b79937d9de9b2909126b892c
-  - faster DATE parsing in text protocol                             cdfed2881462798bd85fbf906ea604875a3bd625
-
-
-0.11.7
-  - initial implementaion of binlog protocol            #83 #78      c8d45da6fc13a56d95ce6d57c3c8aa9524548770
-  - interpret null DOUBLE values as null instead 0 #85               4c03b23f30949be0608d9543d69243944d79bb4a
-  - use srcEscape for null values (bunary parser)                    ef50bcafa452588eda4a40037b41f6b961085046
-
-0.11.6
-  - minor cleanups
-
-0.11.5
-  - fix for non-utf strings serialisation (binary protocol only)     cf9594aaab5b3d51a112bd1f43b39a55f508eef7
-
-0.11.4
-  - support YEAR type in prepared statements                         a0f33b5a4de4529130b3c4137f7a1dd3c02aed9e
-
-0.11.3
-  - add transaction helpers                             #56, #76     cc0a9f9b721900d3a22c7fc84a5244c74cd33dd5
-
-0.11.2
-
-  - wrap callbacks in nextTick for exception safety                  b73ac9868804b603a0ab6df6129cf3682476d118
-  - domains support                                          #73     36cba61359c83018a847ac4e7748d920b6f863c4
-
-0.11.1
-
-  - buxfix: connection.connect callback was called more than once
-                                                             #72      0352eefdafc0986f1ec79c0ce285f722ca12af16
-
-0.11.0
-  - Bundle Amazon RDS cert and allow to connect using                 e6af097b5facc089f1999c1fb076ada0ce2e7e99
-    'Amazon RDS' as ssl value
-
-0.10.7
-
-  - Amazon RDS+ssl example and public CA cert                         709394a4afbbaf0500439e72caec5d37e949fe26
-  - pool updated from node-mysql                   #71, #68, #61      db561dbe10a55bb0f9893eb0e2c4b429edd6ee3a
-
-0.10.6
-  - handle TIMESTAMP type                                    #59      6dd6fc82d95a16e18092c4db4e8da225b37e9314
-  - rename pool's connection.end() to connection.release()   #53      c63b2442e3c0fb5ea3953725ba9c1b3e08b2b831
-
-0.10.5
-
-  - node-mysql compatibility: remove 'number of results in response'
-    callback argument (Brian White)                          #46       40af0530403a3892743d32974055c5ea23cbd3ec
-  - node 0.11 (use on('data') instead of ondata )                      39906c78b85a77e468694814a50f99714d7bbbd6
-  - fix again ssl (#41)                                                713051bf997a186774b618cde583707320a1d551
-
-0.10.4
-  - node-mysql compatibility: remove 'number of results in response'
-    callback argument (Brian White)                          #45       c9cb926360da5e4028f7d2f83f4b4e94897cd8b8
-  - 'resultIndex' parameter for non-multiple results query             8879bdde397b6cd730d234383fa322becd1134de
-
-0.10.3
-  - various ssl fixes and refactoring (ssl was broken for some time)   213d375f7263cb6f5e724fdac3ea156ccee4bbd4
-  - Server protocol: handle null values serialisation
-     (Michael Muturi Njonge)                                 #36       831b2a100795f36649f0c3d79b7839a95f771a05
-
-0.10.2
-  - return DECIMAL and NEWDECIMAL as string in binary prot   #40       969fba6ff1dbf14d53d3efc9f94083b8306cf0b5
-
-0.10.1
-  - Added ping command                                       #38       cbca8648d1282fb57e55b3735c3b4d9a46d89d7b
-
-0.9.2
-  - correctly parse NULL result for string and number        #35       0a4ac65ec812f75861dc00c9243921d5d6602914
-  - do not pollute global namespace from evaled parser       #11       4b6ddaf0f70150945d0fea804db9106f343a0e51
-
-0.9.1
-  - PoolClaster ported from node-mysql                       #34
-
-0.8.21
-  - Fix in error message parsing (Noam Wasersprung)          #31       6cc80a67eaa3baac7dd8eee7182c9eb00977e81a
-  - return insert/delete header for insert/delete commands   #32       72aa8fe70981d7410a10edb9d7921e5d6ce1d3ca
-
-0.8.20
-  - Make packet parser work with 0.11 ondata(buffer) with no start,end 9005fd1
-  - Allow to use Date-like objects as date parameters (Amir Livneh)    6138dad0581fd5e2c45e1ce0b999e334db8979cf
-
-0.8.19
-  - Multiple results support in text protocol #15                      4812adaf1aa5b1dfa775a6cf0fa3bae54a7827d0
-  - Use connection flags from createConnection parameters/url string   9218f055ceeb95ae7205348e06c07b89b799d031
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/License b/node_modules/mysql2-promise/node_modules/mysql2/License
deleted file mode 100644
index 51c1bf402f76b04b4dbed4bc1cec49c34758b1ad..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/License
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2013 Andrey Sidorov (sidorares@yandex.ru) and 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/mysql2-promise/node_modules/mysql2/README.md b/node_modules/mysql2-promise/node_modules/mysql2/README.md
deleted file mode 100644
index 158f6d6fb314a21dc07431325dd61fa2a578e9ba..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/README.md
+++ /dev/null
@@ -1,340 +0,0 @@
-#node-mysql2
-
-[![NPM Version][npm-image]][npm-url]
-[![NPM Downloads][downloads-image]][downloads-url]
-[![Node.js Version][node-version-image]][node-version-url]
-[![Linux Build][travis-image]][travis-url]
-[![Windows Build][appveyor-image]][appveyor-url]
-
-Mysql client for node.js. Written in native JavaScript and aims to be mostly api compatible with [node-mysql](https://github.com/felixge/node-mysql)
-
-[![NPM](https://nodei.co/npm/mysql2.png?downloads=true&stars=true)](https://nodei.co/npm/mysql2/)
-[![NPM](https://nodei.co/npm-dl/mysql2.png?months=6)](https://nodei.co/npm/mysql2/)
-
-## Features
-
- In addition to client-side query/escape and connection pooling
-
-  - [fast](https://gist.github.com/sidorares/ffe9ee9c423f763e3b6b)
-  - MySQL server API for proxies and mocks
-  - SSL and compression
-  - prepared statements
-  - binlog protocol client
-
-## Documentation
-
-See [node-mysql](https://github.com/felixge/node-mysql) documentation. If you see api incompatibilities, please report via github issue.
-
-Below is a list of extensions not supported by node-mysql:
-
-### Named placeholders
-
-You can use named placeholders for parameters by setting `namedPlaceholders` config value or query/execute time option. Named placeholders are converted to unnamed `?` on the client (mysql protocol does not support named parameters). If you reference parameter multiple times under the same name it is sent to server multiple times.
-
-```js
-   connection.config.namedPlaceholders = true;
-   connection.execute('select :x + :y as z', { x: 1, y: 2}, function(err, rows) {
-     // statement prepared as "select ? + ? as z" and executed with [1,2] values
-     // rows returned: [ { z: 3 } ]
-   });
-
-   connection.execute('select :x + :x as z', { x: 1 }, function(err, rows) {
-     // select ? + ? as z, execute with [1, 1]
-   });
-
-   connection.query('select :x + :x as z', { x: 1 }, function(err, rows) {
-     // query select 1 + 1 as z
-   });
-```
-
-### Prepared statements
-
-#### Automatic creation, cached and re-used by connection
-
-Similar to `connection.query()`.
-
-```js
-connection.execute('select 1 + ? + ? as result', [5, 6], function(err, rows) {
-  // rows: [ { result: 12 } ]
-  // internally 'select 1 + ? + ? as result' is prepared first. On subsequent calls cached statement is re-used
-});
-
-// close cached statement for 'select 1 + ? + ? as result'. noop if not in cache
-connection.unprepare('select 1 + ? + ? as result');
-```
-
-#### Manual prepare / execute
-
-```js
-connection.prepare('select ? + ? as tests', function(err, statement) {
-   // statement.parameters - array of column definitions, length === number of params, here 2
-   // statement.columns - array of result column definitions. Can be empty if result schema is dynamic / not known
-   // statement.id
-   // statement.query
-
-   statement.execute([1, 2], function(err, rows, columns) {
-    // -> [ { tests: 3 } ]
-   });
-
-   // note that there is no callback here. There is no statement close ack at protocol level.
-   statement.close();
-});
-```
-Note that you should not use statement after connection reset (`changeUser()` or disconnect). Statement scope is connection, you need to prepare statement for each new connection in order to use it.
-
-### Receiving rows as array of columns instead of hash with column name as key:
-
-```js
-var options = {sql: 'select A,B,C,D from foo', rowsAsArray: true};
-connection.query(options, function(err, results) {
-  /* results will be an array of arrays like this now:
-  [[
-     'field A value',
-     'field B value',
-     'field C value',
-     'field D value',
-  ], ...]
-  */
-});
-```
-
-### Sending tabular data with 'load infile' and local stream:
-
-In addition to sending local fs files you can send any stream using `infileStreamFactory` query option. If set, it has to be a function that return a readable stream. It gets file path from query as a parameter.
-
-```js
-// local file
-connection.query('LOAD DATA LOCAL INFILE "/tmp/data.csv" INTO TABLE test FIELDS TERMINATED BY ? (id, title)', onInserted1);
-// local stream
-var sql = 'LOAD DATA LOCAL INFILE "mystream" INTO TABLE test FIELDS TERMINATED BY ? (id, title)';
-connection.query({
-  sql: sql,
-  infileStreamFactory: function(path) { return getStream(); }
-}, onInserted2);
-```
-
-### Connecting using custom stream:
-
-```js
-var net        = require('net');
-var mysql      = require('mysql2');
-var shape      = require('shaper');
-var connection = mysql.createConnection({
-   user: 'test',
-   database: 'test',
-   stream: net.connect('/tmp/mysql.sock').pipe(shape(10)) // emulate 10 bytes/sec link
-});
-connection.query('SELECT 1+1 as test1', console.log);
-```
-`stream` also can be a function. In that case function result has to be duplex stream, and it is used for connection transport. This is required if you connect pool using custom transport as new pooled connection needs new stream. [Example](https://github.com/sidorares/node-mysql2/issues/80) connecting over socks5 proxy:
-
-```js
-var mysql      = require('mysql2');
-var SocksConnection = require('socksjs');
-var pool = mysql.createPool({
-  database: 'test',
-  user: 'foo',
-  password: 'bar'
-  stream: function(cb) {
-    cb(null, new SocksConnection({ host: 'remote.host', port: 3306}, { host: 'localhost', port: 1080 }));
-  }
- });
-```
-
-In addition to password `createConnection()`, `createPool()` and `changeUser()` accept `passwordSha1` option. This is useful when implementing proxies as plaintext password might be not available.
-
-## Known incompatibilities with node-mysql
-
-In contrast to node-mysql, `zeroFill` flag is ignored in type conversion.
-You need to check corresponding field zeroFill flag and convert to string manually if this is of importance to you.
-
-DECIMAL and NEWDECIMAL types always returned as string
-
-## Examples
-
-Simple select:
-
-```js
-var mysql      = require('mysql2');
-var connection = mysql.createConnection({ user: 'test', database: 'test'});
-
-connection.query('SELECT 1+1 as test1', function(err, rows) {
-  //
-});
-```
-
-Prepared statement and parameters:
-
-```js
-var mysql      = require('mysql2');
-var connection = mysql.createConnection({ user: 'test', database: 'test'});
-
-connection.execute('SELECT 1+? as test1', [10], function(err, rows) {
-  //
-});
-```
-
-Connecting over encrypted connection:
-
-```js
-var fs         = require('fs');
-var mysql      = require('mysql2');
-var connection = mysql.createConnection({
-   user: 'test',
-   database: 'test',
-   ssl: {
-     key: fs.readFileSync('./certs/client-key.pem'),
-     cert: fs.readFileSync('./certs/client-cert.pem')
-   }
-});
-connection.query('SELECT 1+1 as test1', console.log);
-```
-
-You can use 'Amazon RDS' string as value to ssl property to connect to Amazon RDS mysql over ssl (in that case http://s3.amazonaws.com/rds-downloads/mysql-ssl-ca-cert.pem CA cert is used)
-
-```js
-var mysql      = require('mysql2');
-var connection = mysql.createConnection({
-   user: 'foo',
-   password: 'bar',
-   host: 'db.id.ap-southeast-2.rds.amazonaws.com',
-   ssl: 'Amazon RDS'
-});
-
-conn.query('show status like \'Ssl_cipher\'', function(err, res) {
-  console.log(err, res);
-  conn.end();
-});
-```
-
-
-Simple mysql proxy server:
-
-```js
-var mysql = require('mysql2');
-
-var server = mysql.createServer();
-server.listen(3307);
-server.on('connection', function(conn) {
-  console.log('connection');
-
-  conn.serverHandshake({
-    protocolVersion: 10,
-    serverVersion: 'node.js rocks',
-    connectionId: 1234,
-    statusFlags: 2,
-    characterSet: 8,
-    capabilityFlags: 0xffffff
-  });
-
-  conn.on('field_list', function(table, fields) {
-    console.log('field list:', table, fields);
-    conn.writeEof();
-  });
-
-  var remote = mysql.createConnection({user: 'root', database: 'dbname', host:'server.example.com', password: 'secret'});
-
-  conn.on('query', function(sql) {
-    console.log('proxying query:' + sql);
-    remote.query(sql, function(err) { // overloaded args, either (err, result :object)
-                                      // or (err, rows :array, columns :array)
-      if (Array.isArray(arguments[1])) {
-        // response to a 'select', 'show' or similar
-        var rows = arguments[1], columns = arguments[2];
-        console.log('rows', rows);
-        console.log('columns', columns);
-        conn.writeTextResult(rows, columns);
-      } else {
-        // response to an 'insert', 'update' or 'delete'
-        var result = arguments[1];
-        console.log('result', result);
-        conn.writeOk(result);
-      }
-    });
-  });
-
-  conn.on('end', remote.end.bind(remote));
-});
-```
-## MySQL Server API
-
-### Server
-
-  *  **createServer()** - creates server instance
-  *  **Server.listen**  - listen port / unix socket (same arguments as [net.Server.listen](http://nodejs.org/api/net.html#net_server_listen_port_host_backlog_callback))
-
-events:
-
-  *  **connect** - new incoming connection.
-
-### Connection
-
-  *  **serverHandshake({serverVersion, protocolVersion, connectionId, statusFlags, characterSet, capabilityFlags})** - send server handshake initialisation packet, wait handshake response and start listening for commands
-  *  **writeOk({affectedRows: num, insertId: num})** - send [OK packet](http://dev.mysql.com/doc/internals/en/overview.html#packet-OK_Packet) to client
-  *  **writeEof(warnings, statusFlags)** - send EOF packet
-  *  **writeTextResult(rows, fields)** - write query result to client. Rows and fields are in the same format as in `connection.query` callback.
-  *  **writeColumns(fields)** - write fields + EOF packets.
-  *  **writeTextRow(row)**  - write array (not hash!) ov values as result row
-  *  TODO: binary protocol
-
-events:
-
-   *  **query(sql)** - query from client
-
-
-## License
-
- MIT
-
-## Acknowledgements
-
-  - Internal protocol is written from scratch using my experience with [mysql-native](https://github.com/sidorares/nodejs-mysql-native)
-  - constants, sql parameters interpolation, pool, connection config class taken from [node-mysql](https://github.com/felixge/node-mysql) (I tried to preserve git history)
-  - SSL upgrade code based on @TooTallNate [code](https://gist.github.com/TooTallNate/848444)
-  - Secure connection / compressed connection api flags compatible to [mariasql](https://github.com/mscdex/node-mariasql/) client.
-  - [contributors](https://github.com/sidorares/node-mysql2/graphs/contributors)
-
-## Benchmarks
-  - https://gist.github.com/sidorares/ffe9ee9c423f763e3b6b
-  - `npm run benchmarks`
-  - [node-mysql-benchmarks](https://github.com/mscdex/node-mysql-benchmarks)
-  - try to run example [benchmarks](https://github.com/sidorares/node-mysql2/tree/master/benchmarks) on your system
-
-## Examples using MySQL server API:
-
-  - [Mysql-pg-proxy](https://github.com/sidorares/mysql-pg-proxy)  - mysql to postgres proxy server.
-  - [Mysqlite.js](https://github.com/sidorares/mysqlite.js) - mysql server with JS-only (emscripten compiled) sqlite backend.
-  - [sql-engine](https://github.com/eugeneware/sql-engine) - mysql server with leveldb backend.
-
-## See also:
-
-  - [wire protocol documentation](http://dev.mysql.com/doc/internals/en/client-server-protocol.html)
-  - [node-mysql](https://github.com/felixge/node-mysql) - most popular node.js mysql client library
-  - [node-mariasql](https://github.com/mscdex/node-mariasql/) - bindings to libmariasql. One of the fastest clients
-  - [node-libmysqlclident](https://github.com/Sannis/node-mysql-libmysqlclient) - bindings to libmysqlclient
-  - [go-mysql](https://github.com/siddontang/go-mysql) - Mysql Go client (prepared statements, binlog protocol, server)
-
-## Contributing
-
-Feel free to create pull requests.
-TODO in order of importance:
-
-  - node-mysql api incompatibility fixes
-  - documentation
-  - tests
-  - benchmarks
-  - bug fixes
-  - TODOs in source code
-  - performance improvements
-  - features
-
-[npm-image]: https://img.shields.io/npm/v/mysql2.svg
-[npm-url]: https://npmjs.org/package/mysql2
-[node-version-image]: http://img.shields.io/node/v/mysql2.svg
-[node-version-url]: http://nodejs.org/download/
-[travis-image]: https://img.shields.io/travis/sidorares/node-mysql2/master.svg?label=linux
-[travis-url]: https://travis-ci.org/sidorares/node-mysql2
-[appveyor-image]: https://img.shields.io/appveyor/ci/sidorares/node-mysql2/master.svg?label=windows
-[appveyor-url]: https://ci.appveyor.com/project/sidorares/node-mysql2
-[downloads-image]: https://img.shields.io/npm/dm/mysql2.svg
-[downloads-url]: https://npmjs.org/package/mysql2
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/appveyor.yml b/node_modules/mysql2-promise/node_modules/mysql2/appveyor.yml
deleted file mode 100644
index 21793f0308a9cb93ee624b3c4988da12e3fd7e9f..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/appveyor.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-environment:
-  MYSQL_DATABASE: node_mysql
-  MYSQL_HOST: localhost
-  MYSQL_USER: root
-  MYSQL_PASSWORD: Password12!
-  MYSQL_PATH: C:\Program Files\MySQL\MySQL Server 5.6
-
-  matrix:
-    - nodejs_version: "0.8"
-    - nodejs_version: "0.10"
-    - nodejs_version: "0.12"
-    # io.js
-    - nodejs_version: "1.0"
-    - nodejs_version: "2.3"
-
-services:
-  - mysql
-
-install:
-  - ps: Install-Product node $env:nodejs_version
-  - npm install
-
-build: off
-
-before_test:
-  - SET PATH=%MYSQL_PATH%\bin;%PATH%
-  - mysqladmin --host=%MYSQL_HOST% --user=%MYSQL_USER% --password=%MYSQL_PASSWORD% create %MYSQL_DATABASE%
-
-test_script:
-  - mysql --version
-  - node --version
-  - npm --version
-  - node test/run.js
-
-version: "{build}"
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/FB/create.sql b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/FB/create.sql
deleted file mode 100644
index 258bfe6bb08d7470cacaf9ed34cdda309c42502b..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/FB/create.sql
+++ /dev/null
@@ -1,58 +0,0 @@
-# create benchmark user
-GRANT ALL ON *.* TO 'benchmarkdbuser'@'%' IDENTIFIED BY 'benchmarkdbpass';
-
-# modified from SO answer http://stackoverflow.com/questions/5125096/for-loop-in-mysql
-DROP DATABASE IF EXISTS hello_world;
-CREATE DATABASE hello_world;
-USE hello_world;
-
-DROP TABLE IF EXISTS World;
-CREATE TABLE  World (
-  id int(10) unsigned NOT NULL auto_increment,
-  randomNumber int NOT NULL default 0,
-  PRIMARY KEY  (id)
-)
-ENGINE=INNODB;
-
-DROP PROCEDURE IF EXISTS load_data;
-
-DELIMITER #
-CREATE PROCEDURE load_data()
-BEGIN
-
-declare v_max int unsigned default 10000;
-declare v_counter int unsigned default 0;
-
-  TRUNCATE TABLE World;
-  START TRANSACTION;
-  while v_counter < v_max do
-    INSERT INTO World (randomNumber) VALUES ( floor(0 + (rand() * 10000)) );
-    SET v_counter=v_counter+1;
-  end while;
-  commit;
-END #
-
-DELIMITER ;
-
-CALL load_data();
-
-DROP TABLE IF EXISTS Fortune;
-CREATE TABLE  Fortune (
-  id int(10) unsigned NOT NULL auto_increment,
-  message varchar(2048) CHARACTER SET 'utf8' NOT NULL,
-  PRIMARY KEY  (id)
-)
-ENGINE=INNODB;
-
-INSERT INTO Fortune (message) VALUES ('fortune: No such file or directory');
-INSERT INTO Fortune (message) VALUES ('A computer scientist is someone who fixes things that aren''t broken.');
-INSERT INTO Fortune (message) VALUES ('After enough decimal places, nobody gives a damn.');
-INSERT INTO Fortune (message) VALUES ('A bad random number generator: 1, 1, 1, 1, 1, 4.33e+67, 1, 1, 1');
-INSERT INTO Fortune (message) VALUES ('A computer program does what you tell it to do, not what you want it to do.');
-INSERT INTO Fortune (message) VALUES ('Emacs is a nice operating system, but I prefer UNIX. — Tom Christaensen');
-INSERT INTO Fortune (message) VALUES ('Any program that runs right is obsolete.');
-INSERT INTO Fortune (message) VALUES ('A list is only as strong as its weakest link. — Donald Knuth');
-INSERT INTO Fortune (message) VALUES ('Feature: A bug with seniority.');
-INSERT INTO Fortune (message) VALUES ('Computers make very fast, very accurate mistakes.');
-INSERT INTO Fortune (message) VALUES ('<script>alert("This should not be displayed in a browser alert box.");</script>');
-INSERT INTO Fortune (message) VALUES ('フレームワークのベンチマーク');
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/FB/fortunes.jade b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/FB/fortunes.jade
deleted file mode 100644
index 31e18646db850bcfdf41c07db4ac64b702b20836..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/FB/fortunes.jade
+++ /dev/null
@@ -1,10 +0,0 @@
-!!! 5
-html
-  head
-    title Fortunes
-  body
-    table
-      for fortune in fortunes
-        tr
-          td= fortune.id
-          td= fortune.message
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/FB/hello.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/FB/hello.js
deleted file mode 100644
index 318e27161466eb7ccfb06e980b1fd9f2b3fbba9f..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/FB/hello.js
+++ /dev/null
@@ -1,292 +0,0 @@
-var cluster = require('cluster');
-var numCPUs = require('os').cpus().length;
-
-if(cluster.isMaster) {
-  // Fork workers.
-  for (var i = 0; i < numCPUs; i++) {
-    cluster.fork();
-  }
-
-  cluster.on('exit', function(worker, code, signal) {
-    console.log('worker ' + worker.pid + ' died');
-  });
-
-  return;
-}
-
-var http     = require('http');
-var url      = require('url');
-var libmysql = require('mysql-libmysqlclient').createConnectionSync();
-var mysql2   = require('../..');
-var mysql    = require('mysql');
-var mariasql = require('mariasql');
-var async    = require('async');
-var Mapper   = require('mapper');
-var jade     = require('jade');
-var fs       = require('fs');
-var connMap  = { user: 'root', password: '', database: 'hello_world', host: 'localhost' };
-
-Mapper.connect(connMap, {verbose: false, strict: false});
-var World = Mapper.map("World", "id", "randomNumber");
-
-var template = jade.compile(fs.readFileSync('./fortunes.jade'));
-
-libmysql.connectSync('localhost', 'root', '', 'hello_world');
-pool2 = mysql2.createPool(connMap);
-pool1 = mysql.createPool(connMap);
-mysql2conn = mysql2.createConnection(connMap);
-mysql1conn = mysql.createConnection(connMap);
-mariaconn = new mariasql();
-mariaconn.connect({
-  host: connMap.host,
-  user: connMap.user,
-  password: connMap.password,
-  db: connMap.database
-});
-
-function getRandomNumber() {
-  return Math.floor(Math.random() * 10000) + 1;
-}
-
-function sequelizeQuery(callback) {
-  World.findById(getRandomNumber(), function (err, world) {
-    callback(null, world);
-  });
-}
-
-function handlePrepared(req, res) {
-  var values = url.parse(req.url, true);
-  var queries = values.query.queries || 1;
-  var results = [];
-  for (var i=0; i < queries; ++i) {
-    mysql2conn.execute("SELECT * FROM world WHERE id = ?", [getRandomNumber()], function (err, rows) {
-      results.push(rows[0]);
-      if (results.length == queries)
-        res.end(JSON.stringify(results));
-    });
-  }
-}
-
-function handleMysqlIsh(conn, req, res) {
-    var values = url.parse(req.url, true);
-    var queries = values.query.queries || 1;
-    //pool.getConnection(function(err, conn) {
-      //console.log(conn, conn.query, '===============');
-      var results = [];
-      for (var i=0; i < queries; ++i) {
-        mysql2conn.query("SELECT * FROM world WHERE id = ?", [getRandomNumber()], function (err, rows) {
-          results.push(rows[0]);
-          if (results.length == queries)
-            res.end(JSON.stringify(results));
-        });
-      }
-    //});
-}
-
-function handleMysqlIshPool(pool, req, res) {
-    var values = url.parse(req.url, true);
-    var queries = values.query.queries || 1;
-    var results = [];
-    for (var i=0; i < queries; ++i) {
-      pool.getConnection(function(err, conn) {
-        mysql2conn.query("SELECT * FROM world WHERE id = " + getRandomNumber(), function (err, rows) {
-          results.push(rows[0]);
-          if (results.length == queries)
-            res.end(JSON.stringify(results));
-        });
-      });
-    }
-}
-
-function handleMaria(req, res)
-{
-  var values = url.parse(req.url, true);
-  var queries = values.query.queries || 1;
-  var results = [];
-  for (var i=0; i < queries; ++i) {
-    mariaconn.query("SELECT * FROM world WHERE id = :id", { id: getRandomNumber() } )
-      .on('result', function (dbres) {
-        dbres.on('row', function(row) {
-          results.push(row);
-          if (results.length == queries)
-            res.end(JSON.stringify(results));
-        });
-      });
-  }
-}
-
-function fortuneMysql(conn, res) {
-  var fortunes = [];
-  res.writeHead(200, {'Content-Type': 'text/html'});
-  conn.query('select * from Fortune', function(err, fortunes) {
-    fortunes.push({id: 0, message: "Additional fortune added at request time."});
-    fortunes.sort(sortFortunes);
-    res.end(template({fortunes: fortunes}));
-  });
-}
-
-function fortuneMaria(res) {
-  fortunes = [];
-  res.writeHead(200, {'Content-Type': 'text/html'});
-  mariaconn.query("SELECT * from Fortune")
-       .on('result', function (dbres) {
-         dbres.on('row', function(row) { fortunes.push(row); });
-         dbres.on('end', function() {
-           fortunes.push({id: 0, message: "Additional fortune added at request time."});
-           fortunes.sort(sortFortunes);
-           res.end(template({fortunes: fortunes}));
-         });
-  });
-}
-
-function sortFortunes(a, b) {
-  return (a.message < b.message) ? -1 : (a.message > b.message) ? 1 : 0;
-}
-
-http.createServer(function (req, res) {
-  // JSON response object
-  var hello = {message: "Hello, world"};
-
-  var path = url.parse(req.url).pathname;
-
-  switch (path) {
-  case '/json':
-    // JSON Response Test
-    res.writeHead(200, {'Content-Type': 'application/json; charset=UTF-8'});
-    // Write JSON object to response
-    res.end(JSON.stringify(hello));
-    break;
-
-  case '/mysql-orm':
-    var values = url.parse(req.url, true);
-    var queries = values.query.queries || 1;
-    var queryFunctions = new Array(queries);
-
-    for (var i = 0; i < queries; i += 1) {
-      queryFunctions[i] = sequelizeQuery;
-    }
-
-    res.writeHead(200, {'Content-Type': 'application/json'});
-
-    async.parallel(queryFunctions, function(err, results) {
-      res.end(JSON.stringify(results));
-    });
-    break;
-
-  case '/mysql':
-    res.writeHead(200, {'Content-Type': 'application/json'});
-
-    function libmysqlQuery(callback) {
-      libmysql.query("SELECT * FROM world WHERE id = " + getRandomNumber(), function (err, res) {
-        if (err) {
-	        throw err;
-	      }
-
-	      res.fetchAll(function(err, rows) {
-      	  if (err) {
-      	    throw err;
-      	  }
-
-      	  res.freeSync();
-      	  callback(null, rows[0]);
-        });
-      });
-    }
-
-    var values = url.parse(req.url, true);
-    var queries = values.query.queries || 1;
-    var queryFunctions = new Array(queries);
-
-    for (var i = 0; i < queries; i += 1) {
-      queryFunctions[i] = libmysqlQuery;
-    }
-    async.parallel(queryFunctions, function(err, results) {
-      if (err) {
-        res.writeHead(500);
-        return res.end('MYSQL CONNECTION ERROR.');
-      }
-      res.end(JSON.stringify(results));
-    });
-    break;
-
-  case '/mysql2':
-    handleMysqlIsh(mysql2conn, req, res);
-    break;
-
-  case '/fortunes-mysql2':
-    fortuneMysql(mysql2conn, res);
-    break;
-
-  case '/fortunes-mysql1':
-    fortuneMysql(mysql1conn, res);
-    break;
-
-  case '/fortunes-maria':
-    fortuneMaria(res);
-    break;
-
-  case '/mysql2pool':
-    handleMysqlIshPool(pool2, req, res);
-    break;
-
-  case '/mysql2ps':
-    handlePrepared(req, res);
-    break;
-
-  case '/mysql1':
-    handleMysqlIsh(mysql1conn, req, res);
-    break;
-
-  case '/maria':
-    handleMaria(req, res);
-    break;
-
-  case '/update':
-    res.writeHead(200, {'Content-Type': 'application/json'});
-
-    function libmysqlQuery(callback) {
-      libmysql.query("SELECT * FROM world WHERE id = " + getRandomNumber(), function (err, res) {
-        if (err) {
-          throw err;
-        }
-
-        res.fetchAll(function(err, rows) {
-          if (err) {
-            throw err;
-          }
-
-          res.freeSync();
-
-          rows[0].randomNumber = getRandomNumber();
-          libmysql.query("UPDATE World SET randomNumber = " + rows[0].randomNumber + " WHERE id = " + rows[0]['id'], function (err, res) {
-            if (err) {
-              throw err;
-            }
-          });
-          callback(null, rows[0]);
-        });
-      });
-    }
-
-    var values = url.parse(req.url, true);
-    var queries = values.query.queries || 1;
-    var queryFunctions = new Array(queries);
-
-    for (var i = 0; i < queries; i += 1) {
-      queryFunctions[i] = libmysqlQuery;
-    }
-    async.parallel(queryFunctions, function(err, results) {
-      if (err) {
-        res.writeHead(500);
-        return res.end('MYSQL CONNECTION ERROR.');
-      }
-      res.end(JSON.stringify(results));
-    });
-    break;
-
-  default:
-    // File not found handler
-    res.writeHead(404, {'Content-Type': 'text/html; charset=UTF-8'});
-    res.end("NOT IMPLEMENTED");
-  }
-}).listen(8080);
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/FB/package.json b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/FB/package.json
deleted file mode 100644
index e501365ea84f19939d2b9f3354e4b7461fa035f3..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/FB/package.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "name": "application-name",
-  "version": "0.0.1",
-  "private": true,
-  "dependencies": {
-    "async": "0.2.5",
-    "mysql-libmysqlclient": "1.5.2",
-    "mysql2": "0.7.0",
-    "mariasql": "0.1.18",
-    "mapper": "0.2.4-pre",
-    "jade": "~0.30.0"
-  },
-  "main": "hello.js"
-}
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/bench-fake-server-maria.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/bench-fake-server-maria.js
deleted file mode 100644
index d167cbe0c89f08a4d2b6a72ef8e6b1c99bea06f7..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/bench-fake-server-maria.js
+++ /dev/null
@@ -1,63 +0,0 @@
-var common     = require('../test/common');
-
-    var Client = require('mariasql');
-    var connection = new Client();
-    connection.connect({
-      host: '127.0.0.1',
-      port: 3333,
-      user: 'root',
-      password: '',
-      db: 'test'
-    });
-
-
-var assert     = require('assert');
-
-function benchmarkSelect(numLeft, callback) {
-    numRows = 0;
-    var q = connection.query('select 1+1 as qqq');
-    q.on('result', function(res) {
-        //console.log("result!");
-        //console.log(res);
-
-        res.on('row', function(r) {
-           //console.log(r);
-           numRows++;
-        });
-
-        res.on('end', function() {
-          if (numLeft > 1)
-            benchmarkSelect(numLeft-1, callback);
-          else
-            callback(numRows);
-        });
-      });
-}
-
-function benchmarkSelects(n, cb) {
-  var numSelects = 100;
-  var start = process.hrtime();
-  benchmarkSelect(numSelects, function(rowsPerQuery) {
-    var end = process.hrtime();
-    var diff = common.hrdiff(start, end);
-    console.log(' rows: ' +  numSelects*1e9/diff + ' results/sec, ' +  rowsPerQuery*numSelects*1e9/diff + ' rows/sec');
-    if (n > 1)
-      benchmarkSelects(n - 1, cb);
-    else
-      cb();
-  });
-}
-
-module.exports = function(done) {
-  console.log('connected');
-  var testStart = process.hrtime();
-  benchmarkSelects(5, function() {
-    var testEnd = process.hrtime();
-    console.log('total time: ', common.hrdiff(testStart, testEnd)/1e9 );
-    connection.end();
-    if (done)
-      done();
-  });
-};
-
-connection.on('connect', module.exports);
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/bench-fake-server.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/bench-fake-server.js
deleted file mode 100644
index a4b5cb52a5be94c96ff1031bd511740fb6f137f4..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/bench-fake-server.js
+++ /dev/null
@@ -1,60 +0,0 @@
-var common     = require('../test/common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-// ==== simple pool ===
-var connections = new Array(10);
-for (var i=0; i < connections.length; ++i)
-  connections[i] = common.createConnection();
-var currConn = 0;
-function next() {
-  currConn++;
-  if (currConn == connections.length)
-    currConn = 0;
-  connection = connections[currConn];
-}
-// ======================
-
-function benchmarkSelect(numLeft, callback) {
-  //connection.query('query from fake server fixture', function(err, result) {
-
-  // comment if no pool:
-  next();
-
-  var rows = 0;
-  var q = connection.query('query from fake server fixture');
-  q.on('result', function() { rows++; });
-  q.on('end', function() {
-    if (numLeft > 1)
-      benchmarkSelect(numLeft-1, callback);
-    else
-      callback(rows);
-  });
-}
-
-function benchmarkSelects(n, cb) {
-  var numSelects = 100000;
-  var start = process.hrtime();
-  benchmarkSelect(numSelects, function(rowsPerQuery) {
-    var end = process.hrtime();
-    var diff = common.hrdiff(start, end);
-    console.log(' rows: ' +  numSelects*1e9/diff + ' results/sec, ' +  rowsPerQuery*numSelects*1e9/diff + ' rows/sec');
-    if (n > 1)
-      benchmarkSelects(n - 1, cb);
-    else
-      cb();
-  });
-}
-
-module.exports = function(done) {
-  var testStart = process.hrtime();
-  benchmarkSelects(5, function() {
-    var testEnd = process.hrtime();
-    console.log('total time: ', common.hrdiff(testStart, testEnd)/1e9 );
-    connection.end();
-    if (done)
-      done();
-  });
-};
-
-  module.exports();
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/bench-insert-select-parallel.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/bench-insert-select-parallel.js
deleted file mode 100644
index e9a9d520df02e47ddf1f64adcf823e5854e36928..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/bench-insert-select-parallel.js
+++ /dev/null
@@ -1,80 +0,0 @@
-var common     = require('../test/common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var table = 'insert_test';
-//var text = "本日は晴天なり";
-var text = "test abc xyz";
-connection.query('drop table ' + table).on('error', function() {});
-connection.query([
-  'CREATE TABLE `' + table + '` (',
-  '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
-  '`title` varchar(255) NOT NULL,',
-  'PRIMARY KEY (`id`)',
-  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-].join('\n'));
-
-function benchmarkInsert(numLeft, callback) {
-  connection.query('INSERT INTO ' + table + ' SET title="' + text + '"', function(err, result) {
-    if (err) throw err;
-    if (numLeft > 1)
-      benchmarkInsert(numLeft-1, callback);
-    else
-      callback();
-  });
-}
-
-function benchmarkInserts(n, cb) {
-  var numInsert = 50000;
-  var start = process.hrtime();
-  benchmarkInsert(numInsert, function() {
-    var end = process.hrtime();
-    var diff = common.hrdiff(start, end);
-    console.log(numInsert*1e9/diff + ' inserts/sec');
-    if (n > 1)
-      benchmarkInserts(n - 1, cb);
-    else
-      cb();
-  });
-}
-
-function benchmarkParallelSelects(n, size, cb) {
-  var start = process.hrtime();
-  var numRunning = 0;
-
-  function commandDone() {
-    console.log(numRunning);
-    numRunning--;
-    if (numRunning > 0)
-      return;
-    var end = process.hrtime();
-    var diff = common.hrdiff(start, end);
-    console.log(size + ' rows: ' +  n*1e9/diff + ' results/sec, ' +  size*n*1e9/diff + ' rows/sec');
-    cb();
-  }
-
-  var connections = new Array(n);
-  for (var i=0; i < n; ++i)
-  {
-    numRunning++;
-    connections[i] = common.createConnection();
-    var cmd = connections[i].execute('select * from ' + table + ' limit ' + size, []);
-    cmd.on('end', commandDone);
-  }
-}
-
-module.exports = function(done) {
-  var testStart = process.hrtime();
-  benchmarkInserts(1, function() {
-    benchmarkParallelSelects(8, 50000, function() {
-      var testEnd = process.hrtime();
-      console.log('total time: ', common.hrdiff(testStart, testEnd)/1e9 );
-      if (done)
-        done();
-    });
-  });
-};
-
-if (require.main === module) {
-  module.exports();
-}
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/bench-insert-select-prepared.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/bench-insert-select-prepared.js
deleted file mode 100644
index 5715ec5f76d4a4bde47410dd28e9a13db845694b..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/bench-insert-select-prepared.js
+++ /dev/null
@@ -1,83 +0,0 @@
-var common     = require('../test/common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var table = 'insert_test';
-//var text = "本日は晴天なり";
-var text = "test abc xyz";
-connection.query([
-  'CREATE TEMPORARY TABLE `' + table + '` (',
-  '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
-  '`title` varchar(255),',
-  'PRIMARY KEY (`id`)',
-  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-].join('\n'));
-
-function benchmarkInsert(numLeft, callback) {
-  connection.execute('INSERT INTO ' + table + ' SET title="' + text + '"', [], function(err, result) {
-    if (err) throw err;
-    if (numLeft > 1)
-      benchmarkInsert(numLeft-1, callback);
-    else
-      callback();
-  });
-}
-
-function benchmarkInserts(n, cb) {
-  var numInsert = 10000;
-  var start = process.hrtime();
-  benchmarkInsert(numInsert, function() {
-    var end = process.hrtime();
-    var diff = common.hrdiff(start, end);
-    console.log(numInsert*1e9/diff + ' inserts/sec');
-    if (n > 1)
-      benchmarkInserts(n - 1, cb);
-    else
-      cb();
-  });
-}
-
-function benchmarkSelect(numLeft, numSelect, callback) {
-  connection.execute('select * from ' + table + ' limit ' + numSelect, [], function(err, result) {
-    if (err) throw err;
-    if (numLeft > 1)
-      benchmarkSelect(numLeft-1, numSelect, callback);
-    else
-      callback();
-  });
-}
-
-function benchmarkSelects(n, size, cb) {
-  var numSelects = 100;
-  var start = process.hrtime();
-  benchmarkSelect(numSelects, size, function() {
-    var end = process.hrtime();
-    var diff = common.hrdiff(start, end);
-    console.log(size + ' rows: ' +  numSelects*1e9/diff + ' results/sec, ' +  size*numSelects*1e9/diff + ' rows/sec');
-    if (n > 1)
-      benchmarkSelects(n - 1, size, cb);
-    else
-      cb();
-  });
-}
-
-module.exports = function(done) {
-  var testStart = process.hrtime();
-  benchmarkInserts(1, function() {
-    benchmarkSelects(5, 100, function() {
-      benchmarkSelects(10, 1000, function() {
-        benchmarkSelects(2, 50000, function() {
-          var testEnd = process.hrtime();
-          console.log('total time: ', common.hrdiff(testStart, testEnd)/1e9 );
-          connection.end();
-          if (done)
-            done();
-        });
-      });
-    });
-  });
-};
-
-if (require.main === module) {
-  module.exports();
-}
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/bench-insert-select.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/bench-insert-select.js
deleted file mode 100644
index e1910e1e8e27b71b0bb3ba2aa08663d793c9f9f4..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/bench-insert-select.js
+++ /dev/null
@@ -1,82 +0,0 @@
-var common     = require('../test/common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var table = 'insert_test';
-var text = "本日は晴天なり";
-connection.query([
-  'CREATE TEMPORARY TABLE `' + table + '` (',
-  '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
-  '`title` varchar(255),',
-  'PRIMARY KEY (`id`)',
-  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-].join('\n'));
-
-function benchmarkInsert(numLeft, callback) {
-  connection.query('INSERT INTO ' + table + ' SET title="' + text + '"', function(err, result) {
-    if (err) throw err;
-    if (numLeft > 1)
-      benchmarkInsert(numLeft-1, callback);
-    else
-      callback();
-  });
-}
-
-function benchmarkInserts(n, cb) {
-  var numInsert = 10000;
-  var start = process.hrtime();
-  benchmarkInsert(numInsert, function() {
-    var end = process.hrtime();
-    var diff = common.hrdiff(start, end);
-    console.log(numInsert*1e9/diff + ' inserts/sec');
-    if (n > 1)
-      benchmarkInserts(n - 1, cb);
-    else
-      cb();
-  });
-}
-
-function benchmarkSelect(numLeft, numSelect, callback) {
-  connection.query('select * from ' + table + ' limit ' + numSelect, function(err, result) {
-    if (err) throw err;
-    if (numLeft > 1)
-      benchmarkSelect(numLeft-1, numSelect, callback);
-    else
-      callback();
-  });
-}
-
-function benchmarkSelects(n, size, cb) {
-  var numSelects = 100;
-  var start = process.hrtime();
-  benchmarkSelect(numSelects, size, function() {
-    var end = process.hrtime();
-    var diff = common.hrdiff(start, end);
-    console.log(size + ' rows: ' +  numSelects*1e9/diff + ' results/sec, ' +  size*numSelects*1e9/diff + ' rows/sec');
-    if (n > 1)
-      benchmarkSelects(n - 1, size, cb);
-    else
-      cb();
-  });
-}
-
-module.exports = function(done) {
-  var testStart = process.hrtime();
-  benchmarkInserts(5, function() {
-    benchmarkSelects(5, 10000, function() {
-      benchmarkSelects(10, 1000, function() {
-        benchmarkSelects(2, 50000, function() {
-          var testEnd = process.hrtime();
-          console.log('total time: ', common.hrdiff(testStart, testEnd)/1e9 );
-          connection.end();
-          if (done)
-            done();
-        });
-      });
-    });
-  });
-};
-
-if (require.main === module) {
-  module.exports();
-}
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/benchmark-query.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/benchmark-query.js
deleted file mode 100644
index 7ce15f89adb848f096908aea51da15afbe01fcf4..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/benchmark-query.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var assert = require('assert');
-var createConnection = require('../test/common').createConnection;
-
-var sql = process.argv[2];
-
-(function(cb) {
-    var db = createConnection();
-
-       var left = 10000;
-       var start = Date.now();
-       var prev1000 = start;
-       function bench()
-       {
-           db.query(sql).on('end', function(err, res) {
-               left--;
-               if (left % 1000 === 0)
-               {
-                   var curTime = Date.now();
-                   var last1000time = curTime - prev1000;
-                   prev1000 = curTime;
-                   console.error( (1000000/last1000time) + ' req/sec' );
-               }
-
-               if (left > 0)
-                   bench();
-               else {
-                   console.error( 10000000/(Date.now() - start) + ' req/sec (average 10000 reqs)');
-                   db.end();
-                   if (cb) cb();
-               }
-           });
-       }
-       bench();
-})();
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/benchmark-server.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/benchmark-server.js
deleted file mode 100644
index d05b3b19f24bdeedda23e89b8124cd1294ff8689..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/benchmark-server.js
+++ /dev/null
@@ -1,72 +0,0 @@
-var mysql = require('../index.js');
-var flags  = require('../lib/constants/client');
-var Packets      = require('../lib/packets/index.js');
-var Packet       = require('../lib/packets/packet');
-
-function prepareReply(columns, row, n) {
-  var length = 0;
-  var rsHeader = Packets.ResultSetHeader.toPacket(columns.length);
-  length += rsHeader.length();
-  var columnPackets = [];
-  columns.forEach(function(column) {
-    var packet = Packets.ColumnDefinition.toPacket(column);
-    length += packet.length();
-    columnPackets.push(packet);
-  });
-  var eof = Packets.EOF.toPacket();
-  length += 2*eof.length();
-  var rowPacket = Packets.TextRow.toPacket(row);
-  length += n*rowPacket.length();
-
-  var replyBuffer = new Buffer(length);
-  var offset = 0;
-  var id = 1;
-  function add(packet) {
-    packet.writeHeader(id);
-    id = id + 1;
-    packet.buffer.copy(replyBuffer, offset);
-    offset += packet.length();
-  }
-
-  var i;
-  add(rsHeader);
-  for (i=0; i < columns.length; ++i)
-    add(columnPackets[i]);
-  add(eof);
-  for (i=0; i < n; ++i)
-    add(rowPacket);
-  add(eof);
-
-  return replyBuffer;
-}
-
-var buff = prepareReply([{
-      catalog: 'def',
-      schema: 'test',
-      table: 'test_table',
-      orgTable: 'test_table',
-      name: 'beta',
-      orgName: 'beta',
-      characterSet: 33,
-      columnLength: 384,
-      columnType: 3, //253,
-      flags: 0,
-      decimals: 0
-    }], ['12345'], 1);
-
-var server = mysql.createServer();
-server.listen('/tmp/mybench3.sock');
-server.on('connection', function(conn) {
-  conn.serverHandshake({
-    protocolVersion: 10,
-    serverVersion: 'node.js rocks',
-    connectionId: 1234,
-    statusFlags: 2,
-    characterSet: 8,
-    capabilityFlags: 0xffffff
-  });
-  conn.on('query', function(query) {
-    //console.log(query);
-    conn.write(buff);
-  });
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/http-select-and-render.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/http-select-and-render.js
deleted file mode 100644
index bfb92525b00dd1d2ca6f2f77e3cc5f42a33f14d3..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/http-select-and-render.js
+++ /dev/null
@@ -1,39 +0,0 @@
-var http   = require('http');
-var fs     = require('fs');
-var common = require('../test/common');
-var url = require('url');
-
-var conn = common.createConnection();
-var render = common.createTemplate();
-var port = process.env.PORT;
-
-http.createServer(function(req, res) {
-  var q = url.parse(req.url, true);
-  if (q.pathname == '/render') {
-
-    var sql = q.query.q;
-    var n = q.query.n;
-    var rowsTotal = [];
-    var doQueries = function(number) {
-      if (number === 0) {
-        var body = render({ records: rowsTotal});
-        res.writeHead(200, {
-          'Content-Length': body.length,
-          'Content-Type': 'text/html' }
-        );
-        res.end(body);
-      } else {
-        conn.query(sql, function(err, rows) {
-          // TODO: handle error
-          rowsTotal = rowsTotal.concat(rows);
-          doQueries(number-1);
-        });
-      }
-    };
-    doQueries(n);
-
-  } else {
-    res.writeHead(404);
-    res.end();
-  }
-}).listen(port || 1234);
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/httperf.sh b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/httperf.sh
deleted file mode 100644
index 85630ef7d6052199a0bfe5050abc797fe80f169c..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/httperf.sh
+++ /dev/null
@@ -1 +0,0 @@
-httperf --port=1234 --uri='/render?q=select%20*%20from%20foos%20limit%205,10000&n=2' --num-conns=10 --num-calls=2 rate=100
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ping-pong-client.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ping-pong-client.js
deleted file mode 100644
index 64a6717b9699604adac7286a028f06148805522b..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ping-pong-client.js
+++ /dev/null
@@ -1,18 +0,0 @@
-var net = require('net');
-var count = 0;
-var byte = new Buffer([0x33]);
-function pong()
-{
-  count++;
-  this.write(byte);
-}
-
-var c = net.connect(3334);
-c.setNoDelay(true);
-c.ondata = pong;
-pong.apply(c);
-
-setInterval(function() {
-  console.log(count);
-  count = 0;
-}, 1000);
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ping-pong-server.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ping-pong-server.js
deleted file mode 100644
index 7eb90713c6941a19ac088ee617270f2d9ee88499..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ping-pong-server.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var net = require('net');
-
-var byte = new Buffer([0x33]);
-function pong()
-{
-  this.write(byte);
-}
-
-net.createServer(function(s) {
-  s.setNoDelay(true);
-  s.ondata = pong;
-}).listen(3334);
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ping-pong-uv.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ping-pong-uv.js
deleted file mode 100644
index 973284c1cb4ec21ef23c249786a512b18f1e8292..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ping-pong-uv.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var count = 0;
-var byte = new Buffer([0x33]);
-
-function ping(buffer, offset, length) {
-  count++;
-  pong(this);
-}
-
-function noop() {}
-function pong(sock)
-{
-  var writeReq = sock.writeBuffer(byte);
-  writeReq.oncomplete = noop;
-}
-
-var port = 3334;
-var TCP = process.binding('tcp_wrap').TCP;
-var client = new TCP();
-var req = client.connect('127.0.0.1', port);
-req.oncomplete = function() {
-  console.log('connected');
-  pong(client);
-};
-client.onread = ping;
-client.readStart();
-
-setInterval(function() {
-  console.log(count);
-  count = 0;
-}, 1000);
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ruby-mysql2/bench.rb b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ruby-mysql2/bench.rb
deleted file mode 100644
index beb06821a1a5405664abfcb9d9d50c77fdceac1f..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ruby-mysql2/bench.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-require 'rubygems'
-require 'benchmark'
-require 'mysql2'
-require 'haml'
-
-number_of = 1
-database = 'test'
-sql = "SELECT * FROM mysql2_test LIMIT 1"
-
-Benchmark.bmbm do |x|
-  mysql2 = Mysql2::Client.new(:host => "localhost", :username => "root")
-  mysql2.query "USE #{database}"
-  x.report "Mysql2 (cast: true)" do
-    number_of.times do
-      mysql2_result = mysql2.query sql, :symbolize_keys => true, :cast => true
-      puts haml :index, :locals => { :rows => mysqql2_result }
-    end
-  end
-
-  x.report "Mysql2 (cast: false)" do
-    number_of.times do
-      mysql2_result = mysql2.query sql, :symbolize_keys => true, :cast => false
-      mysql2_result.each do |res|
-        # puts res.inspect
-      end
-    end
-  end
-
-end
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ruby-mysql2/benchmark-query.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ruby-mysql2/benchmark-query.js
deleted file mode 100644
index 4e16cd549d1507dd98f2f605deca7ce47b72bbb4..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ruby-mysql2/benchmark-query.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var assert = require('assert');
-var createConnection = require('../../test/common').createConnection;
-
-var sql = process.argv[2];
-var starthr = process.hrtime();
-var haml = require('hamljs');
-var fs = require('fs');
-
-var render = haml.compile(fs.readFileSync('./views/index.haml'));
-
-l = 0;
-var rowsReceived = 0;
-var numRequests = 0;
-
-(function(cb) {
-    var db = createConnection();
-
-       var left = 1;
-
-       var start = Date.now();
-       var prev1000 = start;
-       function bench()
-       {
-           //db.query(sql).on('end', function(err, res) {
-           db.query(sql, function(err, res) {
-           //db.execute(sql, function(err, res) {
-
-               rowsReceived += res.length;
-               numRequests++;
-
-               l += render({results: res}).length;
-               console.log(render({results: res}));
-
-               left--;
-               if (left % 1000 === 0)
-               {
-                   var curTime = Date.now();
-                   var last1000time = curTime - prev1000;
-                   prev1000 = curTime;
-                   console.error( (1000000/last1000time) + ' req/sec' );
-               }
-
-               if (left > 0)
-                   bench();
-               else {
-                   console.error( numRequests *1000/(Date.now() - start) + ' req/sec (average 10000 reqs)');
-                   console.error( rowsReceived*1000/(Date.now() - start) + ' row/sec (average 10000 reqs)');
-                   db.end();
-                   if (cb) cb();
-                   console.log(process.hrtime(starthr));
-                   console.log(l);
-               }
-           });
-       }
-       bench();
-})();
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ruby-mysql2/populate.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ruby-mysql2/populate.js
deleted file mode 100644
index 64afb36fc414813ee8bb5cdf11f06c13c698c052..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ruby-mysql2/populate.js
+++ /dev/null
@@ -1,82 +0,0 @@
-var common     = require('../../test/common');
-var connection = common.createConnection();
-var assert     = require('assert');
-var Faker      = require('charlatan');
-var fs = require('fs');
-
-var createSql = fs.readFileSync('./schema.sql').toString();
-
-// use seed to make it consistent between runs
-// copy-paste from http://stackoverflow.com/questions/521295/javascript-random-seeds
-
-var m_w = 123456789;
-var m_z = 987654321;
-var mask = 0xffffffff;
-
-// Takes any integer
-function seed(i) {
-    m_w = i;
-}
-
-// Returns number between 0 (inclusive) and 1.0 (exclusive),
-// just like Math.random().
-function rand()
-{
-    m_z = (36969 * (m_z & 65535) + (m_z >> 16)) & mask;
-    m_w = (18000 * (m_w & 65535) + (m_w >> 16)) & mask;
-    var result = ((m_z << 16) + m_w) & mask;
-    result /= 4294967296;
-    return result + 0.5;
-}
-
-seed(123);
-
-connection.query(createSql);
-connection.query("DELETE FROM mysql2_test");
-
-function insertRow(r) {
-  connection.query("INSERT INTO mysql2_test SET ? ", r);
-}
-
-var num_rows = 10000;
-
-var five_words, twenty5_paragraphs;
-for (var i = 0; i < num_rows; ++i)
-{
-  five_words = Faker.Lorem.words(1 + rand(4)).join(' ').slice(0, 10);
-  twenty5_paragraphs = Faker.Lorem.paragraphs(1 + rand(24)).join(' ');
-  insertRow({
-     bit_test: 1,
-     tiny_int_test: rand(128),
-     small_int_test: rand(32767),
-     medium_int_test: rand(8388607),
-     int_test: rand(2147483647),
-     big_int_test: rand(9223372036854775807),
-     float_test: rand(32767)/1.87,
-     float_zero_test: 0.0,
-     double_test: rand(8388607)/1.87,
-     decimal_test: rand(8388607)/1.87,
-     decimal_zero_test: 0,
-     date_test: '2010-4-4',
-     date_time_test: '2010-4-4 11:44:00',
-     timestamp_test: '2010-4-4 11:44:00',
-     time_test: '11:44:00',
-     year_test: 14,
-     char_test: five_words,
-     varchar_test: five_words,
-     binary_test: five_words,
-     varbinary_test: five_words,
-     tiny_blob_test: five_words,
-     tiny_text_test: Faker.Lorem.paragraph(rand(5)),
-     blob_test: twenty5_paragraphs,
-     text_test: twenty5_paragraphs,
-     medium_blob_test: twenty5_paragraphs,
-     medium_text_test: twenty5_paragraphs,
-     long_blob_test: twenty5_paragraphs,
-     long_text_test: twenty5_paragraphs,
-     enum_test: ['val1', 'val2'][rand(2)],
-     set_test: ['val1', 'val2', 'val1,val2'][rand(3)]
-  });
-}
-
-connection.end();
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ruby-mysql2/schema.sql b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ruby-mysql2/schema.sql
deleted file mode 100644
index 541a122c5c2ab109a7a241f6e4c34f1fa5d6bb2b..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ruby-mysql2/schema.sql
+++ /dev/null
@@ -1,33 +0,0 @@
-  CREATE TABLE IF NOT EXISTS mysql2_test (
-    null_test VARCHAR(10),
-    bit_test BIT,
-    tiny_int_test TINYINT,
-    small_int_test SMALLINT,
-    medium_int_test MEDIUMINT,
-    int_test INT,
-    big_int_test BIGINT,
-    float_test FLOAT(10,3),
-    float_zero_test FLOAT(10,3),
-    double_test DOUBLE(10,3),
-    decimal_test DECIMAL(10,3),
-    decimal_zero_test DECIMAL(10,3),
-    date_test DATE,
-    date_time_test DATETIME,
-    timestamp_test TIMESTAMP,
-    time_test TIME,
-    year_test YEAR(4),
-    char_test CHAR(10),
-    varchar_test VARCHAR(10),
-    binary_test BINARY(10),
-    varbinary_test VARBINARY(10),
-    tiny_blob_test TINYBLOB,
-    tiny_text_test TINYTEXT,
-    blob_test BLOB,
-    text_test TEXT,
-    medium_blob_test MEDIUMBLOB,
-    medium_text_test MEDIUMTEXT,
-    long_blob_test LONGBLOB,
-    long_text_test LONGTEXT,
-    enum_test ENUM('val1', 'val2'),
-    set_test SET('val1', 'val2')
-  ) DEFAULT CHARSET=utf8
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ruby-mysql2/views/index.haml b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ruby-mysql2/views/index.haml
deleted file mode 100644
index d958d894e78207c0c157a1c558d379f2d9a954b6..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/ruby-mysql2/views/index.haml
+++ /dev/null
@@ -1,41 +0,0 @@
-!!!
-%html
-  %head
-    %title table dump goes here
-  %body
-    %h1 data data 
-    %table
-      %tbody
-        - each row in results
-          %tr
-            %td= row.null_test
-            %td= row.bit_test
-            %td= row.tiny_int_test
-            %td= row.small_int_test
-            %td= row.medium_int_test
-            %td= row.int_test
-            %td= row.big_int_test
-            %td= row.float_test
-            %td= row.float_zero_test
-            %td= row.double_test
-            %td= row.decimal_test
-            %td= row.decimal_zero_test
-            %td= row.date_test
-            %td= row.date_time_test
-            %td= row.timestamp_test
-            %td= row.time_test
-            %td= row.year_test
-            %td= row.char_test
-            %td= row.varchar_test
-            %td= row.binary_test
-            %td= row.varbinary_test
-            %td= row.tiny_blob_test
-            %td= row.tiny_text_test
-            %td= row.blob_test
-            %td= row.text_test
-            %td= row.medium_blob_test
-            %td= row.medium_text_test
-            %td= row.long_blob_test
-            %td= row.long_text_test
-            %td= row.enum_test
-            %td= row.set_test
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/run-unit.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/run-unit.js
deleted file mode 100644
index 326e56bf19506c6b24fdff956f887485935d7437..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/run-unit.js
+++ /dev/null
@@ -1,134 +0,0 @@
-#!/usr/bin/env node
-var progress = require('progress');
-
-var fs = require('fs');
-var nWarmup = 2;
-var nRepeats = 32 + nWarmup;
-var path = require('path');
-
-var prevResults = {};
-try {
-  var r = require('./results.json');
-  r.forEach(function(rr) {
-    prevResults[rr.path] = rr
-  });
-} catch(e) {
-  // no prev results?
-}
-
-function stats(times) {
-  var avg = 0;
-  for(var i=0; i < times.length; ++i) {
-    avg += times[i]/times.length;
-  }
-  var v = 0;
-  for(var i=0; i < times.length; ++i) {
-    v += (times[i] - avg)*(times[i] - avg) / times.length;
-  }
-  var stdev = Math.sqrt(v);
-  return {
-    avg: avg,
-    stdev: stdev,
-    stdevrel: stdev/avg
-  };
-}
-
-function runFolder(name, done) {
-  fs.readdir(name, function(err, list) {
-    if (err)
-      return done(err);
-    runFileList(name, list, done);
-  });
-}
-
-function benchmarkModule(m, modulePath, done) {
-
-  var results = [];
-   var bar = new progress(m.comment + ' [:bar] ', {
-     total: nRepeats,
-     clear: true
-   });
-  function repeat(w, n) {
-    bar.tick();
-    if (n === 0) {
-      var result = {};
-      var s = stats(results);
-      var unsDigits = Math.floor(Math.floor(s.stdev).toString().length * 0.8);
-      var pow = Math.pow(10, unsDigits);
-      var avg = Math.round(s.avg / pow)*pow;
-      var uns = Math.round(s.stdev / pow)*pow;
-      console.log('%s: %s  ±%s', m.comment, avg, uns);
-      result.time = s.avg;
-      result.timeStdev = s.stdev;
-      result.comment = m.comment;
-      result.path = path.relative(__dirname, modulePath);
-      if (m.toSpeed) {
-        var speed = m.toSpeed(s.avg, s.stdev);
-        var speedDigits =  Math.floor(Math.floor(speed.error).toString().length * 0.8);
-        pow = Math.pow(10, speedDigits);
-        console.log('           = %s ±%s %s',
-          Math.round(speed.value / pow)*pow,
-          Math.round(speed.error / pow)*pow, speed.units);
-        var prev = prevResults[result.path];
-        if (prev) {
-          if (speed.value > prev.speed.value + prev.speed.error) {
-            console.log('Faster then prev result: %s ±%s %s', prev.speed.value, prev.speed.units)
-          } else if (speed.value < prev.speed.value - prev.speed.error) {
-            console.log('Slower then prev result: %s ±%s %s', prev.speed.value, prev.speed.units)
-          }
-        }
-        result.speed = speed;
-      }
-      return done(null, result);
-    }
-    var start = process.hrtime();
-    setImmediate(function() {
-      m(function() {
-        var end = process.hrtime(start);
-        if (w <= 0)
-          results.push(end[0]*1e9 + end[1]);
-        repeat(w-1, n-1);
-      });
-    });
-  }
-  repeat(nWarmup-1, nRepeats-1, done);
-}
-
-function runFileList(base, list, done) {
-  var index = -1;
-  var results;
-  function runOne(err, res) {
-    if (err) return done(err);
-    ++index;
-    if (res) {
-      if (!results)
-        results = [];
-      if (Array.isArray(res))
-        results = results.concat(res);
-      else
-        results.push(res);
-    }
-    if (index >= list.length) {
-      return done(null, results);
-    }
-    var fname = base + '/' + list[index];
-    fs.stat(fname, function(err, stat) {
-      if (err) return done(err);
-      if (stat.isDirectory())
-        return runFolder(fname, runOne);
-
-      else if (fname.slice(-3) == '.js') {
-        var m = require(fname);
-        return benchmarkModule(m, fname, runOne);
-      }
-      runOne();
-    });
-  }
-  runOne();
-}
-
-//var name = process.argv[2] || __dirname + '/unit';
-runFolder(__dirname + '/unit', function(err, results) {
-  //console.log(results);
-  fs.writeFileSync(__dirname + '/results.json', JSON.stringify(results));
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/test-benchmark-select-1.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/test-benchmark-select-1.js
deleted file mode 100644
index 842771c9120b555946fb18ca218ccf538cd0af0c..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/test-benchmark-select-1.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var assert = require('assert');
-var createConnection = require('../common').createConnection;
-
-(function(cb) {
-    var db = createConnection();
-
-       var left = 10000;
-       var start = Date.now();
-       var prev1000 = start;
-       function bench()
-       {
-           db.query('select 1').on('end', function(err, res) {
-               left--;
-               if (left % 1000 === 0)
-               {
-                   var curTime = Date.now();
-                   var last1000time = curTime - prev1000;
-                   prev1000 = curTime;
-                   console.error( (1000000/last1000time) + ' req/sec' );
-               }
-
-               if (left > 0)
-                   bench();
-               else {
-                   console.error( 10000000/(Date.now() - start) + ' req/sec (average 10000 reqs)');
-                   db.end();
-                   if (cb) cb();
-               }
-           });
-       }
-       bench();
-})();
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition0 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition0
deleted file mode 100644
index b4472919b4207dfc185b90678dcc3dd14dc4420d..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition0 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition1 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition1
deleted file mode 100644
index a96ad6c9c534db6bfd4ebb9c4951f646c1e5e2ae..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition1 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition10 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition10
deleted file mode 100644
index fb69d663cabc2ff4f55fd79faea60afbbd4c2b7e..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition10 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition11 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition11
deleted file mode 100644
index 2c7b6e92540e744df6e8664bcd6ed54acbbb0e51..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition11 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition12 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition12
deleted file mode 100644
index c8a151e41cfc356c7ce184fed89a23acd62c1355..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition12 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition13 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition13
deleted file mode 100644
index 8bb1bcc93004ebff62f69a652d1db4a398a6cb2f..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition13 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition14 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition14
deleted file mode 100644
index 4f9223beda26e6a018f782551b94de24c2c694f8..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition14 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition15 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition15
deleted file mode 100644
index c5d29c0a4f3d2c26daa1625182b46a2ddd96ad06..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition15 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition16 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition16
deleted file mode 100644
index 7154cc8c9efde028ce3d59a4bc2c5073bacb76d3..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition16 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition17 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition17
deleted file mode 100644
index 3881ac3ac0ecef02921acd5b80e4f599984a54ca..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition17 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition18 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition18
deleted file mode 100644
index b85f7c82d1b866778891467ffc0dc4980e184b81..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition18 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition19 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition19
deleted file mode 100644
index d451ee9953e12a986a285b76476a9bb2312116b5..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition19 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition2 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition2
deleted file mode 100644
index 0369fbe5896965bc9d8f98d51bb297b7a089f092..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition2 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition20 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition20
deleted file mode 100644
index 54258216b96269438e118ba3da5d7f6e5e0a9bbd..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition20 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition21 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition21
deleted file mode 100644
index 242f96e9df8cffddc9d6c1e9675e6986cde6e8be..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition21 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition22 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition22
deleted file mode 100644
index ce65a57b229f7cae74d27588363056d665766c78..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition22 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition23 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition23
deleted file mode 100644
index e40244b1f6cf1de9430ea368f4fa176ff6f1d8b7..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition23 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition24 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition24
deleted file mode 100644
index 6dc797ba80a1d4a69903dc9e638272c0b04bc2c3..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition24 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition25 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition25
deleted file mode 100644
index 06f8e4162ca8727b61a2ca20aebfd9c5e8e17801..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition25 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition26 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition26
deleted file mode 100644
index 98ec79cdfc6136b740eafc6e736b04f2bef48379..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition26 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition27 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition27
deleted file mode 100644
index 33ece3fd74e6e886e6c17fe0f7e86b0c53e258b0..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition27 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition28 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition28
deleted file mode 100644
index 15bc68e42bfe93d2bb3076011a04f0f00d7fcfc4..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition28 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition29 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition29
deleted file mode 100644
index bc5b16a428e30f44f1230d630044dcba5f9d4078..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition29 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition3 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition3
deleted file mode 100644
index 7a6596116a6e3e95d56dfc38b64d0e9b74e47897..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition3 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition30 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition30
deleted file mode 100644
index 6ecf2df71df409b1ecb5192755896e0fb2ed0225..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition30 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition31 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition31
deleted file mode 100644
index ea4e238d6c235d1eebc982f1518e2931deb71587..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition31 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition32 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition32
deleted file mode 100644
index 3e80ec9d5136d17a5f5d42c2841a072b76a06e27..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition32 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition33 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition33
deleted file mode 100644
index 835877d2f50dedc2b26f499a2edbb8799c5ea884..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition33 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition34 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition34
deleted file mode 100644
index 9a58bd917ccf64e4d8d46da45df4153ba1435c1e..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition34 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition35 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition35
deleted file mode 100644
index 9287dea25164bf18e40a857a3fbcaf74bf3ac8fc..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition35 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition36 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition36
deleted file mode 100644
index 117d8a5c122b75f0dfb45bfe6a3b4db63d92087b..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition36 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition37 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition37
deleted file mode 100644
index 5d938453f0f795316faa073ee3be30a12a392739..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition37 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition38 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition38
deleted file mode 100644
index 296d39073c75c6082bf9494e3062359f2f889989..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition38 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition39 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition39
deleted file mode 100644
index 24e4ca8ce563c353f699ec11af7ee440175e130d..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition39 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition4 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition4
deleted file mode 100644
index 24c9b85fe35a4027201fc750d157c742037d7f32..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition4 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition40 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition40
deleted file mode 100644
index 5cc69b4be380f083c4c0f7262763517b30f0c0e2..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition40 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition41 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition41
deleted file mode 100644
index 97474b73598908632f3b3c93287138bc5e378f4e..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition41 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition42 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition42
deleted file mode 100644
index 65f5c41bf1196c768568fe1f9383b5157c041a12..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition42 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition5 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition5
deleted file mode 100644
index ae50e8edff6f2fe39791622acac6de26376bf1db..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition5 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition6 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition6
deleted file mode 100644
index 8767eb78a3ae993ecf1ba44b597753cd7d12800b..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition6 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition7 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition7
deleted file mode 100644
index 92bc5e7913f006c239ebcaeb0dc470d6a720855e..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition7 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition8 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition8
deleted file mode 100644
index b7400df3b25d371f045dc66ee226e52a3b804a64..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition8 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition9 b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition9
deleted file mode 100644
index f1cbde258fd4b5909c57a557857ef90f1de18b2b..0000000000000000000000000000000000000000
Binary files a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/fixtures/column_definition9 and /dev/null differ
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/packet_parser.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/packet_parser.js
deleted file mode 100644
index 703d4e718e6664e72308fb3f35b3659bfb42c18d..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/packet_parser.js
+++ /dev/null
@@ -1,47 +0,0 @@
-var p = new Buffer(65535*10);
-var offset = 0;
-var plen = 17;
-while(1) {
-  if (p.length - offset >= plen+4) {
-    p[offset] = plen;
-    p[offset+1] = 0;
-    p[offset+2] = 0;
-    p[offset+3] = 123; // packet id
-    offset += plen + 4;
-  } else {
-    p[offset] = p.length - offset - 4;
-    p[offset+1] = 0;
-    p[offset+2] = 0;
-    p[offset+3] = 123; // packet id
-    break;
-  }
-}
-
-var PP = require('../../lib/packet_parser.js');
-
-var count = 0;
-var cc = 0;
-
-function handler(packet) {
-  //console.log(packet.length(), packet.sequenceId);
-  cc += packet.sequenceId
-  count++;
-}
-
-var chunks = [];
-var csize = parseInt(process.argv[2]);
-for (var o=0; o + csize < p.length; o += csize) {
-  chunks.push(p.slice(o, o+csize));
-}
-
-var start = process.hrtime();
-for (var i=0; i < 50; ++i) {
-  var packetParser = new PP(handler);
-  for (var j=0; j < chunks.length; ++j) {
-    packetParser.execute(chunks[j]);
-  }
-}
-var end = process.hrtime(start);
-var dur = end[0]*1e9 + end[1];
-
-console.log(1e9*count/dur, count, cc);
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/packets/column_definition.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/packets/column_definition.js
deleted file mode 100644
index 24e144730023332b9664f25cb1108d3c6023ce08..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/packets/column_definition.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var fs = require('fs');
-var ColumnDefinition = require('../../../lib/packets/column_definition.js');
-var Packet = require('../../../lib/packets/packet.js');
-var fixtureFile = __dirname + '/../fixtures/column_definition';
-
-function prepareFixture() {
-  var Packets = require('../../../lib/packets/index.js');
-  var packetInd = 0;
-  Packets.ColumnDefinition = function(packet) {
-    fs.writeFileSync(fixtureFile + packetInd, packet.buffer.slice(packet.start, packet.end));
-    packetInd++;
-    var c = new ColumnDefinition(packet);
-    //console.log('packet', c);
-    return c;
-  };
-  var connection = require('../../../test/common.js').createConnection();
-  connection.query('select * from mysql.user', function() {});
-  connection.end();
-}
-
-//prepareFixture();
-//return;
-
-var npackets = 43;
-var packets = [];
-var packet;
-
-for (var i=0; i < npackets; ++i) {
-  var buf = fs.readFileSync(fixtureFile + i);
-  packet = new Packet(0, buf, 0, buf.length);
-  packets.push(packet);
-}
-
-var c;
-var repeats = 10000;
-
-function bench(done) {
-  for (var i=0; i < repeats; ++i) {
-    for (var j=0; j < npackets; ++j) {
-      packets[j].offset = 0;
-      c =new ColumnDefinition(packets[j]);
-    }
-  }
-  done();
-}
-
-module.exports = bench;
-module.exports.comment = "read " + npackets + " column definitions (select * from mysql.user) x " + repeats;
-module.exports.toSpeed = function(timeAvg, timeStdev) {
-  var value = 43*repeats*1e9 / timeAvg;
-  return {
-    value: value,
-    error: value*(timeStdev / timeAvg),
-    units: 'columns/second'
-  }
-}
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/simple/buffer-to-string.js b/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/simple/buffer-to-string.js
deleted file mode 100644
index 2a7ccc34ca423e21b167eeada877b0f184d362e1..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/benchmarks/unit/simple/buffer-to-string.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var a = new Buffer(10000);
-a.fill(120); // 'x'
-var l = 5;
-var s = '';
-var repeats = 10000;
-
-module.exports = function(next) {
-  for (var n=0; n < repeats; ++n) {
-    for (var i=0; i < a.length - l; ++i) {
-      s = s.toString('utf8', i, i+l);
-    }
-  }
-  next();
-};
-
-module.exports.comment = 'read ' + l + ' chars strings from ' + a.length + ' bytes buffer x ' + repeats;
-module.exports.toSpeed = function(time, timeError) {
-  var value = 1e9*a.length*l*repeats / time;
-  return {
-    value: value,
-    error: value*(timeError/time),
-    units: 'chars/second'
-  };
-};
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/binlog-watcher.js b/node_modules/mysql2-promise/node_modules/mysql2/examples/binlog-watcher.js
deleted file mode 100644
index dcb4b0841e3290efbcbd1a30ea14c99ee6eddbce..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/binlog-watcher.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var mysql = require('../test/common').createConnection();
-var through2 = require('through2');
-
-var binlogStream = mysql.createBinlogStream({
-  serverId: 123, // slave ID, first field in "show slave hosts" sql response
-  // you can also specify slave host, username, password and port
-  masterId: 0,
-  filename: 'mysql-bin.000007',
-  binlogPos: 120,
-  flags: 1, // 1 = "non-blocking mode"
-});
-
-binlogStream.pipe(through2.obj(function(obj, enc, next) {
-  console.log(obj);
-  next();
-}));
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/connect-over-socks.js b/node_modules/mysql2-promise/node_modules/mysql2/examples/connect-over-socks.js
deleted file mode 100644
index 66ae19b2110ee26631600a8e40796f9310b3f0e7..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/connect-over-socks.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var SocksConnection = require('socksjs');
-var mysql = require('../index.js');
-
-//var socksProxy = new SocksConnection({ port: 3306 });
-//var conn = mysql.createConnection({
-//  stream: socksProxy,
-//});
-
-//conn.query("select 1+1", function(err, rows, fields) {
-//  console.log(err, rows, fields);
-//});
-
-
-var conn1 = mysql.createPool({
-  debug: 1,
-  stream: function() {
-    return new SocksConnection({ port: 3306 });
-  }
-});
-
-
-conn1.execute("select sleep(1.1) as www", function(err, rows, fields) {
-  console.log(err, rows, fields);
-});
-
-
-conn1.execute("select sleep(1) as qqq", function(err, rows, fields) {
-  console.log(err, rows, fields);
-});
-
-conn1.execute("select sleep(1) as qqq", function(err, rows, fields) {
-  console.log(err, rows, fields);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/execute.js b/node_modules/mysql2-promise/node_modules/mysql2/examples/execute.js
deleted file mode 100644
index fc88892febfc5690bd0165aaa06cc7e4e9c04dc0..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/execute.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var mysql = require('../test/common').createConnection();
-mysql.execute("select ?+1 as qqq, ? as rrr, ? as yyy", [1, null, 3], function(err, rows, fields) {
-//mysql.execute("select ?+?+? as qqq, ? as rrr", [1, 2, 5, "test"], function(err, rows, fields) {
-  console.log(err, rows, fields);
-  mysql.execute("select ?+1 as qqq, ? as rrr, ? as yyy", [3, null, 3], function(err, rows, fields) {
-    console.log(err, rows, fields);
-    mysql.unprepare("select ?+1 as qqq, ? as rrr, ? as yyy");
-    mysql.execute("select ?+1 as qqq, ? as rrr, ? as yyy", [3, null, 3], function(err, rows, fields) {
-      console.log(err, rows, fields);
-    });
-  });
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/mysqlproxy.js b/node_modules/mysql2-promise/node_modules/mysql2/examples/mysqlproxy.js
deleted file mode 100644
index eeaa776f9e9788d23c7974c0c8597490a046658a..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/mysqlproxy.js
+++ /dev/null
@@ -1,45 +0,0 @@
-var mysql = require('../index.js');
-
-var server = mysql.createServer();
-server.listen(3307);
-server.on('connection', function(conn) {
-  console.log('connection');
-
-  conn.serverHandshake({
-    protocolVersion: 10,
-    serverVersion: 'node.js rocks',
-    connectionId: 1234,
-    statusFlags: 2,
-    characterSet: 8,
-    capabilityFlags: 0xffffff
-  });
-
-  conn.on('field_list', function(table, fields) {
-    console.log('field list:', table, fields);
-    conn.writeEof();
-  });
-
-  var remote = mysql.createConnection({user: 'root', database: 'dbname', host:'server.example.com', password: 'secret'});
-
-  conn.on('query', function(sql) {
-    console.log('proxying query:' + sql);
-    remote.query(sql, function(err) { // overloaded args, either (err, result :object) 
-                                      // or (err, rows :array, columns :array)
-      if (Array.isArray(arguments[1])) {
-        // response to a 'select', 'show' or similar
-        var rows = arguments[1], columns = arguments[2];
-        console.log('rows', rows);
-        console.log('columns', columns);
-        conn.writeTextResult(rows, columns);
-      } else {
-        // response to an 'insert', 'update' or 'delete' 
-        var result = arguments[1];
-        console.log('result', result);
-        conn.writeOk(result);
-      }
-    });
-  });
-
-  conn.on('end', remote.end.bind(remote));
-});
-
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/pass-sha.js b/node_modules/mysql2-promise/node_modules/mysql2/examples/pass-sha.js
deleted file mode 100644
index ee585ff7b90c2d7745630b9268bfee3aaded967a..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/pass-sha.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var mysql = require('../index.js').createConnection({
-  user: 'testuser',
-  //password: 'testpassword'
-  passwordSha1: Buffer('8bb6118f8fd6935ad0876a3be34a717d32708ffd', 'hex')
-});
-mysql.execute("select ?+1 as qqq, ? as rrr, ? as yyy", [1, null, 3], function(err, rows, fields) {
-  console.log(err, rows, fields);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/pool-test.js b/node_modules/mysql2-promise/node_modules/mysql2/examples/pool-test.js
deleted file mode 100644
index aa13446e7281db0b9b6b1e7b8765fdbcd0359d91..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/pool-test.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var pool = require('../test/common').createPool();
-
-setInterval(function() {
-for (var i=0; i < 5; ++i) {
-  pool.getConnection(function(err, db) {
-    db.query("select sleep(0.5) as qqq", function(err, rows, fields) {
-      console.log(rows, fields);
-      db.end();
-    });
-  });
-}
-}, 1000);
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/prepare.js b/node_modules/mysql2-promise/node_modules/mysql2/examples/prepare.js
deleted file mode 100644
index 7f1f5bb3aeefe4fd2493570a9ee2a007b43d6156..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/prepare.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var mysql = require('../test/common').createConnection();
-
-mysql.prepare("SELECT * from mysql.user into outfile '/tmp/mysql.user.txt'", function(err, stmt) {
-    console.log(stmt);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/server.js b/node_modules/mysql2-promise/node_modules/mysql2/examples/server.js
deleted file mode 100644
index aa6425692cade0ab1aa3b5cc1ccdaa5648463a25..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/server.js
+++ /dev/null
@@ -1,57 +0,0 @@
-var mysql = require('../index.js');
-var flags = require('../lib/constants/client.js');
-var auth  = require('../lib/auth_41.js');
-
-function authenticate(params, cb) {
-  console.log(params);
-  var doubleSha = auth.doubleSha1('pass123');
-  var isValid = auth.verifyToken(params.authPluginData1, params.authPluginData2, params.authToken, doubleSha);
-  if (isValid)
-    cb(null);
-  else
-    // for list of codes lib/constants/errors.js
-    cb(null, { message: 'wrong password dude', code: 1045});
-}
-
-var server = mysql.createServer();
-server.listen(3333);
-server.on('connection', function(conn) {
-
-  // we can deny connection here:
-  // conn.writeError({ message: 'secret', code: 123 });
-  // conn.close();
-  conn.serverHandshake({
-    protocolVersion: 10,
-    serverVersion: '5.6.10', //'node.js rocks',
-    connectionId: 1234,
-    statusFlags: 2,
-    characterSet: 8,
-    capabilityFlags: 0xffffff,
-    authCallback: authenticate
-  });
-
-  conn.on('field_list', function(table, fields) {
-    console.log('FIELD LIST:', table, fields);
-    conn.writeEof();
-  });
-
-  conn.on('query', function(query) {
-    conn.writeColumns([{
-      catalog: 'def',
-      schema: 'test',
-      table: 'test_table',
-      orgTable: 'test_table',
-      name: 'beta',
-      orgName: 'beta',
-      characterSet: 33,
-      columnLength: 384,
-      columnType: 253,
-      flags: 0,
-      decimals: 0
-    }]);
-    conn.writeTextRow(['test тест テスト փորձարկում পরীক্ষা kiểm tra ']);
-    conn.writeTextRow(['ტესტი પરીક્ષણ  מבחן פּרובירן اختبار परीक्षण']);
-    conn.writeEof();
-    conn.close();
-  });
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/simple-select.js b/node_modules/mysql2-promise/node_modules/mysql2/examples/simple-select.js
deleted file mode 100644
index df47d385d4e9c590b521b8e1afe86a434473aa46..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/simple-select.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var mysql = require('../test/common').createConnection();
-
-mysql.query("select * from foos limit 10", function(err, rows, fields) {
-    console.log(rows, fields);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/ca-cert.pem b/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/ca-cert.pem
deleted file mode 100644
index 6e0a83b008c6ae05073cc4dfb763c7d80980c08e..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/ca-cert.pem
+++ /dev/null
@@ -1,22 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDtTCCAp2gAwIBAgIJALO3/a+fdsicMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
-BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
-aWRnaXRzIFB0eSBMdGQwHhcNMTMwNDMwMDEzNTUwWhcNMTYwMTI1MDEzNTUwWjBF
-MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50
-ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAxFrsDfgxd5fb053eVqZ1a+iVVxoOkTl9f97BhIuUp3GE82UBMXQdL4Ec
-gc3oQ56dEokvz9ghYn60cUBaH5sVjzm3qO3HYsHhA/nYoVa7U9TrSGhv3hWyqo48
-wWKHBYea325tcO2h9QanLFsnc1aauv8qGeWoa91lrfsT9G3nFdpiw587Nk+7NkKR
-MhEbAf84qoTmcxo6hqOrqEZwhIozuiF0+oNNfj/Tmcd5517WJfWLAHjLPpBmc7Yw
-vJqYqk7OK/BkX6NVx8OxcxcejvuosoZRbVK3Tuk+5N2AddncxU5Eq2kGVr890xTg
-ZVwUFF4TRkenDKe3ez2DvlRDnuFzjQIDAQABo4GnMIGkMB0GA1UdDgQWBBQd7DqN
-xTmSuT3f82DP13asHrqHIjB1BgNVHSMEbjBsgBQd7DqNxTmSuT3f82DP13asHrqH
-IqFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV
-BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJALO3/a+fdsicMAwGA1UdEwQF
-MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAA9+kUPZ7PfvD0SkgMnGXqnL2EPUPsgo
-bRwciPx5E/SqoEczfYip+IcWAxRnifkFGXAzBq6w3GmGaJqG95vV5noj+md7KE2m
-t8dxwGlOYP2H0oEubfrz6AHOcMDF68N2hmA4K0zj+Ag9XCJxN41vzaPgLuvNmDqB
-O16Qh47CNoKtpEFZ4g6Yp3rErzhGVSLgLh2NmDzi6Vd78mmy454euLDTcbCnlKsA
-kXvt8KCYacYNNV0m8mLYqPylJUZNvtFE4mAo35Uzbw6NawkWd+Aqx8UJCsQDhWWw
-5T+24NcfiAs+Wqg3UvuzXlOZB721nmqgIYIcjyumMewGE/y1xLschIQ=
------END CERTIFICATE-----
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/ca-key.pem b/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/ca-key.pem
deleted file mode 100644
index 76ba872fd585e03ebc0c3971f3b3a34ba5f2b4eb..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/ca-key.pem
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpAIBAAKCAQEAxFrsDfgxd5fb053eVqZ1a+iVVxoOkTl9f97BhIuUp3GE82UB
-MXQdL4Ecgc3oQ56dEokvz9ghYn60cUBaH5sVjzm3qO3HYsHhA/nYoVa7U9TrSGhv
-3hWyqo48wWKHBYea325tcO2h9QanLFsnc1aauv8qGeWoa91lrfsT9G3nFdpiw587
-Nk+7NkKRMhEbAf84qoTmcxo6hqOrqEZwhIozuiF0+oNNfj/Tmcd5517WJfWLAHjL
-PpBmc7YwvJqYqk7OK/BkX6NVx8OxcxcejvuosoZRbVK3Tuk+5N2AddncxU5Eq2kG
-Vr890xTgZVwUFF4TRkenDKe3ez2DvlRDnuFzjQIDAQABAoIBAQDDQW7PDWmTdU1C
-CBCatfi6D5TCAsVNoI+t4kMpnOt7/qSorF4dYUvMe2VvpuQ6qbWkQwtqcY/xM/IX
-VFjKaRttS4XY1GqbSBSMMZ08AtVRLb+yRzhG7ei3Na4w19tQomJdoJ/v1j5hO/Zt
-Y0+9n/dJ0Id7LSbn7Ec6VRyoyckrrjmikw/y91UU/Xi3u2/64rJY+vbH2h090Ztg
-MNt39v+VbengJ4vS/VbDk6qPv4CGUYWYfbz4ekRK0/xLWKW9vAu8KcN1iewmEyeH
-W16686qKrhwDlCXYpZcTBnHB+QCxNfPRFJpfXzXSTCTY9aId79skCnEzBlUshKrV
-6mYzlFcBAoGBAPIn62Gc7uRWCQkQaP05pjI4/v0I8ggvVfDwAyxY7QowLQXRT49O
-zohCLtJFYN5Zd01hAgdrNl6QdtBF+rQEoKFKMRY8BI8G+lz6KHX5K37mAip/VjIl
-a6sUUKu5lYOPqouDuAPoO1VRWulVPOx18/8s+vtk9OV3M+01vMBewXptAoGBAM+U
-rx5Plg7qBPtLGTXCTbUHcvKKY2HdUHlzJjj8zcV8e6012GWcRblL4XmaxZTpS177
-JIDBPuhXDKjUwYemV1VBQlvh94f1ArDgh9+MEdYypYPvRDAzOg+Q3EGBW11zfYF9
-EqiWFud4vSZ4zFQgeg3cfCRIsXXfc3CDpzeV+CmhAoGBAJGeM8ulRXsFybUrqxbr
-vedhouSipnkJjhKvIhle+FwyEED5V3CEIWqK8gD8O346KqXbeg7gB/fhw7EHA/WQ
-+s9DADWwrcUcmx2iSQZ4ahGLWy4XGMxa+F4Of1xk42YT1KjE8rlWw6dQnuzFlzdS
-zwFaGStn0GTUw+MXd4Pu90YZAoGAWlPS2Be9roO64zbMo44HjmzNYilCEcXiTNcE
-nOu1BuiiUL8LiTu1Q2p3lRj6PVA/Ufdq7PQqUaP/iD/8bvC9NAYPwDfWJL1DDIDH
-30juQg0L5Rtqyqaf70IT9hU6ErI8vOoWAnI9SUBK3sDV+Q2gzwNQqeFQB4DSlPVV
-AGUr9cECgYARilqjaF8Ns3ilS3r3IEZ8I2wPAei/P9PCtkwkUsVpZ2+/SHxFAJkf
-CaPVXdHMHkRXQUf1a+fAEYWiDnFnTaWXg/HyCt1V+Rr7g5eXsN+GwoeQ5Rywzi7m
-K6atiYVINfvpNcN73dO7mB4jXgTNCh0K8ru9lf2nKgPzjd0muNDBww==
------END RSA PRIVATE KEY-----
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/client-cert.pem b/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/client-cert.pem
deleted file mode 100644
index 288be5cee777d8fb4b145a17638dd7ab0735e337..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/client-cert.pem
+++ /dev/null
@@ -1,19 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIC/jCCAeYCAQEwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQVUxEzARBgNV
-BAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0
-ZDAeFw0xMzA0MzAwMTM1NTVaFw0xNjAxMjUwMTM1NTVaMEUxCzAJBgNVBAYTAkFV
-MRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRz
-IFB0eSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCa+f+OWaOI
-1W6HaBZ5Ch0fW9SKrv7Uz/mzAAGFer7+0KNF7JC0/WtK1lz0oBuYqt6wZQmIO0at
-6RP55Uxyj5Zf8C2jyHPU2iAUYcV/QTBXw0JNXCV0v+NeNjmh7/Tngj5l7nfdebLz
-4oooQ3OlN3wbbHSd4UNmMhCQKNVFGS3nOp1q7C3QXuJJuq5zOXE6T6DO43zLo3HG
-JEGjtkXA8oFWW2wIKrhxJlNLxaW70UrLMxBCLJ2hI0MITYsYSA5aPw+EZ0rrkGc9
-qaagpWYR7Yu//i78XOK1p8wgtZTlHY4akWMCRMUEkcKpiMLxrTyBijG/4jrYuxdJ
-+ZnIYWKkjYevAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAEl6Yw2X2tJhHV8Wut+1
-YWXYuuYV/JbPx1KJLWl78eFnnZfzdCkSzywv9ThW2xSehIH2anfb8HxrvypVa1/r
-EUcgy8kMzoa9ZcPXs0Ol/hCEsYYQZ/rXgXtPjaIb92kznKXhLckAKpChx8LxeSYc
-TZ6DVdhT+sWwSy/DetzavAq8QGFRyYL88bxibSgiBGRw7i5sWk5/T6dpx322MbtK
-FMPv3K5Mt0b3eBsegcjTvFqJAPBADB/WVLUsp+ESruFTcWGf8H91aoiWhZspEHjt
-j2XD/nlkC44t3RU8YNx2jAxj9HhG7QHfwsY9CDSwmnKtpUhvGUrGkp98Q/dUMbds
-NP0=
------END CERTIFICATE-----
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/client-key.pem b/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/client-key.pem
deleted file mode 100644
index d6134fd3f7662e8f7aa2866911bce6431c93eb9e..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/client-key.pem
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEowIBAAKCAQEAmvn/jlmjiNVuh2gWeQodH1vUiq7+1M/5swABhXq+/tCjReyQ
-tP1rStZc9KAbmKresGUJiDtGrekT+eVMco+WX/Ato8hz1NogFGHFf0EwV8NCTVwl
-dL/jXjY5oe/054I+Ze533Xmy8+KKKENzpTd8G2x0neFDZjIQkCjVRRkt5zqdauwt
-0F7iSbquczlxOk+gzuN8y6NxxiRBo7ZFwPKBVltsCCq4cSZTS8Wlu9FKyzMQQiyd
-oSNDCE2LGEgOWj8PhGdK65BnPammoKVmEe2Lv/4u/FzitafMILWU5R2OGpFjAkTF
-BJHCqYjC8a08gYoxv+I62LsXSfmZyGFipI2HrwIDAQABAoIBAQCXqKrEHUiB8Yu2
-is/jJ1iUhYMbLGFI1TXgS9MxUotyRa5iET0TQSQsGlbhNYWMAzrlmBqZ7JggPIVF
-+XS0b3uS6zFepB1mYQcfqwZgn+S1HenWVqR4+geA/MOti2s42yZBDfrTC/Np43mc
-KVYUipWzKJF+pyET805uJOeANUHMkvP6So066akZgi+bAdIpNu0hvvq04KUbPNfE
-c4XdT7CKZnNSHhgfXBLN+H10wfIKnL916qJtOaRERZmM/M/LQRJRrSZTTKZWwMHg
-5eBdYLI3+/eYeNriLlWVAEMXuUN7TueJFzePuTe5TRdVHkHbBvQTliIvr+udu4MV
-FGMTrfchAoGBAMjUuoF8X5dPtu3eHCrGsg787hPdSn9jDhOYoKKTAj8Ft7Rnl5X3
-twLfeTtBhrPpo0KYOYkO2bETb0xXp1hUAfOGTl/jy1LREqHUxKPnaEpO5CbJMzwq
-rhAIR4ZgQcqxHkBbUJd+lLptnWbw9LxiysEVrHwRyKH39ZdbJTM4KZU3AoGBAMWM
-mJRhYbPpiDLRiskFqEou9qU+zjq1RlbI6fWoz5+8K6A3zfBHE1J1ZvqF6tvOeoDx
-HLY5vIwlIKy8XwmTwUQvd9TTuRD+ZnY9gUoPgDhEK8fSJeSb2OqZyKBwATM7Q9Cn
-5pyTOsTkmlm4AKpczoAJ3WUmRmvYeT+uGfXU611JAoGAGEkJKKFWmeCM2WTTeSS/
-4WoajBJlcNQUnrAFNMOcMOzLEyi3vu3Olq1ZZp384QKuuF3aD0XZcz1LZyruVJMM
-DVu/XH8aVjBsFV+6S6uvA9VYZ4xLAsqSc+PcalZ3fkA+zT99lmQ7LfQVZZ5bqfA0
-Xnb1fadU4KkwbJYcAH6ZIK8CgYAVVp14kZhDHbuXeajbE+BcuvvrV4BhOQlzAFq9
-LVHX+DRiJwT4qkS9CG9qKiL3QTNcUC8Aw/XI0Y3Y+rPtTed3XQU9mO0Jl+ErbnNT
-s57u9PYhrGJpcigZFyljoxWOGh22IRy41vJnKCZAAK8Zt9KaY/ZlIaBDr+tQ5JZr
-Rmdx+QKBgAI/n9g6Gf32skdVsM8ydyZbmUmU2EarGPLKtwv6rDljZekrX+ZQouJU
-Wh0Wl7BZGoWScJGlcuNoeewalGY/GrAavaN0YvoyhCkIbeD/B53/bzsMTUvnDHk4
-sxT7ieigYTYabCbpr+g1687ydpEoU7GopE6u3xlmuhj3+HoR825c
------END RSA PRIVATE KEY-----
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/client-req.pem b/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/client-req.pem
deleted file mode 100644
index 9229af320aed28215b146044b4a49f6591001b18..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/client-req.pem
+++ /dev/null
@@ -1,16 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIICijCCAXICAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUx
-ITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBAJr5/45Zo4jVbodoFnkKHR9b1Iqu/tTP+bMAAYV6
-vv7Qo0XskLT9a0rWXPSgG5iq3rBlCYg7Rq3pE/nlTHKPll/wLaPIc9TaIBRhxX9B
-MFfDQk1cJXS/4142OaHv9OeCPmXud915svPiiihDc6U3fBtsdJ3hQ2YyEJAo1UUZ
-Lec6nWrsLdBe4km6rnM5cTpPoM7jfMujccYkQaO2RcDygVZbbAgquHEmU0vFpbvR
-SsszEEIsnaEjQwhNixhIDlo/D4RnSuuQZz2ppqClZhHti7/+Lvxc4rWnzCC1lOUd
-jhqRYwJExQSRwqmIwvGtPIGKMb/iOti7F0n5mchhYqSNh68CAwEAAaAAMA0GCSqG
-SIb3DQEBBQUAA4IBAQATmAC1QQqi5DWnhtHhKCFORpclZLwNqQJR+wpMZ00Ajt3r
-+jSJo/1j9Ecys1niia79y6iyiTqTJDVEmkP+9Wmgols1bMMYZIcbnb09m1G4kCuJ
-Axg6ktJ/Dt5R5Gp3JiejBdimAwUJq1gZ7ywcXeV0LnZVpPBz1J1cfWkfP3vMcbqv
-qufWq1JOQK0VxfhQqay0CZK4+LCoMaEgWPJCZoC7Eqw5KQKEBERhwETGYHF7wlgG
-lqEgWL+aym5su+EW8nFRLJ8pdr9CW+pTaYZw28w34oIx8PYUNgwJ5uIawqZA7IuZ
-dST/6A4nD04kJcs7KnPbLCRpRyvdqHiy+7xBd9SJ
------END CERTIFICATE REQUEST-----
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/mkcerts.sh b/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/mkcerts.sh
deleted file mode 100644
index 7e2d9fc7bedebe6caa96794e3d6c27c86eaf7ccf..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/mkcerts.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-openssl genrsa 2048 > ca-key.pem
-openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem
-openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
-openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
-openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
-openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/server-cert.pem b/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/server-cert.pem
deleted file mode 100644
index 94b495b487153c259a345ae1143b49bdc362b77d..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/server-cert.pem
+++ /dev/null
@@ -1,19 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIC/jCCAeYCAQEwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQVUxEzARBgNV
-BAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0
-ZDAeFw0xMzA0MzAwMTM1NTJaFw0xNjAxMjUwMTM1NTJaMEUxCzAJBgNVBAYTAkFV
-MRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRz
-IFB0eSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqqHgScXj4
-koJQeURbPss1yAqiByb4Ub/ggNP4+ZQXdoXX+kBKoCXstPHvNwBQlg+m8a4g/x9g
-Vj0gKL2nEo+CcIyNHjea728n1xTBHlpSesWqDsbdSMD6sgDl07hCVS4QAjt8a521
-pf4kKbv44Wa9ntpGPmLX7BFxLyN8LBsfTa+noYKxlQK9WJAbP7oL5bza4Uf84Iwg
-BEXkku7RRyw48S9RFIEMjIIyUvhS1YIJW57F9rcqaMerdd5BQYcgzpfESbtayWkJ
-Es89TgbvoD5njii7EFGgCB5DQfCbgOImJPRHNPHYj4iqGXitFKZO6uxUCyceodxV
-KOM/LKZvJKFNAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBALSFOwPrNEyQg1Wp/WkW
-BJACqNsnWJKnackSfjS6N4GwH8MOQgAgRwXx3RgpOHUgTnt6KiEQMI40tuHXU8A9
-JNC9XdX7x/EEqny+ZCpVd4P5CzXAJEiZ63WtmEUnjBRQiFxBsgh88cUnXFfIAGEa
-jgudFMmVS/tz+UQgciu2FAWkfcCPH1z3fUmxBjrcX9iOCuJXohk2G7qmawfpCkaW
-RFo6dBl3u8sEo5+/KeFtl0EmLRD9yMOx1XPoT9oVcpis/XxTkvPxS7hAHHc5ZIBq
-w8f5NX/7jTiHJI4k1/mfyrDJMCwJPMzRlTppKSdwEylII5b8SmAaGjGvOiNi/7EX
-v90=
------END CERTIFICATE-----
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/server-key.pem b/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/server-key.pem
deleted file mode 100644
index c24f872708fbe88de8be6a497f7e6a07ab9e133b..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/server-key.pem
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpAIBAAKCAQEAqqh4EnF4+JKCUHlEWz7LNcgKogcm+FG/4IDT+PmUF3aF1/pA
-SqAl7LTx7zcAUJYPpvGuIP8fYFY9ICi9pxKPgnCMjR43mu9vJ9cUwR5aUnrFqg7G
-3UjA+rIA5dO4QlUuEAI7fGudtaX+JCm7+OFmvZ7aRj5i1+wRcS8jfCwbH02vp6GC
-sZUCvViQGz+6C+W82uFH/OCMIARF5JLu0UcsOPEvURSBDIyCMlL4UtWCCVuexfa3
-KmjHq3XeQUGHIM6XxEm7WslpCRLPPU4G76A+Z44ouxBRoAgeQ0Hwm4DiJiT0RzTx
-2I+Iqhl4rRSmTursVAsnHqHcVSjjPyymbyShTQIDAQABAoIBAHMqu9UedJezL3Ql
-UicNik9iDyLnFrpvWMClz+bubq0i1BI7lJWH2/AQ8FAR2wmHK0rrQCqOYNs/d4Kz
-W8Fa+jP5xjAZm0bYnDfTovLsi+Grbqdjz3pX9bt40rhGl8tT9oDhMMm3SjfirE41
-R+AeJJqEkCLlSQkUC3VJbXYHwcnuJhkVVxsRtNeIE9d5DSOoXuPjAnQjmS5zUBLz
-JlA2a5bTLeENfcUL8Jr7WhxWIyIAFBY4ewpg7sbVmMnir3VD315OeowYMQpk/AaC
-AiwDA1kJCYoKUCAuizSAS3I5WNFeqZfbhWskdct6MphcMrMsLWvqLtXvLImU+lgX
-Z9rJHDUCgYEA1R3+p8WQ/YKppJb/klRMtWLnXHLlTan2YfDxmcLGC9zHro24uAL3
-SpuXivKzSKX8BGA+9lzSnWndX7PK5fi2UMnMAxNNE6Cxu0S+yjras92B+DMjiPRf
-lk7trtyXhYjoxPQE8cCxfbKkl6uLYCKyi9JQwygyOPhEUDkZRcyNVusCgYEAzP9W
-zqALi7ay0Dizu5ZXRsehQKw4ElMuvHHjt4r16aW7pe8ydqkmsm3Qk8VwfblqZFyU
-ndSzWU+SguuD2pUz5re6wLKrZFIicirNS6m88AmCjTUQ5W+FBHpvkQCQWsN5ykfy
-KAdfEJlZoInLYdU9Z1GueUk/4EBpToNFz7kzSqcCgYEAlrebvPLP0zlw1+Gh5M6R
-YUYM8SigWgh1IlbPxjok7Ya6AQxhMmGGmdDnn3B8skgQrteSL5D9si2ITYJNX85A
-wWm1SgeAXv0qNJIti7+Lo+BnZixkWRrZ7ubq2NtQnTNxyrf4NzBbVdXc6RZ8fwSK
-2K9oRlxLCFcrmMCIywAahPkCgYEAwK0mTCNFdtYLj4Yb+K6/7Xjo6T51nVOt09U/
-8V2c8TSjAL2oMrud8YshxiKHLsQ9aYNS9F3dDI6r6H2wepxOIgaCc2f7i9lfIutz
-9i/ds8dce5hq/xsobSMfBa0AAS9Fo4in5FO5WIKqKSgajyO8CQZO9RSSAxbHY9Ii
-pbEusnUCgYBzVXEFSload51C82XgvwjwcayrKrGBq+5/K/N5xMGBxuObu2vWA3ks
-MSTU2tXUiwpApY51v+88JGBHwI6+3EGRGEow09S0MlsHxjAG+MCz5Fj+nhoIJk78
-I/E+FGjJW+otrrz8rLi8bz+t3QTtB7rTiKMMpmIIIwG8OacUQPr82g==
------END RSA PRIVATE KEY-----
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/server-req.pem b/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/server-req.pem
deleted file mode 100644
index 5d44838f5315fb35e4f7be9ec6b47cfacac90210..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/certs/server-req.pem
+++ /dev/null
@@ -1,16 +0,0 @@
------BEGIN CERTIFICATE REQUEST-----
-MIICijCCAXICAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUx
-ITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBAKqoeBJxePiSglB5RFs+yzXICqIHJvhRv+CA0/j5
-lBd2hdf6QEqgJey08e83AFCWD6bxriD/H2BWPSAovacSj4JwjI0eN5rvbyfXFMEe
-WlJ6xaoOxt1IwPqyAOXTuEJVLhACO3xrnbWl/iQpu/jhZr2e2kY+YtfsEXEvI3ws
-Gx9Nr6ehgrGVAr1YkBs/ugvlvNrhR/zgjCAEReSS7tFHLDjxL1EUgQyMgjJS+FLV
-gglbnsX2typox6t13kFBhyDOl8RJu1rJaQkSzz1OBu+gPmeOKLsQUaAIHkNB8JuA
-4iYk9Ec08diPiKoZeK0Upk7q7FQLJx6h3FUo4z8spm8koU0CAwEAAaAAMA0GCSqG
-SIb3DQEBBQUAA4IBAQCDtIfTr/LmuFYkuxt1bPj79AOmbONQrwOFP6szeBL44jJf
-jaIH4gDWy70zhaZ4FmnskV4TbdEK5ENoW2Rif87JGex2yL+vzdKigRX0TzUYFA0x
-IqzR/sx0iMV3EsW3qYPRq/QJErvD5rL1KA6J+nHMeZiRFRF34XaoVHk4zaFDM+J5
-rjMy8GnRS7lqBe31zuqLfU2I9Bwq2InpYMw1Pf+boarZiIwmfMtiHbb5Aap1lMh0
-u1WKfiuB6CqXtyXFJR5PJTwO581yuINByzKlZZyXUpP4MbargPc5f1thf3tKndgB
-3GG1gmMsl/cUQ7XBdBH2WXCuipt0mflWj8qKylUA
------END CERTIFICATE REQUEST-----
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/client-flags.sh b/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/client-flags.sh
deleted file mode 100644
index 04e1cf231e8e77c59546abe49f615ac3acf4567a..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/client-flags.sh
+++ /dev/null
@@ -1 +0,0 @@
-mysql --ssl-key=certs/client-key.pem --ssl-cert=certs/client-cert.pem -h 127.0.0.1 -P 3307
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/rds-ssl.js b/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/rds-ssl.js
deleted file mode 100644
index 4454d3d48f4c4e07aff48db496cc1ab6da102638..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/rds-ssl.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var fs = require('fs');
-var mysql = require('../../index.js');
-
-var conn = mysql.createConnection({
-   user: process.env.USER,
-   password: process.env.PASSWORD,
-   database: process.env.DB,
-   host: process.env.HOST,
-   port: 3306,
-   ssl: 'Amazon RDS'
-});
-
-conn.query('show status like \'Ssl_cipher\'', function(err, res) {
-  console.log(err, res);
-  conn.end();
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/select-over-ssl.js b/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/select-over-ssl.js
deleted file mode 100644
index d0a1e99ae3f928d1bab3bc16bbe0a43fdd24ee65..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/examples/ssl/select-over-ssl.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var fs = require('fs');
-var mysql = require('../../index.js');
-var conn = mysql.createConnection({
-   user: 'root',
-   password: '',
-   database: 'test',
-   host: '127.0.0.1',
-   port: '3306',
-   ssl: {
-     //key: fs.readFileSync('./certs/client-key.pem'),
-     //cert: fs.readFileSync('./certs/client-cert.pem')
-     ca: fs.readFileSync('./certs/ca-cert.pem')
-   }
-});
-
-conn.query('select 1+1 as test', function(err, res) {
-  console.log(res);
-  conn.query('select repeat("a", 100) as test', function(err, res) {
-    console.log(res);
-  });
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/fixtures/mysql-ssl-ca-cert.pem b/node_modules/mysql2-promise/node_modules/mysql2/fixtures/mysql-ssl-ca-cert.pem
deleted file mode 100644
index 8b54fd29447e63ac6b95e9c31e2c146a37828f30..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/fixtures/mysql-ssl-ca-cert.pem
+++ /dev/null
@@ -1,20 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDQzCCAqygAwIBAgIJAOd1tlfiGoEoMA0GCSqGSIb3DQEBBQUAMHUxCzAJBgNV
-BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdTZWF0dGxlMRMw
-EQYDVQQKEwpBbWF6b24uY29tMQwwCgYDVQQLEwNSRFMxHDAaBgNVBAMTE2F3cy5h
-bWF6b24uY29tL3Jkcy8wHhcNMTAwNDA1MjI0NDMxWhcNMTUwNDA0MjI0NDMxWjB1
-MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHU2Vh
-dHRsZTETMBEGA1UEChMKQW1hem9uLmNvbTEMMAoGA1UECxMDUkRTMRwwGgYDVQQD
-ExNhd3MuYW1hem9uLmNvbS9yZHMvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
-gQDKhXGU7tizxUR5WaFoMTFcxNxa05PEjZaIOEN5ctkWrqYSRov0/nOMoZjqk8bC
-med9vPFoQGD0OTakPs0jVe3wwmR735hyVwmKIPPsGlaBYj1O6llIpZeQVyupNx56
-UzqtiLaDzh1KcmfqP3qP2dInzBfJQKjiRudo1FWnpPt33QIDAQABo4HaMIHXMB0G
-A1UdDgQWBBT/H3x+cqSkR/ePSIinPtc4yWKe3DCBpwYDVR0jBIGfMIGcgBT/H3x+
-cqSkR/ePSIinPtc4yWKe3KF5pHcwdTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh
-c2hpbmd0b24xEDAOBgNVBAcTB1NlYXR0bGUxEzARBgNVBAoTCkFtYXpvbi5jb20x
-DDAKBgNVBAsTA1JEUzEcMBoGA1UEAxMTYXdzLmFtYXpvbi5jb20vcmRzL4IJAOd1
-tlfiGoEoMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAvguZy/BDT66x
-GfgnJlyQwnFSeVLQm9u/FIvz4huGjbq9dqnD6h/Gm56QPFdyMEyDiZWaqY6V08lY
-LTBNb4kcIc9/6pc0/ojKciP5QJRm6OiZ4vgG05nF4fYjhU7WClUx7cxq1fKjNc2J
-UCmmYqgiVkAGWRETVo+byOSDZ4swb10=
------END CERTIFICATE-----
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/index.js b/node_modules/mysql2-promise/node_modules/mysql2/index.js
deleted file mode 100644
index 6509cde879fb016cb4a3ab5814512d28d590210c..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/index.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var Connection       = require('./lib/connection.js');
-var ConnectionConfig = require('./lib/connection_config.js');
-var SqlString        = require('./lib/sql_string.js');
-
-module.exports.createConnection = function(opts) {
-  return new Connection({config: new ConnectionConfig(opts)});
-};
-
-module.exports.connect = module.exports.createConnection;
-
-module.exports.Connection = Connection;
-module.exports.Types      = require('./lib/constants/types.js');
-
-module.exports.createPool = function(config) {
-  var PoolConfig = require('./lib/pool_config.js');
-  var Pool       = require('./lib/pool.js');
-  return new Pool({config: new PoolConfig(config)});
-};
-
-exports.createPoolCluster = function(config) {
-  var PoolCluster = require('./lib/pool_cluster.js');
-  return new PoolCluster(config);
-};
-
-module.exports.createServer = function() {
-  var Server = require('./lib/server.js');
-  return new Server();
-};
-
-exports.escape   = SqlString.escape;
-exports.escapeId = SqlString.escapeId;
-exports.format   = SqlString.format;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/auth_41.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/auth_41.js
deleted file mode 100644
index f55df869c5e45ca7f8008460305bb1ccd7e7c287..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/auth_41.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
-4.1 authentication: (http://bazaar.launchpad.net/~mysql/mysql-server/5.5/view/head:/sql/password.c)
-
-  SERVER:  public_seed=create_random_string()
-           send(public_seed)
-
-  CLIENT:  recv(public_seed)
-           hash_stage1=sha1("password")
-           hash_stage2=sha1(hash_stage1)
-           reply=xor(hash_stage1, sha1(public_seed,hash_stage2)
-
-           // this three steps are done in scramble()
-
-           send(reply)
-
-
-  SERVER:  recv(reply)
-           hash_stage1=xor(reply, sha1(public_seed,hash_stage2))
-           candidate_hash2=sha1(hash_stage1)
-           check(candidate_hash2==hash_stage2)
-
-server stores sha1(sha1(password)) ( hash_stag2)
-*/
-
-var crypto = require('crypto');
-
-function sha1(msg, msg1, msg2) {
-  var hash = crypto.createHash('sha1');
-  hash.update(msg);
-  if (msg1)
-    hash.update(msg1);
-  if (msg2)
-    hash.update(msg2);
-  return hash.digest();
-}
-
-function xor(a, b) {
-  if (!Buffer.isBuffer(a))
-    a = new Buffer(a, 'binary');
-  if (!Buffer.isBuffer(b))
-    b = new Buffer(b, 'binary');
-  var result = new Buffer(a.length);
-  for (var i = 0; i < a.length; i++) {
-    result[i] = (a[i] ^ b[i]);
-  }
-  return result;
-}
-
-function token(password, scramble1, scramble2) {
-  // TODO: use buffers (not sure why strings here)
-  if (!password) {
-    return new Buffer(0);
-  }
-  var stage1 = sha1(password);
-  return module.exports.calculateTokenFromPasswordSha(stage1, scramble1, scramble2);
-}
-
-module.exports.calculateTokenFromPasswordSha = function(passwordSha, scramble1, scramble2) {
-  var stage2 = sha1(passwordSha);
-  var stage3 = sha1(scramble1, scramble2, stage2);
-  return xor(stage3, passwordSha);
-};
-
-module.exports.calculateToken = token;
-
-module.exports.verifyToken = function(publicSeed1, publicSeed2, token, doubleSha) {
-  var hashStage1 =xor(token, sha1(publicSeed1, publicSeed2, doubleSha));
-  var candidateHash2 = sha1(hashStage1);
-  // TODO better way to compare buffers?
-  return candidateHash2.toString('hex') == doubleSha.toString('hex');
-}
-
-module.exports.doubleSha1 = function(password) {
-  return sha1(sha1(password));
-}
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/binlog_dump.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/binlog_dump.js
deleted file mode 100644
index 6812c2b0158aac6494e38a3125672b0ac1a828d9..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/binlog_dump.js
+++ /dev/null
@@ -1,104 +0,0 @@
-var Command  = require('./command');
-var util    = require('util');
-var CommandCode = require('../constants/commands');
-var Packets = require('../packets');
-
-function BinlogDump(opts)
-{
-  Command.call(this);
-  //this.onResult = callback;
-  this.opts = opts;
-}
-util.inherits(BinlogDump, Command);
-
-BinlogDump.prototype.start = function(packet, connection) {
-  var packet = new Packets.BinlogDump(this.opts);
-  connection.writePacket(packet.toPacket(1));
-  return BinlogDump.prototype.binlogData;
-};
-
-function BinlogEventHeader(packet) {
-  this.timestamp = packet.readInt32();
-  this.eventType = packet.readInt8();
-  this.serverId  = packet.readInt32();
-  this.eventSize = packet.readInt32();
-  this.logPos    = packet.readInt32();
-  this.flags     = packet.readInt16();
-}
-
-function RotateEvent(packet) {
-  this.pposition = packet.readInt32();
-  // TODO: read uint64 here
-  var positionDword2 = packet.readInt32();
-  this.nextBinlog = packet.readString();
-  this.name = 'RotateEvent';
-}
-
-function FormatDescriptionEvent(packet) {
-  this.binlogVersion = packet.readInt16();
-  this.serverVersion = packet.readString(50).replace(/\u0000.*/, '');
-  this.createTimestamp = packet.readInt32();
-  this.eventHeaderLength = packet.readInt8(); // should be 19
-  this.eventsLength  = packet.readBuffer();
-  this.name = 'FormatDescriptionEvent';
-}
-
-function QueryEvent(packet) {
-  
-  var parseStatusVars = require('../packets/binlog_query_statusvars.js');
-
-  this.slaveProxyId  = packet.readInt32();
-  this.executionTime = packet.readInt32();
-  var schemaLength  = packet.readInt8();
-  this.errorCode     = packet.readInt16();
-  var statusVarsLength = packet.readInt16();
-  var statusVars = packet.readBuffer(statusVarsLength);
-  
-  this.schema = packet.readString(schemaLength);
-  packet.readInt8(); // should be zero
-  this.statusVars = parseStatusVars(statusVars);
-  
-  this.query = packet.readString();
-  this.name = 'QueryEvent';
-}
-
-function XidEvent(packet) {
-  this.binlogVersion = packet.readInt16();
-  this.xid = packet.readInt64();
-  this.name = 'XidEvent';
-}
-
-var eventParsers = [];
-
-eventParsers[2]  = QueryEvent;
-eventParsers[4]  = RotateEvent;
-eventParsers[15] = FormatDescriptionEvent;
-eventParsers[16] = XidEvent;
-
-BinlogDump.prototype.binlogData = function(packet) {
-  // ok - continue consuming events
-  // error - error
-  // eof - end of binlog
-  if (packet.isEOF()) {
-    this.emit('eof');
-    return null;
-  }
-  
-  // binlog event header
-  var ok = packet.readInt8();
-  var header = new BinlogEventHeader(packet);
-  var EventParser = eventParsers[header.eventType];
-  var event;
-  if (EventParser)
-    event = new EventParser(packet);
-  else {
-    event = {
-      name: 'UNKNOWN'
-    }
-  }
-  event.header = header;
-  this.emit('event', event);
-  return BinlogDump.prototype.binlogData;
-};
-
-module.exports = BinlogDump;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/change_user.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/change_user.js
deleted file mode 100644
index 901c8b2fec938679637a36dac1caf27277d2d911..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/change_user.js
+++ /dev/null
@@ -1,45 +0,0 @@
-var util     = require('util');
-
-var Command  = require('./command.js');
-var Packets  = require('../packets/index.js');
-var ClientConstants = require('../constants/client.js');
-
-function ChangeUser(options, callback)
-{
-  this.onResult      = callback;
-  this._user          = options.user;
-  this._password      = options.password;
-  this._database      = options.database;
-  this._passwordSha1  = options.passwordSha1;
-  this._charsetNumber = options.charsetNumber;
-  this._currentConfig = options.currentConfig;
-  Command.call(this);
-}
-util.inherits(ChangeUser, Command);
-
-ChangeUser.prototype.start = function(packet, connection) {
-  var packet = new Packets.ChangeUser({
-    user            : this._user,
-    database        : this._database,
-    charsetNumber   : this._charsetNumber,
-    password        : this._password,
-    passwordSha1    : this._passwordSha1,
-    authPluginData1 : connection._handshakePacket.authPluginData1,
-    authPluginData2 : connection._handshakePacket.authPluginData2
-  });
-  this._currentConfig.user          = this._user;
-  this._currentConfig.password      = this._password;
-  this._currentConfig.database      = this._database;
-  this._currentConfig.charsetNumber = this._charsetNumber;
-  // reset prepared statements cache as all statements become invalid after changeUser
-  connection._statements = {};
-  connection.writePacket(packet.toPacket());
-  return ChangeUser.prototype.changeOk;
-};
-
-ChangeUser.prototype.changeOk = function(okPacket, connection) {
-  if (this.onResult)
-    this.onResult(null);
-  return null;
-};
-module.exports = ChangeUser;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/client_handshake.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/client_handshake.js
deleted file mode 100644
index dc1f86a83b25f214c11ed599c79686ebb55b3507..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/client_handshake.js
+++ /dev/null
@@ -1,100 +0,0 @@
-var util     = require('util');
-
-var Command  = require('./command.js');
-var Packets  = require('../packets/index.js');
-var ClientConstants = require('../constants/client.js');
-
-function ClientHandshake(clientFlags)
-{
-  this.handshake = null;
-  this.clientFlags = clientFlags;
-  Command.call(this);
-}
-util.inherits(ClientHandshake, Command);
-
-ClientHandshake.prototype.start = function() {
-  return ClientHandshake.prototype.handshakeInit;
-};
-
-ClientHandshake.prototype.sendSSLRequest = function(connection) {
-  var sslRequest = new Packets.SSLRequest(this.clientFlags);
-  connection.writePacket(sslRequest.toPacket());
-};
-
-function flagNames(flags) {
-  var res = [];
-  for (var c in ClientConstants) {
-    if (flags & ClientConstants[c])
-     res.push(c.replace(/_/g, ' ').toLowerCase());
-  }
-  return res;
-}
-
-ClientHandshake.prototype.sendCredentials = function(connection) {
-  if (connection.config.debug) {
-    console.log('Sending handshake packet: flags:%d=(%s)', this.clientFlags,
-      flagNames(this.clientFlags).join(', '));
-  }
-  var handshakeResponse = new Packets.HandshakeResponse({
-    flags   : this.clientFlags,
-    user    : connection.config.user,
-    database: connection.config.database,
-    password: connection.config.password,
-    passwordSha1   : connection.config.passwordSha1,
-    charsetNumber  : connection.config.charsetNumber,
-    authPluginData1: this.handshake.authPluginData1,
-    authPluginData2: this.handshake.authPluginData2,
-    compress: connection.config.compress
-  });
-  connection.writePacket(handshakeResponse.toPacket());
-};
-
-ClientHandshake.prototype.handshakeInit = function(helloPacket, connection) {
-  var command = this;
-
-  this.on('connect', function(connArgs) {
-    connection.emit('connect', connArgs);
-  });
-  this.on('error', function(err) {
-    connection._protocolError = err;
-    connection.emit('error', err);
-  });
-  this.handshake = Packets.Handshake.fromPacket(helloPacket);
-  if (connection.config.debug) {
-    console.log('Server hello packet: capability flags:%d=(%s)', this.handshake.capabilityFlags,
-      flagNames(this.handshake.capabilityFlags).join(', '));
-  }
-  connection.serverCapabilityFlags = this.handshake.capabilityFlags;
-  connection.connectionId = this.handshake.connectionId;
-  var serverSSLSupport = this.handshake.capabilityFlags & ClientConstants.SSL;
-
-  // use compression only if requested by client and supported by server
-  connection.config.compress = connection.config.compress && (this.handshake.capabilityFlags & ClientConstants.COMPRESS);
-  this.clientFlags = this.clientFlags | connection.config.compress;
-
-  if (connection.config.ssl) {
-    if (!serverSSLSupport)
-      command.emit('error', new Error('Server does not support secure connnection'));
-    // send ssl upgrade request and immediately upgrade connection to secure
-    this.clientFlags |= ClientConstants.SSL;
-    this.sendSSLRequest(connection);
-    connection.startTLS(function() {
-      // after connection is secure
-      command.sendCredentials(connection);
-    });
-  } else {
-    this.sendCredentials(connection);
-  }
-  return ClientHandshake.prototype.handshakeResult;
-};
-
-ClientHandshake.prototype.handshakeResult = function(okPacket, connection) {
-  // error is already checked in base class. Done auth.
-  connection.authorized = true;
-  if (connection.config.compress)
-    connection.packetParser.onPacket = connection.handleCompressedPacket.bind(connection);
-  // TODO any useful information in ok packet to pass as argument?
-  connection.emit('connect', true);
-  return null;
-};
-module.exports = ClientHandshake;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/close_statement.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/close_statement.js
deleted file mode 100644
index 3ec988a910b4b3230cf54fd1fd0fd42f97424c38..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/close_statement.js
+++ /dev/null
@@ -1,18 +0,0 @@
-var util    = require('util');
-
-var Command  = require('./command');
-var Packets  = require('../packets/index.js');
-
-function CloseStatement(id)
-{
-  Command.call(this);
-  this.id = id;
-}
-util.inherits(CloseStatement, Command);
-
-CloseStatement.prototype.start = function(packet, connection) {
-  connection.writePacket(new Packets.CloseStatement(this.id).toPacket(1));
-  return null;
-};
-
-module.exports = CloseStatement;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/command.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/command.js
deleted file mode 100644
index 62dd0bc199989e46a2e58bc8b151b61b7bdc5796..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/command.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var EventEmitter = require('events').EventEmitter;
-var util = require('util');
-
-function Command() {
-  EventEmitter.call(this);
-  this.next = null;
-}
-util.inherits(Command, EventEmitter);
-
-// slow. debug only
-Command.prototype.stateName = function() {
-  var state = this.next;
-  for (i in this)
-    if (this[i] == state && i != 'next')
-      return i;
-};
-
-Command.prototype.execute = function(packet, connection) {
-  // TODO: hack
-  if (!this.next) {
-    this.next = this.start;
-  }
-
-  if (packet && packet.isError()) {
-    var err = packet.asError();
-    if (this.onResult)
-      this.onResult(err);
-    else
-      this.emit('error', err);
-    return true;
-  }
-
-  // TODO: don't return anything from execute, it's ugly and error-prone. Listen for 'end' event in connection
-  this.next = this.next(packet, connection);
-  if (this.next) {
-    return false;
-  } else {
-    this.emit('end');
-    return true;
-  }
-};
-
-module.exports = Command;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/execute.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/execute.js
deleted file mode 100644
index 14071dc4a508ab5e497a990cc48ded291914ed74..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/execute.js
+++ /dev/null
@@ -1,86 +0,0 @@
-var util    = require('util');
-
-var Command  = require('./command.js');
-var Query    = require('./query.js');
-var Packets  = require('../packets/index.js');
-
-var compileParser = require('../compile_binary_parser.js');
-
-function Execute(options, callback)
-{
-  Command.call(this);
-  this.statement = options.statement;
-  this.sql      = options.sql;
-  this.values   = options.values;
-  this.onResult = callback;
-  this.parameters = options.values;
-
-  this.insertId = 0;
-
-  this._rows   = [];
-  this._fields = [];
-  this._result = [];
-  this._fieldCount = 0;
-  this._rowParser  = null;
-  this.options = options;
-  this._resultIndex = 0;
-  this._localStream = null;
-  this._streamFactory = options.infileStreamFactory;
-}
-util.inherits(Execute, Command);
-
-Execute.prototype.buildParserFromFields = function(fields, connection) {
-  var parserKey = connection.keyFromFields(fields, this.options);
-  var parser = connection.binaryProtocolParsers[parserKey];
-  if (!parser) {
-    parser = compileParser(fields, this.options, connection.config);
-    connection.binaryProtocolParsers[parserKey] = parser;
-  }
-  return parser;
-}
-
-Execute.prototype.start = function(packet, connection) {
-  var executePacket = new Packets.Execute(this.statement.id, this.parameters);
-  connection.writePacket(executePacket.toPacket(1));
-  return Execute.prototype.resultsetHeader;
-};
-
-Execute.prototype.done = Query.prototype.done;
-Execute.prototype.doneInsert = Query.prototype.doneInsert;
-Execute.prototype.resultsetHeader = Query.prototype.resultsetHeader;
-Execute.prototype._findOrCreateReadStream = Query.prototype._findOrCreateReadStream
-Execute.prototype._streamLocalInfile = Query.prototype._streamLocalInfile;
-Execute.prototype.row = Query.prototype.row;
-Execute.prototype.stream = Query.prototype.stream;
-
-Execute.prototype.readField = function(packet, connection) {
-  var def, fields;
-
-  // disabling for now, but would be great to find reliable way to parse fields only once
-  // fields reported by prepare can be empty at all or just incorrect - see #169
-  //
-  // perfomance optimisation: if we already have this field parsed in statement header, use one from header
-  //var field = this.statement.columns.length == this._fieldCount ?
-  //  this.statement.columns[this._receivedFieldsCount] : new Packets.ColumnDefinition(packet);
-
-  var field = new Packets.ColumnDefinition(packet);
-
-  this._receivedFieldsCount++;
-  this._fields[this._resultIndex].push(field);
-  if (this._receivedFieldsCount == this._fieldCount) {
-    fields = this._fields[this._resultIndex];
-    this.emit('fields', fields, this._resultIndex);
-    return Execute.prototype.fieldsEOF;
-  }
-  return Execute.prototype.readField;
-};
-
-Execute.prototype.fieldsEOF = function(packet, connection) {
-  // check EOF
-  if (!packet.isEOF())
-    return connection.protocolError("Expected EOF packet");
-  this._rowParser = this.buildParserFromFields(this._fields[this._resultIndex], connection)
-  return Execute.prototype.row;
-};
-
-module.exports = Execute;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/index.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/index.js
deleted file mode 100644
index 12ac9cf22a2b72f3986210ef3bc399ac30fee0ca..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-"client_handshake server_handshake query prepare close_statement execute ping register_slave binlog_dump change_user quit".split(' ').forEach(function(name) {
-  var ctor = require('./' + name + '.js');
-  module.exports[ctor.name] = ctor;
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/ping.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/ping.js
deleted file mode 100644
index 531c227312fe33fdedcdbbd4f38711283f22254d..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/ping.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var Command  = require('./command');
-var util    = require('util');
-var CommandCode = require('../constants/commands');
-var Packet = require('../packets/packet');
-
-// TODO: time statistics?
-// usefull for queue size and network latency monitoring
-// store created,sent,reply timestamps
-
-function Ping(callback)
-{
-  Command.call(this);
-  this.onResult = callback;
-}
-util.inherits(Ping, Command);
-
-Ping.prototype.start = function(packet, connection) {
-  var ping = new Packet(0, new Buffer([0, 0, 0, 0, CommandCode.PING]));
-  connection.writePacket(ping);
-  return Ping.prototype.pingResponse;
-};
-
-Ping.prototype.pingResponse = function(packet) {
-  // TODO: check it's OK packet. error check already done in caller
-  if (this.onResult)
-    process.nextTick(this.onResult.bind(this));
-  return null;
-};
-
-module.exports = Ping;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/prepare.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/prepare.js
deleted file mode 100644
index 982428a9afb4405bced60bcee3205218fc4aa341..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/prepare.js
+++ /dev/null
@@ -1,112 +0,0 @@
-var util    = require('util');
-
-var Packets        = require('../packets/index.js');
-var Command        = require('./command.js');
-var CloseStatement = require('./close_statement.js')
-var Execute        = require('./execute.js')
-
-function Prepare(options, callback)
-{
-  Command.call(this);
-  this.query = options.sql;
-  this.onResult = callback;
-
-  this.id = 0;
-  this.fieldCount = 0;
-  this.parameterCount = 0;
-  this.fields = [];
-  this.parameterDefinitions = [];
-  this.options = options;
-}
-util.inherits(Prepare, Command);
-
-Prepare.prototype.start = function(packet, connection) {
-  connection.writePacket(new Packets.PrepareStatement(this.query).toPacket(1));
-  return Prepare.prototype.prepareHeader;
-};
-
-function PreparedStatementInfo(query, id, columns, parameters, connection) {
-  this.query      = query;
-  this.id         = id;
-  this.columns    = columns;
-  this.parameters = parameters;
-  this.rowParser  = null;
-  this._connection = connection
-}
-
-PreparedStatementInfo.prototype.close = function() {
-  return this._connection.addCommand(new CloseStatement(this.id));
-};
-
-PreparedStatementInfo.prototype.execute = function(parameters, callback) {
-  if (typeof parameters == 'function') {
-    callback = parameters;
-    parameters = [];
-  }
-  return this._connection.addCommand(new Execute({ statement: this, values: parameters}, callback));
-};
-
-Prepare.prototype.prepareHeader = function(packet, connection) {
-  var header = new Packets.PreparedStatementHeader(packet);
-  this.id             = header.id;
-  this.fieldCount     = header.fieldCount;
-  this.parameterCount = header.parameterCount;
-  if (this.parameterCount > 0)
-    return Prepare.prototype.readParameter;
-  else if (this.fieldCount > 0)
-    return Prepare.prototype.readField;
-  else
-    return this.prepareDone(connection);
-};
-
-Prepare.prototype.readParameter = function(packet) {
-  var def = new Packets.ColumnDefinition(packet);
-  this.parameterDefinitions.push(def);
-  if (this.parameterDefinitions.length == this.parameterCount)
-    return Prepare.prototype.parametersEOF;
-  return this.readParameter;
-};
-
-Prepare.prototype.readField = function(packet, connection) {
-  var def = new Packets.ColumnDefinition(packet);
-  this.fields.push(def);
-  if (this.fields.length == this.fieldCount)
-    return Prepare.prototype.fieldsEOF;
-  return Prepare.prototype.readField;
-};
-
-Prepare.prototype.parametersEOF = function(packet, connection) {
-  if (!packet.isEOF())
-    return connection.protocolError("Expected EOF packet after parameters");
-  if (this.fieldCount > 0)
-    return Prepare.prototype.readField;
-  else
-    return this.prepareDone(connection);
-};
-
-Prepare.prototype.fieldsEOF = function(packet, connection) {
-  if (!packet.isEOF())
-    return connection.protocolError("Expected EOF packet after fields");
-  return this.prepareDone(connection);
-};
-
-Prepare.prototype.prepareDone = function(connection)
-{
-  var self = this;
-  if (this.onResult)
-    process.nextTick(function() {
-      self.onResult(
-        null,
-        new PreparedStatementInfo(
-          self.query,
-          self.id,
-          self.fields,
-          self.parameterDefinitions,
-          connection
-        )
-      );
-    });
-  return null;
-};
-
-module.exports = Prepare;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/query.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/query.js
deleted file mode 100644
index 08c722731841dd0998aad68559449464aca53895..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/query.js
+++ /dev/null
@@ -1,243 +0,0 @@
-var fs           = require('fs');
-var util         = require('util');
-
-var Readable     = require('readable-stream');
-
-var Command  = require('./command.js');
-var Packets  = require('../packets/index.js');
-var compileParser = require('../compile_text_parser.js');
-var ServerStatus = require('../constants/server_status.js');
-
-var EmptyPacket = new Packets.Packet(0, new Buffer(4), 0, 4);
-
-function Query(sql, options, callback)
-{
-  Command.call(this);
-  this.query = sql;
-  // node-mysql compatibility: query.sql as alias to query.query #121
-  this.sql = this.query;
-  this.options = options;
-  this.onResult = callback;
-  this._fieldCount = 0;
-  this._rowParser  = null;
-  this._fields     = [];
-  this._rows       = [];
-  this._receivedFieldsCount = 0;
-  this._resultIndex = 0;
-  this._localStream = null;
-  this._streamFactory = options.infileStreamFactory;
-  this._connection = null;
-}
-util.inherits(Query, Command);
-
-Query.prototype.start = function(packet, connection) {
-  if (connection.config.debug) {
-    console.log('        Sending query command: %s', this.query);
-  }
-  this._connection = connection;
-  var cmdPacket = new Packets.Query(this.query);
-  connection.writePacket(cmdPacket.toPacket(1));
-  return Query.prototype.resultsetHeader;
-};
-
-Query.prototype.done = function() {
-  var self = this;
-  if (this.onResult) {
-    var rows, fields;
-    if (this._resultIndex === 0) {
-      rows = this._rows[0];
-      fields = this._fields[0];
-    } else {
-      rows = this._rows;
-      fields = this._fields;
-    }
-    if (fields) {
-      process.nextTick(function() {
-        self.onResult(null, rows, fields, self._resultIndex + 1);
-      });
-    } else {
-      process.nextTick(function() {
-        self.onResult(null, rows, void(0), self._resultIndex + 1);
-      });
-    }
-  }
-  return null;
-};
-
-Query.prototype.doneInsert = function(rs) {
-  if (this._localStreamError) {
-    if (this.onResult) {
-      this.onResult(this._localStreamError, rs);
-    } else {
-      this.emit('error', this._localStreamError);
-    }
-    return null;
-  }
-  this._rows.push(rs);
-  this._fields.push(void(0));
-  this.emit('result', rs, this._resultIndex);
-  this.emit('fields', void(0), this._resultIndex);
-  if (rs.serverStatus & ServerStatus.SERVER_MORE_RESULTS_EXISTS) {
-    this._resultIndex++;
-    return this.resultsetHeader;
-  }
-  return this.done();
-};
-
-Query.prototype.resultsetHeader = function(packet, connection) {
-  var rs = new Packets.ResultSetHeader(packet, connection.config.bigNumberStrings);
-  this._fieldCount = rs.fieldCount;
-  if (connection.config.debug) {
-    console.log('        Resultset header received, expecting ' + rs.fieldCount + ' column definition packets');
-  }
-  if (this._fieldCount === 0) {
-    return this.doneInsert(rs);
-  }
-  if (this._fieldCount === null) {
-    this._localStream = this._findOrCreateReadStream(rs.infileName);
-    // start streaming, after last packet expect OK
-    this._streamLocalInfile(connection);
-    return this.infileOk;
-  }
-
-  this._receivedFieldsCount = 0;
-  this._rows.push([]);
-  this._fields.push([]);
-  return this.readField;
-};
-
-// some code taken from https://github.com/felixge/node-mysql/pull/668
-Query.prototype._findOrCreateReadStream = function(path) {
-  if (this._streamFactory)
-    return this._streamFactory(path);
-  return fs.createReadStream(path, {
-    'flag': 'r',
-    'encoding': null,
-    'autoClose': true
-  });
-};
-
-Query.prototype._streamLocalInfile = function(connection) {
-  var command = this;
-  connection.stream.on('pause', function() {
-    command._localStream.pause();
-  });
-  connection.stream.on('drain', function() {
-    command._localStream.resume();
-  });
-  this._localStream.on('data', function (data) {
-    var dataWithHeader = new Buffer(data.length + 4);
-    data.copy(dataWithHeader, 4);
-    connection.writePacket(new Packets.Packet(0, dataWithHeader, 0, dataWithHeader.length));
-  });
-  this._localStream.on('end', function (data) {
-    connection.writePacket(EmptyPacket);
-  });
-  this._localStream.on('error', function(err) {
-    command._localStreamError = err;
-    command._localStream.emit('end');
-  });
-}
-
-Query.prototype.readField = function(packet, connection) {
-
-  this._receivedFieldsCount++;
-
-  // Often there is much more data in the column definition than in the row itself
-  // If you set manually _fields[0] to array of ColumnDefinition's (from previous call)
-  // you can 'cache' result of parsing. Field packets still received, but ignored in that case
-  // this is the reason _receivedFieldsCount exist (otherwise we could just use current length of fields array)
-
-  if (this._fields[this._resultIndex].length != this._fieldCount) {
-    var field = new Packets.ColumnDefinition(packet);
-    this._fields[this._resultIndex].push(field);
-    if (connection.config.debug) {
-      console.log('        Column definition:');
-      console.log('          name: ' + field.name);
-      console.log('          type: ' + field.columnType);
-      console.log('         flags: ' + field.flags);
-    }
-  }
-
-  // last field received
-  if (this._receivedFieldsCount == this._fieldCount) {
-    var fields = this._fields[this._resultIndex];
-    this.emit('fields', fields, this._resultIndex);
-    var parserKey = connection.keyFromFields(fields, this.options);
-    this._rowParser = connection.textProtocolParsers[parserKey];
-    if (!this._rowParser) {
-      this._rowParser = compileParser(fields, this.options, connection.config);
-      connection.textProtocolParsers[parserKey] = this.rowParser;
-    }
-    return Query.prototype.fieldsEOF;
-  }
-  return Query.prototype.readField;
-};
-
-Query.prototype.fieldsEOF = function(packet, connection) {
-  // check EOF
-  if (!packet.isEOF())
-    return connection.protocolError("Expected EOF packet");
-  return this.row;
-};
-
-Query.prototype.row = function(packet)
-{
-  if (packet.isEOF()) {
-    var status = packet.eofStatusFlags();
-    var moreResults = status & ServerStatus.SERVER_MORE_RESULTS_EXISTS;
-    if (moreResults) {
-      this._resultIndex++;
-      return Query.prototype.resultsetHeader;
-    }
-    return this.done();
-  }
-
-  var row = new this._rowParser(packet);
-  if (this.onResult)
-    this._rows[this._resultIndex].push(row);
-  else
-    this.emit('result', row, this._resultIndex);
-
-  return Query.prototype.row;
-};
-
-Query.prototype.infileOk = function(packet, connection) {
-  var rs = new Packets.ResultSetHeader(packet, connection.config.bigNumberStrings);
-  return this.doneInsert(rs);
-};
-
-Query.prototype.stream = function(options) {
-  var self = this,
-      stream;
-
-  options = options || {};
-  options.objectMode = true;
-  stream = new Readable(options);
-
-  stream._read = function() {
-    self._connection && self._connection.resume();
-  };
-
-  this.on('result',function(row,i) {
-    if (!stream.push(row)) self._connection.pause();
-    stream.emit('result',row,i);  // replicate old emitter
-  });
-
-  this.on('error',function(err) {
-    stream.emit('error',err);  // Pass on any errors
-  });
-
-  this.on('end', function() {
-    stream.emit('close');  // notify readers that query has completed
-    stream.push(null);  // pushing null, indicating EOF
-  });
-
-  this.on('fields',function(fields,i) {
-    stream.emit('fields',fields,i);  // replicate old emitter
-  });
-
-  return stream;
-};
-
-module.exports = Query;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/quit.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/quit.js
deleted file mode 100644
index d21846c7c20b34b99c6373e710074b6995b7cb9a..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/quit.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var util        = require('util');
-var Command     = require('./command.js');
-var CommandCode = require('../constants/commands.js');
-var Packet      = require('../packets/packet.js');
-
-function Quit(callback)
-{
-  this.done = callback;
-  Command.call(this);
-}
-util.inherits(Quit, Command);
-
-Quit.prototype.start = function(packet, connection) {
-  connection._closing = true;
-  var quit = new Packet(0, new Buffer([0, 0, 0, 0, CommandCode.QUIT]));
-  if (this.done)
-    this.done();
-  connection.writePacket(quit);
-  return null;
-};
-
-module.exports = Quit;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/register_slave.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/register_slave.js
deleted file mode 100644
index 19304f678af5a3638fb964d86af2297c1eed0a3f..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/register_slave.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var Command  = require('./command');
-var util    = require('util');
-var CommandCode = require('../constants/commands');
-var Packets = require('../packets');
-
-function RegisterSlave(opts, callback)
-{
-  Command.call(this);
-  this.onResult = callback;
-  this.opts = opts;
-}
-util.inherits(RegisterSlave, Command);
-
-RegisterSlave.prototype.start = function(packet, connection) {
-  var packet = new Packets.RegisterSlave(this.opts);
-  connection.writePacket(packet.toPacket(1));
-  return RegisterSlave.prototype.registerResponse;
-};
-
-RegisterSlave.prototype.registerResponse = function(packet) {
-  if (this.onResult)
-    process.nextTick(this.onResult.bind(this));
-  return null;
-};
-
-module.exports = RegisterSlave;
\ No newline at end of file
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/server_handshake.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/server_handshake.js
deleted file mode 100644
index 3eebba968a03af6c4faf3ca0d05b2ffc99253702..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/commands/server_handshake.js
+++ /dev/null
@@ -1,132 +0,0 @@
-var util     = require('util');
-
-var ClientConstants = require('../constants/client.js');
-var CommandCode     = require('../constants/commands.js');
-
-var Command  = require('./command.js');
-var Packets  = require('../packets/index.js');
-var auth41   = require('../auth_41.js');
-
-function ServerHandshake(args)
-{
-  Command.call(this);
-  this.args = args;
-  /*
-  this.protocolVersion = args.protocolVersion || 10;
-  this.serverVersion   = args.serverVersion;
-  this.connectionId    = args.connectionId,
-  this.statusFlags     = args.statusFlags,
-  this.characterSet    = args.characterSet,
-  this.capabilityFlags = args.capabilityFlags || 512;
-  */
-}
-util.inherits(ServerHandshake, Command);
-
-ServerHandshake.prototype.start = function(packet, connection) {
-  var serverHelloPacket = new Packets.Handshake(this.args);
-  this.serverHello = serverHelloPacket;
-  serverHelloPacket.setScrambleData(function(err) {
-    if (err)
-      return connection.emit('error', new Error('Error generating random bytes'));
-    connection.writePacket(serverHelloPacket.toPacket(0));
-  });
-  return ServerHandshake.prototype.readClientReply;
-};
-
-ServerHandshake.prototype.readClientReply = function(packet, connection) {
-  // check auth here
-  var clientHelloReply = new Packets.HandshakeResponse.fromPacket(packet);
-  if (this.args.authCallback) {
-    try {
-      this.args.authCallback({
-        user: clientHelloReply.user,
-        database: clientHelloReply.database,
-        address: connection.stream.remoteAddress,
-        authPluginData1: this.serverHello.authPluginData1,
-        authPluginData2: this.serverHello.authPluginData2,
-        authToken: clientHelloReply.authToken,
-      }, function(err, mysqlError) {
-        //if (err)
-        if (!mysqlError)
-          connection.writeOk();
-        else {
-          // TODO create constants / errorToCode
-          // 1045 = ER_ACCESS_DENIED_ERROR
-          connection.writeError({ message: mysqlError.message || '',  code: mysqlError.code || 1045 });
-          connection.close();
-        }
-      });
-    } catch(err) {
-      throw err;
-      // TODO
-      // connection.writeError(err)
-    }
-  } else {
-    connection.writeOk();
-  }
-  return ServerHandshake.prototype.dispatchCommands;
-};
-
-ServerHandshake.prototype.dispatchCommands = function(packet, connection) {
-  // command from client to server
-  var commandCode = packet.readInt8();
-  switch (commandCode) {
-  case CommandCode.QUIT:
-    connection.emit('quit');
-    // connection.stream.end();
-    break;
-  case CommandCode.INIT_DB:
-    var schemaName = packet.readString();
-    connection.emit('init_db', schemaName);
-    connection.writeOk();
-    break;
-  case CommandCode.PING:
-    // allow custom ping response (delayed/incorrect/etc)
-    // if no listeners, respond with OK
-    if (connection.listeners('ping').length === 0) {
-      connection.writeOk();
-    } else {
-      connection.emit('ping');
-    }
-    break;
-  case CommandCode.QUERY:
-    var query = packet.readString();
-    connection.emit('query', query);
-    break;
-  case CommandCode.FIELD_LIST:
-    var table = packet.readNullTerminatedString();
-    var fields = packet.readString();
-    connection.emit('field_list', table, fields);
-    break;
-  default:
-    console.log('Unknown command:', commandCode);
-  }
-  return ServerHandshake.prototype.dispatchCommands;
-};
-
-module.exports = ServerHandshake;
-
-// TODO: implement server-side 4.1 authentication
-/*
-4.1 authentication: (http://bazaar.launchpad.net/~mysql/mysql-server/5.5/view/head:/sql/password.c)
-
-  SERVER:  public_seed=create_random_string()
-           send(public_seed)
-
-  CLIENT:  recv(public_seed)
-           hash_stage1=sha1("password")
-           hash_stage2=sha1(hash_stage1)
-           reply=xor(hash_stage1, sha1(public_seed,hash_stage2)
-
-           // this three steps are done in scramble()
-
-           send(reply)
-
-
-  SERVER:  recv(reply)
-           hash_stage1=xor(reply, sha1(public_seed,hash_stage2))
-           candidate_hash2=sha1(hash_stage1)
-           check(candidate_hash2==hash_stage2)
-
-server stores sha1(sha1(password)) ( hash_stag2)
-*/
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/compile_binary_parser.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/compile_binary_parser.js
deleted file mode 100644
index 9e972394244daf7d1c1deefdb2723a7977f8c1a4..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/compile_binary_parser.js
+++ /dev/null
@@ -1,137 +0,0 @@
-var vm = require('vm');
-
-var FieldFlags = require('./constants/field_flags.js');
-var Charsets   = require('./constants/charsets.js');
-var Types      = require('./constants/types.js');
-var srcEscape  = require('./helpers').srcEscape;
-
-var typeNames = [];
-for (var t in Types) {
-  typeNames[Types[t]] = t;
-}
-
-function compile(fields, options, config) {
-  var result = [];
-  var i=0;
-  var nullBitmapLength = Math.floor((fields.length + 7 + 2) / 8);
-  result.push('(function(){ return function BinaryRow(packet) {');
-
-  if (options.rowsAsArray)
-    result.push('  var result = new Array(' + fields.length + ');');
-
-  var resultTables = {};
-  var resultTablesArray = [];
-
-  if (options.nestTables === true) {
-    for (i = 0; i < fields.length; i++) {
-      resultTables[fields[i].table] = 1;
-    }
-    resultTablesArray = Object.keys(resultTables);
-    for (i = 0; i < resultTablesArray.length; i++) {
-      result.push('  this[' + srcEscape(resultTablesArray[i]) + '] = {};');
-    }
-  }
-
-  result.push('  var statusByte = packet.readInt8();');
-  for (i=0; i < nullBitmapLength; ++i)
-    result.push('  var nullBitmaskByte' + i + ' = packet.readInt8();');
-
-  var lvalue = '';
-  var currentFieldNullBit = 4;
-  var nullByteIndex = 0;
-  var fieldName = '';
-  var tableName = '';
-
-  for (i = 0; i < fields.length; i++) {
-    fieldName = srcEscape(fields[i].name);
-    result.push('  // ' + fieldName + ': '+ typeNames[fields[i].columnType]);
-
-    if (typeof options.nestTables == 'string') {
-      tableName = srcEscape(fields[i].table);
-      lvalue = ['  this[', srcEscape(fields[i].table + options.nestTables + fields[i].name), ']'].join('');
-    } else if (options.nestTables === true) {
-      tableName = srcEscape(fields[i].table);
-      lvalue = ['  this[', tableName, '][', fieldName, ']'].join('');
-    } else if (options.rowsAsArray) {
-      lvalue = '  result[' + i.toString(10) + ']';
-    } else
-      lvalue = '  this[' + srcEscape(fields[i].name) + ']';
-
-    // TODO: this used to be an optimisation ( if column marked as NOT_NULL don't include code to check null
-    // bitmap at all, but it seems that we can't rely on this flag, see #178
-    // TODO: benchmark performance difference
-    //
-    //if (fields[i].flags & FieldFlags.NOT_NULL) { // don't need to check null bitmap if field can't be null.
-    //  result.push(lvalue + ' = ' + readCodeFor(fields[i], config));
-    //} else if (fields[i].columnType == Types.NULL) {
-    //  result.push(lvalue + ' = null;');
-    //} else {
-      result.push('  if (nullBitmaskByte' + nullByteIndex  + ' & ' + currentFieldNullBit + ')');
-      result.push('  ' + lvalue + ' = null;');
-      result.push('  else');
-      result.push('  ' + lvalue + ' = ' + readCodeFor(fields[i], config));
-    //}
-    currentFieldNullBit *= 2;
-    if (currentFieldNullBit == 0x100)
-    {
-      currentFieldNullBit = 1;
-      nullByteIndex++;
-    }
-  }
-
-  if (options.rowsAsArray)
-    result.push('  return result;');
-
-  result.push('}; })()');
-  var src = result.join('\n');
-  if (config.debug) {
-    console.log('Compiled binary protocol row parser:');
-    var cardinal = require('cardinal');
-    console.log(cardinal.highlight(src));
-  }
-  return vm.runInThisContext(src);
-}
-
-function readCodeFor(field, config) {
-  var unsigned = field.flags & FieldFlags.UNSIGNED;
-  switch(field.columnType) {
-  case Types.TINY:
-    return unsigned ? "packet.readInt8();" : "packet.readSInt8();";
-  case Types.SHORT:
-    return unsigned ? "packet.readInt16();" : "packet.readSInt16();";
-  case Types.LONG:
-  case Types.INT24: // in binary protocol int24 is encoded in 4 bytes int32
-    return unsigned ? "packet.readInt32();" : "packet.readSInt32();";
-  case Types.YEAR:
-    return "packet.readInt16()";
-  case Types.FLOAT:
-    return "packet.readFloat();";
-  case Types.DOUBLE:
-    return "packet.readDouble();";
-  case Types.NULL:
-    return "null;";
-  case Types.DATE:
-  case Types.DATETIME:
-  case Types.TIMESTAMP:
-  case Types.NEWDATE:
-    if (config.dateStrings)
-      return "packet.readDateTimeString();";
-    return "packet.readDateTime();";
-  case Types.TIME:
-    return "packet.readTimeString()";
-  case Types.DECIMAL:
-  case Types.NEWDECIMAL:
-    return "packet.readLengthCodedString();";
-  case Types.GEOMETRY:
-    return "packet.parseGeometryValue();";
-  case Types.LONGLONG: // TODO: 8 bytes. Implement as two 4 bytes read for now (it's out of JavaScript int precision!)
-    return unsigned ? "packet.readInt64();" : "packet.readSInt64();";
-  default:
-    if (field.characterSet == Charsets.BINARY)
-      return "packet.readLengthCodedBuffer();";
-    else
-      return "packet.readLengthCodedString();";
-  }
-}
-
-module.exports = compile;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/compile_text_parser.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/compile_text_parser.js
deleted file mode 100644
index f2fbfcf09be77a1e7995520419f7236b811223ae..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/compile_text_parser.js
+++ /dev/null
@@ -1,108 +0,0 @@
-var Types = require('./constants/types');
-var Charsets = require('./constants/charsets');
-var vm = require('vm');
-var srcEscape = require('./helpers').srcEscape;
-
-var typeNames = [];
-for (var t in Types) {
-  typeNames[Types[t]] = t;
-}
-
-function compile(fields, options, config) {
-
-  var result = [];
-  var i=0;
-  var lvalue = '';
-
-  result.push('(function() { return function TextRow(packet) {');
-  if (options.rowsAsArray)
-    result.push('  var result = new Array(' + fields.length + ')');
-
-  var resultTables = {};
-  var resultTablesArray = [];
-
-  if (options.nestTables === true) {
-    for (i = 0; i < fields.length; i++) {
-      resultTables[fields[i].table] = 1;
-    }
-    resultTablesArray = Object.keys(resultTables);
-    for (i = 0; i < resultTablesArray.length; i++) {
-      result.push('  this[' + srcEscape(resultTablesArray[i]) + '] = {};');
-    }
-  }
-
-  var fieldName = '';
-  var tableName = '';
-  for (i = 0; i < fields.length; i++) {
-    fieldName = srcEscape(fields[i].name);
-    result.push('  // ' + fieldName + ': '+ typeNames[fields[i].columnType]);
-    if (typeof options.nestTables == 'string') {
-      tableName = srcEscape(fields[i].table);
-      lvalue = ['  this[', srcEscape(fields[i].table + options.nestTables + fields[i].name), ']'].join('');
-    } else if (options.nestTables === true) {
-      tableName = srcEscape(fields[i].table);
-      lvalue = ['  this[', tableName, '][', fieldName, ']'].join('');
-    } else if (options.rowsAsArray) {
-      lvalue = '  result[' + i.toString(10) + ']';
-    } else
-      lvalue = '  this[' + srcEscape(fields[i].name) + ']';
-    result.push(lvalue + ' = ' + readCodeFor(fields[i].columnType, fields[i].characterSet, config));
-  }
-
-  if (options.rowsAsArray)
-    result.push('  return result;');
-
-  result.push('};})()');
-  var src = result.join('\n');
-  if (config.debug) {
-    console.log('        Compiled text protocol row parser:\n\n');
-    var cardinal = require('cardinal');
-    console.log(cardinal.highlight(src) + '\n\n');
-  }
-  return vm.runInThisContext(src);
-}
-
-function readCodeFor(type, charset, config) {
-  switch(type) {
-  case Types.TINY:
-  case Types.SHORT:
-  case Types.LONG:
-  case Types.INT24:
-  case Types.YEAR:
-  case Types.LONG:
-    return "packet.parseLengthCodedInt();";
-  case Types.LONGLONG:
-    if (config.supportBigNumbers && config.bigNumberStrings) {
-      return "packet.parseLengthCodedIntString();";
-    }
-    return "packet.parseLengthCodedInt();";
-  case Types.FLOAT:
-  case Types.DOUBLE:
-    return "packet.parseLengthCodedFloat();";
-  case Types.NULL:
-    return "null; packet.skip(1);";
-  case Types.DECIMAL:
-  case Types.NEWDECIMAL:
-    return "packet.readLengthCodedString(); //" + type + ' ' + charset;
-  case Types.DATE:
-    if (config.dateStrings)
-      return "packet.readLengthCodedString()";
-    return "packet.parseDate();";
-  case Types.DATETIME:
-  case Types.TIMESTAMP:
-    if (config.dateStrings)
-      return "packet.readLengthCodedString()";
-    return "packet.parseDateTime();";
-  case Types.TIME:
-    return "packet.readLengthCodedString()";
-  case Types.GEOMETRY:
-    return "packet.parseGeometryValue();";
-  default:
-    if (charset == Charsets.BINARY)
-      return "packet.readLengthCodedBuffer();";
-    else
-      return "packet.readLengthCodedString(); //" + type + ' ' + charset;
-  }
-}
-
-module.exports = compile;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/connection.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/connection.js
deleted file mode 100644
index 4697945db56a435379c1afe1a8460299ebb6d05b..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/connection.js
+++ /dev/null
@@ -1,672 +0,0 @@
-var net          = require('net');
-var util         = require('util');
-var EventEmitter = require('events').EventEmitter;
-var Queue        = require('double-ended-queue');
-
-var PacketParser = require('./packet_parser.js');
-var Packet       = require('./packets/packet.js');
-var Packets      = require('./packets/index.js');
-var Commands     = require('./commands/index.js');
-var SqlString    = require('./sql_string.js');
-var ConnectionConfig = require('./connection_config.js');
-
-var _connectionId = 0;
-var noop = function() {};
-
-function Connection(opts)
-{
-  EventEmitter.call(this);
-  this.config = opts.config;
-
-  // TODO: fill defaults
-  // if no params, connect to /var/lib/mysql/mysql.sock ( /tmp/mysql.sock on OSX )
-  // if host is given, connect to host:3306
-
-  // TODO: use `/usr/local/mysql/bin/mysql_config --socket` output? as default socketPath
-  // if there is no host/port and no socketPath parameters?
-
-  if (!opts.config.stream) {
-    if (opts.config.socketPath)
-      this.stream = net.connect(opts.config.socketPath);
-    else
-      this.stream = net.connect(opts.config.port, opts.config.host);
-  } else {
-    // if stream is a function, treat it as "stream agent / factory"
-    if (typeof opts.config.stream == 'function')
-      this.stream = opts.config.stream(opts);
-    else
-      this.stream = opts.config.stream;
-  }
-  this._internalId = _connectionId++;
-
-  this._commands = new Queue();
-  this._command = null;
-
-  this._paused = false;
-  this._paused_packets = new Queue();
-
-  this._statements = {};
-
-  // TODO: make it lru cache
-  // https://github.com/mercadolibre/node-simple-lru-cache
-  // or https://github.com/rsms/js-lru
-  // or https://github.com/monsur/jscache
-  // or https://github.com/isaacs/node-lru-cache
-  //
-  // key is field.name + ':' + field.columnType + ':' field.flags + '/'
-  this.textProtocolParsers = {};
-
-  // TODO: not sure if cache should be separate (same key as with textProtocolParsers)
-  // or part of prepared statements cache (key is sql query)
-  this.binaryProtocolParsers = {};
-
-  this.serverCapabilityFlags = 0;
-  this.authorized = false;
-
-  var connection = this;
-  this.sequenceId = 0;
-
-  this.threadId = null;
-  this._handshakePacket = null;
-
-  this.stream.on('error', function(err) {
-    connection.emit('error', err);
-  });
-
-  // big TODO: benchmark if it all worth using 'ondata' and onPacket callbacks directly
-  // compositing streams would be much more easier.
-  // also, look for existing length-prefixed streams to reuse instead of packet_parser
-  //  https://github.com/squaremo/node-spb - currently only fixed 4 byte prefix
-  //  ...?
-
-  // see https://gist.github.com/khoomeister/4985691#use-that-instead-of-bind
-  this.packetParser = new PacketParser(function(p) { connection.handlePacket(p); });
-
-  // TODO: this code used to be an optimized version of handler
-  // DOES NOT WORK IN NODE 11
-  // TODO: measure if we actually get something here
-  // if yes, re-enable for node 10
-  //if (this.stream instanceof net.Stream) {
-  //  this.stream.ondata = function(data, start, end) {
-  //    connection.packetParser.execute(data, start, end);
-  //  };
-  //} else {
-    this.stream.on('data', function(data) {
-      connection.packetParser.execute(data);
-    });
-  //}
-  this._protocolError = null;
-  this.stream.on('end', function() {
-    // we need to set this flag everywhere where we want connection to close
-    if (connection._closing)
-      return;
-
-    // TODO: move to protocolError()
-    if (!connection._protocolError) // no particular error message before disconnect
-      connection._protocolError = 'PROTOCOL_CONNECTION_LOST';
-    var err = new Error('Connection lost: The server closed the connection.');
-    err.fatal = true;
-    err.code = connection._protocolError;
-
-    var command;
-    if (connection._command && connection._command.onResult)
-      connection._command.onResult(err);
-    while (command = connection._commands.shift()) {
-      if (command.onResult)
-         command.onResult(err);
-    }
-
-    connection.emit('error', err);
-
-  });
-  var handshakeCommand;
-  if (!this.config.isServer) {
-    handshakeCommand = new Commands.ClientHandshake(this.config.clientFlags);
-    handshakeCommand.on('error', function(e) { connection.emit('error', e); });
-    handshakeCommand.on('end', function() {
-      connection._handshakePacket = handshakeCommand.handshake;
-      connection.threadId = handshakeCommand.handshake.connectionId;
-    });
-    this.addCommand(handshakeCommand);
-  }
-}
-util.inherits(Connection, EventEmitter);
-
-Connection.prototype.write = function(buffer) {
-  this.stream.write(buffer);
-};
-
-// TODO: replace function in runtime instead of having if() here
-// Needs benchmark.
-Connection.prototype.writePacket = function(packet) {
-  packet.writeHeader(this.sequenceId);
-  if (this.config.debug) {
-    console.log(this._internalId + ' ' + this.connectionId + ' <== ' + this._command._commandName + '#' + this._command.stateName() + '(' + [this.sequenceId, packet._name, packet.length()].join(',') + ')');
-  }
-  this.sequenceId++;
-  if (this.sequenceId == 256)
-    this.sequenceId = 0
-  if (!this.config.compress || !this.authorized) {
-    this.write(packet.buffer);
-  } else {
-    var packetLen = packet.length();
-    var compressHeader = new Buffer(7);
-
-    // TODO: currently all outgoing packets are sent uncompressed (header + deflated length=0 as uncompressed flag)
-    // Need to implement deflation of outgoing packet. Also need to decide when not to compress small packets
-    // http://dev.mysql.com/doc/internals/en/compression.html#uncompressed-payload suggest not to compress packets less than 50 bytes
-
-    // Write uncompressed packet
-    compressHeader.fill(0);
-    compressHeader.writeUInt8(packetLen & 0xff, 0);
-    compressHeader.writeUInt16LE(packetLen >> 8, 1);
-    this.write(compressHeader);
-    this.write(packet.buffer);
-  }
-};
-
-Connection.prototype.startTLS = function(onSecure) {
-  if (this.config.debug) {
-    console.log('Upgrading connection to TLS');
-  }
-  var connection = this;
-  var crypto = require('crypto');
-  var tls = require('tls');
-  var config = this.config;
-  var stream = this.stream;
-
-  var credentials = crypto.createCredentials({
-    key: config.ssl.key,
-    cert: config.ssl.cert,
-    passphrase: config.ssl.passphrase,
-    ca: config.ssl.ca
-  });
-  var securePair = tls.createSecurePair(credentials, false);
-  if (stream.ondata)
-    stream.ondata = null;
-  stream.removeAllListeners('data');
-  stream.pipe(securePair.encrypted);
-  securePair.encrypted.pipe(stream);
-  securePair.cleartext.on('data', function(data) {
-    connection.packetParser.execute(data);
-  });
-  connection.write = function(buffer) {
-    securePair.cleartext.write(buffer);
-  };
-  securePair.on('secure', onSecure);
-};
-
-// TODO: this does not work if uncompressed packet is split by compressed
-// packet boundary.
-// My assumption about compressedPacket to contain one or more complete
-// compressed packets was wrong. It can wrap any chunk of data.
-// This will be rmoved in favor of connection.startInflate
-// currently Handshake command overwrites connection.handlePacket with handleCompressedPacket
-// before expecting first compressed packet
-var zlib = require('zlib');
-Connection.prototype.handleCompressedPacket = function(packet) {
-  var connection = this;
-  var inflatedLength = packet.readInt24();
-  if (inflatedLength !== 0) {
-    var compressedBody = packet.readBuffer(packet.length() - 3);
-    zlib.inflate(compressedBody, function(err, packets) {
-      if (err)
-        return connection.emit('error', err);
-      var offset = packets.offset;
-      var end = offset + packets.length;
-      var buffer = packets.parent;
-      var len = 0;
-      var id = 0;
-      // single compressed packet can contain multiple uncompressed
-      while (offset < end) {
-        len = buffer.readUInt16LE(offset) + (buffer[offset+2] << 16);
-        id  = buffer[offset+3];
-        connection.handlePacket(new Packet(id, buffer, offset + 4, offset + 4 + len));
-        offset += 4 + len;
-      }
-    });
-  } else {
-    inflatedLength = packet.readInt24();
-    var sequenceId = packet.readInt8();
-    connection.handlePacket(new Packet(sequenceId, packet.buffer, packet.offset, packet.offset + inflatedLength));
-  }
-};
-
-// TODO: consider using @creationix simple-streams
-// https://gist.github.com/creationix/5498108
-// https://github.com/creationix/min-stream-uv
-// https://github.com/creationix/min-stream-helpers
-
-
-// TODO: try with Stream2 streams
-//
-// changes stream -> packetParser to
-// stream -> compressedPacketParser -> inflateStream -> packetParser
-// note that in the caseof ssl this should become
-// stream -> securePair.encrypted -> securePair.cleartext -> compressedPacketParser -> inflateStream -> packetParser
-Connection.prototype.startInflate = function() {
-  var connection = this;
-  var zlib = require('zlib');
-  var inflateStream = zlib.createInflate();
-  var uncompressedPacketParser = connection.packetParser;
-  connection.packetParser = new PacketParser(function(packet) {
-    var inflatedLength = packet.readInt24();
-    if (inflatedLength !== 0) {
-      inflateStream.write(packet.readBuffer(packet.length() - 3));
-    } else {
-      uncompressedPacketParser.execute(packet.buffer, packet.offset, packet.end);
-    }
-  });
-  inflateStream.on('data', function(buff) {
-    uncompressedPacketParser.execute(buff.parent, buff.offset, buff.offset + buff.length);
-  });
-  if (this.stream.ondata)
-    this.stream.ondata = null;
-  this.stream.removeAllListeners('data');
-  this.pipe();
-};
-
-Connection.prototype.pipe = function() {
-  var connection = this;
-  if (this.stream instanceof net.Stream) {
-    this.stream.ondata = function(data, start, end) {
-      connection.packetParser.execute(data, start, end);
-    };
-  } else {
-    this.stream.on('data', function(data) {
-      connection.packetParser.execute(data.parent, data.offset, data.offset + data.length);
-    });
-  }
-};
-
-Connection.prototype.protocolError = function(message, code) {
-  var err = new Error(message);
-  err.fatal = true;
-  err.code = code || 'PROTOCOL_ERROR';
-  this.emit('error', err);
-}
-
-Connection.prototype.handlePacket = function(packet) {
-
-  if (this._paused)
-  {
-    this._paused_packets.push(packet);
-    return;
-  }
-
-  // TODO: check packet sequenceId here
-  if (packet)
-    this.sequenceId = packet.sequenceId + 1;
-  if (this.config.debug) {
-    if (packet) {
-      console.log(this._internalId + ' ' + this.connectionId + ' ==> ' + this._command._commandName + '#' + this._command.stateName() + '(' + [packet.sequenceId, packet.type(), packet.length()].join(',') + ')');
-      console.log(' raw: ' + packet.buffer.slice(packet.offset, packet.offset + packet.length()).toString('hex'));
-    }
-  }
-  if (!this._command) {
-    this.protocolError('Unexpected packet while no commands in the queue', 'PROTOCOL_UNEXPECTED_PACKET');
-    return this.close();
-  }
-  var done = this._command.execute(packet, this);
-  if (done) {
-    this.sequenceId = 0;
-    this._command = this._commands.shift();
-    if (this._command)
-      this.handlePacket();
-  }
-};
-
-Connection.prototype.addCommand = function(cmd) {
-  if (this.config.debug) {
-    console.log('Add command: ' + arguments.callee.caller.name);
-    cmd._commandName = arguments.callee.caller.name;
-  }
-  if (!this._command) {
-    this._command = cmd;
-    this.handlePacket();
-  } else {
-    this._commands.push(cmd);
-  }
-  return cmd;
-};
-
-Connection.prototype.format = function(sql, values) {
-  if (typeof this.config.queryFormat == "function") {
-    return this.config.queryFormat.call(this, sql, values, this.config.timezone);
-  }
-  var opts = {
-    sql: sql,
-    values: values
-  };
-  this._resolveNamedPlaceholders(opts);
-  return SqlString.format(opts.sql, opts.values, this.config.stringifyObjects, this.config.timezone);
-};
-
-Connection.prototype.escape = function(value) {
-  return SqlString.escape(value, false, this.config.timezone);
-};
-
-Connection.prototype.escapeId = function escapeId(value) {
-  return SqlString.escapeId(value, false);
-};
-
-function _domainify(callback) {
-  var domain = process.domain;
-  if (domain && callback)
-    return process.domain.bind(callback);
-  else
-    return callback;
-}
-
-var convertNamedPlaceholders = null;
-Connection.prototype._resolveNamedPlaceholders = function(options) {
-  var unnamed;
-  if (this.config.namedPlaceholders || options.namedPlaceholders) {
-    if (convertNamedPlaceholders === null)
-      convertNamedPlaceholders = require('named-placeholders')();
-    unnamed = convertNamedPlaceholders(options.sql, options.values);
-    options.sql = unnamed[0];
-    options.values = unnamed[1];
-  }
-};
-
-Connection.prototype.query = function query(sql, values, cb) {
-  // copy-paste from node-mysql/lib/Connection.js:createQuery
-  var options = {};
-  if (typeof sql === 'object') {
-    // query(options, cb)
-    options = sql;
-    if (typeof values === 'function') {
-      cb = values;
-    } else {
-      options.values = values;
-    }
-  } else if (typeof values === 'function') {
-    // query(sql, cb)
-    cb             = values;
-    options.sql    = sql;
-    options.values = undefined;
-  } else {
-    // query(sql, values, cb)
-    options.sql    = sql;
-    options.values = values;
-  }
-
-  this._resolveNamedPlaceholders(options);
-  var rawSql = this.format(options.sql, options.values || []);
-  return this.addCommand(new Commands.Query(rawSql, options, _domainify(cb)));
-};
-
-Connection.prototype.pause = function pause() {
-  this._paused = true;
-  this.stream.pause();
-};
-
-Connection.prototype.resume= function resume() {
-  var packet;
-  this._paused = false;
-  while( packet = this._paused_packets.shift() ) {
-    this.handlePacket(packet);
-    // don't resume if packet hander paused connection
-    if (this._paused)
-      return;
-  }
-  this.stream.resume();
-};
-
-Connection.prototype.keyFromFields = function keyFromFields(fields, options) {
-  var res = (typeof options.nestTables) + '/' + options.nestTables + '/' + options.rowsAsHash;
-  for (var i=0; i < fields.length; ++i)
-    res += '/' + fields[i].name + ':' + fields[i].columnType + ':' + fields[i].flags;
-  return res;
-}
-
-function statementKey(options) {
-  return (typeof options.nestTables) +
-    '/' + options.nestTables + '/' + options.rowsAsHash + options.sql;
-}
-
-// TODO: named placeholders support
-Connection.prototype.prepare = function prepare(options, cb) {
-  if (typeof options == 'string')
-    options = { sql: options };
-  return this.addCommand(new Commands.Prepare(options, _domainify(cb)));
-};
-
-Connection.prototype.unprepare = function execute(sql) {
-  var options = {};
-  if (typeof sql === 'object') {
-    options = sql;
-  } else
-    options.sql    = sql;
-  var key  = statementKey(options);
-  var stmt = this._statements[key];
-  if (stmt) {
-    this._statements[key] = null;
-    stmt.close();
-  }
-  return stmt;
-};
-
-Connection.prototype.execute = function execute(sql, values, cb) {
-  var options = {};
-  if (typeof sql === 'object') {
-    // execute(options, cb)
-    options = sql;
-    if (typeof values === 'function') {
-      cb = values;
-    } else {
-      options.values = values;
-    }
-  } else if (typeof values === 'function') {
-    // execute(sql, cb)
-    cb             = values;
-    options.sql    = sql;
-    options.values = undefined;
-  } else {
-    // execute(sql, values, cb)
-    options.sql    = sql;
-    options.values = values;
-  }
-  cb = _domainify(cb);
-  this._resolveNamedPlaceholders(options);
-
-  var connection = this;
-  var key = statementKey(options);
-  var statement = connection._statements[key];
-
-  options.statement = statement;
-  var executeCommand = new Commands.Execute(options, cb);
-
-  if (!statement) {
-    connection.prepare(options, function executeStatement(err, stmt) {
-      if (err) {
-        if (cb)
-          cb(err);
-        else
-          executeCommand.emit('error', err);
-        return;
-      }
-      executeCommand.statement = stmt;
-      connection._statements[key] = stmt;
-      connection.addCommand(executeCommand);
-    });
-  } else {
-    connection.addCommand(executeCommand);
-  }
-  return executeCommand;
-};
-
-Connection.prototype.changeUser = function changeUser(options, callback) {
-  if (!callback && typeof options === 'function') {
-    callback = options;
-    options = {};
-  }
-
-  var charsetNumber = (options.charset) ? ConnectionConfig.getCharsetNumber(options.charset) : this.config.charsetNumber;
-
-  return this.addCommand(new Commands.ChangeUser({
-    user          : options.user || this.config.user,
-    password      : options.password || this.config.password,
-    passwordSha1  : options.passwordSha1 || this.config.passwordSha1,
-    database      : options.database || this.config.database,
-    timeout       : options.timeout,
-    charsetNumber : charsetNumber,
-    currentConfig : this.config
-  }, _domainify(function(err) {
-    if (err)
-      err.fatal = true;
-    if (callback) callback(err);
-  })));
-};
-
-// transaction helpers
-Connection.prototype.beginTransaction = function(cb) {
-  return this.query('START TRANSACTION', cb);
-};
-
-Connection.prototype.commit = function(cb) {
-  return this.query('COMMIT', cb);
-};
-
-Connection.prototype.rollback = function(cb) {
-  return this.query('ROLLBACK', cb);
-};
-
-Connection.prototype.ping = function ping(cb) {
-  return this.addCommand(new Commands.Ping(_domainify(cb)));
-};
-
-Connection.prototype._registerSlave = function registerSlave(opts, cb) {
-  return this.addCommand(new Commands.RegisterSlave(opts, _domainify(cb)));
-};
-
-Connection.prototype._binlogDump = function binlogDump(opts, cb) {
-  return this.addCommand(new Commands.BinlogDump(opts, _domainify(cb)));
-};
-
-// currently just alias to close
-Connection.prototype.destroy = function() {
-  this.close();
-};
-
-Connection.prototype.close = function() {
-  this._closing = true;
-  this.stream.end();
-};
-
-Connection.prototype.createBinlogStream = function(opts) {
-  // TODO: create proper stream class
-  // TODO: use through2
-  var test = 1;
-  var Readable = require('stream').Readable;
-  var stream = new Readable({objectMode: true});
-  stream._read = function() {
-    return {
-      data: test++
-    };
-  };
-  var connection = this;
-  connection._registerSlave(opts, function(err) {
-    var dumpCmd = connection._binlogDump(opts);
-    dumpCmd.on('event', function(ev) {
-      stream.push(ev);
-    });
-    dumpCmd.on('eof', function() {
-      stream.push(null);
-      // if non-blocking, then close stream to prevent errors
-      if (opts.flags && (opts.flags & 0x01)) {
-        connection.close();
-      }
-    });
-    // TODO: pipe errors as well
-  });
-  return stream;
-};
-
-Connection.prototype.connect = function(cb) {
-  if (!cb) return;
-  var connectCalled = 0;
-
-  // TODO domainify this callback as well. Note that domain has to be captured
-  // at the top of function due to nested callback
-  function callbackOnce(isErrorHandler) {
-    return function(param) {
-      if (!connectCalled) {
-        if (isErrorHandler)
-          cb(param);
-        else
-          cb(null, param);
-      }
-      connectCalled = 1;
-    };
-  }
-  this.once('error',   callbackOnce(true) );
-  this.once('connect', callbackOnce(false));
-};
-
-// ===================================
-// outgoing server connection methods
-// ===================================
-
-Connection.prototype.writeColumns = function(columns) {
-  var connection = this;
-  this.writePacket(Packets.ResultSetHeader.toPacket(columns.length));
-  columns.forEach(function(column) {
-    connection.writePacket(Packets.ColumnDefinition.toPacket(column));
-  });
-  this.writeEof();
-};
-
-// row is array of columns, not hash
-Connection.prototype.writeTextRow = function(column) {
-  this.writePacket(Packets.TextRow.toPacket(column));
-};
-
-Connection.prototype.writeTextResult = function(rows, columns) {
-  var connection = this;
-  connection.writeColumns(columns);
-  rows.forEach(function(row) {
-    var arrayRow = new Array(columns.length);
-    columns.forEach(function(column) {
-      arrayRow.push(row[column.name]);
-    });
-    connection.writeTextRow(arrayRow);
-  });
-  connection.writeEof();
-};
-
-Connection.prototype.writeEof = function(warnings, statusFlags) {
-  this.writePacket(Packets.EOF.toPacket(warnings, statusFlags));
-};
-
-Connection.prototype.writeOk = function(args) {
-  if (!args)
-    args = { affectedRows: 0 };
-  this.writePacket(Packets.OK.toPacket(args));
-};
-
-Connection.prototype.writeError = function(args) {
-  this.writePacket(Packets.Error.toPacket(args));
-};
-
-Connection.prototype.serverHandshake = function serverHandshake(args) {
-  return this.addCommand(new Commands.ServerHandshake(args));
-};
-
-// ===============================================================
-
-// TODO: domainify
-Connection.prototype.end = function(callback) {
-  var connection = this;
-  // trigger error if more commands enqueued after end command
-  var quitCmd =  this.addCommand(new Commands.Quit(callback));
-  connection.addCommand = function() {
-    if (connection._closing) {
-      this.emit(new Error('addCommand() called on closing connection'));
-    }
-  };
-  return quitCmd;
-};
-
-module.exports = Connection;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/connection_config.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/connection_config.js
deleted file mode 100644
index e09e4b8666d49062395b14854e27b0809df09996..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/connection_config.js
+++ /dev/null
@@ -1,156 +0,0 @@
-var urlParse        = require('url').parse;
-var ClientConstants = require('./constants/client');
-var Charsets        = require('./constants/charsets');
-var SSLProfiles     = null;
-
-module.exports = ConnectionConfig;
-function ConnectionConfig(options) {
-  if (typeof options === 'string') {
-    options = ConnectionConfig.parseUrl(options);
-  }
-
-  this.isServer           = options.isServer;
-  this.stream             = options.stream;
-
-  this.host               = options.host || 'localhost';
-  this.port               = options.port || 3306;
-  this.localAddress       = options.localAddress;
-  this.socketPath         = options.socketPath;
-  this.user               = options.user || undefined;
-  this.password           = options.password || undefined;
-  this.passwordSha1       = options.passwordSha1 || undefined;
-  this.database           = options.database;
-  this.connectTimeout     = (options.connectTimeout === undefined)
-    ? (10 * 1000)
-    : options.connectTimeout;
-  this.insecureAuth       = options.insecureAuth || false;
-  this.supportBigNumbers  = options.supportBigNumbers || false;
-  this.bigNumberStrings   = options.bigNumberStrings || false;
-  this.dateStrings        = options.dateStrings || false;
-  this.debug              = options.debug;
-  this.trace              = options.trace !== false;
-  this.stringifyObjects   = options.stringifyObjects || false;
-  this.timezone           = options.timezone || 'local';
-  this.flags              = options.flags || '';
-  this.queryFormat        = options.queryFormat;
-  this.pool               = options.pool || undefined;
-  this.ssl                = (typeof options.ssl === 'string')
-    ? ConnectionConfig.getSSLProfile(options.ssl)
-    : (options.ssl || false);
-  this.multipleStatements = options.multipleStatements || false;
-  this.namedPlaceholders  = options.namedPlaceholders || false;
-  this.typeCast           = (options.typeCast === undefined)
-    ? true
-    : options.typeCast;
-
-  if (this.timezone[0] == " ") {
-    // "+" is a url encoded char for space so it
-    // gets translated to space when giving a
-    // connection string..
-    this.timezone = "+" + this.timezone.substr(1);
-  }
-
-  if (this.ssl) {
-    // Default rejectUnauthorized to true
-    this.ssl.rejectUnauthorized = this.ssl.rejectUnauthorized !== false;
-  }
-
-  this.maxPacketSize = 0;
-  this.charsetNumber = (options.charset)
-    ? ConnectionConfig.getCharsetNumber(options.charset)
-    : options.charsetNumber||Charsets.UTF8_GENERAL_CI;
-
-  this.clientFlags = ConnectionConfig.mergeFlags(ConnectionConfig.getDefaultFlags(options),
-                                                 options.flags || '');
-}
-
-ConnectionConfig.mergeFlags = function(default_flags, user_flags) {
-  var flags = 0x0, i;
-
-  user_flags = (user_flags || '').toUpperCase().split(/\s*,+\s*/);
-
-  // add default flags unless "blacklisted"
-  for (i in default_flags) {
-    if (user_flags.indexOf("-" + default_flags[i]) >= 0) continue;
-
-    flags |= ClientConstants[default_flags[i]] || 0x0;
-  }
-  // add user flags unless already already added
-  for (i in user_flags) {
-    if (user_flags[i][0] == "-") continue;
-    if (default_flags.indexOf(user_flags[i]) >= 0) continue;
-
-    flags |= ClientConstants[user_flags[i]] || 0x0;
-  }
-
-  return flags;
-};
-
-ConnectionConfig.getDefaultFlags = function(options) {
-  var defaultFlags = [ "LONG_PASSWORD", "FOUND_ROWS", "LONG_FLAG",
-                        "CONNECT_WITH_DB", "ODBC", "LOCAL_FILES",
-                        "IGNORE_SPACE", "PROTOCOL_41", "IGNORE_SIGPIPE",
-                        "TRANSACTIONS", "RESERVED", "SECURE_CONNECTION",
-                        "MULTI_RESULTS" ];
-  if (options && options.multipleStatements) {
-    defaultFlags.push("MULTI_STATEMENTS");
-  }
-
-  return defaultFlags;
-};
-
-ConnectionConfig.getCharsetNumber = function getCharsetNumber(charset) {
-  var num = Charsets[charset.toUpperCase()];
-
-  if (num === undefined) {
-    throw new TypeError('Unknown charset \'' + charset + '\'');
-  }
-
-  return num;
-};
-
-ConnectionConfig.getSSLProfile = function getSSLProfile(name) {
-  if (!SSLProfiles) {
-    SSLProfiles = require('./constants/ssl_profiles.js');
-  }
-
-  var ssl = SSLProfiles[name];
-
-  if (ssl === undefined) {
-    throw new TypeError('Unknown SSL profile \'' + name + '\'');
-  }
-
-  return ssl;
-};
-
-ConnectionConfig.parseUrl = function(url) {
-  url = urlParse(url, true);
-
-  var options = {
-    host     : url.hostname,
-    port     : url.port,
-    database : url.pathname.substr(1),
-  };
-
-  if (url.auth) {
-    var auth = url.auth.split(':');
-    options.user     = auth[0];
-    options.password = auth[1];
-  }
-
-  if (url.query) {
-    for (var key in url.query) {
-      var value = url.query[key];
-
-      try {
-        // Try to parse this as a JSON expression first
-        options[key] = JSON.parse(value);
-      } catch (err) {
-        // Otherwise assume it is a plain string
-        options[key] = value;
-      }
-    }
-  }
-
-  return options;
-};
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/charsets.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/charsets.js
deleted file mode 100644
index 5883964e2d1a1b4b866ee138581114efed0d9298..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/charsets.js
+++ /dev/null
@@ -1,195 +0,0 @@
-exports.BIG5_CHINESE_CI        = 1;
-exports.LATIN2_CZECH_CS        = 2;
-exports.DEC8_SWEDISH_CI        = 3;
-exports.CP850_GENERAL_CI       = 4;
-exports.LATIN1_GERMAN1_CI      = 5;
-exports.HP8_ENGLISH_CI         = 6;
-exports.KOI8R_GENERAL_CI       = 7;
-exports.LATIN1_SWEDISH_CI      = 8;
-exports.LATIN2_GENERAL_CI      = 9;
-exports.SWE7_SWEDISH_CI        = 10;
-exports.ASCII_GENERAL_CI       = 11;
-exports.UJIS_JAPANESE_CI       = 12;
-exports.SJIS_JAPANESE_CI       = 13;
-exports.CP1251_BULGARIAN_CI    = 14;
-exports.LATIN1_DANISH_CI       = 15;
-exports.HEBREW_GENERAL_CI      = 16;
-exports.TIS620_THAI_CI         = 18;
-exports.EUCKR_KOREAN_CI        = 19;
-exports.LATIN7_ESTONIAN_CS     = 20;
-exports.LATIN2_HUNGARIAN_CI    = 21;
-exports.KOI8U_GENERAL_CI       = 22;
-exports.CP1251_UKRAINIAN_CI    = 23;
-exports.GB2312_CHINESE_CI      = 24;
-exports.GREEK_GENERAL_CI       = 25;
-exports.CP1250_GENERAL_CI      = 26;
-exports.LATIN2_CROATIAN_CI     = 27;
-exports.GBK_CHINESE_CI         = 28;
-exports.CP1257_LITHUANIAN_CI   = 29;
-exports.LATIN5_TURKISH_CI      = 30;
-exports.LATIN1_GERMAN2_CI      = 31;
-exports.ARMSCII8_GENERAL_CI    = 32;
-exports.UTF8_GENERAL_CI        = 33;
-exports.CP1250_CZECH_CS        = 34;
-exports.UCS2_GENERAL_CI        = 35;
-exports.CP866_GENERAL_CI       = 36;
-exports.KEYBCS2_GENERAL_CI     = 37;
-exports.MACCE_GENERAL_CI       = 38;
-exports.MACROMAN_GENERAL_CI    = 39;
-exports.CP852_GENERAL_CI       = 40;
-exports.LATIN7_GENERAL_CI      = 41;
-exports.LATIN7_GENERAL_CS      = 42;
-exports.MACCE_BIN              = 43;
-exports.CP1250_CROATIAN_CI     = 44;
-exports.UTF8MB4_GENERAL_CI     = 45;
-exports.UTF8MB4_BIN            = 46;
-exports.LATIN1_BIN             = 47;
-exports.LATIN1_GENERAL_CI      = 48;
-exports.LATIN1_GENERAL_CS      = 49;
-exports.CP1251_BIN             = 50;
-exports.CP1251_GENERAL_CI      = 51;
-exports.CP1251_GENERAL_CS      = 52;
-exports.MACROMAN_BIN           = 53;
-exports.UTF16_GENERAL_CI       = 54;
-exports.UTF16_BIN              = 55;
-exports.CP1256_GENERAL_CI      = 57;
-exports.CP1257_BIN             = 58;
-exports.CP1257_GENERAL_CI      = 59;
-exports.UTF32_GENERAL_CI       = 60;
-exports.UTF32_BIN              = 61;
-exports.BINARY                 = 63;
-exports.ARMSCII8_BIN           = 64;
-exports.ASCII_BIN              = 65;
-exports.CP1250_BIN             = 66;
-exports.CP1256_BIN             = 67;
-exports.CP866_BIN              = 68;
-exports.DEC8_BIN               = 69;
-exports.GREEK_BIN              = 70;
-exports.HEBREW_BIN             = 71;
-exports.HP8_BIN                = 72;
-exports.KEYBCS2_BIN            = 73;
-exports.KOI8R_BIN              = 74;
-exports.KOI8U_BIN              = 75;
-exports.LATIN2_BIN             = 77;
-exports.LATIN5_BIN             = 78;
-exports.LATIN7_BIN             = 79;
-exports.CP850_BIN              = 80;
-exports.CP852_BIN              = 81;
-exports.SWE7_BIN               = 82;
-exports.UTF8_BIN               = 83;
-exports.BIG5_BIN               = 84;
-exports.EUCKR_BIN              = 85;
-exports.GB2312_BIN             = 86;
-exports.GBK_BIN                = 87;
-exports.SJIS_BIN               = 88;
-exports.TIS620_BIN             = 89;
-exports.UCS2_BIN               = 90;
-exports.UJIS_BIN               = 91;
-exports.GEOSTD8_GENERAL_CI     = 92;
-exports.GEOSTD8_BIN            = 93;
-exports.LATIN1_SPANISH_CI      = 94;
-exports.CP932_JAPANESE_CI      = 95;
-exports.CP932_BIN              = 96;
-exports.EUCJPMS_JAPANESE_CI    = 97;
-exports.EUCJPMS_BIN            = 98;
-exports.CP1250_POLISH_CI       = 99;
-exports.UTF16_UNICODE_CI       = 101;
-exports.UTF16_ICELANDIC_CI     = 102;
-exports.UTF16_LATVIAN_CI       = 103;
-exports.UTF16_ROMANIAN_CI      = 104;
-exports.UTF16_SLOVENIAN_CI     = 105;
-exports.UTF16_POLISH_CI        = 106;
-exports.UTF16_ESTONIAN_CI      = 107;
-exports.UTF16_SPANISH_CI       = 108;
-exports.UTF16_SWEDISH_CI       = 109;
-exports.UTF16_TURKISH_CI       = 110;
-exports.UTF16_CZECH_CI         = 111;
-exports.UTF16_DANISH_CI        = 112;
-exports.UTF16_LITHUANIAN_CI    = 113;
-exports.UTF16_SLOVAK_CI        = 114;
-exports.UTF16_SPANISH2_CI      = 115;
-exports.UTF16_ROMAN_CI         = 116;
-exports.UTF16_PERSIAN_CI       = 117;
-exports.UTF16_ESPERANTO_CI     = 118;
-exports.UTF16_HUNGARIAN_CI     = 119;
-exports.UTF16_SINHALA_CI       = 120;
-exports.UCS2_UNICODE_CI        = 128;
-exports.UCS2_ICELANDIC_CI      = 129;
-exports.UCS2_LATVIAN_CI        = 130;
-exports.UCS2_ROMANIAN_CI       = 131;
-exports.UCS2_SLOVENIAN_CI      = 132;
-exports.UCS2_POLISH_CI         = 133;
-exports.UCS2_ESTONIAN_CI       = 134;
-exports.UCS2_SPANISH_CI        = 135;
-exports.UCS2_SWEDISH_CI        = 136;
-exports.UCS2_TURKISH_CI        = 137;
-exports.UCS2_CZECH_CI          = 138;
-exports.UCS2_DANISH_CI         = 139;
-exports.UCS2_LITHUANIAN_CI     = 140;
-exports.UCS2_SLOVAK_CI         = 141;
-exports.UCS2_SPANISH2_CI       = 142;
-exports.UCS2_ROMAN_CI          = 143;
-exports.UCS2_PERSIAN_CI        = 144;
-exports.UCS2_ESPERANTO_CI      = 145;
-exports.UCS2_HUNGARIAN_CI      = 146;
-exports.UCS2_SINHALA_CI        = 147;
-exports.UTF32_UNICODE_CI       = 160;
-exports.UTF32_ICELANDIC_CI     = 161;
-exports.UTF32_LATVIAN_CI       = 162;
-exports.UTF32_ROMANIAN_CI      = 163;
-exports.UTF32_SLOVENIAN_CI     = 164;
-exports.UTF32_POLISH_CI        = 165;
-exports.UTF32_ESTONIAN_CI      = 166;
-exports.UTF32_SPANISH_CI       = 167;
-exports.UTF32_SWEDISH_CI       = 168;
-exports.UTF32_TURKISH_CI       = 169;
-exports.UTF32_CZECH_CI         = 170;
-exports.UTF32_DANISH_CI        = 171;
-exports.UTF32_LITHUANIAN_CI    = 172;
-exports.UTF32_SLOVAK_CI        = 173;
-exports.UTF32_SPANISH2_CI      = 174;
-exports.UTF32_ROMAN_CI         = 175;
-exports.UTF32_PERSIAN_CI       = 176;
-exports.UTF32_ESPERANTO_CI     = 177;
-exports.UTF32_HUNGARIAN_CI     = 178;
-exports.UTF32_SINHALA_CI       = 179;
-exports.UTF8_UNICODE_CI        = 192;
-exports.UTF8_ICELANDIC_CI      = 193;
-exports.UTF8_LATVIAN_CI        = 194;
-exports.UTF8_ROMANIAN_CI       = 195;
-exports.UTF8_SLOVENIAN_CI      = 196;
-exports.UTF8_POLISH_CI         = 197;
-exports.UTF8_ESTONIAN_CI       = 198;
-exports.UTF8_SPANISH_CI        = 199;
-exports.UTF8_SWEDISH_CI        = 200;
-exports.UTF8_TURKISH_CI        = 201;
-exports.UTF8_CZECH_CI          = 202;
-exports.UTF8_DANISH_CI         = 203;
-exports.UTF8_LITHUANIAN_CI     = 204;
-exports.UTF8_SLOVAK_CI         = 205;
-exports.UTF8_SPANISH2_CI       = 206;
-exports.UTF8_ROMAN_CI          = 207;
-exports.UTF8_PERSIAN_CI        = 208;
-exports.UTF8_ESPERANTO_CI      = 209;
-exports.UTF8_HUNGARIAN_CI      = 210;
-exports.UTF8_SINHALA_CI        = 211;
-exports.UTF8MB4_UNICODE_CI     = 224;
-exports.UTF8MB4_ICELANDIC_CI   = 225;
-exports.UTF8MB4_LATVIAN_CI     = 226;
-exports.UTF8MB4_ROMANIAN_CI    = 227;
-exports.UTF8MB4_SLOVENIAN_CI   = 228;
-exports.UTF8MB4_POLISH_CI      = 229;
-exports.UTF8MB4_ESTONIAN_CI    = 230;
-exports.UTF8MB4_SPANISH_CI     = 231;
-exports.UTF8MB4_SWEDISH_CI     = 232;
-exports.UTF8MB4_TURKISH_CI     = 233;
-exports.UTF8MB4_CZECH_CI       = 234;
-exports.UTF8MB4_DANISH_CI      = 235;
-exports.UTF8MB4_LITHUANIAN_CI  = 236;
-exports.UTF8MB4_SLOVAK_CI      = 237;
-exports.UTF8MB4_SPANISH2_CI    = 238;
-exports.UTF8MB4_ROMAN_CI       = 239;
-exports.UTF8MB4_PERSIAN_CI     = 240;
-exports.UTF8MB4_ESPERANTO_CI   = 241;
-exports.UTF8MB4_HUNGARIAN_CI   = 242;
-exports.UTF8MB4_SINHALA_CI     = 243;
\ No newline at end of file
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/client.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/client.js
deleted file mode 100644
index 119488eb1a411c5eaf94871e42a8f7a7cdc60445..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/client.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// Manually extracted from mysql-5.5.23/include/mysql_com.h
-exports.LONG_PASSWORD     = 1; /* new more secure passwords */
-exports.FOUND_ROWS        = 2; /* Found instead of affected rows */
-exports.LONG_FLAG         = 4; /* Get all column flags */
-exports.CONNECT_WITH_DB   = 8; /* One can specify db on connect */
-exports.NO_SCHEMA         = 16; /* Don't allow database.table.column */
-exports.COMPRESS          = 32; /* Can use compression protocol */
-exports.ODBC              = 64; /* Odbc client */
-exports.LOCAL_FILES       = 128; /* Can use LOAD DATA LOCAL */
-exports.IGNORE_SPACE      = 256; /* Ignore spaces before '(' */
-exports.PROTOCOL_41       = 512; /* New 4.1 protocol */
-exports.INTERACTIVE       = 1024; /* This is an interactive client */
-exports.SSL               = 2048; /* Switch to SSL after handshake */
-exports.IGNORE_SIGPIPE    = 4096;    /* IGNORE sigpipes */
-exports.TRANSACTIONS      = 8192; /* Client knows about transactions */
-exports.RESERVED          = 16384;   /* Old flag for 4.1 protocol  */
-exports.SECURE_CONNECTION = 32768;  /* New 4.1 authentication */
-
-exports.MULTI_STATEMENTS = 65536; /* Enable/disable multi-stmt support */
-exports.MULTI_RESULTS    = 131072; /* Enable/disable multi-results */
-exports.PS_MULTI_RESULTS = 262144; /* Multi-results in PS-protocol */
-
-exports.PLUGIN_AUTH = 524288; /* Client supports plugin authentication */
-
-exports.SSL_VERIFY_SERVER_CERT = 1073741824;
-exports.REMEMBER_OPTIONS       = 2147483648;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/commands.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/commands.js
deleted file mode 100644
index adf0c1e5721ef76cfb09f518ac8eeae38f967f07..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/commands.js
+++ /dev/null
@@ -1,34 +0,0 @@
-module.exports = {
-  SLEEP              : 0x00,  // deprecated
-  QUIT               : 0x01,
-  INIT_DB            : 0x02,
-  QUERY              : 0x03,
-  FIELD_LIST         : 0x04,
-  CREATE_DB          : 0x05,
-  DROP_DB            : 0x06,
-  REFRESH            : 0x07,
-  SHUTDOWN           : 0x08,
-  STATISTICS         : 0x09,
-  PROCESS_INFO       : 0x0a,  // deprecated
-  CONNECT            : 0x0b,  // deprecated
-  PROCESS_KILL       : 0x0c,
-  DEBUG              : 0x0d,
-  PING               : 0x0e,
-  TIME               : 0x0f,  // deprecated
-  DELAYED_INSERT     : 0x10,  // deprecated
-  CHANGE_USER        : 0x11,
-  BINLOG_DUMP        : 0x12,
-  TABLE_DUMP         : 0x13,
-  CONNECT_OUT        : 0x14,
-  REGISTER_SLAVE     : 0x15,
-  STMT_PREPARE       : 0x16,
-  STMT_EXECUTE       : 0x17,
-  STMT_SEND_LONG_DATA: 0x18,
-  STMT_CLOSE         : 0x19,
-  STMT_RESET         : 0x1a,
-  SET_OPTION         : 0x1b,
-  STMT_FETCH         : 0x1c,
-  DAEMON             : 0x1d,  // deprecated
-  BINLOG_DUMP_GTID   : 0x1e,
-  UNKNOWN            : 0xff   // bad!
-};
\ No newline at end of file
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/cursor.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/cursor.js
deleted file mode 100644
index 97e3d3ef282ca401123ebac44c38dad20eaa7b2e..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/cursor.js
+++ /dev/null
@@ -1,6 +0,0 @@
-module.exports = {
-  NO_CURSOR: 0,
-  READ_ONLY: 1,
-  FOR_UPDATE: 2,
-  SCROLLABLE: 3
-};
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/errors.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/errors.js
deleted file mode 100644
index 5fcd72bb31b7590f5a9feb1fb677e28468e24915..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/errors.js
+++ /dev/null
@@ -1,726 +0,0 @@
-// Generated by generate-error-constants.js, do not modify by hand
-module.exports.codeToName  = [];
-module.exports.codeToName[1000] = 'ER_HASHCHK';
-module.exports.codeToName[1001] = 'ER_NISAMCHK';
-module.exports.codeToName[1002] = 'ER_NO';
-module.exports.codeToName[1003] = 'ER_YES';
-module.exports.codeToName[1004] = 'ER_CANT_CREATE_FILE';
-module.exports.codeToName[1005] = 'ER_CANT_CREATE_TABLE';
-module.exports.codeToName[1006] = 'ER_CANT_CREATE_DB';
-module.exports.codeToName[1007] = 'ER_DB_CREATE_EXISTS';
-module.exports.codeToName[1008] = 'ER_DB_DROP_EXISTS';
-module.exports.codeToName[1009] = 'ER_DB_DROP_DELETE';
-module.exports.codeToName[1010] = 'ER_DB_DROP_RMDIR';
-module.exports.codeToName[1011] = 'ER_CANT_DELETE_FILE';
-module.exports.codeToName[1012] = 'ER_CANT_FIND_SYSTEM_REC';
-module.exports.codeToName[1013] = 'ER_CANT_GET_STAT';
-module.exports.codeToName[1014] = 'ER_CANT_GET_WD';
-module.exports.codeToName[1015] = 'ER_CANT_LOCK';
-module.exports.codeToName[1016] = 'ER_CANT_OPEN_FILE';
-module.exports.codeToName[1017] = 'ER_FILE_NOT_FOUND';
-module.exports.codeToName[1018] = 'ER_CANT_READ_DIR';
-module.exports.codeToName[1019] = 'ER_CANT_SET_WD';
-module.exports.codeToName[1020] = 'ER_CHECKREAD';
-module.exports.codeToName[1021] = 'ER_DISK_FULL';
-module.exports.codeToName[1022] = 'ER_DUP_KEY';
-module.exports.codeToName[1023] = 'ER_ERROR_ON_CLOSE';
-module.exports.codeToName[1024] = 'ER_ERROR_ON_READ';
-module.exports.codeToName[1025] = 'ER_ERROR_ON_RENAME';
-module.exports.codeToName[1026] = 'ER_ERROR_ON_WRITE';
-module.exports.codeToName[1027] = 'ER_FILE_USED';
-module.exports.codeToName[1028] = 'ER_FILSORT_ABORT';
-module.exports.codeToName[1029] = 'ER_FORM_NOT_FOUND';
-module.exports.codeToName[1030] = 'ER_GET_ERRNO';
-module.exports.codeToName[1031] = 'ER_ILLEGAL_HA';
-module.exports.codeToName[1032] = 'ER_KEY_NOT_FOUND';
-module.exports.codeToName[1033] = 'ER_NOT_FORM_FILE';
-module.exports.codeToName[1034] = 'ER_NOT_KEYFILE';
-module.exports.codeToName[1035] = 'ER_OLD_KEYFILE';
-module.exports.codeToName[1036] = 'ER_OPEN_AS_READONLY';
-module.exports.codeToName[1037] = 'ER_OUTOFMEMORY';
-module.exports.codeToName[1038] = 'ER_OUT_OF_SORTMEMORY';
-module.exports.codeToName[1039] = 'ER_UNEXPECTED_EOF';
-module.exports.codeToName[1040] = 'ER_CON_COUNT_ERROR';
-module.exports.codeToName[1041] = 'ER_OUT_OF_RESOURCES';
-module.exports.codeToName[1042] = 'ER_BAD_HOST_ERROR';
-module.exports.codeToName[1043] = 'ER_HANDSHAKE_ERROR';
-module.exports.codeToName[1044] = 'ER_DBACCESS_DENIED_ERROR';
-module.exports.codeToName[1045] = 'ER_ACCESS_DENIED_ERROR';
-module.exports.codeToName[1046] = 'ER_NO_DB_ERROR';
-module.exports.codeToName[1047] = 'ER_UNKNOWN_COM_ERROR';
-module.exports.codeToName[1048] = 'ER_BAD_NULL_ERROR';
-module.exports.codeToName[1049] = 'ER_BAD_DB_ERROR';
-module.exports.codeToName[1050] = 'ER_TABLE_EXISTS_ERROR';
-module.exports.codeToName[1051] = 'ER_BAD_TABLE_ERROR';
-module.exports.codeToName[1052] = 'ER_NON_UNIQ_ERROR';
-module.exports.codeToName[1053] = 'ER_SERVER_SHUTDOWN';
-module.exports.codeToName[1054] = 'ER_BAD_FIELD_ERROR';
-module.exports.codeToName[1055] = 'ER_WRONG_FIELD_WITH_GROUP';
-module.exports.codeToName[1056] = 'ER_WRONG_GROUP_FIELD';
-module.exports.codeToName[1057] = 'ER_WRONG_SUM_SELECT';
-module.exports.codeToName[1058] = 'ER_WRONG_VALUE_COUNT';
-module.exports.codeToName[1059] = 'ER_TOO_LONG_IDENT';
-module.exports.codeToName[1060] = 'ER_DUP_FIELDNAME';
-module.exports.codeToName[1061] = 'ER_DUP_KEYNAME';
-module.exports.codeToName[1062] = 'ER_DUP_ENTRY';
-module.exports.codeToName[1063] = 'ER_WRONG_FIELD_SPEC';
-module.exports.codeToName[1064] = 'ER_PARSE_ERROR';
-module.exports.codeToName[1065] = 'ER_EMPTY_QUERY';
-module.exports.codeToName[1066] = 'ER_NONUNIQ_TABLE';
-module.exports.codeToName[1067] = 'ER_INVALID_DEFAULT';
-module.exports.codeToName[1068] = 'ER_MULTIPLE_PRI_KEY';
-module.exports.codeToName[1069] = 'ER_TOO_MANY_KEYS';
-module.exports.codeToName[1070] = 'ER_TOO_MANY_KEY_PARTS';
-module.exports.codeToName[1071] = 'ER_TOO_LONG_KEY';
-module.exports.codeToName[1072] = 'ER_KEY_COLUMN_DOES_NOT_EXITS';
-module.exports.codeToName[1073] = 'ER_BLOB_USED_AS_KEY';
-module.exports.codeToName[1074] = 'ER_TOO_BIG_FIELDLENGTH';
-module.exports.codeToName[1075] = 'ER_WRONG_AUTO_KEY';
-module.exports.codeToName[1076] = 'ER_READY';
-module.exports.codeToName[1077] = 'ER_NORMAL_SHUTDOWN';
-module.exports.codeToName[1078] = 'ER_GOT_SIGNAL';
-module.exports.codeToName[1079] = 'ER_SHUTDOWN_COMPLETE';
-module.exports.codeToName[1080] = 'ER_FORCING_CLOSE';
-module.exports.codeToName[1081] = 'ER_IPSOCK_ERROR';
-module.exports.codeToName[1082] = 'ER_NO_SUCH_INDEX';
-module.exports.codeToName[1083] = 'ER_WRONG_FIELD_TERMINATORS';
-module.exports.codeToName[1084] = 'ER_BLOBS_AND_NO_TERMINATED';
-module.exports.codeToName[1085] = 'ER_TEXTFILE_NOT_READABLE';
-module.exports.codeToName[1086] = 'ER_FILE_EXISTS_ERROR';
-module.exports.codeToName[1087] = 'ER_LOAD_INFO';
-module.exports.codeToName[1088] = 'ER_ALTER_INFO';
-module.exports.codeToName[1089] = 'ER_WRONG_SUB_KEY';
-module.exports.codeToName[1090] = 'ER_CANT_REMOVE_ALL_FIELDS';
-module.exports.codeToName[1091] = 'ER_CANT_DROP_FIELD_OR_KEY';
-module.exports.codeToName[1092] = 'ER_INSERT_INFO';
-module.exports.codeToName[1093] = 'ER_UPDATE_TABLE_USED';
-module.exports.codeToName[1094] = 'ER_NO_SUCH_THREAD';
-module.exports.codeToName[1095] = 'ER_KILL_DENIED_ERROR';
-module.exports.codeToName[1096] = 'ER_NO_TABLES_USED';
-module.exports.codeToName[1097] = 'ER_TOO_BIG_SET';
-module.exports.codeToName[1098] = 'ER_NO_UNIQUE_LOGFILE';
-module.exports.codeToName[1099] = 'ER_TABLE_NOT_LOCKED_FOR_WRITE';
-module.exports.codeToName[1100] = 'ER_TABLE_NOT_LOCKED';
-module.exports.codeToName[1101] = 'ER_BLOB_CANT_HAVE_DEFAULT';
-module.exports.codeToName[1102] = 'ER_WRONG_DB_NAME';
-module.exports.codeToName[1103] = 'ER_WRONG_TABLE_NAME';
-module.exports.codeToName[1104] = 'ER_TOO_BIG_SELECT';
-module.exports.codeToName[1105] = 'ER_UNKNOWN_ERROR';
-module.exports.codeToName[1106] = 'ER_UNKNOWN_PROCEDURE';
-module.exports.codeToName[1107] = 'ER_WRONG_PARAMCOUNT_TO_PROCEDURE';
-module.exports.codeToName[1108] = 'ER_WRONG_PARAMETERS_TO_PROCEDURE';
-module.exports.codeToName[1109] = 'ER_UNKNOWN_TABLE';
-module.exports.codeToName[1110] = 'ER_FIELD_SPECIFIED_TWICE';
-module.exports.codeToName[1111] = 'ER_INVALID_GROUP_FUNC_USE';
-module.exports.codeToName[1112] = 'ER_UNSUPPORTED_EXTENSION';
-module.exports.codeToName[1113] = 'ER_TABLE_MUST_HAVE_COLUMNS';
-module.exports.codeToName[1114] = 'ER_RECORD_FILE_FULL';
-module.exports.codeToName[1115] = 'ER_UNKNOWN_CHARACTER_SET';
-module.exports.codeToName[1116] = 'ER_TOO_MANY_TABLES';
-module.exports.codeToName[1117] = 'ER_TOO_MANY_FIELDS';
-module.exports.codeToName[1118] = 'ER_TOO_BIG_ROWSIZE';
-module.exports.codeToName[1119] = 'ER_STACK_OVERRUN';
-module.exports.codeToName[1120] = 'ER_WRONG_OUTER_JOIN';
-module.exports.codeToName[1121] = 'ER_NULL_COLUMN_IN_INDEX';
-module.exports.codeToName[1122] = 'ER_CANT_FIND_UDF';
-module.exports.codeToName[1123] = 'ER_CANT_INITIALIZE_UDF';
-module.exports.codeToName[1124] = 'ER_UDF_NO_PATHS';
-module.exports.codeToName[1125] = 'ER_UDF_EXISTS';
-module.exports.codeToName[1126] = 'ER_CANT_OPEN_LIBRARY';
-module.exports.codeToName[1127] = 'ER_CANT_FIND_DL_ENTRY';
-module.exports.codeToName[1128] = 'ER_FUNCTION_NOT_DEFINED';
-module.exports.codeToName[1129] = 'ER_HOST_IS_BLOCKED';
-module.exports.codeToName[1130] = 'ER_HOST_NOT_PRIVILEGED';
-module.exports.codeToName[1131] = 'ER_PASSWORD_ANONYMOUS_USER';
-module.exports.codeToName[1132] = 'ER_PASSWORD_NOT_ALLOWED';
-module.exports.codeToName[1133] = 'ER_PASSWORD_NO_MATCH';
-module.exports.codeToName[1134] = 'ER_UPDATE_INFO';
-module.exports.codeToName[1135] = 'ER_CANT_CREATE_THREAD';
-module.exports.codeToName[1136] = 'ER_WRONG_VALUE_COUNT_ON_ROW';
-module.exports.codeToName[1137] = 'ER_CANT_REOPEN_TABLE';
-module.exports.codeToName[1138] = 'ER_INVALID_USE_OF_NULL';
-module.exports.codeToName[1139] = 'ER_REGEXP_ERROR';
-module.exports.codeToName[1140] = 'ER_MIX_OF_GROUP_FUNC_AND_FIELDS';
-module.exports.codeToName[1141] = 'ER_NONEXISTING_GRANT';
-module.exports.codeToName[1142] = 'ER_TABLEACCESS_DENIED_ERROR';
-module.exports.codeToName[1143] = 'ER_COLUMNACCESS_DENIED_ERROR';
-module.exports.codeToName[1144] = 'ER_ILLEGAL_GRANT_FOR_TABLE';
-module.exports.codeToName[1145] = 'ER_GRANT_WRONG_HOST_OR_USER';
-module.exports.codeToName[1146] = 'ER_NO_SUCH_TABLE';
-module.exports.codeToName[1147] = 'ER_NONEXISTING_TABLE_GRANT';
-module.exports.codeToName[1148] = 'ER_NOT_ALLOWED_COMMAND';
-module.exports.codeToName[1149] = 'ER_SYNTAX_ERROR';
-module.exports.codeToName[1150] = 'ER_DELAYED_CANT_CHANGE_LOCK';
-module.exports.codeToName[1151] = 'ER_TOO_MANY_DELAYED_THREADS';
-module.exports.codeToName[1152] = 'ER_ABORTING_CONNECTION';
-module.exports.codeToName[1153] = 'ER_NET_PACKET_TOO_LARGE';
-module.exports.codeToName[1154] = 'ER_NET_READ_ERROR_FROM_PIPE';
-module.exports.codeToName[1155] = 'ER_NET_FCNTL_ERROR';
-module.exports.codeToName[1156] = 'ER_NET_PACKETS_OUT_OF_ORDER';
-module.exports.codeToName[1157] = 'ER_NET_UNCOMPRESS_ERROR';
-module.exports.codeToName[1158] = 'ER_NET_READ_ERROR';
-module.exports.codeToName[1159] = 'ER_NET_READ_INTERRUPTED';
-module.exports.codeToName[1160] = 'ER_NET_ERROR_ON_WRITE';
-module.exports.codeToName[1161] = 'ER_NET_WRITE_INTERRUPTED';
-module.exports.codeToName[1162] = 'ER_TOO_LONG_STRING';
-module.exports.codeToName[1163] = 'ER_TABLE_CANT_HANDLE_BLOB';
-module.exports.codeToName[1164] = 'ER_TABLE_CANT_HANDLE_AUTO_INCREMENT';
-module.exports.codeToName[1165] = 'ER_DELAYED_INSERT_TABLE_LOCKED';
-module.exports.codeToName[1166] = 'ER_WRONG_COLUMN_NAME';
-module.exports.codeToName[1167] = 'ER_WRONG_KEY_COLUMN';
-module.exports.codeToName[1168] = 'ER_WRONG_MRG_TABLE';
-module.exports.codeToName[1169] = 'ER_DUP_UNIQUE';
-module.exports.codeToName[1170] = 'ER_BLOB_KEY_WITHOUT_LENGTH';
-module.exports.codeToName[1171] = 'ER_PRIMARY_CANT_HAVE_NULL';
-module.exports.codeToName[1172] = 'ER_TOO_MANY_ROWS';
-module.exports.codeToName[1173] = 'ER_REQUIRES_PRIMARY_KEY';
-module.exports.codeToName[1174] = 'ER_NO_RAID_COMPILED';
-module.exports.codeToName[1175] = 'ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE';
-module.exports.codeToName[1176] = 'ER_KEY_DOES_NOT_EXITS';
-module.exports.codeToName[1177] = 'ER_CHECK_NO_SUCH_TABLE';
-module.exports.codeToName[1178] = 'ER_CHECK_NOT_IMPLEMENTED';
-module.exports.codeToName[1179] = 'ER_CANT_DO_THIS_DURING_AN_TRANSACTION';
-module.exports.codeToName[1180] = 'ER_ERROR_DURING_COMMIT';
-module.exports.codeToName[1181] = 'ER_ERROR_DURING_ROLLBACK';
-module.exports.codeToName[1182] = 'ER_ERROR_DURING_FLUSH_LOGS';
-module.exports.codeToName[1183] = 'ER_ERROR_DURING_CHECKPOINT';
-module.exports.codeToName[1184] = 'ER_NEW_ABORTING_CONNECTION';
-module.exports.codeToName[1185] = 'ER_DUMP_NOT_IMPLEMENTED';
-module.exports.codeToName[1186] = 'ER_FLUSH_MASTER_BINLOG_CLOSED';
-module.exports.codeToName[1187] = 'ER_INDEX_REBUILD';
-module.exports.codeToName[1188] = 'ER_MASTER';
-module.exports.codeToName[1189] = 'ER_MASTER_NET_READ';
-module.exports.codeToName[1190] = 'ER_MASTER_NET_WRITE';
-module.exports.codeToName[1191] = 'ER_FT_MATCHING_KEY_NOT_FOUND';
-module.exports.codeToName[1192] = 'ER_LOCK_OR_ACTIVE_TRANSACTION';
-module.exports.codeToName[1193] = 'ER_UNKNOWN_SYSTEM_VARIABLE';
-module.exports.codeToName[1194] = 'ER_CRASHED_ON_USAGE';
-module.exports.codeToName[1195] = 'ER_CRASHED_ON_REPAIR';
-module.exports.codeToName[1196] = 'ER_WARNING_NOT_COMPLETE_ROLLBACK';
-module.exports.codeToName[1197] = 'ER_TRANS_CACHE_FULL';
-module.exports.codeToName[1198] = 'ER_SLAVE_MUST_STOP';
-module.exports.codeToName[1199] = 'ER_SLAVE_NOT_RUNNING';
-module.exports.codeToName[1200] = 'ER_BAD_SLAVE';
-module.exports.codeToName[1201] = 'ER_MASTER_INFO';
-module.exports.codeToName[1202] = 'ER_SLAVE_THREAD';
-module.exports.codeToName[1203] = 'ER_TOO_MANY_USER_CONNECTIONS';
-module.exports.codeToName[1204] = 'ER_SET_CONSTANTS_ONLY';
-module.exports.codeToName[1205] = 'ER_LOCK_WAIT_TIMEOUT';
-module.exports.codeToName[1206] = 'ER_LOCK_TABLE_FULL';
-module.exports.codeToName[1207] = 'ER_READ_ONLY_TRANSACTION';
-module.exports.codeToName[1208] = 'ER_DROP_DB_WITH_READ_LOCK';
-module.exports.codeToName[1209] = 'ER_CREATE_DB_WITH_READ_LOCK';
-module.exports.codeToName[1210] = 'ER_WRONG_ARGUMENTS';
-module.exports.codeToName[1211] = 'ER_NO_PERMISSION_TO_CREATE_USER';
-module.exports.codeToName[1212] = 'ER_UNION_TABLES_IN_DIFFERENT_DIR';
-module.exports.codeToName[1213] = 'ER_LOCK_DEADLOCK';
-module.exports.codeToName[1214] = 'ER_TABLE_CANT_HANDLE_FT';
-module.exports.codeToName[1215] = 'ER_CANNOT_ADD_FOREIGN';
-module.exports.codeToName[1216] = 'ER_NO_REFERENCED_ROW';
-module.exports.codeToName[1217] = 'ER_ROW_IS_REFERENCED';
-module.exports.codeToName[1218] = 'ER_CONNECT_TO_MASTER';
-module.exports.codeToName[1219] = 'ER_QUERY_ON_MASTER';
-module.exports.codeToName[1220] = 'ER_ERROR_WHEN_EXECUTING_COMMAND';
-module.exports.codeToName[1221] = 'ER_WRONG_USAGE';
-module.exports.codeToName[1222] = 'ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT';
-module.exports.codeToName[1223] = 'ER_CANT_UPDATE_WITH_READLOCK';
-module.exports.codeToName[1224] = 'ER_MIXING_NOT_ALLOWED';
-module.exports.codeToName[1225] = 'ER_DUP_ARGUMENT';
-module.exports.codeToName[1226] = 'ER_USER_LIMIT_REACHED';
-module.exports.codeToName[1227] = 'ER_SPECIFIC_ACCESS_DENIED_ERROR';
-module.exports.codeToName[1228] = 'ER_LOCAL_VARIABLE';
-module.exports.codeToName[1229] = 'ER_GLOBAL_VARIABLE';
-module.exports.codeToName[1230] = 'ER_NO_DEFAULT';
-module.exports.codeToName[1231] = 'ER_WRONG_VALUE_FOR_VAR';
-module.exports.codeToName[1232] = 'ER_WRONG_TYPE_FOR_VAR';
-module.exports.codeToName[1233] = 'ER_VAR_CANT_BE_READ';
-module.exports.codeToName[1234] = 'ER_CANT_USE_OPTION_HERE';
-module.exports.codeToName[1235] = 'ER_NOT_SUPPORTED_YET';
-module.exports.codeToName[1236] = 'ER_MASTER_FATAL_ERROR_READING_BINLOG';
-module.exports.codeToName[1237] = 'ER_SLAVE_IGNORED_TABLE';
-module.exports.codeToName[1238] = 'ER_INCORRECT_GLOBAL_LOCAL_VAR';
-module.exports.codeToName[1239] = 'ER_WRONG_FK_DEF';
-module.exports.codeToName[1240] = 'ER_KEY_REF_DO_NOT_MATCH_TABLE_REF';
-module.exports.codeToName[1241] = 'ER_OPERAND_COLUMNS';
-module.exports.codeToName[1242] = 'ER_SUBQUERY_NO_';
-module.exports.codeToName[1243] = 'ER_UNKNOWN_STMT_HANDLER';
-module.exports.codeToName[1244] = 'ER_CORRUPT_HELP_DB';
-module.exports.codeToName[1245] = 'ER_CYCLIC_REFERENCE';
-module.exports.codeToName[1246] = 'ER_AUTO_CONVERT';
-module.exports.codeToName[1247] = 'ER_ILLEGAL_REFERENCE';
-module.exports.codeToName[1248] = 'ER_DERIVED_MUST_HAVE_ALIAS';
-module.exports.codeToName[1249] = 'ER_SELECT_REDUCED';
-module.exports.codeToName[1250] = 'ER_TABLENAME_NOT_ALLOWED_HERE';
-module.exports.codeToName[1251] = 'ER_NOT_SUPPORTED_AUTH_MODE';
-module.exports.codeToName[1252] = 'ER_SPATIAL_CANT_HAVE_NULL';
-module.exports.codeToName[1253] = 'ER_COLLATION_CHARSET_MISMATCH';
-module.exports.codeToName[1254] = 'ER_SLAVE_WAS_RUNNING';
-module.exports.codeToName[1255] = 'ER_SLAVE_WAS_NOT_RUNNING';
-module.exports.codeToName[1256] = 'ER_TOO_BIG_FOR_UNCOMPRESS';
-module.exports.codeToName[1257] = 'ER_ZLIB_Z_MEM_ERROR';
-module.exports.codeToName[1258] = 'ER_ZLIB_Z_BUF_ERROR';
-module.exports.codeToName[1259] = 'ER_ZLIB_Z_DATA_ERROR';
-module.exports.codeToName[1260] = 'ER_CUT_VALUE_GROUP_CONCAT';
-module.exports.codeToName[1261] = 'ER_WARN_TOO_FEW_RECORDS';
-module.exports.codeToName[1262] = 'ER_WARN_TOO_MANY_RECORDS';
-module.exports.codeToName[1263] = 'ER_WARN_NULL_TO_NOTNULL';
-module.exports.codeToName[1264] = 'ER_WARN_DATA_OUT_OF_RANGE';
-module.exports.codeToName[1265] = 'WARN_DATA_TRUNCATED';
-module.exports.codeToName[1266] = 'ER_WARN_USING_OTHER_HANDLER';
-module.exports.codeToName[1267] = 'ER_CANT_AGGREGATE_';
-module.exports.codeToName[1268] = 'ER_DROP_USER';
-module.exports.codeToName[1269] = 'ER_REVOKE_GRANTS';
-module.exports.codeToName[1270] = 'ER_CANT_AGGREGATE_';
-module.exports.codeToName[1271] = 'ER_CANT_AGGREGATE_NCOLLATIONS';
-module.exports.codeToName[1272] = 'ER_VARIABLE_IS_NOT_STRUCT';
-module.exports.codeToName[1273] = 'ER_UNKNOWN_COLLATION';
-module.exports.codeToName[1274] = 'ER_SLAVE_IGNORED_SSL_PARAMS';
-module.exports.codeToName[1275] = 'ER_SERVER_IS_IN_SECURE_AUTH_MODE';
-module.exports.codeToName[1276] = 'ER_WARN_FIELD_RESOLVED';
-module.exports.codeToName[1277] = 'ER_BAD_SLAVE_UNTIL_COND';
-module.exports.codeToName[1278] = 'ER_MISSING_SKIP_SLAVE';
-module.exports.codeToName[1279] = 'ER_UNTIL_COND_IGNORED';
-module.exports.codeToName[1280] = 'ER_WRONG_NAME_FOR_INDEX';
-module.exports.codeToName[1281] = 'ER_WRONG_NAME_FOR_CATALOG';
-module.exports.codeToName[1282] = 'ER_WARN_QC_RESIZE';
-module.exports.codeToName[1283] = 'ER_BAD_FT_COLUMN';
-module.exports.codeToName[1284] = 'ER_UNKNOWN_KEY_CACHE';
-module.exports.codeToName[1285] = 'ER_WARN_HOSTNAME_WONT_WORK';
-module.exports.codeToName[1286] = 'ER_UNKNOWN_STORAGE_ENGINE';
-module.exports.codeToName[1287] = 'ER_WARN_DEPRECATED_SYNTAX';
-module.exports.codeToName[1288] = 'ER_NON_UPDATABLE_TABLE';
-module.exports.codeToName[1289] = 'ER_FEATURE_DISABLED';
-module.exports.codeToName[1290] = 'ER_OPTION_PREVENTS_STATEMENT';
-module.exports.codeToName[1291] = 'ER_DUPLICATED_VALUE_IN_TYPE';
-module.exports.codeToName[1292] = 'ER_TRUNCATED_WRONG_VALUE';
-module.exports.codeToName[1293] = 'ER_TOO_MUCH_AUTO_TIMESTAMP_COLS';
-module.exports.codeToName[1294] = 'ER_INVALID_ON_UPDATE';
-module.exports.codeToName[1295] = 'ER_UNSUPPORTED_PS';
-module.exports.codeToName[1296] = 'ER_GET_ERRMSG';
-module.exports.codeToName[1297] = 'ER_GET_TEMPORARY_ERRMSG';
-module.exports.codeToName[1298] = 'ER_UNKNOWN_TIME_ZONE';
-module.exports.codeToName[1299] = 'ER_WARN_INVALID_TIMESTAMP';
-module.exports.codeToName[1300] = 'ER_INVALID_CHARACTER_STRING';
-module.exports.codeToName[1301] = 'ER_WARN_ALLOWED_PACKET_OVERFLOWED';
-module.exports.codeToName[1302] = 'ER_CONFLICTING_DECLARATIONS';
-module.exports.codeToName[1303] = 'ER_SP_NO_RECURSIVE_CREATE';
-module.exports.codeToName[1304] = 'ER_SP_ALREADY_EXISTS';
-module.exports.codeToName[1305] = 'ER_SP_DOES_NOT_EXIST';
-module.exports.codeToName[1306] = 'ER_SP_DROP_FAILED';
-module.exports.codeToName[1307] = 'ER_SP_STORE_FAILED';
-module.exports.codeToName[1308] = 'ER_SP_LILABEL_MISMATCH';
-module.exports.codeToName[1309] = 'ER_SP_LABEL_REDEFINE';
-module.exports.codeToName[1310] = 'ER_SP_LABEL_MISMATCH';
-module.exports.codeToName[1311] = 'ER_SP_UNINIT_VAR';
-module.exports.codeToName[1312] = 'ER_SP_BADSELECT';
-module.exports.codeToName[1313] = 'ER_SP_BADRETURN';
-module.exports.codeToName[1314] = 'ER_SP_BADSTATEMENT';
-module.exports.codeToName[1315] = 'ER_UPDATE_LOG_DEPRECATED_IGNORED';
-module.exports.codeToName[1316] = 'ER_UPDATE_LOG_DEPRECATED_TRANSLATED';
-module.exports.codeToName[1317] = 'ER_QUERY_INTERRUPTED';
-module.exports.codeToName[1318] = 'ER_SP_WRONG_NO_OF_ARGS';
-module.exports.codeToName[1319] = 'ER_SP_COND_MISMATCH';
-module.exports.codeToName[1320] = 'ER_SP_NORETURN';
-module.exports.codeToName[1321] = 'ER_SP_NORETURNEND';
-module.exports.codeToName[1322] = 'ER_SP_BAD_CURSOR_QUERY';
-module.exports.codeToName[1323] = 'ER_SP_BAD_CURSOR_SELECT';
-module.exports.codeToName[1324] = 'ER_SP_CURSOR_MISMATCH';
-module.exports.codeToName[1325] = 'ER_SP_CURSOR_ALREADY_OPEN';
-module.exports.codeToName[1326] = 'ER_SP_CURSOR_NOT_OPEN';
-module.exports.codeToName[1327] = 'ER_SP_UNDECLARED_VAR';
-module.exports.codeToName[1328] = 'ER_SP_WRONG_NO_OF_FETCH_ARGS';
-module.exports.codeToName[1329] = 'ER_SP_FETCH_NO_DATA';
-module.exports.codeToName[1330] = 'ER_SP_DUP_PARAM';
-module.exports.codeToName[1331] = 'ER_SP_DUP_VAR';
-module.exports.codeToName[1332] = 'ER_SP_DUP_COND';
-module.exports.codeToName[1333] = 'ER_SP_DUP_CURS';
-module.exports.codeToName[1334] = 'ER_SP_CANT_ALTER';
-module.exports.codeToName[1335] = 'ER_SP_SUBSELECT_NYI';
-module.exports.codeToName[1336] = 'ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG';
-module.exports.codeToName[1337] = 'ER_SP_VARCOND_AFTER_CURSHNDLR';
-module.exports.codeToName[1338] = 'ER_SP_CURSOR_AFTER_HANDLER';
-module.exports.codeToName[1339] = 'ER_SP_CASE_NOT_FOUND';
-module.exports.codeToName[1340] = 'ER_FPARSER_TOO_BIG_FILE';
-module.exports.codeToName[1341] = 'ER_FPARSER_BAD_HEADER';
-module.exports.codeToName[1342] = 'ER_FPARSER_EOF_IN_COMMENT';
-module.exports.codeToName[1343] = 'ER_FPARSER_ERROR_IN_PARAMETER';
-module.exports.codeToName[1344] = 'ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER';
-module.exports.codeToName[1345] = 'ER_VIEW_NO_EXPLAIN';
-module.exports.codeToName[1346] = 'ER_FRM_UNKNOWN_TYPE';
-module.exports.codeToName[1347] = 'ER_WRONG_OBJECT';
-module.exports.codeToName[1348] = 'ER_NONUPDATEABLE_COLUMN';
-module.exports.codeToName[1349] = 'ER_VIEW_SELECT_DERIVED';
-module.exports.codeToName[1350] = 'ER_VIEW_SELECT_CLAUSE';
-module.exports.codeToName[1351] = 'ER_VIEW_SELECT_VARIABLE';
-module.exports.codeToName[1352] = 'ER_VIEW_SELECT_TMPTABLE';
-module.exports.codeToName[1353] = 'ER_VIEW_WRONG_LIST';
-module.exports.codeToName[1354] = 'ER_WARN_VIEW_MERGE';
-module.exports.codeToName[1355] = 'ER_WARN_VIEW_WITHOUT_KEY';
-module.exports.codeToName[1356] = 'ER_VIEW_INVALID';
-module.exports.codeToName[1357] = 'ER_SP_NO_DROP_SP';
-module.exports.codeToName[1358] = 'ER_SP_GOTO_IN_HNDLR';
-module.exports.codeToName[1359] = 'ER_TRG_ALREADY_EXISTS';
-module.exports.codeToName[1360] = 'ER_TRG_DOES_NOT_EXIST';
-module.exports.codeToName[1361] = 'ER_TRG_ON_VIEW_OR_TEMP_TABLE';
-module.exports.codeToName[1362] = 'ER_TRG_CANT_CHANGE_ROW';
-module.exports.codeToName[1363] = 'ER_TRG_NO_SUCH_ROW_IN_TRG';
-module.exports.codeToName[1364] = 'ER_NO_DEFAULT_FOR_FIELD';
-module.exports.codeToName[1365] = 'ER_DIVISION_BY_ZERO';
-module.exports.codeToName[1366] = 'ER_TRUNCATED_WRONG_VALUE_FOR_FIELD';
-module.exports.codeToName[1367] = 'ER_ILLEGAL_VALUE_FOR_TYPE';
-module.exports.codeToName[1368] = 'ER_VIEW_NONUPD_CHECK';
-module.exports.codeToName[1369] = 'ER_VIEW_CHECK_FAILED';
-module.exports.codeToName[1370] = 'ER_PROCACCESS_DENIED_ERROR';
-module.exports.codeToName[1371] = 'ER_RELAY_LOG_FAIL';
-module.exports.codeToName[1372] = 'ER_PASSWD_LENGTH';
-module.exports.codeToName[1373] = 'ER_UNKNOWN_TARGET_BINLOG';
-module.exports.codeToName[1374] = 'ER_IO_ERR_LOG_INDEX_READ';
-module.exports.codeToName[1375] = 'ER_BINLOG_PURGE_PROHIBITED';
-module.exports.codeToName[1376] = 'ER_FSEEK_FAIL';
-module.exports.codeToName[1377] = 'ER_BINLOG_PURGE_FATAL_ERR';
-module.exports.codeToName[1378] = 'ER_LOG_IN_USE';
-module.exports.codeToName[1379] = 'ER_LOG_PURGE_UNKNOWN_ERR';
-module.exports.codeToName[1380] = 'ER_RELAY_LOG_INIT';
-module.exports.codeToName[1381] = 'ER_NO_BINARY_LOGGING';
-module.exports.codeToName[1382] = 'ER_RESERVED_SYNTAX';
-module.exports.codeToName[1383] = 'ER_WSAS_FAILED';
-module.exports.codeToName[1384] = 'ER_DIFF_GROUPS_PROC';
-module.exports.codeToName[1385] = 'ER_NO_GROUP_FOR_PROC';
-module.exports.codeToName[1386] = 'ER_ORDER_WITH_PROC';
-module.exports.codeToName[1387] = 'ER_LOGGING_PROHIBIT_CHANGING_OF';
-module.exports.codeToName[1388] = 'ER_NO_FILE_MAPPING';
-module.exports.codeToName[1389] = 'ER_WRONG_MAGIC';
-module.exports.codeToName[1390] = 'ER_PS_MANY_PARAM';
-module.exports.codeToName[1391] = 'ER_KEY_PART_';
-module.exports.codeToName[1392] = 'ER_VIEW_CHECKSUM';
-module.exports.codeToName[1393] = 'ER_VIEW_MULTIUPDATE';
-module.exports.codeToName[1394] = 'ER_VIEW_NO_INSERT_FIELD_LIST';
-module.exports.codeToName[1395] = 'ER_VIEW_DELETE_MERGE_VIEW';
-module.exports.codeToName[1396] = 'ER_CANNOT_USER';
-module.exports.codeToName[1397] = 'ER_XAER_NOTA';
-module.exports.codeToName[1398] = 'ER_XAER_INVAL';
-module.exports.codeToName[1399] = 'ER_XAER_RMFAIL';
-module.exports.codeToName[1400] = 'ER_XAER_OUTSIDE';
-module.exports.codeToName[1401] = 'ER_XAER_RMERR';
-module.exports.codeToName[1402] = 'ER_XA_RBROLLBACK';
-module.exports.codeToName[1403] = 'ER_NONEXISTING_PROC_GRANT';
-module.exports.codeToName[1404] = 'ER_PROC_AUTO_GRANT_FAIL';
-module.exports.codeToName[1405] = 'ER_PROC_AUTO_REVOKE_FAIL';
-module.exports.codeToName[1406] = 'ER_DATA_TOO_LONG';
-module.exports.codeToName[1407] = 'ER_SP_BAD_SQLSTATE';
-module.exports.codeToName[1408] = 'ER_STARTUP';
-module.exports.codeToName[1409] = 'ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR';
-module.exports.codeToName[1410] = 'ER_CANT_CREATE_USER_WITH_GRANT';
-module.exports.codeToName[1411] = 'ER_WRONG_VALUE_FOR_TYPE';
-module.exports.codeToName[1412] = 'ER_TABLE_DEF_CHANGED';
-module.exports.codeToName[1413] = 'ER_SP_DUP_HANDLER';
-module.exports.codeToName[1414] = 'ER_SP_NOT_VAR_ARG';
-module.exports.codeToName[1415] = 'ER_SP_NO_RETSET';
-module.exports.codeToName[1416] = 'ER_CANT_CREATE_GEOMETRY_OBJECT';
-module.exports.codeToName[1417] = 'ER_FAILED_ROUTINE_BREAK_BINLOG';
-module.exports.codeToName[1418] = 'ER_BINLOG_UNSAFE_ROUTINE';
-module.exports.codeToName[1419] = 'ER_BINLOG_CREATE_ROUTINE_NEED_SUPER';
-module.exports.codeToName[1420] = 'ER_EXEC_STMT_WITH_OPEN_CURSOR';
-module.exports.codeToName[1421] = 'ER_STMT_HAS_NO_OPEN_CURSOR';
-module.exports.codeToName[1422] = 'ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG';
-module.exports.codeToName[1423] = 'ER_NO_DEFAULT_FOR_VIEW_FIELD';
-module.exports.codeToName[1424] = 'ER_SP_NO_RECURSION';
-module.exports.codeToName[1425] = 'ER_TOO_BIG_SCALE';
-module.exports.codeToName[1426] = 'ER_TOO_BIG_PRECISION';
-module.exports.codeToName[1427] = 'ER_M_BIGGER_THAN_D';
-module.exports.codeToName[1428] = 'ER_WRONG_LOCK_OF_SYSTEM_TABLE';
-module.exports.codeToName[1429] = 'ER_CONNECT_TO_FOREIGN_DATA_SOURCE';
-module.exports.codeToName[1430] = 'ER_QUERY_ON_FOREIGN_DATA_SOURCE';
-module.exports.codeToName[1431] = 'ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST';
-module.exports.codeToName[1432] = 'ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE';
-module.exports.codeToName[1433] = 'ER_FOREIGN_DATA_STRING_INVALID';
-module.exports.codeToName[1434] = 'ER_CANT_CREATE_FEDERATED_TABLE';
-module.exports.codeToName[1435] = 'ER_TRG_IN_WRONG_SCHEMA';
-module.exports.codeToName[1436] = 'ER_STACK_OVERRUN_NEED_MORE';
-module.exports.codeToName[1437] = 'ER_TOO_LONG_BODY';
-module.exports.codeToName[1438] = 'ER_WARN_CANT_DROP_DEFAULT_KEYCACHE';
-module.exports.codeToName[1439] = 'ER_TOO_BIG_DISPLAYWIDTH';
-module.exports.codeToName[1440] = 'ER_XAER_DUPID';
-module.exports.codeToName[1441] = 'ER_DATETIME_FUNCTION_OVERFLOW';
-module.exports.codeToName[1442] = 'ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG';
-module.exports.codeToName[1443] = 'ER_VIEW_PREVENT_UPDATE';
-module.exports.codeToName[1444] = 'ER_PS_NO_RECURSION';
-module.exports.codeToName[1445] = 'ER_SP_CANT_SET_AUTOCOMMIT';
-module.exports.codeToName[1446] = 'ER_MALFORMED_DEFINER';
-module.exports.codeToName[1447] = 'ER_VIEW_FRM_NO_USER';
-module.exports.codeToName[1448] = 'ER_VIEW_OTHER_USER';
-module.exports.codeToName[1449] = 'ER_NO_SUCH_USER';
-module.exports.codeToName[1450] = 'ER_FORBID_SCHEMA_CHANGE';
-module.exports.codeToName[1451] = 'ER_ROW_IS_REFERENCED_';
-module.exports.codeToName[1452] = 'ER_NO_REFERENCED_ROW_';
-module.exports.codeToName[1453] = 'ER_SP_BAD_VAR_SHADOW';
-module.exports.codeToName[1454] = 'ER_TRG_NO_DEFINER';
-module.exports.codeToName[1455] = 'ER_OLD_FILE_FORMAT';
-module.exports.codeToName[1456] = 'ER_SP_RECURSION_LIMIT';
-module.exports.codeToName[1457] = 'ER_SP_PROC_TABLE_CORRUPT';
-module.exports.codeToName[1458] = 'ER_SP_WRONG_NAME';
-module.exports.codeToName[1459] = 'ER_TABLE_NEEDS_UPGRADE';
-module.exports.codeToName[1460] = 'ER_SP_NO_AGGREGATE';
-module.exports.codeToName[1461] = 'ER_MAX_PREPARED_STMT_COUNT_REACHED';
-module.exports.codeToName[1462] = 'ER_VIEW_RECURSIVE';
-module.exports.codeToName[1463] = 'ER_NON_GROUPING_FIELD_USED';
-module.exports.codeToName[1464] = 'ER_TABLE_CANT_HANDLE_SPKEYS';
-module.exports.codeToName[1465] = 'ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA';
-module.exports.codeToName[1466] = 'ER_REMOVED_SPACES';
-module.exports.codeToName[1467] = 'ER_AUTOINC_READ_FAILED';
-module.exports.codeToName[1468] = 'ER_USERNAME';
-module.exports.codeToName[1469] = 'ER_HOSTNAME';
-module.exports.codeToName[1470] = 'ER_WRONG_STRING_LENGTH';
-module.exports.codeToName[1471] = 'ER_NON_INSERTABLE_TABLE';
-module.exports.codeToName[1472] = 'ER_ADMIN_WRONG_MRG_TABLE';
-module.exports.codeToName[1473] = 'ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT';
-module.exports.codeToName[1474] = 'ER_NAME_BECOMES_EMPTY';
-module.exports.codeToName[1475] = 'ER_AMBIGUOUS_FIELD_TERM';
-module.exports.codeToName[1476] = 'ER_FOREIGN_SERVER_EXISTS';
-module.exports.codeToName[1477] = 'ER_FOREIGN_SERVER_DOESNT_EXIST';
-module.exports.codeToName[1478] = 'ER_ILLEGAL_HA_CREATE_OPTION';
-module.exports.codeToName[1479] = 'ER_PARTITION_REQUIRES_VALUES_ERROR';
-module.exports.codeToName[1480] = 'ER_PARTITION_WRONG_VALUES_ERROR';
-module.exports.codeToName[1481] = 'ER_PARTITION_MAXVALUE_ERROR';
-module.exports.codeToName[1482] = 'ER_PARTITION_SUBPARTITION_ERROR';
-module.exports.codeToName[1483] = 'ER_PARTITION_SUBPART_MIX_ERROR';
-module.exports.codeToName[1484] = 'ER_PARTITION_WRONG_NO_PART_ERROR';
-module.exports.codeToName[1485] = 'ER_PARTITION_WRONG_NO_SUBPART_ERROR';
-module.exports.codeToName[1486] = 'ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR';
-module.exports.codeToName[1487] = 'ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR';
-module.exports.codeToName[1488] = 'ER_FIELD_NOT_FOUND_PART_ERROR';
-module.exports.codeToName[1489] = 'ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR';
-module.exports.codeToName[1490] = 'ER_INCONSISTENT_PARTITION_INFO_ERROR';
-module.exports.codeToName[1491] = 'ER_PARTITION_FUNC_NOT_ALLOWED_ERROR';
-module.exports.codeToName[1492] = 'ER_PARTITIONS_MUST_BE_DEFINED_ERROR';
-module.exports.codeToName[1493] = 'ER_RANGE_NOT_INCREASING_ERROR';
-module.exports.codeToName[1494] = 'ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR';
-module.exports.codeToName[1495] = 'ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR';
-module.exports.codeToName[1496] = 'ER_PARTITION_ENTRY_ERROR';
-module.exports.codeToName[1497] = 'ER_MIX_HANDLER_ERROR';
-module.exports.codeToName[1498] = 'ER_PARTITION_NOT_DEFINED_ERROR';
-module.exports.codeToName[1499] = 'ER_TOO_MANY_PARTITIONS_ERROR';
-module.exports.codeToName[1500] = 'ER_SUBPARTITION_ERROR';
-module.exports.codeToName[1501] = 'ER_CANT_CREATE_HANDLER_FILE';
-module.exports.codeToName[1502] = 'ER_BLOB_FIELD_IN_PART_FUNC_ERROR';
-module.exports.codeToName[1503] = 'ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF';
-module.exports.codeToName[1504] = 'ER_NO_PARTS_ERROR';
-module.exports.codeToName[1505] = 'ER_PARTITION_MGMT_ON_NONPARTITIONED';
-module.exports.codeToName[1506] = 'ER_FOREIGN_KEY_ON_PARTITIONED';
-module.exports.codeToName[1507] = 'ER_DROP_PARTITION_NON_EXISTENT';
-module.exports.codeToName[1508] = 'ER_DROP_LAST_PARTITION';
-module.exports.codeToName[1509] = 'ER_COALESCE_ONLY_ON_HASH_PARTITION';
-module.exports.codeToName[1510] = 'ER_REORG_HASH_ONLY_ON_SAME_NO';
-module.exports.codeToName[1511] = 'ER_REORG_NO_PARAM_ERROR';
-module.exports.codeToName[1512] = 'ER_ONLY_ON_RANGE_LIST_PARTITION';
-module.exports.codeToName[1513] = 'ER_ADD_PARTITION_SUBPART_ERROR';
-module.exports.codeToName[1514] = 'ER_ADD_PARTITION_NO_NEW_PARTITION';
-module.exports.codeToName[1515] = 'ER_COALESCE_PARTITION_NO_PARTITION';
-module.exports.codeToName[1516] = 'ER_REORG_PARTITION_NOT_EXIST';
-module.exports.codeToName[1517] = 'ER_SAME_NAME_PARTITION';
-module.exports.codeToName[1518] = 'ER_NO_BINLOG_ERROR';
-module.exports.codeToName[1519] = 'ER_CONSECUTIVE_REORG_PARTITIONS';
-module.exports.codeToName[1520] = 'ER_REORG_OUTSIDE_RANGE';
-module.exports.codeToName[1521] = 'ER_PARTITION_FUNCTION_FAILURE';
-module.exports.codeToName[1522] = 'ER_PART_STATE_ERROR';
-module.exports.codeToName[1523] = 'ER_LIMITED_PART_RANGE';
-module.exports.codeToName[1524] = 'ER_PLUGIN_IS_NOT_LOADED';
-module.exports.codeToName[1525] = 'ER_WRONG_VALUE';
-module.exports.codeToName[1526] = 'ER_NO_PARTITION_FOR_GIVEN_VALUE';
-module.exports.codeToName[1527] = 'ER_FILEGROUP_OPTION_ONLY_ONCE';
-module.exports.codeToName[1528] = 'ER_CREATE_FILEGROUP_FAILED';
-module.exports.codeToName[1529] = 'ER_DROP_FILEGROUP_FAILED';
-module.exports.codeToName[1530] = 'ER_TABLESPACE_AUTO_EXTEND_ERROR';
-module.exports.codeToName[1531] = 'ER_WRONG_SIZE_NUMBER';
-module.exports.codeToName[1532] = 'ER_SIZE_OVERFLOW_ERROR';
-module.exports.codeToName[1533] = 'ER_ALTER_FILEGROUP_FAILED';
-module.exports.codeToName[1534] = 'ER_BINLOG_ROW_LOGGING_FAILED';
-module.exports.codeToName[1535] = 'ER_BINLOG_ROW_WRONG_TABLE_DEF';
-module.exports.codeToName[1536] = 'ER_BINLOG_ROW_RBR_TO_SBR';
-module.exports.codeToName[1537] = 'ER_EVENT_ALREADY_EXISTS';
-module.exports.codeToName[1538] = 'ER_EVENT_STORE_FAILED';
-module.exports.codeToName[1539] = 'ER_EVENT_DOES_NOT_EXIST';
-module.exports.codeToName[1540] = 'ER_EVENT_CANT_ALTER';
-module.exports.codeToName[1541] = 'ER_EVENT_DROP_FAILED';
-module.exports.codeToName[1542] = 'ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG';
-module.exports.codeToName[1543] = 'ER_EVENT_ENDS_BEFORE_STARTS';
-module.exports.codeToName[1544] = 'ER_EVENT_EXEC_TIME_IN_THE_PAST';
-module.exports.codeToName[1545] = 'ER_EVENT_OPEN_TABLE_FAILED';
-module.exports.codeToName[1546] = 'ER_EVENT_NEITHER_M_EXPR_NOR_M_AT';
-module.exports.codeToName[1547] = 'ER_COL_COUNT_DOESNT_MATCH_CORRUPTED';
-module.exports.codeToName[1548] = 'ER_CANNOT_LOAD_FROM_TABLE';
-module.exports.codeToName[1549] = 'ER_EVENT_CANNOT_DELETE';
-module.exports.codeToName[1550] = 'ER_EVENT_COMPILE_ERROR';
-module.exports.codeToName[1551] = 'ER_EVENT_SAME_NAME';
-module.exports.codeToName[1552] = 'ER_EVENT_DATA_TOO_LONG';
-module.exports.codeToName[1553] = 'ER_DROP_INDEX_FK';
-module.exports.codeToName[1554] = 'ER_WARN_DEPRECATED_SYNTAX_WITH_VER';
-module.exports.codeToName[1555] = 'ER_CANT_WRITE_LOCK_LOG_TABLE';
-module.exports.codeToName[1556] = 'ER_CANT_LOCK_LOG_TABLE';
-module.exports.codeToName[1557] = 'ER_FOREIGN_DUPLICATE_KEY';
-module.exports.codeToName[1558] = 'ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE';
-module.exports.codeToName[1559] = 'ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR';
-module.exports.codeToName[1560] = 'ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT';
-module.exports.codeToName[1561] = 'ER_NDB_CANT_SWITCH_BINLOG_FORMAT';
-module.exports.codeToName[1562] = 'ER_PARTITION_NO_TEMPORARY';
-module.exports.codeToName[1563] = 'ER_PARTITION_CONST_DOMAIN_ERROR';
-module.exports.codeToName[1564] = 'ER_PARTITION_FUNCTION_IS_NOT_ALLOWED';
-module.exports.codeToName[1565] = 'ER_DDL_LOG_ERROR';
-module.exports.codeToName[1566] = 'ER_NULL_IN_VALUES_LESS_THAN';
-module.exports.codeToName[1567] = 'ER_WRONG_PARTITION_NAME';
-module.exports.codeToName[1568] = 'ER_CANT_CHANGE_TX_ISOLATION';
-module.exports.codeToName[1569] = 'ER_DUP_ENTRY_AUTOINCREMENT_CASE';
-module.exports.codeToName[1570] = 'ER_EVENT_MODIFY_QUEUE_ERROR';
-module.exports.codeToName[1571] = 'ER_EVENT_SET_VAR_ERROR';
-module.exports.codeToName[1572] = 'ER_PARTITION_MERGE_ERROR';
-module.exports.codeToName[1573] = 'ER_CANT_ACTIVATE_LOG';
-module.exports.codeToName[1574] = 'ER_RBR_NOT_AVAILABLE';
-module.exports.codeToName[1575] = 'ER_BASE';
-module.exports.codeToName[1576] = 'ER_EVENT_RECURSION_FORBIDDEN';
-module.exports.codeToName[1577] = 'ER_EVENTS_DB_ERROR';
-module.exports.codeToName[1578] = 'ER_ONLY_INTEGERS_ALLOWED';
-module.exports.codeToName[1579] = 'ER_UNSUPORTED_LOG_ENGINE';
-module.exports.codeToName[1580] = 'ER_BAD_LOG_STATEMENT';
-module.exports.codeToName[1581] = 'ER_CANT_RENAME_LOG_TABLE';
-module.exports.codeToName[1582] = 'ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT';
-module.exports.codeToName[1583] = 'ER_WRONG_PARAMETERS_TO_NATIVE_FCT';
-module.exports.codeToName[1584] = 'ER_WRONG_PARAMETERS_TO_STORED_FCT';
-module.exports.codeToName[1585] = 'ER_NATIVE_FCT_NAME_COLLISION';
-module.exports.codeToName[1586] = 'ER_DUP_ENTRY_WITH_KEY_NAME';
-module.exports.codeToName[1587] = 'ER_BINLOG_PURGE_EMFILE';
-module.exports.codeToName[1588] = 'ER_EVENT_CANNOT_CREATE_IN_THE_PAST';
-module.exports.codeToName[1589] = 'ER_EVENT_CANNOT_ALTER_IN_THE_PAST';
-module.exports.codeToName[1590] = 'ER_SLAVE_INCIDENT';
-module.exports.codeToName[1591] = 'ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT';
-module.exports.codeToName[1592] = 'ER_BINLOG_UNSAFE_STATEMENT';
-module.exports.codeToName[1593] = 'ER_SLAVE_FATAL_ERROR';
-module.exports.codeToName[1594] = 'ER_SLAVE_RELAY_LOG_READ_FAILURE';
-module.exports.codeToName[1595] = 'ER_SLAVE_RELAY_LOG_WRITE_FAILURE';
-module.exports.codeToName[1596] = 'ER_SLAVE_CREATE_EVENT_FAILURE';
-module.exports.codeToName[1597] = 'ER_SLAVE_MASTER_COM_FAILURE';
-module.exports.codeToName[1598] = 'ER_BINLOG_LOGGING_IMPOSSIBLE';
-module.exports.codeToName[1599] = 'ER_VIEW_NO_CREATION_CTX';
-module.exports.codeToName[1600] = 'ER_VIEW_INVALID_CREATION_CTX';
-module.exports.codeToName[1601] = 'ER_SR_INVALID_CREATION_CTX';
-module.exports.codeToName[1602] = 'ER_TRG_CORRUPTED_FILE';
-module.exports.codeToName[1603] = 'ER_TRG_NO_CREATION_CTX';
-module.exports.codeToName[1604] = 'ER_TRG_INVALID_CREATION_CTX';
-module.exports.codeToName[1605] = 'ER_EVENT_INVALID_CREATION_CTX';
-module.exports.codeToName[1606] = 'ER_TRG_CANT_OPEN_TABLE';
-module.exports.codeToName[1607] = 'ER_CANT_CREATE_SROUTINE';
-module.exports.codeToName[1608] = 'ER_NEVER_USED';
-module.exports.codeToName[1609] = 'ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT';
-module.exports.codeToName[1610] = 'ER_SLAVE_CORRUPT_EVENT';
-module.exports.codeToName[1611] = 'ER_LOAD_DATA_INVALID_COLUMN';
-module.exports.codeToName[1612] = 'ER_LOG_PURGE_NO_FILE';
-module.exports.codeToName[1613] = 'ER_XA_RBTIMEOUT';
-module.exports.codeToName[1614] = 'ER_XA_RBDEADLOCK';
-module.exports.codeToName[1615] = 'ER_NEED_REPREPARE';
-module.exports.codeToName[1616] = 'ER_DELAYED_NOT_SUPPORTED';
-module.exports.codeToName[1617] = 'WARN_NO_MASTER_INFO';
-module.exports.codeToName[1618] = 'WARN_OPTION_IGNORED';
-module.exports.codeToName[1619] = 'WARN_PLUGIN_DELETE_BUILTIN';
-module.exports.codeToName[1620] = 'WARN_PLUGIN_BUSY';
-module.exports.codeToName[1621] = 'ER_VARIABLE_IS_READONLY';
-module.exports.codeToName[1622] = 'ER_WARN_ENGINE_TRANSACTION_ROLLBACK';
-module.exports.codeToName[1623] = 'ER_SLAVE_HEARTBEAT_FAILURE';
-module.exports.codeToName[1624] = 'ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE';
-module.exports.codeToName[1625] = 'ER_NDB_REPLICATION_SCHEMA_ERROR';
-module.exports.codeToName[1626] = 'ER_CONFLICT_FN_PARSE_ERROR';
-module.exports.codeToName[1627] = 'ER_EXCEPTIONS_WRITE_ERROR';
-module.exports.codeToName[1628] = 'ER_TOO_LONG_TABLE_COMMENT';
-module.exports.codeToName[1629] = 'ER_TOO_LONG_FIELD_COMMENT';
-module.exports.codeToName[1630] = 'ER_FUNC_INEXISTENT_NAME_COLLISION';
-module.exports.codeToName[1631] = 'ER_DATABASE_NAME';
-module.exports.codeToName[1632] = 'ER_TABLE_NAME';
-module.exports.codeToName[1633] = 'ER_PARTITION_NAME';
-module.exports.codeToName[1634] = 'ER_SUBPARTITION_NAME';
-module.exports.codeToName[1635] = 'ER_TEMPORARY_NAME';
-module.exports.codeToName[1636] = 'ER_RENAMED_NAME';
-module.exports.codeToName[1637] = 'ER_TOO_MANY_CONCURRENT_TRXS';
-module.exports.codeToName[1638] = 'WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED';
-module.exports.codeToName[1639] = 'ER_DEBUG_SYNC_TIMEOUT';
-module.exports.codeToName[1640] = 'ER_DEBUG_SYNC_HIT_LIMIT';
-module.exports.codeToName[1641] = 'ER_DUP_SIGNAL_SET';
-module.exports.codeToName[1642] = 'ER_SIGNAL_WARN';
-module.exports.codeToName[1643] = 'ER_SIGNAL_NOT_FOUND';
-module.exports.codeToName[1644] = 'ER_SIGNAL_EXCEPTION';
-module.exports.codeToName[1645] = 'ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER';
-module.exports.codeToName[1646] = 'ER_SIGNAL_BAD_CONDITION_TYPE';
-module.exports.codeToName[1647] = 'WARN_COND_ITEM_TRUNCATED';
-module.exports.codeToName[1648] = 'ER_COND_ITEM_TOO_LONG';
-module.exports.codeToName[1649] = 'ER_UNKNOWN_LOCALE';
-module.exports.codeToName[1650] = 'ER_SLAVE_IGNORE_SERVER_IDS';
-module.exports.codeToName[1651] = 'ER_QUERY_CACHE_DISABLED';
-module.exports.codeToName[1652] = 'ER_SAME_NAME_PARTITION_FIELD';
-module.exports.codeToName[1653] = 'ER_PARTITION_COLUMN_LIST_ERROR';
-module.exports.codeToName[1654] = 'ER_WRONG_TYPE_COLUMN_VALUE_ERROR';
-module.exports.codeToName[1655] = 'ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR';
-module.exports.codeToName[1656] = 'ER_MAXVALUE_IN_VALUES_IN';
-module.exports.codeToName[1657] = 'ER_TOO_MANY_VALUES_ERROR';
-module.exports.codeToName[1658] = 'ER_ROW_SINGLE_PARTITION_FIELD_ERROR';
-module.exports.codeToName[1659] = 'ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD';
-module.exports.codeToName[1660] = 'ER_PARTITION_FIELDS_TOO_LONG';
-module.exports.codeToName[1661] = 'ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE';
-module.exports.codeToName[1662] = 'ER_BINLOG_ROW_MODE_AND_STMT_ENGINE';
-module.exports.codeToName[1663] = 'ER_BINLOG_UNSAFE_AND_STMT_ENGINE';
-module.exports.codeToName[1664] = 'ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE';
-module.exports.codeToName[1665] = 'ER_BINLOG_STMT_MODE_AND_ROW_ENGINE';
-module.exports.codeToName[1666] = 'ER_BINLOG_ROW_INJECTION_AND_STMT_MODE';
-module.exports.codeToName[1667] = 'ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE';
-module.exports.codeToName[1668] = 'ER_BINLOG_UNSAFE_LIMIT';
-module.exports.codeToName[1669] = 'ER_BINLOG_UNSAFE_INSERT_DELAYED';
-module.exports.codeToName[1670] = 'ER_BINLOG_UNSAFE_SYSTEM_TABLE';
-module.exports.codeToName[1671] = 'ER_BINLOG_UNSAFE_AUTOINC_COLUMNS';
-module.exports.codeToName[1672] = 'ER_BINLOG_UNSAFE_UDF';
-module.exports.codeToName[1673] = 'ER_BINLOG_UNSAFE_SYSTEM_VARIABLE';
-module.exports.codeToName[1674] = 'ER_BINLOG_UNSAFE_SYSTEM_FUNCTION';
-module.exports.codeToName[1675] = 'ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS';
-module.exports.codeToName[1676] = 'ER_MESSAGE_AND_STATEMENT';
-module.exports.codeToName[1677] = 'ER_SLAVE_CONVERSION_FAILED';
-module.exports.codeToName[1678] = 'ER_SLAVE_CANT_CREATE_CONVERSION';
-module.exports.codeToName[1679] = 'ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT';
-module.exports.codeToName[1680] = 'ER_PATH_LENGTH';
-module.exports.codeToName[1681] = 'ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT';
-module.exports.codeToName[1682] = 'ER_WRONG_NATIVE_TABLE_STRUCTURE';
-module.exports.codeToName[1683] = 'ER_WRONG_PERFSCHEMA_USAGE';
-module.exports.codeToName[1684] = 'ER_WARN_I_S_SKIPPED_TABLE';
-module.exports.codeToName[1685] = 'ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT';
-module.exports.codeToName[1686] = 'ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT';
-module.exports.codeToName[1687] = 'ER_SPATIAL_MUST_HAVE_GEOM_COL';
-module.exports.codeToName[1688] = 'ER_TOO_LONG_INDEX_COMMENT';
-module.exports.codeToName[1689] = 'ER_LOCK_ABORTED';
-module.exports.codeToName[1690] = 'ER_DATA_OUT_OF_RANGE';
-module.exports.codeToName[1691] = 'ER_WRONG_SPVAR_TYPE_IN_LIMIT';
-module.exports.codeToName[1692] = 'ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE';
-module.exports.codeToName[1693] = 'ER_BINLOG_UNSAFE_MIXED_STATEMENT';
-module.exports.codeToName[1694] = 'ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN';
-module.exports.codeToName[1695] = 'ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN';
-module.exports.codeToName[1696] = 'ER_FAILED_READ_FROM_PAR_FILE';
-module.exports.codeToName[1697] = 'ER_VALUES_IS_NOT_INT_TYPE_ERROR';
-module.exports.codeToName[1698] = 'ER_ACCESS_DENIED_NO_PASSWORD_ERROR';
-module.exports.codeToName[1699] = 'ER_SET_PASSWORD_AUTH_PLUGIN';
-module.exports.codeToName[1700] = 'ER_GRANT_PLUGIN_USER_EXISTS';
-module.exports.codeToName[1701] = 'ER_TRUNCATE_ILLEGAL_FK';
-module.exports.codeToName[1702] = 'ER_PLUGIN_IS_PERMANENT';
-module.exports.codeToName[1703] = 'ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN';
-module.exports.codeToName[1704] = 'ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX';
-module.exports.codeToName[1705] = 'ER_STMT_CACHE_FULL';
-module.exports.codeToName[1706] = 'ER_MULTI_UPDATE_KEY_CONFLICT';
-module.exports.codeToName[1707] = 'ER_TABLE_NEEDS_REBUILD';
-module.exports.codeToName[1708] = 'WARN_OPTION_BELOW_LIMIT';
-module.exports.codeToName[1709] = 'ER_INDEX_COLUMN_TOO_LONG';
-module.exports.codeToName[1710] = 'ER_ERROR_IN_TRIGGER_BODY';
-module.exports.codeToName[1711] = 'ER_ERROR_IN_UNKNOWN_TRIGGER_BODY';
-module.exports.codeToName[1712] = 'ER_INDEX_CORRUPT';
-module.exports.codeToName[1713] = 'ER_UNDO_RECORD_TOO_BIG';
-module.exports.codeToName[1714] = 'ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT';
-module.exports.codeToName[1715] = 'ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE';
-module.exports.codeToName[1716] = 'ER_BINLOG_UNSAFE_REPLACE_SELECT';
-module.exports.codeToName[1717] = 'ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT';
-module.exports.codeToName[1718] = 'ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT';
-module.exports.codeToName[1719] = 'ER_BINLOG_UNSAFE_UPDATE_IGNORE';
-module.exports.codeToName[1720] = 'ER_PLUGIN_NO_UNINSTALL';
-module.exports.codeToName[1721] = 'ER_PLUGIN_NO_INSTALL';
-module.exports.codeToName[1722] = 'ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT';
-module.exports.codeToName[1723] = 'ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC';
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/field_flags.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/field_flags.js
deleted file mode 100644
index 3fe05c39242f805ef8cfcd4c581ae672347c1614..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/field_flags.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// Manually extracted from mysql-5.5.23/include/mysql_com.h
-exports.NOT_NULL     = 1; /* Field can't be NULL */
-exports.PRI_KEY      = 2; /* Field is part of a primary key */
-exports.UNIQUE_KEY   = 4; /* Field is part of a unique key */
-exports.MULTIPLE_KEY = 8; /* Field is part of a key */
-exports.BLOB         = 16; /* Field is a blob */
-exports.UNSIGNED     = 32; /* Field is unsigned */
-exports.ZEROFILL     = 64; /* Field is zerofill */
-exports.BINARY       = 128; /* Field is binary   */
-
-/* The following are only sent to new clients */
-exports.ENUM             = 256; /* field is an enum */
-exports.AUTO_INCREMENT   = 512; /* field is a autoincrement field */
-exports.TIMESTAMP        = 1024; /* Field is a timestamp */
-exports.SET              = 2048; /* field is a set */
-exports.NO_DEFAULT_VALUE = 4096; /* Field doesn't have default value */
-exports.ON_UPDATE_NOW    = 8192; /* Field is set to NOW on UPDATE */
-exports.NUM              = 32768; /* Field is num (for clients) */
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/server_status.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/server_status.js
deleted file mode 100644
index 5537ee5b47905738edcb2718d946a7dc1b225522..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/server_status.js
+++ /dev/null
@@ -1,39 +0,0 @@
-// Manually extracted from mysql-5.5.23/include/mysql_com.h
-
-/**
-  Is raised when a multi-statement transaction
-  has been started, either explicitly, by means
-  of BEGIN or COMMIT AND CHAIN, or
-  implicitly, by the first transactional
-  statement, when autocommit=off.
-*/
-exports.SERVER_STATUS_IN_TRANS          = 1;
-exports.SERVER_STATUS_AUTOCOMMIT        = 2;  /* Server in auto_commit mode */
-exports.SERVER_MORE_RESULTS_EXISTS      = 8;    /* Multi query - next query exists */
-exports.SERVER_QUERY_NO_GOOD_INDEX_USED = 16;
-exports.SERVER_QUERY_NO_INDEX_USED      = 32;
-/**
-  The server was able to fulfill the clients request and opened a
-  read-only non-scrollable cursor for a query. This flag comes
-  in reply to COM_STMT_EXECUTE and COM_STMT_FETCH commands.
-*/
-exports.SERVER_STATUS_CURSOR_EXISTS = 64;
-/**
-  This flag is sent when a read-only cursor is exhausted, in reply to
-  COM_STMT_FETCH command.
-*/
-exports.SERVER_STATUS_LAST_ROW_SENT        = 128;
-exports.SERVER_STATUS_DB_DROPPED           = 256; /* A database was dropped */
-exports.SERVER_STATUS_NO_BACKSLASH_ESCAPES = 512;
-/**
-  Sent to the client if after a prepared statement reprepare
-  we discovered that the new statement returns a different 
-  number of result set columns.
-*/
-exports.SERVER_STATUS_METADATA_CHANGED = 1024;
-exports.SERVER_QUERY_WAS_SLOW          = 2048;
-
-/**
-  To mark ResultSet containing output parameter values.
-*/
-exports.SERVER_PS_OUT_PARAMS = 4096;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/ssl_profiles.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/ssl_profiles.js
deleted file mode 100644
index 51a704f0f9ad23c1af015c7f8850fc5a02e6c8c8..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/ssl_profiles.js
+++ /dev/null
@@ -1,265 +0,0 @@
-// Certificate for Amazon RDS (Updated for 2015)
-exports['Amazon RDS'] = {
-    ca: [
-        '-----BEGIN CERTIFICATE-----\n'
-        + 'MIIDQzCCAqygAwIBAgIJAOd1tlfiGoEoMA0GCSqGSIb3DQEBBQUAMHUxCzAJBgNV\n'
-        + 'BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdTZWF0dGxlMRMw\n'
-        + 'EQYDVQQKEwpBbWF6b24uY29tMQwwCgYDVQQLEwNSRFMxHDAaBgNVBAMTE2F3cy5h\n'
-        + 'bWF6b24uY29tL3Jkcy8wHhcNMTAwNDA1MjI0NDMxWhcNMTUwNDA0MjI0NDMxWjB1\n'
-        + 'MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHU2Vh\n'
-        + 'dHRsZTETMBEGA1UEChMKQW1hem9uLmNvbTEMMAoGA1UECxMDUkRTMRwwGgYDVQQD\n'
-        + 'ExNhd3MuYW1hem9uLmNvbS9yZHMvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\n'
-        + 'gQDKhXGU7tizxUR5WaFoMTFcxNxa05PEjZaIOEN5ctkWrqYSRov0/nOMoZjqk8bC\n'
-        + 'med9vPFoQGD0OTakPs0jVe3wwmR735hyVwmKIPPsGlaBYj1O6llIpZeQVyupNx56\n'
-        + 'UzqtiLaDzh1KcmfqP3qP2dInzBfJQKjiRudo1FWnpPt33QIDAQABo4HaMIHXMB0G\n'
-        + 'A1UdDgQWBBT/H3x+cqSkR/ePSIinPtc4yWKe3DCBpwYDVR0jBIGfMIGcgBT/H3x+\n'
-        + 'cqSkR/ePSIinPtc4yWKe3KF5pHcwdTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh\n'
-        + 'c2hpbmd0b24xEDAOBgNVBAcTB1NlYXR0bGUxEzARBgNVBAoTCkFtYXpvbi5jb20x\n'
-        + 'DDAKBgNVBAsTA1JEUzEcMBoGA1UEAxMTYXdzLmFtYXpvbi5jb20vcmRzL4IJAOd1\n'
-        + 'tlfiGoEoMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAvguZy/BDT66x\n'
-        + 'GfgnJlyQwnFSeVLQm9u/FIvz4huGjbq9dqnD6h/Gm56QPFdyMEyDiZWaqY6V08lY\n'
-        + 'LTBNb4kcIc9/6pc0/ojKciP5QJRm6OiZ4vgG05nF4fYjhU7WClUx7cxq1fKjNc2J\n'
-        + 'UCmmYqgiVkAGWRETVo+byOSDZ4swb10=\n'
-        + '-----END CERTIFICATE-----\n',
-        '-----BEGIN CERTIFICATE-----\n'
-        + 'MIID9DCCAtygAwIBAgIBQjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n'
-        + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n'
-        + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n'
-        + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUwOTExMzFaFw0y\n'
-        + 'MDAzMDUwOTExMzFaMIGKMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n'
-        + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n'
-        + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEbMBkGA1UEAwwSQW1hem9uIFJE\n'
-        + 'UyBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuD8nrZ8V\n'
-        + 'u+VA8yVlUipCZIKPTDcOILYpUe8Tct0YeQQr0uyl018StdBsa3CjBgvwpDRq1HgF\n'
-        + 'Ji2N3+39+shCNspQeE6aYU+BHXhKhIIStt3r7gl/4NqYiDDMWKHxHq0nsGDFfArf\n'
-        + 'AOcjZdJagOMqb3fF46flc8k2E7THTm9Sz4L7RY1WdABMuurpICLFE3oHcGdapOb9\n'
-        + 'T53pQR+xpHW9atkcf3pf7gbO0rlKVSIoUenBlZipUlp1VZl/OD/E+TtRhDDNdI2J\n'
-        + 'P/DSMM3aEsq6ZQkfbz/Ilml+Lx3tJYXUDmp+ZjzMPLk/+3beT8EhrwtcG3VPpvwp\n'
-        + 'BIOqsqVVTvw/CwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw\n'
-        + 'AwEB/zAdBgNVHQ4EFgQUTgLurD72FchM7Sz1BcGPnIQISYMwHwYDVR0jBBgwFoAU\n'
-        + 'TgLurD72FchM7Sz1BcGPnIQISYMwDQYJKoZIhvcNAQEFBQADggEBAHZcgIio8pAm\n'
-        + 'MjHD5cl6wKjXxScXKtXygWH2BoDMYBJF9yfyKO2jEFxYKbHePpnXB1R04zJSWAw5\n'
-        + '2EUuDI1pSBh9BA82/5PkuNlNeSTB3dXDD2PEPdzVWbSKvUB8ZdooV+2vngL0Zm4r\n'
-        + '47QPyd18yPHrRIbtBtHR/6CwKevLZ394zgExqhnekYKIqqEX41xsUV0Gm6x4vpjf\n'
-        + '2u6O/+YE2U+qyyxHE5Wd5oqde0oo9UUpFETJPVb6Q2cEeQib8PBAyi0i6KnF+kIV\n'
-        + 'A9dY7IHSubtCK/i8wxMVqfd5GtbA8mmpeJFwnDvm9rBEsHybl08qlax9syEwsUYr\n'
-        + '/40NawZfTUU=\n'
-        + '-----END CERTIFICATE-----\n',
-        '-----BEGIN CERTIFICATE-----\n'
-        + 'MIIEATCCAumgAwIBAgIBRDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n'
-        + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n'
-        + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n'
-        + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMDZaFw0y\n'
-        + 'MDAzMDUyMjAzMDZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n'
-        + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n'
-        + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n'
-        + 'UyBhcC1ub3J0aGVhc3QtMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n'
-        + 'ggEBAMmM2B4PfTXCZjbZMWiDPyxvk/eeNwIRJAhfzesiGUiLozX6CRy3rwC1ZOPV\n'
-        + 'AcQf0LB+O8wY88C/cV+d4Q2nBDmnk+Vx7o2MyMh343r5rR3Na+4izd89tkQVt0WW\n'
-        + 'vO21KRH5i8EuBjinboOwAwu6IJ+HyiQiM0VjgjrmEr/YzFPL8MgHD/YUHehqjACn\n'
-        + 'C0+B7/gu7W4qJzBL2DOf7ub2qszGtwPE+qQzkCRDwE1A4AJmVE++/FLH2Zx78Egg\n'
-        + 'fV1sUxPtYgjGH76VyyO6GNKM6rAUMD/q5mnPASQVIXgKbupr618bnH+SWHFjBqZq\n'
-        + 'HvDGPMtiiWII41EmGUypyt5AbysCAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n'
-        + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFIiKM0Q6n1K4EmLxs3ZXxINbwEwR\n'
-        + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n'
-        + 'A4IBAQBezGbE9Rw/k2e25iGjj5n8r+M3dlye8ORfCE/dijHtxqAKasXHgKX8I9Tw\n'
-        + 'JkBiGWiuzqn7gO5MJ0nMMro1+gq29qjZnYX1pDHPgsRjUX8R+juRhgJ3JSHijRbf\n'
-        + '4qNJrnwga7pj94MhcLq9u0f6dxH6dXbyMv21T4TZMTmcFduf1KgaiVx1PEyJjC6r\n'
-        + 'M+Ru+A0eM+jJ7uCjUoZKcpX8xkj4nmSnz9NMPog3wdOSB9cAW7XIc5mHa656wr7I\n'
-        + 'WJxVcYNHTXIjCcng2zMKd1aCcl2KSFfy56sRfT7J5Wp69QSr+jq8KM55gw8uqAwi\n'
-        + 'VPrXn2899T1rcTtFYFP16WXjGuc0\n'
-        + '-----END CERTIFICATE-----\n',
-        '-----BEGIN CERTIFICATE-----\n'
-        + 'MIIEATCCAumgAwIBAgIBRTANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n'
-        + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n'
-        + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n'
-        + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMTlaFw0y\n'
-        + 'MDAzMDUyMjAzMTlaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n'
-        + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n'
-        + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n'
-        + 'UyBhcC1zb3V0aGVhc3QtMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n'
-        + 'ggEBANaXElmSEYt/UtxHFsARFhSUahTf1KNJzR0Dmay6hqOXQuRVbKRwPd19u5vx\n'
-        + 'DdF1sLT7D69IK3VDnUiQScaCv2Dpu9foZt+rLx+cpx1qiQd1UHrvqq8xPzQOqCdC\n'
-        + 'RFStq6yVYZ69yfpfoI67AjclMOjl2Vph3ftVnqP0IgVKZdzeC7fd+umGgR9xY0Qr\n'
-        + 'Ubhd/lWdsbNvzK3f1TPWcfIKQnpvSt85PIEDJir6/nuJUKMtmJRwTymJf0i+JZ4x\n'
-        + '7dJa341p2kHKcHMgOPW7nJQklGBA70ytjUV6/qebS3yIugr/28mwReflg3TJzVDl\n'
-        + 'EOvi6pqbqNbkMuEwGDCmEQIVqgkCAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n'
-        + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFAu93/4k5xbWOsgdCdn+/KdiRuit\n'
-        + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n'
-        + 'A4IBAQBlcjSyscpPjf5+MgzMuAsCxByqUt+WFspwcMCpwdaBeHOPSQrXNqX2Sk6P\n'
-        + 'kth6oCivA64trWo8tFMvPYlUA1FYVD5WpN0kCK+P5pD4KHlaDsXhuhClJzp/OP8t\n'
-        + 'pOyUr5109RHLxqoKB5J5m1XA7rgcFjnMxwBSWFe3/4uMk/+4T53YfCVXuc6QV3i7\n'
-        + 'I/2LAJwFf//pTtt6fZenYfCsahnr2nvrNRNyAxcfvGZ/4Opn/mJtR6R/AjvQZHiR\n'
-        + 'bkRNKF2GW0ueK5W4FkZVZVhhX9xh1Aj2Ollb+lbOqADaVj+AT3PoJPZ3MPQHKCXm\n'
-        + 'xwG0LOLlRr/TfD6li1AfOVTAJXv9\n'
-        + '-----END CERTIFICATE-----\n',
-        '-----BEGIN CERTIFICATE-----\n'
-        + 'MIIEATCCAumgAwIBAgIBRjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n'
-        + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n'
-        + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n'
-        + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMjRaFw0y\n'
-        + 'MDAzMDUyMjAzMjRaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n'
-        + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n'
-        + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n'
-        + 'UyBhcC1zb3V0aGVhc3QtMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n'
-        + 'ggEBAJqBAJutz69hFOh3BtLHZTbwE8eejGGKayn9hu98YMDPzWzGXWCmW+ZYWELA\n'
-        + 'cY3cNWNF8K4FqKXFr2ssorBYim1UtYFX8yhydT2hMD5zgQ2sCGUpuidijuPA6zaq\n'
-        + 'Z3tdhVR94f0q8mpwpv2zqR9PcqaGDx2VR1x773FupRPRo7mEW1vC3IptHCQlP/zE\n'
-        + '7jQiLl28bDIH2567xg7e7E9WnZToRnhlYdTaDaJsHTzi5mwILi4cihSok7Shv/ME\n'
-        + 'hnukvxeSPUpaVtFaBhfBqq055ePq9I+Ns4KGreTKMhU0O9fkkaBaBmPaFgmeX/XO\n'
-        + 'n2AX7gMouo3mtv34iDTZ0h6YCGkCAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n'
-        + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFIlQnY0KHYWn1jYumSdJYfwj/Nfw\n'
-        + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n'
-        + 'A4IBAQA0wVU6/l41cTzHc4azc4CDYY2Wd90DFWiH9C/mw0SgToYfCJ/5Cfi0NT/Y\n'
-        + 'PRnk3GchychCJgoPA/k9d0//IhYEAIiIDjyFVgjbTkKV3sh4RbdldKVOUB9kumz/\n'
-        + 'ZpShplsGt3z4QQiVnKfrAgqxWDjR0I0pQKkxXa6Sjkicos9LQxVtJ0XA4ieG1E7z\n'
-        + 'zJr+6t80wmzxvkInSaWP3xNJK9azVRTrgQZQlvkbpDbExl4mNTG66VD3bAp6t3Wa\n'
-        + 'B49//uDdfZmPkqqbX+hsxp160OH0rxJppwO3Bh869PkDnaPEd/Pxw7PawC+li0gi\n'
-        + 'NRV8iCEx85aFxcyOhqn0WZOasxee\n'
-        + '-----END CERTIFICATE-----\n',
-        '-----BEGIN CERTIFICATE-----\n'
-        + 'MIID/zCCAuegAwIBAgIBRzANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n'
-        + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n'
-        + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n'
-        + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMzFaFw0y\n'
-        + 'MDAzMDUyMjAzMzFaMIGSMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n'
-        + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n'
-        + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEjMCEGA1UEAwwaQW1hem9uIFJE\n'
-        + 'UyBldS1jZW50cmFsLTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\n'
-        + 'AQDFtP2dhSLuaPOI4ZrrPWsK4OY9ocQBp3yApH1KJYmI9wpQKZG/KCH2E6Oo7JAw\n'
-        + 'QORU519r033T+FO2Z7pFPlmz1yrxGXyHpJs8ySx3Yo5S8ncDCdZJCLmtPiq/hahg\n'
-        + '5/0ffexMFUCQaYicFZsrJ/cStdxUV+tSw2JQLD7UxS9J97LQWUPyyG+ZrjYVTVq+\n'
-        + 'zudnFmNSe4QoecXMhAFTGJFQXxP7nhSL9Ao5FGgdXy7/JWeWdQIAj8ku6cBDKPa6\n'
-        + 'Y6kP+ak+In+Lye8z9qsCD/afUozfWjPR2aA4JoIZVF8dNRShIMo8l0XfgfM2q0+n\n'
-        + 'ApZWZ+BjhIO5XuoUgHS3D2YFAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNV\n'
-        + 'HRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBRm4GsWIA/M6q+tK8WGHWDGh2gcyTAf\n'
-        + 'BgNVHSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOC\n'
-        + 'AQEAHpMmeVQNqcxgfQdbDIi5UIy+E7zZykmtAygN1XQrvga9nXTis4kOTN6g5/+g\n'
-        + 'HCx7jIXeNJzAbvg8XFqBN84Quqgpl/tQkbpco9Jh1HDs558D5NnZQxNqH5qXQ3Mm\n'
-        + 'uPgCw0pYcPOa7bhs07i+MdVwPBsX27CFDtsgAIru8HvKxY1oTZrWnyIRo93tt/pk\n'
-        + 'WuItVMVHjaQZVfTCow0aDUbte6Vlw82KjUFq+n2NMSCJDiDKsDDHT6BJc4AJHIq3\n'
-        + '/4Z52MSC9KMr0yAaaoWfW/yMEj9LliQauAgwVjArF4q78rxpfKTG9Rfd8U1BZANP\n'
-        + '7FrFMN0ThjfA1IvmOYcgskY5bQ==\n'
-        + '-----END CERTIFICATE-----\n',
-        '-----BEGIN CERTIFICATE-----\n'
-        + 'MIID/DCCAuSgAwIBAgIBSDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n'
-        + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n'
-        + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n'
-        + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMzVaFw0y\n'
-        + 'MDAzMDUyMjAzMzVaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n'
-        + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n'
-        + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n'
-        + 'UyBldS13ZXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx\n'
-        + 'PdbqQ0HKRj79Pmocxvjc+P6i4Ux24kgFIl+ckiir1vzkmesc3a58gjrMlCksEObt\n'
-        + 'Yihs5IhzEq1ePT0gbfS9GYFp34Uj/MtPwlrfCBWG4d2TcrsKRHr1/EXUYhWqmdrb\n'
-        + 'RhX8XqoRhVkbF/auzFSBhTzcGGvZpQ2KIaxRcQfcXlMVhj/pxxAjh8U4F350Fb0h\n'
-        + 'nX1jw4/KvEreBL0Xb2lnlGTkwVxaKGSgXEnOgIyOFdOQc61vdome0+eeZsP4jqeR\n'
-        + 'TGYJA9izJsRbe2YJxHuazD+548hsPlM3vFzKKEVURCha466rAaYAHy3rKur3HYQx\n'
-        + 'Yt+SoKcEz9PXuSGj96ejAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n'
-        + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBTebg//h2oeXbZjQ4uuoiuLYzuiPDAfBgNV\n'
-        + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n'
-        + 'TikPaGeZasTPw+4RBemlsyPAjtFFQLo7ddaFdORLgdEysVf8aBqndvbA6MT/v4lj\n'
-        + 'GtEtUdF59ZcbWOrVm+fBZ2h/jYJ59dYF/xzb09nyRbdMSzB9+mkSsnOMqluq5y8o\n'
-        + 'DY/PfP2vGhEg/2ZncRC7nlQU1Dm8F4lFWEiQ2fi7O1cW852Vmbq61RIfcYsH/9Ma\n'
-        + 'kpgk10VZ75b8m3UhmpZ/2uRY+JEHImH5WpcTJ7wNiPNJsciZMznGtrgOnPzYco8L\n'
-        + 'cDleOASIZifNMQi9PKOJKvi0ITz0B/imr8KBsW0YjZVJ54HMa7W1lwugSM7aMAs+\n'
-        + 'E3Sd5lS+SHwWaOCHwhOEVA==\n'
-        + '-----END CERTIFICATE-----\n',
-        '-----BEGIN CERTIFICATE-----\n'
-        + 'MIID/DCCAuSgAwIBAgIBSTANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n'
-        + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n'
-        + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n'
-        + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzNDBaFw0y\n'
-        + 'MDAzMDUyMjAzNDBaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n'
-        + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n'
-        + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n'
-        + 'UyBzYS1lYXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCU\n'
-        + 'X4OBnQ5xA6TLJAiFEI6l7bUWjoVJBa/VbMdCCSs2i2dOKmqUaXu2ix2zcPILj3lZ\n'
-        + 'GMk3d/2zvTK/cKhcFrewHUBamTeVHdEmynhMQamqNmkM4ptYzFcvEUw1TGxHT4pV\n'
-        + 'Q6gSN7+/AJewQvyHexHo8D0+LDN0/Wa9mRm4ixCYH2CyYYJNKaZt9+EZfNu+PPS4\n'
-        + '8iB0TWH0DgQkbWMBfCRgolLLitAZklZ4dvdlEBS7evN1/7ttBxUK6SvkeeSx3zBl\n'
-        + 'ww3BlXqc3bvTQL0A+RRysaVyFbvtp9domFaDKZCpMmDFAN/ntx215xmQdrSt+K3F\n'
-        + 'cXdGQYHx5q410CAclGnbAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n'
-        + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBT6iVWnm/uakS+tEX2mzIfw+8JL0zAfBgNV\n'
-        + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n'
-        + 'FmDD+QuDklXn2EgShwQxV13+txPRuVdOSrutHhoCgMwFWCMtPPtBAKs6KPY7Guvw\n'
-        + 'DpJoZSehDiOfsgMirjOWjvfkeWSNvKfjWTVneX7pZD9W5WPnsDBvTbCGezm+v87z\n'
-        + 'b+ZM2ZMo98m/wkMcIEAgdSKilR2fuw8rLkAjhYFfs0A7tDgZ9noKwgHvoE4dsrI0\n'
-        + 'KZYco6DlP/brASfHTPa2puBLN9McK3v+h0JaSqqm5Ro2Bh56tZkQh8AWy/miuDuK\n'
-        + '3+hNEVdxosxlkM1TPa1DGj0EzzK0yoeerXuH2HX7LlCrrxf6/wdKnjR12PMrLQ4A\n'
-        + 'pCqkcWw894z6bV9MAvKe6A==\n'
-        + '-----END CERTIFICATE-----\n',
-        '-----BEGIN CERTIFICATE-----\n'
-        + 'MIID/DCCAuSgAwIBAgIBQzANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n'
-        + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n'
-        + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n'
-        + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMTU0MDRaFw0y\n'
-        + 'MDAzMDUyMTU0MDRaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n'
-        + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n'
-        + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n'
-        + 'UyB1cy1lYXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDI\n'
-        + 'UIuwh8NusKHk1SqPXcP7OqxY3S/M2ZyQWD3w7Bfihpyyy/fc1w0/suIpX3kbMhAV\n'
-        + '2ESwged2/2zSx4pVnjp/493r4luhSqQYzru78TuPt9bhJIJ51WXunZW2SWkisSaf\n'
-        + 'USYUzVN9ezR/bjXTumSUQaLIouJt3OHLX49s+3NAbUyOI8EdvgBQWD68H1epsC0n\n'
-        + 'CI5s+pIktyOZ59c4DCDLQcXErQ+tNbDC++oct1ANd/q8p9URonYwGCGOBy7sbCYq\n'
-        + '9eVHh1Iy2M+SNXddVOGw5EuruvHoCIQyOz5Lz4zSuZA9dRbrfztNOpezCNYu6NKM\n'
-        + 'n+hzcvdiyxv77uNm8EaxAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n'
-        + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBQSQG3TmMe6Sa3KufaPBa72v4QFDzAfBgNV\n'
-        + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n'
-        + 'L/mOZfB3187xTmjOHMqN2G2oSKHBKiQLM9uv8+97qT+XR+TVsBT6b3yoPpMAGhHA\n'
-        + 'Pc7nxAF5gPpuzatx0OTLPcmYucFmfqT/1qA5WlgCnMNtczyNMH97lKFTNV7Njtek\n'
-        + 'jWEzAEQSyEWrkNpNlC4j6kMYyPzVXQeXUeZTgJ9FNnVZqmvfjip2N22tawMjrCn5\n'
-        + '7KN/zN65EwY2oO9XsaTwwWmBu3NrDdMbzJnbxoWcFWj4RBwanR1XjQOVNhDwmCOl\n'
-        + '/1Et13b8CPyj69PC8BOVU6cfTSx8WUVy0qvYOKHNY9Bqa5BDnIL3IVmUkeTlM1mt\n'
-        + 'enRpyBj+Bk9rh/ICdiRKmA==\n'
-        + '-----END CERTIFICATE-----\n',
-        '-----BEGIN CERTIFICATE-----\n'
-        + 'MIID/DCCAuSgAwIBAgIBSjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n'
-        + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n'
-        + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n'
-        + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzNDVaFw0y\n'
-        + 'MDAzMDUyMjAzNDVaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n'
-        + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n'
-        + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n'
-        + 'UyB1cy13ZXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDE\n'
-        + 'Dhw+uw/ycaiIhhyu2pXFRimq0DlB8cNtIe8hdqndH8TV/TFrljNgR8QdzOgZtZ9C\n'
-        + 'zzQ2GRpInN/qJF6slEd6wO+6TaDBQkPY+07TXNt52POFUhdVkhJXHpE2BS7Xn6J7\n'
-        + '7RFAOeG1IZmc2DDt+sR1BgXzUqHslQGfFYNS0/MBO4P+ya6W7IhruB1qfa4HiYQS\n'
-        + 'dbe4MvGWnv0UzwAqdR7OF8+8/5c58YXZIXCO9riYF2ql6KNSL5cyDPcYK5VK0+Q9\n'
-        + 'VI6vuJHSMYcF7wLePw8jtBktqAFE/wbdZiIHhZvNyiNWPPNTGUmQbaJ+TzQEHDs5\n'
-        + '8en+/W7JKnPyBOkxxENbAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n'
-        + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBS0nw/tFR9bCjgqWTPJkyy4oOD8bzAfBgNV\n'
-        + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n'
-        + 'CXGAY3feAak6lHdqj6+YWjy6yyUnLK37bRxZDsyDVXrPRQaXRzPTzx79jvDwEb/H\n'
-        + 'Q/bdQ7zQRWqJcbivQlwhuPJ4kWPUZgSt3JUUuqkMsDzsvj/bwIjlrEFDOdHGh0mi\n'
-        + 'eVIngFEjUXjMh+5aHPEF9BlQnB8LfVtKj18e15UDTXFa+xJPFxUR7wDzCfo4WI1m\n'
-        + 'sUMG4q1FkGAZgsoyFPZfF8IVvgCuGdR8z30VWKklFxttlK0eGLlPAyIO0CQxPQlo\n'
-        + 'saNJrHf4tLOgZIWk+LpDhNd9Et5EzvJ3aURUsKY4pISPPF5WdvM9OE59bERwUErd\n'
-        + 'nuOuQWQeeadMceZnauRzJQ==\n'
-        + '-----END CERTIFICATE-----\n',
-        '-----BEGIN CERTIFICATE-----\n'
-        + 'MIID/DCCAuSgAwIBAgIBSzANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n'
-        + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n'
-        + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n'
-        + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzNTBaFw0y\n'
-        + 'MDAzMDUyMjAzNTBaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n'
-        + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n'
-        + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n'
-        + 'UyB1cy13ZXN0LTIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDM\n'
-        + 'H58SR48U6jyERC1vYTnub34smf5EQVXyzaTmspWGWGzT31NLNZGSDFaa7yef9kdO\n'
-        + 'mzJsgebR5tXq6LdwlIoWkKYQ7ycUaadtVKVYdI40QcI3cHn0qLFlg2iBXmWp/B+i\n'
-        + 'Z34VuVlCh31Uj5WmhaBoz8t/GRqh1V/aCsf3Wc6jCezH3QfuCjBpzxdOOHN6Ie2v\n'
-        + 'xX09O5qmZTvMoRBAvPkxdaPg/Mi7fxueWTbEVk78kuFbF1jHYw8U1BLILIAhcqlq\n'
-        + 'x4u8nl73t3O3l/soNUcIwUDK0/S+Kfqhwn9yQyPlhb4Wy3pfnZLJdkyHldktnQav\n'
-        + '9TB9u7KH5Lk0aAYslMLxAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n'
-        + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBT8roM4lRnlFHWMPWRz0zkwFZog1jAfBgNV\n'
-        + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n'
-        + 'JwrxwgwmPtcdaU7O7WDdYa4hprpOMamI49NDzmE0s10oGrqmLwZygcWU0jT+fJ+Y\n'
-        + 'pJe1w0CVfKaeLYNsOBVW3X4ZPmffYfWBheZiaiEflq/P6t7/Eg81gaKYnZ/x1Dfa\n'
-        + 'sUYkzPvCkXe9wEz5zdUTOCptDt89rBR9CstL9vE7WYUgiVVmBJffWbHQLtfjv6OF\n'
-        + 'NMb0QME981kGRzc2WhgP71YS2hHd1kXtsoYP1yTu4vThSKsoN4bkiHsaC1cRkLoy\n'
-        + '0fFA4wpB3WloMEvCDaUvvH1LZlBXTNlwi9KtcwD4tDxkkBt4tQczKLGpQ/nF/W9n\n'
-        + '8YDWk3IIc1sd0bkZqoau2Q==\n'
-        + '-----END CERTIFICATE-----\n'
-    ]
-}
\ No newline at end of file
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/types.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/types.js
deleted file mode 100644
index 21c40005e4838c94043ea2483f5b6c3c4c8f4793..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/constants/types.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Manually extracted from mysql-5.5.23/include/mysql_com.h
-// some more info here: http://dev.mysql.com/doc/refman/5.5/en/c-api-prepared-statement-type-codes.html
-exports.DECIMAL     = 0x00; // aka DECIMAL (http://dev.mysql.com/doc/refman/5.0/en/precision-math-decimal-changes.html)
-exports.TINY        = 0x01; // aka TINYINT, 1 byte
-exports.SHORT       = 0x02; // aka SMALLINT, 2 bytes
-exports.LONG        = 0x03; // aka INT, 4 bytes
-exports.FLOAT       = 0x04; // aka FLOAT, 4-8 bytes
-exports.DOUBLE      = 0x05; // aka DOUBLE, 8 bytes
-exports.NULL        = 0x06; // NULL (used for prepared statements, I think)
-exports.TIMESTAMP   = 0x07; // aka TIMESTAMP
-exports.LONGLONG    = 0x08; // aka BIGINT, 8 bytes
-exports.INT24       = 0x09; // aka MEDIUMINT, 3 bytes
-exports.DATE        = 0x0a; // aka DATE
-exports.TIME        = 0x0b; // aka TIME
-exports.DATETIME    = 0x0c; // aka DATETIME
-exports.YEAR        = 0x0d; // aka YEAR, 1 byte (don't ask)
-exports.NEWDATE     = 0x0e; // aka ?
-exports.VARCHAR     = 0x0f; // aka VARCHAR (?)
-exports.BIT         = 0x10; // aka BIT, 1-8 byte
-exports.NEWDECIMAL  = 0xf6; // aka DECIMAL
-exports.ENUM        = 0xf7; // aka ENUM
-exports.SET         = 0xf8; // aka SET
-exports.TINY_BLOB   = 0xf9; // aka TINYBLOB, TINYTEXT
-exports.MEDIUM_BLOB = 0xfa; // aka MEDIUMBLOB, MEDIUMTEXT
-exports.LONG_BLOB   = 0xfb; // aka LONGBLOG, LONGTEXT
-exports.BLOB        = 0xfc; // aka BLOB, TEXT
-exports.VAR_STRING  = 0xfd; // aka VARCHAR, VARBINARY
-exports.STRING      = 0xfe; // aka CHAR, BINARY
-exports.GEOMETRY    = 0xff; // aka GEOMETRY
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/helpers.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/helpers.js
deleted file mode 100644
index 255490581f129bd35474e90a62022c2c15578f2e..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/helpers.js
+++ /dev/null
@@ -1,21 +0,0 @@
-  /*
-
-  this seems to be not only shorter, but faster than
-  string.replace(/\\/g, '\\\\').
-            replace(/\u0008/g, '\\b').
-            replace(/\t/g, '\\t').
-            replace(/\n/g, '\\n').
-            replace(/\f/g, '\\f').
-            replace(/\r/g, '\\r').
-            replace(/'/g, '\\\'').
-            replace(/"/g, '\\"');
-  or string.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&")
-  see http://jsperf.com/string-escape-regexp-vs-json-stringify
-  */
-  function srcEscape(str) {
-    var a = {};
-    a[str] = 1;
-    return JSON.stringify(a).slice(1,-3);
-  }
-
-module.exports.srcEscape = srcEscape;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packet_parser.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packet_parser.js
deleted file mode 100644
index 6e4a3910209e863c50dc6977fc637254c347014b..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packet_parser.js
+++ /dev/null
@@ -1,103 +0,0 @@
-var Packet   = require('./packets/packet.js');
-
-function PacketParser(onPacket)
-{
-  // array of last payload chunks
-  // only used when corrent payload is not complete
-  this.buffer = [];
-  // total length of chunks on buffer
-  this.bufferLength = 0;
-
-  // incomplete header state: number of header bytes received
-  this.headerLen = 0;
-
-  // expected payload length
-  this.length     = 0;
-
-  this.onPacket = onPacket;
-  this.execute  = PacketParser.prototype.executeStart;
-}
-
-function readPacketLength(b,off) {
-  var b0 = b[off];
-  var b1 = b[off+1];
-  var b2 = b[off+2];
-  if (b1 + b2 === 0)
-    return b0;
-  return b0 + (b1<<8) + (b2<<16);
-}
-
-//
-PacketParser.prototype.executeStart = function executeStart(chunk) {
-  var start = 0;
-  var end = chunk.length;
-  // if (start-end === 0) return;
-
-  while (end - start >= 3) {
-    this.length = readPacketLength(chunk, start);
-    if (end - start >= this.length + 4) { // at least one more full packet
-      this.onPacket(new Packet(chunk[start+3], chunk, start + 4, start + 4 + this.length));
-      start += 4 + this.length;
-    } else { // payload is incomplete
-      this.buffer = [chunk.slice(start + 3, end)];
-      this.bufferLength = end - start - 3;
-      this.execute = PacketParser.prototype.executePayload;
-      return;
-    }
-  }
-  if (end - start > 0) { // there is start of length header, but it's not full 3 bytes
-    this.headerLen = end - start; // 1 or 2 bytes
-    this.length = chunk[start];
-    if (this.headerLen == 2) {
-      this.length = chunk[start] + (chunk[start+1] << 8);
-      this.execute = PacketParser.prototype.executeHeader3;
-    } else {
-      this.execute = PacketParser.prototype.executeHeader2;
-    }
-  }
-}
-
-PacketParser.prototype.executePayload = function executePayload(chunk) {
-  var start = 0;
-  var end = chunk.length;
-  var remainingPayload = this.length - this.bufferLength + 1;
-
-  if (end - start >= remainingPayload) { // last chunk for payload
-    var payload = new Buffer(this.length + 1);
-    var offset = 0;
-    for (var i=0; i < this.buffer.length; ++i) {
-      this.buffer[i].copy(payload, offset);
-      offset += this.buffer[i].length;
-    }
-    chunk.copy(payload, offset, start, start + remainingPayload);
-    this.onPacket(new Packet(payload[0], payload, 1, this.length + 1));
-    this.buffer = [];
-    this.bufferLength = 0;
-    this.execute = PacketParser.prototype.executeStart;
-    start += remainingPayload;
-    if (end - start > 0)
-      return this.execute(chunk.slice(start, end));
-  } else {
-    this.buffer.push(chunk);
-    this.bufferLength += chunk.length;
-  }
-}
-
-PacketParser.prototype.executeHeader2 = function executeHeader2(chunk) {
-  this.length += chunk[0] << 8;
-  if (chunk.length > 1) {
-    this.length += chunk[1] << 16;
-    this.execute = PacketParser.prototype.executePayload;
-    return this.executePayload(chunk.slice(2));
-  } else {
-    this.execute = PacketParser.prototype.executeHeader3;
-  }
-}
-
-PacketParser.prototype.executeHeader3 = function executeHeader3(chunk) {
-  this.length += chunk[0] << 16;
-  this.execute = PacketParser.prototype.executePayload;
-  return this.executePayload(chunk.slice(1));
-}
-
-module.exports = PacketParser;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/binary_row.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/binary_row.js
deleted file mode 100644
index 695e7f2e34c88677cad86eab004af5b35400cd63..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/binary_row.js
+++ /dev/null
@@ -1,44 +0,0 @@
-var Types = require('../constants/types');
-var Packet = require('../packets/packet');
-
-function BinaryRow(columns)
-{
-  this.columns = columns || [];
-}
-
-  var binaryReader = new Array(256);
-
-  // TODO: replace with constants.MYSQL_TYPE_*
-  binaryReader[Types.DECIMAL] = Packet.prototype.readLengthCodedString;
-  binaryReader[1] = Packet.prototype.readInt8;   // tiny
-  binaryReader[2] = Packet.prototype.readInt16;  // short
-  binaryReader[3] = Packet.prototype.readInt32;  // long
-  binaryReader[4] = Packet.prototype.readFloat;  // float
-  binaryReader[5] = Packet.prototype.readDouble; // double
-  binaryReader[6] = Packet.prototype.assertInvalid; // null, should be skipped vie null bitmap
-  binaryReader[7] = Packet.prototype.readTimestamp; // timestamp, http://dev.mysql.com/doc/internals/en/prepared-statements.html#packet-ProtocolBinary::MYSQL_TYPE_TIMESTAMP
-  binaryReader[8] = Packet.prototype.readInt64;  // long long
-  binaryReader[9] = Packet.prototype.readInt32;  // int24
-  binaryReader[10] = Packet.prototype.readTimestamp; // date
-  binaryReader[11] = Packet.prototype.readTime;  // time, http://dev.mysql.com/doc/internals/en/prepared-statements.html#packet-ProtocolBinary::MYSQL_TYPE_TIME
-  binaryReader[12] = Packet.prototype.readDateTime;  // datetime, http://dev.mysql.com/doc/internals/en/prepared-statements.html#packet-ProtocolBinary::MYSQL_TYPE_DATETIME
-  binaryReader[13] = Packet.prototype.readInt16;  // year
-  binaryReader[Types.VAR_STRING] = Packet.prototype.readLengthCodedString;  // var string
-  // TODO: complete list of types...
-
-BinaryRow.fromPacket = function(fields, packet) {
-  var columns = new Array(fields.length);
-  var ok = packet.readInt8(); // TODO check it's 0
-  var nullBitmapLength = Math.floor((fields.length + 7 + 2) / 8);
-  // TODO: read and interpret null bitmap
-  packet.skip(nullBitmapLength);
-  for (var i = 0; i < columns.length; ++i)
-     columns[i] = binaryReader[fields[i].columnType].apply(packet);
-  return new BinaryRow(columns);
-};
-
-BinaryRow.prototype.toPacket = function(sequenceId) {
-  throw "Not implemented";
-};
-
-module.exports = BinaryRow;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/binlog_dump.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/binlog_dump.js
deleted file mode 100644
index 3ca14f9dbf92d6192d41c4b2dddd8419ede9a348..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/binlog_dump.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// http://dev.mysql.com/doc/internals/en/com-binlog-dump.html#packet-COM_BINLOG_DUMP
-
-var Packet = require('../packets/packet');
-var CommandCodes = require('../constants/commands');
-
-// TODO: add flag to constants
-// 0x01 - BINLOG_DUMP_NON_BLOCK
-// send EOF instead of blocking
-
-function BinlogDump(opts)
-{
-  this.binlogPos       = opts.binlogPos || 0;
-  this.serverId        = opts.serverId  || 0;
-  this.flags           = opts.flags || 0;
-  this.filename        = opts.filename || '';
-}
-
-BinlogDump.prototype.toPacket = function()
-{
-  var length =  15 + // TODO: should be ascii?
-    Buffer.byteLength(this.filename, 'utf8');
-  var buffer = new Buffer(length);
-  var packet = new Packet(0, buffer, 0, length);
-  packet.offset = 4;
-  packet.writeInt8(CommandCodes.BINLOG_DUMP);
-  packet.writeInt32(this.binlogPos);
-  packet.writeInt16(this.flags);
-  packet.writeInt32(this.serverId);
-  packet.writeString(this.filename);
-  return packet;
-};
-
-module.exports = BinlogDump;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/binlog_query_statusvars.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/binlog_query_statusvars.js
deleted file mode 100644
index d880288f133b2279bcfc801c0b1c741e312cc53f..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/binlog_query_statusvars.js
+++ /dev/null
@@ -1,99 +0,0 @@
-// http://dev.mysql.com/doc/internals/en/query-event.html
-
-var keys = {
-  FLAGS2: 0,
-  SQL_MODE: 1,
-  CATALOG: 2,
-  AUTO_INCREMENT: 3,
-  CHARSET: 4,
-  TIME_ZONE: 5,
-  CATALOG_NZ: 6,
-  LC_TIME_NAMES: 7,
-  CHARSET_DATABASE: 8,
-  TABLE_MAP_FOR_UPDATE: 9,
-  MASTER_DATA_WRITTEN: 10,
-  INVOKERS: 11,
-  UPDATED_DB_NAMES: 12,
-  MICROSECONDS: 3
-};
-
-module.exports = function parseStatusVars(buffer) {
-  var result = {};
-  var offset = 0;
-  var key, length, username, hostname, prevOffset;
-  while(offset < buffer.length) {
-    key = buffer[offset++];
-    val = [key];
-    switch(key) {
-    case keys.FLAGS2:
-      result.flags = buffer.readUInt32LE(offset);
-      offset += 4; break;
-    case keys.SQL_MODE:
-      // value is 8 bytes, but all dcumented flags are in first 4 bytes
-      result.sqlMode = buffer.readUInt32LE(offset);
-      offset += 8; 
-      break;
-    case keys.CATALOG:
-      length = buffer[offset++];
-      result.catalog = buffer.toString('utf8', offset, offset + length);
-      offset += length + 1; // null byte after string
-      break;
-    case keys.CHARSET:
-      result.clientCharset = buffer.readUInt16LE(offset);
-      result.connectionCollation = buffer.readUInt16LE(offset + 2);
-      result.serverCharset = buffer.readUInt16LE(offset + 4);
-      offset += 6;
-      break;
-    case keys.TIME_ZONE:
-      length = buffer[offset++];
-      result.timeZone = buffer.toString('utf8', offset, offset + length);
-      offset += length; // no null byte
-      break;
-    case keys.CATALOG_NZ:
-      length = buffer[offset++];
-      result.catalogNz = buffer.toString('utf8', offset, offset + length);
-      offset += length ; // no null byte
-      break;
-    case keys.LC_TIME_NAMES:
-      result.lcTimeNames = buffer.readUInt16LE(offset); 
-      offset += 2; 
-      break;
-    case keys.CHARSET_DATABASE:
-      result.schemaCharset = buffer.readUInt16LE(offset);
-      offset += 2;
-      break;
-    case keys.TABLE_MAP_FOR_UPDATE:
-      result.mapForUpdate1 = buffer.readUInt32LE(offset);
-      result.mapForUpdate2 = buffer.readUInt32LE(offset + 4);
-      offset += 8; 
-      break;
-    case keys.MASTER_DATA_WRITTEN:
-      result.masterDataWritten = buffer.readUInt32LE(offset);
-      offset += 4;
-      break;
-    case keys.INVOKERS:
-      length = buffer[offset++];
-      result.invokerUsername = buffer.toString('utf8', offset, offset + length);
-      offset += length;
-      length = buffer[offset++];
-      result.invokerHostname = buffer.toString('utf8', offset, offset + length);
-      offset += length;
-      break;
-    case keys.UPDATED_DB_NAMES:
-      length = buffer[offset++];
-      // length - number of null-terminated strings
-      result.updatedDBs = []; // we'll store them as array here
-      for (; length; --length) {
-        prevOffset = offset;
-        // fast forward to null terminating byte
-        while(buffer[offset++] && offset < buffer.length) {}
-        result.updatedDBs.push(buffer.toString('utf8', prevOffset, offset-1));
-      }
-      break;
-    case keys.MICROSECONDS:
-      result.microseconds = buffer.readInt16LE(offset) + (buffsre[offset+2] << 16);
-      offset += 3;
-    }
-  }
-  return result;
-}
\ No newline at end of file
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/change_user.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/change_user.js
deleted file mode 100644
index d5888aaac44b5426a239e3e1a35abe8b197d1038..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/change_user.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var CommandCode     = require('../constants/commands.js');
-var Packet          = require('../packets/packet.js');
-
-var auth41 = require('../auth_41.js');
-
-function ChangeUser(opts)
-{
-  this.user            = opts.user || '';
-  this.database        = opts.database || '';
-  this.password        = opts.password || '';
-  this.passwordSha1    = opts.passwordSha1;
-  this.authPluginData1 = opts.authPluginData1;
-  this.authPluginData2 = opts.authPluginData2;
-  var authToken;
-  if (this.passwordSha1) {
-    authToken = auth41.calculateTokenFromPasswordSha(this.passwordSha1, this.authPluginData1, this.authPluginData2);
-  } else {
-    authToken = auth41.calculateToken(this.password, this.authPluginData1, this.authPluginData2);
-  }
-  this.authToken       = authToken;
-  this.charsetNumber   = opts.charsetNumber;
-}
-
-// TODO
-//ChangeUser.fromPacket = function(packet)
-//};
-
-ChangeUser.prototype.toPacket = function()
-{
-  if (typeof this.user != 'string')
-    throw new Error('"user" connection config prperty must be a string');
-  if (typeof this.database != 'string')
-    throw new Error('"database" connection config prperty must be a string');
-
-  var length = 4 + 1 + (1 + this.authToken.length) + (2 + this.user.length + this.database.length) + 2;
-
-  var buffer = new Buffer(length);
-  var packet = new Packet(0, buffer, 0, length);
-  packet.offset = 4;
-
-  packet.writeInt8(CommandCode.CHANGE_USER);
-  packet.writeNullTerminatedString(this.user);
-  packet.writeInt8(this.authToken.length);
-  packet.writeBuffer(this.authToken);
-  packet.writeNullTerminatedString(this.database);
-  packet.writeInt16(this.charsetNumber);
-  return packet;
-};
-
-module.exports = ChangeUser;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/close_statement.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/close_statement.js
deleted file mode 100644
index 5a51449a6e9c5a623414d50dbfc5aac3d30f7f26..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/close_statement.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var Packet = require('../packets/packet');
-var CommandCodes = require('../constants/commands');
-
-function CloseStatement(id)
-{
-  this.id = id;
-}
-
-// note: no response sent back
-CloseStatement.prototype.toPacket = function()
-{
-  var packet = new Packet(0, new Buffer(9));
-  packet.offset = 4;
-  packet.writeInt8(CommandCodes.STMT_CLOSE);
-  packet.writeInt32(this.id);
-  return packet;
-};
-
-module.exports = CloseStatement;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/column_definition.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/column_definition.js
deleted file mode 100644
index 84be5217619956fe0232191e8fd39871c78cd2de..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/column_definition.js
+++ /dev/null
@@ -1,110 +0,0 @@
-var Packet = require('../packets/packet');
-
-// creating JS string is relatively expencive (compared to
-// reading few bytes from buffer) because all string properties
-// except for name are unlikely to be used we postpone
-// string conversion until property access
-//
-// TODO: watch for integration benchmarks (one with real network buffer)
-// there could be bad side effect as keeping reference to a buffer makes it
-// sit in the memory longer (usually until final .query() callback)
-// Latest v8 perform much better in regard to bufferer -> string convertion,
-// at some point of time this optimisation might become unnecessary
-// see https://github.com/sidorares/node-mysql2/pull/137
-//
-function ColumnDefinition(packet)
-{
-  this._buf     = packet.buffer;
-
-  this._catalogLength = packet.readLengthCodedNumber();
-  this._catalogStart  = packet.offset;
-  packet.offset += this._catalogLength;
-
-  this._schemaLength = packet.readLengthCodedNumber();
-  this._schemaStart  = packet.offset;
-  packet.offset += this._schemaLength;
-
-  this._tableLength = packet.readLengthCodedNumber();
-  this._tableStart  = packet.offset;
-  packet.offset += this._tableLength;
-
-  this._orgTableLength = packet.readLengthCodedNumber();
-  this._orgTableStart  = packet.offset;
-  packet.offset += this._orgTableLength;
-
-  // name is always used, don't make it lazy
-  this.name     = packet.readLengthCodedString();
-
-  this._orgNameLength = packet.readLengthCodedNumber();
-  this._orgNameStart  = packet.offset;
-  packet.offset += this._orgNameLength;
-
-  packet.skip(1); //  length of the following fields (always 0x0c)
-  this.characterSet = packet.readInt16();
-  this.columnLength = packet.readInt32();
-  this.columnType   = packet.readInt8();
-  this.flags        = packet.readInt16();
-  this.decimals     = packet.readInt8();
-}
-
-var addString = function(name) {
-  Object.defineProperty(ColumnDefinition.prototype, name, { get: function() {
-    var start = this['_' + name + 'Start'];
-    var end = start + this['_' + name + 'Length'];
-    return this._buf.utf8Slice(start, end);
-  }});
-};
-
-addString('catalog');
-addString('schema');
-addString('table');
-addString('orgTable');
-addString('orgName');
-
-ColumnDefinition.prototype.inspect = function() {
-  return {
-    catalog      : this.catalog,
-    schema      : this.schema,
-    name        : this.name,
-    orgName     : this.orgName,
-    table       : this.table,
-    orgTable    : this.orgTable,
-    characterSet: this.characterSet,
-    columnLength: this.columnLength,
-    columnType  : this.columnType,
-    flags       : this.flags,
-    decimals    : this.decimals
-  };
-};
-
-ColumnDefinition.toPacket = function(column, sequenceId)
-{
-  var length = 0;
-  var fields = 'catalog schema table orgTable name orgName'.split(' ');
-  function addFieldLength(name) {
-    var str = column[name];
-    length +=Packet.lengthCodedNumberLength(str);
-    length += str.length;
-  }
-  fields.forEach(addFieldLength);
-  length += 13;
-  var buffer = new Buffer(length);
-  for (var i=0; i < length; ++i)
-    buffer[i] = 0;
-
-  function writeField(name) {
-    packet.writeLengthCodedString(column[name]);
-  }
-  var packet = new Packet(sequenceId, buffer, 0, length);
-  packet.offset = 4;
-  fields.forEach(writeField);
-  packet.writeInt8 (0x0c);
-  packet.writeInt16(column.characterSet);
-  packet.writeInt32(column.columnLength);
-  packet.writeInt8 (column.columnType);
-  packet.writeInt16(column.flags);
-  packet.writeInt8 (column.decimals);
-  return packet;
-};
-
-module.exports = ColumnDefinition;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/execute.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/execute.js
deleted file mode 100644
index b21f326bc7798dbd6971dfab6088c74dac4e6f26..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/execute.js
+++ /dev/null
@@ -1,103 +0,0 @@
-var CursorType   = require('../constants/cursor');
-var CommandCodes = require('../constants/commands');
-var Types        = require('../constants/types');
-var Packet       = require('../packets/packet');
-
-function Execute(id, parameters)
-{
-  this.id = id;
-  this.parameters = parameters;
-}
-
-Execute.prototype.toPacket = function()
-{
-
-  // TODO: don't try to calculate packet length in advance, allocate some big buffer in advance (header + 256 bytes?)
-  // and copy + reallocate if not enough
-
-  var i;
-  // 0 + 4 - length, seqId
-  // 4 + 1 - COM_EXECUTE
-  // 5 + 4 - stmtId
-  // 9 + 1 - flags
-  // 10 + 4 - iteration-count (always 1)
-  var length = 14;
-  if (this.parameters && this.parameters.length > 0)
-  {
-    length += Math.floor((this.parameters.length + 7) / 8);
-    length += 1; // new-params-bound-flag
-    length += 2*this.parameters.length;  // type byte for each parameter if new-params-bound-flag is set
-    for (i=0; i < this.parameters.length; i++)
-    {
-      if (this.parameters[i] !== null) {
-        if (Object.prototype.toString.call(this.parameters[i]) == '[object Date]') {
-          var d = this.parameters[i];
-          // TODO: move to asMysqlDateTime()
-          this.parameters[i] = [d.getFullYear(), d.getMonth() + 1, d.getDate()].join('-') +
-            ' ' + [d.getHours(), d.getMinutes(), d.getSeconds()].join(':');
-        }
-        if (Buffer.isBuffer(this.parameters[i])) {
-          length += Packet.lengthCodedNumberLength(this.parameters[i].length);
-          length += this.parameters[i].length;
-        }
-        else {
-          var str = this.parameters[i].toString();
-          var byteLen = Buffer.byteLength(str, 'utf8');
-          length += Packet.lengthCodedNumberLength(byteLen);
-          length += byteLen;
-        }
-      }
-    }
-  }
-
-  var buffer = new Buffer(length);
-  var packet = new Packet(0, buffer, 0, length);
-  packet.offset = 4;
-  packet.writeInt8(CommandCodes.STMT_EXECUTE);
-  packet.writeInt32(this.id);
-  packet.writeInt8(CursorType.NO_CURSOR);  // flags
-  packet.writeInt32(1); // iteration-count, always 1
-  if (this.parameters && this.parameters.length > 0) {
-
-    var bitmap = 0;
-    var bitValue = 1;
-    for (i=0; i < this.parameters.length; i++)
-    {
-      if (this.parameters[i] === null)
-        bitmap += bitValue;
-      bitValue *= 2;
-      if (bitValue == 256) {
-        packet.writeInt8(bitmap);
-        bitmap = 0;
-        bitValue = 1;
-      }
-    }
-    if (bitValue != 1)
-      packet.writeInt8(bitmap);
-
-    // TODO: explain meaning of the flag
-    // afaik, if set n*2 bytes with type of parameter are sent before parameters
-    // if not, previous execution types are used (TODO prooflink)
-    packet.writeInt8(1); // new-params-bound-flag
-
-    // TODO: don't typecast always to sting, use parameters type
-    for (i=0; i < this.parameters.length; i++)
-    {
-      if (this.parameters[i] !== null)
-        packet.writeInt16(Types.VAR_STRING);
-      else
-        packet.writeInt16(Types.NULL);
-    }
-    for (i=0; i < this.parameters.length; i++)
-    {
-      if (this.parameters[i] !== null)
-        if (Buffer.isBuffer(this.parameters[i]))
-          packet.writeLengthCodedBuffer(this.parameters[i]);
-        else
-          packet.writeLengthCodedString(this.parameters[i].toString());
-    }
-  }
-  return packet;
-};
-
-module.exports = Execute;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/handshake.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/handshake.js
deleted file mode 100644
index 337338c13eff806774011cb01c9840b8e33cfe93..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/handshake.js
+++ /dev/null
@@ -1,73 +0,0 @@
-var Packet = require('../packets/packet');
-
-function Handshake(args) {
-  this.protocolVersion = args.protocolVersion;
-  this.serverVersion   = args.serverVersion;
-  this.capabilityFlags = args.capabilityFlags;
-  this.connectionId    = args.connectionId;
-  this.authPluginData1 = args.authPluginData1;
-  this.authPluginData2 = args.authPluginData2;
-  this.characterSet    = args.characterSet;
-  this.statusFlags     = args.statusFlags;
-}
-
-Handshake.fromPacket = function(packet)
-{
-  var args = {};
-  args.protocolVersion = packet.readInt8();
-  args.serverVersion   = packet.readNullTerminatedString();
-  args.connectionId    = packet.readInt32();
-  args.authPluginData1 = packet.readBuffer(8);
-  packet.skip(1);
-  args.capabilityFlags = packet.readInt16();
-  if (packet.haveMoreData()) {
-    args.characterSet = packet.readInt8();
-    args.statusFlags  = packet.readInt16();
-    // upper 2 bytes
-    args.capabilityFlags += packet.readInt16() << 16;
-    args.authPluginDataLength = packet.readInt8();
-    packet.skip(10);
-  }
-  //var len = Math.max(12, args.authPluginDataLength - 8);
-  args.authPluginData2 = packet.readBuffer(12);
-  return new Handshake(args);
-};
-
-Handshake.prototype.setScrambleData = function(cb) {
-  var self = this;
-  require('crypto').randomBytes(20, function(err, data) {
-    if (err) return cb(err);
-    self.authPluginData1 = data.slice(0, 8);
-    self.authPluginData2 = data.slice(8,20);
-    cb();
-  });
-};
-
-Handshake.prototype.toPacket = function(sequenceId) {
-  var buffer, packet;
-  var length = 68 + Buffer.byteLength(this.serverVersion, 'utf8');
-  buffer = new Buffer(length + 4);
-  packet  = new Packet(sequenceId, buffer, 0, length + 4);
-  packet.offset = 4;
-  packet.writeInt8(this.protocolVersion);
-  packet.writeString(this.serverVersion);
-  packet.writeInt8(0);
-  packet.writeInt32(this.connectionId);
-  packet.writeBuffer(this.authPluginData1);
-  packet.writeInt8(0);
-  packet.writeInt16(this.capabilityFlags & 0xffff);
-  packet.writeInt8(this.characterSet);
-  packet.writeInt16(this.statusFlags);
-  packet.writeInt16(this.capabilityFlags >> 16);
-  packet.writeInt8(21); // authPluginDataLength
-  var filler = new Buffer(10);
-  filler.fill(0);
-  packet.writeBuffer(filler);
-  packet.writeBuffer(this.authPluginData2);
-  packet.writeInt8(0);
-  packet.writeString('mysql_native_password');
-  packet.writeInt8(0);
-  return packet;
-};
-
-module.exports = Handshake;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/handshake_response.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/handshake_response.js
deleted file mode 100644
index cfc9359a38be74c12b8933632b20789e24fbbbe3..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/handshake_response.js
+++ /dev/null
@@ -1,68 +0,0 @@
-var ClientConstants = require('../constants/client.js');
-var Charsets        = require('../constants/charsets.js');
-var Packet          = require('../packets/packet.js');
-
-var auth41 = require('../auth_41.js');
-
-function HandshakeResponse(handshake)
-{
-  this.user            = handshake.user || '';
-  this.database        = handshake.database || '';
-  this.password        = handshake.password || '';
-  this.passwordSha1    = handshake.passwordSha1;
-  this.authPluginData1 = handshake.authPluginData1;
-  this.authPluginData2 = handshake.authPluginData2;
-  this.compress        = handshake.compress;
-  this.clientFlags     = handshake.flags;
-  // TODO: pre-4.1 auth support
-  var authToken;
-  if (this.passwordSha1)
-    authToken = auth41.calculateTokenFromPasswordSha(this.passwordSha1, this.authPluginData1, this.authPluginData2);
-  else
-    authToken = auth41.calculateToken(this.password, this.authPluginData1, this.authPluginData2);
-  this.authToken       = authToken;
-  this.charsetNumber   = handshake.charsetNumber;
-}
-
-HandshakeResponse.fromPacket = function(packet)
-{
-  var args = {};
-  //packet.skip(4);
-  args.clientFlags   = packet.readInt32();
-  args.maxPacketSize = packet.readInt32();
-  args.charsetNumber = packet.readInt8();
-  packet.skip(23);
-  args.user = packet.readNullTerminatedString();
-  var authTokenLength = packet.readInt8();
-  args.authToken = packet.readBuffer(authTokenLength);
-  args.database  = packet.readNullTerminatedString();
-  //return new HandshakeResponse(args);
-  return args;
-};
-
-HandshakeResponse.prototype.toPacket = function()
-{
-  if (typeof this.user != 'string')
-    throw new Error('"user" connection config prperty must be a string');
-  if (typeof this.database != 'string')
-    throw new Error('"database" connection config prperty must be a string');
-
-  var length = 36 + 23 + this.user.length + this.database.length;
-
-  var buffer = new Buffer(length);
-  var packet = new Packet(0, buffer, 0, length);
-  buffer.fill(0);
-  packet.offset = 4;
-
-  packet.writeInt32(this.clientFlags);
-  packet.writeInt32(0); // max packet size. todo: move to config
-  packet.writeInt8(this.charsetNumber);
-  packet.skip(23);
-  packet.writeNullTerminatedString(this.user);
-  packet.writeInt8(this.authToken.length);
-  packet.writeBuffer(this.authToken);
-  packet.writeNullTerminatedString(this.database);
-  return packet;
-};
-
-module.exports = HandshakeResponse;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/index.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/index.js
deleted file mode 100644
index 05b0fde37a2b733967fe68c4e8c5692049ae784b..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/index.js
+++ /dev/null
@@ -1,79 +0,0 @@
-'binlog_dump register_slave ssl_request handshake handshake_response query resultset_header column_definition text_row binary_row prepare_statement close_statement prepared_statement_header execute change_user'.split(' ').forEach(function(name) {
-  var ctor = require('./' + name + '.js');
-  module.exports[ctor.name] = ctor;
-  // monkey-patch it to include name if debug is on
-  if (process.env.NODE_DEBUG) {
-    if (ctor.prototype.toPacket) {
-      var old = ctor.prototype.toPacket;
-      ctor.prototype.toPacket = function() {
-        var p = old.call(this);
-        p._name = ctor.name;
-        return p;
-      }
-    }
-  }
-});
-
-// simple packets:
-var Packet = require('./packet');
-module.exports.Packet = Packet;
-
-module.exports.OK = function OK() {
-};
-
-module.exports.OK.toPacket = function(args) {
-  args = args || {};
-  var affectedRows = args.affectedRows || 0;
-  var insertId     = args.insertId || 0;
-  var serverStatus = args.serverStatus || 0;
-  var warningCount = args.warningCount || 0;
-  var message      = args.message || "";
-
-  var length = 9 + Packet.lengthCodedNumberLength(affectedRows);
-  length += Packet.lengthCodedNumberLength(insertId);
-
-  var buffer = new Buffer(length);
-  var packet = new Packet(0, buffer, 0, length);
-  packet.offset = 4;
-  packet.writeInt8(0);
-  packet.writeLengthCodedNumber(affectedRows);
-  packet.writeLengthCodedNumber(insertId);
-  packet.writeInt16(serverStatus);
-  packet.writeInt16(warningCount);
-  packet.writeString(message);
-  packet._name = "OK";
-  return packet;
-};
-
-// warnings, statusFlags
-module.exports.EOF = function EOF() {
-};
-
-module.exports.EOF.toPacket = function(warnings, statusFlags) {
-  if (typeof warnings == 'undefined')
-    warnings = 0;
-  if (typeof statusFlags == 'undefined')
-    statusFlags = 0;
-  var packet = new Packet(0, new Buffer(9), 0, 9);
-  packet.offset = 4;
-  packet.writeInt8(0xfe);
-  packet.writeInt16(warnings);
-  packet.writeInt16(statusFlags);
-  packet._name = "EOF";
-  return packet;
-};
-
-module.exports.Error = function Error() {
-};
-
-module.exports.Error.toPacket = function(args) {
-  var length = 13 + Buffer.byteLength(args.message, 'utf8');
-  var packet = new Packet(0, new Buffer(length), 0, length);
-  packet.offset = 4;
-  packet.writeInt8(0xff);
-  packet.writeInt16(args.code);
-  packet.writeString('#_____');
-  packet.writeString(args.message);
-  packet._name = "Error";
-  return packet;
-};
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/packet.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/packet.js
deleted file mode 100644
index 4ee57d8673bf8e4fe77be1e1552bb72748cedfc0..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/packet.js
+++ /dev/null
@@ -1,613 +0,0 @@
-//var BigNumber = require("bignumber.js");
-var ErrorCodeToName = require('../constants/errors.js').codeToName;
-
-var bn = require('bn.js');
-
-function Packet(id, buffer, start, end)
-{
-  this.sequenceId = id;
-  this.buffer = buffer;
-  this.start  = start;
-  this.offset = start;
-  this.end    = end;
-}
-
-// ==============================
-// readers
-// ==============================
-
-Packet.prototype.reset = function() {
-  this.offset = this.start;
-};
-
-Packet.prototype.length = function() {
-  return this.end - this.start;
-};
-
-Packet.prototype.slice = function() {
-  return this.buffer.slice(this.start, this.end);
-};
-
-Packet.prototype.dump = function() {
-  console.log([this.buffer.asciiSlice(this.start, this.end)], this.buffer.slice(this.start, this.end), this.length(), this.sequenceId);
-};
-
-Packet.prototype.haveMoreData = function() {
-  return this.end > this.offset;
-};
-
-Packet.prototype.skip = function(num) {
-  this.offset += num;
-};
-
-Packet.prototype.readInt8 = function()
-{
-  return this.buffer[this.offset++];
-};
-
-Packet.prototype.readInt16 = function()
-{
-  this.offset += 2;
-  return this.buffer.readUInt16LE(this.offset - 2, true);
-};
-
-Packet.prototype.readInt24 = function() {
-  return this.readInt16() + (this.readInt8() << 16);
-};
-
-Packet.prototype.readInt32 = function()
-{
-  this.offset += 4;
-  return this.buffer.readUInt32LE(this.offset - 4, true);
-};
-
-Packet.prototype.readSInt8 = function()
-{
-  return this.buffer.readInt8(this.offset++, true);
-};
-
-Packet.prototype.readSInt16 = function()
-{
-  this.offset += 2;
-  return this.buffer.readInt16LE(this.offset - 2, true);
-};
-
-Packet.prototype.readSInt32 = function()
-{
-  this.offset += 4;
-  return this.buffer.readInt32LE(this.offset - 4, true);
-};
-
-Packet.prototype.readInt64 = function() {
-  return this.readInt32() + 0x100000000*this.readInt32();
-};
-
-Packet.prototype.readSInt64 = function() {
-  var word0 = this.readInt32();
-  var word1 = this.readInt32();
-  if (!(word1 & 0x80000000))
-    return word0 + 0x100000000*word1;
-  return -((((~word1)>>>0) * 0x100000000) + ((~word0)>>>0) + 1);
-};
-
-Packet.prototype.isEOF = function() {
-  return this.buffer[this.offset] == 0xfe && this.length() < 9;
-};
-
-Packet.prototype.eofStatusFlags = function() {
-  return this.buffer.readInt16LE(this.offset + 3);
-};
-
-Packet.prototype.eofWarningCount = function() {
-  return this.buffer.readInt16LE(this.offset + 1);
-};
-
-Packet.prototype.readLengthCodedNumber = function(bigNumberStrings) {
-  var byte1 = this.buffer[this.offset++];
-  if (byte1 < 251)
-    return byte1;
-  return this.readLengthCodedNumberExt(byte1, bigNumberStrings);
-}
-
-Packet.prototype.readLengthCodedNumberExt = function(tag, bigNumberStrings) {
-   var word0, word1;
-   var res;
-   if (tag == 0xfb)
-     return null;
-   if (tag == 0xfc) {
-     return this.readInt8() + (this.readInt8() << 8);
-   }
-   if (tag == 0xfd) {
-     return this.readInt8() + (this.readInt8() << 8) + (this.readInt8() << 16);
-   }
-   if (tag == 0xfe) {
-     // TODO: check version
-     // Up to MySQL 3.22, 0xfe was followed by a 4-byte integer.
-     word0 = this.readInt32();
-     word1 = this.readInt32();
-     if (word1 === 0)
-       return word0; // don't convert to float if possible
-     if (word1 < 2097152) // max exact float point int, 2^52 / 2^32
-       return  word1*0x100000000 + word0;
-
-     res = (new bn(word1)).ishln(32).iaddn(word0);
-     return bigNumberStrings ? res.toString() : res;
-   }
-
-   console.trace();
-   throw "Should not reach here: " + byte1;
-};
-
-Packet.prototype.readFloat = function() {
-  var res = this.buffer.readFloatLE(this.offset);
-  this.offset += 4;
-  return res;
-};
-
-Packet.prototype.readDouble = function() {
-  var res = this.buffer.readDoubleLE(this.offset);
-  this.offset += 8;
-  return res;
-};
-
-Packet.prototype.readBuffer = function(len) {
-  if (typeof len == 'undefined')
-    len = this.end - this.offset;
-  this.offset += len;
-  return this.buffer.slice(this.offset - len, this.offset);
-};
-
-var INVALID_DATE = new Date(NaN);
-// DATE, DATETIME and TIMESTAMP
-Packet.prototype.readDateTime = function() {
-  var length = this.readInt8();
-  var y = 0;
-  var m = 0;
-  var d = 0;
-  var H = 0;
-  var M = 0;
-  var S = 0;
-  var ms = 0;
-  if (length > 3) {
-    y = this.readInt16();
-    m = this.readInt8();
-    d = this.readInt8();
-
-  }
-  if (length > 6) {
-    H = this.readInt8();
-    M = this.readInt8();
-    S = this.readInt8();
-  }
-  if (length > 11)
-    ms = this.readInt32();
-  if ((y + m + d + H + M + S + ms) === 0) {
-    return INVALID_DATE;
-  }
-  return new Date(y, m-1, d, H, M, S, ms);
-};
-
-// this is nearly duplicate of previous function so generated code is not slower
-// due to "if (dateStrings)" branching
-var pad = "000000000000";
-function leftPad(num, value) {
-  var s = value.toString();
-  // if we don't need to pad
-  if (s.length >= num)
-    return s;
-  return (pad + s).slice(-num);
-}
-
-Packet.prototype.readDateTimeString = function() {
-  var length = this.readInt8();
-  var y = 0;
-  var m = 0;
-  var d = 0;
-  var H = 0;
-  var M = 0;
-  var S = 0;
-  var ms = 0;
-  var str;
-  if (length > 3) {
-    y = this.readInt16();
-    m = this.readInt8();
-    d = this.readInt8();
-    str =  [leftPad(4, y), leftPad(2, m), leftPad(2, d)].join('-');
-  }
-  if (length > 6) {
-    H = this.readInt8();
-    M = this.readInt8();
-    S = this.readInt8();
-    str += ' ' + [leftPad(2, H), leftPad(2, M), leftPad(2, S)].join(':');
-  }
-  /* in text protocol you don't see microseconds as DATETIME/TIMESTAMP result.
-     instead you need to use MICROSECOND() function
-  if (length > 11) {
-    ms = this.readInt32();
-  }
-  */
-  return str;
-};
-
-// TIME - value as a string, Can be negative
-Packet.prototype.readTimeString = function(convertTtoMs) {
-  var length = this.readInt8();
-  if (length === 0)
-    return 0;
-
-  var result = 0;
-  var sign = this.readInt8() ? -1 : 1; // 'isNegative' flag byte
-  var d = 0;
-  var H = 0;
-  var M = 0;
-  var S = 0;
-  var ms = 0;
-  if (length > 7) {
-    d = this.readInt32();
-    H = this.readInt8();
-    M = this.readInt8();
-    S = this.readInt8();
-  }
-  if (length > 11)
-    ms = this.readInt32();
-
-  if (convertTtoMs) {
-    H += d * 24;
-    M += H * 60;
-    S += M * 60;
-    ms += S * 1000;
-    ms *= sign;
-    return ms;
-  }
-  return ( sign === -1 ? '-' : '' ) + [( d ? (d*24) + H : H ), leftPad(2, M), leftPad(2, S)].join(':') + ( ms ? '.'+ ms : '' );
-};
-
-Packet.prototype.readLengthCodedString = function() {
-  var len = this.readLengthCodedNumber();
-  // TODO: check manually first byte here to avoid polymorphic return type?
-  if (len === null)
-    return null;
-  this.offset += len;
-  return this.buffer.utf8Slice(this.offset - len, this.offset);
-};
-
-Packet.prototype.readLengthCodedBuffer = function() {
-  var len = this.readLengthCodedNumber();
-  return this.readBuffer(len);
-};
-
-Packet.prototype.readNullTerminatedString = function() {
-  var start = this.offset;
-  var end = this.offset;
-  while (this.buffer[end])
-    end = end + 1; // TODO: handle OOB check
-  this.offset = end + 1;
-  return this.buffer.utf8Slice(start, end);
-};
-
-// TODO reuse?
-Packet.prototype.readString = function(len) {
-  if (typeof len == 'undefined')
-    len = this.end - this.offset;
-  this.offset += len;
-  return this.buffer.utf8Slice(this.offset - len, this.offset);
-};
-
-var minus = '-'.charCodeAt(0);
-var plus = '+'.charCodeAt(0);
-// TODO: faster versions of parseInt for smaller types?
-// discard overflow checks if we know from type definition it's safe so
-Packet.prototype.parseInt = function(len) {
-
-  if (len === null)
-    return null;
-
-  var result = 0;
-  var end = this.offset + len;
-  var sign = 1;
-  if (len === 0)
-    return 0; // TODO: assert? exception?
-  if (this.buffer[this.offset] == minus) {
-    this.offset++;
-    sign = -1;
-  }
-
-  // max precise int is 9007199254740992
-  // note that we are here after handling optional +/-
-  // treat everything above 9000000000000000 as potential overflow
-  var str;
-  var numDigits = end - this.offset;
-  if (numDigits == 16 && (this.buffer[this.offset] - 48) > 8) {
-    str = this.readString(end - this.offset);
-    result = parseInt(str, 10);
-    if (result.toString() == str)
-      return sign*result;
-    else
-      return sign == -1 ? "-" + str : str;
-  } else if (numDigits > 16) {
-    str = this.readString(end - this.offset);
-    return sign == -1 ? "-" + str : str;
-  }
-
-  if (this.buffer[this.offset] == plus) {
-    this.offset++; // just ignore
-  }
-  while(this.offset < end) {
-    result *= 10;
-    result += this.buffer[this.offset] - 48;
-    this.offset++;
-  }
-  return result*sign;
-};
-
-// copy-paste from https://github.com/felixge/node-mysql/blob/master/lib/protocol/Parser.js
-Packet.prototype.parseGeometryValue = function() {
-  var buffer = this.readLengthCodedBuffer();
-  var offset = 4;
-
-  if (buffer === null || !buffer.length) {
-    return null;
-  }
-
-  function parseGeometry() {
-    var x, y, i, j, numPoints, line;
-    var result = null;
-    var byteOrder = buffer.readUInt8(offset); offset += 1;
-    var wkbType = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4;
-    switch(wkbType) {
-      case 1: // WKBPoint
-        x = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
-        y = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
-        result = {x: x, y: y};
-        break;
-      case 2: // WKBLineString
-        numPoints = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4;
-        result = [];
-        for(i=numPoints;i>0;i--) {
-          x = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
-          y = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
-          result.push({x: x, y: y});
-        }
-        break;
-      case 3: // WKBPolygon
-        var numRings = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4;
-        result = [];
-        for(i=numRings;i>0;i--) {
-          numPoints = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4;
-          line = [];
-          for(j=numPoints;j>0;j--) {
-            x = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
-            y = byteOrder? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8;
-            line.push({x: x, y: y});
-          }
-          result.push(line);
-        }
-        break;
-      case 4: // WKBMultiPoint
-      case 5: // WKBMultiLineString
-      case 6: // WKBMultiPolygon
-      case 7: // WKBGeometryCollection
-        var num = byteOrder? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4;
-        result = [];
-        for(i=num;i>0;i--) {
-          result.push(parseGeometry());
-        }
-        break;
-    }
-    return result;
-  }
-  return parseGeometry();
-};
-
-Packet.prototype.parseDate = function() {
-  var strLen = this.readLengthCodedNumber();
-  if (strLen === null)
-    return null;
-  if (strLen != 10) {
-    // we expect only YYYY-MM-DD here.
-    // if for some reason it's not the case return invalid date
-    return new Date(NaN);
-  }
-  var y = this.parseInt(4);
-  this.offset++; // -
-  var m = this.parseInt(2);
-  this.offset++; // -
-  var d = this.parseInt(2);
-  return new Date(y, m-1, d);
-};
-
-Packet.prototype.parseDateTime = function() {
-  var str = this.readLengthCodedString();
-  if (str === null)
-    return null;
-  return new Date(str);
-};
-
-
-// TODO: handle E notation
-var dot = '.'.charCodeAt(0);
-var exponent = 'e'.charCodeAt(0);
-var exponentCapital = 'E'.charCodeAt(0);
-Packet.prototype.parseFloat = function(len) {
-
-  if (len === null)
-    return null;
-
-  var result = 0;
-  var end = this.offset + len;
-  var factor = 1;
-  var pastDot = false;
-  var charCode = 0;
-  if (len === 0)
-    return 0; // TODO: assert? exception?
-
-  if (this.buffer[this.offset] == minus) {
-    this.offset++;
-    factor = -1;
-  }
-  if (this.buffer[this.offset] == plus) {
-    this.offset++; // just ignore
-  }
-  while(this.offset < end) {
-    charCode = this.buffer[this.offset];
-    if (charCode == dot)
-    {
-      pastDot = true;
-      this.offset++;
-    } else if (charCode == exponent || charCode == exponentCapital) {
-      this.offset++;
-      var exponentValue = this.parseInt(end - this.offset);
-      return (result/factor)*Math.pow(10, exponentValue);
-    } else {
-      result *= 10;
-      result += this.buffer[this.offset] - 48;
-      this.offset++;
-      if (pastDot)
-        factor = factor*10;
-    }
-  }
-  return result/factor;
-};
-
-Packet.prototype.parseLengthCodedInt = function() {
-  return this.parseInt(this.readLengthCodedNumber());
-};
-
-Packet.prototype.parseLengthCodedIntString = function() {
-  return this.readString(this.readLengthCodedNumber());
-};
-
-Packet.prototype.parseLengthCodedFloat = function() {
-  return this.parseFloat(this.readLengthCodedNumber());
-};
-
-Packet.prototype.isError = function() {
-  return this.buffer[this.offset] == 0xff;
-};
-
-Packet.prototype.asError = function() {
-  this.reset();
-
-  var fieldCount = this.readInt8();
-  var errorCode = this.readInt16();
-  var sqlState  = '';
-  if (this.buffer[this.offset] == 0x23)
-    sqlState = this.readBuffer(6).toString();
-  var message = this.readString();
-  var err = new Error(message);
-  err.code     = ErrorCodeToName[errorCode];
-  err.errno    = errorCode;
-  err.sqlState = sqlState;
-  return err;
-};
-
-
-Packet.lengthCodedNumberLength = function(n) {
-   if (n < 0xfb)
-     return 1;
-   if (n < 0xffff)
-     return 3;
-   if (n < 0xffffff)
-     return 5;
-   else
-     return 9;
-};
-
-Packet.prototype.writeInt32 = function(n) {
-  this.buffer.writeUInt32LE(n, this.offset);
-  this.offset += 4;
-};
-
-Packet.prototype.writeInt24 = function(n) {
-  this.writeInt8(n & 0xff);
-  this.writeInt16(n >> 8);
-};
-
-Packet.prototype.writeInt16 = function(n) {
-  this.buffer.writeUInt16LE(n, this.offset);
-  this.offset += 2;
-};
-
-Packet.prototype.writeInt8 = function(n) {
-  this.buffer.writeUInt8(n, this.offset);
-  this.offset++;
-};
-
-Packet.prototype.writeBuffer = function(b) {
-  b.copy(this.buffer, this.offset);
-  this.offset += b.length;
-};
-
-Packet.prototype.writeNull = function() {
-  this.buffer[this.offset] = 0xfb;
-  this.offset++;
-};
-
-// TODO: refactor following three?
-Packet.prototype.writeNullTerminatedString = function(s) {
-  this.buffer.write(s, this.offset);
-  this.offset += s.length;
-  this.writeInt8(0);
-};
-
-Packet.prototype.writeString = function(s) {
-  var bytes = Buffer.byteLength(s, 'utf8');
-  this.buffer.write(s, this.offset, bytes, 'utf8');
-  this.offset += bytes;
-};
-
-Packet.prototype.writeLengthCodedString = function(s) {
-  var bytes = Buffer.byteLength(s, 'utf8');
-  this.writeLengthCodedNumber(bytes);
-  this.buffer.write(s, this.offset, bytes, 'utf8');
-  this.offset += bytes;
-};
-
-Packet.prototype.writeLengthCodedBuffer = function(b) {
-  this.writeLengthCodedNumber(b.length);
-  b.copy(this.buffer, this.offset);
-  this.offset += b.length;
-};
-
-Packet.prototype.writeLengthCodedNumber = function(n) {
-  // TODO: null - http://dev.mysql.com/doc/internals/en/overview.html#length-encoded-integer
-  if (n < 0xfb)
-    return this.writeInt8(n);
-  if (n < 0xffff) {
-    this.writeInt8(0xfc);
-    return this.writeInt16(n);
-  }
-  if (n < 0xffffff) {
-    this.writeInt8(0xfd);
-    return this.writeInt24(n);
-  }
-  console.log(n);
-  console.trace();
-  throw "No bignumbers yet";
-};
-
-Packet.prototype.writeHeader = function(sequenceId)
-{
-  var offset = this.offset;
-  this.offset = 0;
-  this.writeInt24(this.buffer.length - 4);
-  this.writeInt8(sequenceId);
-  this.offset = offset;
-};
-
-Packet.prototype.clone = function() {
-  var buffer = this.buffer.slice(this.start, this.end);
-  var other = new Packet(this.sequenceId, this.buffer, 0, this.buffer.length);
-  return other;
-};
-
-Packet.prototype.type = function() {
-  if (this.isEOF())
-    return 'EOF';
-  if (this.isError())
-    return 'Error';
-  if (this.buffer[this.offset] == 0)
-    return 'maybeOK'; // could be other packet types as well
-  return '';
-};
-module.exports = Packet;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/prepare_statement.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/prepare_statement.js
deleted file mode 100644
index 009303b8cd9e1de563151e39a387897e0725a442..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/prepare_statement.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var Packet = require('../packets/packet');
-var CommandCodes = require('../constants/commands');
-
-function PrepareStatement(sql)
-{
-  this.query = sql;
-}
-
-PrepareStatement.prototype.toPacket = function()
-{
-  var length = 5 + Buffer.byteLength(this.query, 'utf8');
-  var buffer = new Buffer(length);
-  var packet = new Packet(0, buffer, 0, length);
-  packet.offset = 4;
-  packet.writeInt8(CommandCodes.STMT_PREPARE);
-  packet.writeString(this.query);
-  return packet;
-};
-
-module.exports = PrepareStatement;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/prepared_statement_header.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/prepared_statement_header.js
deleted file mode 100644
index de8f0479acead7852f4a2ad5faa883682ddcf7e7..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/prepared_statement_header.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var Packet = require('../packets/packet');
-
-function PreparedStatementHeader(packet)
-{
-  packet.skip(1);     // should be 0
-  this.id = packet.readInt32();
-  this.fieldCount      = packet.readInt16();
-  this.parameterCount  = packet.readInt16();
-  packet.skip(1);     // should be 0
-  this.warningCount = packet.readInt16();
-}
-
-// TODO: toPacket
-
-module.exports = PreparedStatementHeader;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/query.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/query.js
deleted file mode 100644
index 9bb45b90f18f7f49cd6cb886fce39e385ca0a1e6..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/query.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var Packet      = require('../packets/packet.js');
-var CommandCode = require('../constants/commands.js');
-
-function Query(sql)
-{
-  this.query = sql;
-}
-
-Query.prototype.toPacket = function()
-{
-  var length = 5 + Buffer.byteLength(this.query, 'utf8');
-  var buffer = new Buffer(length);
-  var packet = new Packet(0, buffer, 0, length);
-  packet.offset = 4;
-  packet.writeInt8(CommandCode.QUERY);
-  packet.writeString(this.query);
-  return packet;
-};
-
-module.exports = Query;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/register_slave.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/register_slave.js
deleted file mode 100644
index bd16f40e4b921b017796bd33eb19dd3889b7800f..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/register_slave.js
+++ /dev/null
@@ -1,41 +0,0 @@
-// http://dev.mysql.com/doc/internals/en/com-register-slave.html
-// note that documentation is incorrect, for example command code is actually 0x15 but documented as 0x14
-
-var Packet = require('../packets/packet');
-var CommandCodes = require('../constants/commands');
-
-function RegisterSlave(opts)
-{
-  this.serverId        = opts.serverId || 0;
-  this.slaveHostname   = opts.slaveHostname || '';
-  this.slaveUser       = opts.slaveUser || '';
-  this.slavePassword   = opts.slavePassword || '';
-  this.slavePort       = opts.slavePort || 0;
-  this.replicationRank = opts.replicationRank || 0;
-  this.masterId        = opts.masterId || 0;
-}
-
-RegisterSlave.prototype.toPacket = function()
-{
-  var length =  15 + // TODO: should be ascii?
-    Buffer.byteLength(this.slaveHostname, 'utf8') +
-    Buffer.byteLength(this.slaveUser, 'utf8') +
-    Buffer.byteLength(this.slavePassword, 'utf8') + 3 + 4;
-  var buffer = new Buffer(length);
-  var packet = new Packet(0, buffer, 0, length);
-  packet.offset = 4;
-  packet.writeInt8(CommandCodes.REGISTER_SLAVE);
-  packet.writeInt32(this.serverId);
-  packet.writeInt8(Buffer.byteLength(this.slaveHostname, 'utf8'));
-  packet.writeString(this.slaveHostname);
-  packet.writeInt8(Buffer.byteLength(this.slaveUser, 'utf8'));
-  packet.writeString(this.slaveUser);
-  packet.writeInt8(Buffer.byteLength(this.slavePassword, 'utf8'));
-  packet.writeString(this.slavePassword);
-  packet.writeInt16(this.slavePort);
-  packet.writeInt32(this.replicationRank);
-  packet.writeInt32(this.masterId);
-  return packet;
-};
-
-module.exports = RegisterSlave;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/resultset_header.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/resultset_header.js
deleted file mode 100644
index 5715ff6a1b1cdba2c9abdeed4ba5fa011d965a61..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/resultset_header.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// TODO: rename to OK packet
-
-var Packet = require('../packets/packet');
-
-function ResultSetHeader(packet, bigNumberStrings)
-{
-  if (packet.buffer[packet.offset] !== 0) {
-    this.fieldCount = packet.readLengthCodedNumber();
-  } else {
-    this.fieldCount   = packet.readInt8(); // skip OK byte
-    this.affectedRows = packet.readLengthCodedNumber(bigNumberStrings);
-    this.insertId     = packet.readLengthCodedNumber(bigNumberStrings);
-    this.serverStatus  = packet.readInt16();
-    this.warningStatus = packet.readInt16();
-  }
-  if (this.fieldCount === null) {
-    this.infileName = packet.readString();
-  }
-
-  // snippet from mysql-native:
-  // res.affected_rows = this.lcnum();
-  // res.insert_id = this.lcnum();
-  // res.server_status = this.num(2);
-  // res.warning_count = this.num(2);
-
-  // TODO: extra
-}
-
-// TODO: should be consistent instance member, but it's just easier here to have just function
-ResultSetHeader.toPacket = function(fieldCount, insertId, sequenceId) {
-  var length = 4 + Packet.lengthCodedNumberLength(fieldCount);
-  if (typeof(insertId) != 'undefined')
-    length += Packet.lengthCodedNumberLength(insertId);
-  var buffer = new Buffer(length);
-  var packet = new Packet(0, buffer, 0, length);
-  packet.offset = 4;
-  packet.writeLengthCodedNumber(fieldCount);
-  if (typeof(insertId) != 'undefined')
-    packet.writeLengthCodedNumber(insertId);
-  return packet;
-};
-
-module.exports = ResultSetHeader;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/ssl_request.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/ssl_request.js
deleted file mode 100644
index f65a90f140f5e0ff3ca301f8375f53b219e604c6..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/ssl_request.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var ClientConstants = require('../constants/client');
-var Packet = require('../packets/packet');
-var Charsets = require('../constants/charsets');
-
-function SSLRequest(flags)
-{
-  this.clientFlags = flags | ClientConstants.SSL;
-}
-
-SSLRequest.prototype.toPacket = function()
-{
-  var length = 36;
-  var buffer = new Buffer(length);
-  var packet = new Packet(0, buffer, 0, length);
-  buffer.fill(0);
-  packet.offset = 4;
-
-  packet.writeInt32(this.clientFlags);
-  packet.writeInt32(0); // max packet size. todo: move to config
-  packet.writeInt8(Charsets.UTF8_GENERAL_CI);
-  return packet;
-};
-
-module.exports = SSLRequest;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/text_row.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/text_row.js
deleted file mode 100644
index f6185efd935ff07ea10805e0374d9e524f09ee43..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/packets/text_row.js
+++ /dev/null
@@ -1,38 +0,0 @@
-var Packet = require('../packets/packet');
-
-function TextRow(columns)
-{
-  this.columns = columns || [];
-}
-
-TextRow.fromPacket = function(packet) {
-  //packet.reset(); // set offset to starting point?
-  var columns = [];
-  while(packet.haveMoreData()) {
-    columns.push(packet.readLengthCodedString());
-  }
-  return new TextRow(columns);
-};
-
-TextRow.toPacket = function(column) {
-  var sequenceId = 0; // TODO remove, this is calculated now in connecton
-  var buffer, packet;
-  var length = 0;
-  column.forEach(function(val) {
-	if (val === null || typeof(val) == 'undefined') return ++length;
-    var str = val.toString(10);
-    length += Packet.lengthCodedNumberLength(str);
-    length += str.length;
-  });
-  buffer = new Buffer(length+4);
-  packet = new Packet(sequenceId, buffer, 0, length+4);
-  packet.offset = 4;
-  column.forEach(function(val) {
-    if (val === null) return packet.writeNull();
-    if (typeof val == 'undefined') return packet.writeInt8(0);
-    packet.writeLengthCodedString(val.toString(10));
-  });
-  return packet;
-};
-
-module.exports = TextRow;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/pool.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/pool.js
deleted file mode 100644
index e0f814ed70fb2c2f94de94fe7d873e2f8a5431e7..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/pool.js
+++ /dev/null
@@ -1,180 +0,0 @@
-var mysql        = require('../index.js');
-
-var EventEmitter = require('events').EventEmitter;
-var Util         = require('util');
-var PoolConnection = require('./pool_connection.js');
-
-module.exports = Pool;
-
-Util.inherits(Pool, EventEmitter);
-function Pool(options) {
-  EventEmitter.call(this);
-  this.config = options.config;
-  this.config.connectionConfig.pool = this;
-
-  this._allConnections   = [];
-  this._freeConnections  = [];
-  this._connectionQueue  = [];
-  this._closed           = false;
-}
-
-Pool.prototype.getConnection = function (cb) {
-  if (this._closed) {
-    return process.nextTick(function(){
-      return cb(new Error('Pool is closed.'));
-    });
-  }
-
-  var connection;
-
-  if (this._freeConnections.length > 0) {
-    connection = this._freeConnections.shift();
-
-    return process.nextTick(function(){
-      return cb(null, connection);
-    });
-  }
-
-  if (this.config.connectionLimit === 0 || this._allConnections.length < this.config.connectionLimit) {
-    connection = new PoolConnection(this, { config: this.config.connectionConfig });
-
-    this._allConnections.push(connection);
-
-    return connection.connect(function(err) {
-      if (this._closed) {
-        return cb(new Error('Pool is closed.'));
-      }
-      if (err) {
-        return cb(err);
-      }
-
-      this.emit('connection', connection);
-      return cb(null, connection);
-    }.bind(this));
-  }
-
-  if (!this.config.waitForConnections) {
-    return process.nextTick(function(){
-      return cb(new Error('No connections available.'));
-    });
-  }
-
-  if (this.config.queueLimit && this._connectionQueue.length >= this.config.queueLimit) {
-    return cb(new Error('Queue limit reached.'));
-  }
-
-  this._connectionQueue.push(cb);
-};
-
-Pool.prototype.releaseConnection = function (connection) {
-  var cb;
-
-  if (!connection._pool) {
-    // The connection has been removed from the pool and is no longer good.
-    if (this._connectionQueue.length) {
-      cb = this._connectionQueue.shift();
-
-      process.nextTick(this.getConnection.bind(this, cb));
-    }
-  } else if (this._connectionQueue.length) {
-    cb = this._connectionQueue.shift();
-
-    process.nextTick(cb.bind(null, null, connection));
-  } else {
-    this._freeConnections.push(connection);
-  }
-};
-
-Pool.prototype.end = function (cb) {
-  this._closed = true;
-
-  if (typeof cb != "function") {
-    cb = function (err) {
-      if (err) throw err;
-    };
-  }
-
-  var calledBack        = false;
-  var closedConnections = 0;
-  var connection;
-
-  var endCB = function(err) {
-    if (calledBack) {
-      return;
-    }
-
-    if (err || ++closedConnections >= this._allConnections.length) {
-      calledBack = true;
-      return cb(err);
-    }
-  }.bind(this);
-
-  if (this._allConnections.length === 0) {
-    return endCB();
-  }
-
-  for (var i = 0; i < this._allConnections.length; i++) {
-    connection = this._allConnections[i];
-    connection._realEnd(endCB);
-  }
-};
-
-Pool.prototype.query = function (sql, values, cb) {
-  if (typeof values === 'function') {
-    cb = values;
-    values = null;
-  }
-
-  this.getConnection(function (err, conn) {
-    if (err) return cb(err);
-
-    conn.query(sql, values, function () {
-      conn.release();
-      cb.apply(this, arguments);
-    });
-  });
-};
-
-Pool.prototype.execute = function (sql, values, cb) {
-  if (typeof values === 'function') {
-    cb = values;
-    values = null;
-  }
-
-  this.getConnection(function (err, conn) {
-    if (err) return cb(err);
-
-    conn.execute(sql, values, function () {
-      conn.release();
-      cb.apply(this, arguments);
-    });
-  });
-};
-
-Pool.prototype._removeConnection = function(connection) {
-  var i;
-
-  for (i = 0; i < this._allConnections.length; i++) {
-    if (this._allConnections[i] === connection) {
-      this._allConnections.splice(i, 1);
-      break;
-    }
-  }
-
-  for (i = 0; i < this._freeConnections.length; i++) {
-    if (this._freeConnections[i] === connection) {
-      this._freeConnections.splice(i, 1);
-      break;
-    }
-  }
-
-  this.releaseConnection(connection);
-};
-
-Pool.prototype.escape = function(value) {
-  return mysql.escape(value, this.config.connectionConfig.stringifyObjects, this.config.connectionConfig.timezone);
-};
-
-Pool.prototype.escapeId = function escapeId(value) {
-  return mysql.escapeId(value, false);
-};
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/pool_cluster.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/pool_cluster.js
deleted file mode 100644
index 88cbe5301b970af789c99794ec2cd0208597a82d..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/pool_cluster.js
+++ /dev/null
@@ -1,242 +0,0 @@
-var Pool         = require('./pool.js');
-var PoolConfig   = require('./pool_config.js');
-var Util         = require('util');
-var EventEmitter = require('events').EventEmitter;
-
-module.exports = PoolCluster;
-
-/**
- * PoolCluster
- */
-function PoolCluster(config) {
-  EventEmitter.call(this);
-
-  config = config || {};
-  this._canRetry = typeof config.canRetry === 'undefined' ? true : config.canRetry;
-  this._removeNodeErrorCount = config.removeNodeErrorCount || 5;
-  this._defaultSelector = config.defaultSelector || 'RR';
-
-  this._closed = false;
-  this._lastId = 0;
-  this._nodes = {};
-  this._serviceableNodeIds = [];
-  this._namespaces = {};
-  this._findCaches = {};
-}
-
-Util.inherits(PoolCluster, EventEmitter);
-
-PoolCluster.prototype.of = function(pattern, selector) {
-  pattern = pattern || '*';
-  
-  selector = selector || this._defaultSelector;
-  selector = selector.toUpperCase();
-  if (typeof Selector[selector] === 'undefined') {
-    selector = this._defaultSelector;
-  }
-  
-  var key = pattern + selector;
-
-  if (typeof this._namespaces[key] === 'undefined') {
-    this._namespaces[key] = new PoolNamespace(this, pattern, selector);
-  }
-
-  return this._namespaces[key];
-};
-
-PoolCluster.prototype.add = function(id, config) {
-  if (typeof id === 'object') {
-    config = id;
-    id = 'CLUSTER::' + (++this._lastId);
-  }
-
-  if (typeof this._nodes[id] === 'undefined') {
-    this._nodes[id] = {
-      id: id,
-      errorCount: 0,
-      pool: new Pool({config: new PoolConfig(config)})
-    };
-
-    this._serviceableNodeIds.push(id);
-    
-    this._clearFindCaches();
-  }
-};
-
-PoolCluster.prototype.getConnection = function(pattern, selector, cb) {
-  var namespace;
-  if (typeof pattern === 'function') {
-    cb = pattern;
-    namespace = this.of();
-  } else {
-    if (typeof selector === 'function') {
-      cb = selector;
-      selector = this._defaultSelector;
-    }
-
-    namespace = this.of(pattern, selector);
-  }
-
-  namespace.getConnection(cb);
-};
-
-PoolCluster.prototype.end = function() {
-  if (this._closed) {
-    return;
-  }
-
-  this._closed = true;
-
-  for (var id in this._nodes) {
-    this._nodes[id].pool.end();
-  }
-};
-
-PoolCluster.prototype._findNodeIds = function(pattern) {
-  if (typeof this._findCaches[pattern] !== 'undefined') {
-    return this._findCaches[pattern];
-  }
-  
-  var foundNodeIds;
-
-  if (pattern === '*') { // all
-    foundNodeIds = this._serviceableNodeIds;
-  } else  if (this._serviceableNodeIds.indexOf(pattern) != -1) { // one
-    foundNodeIds = [pattern];
-  } else { // wild matching
-    var keyword = pattern.substring(pattern.length - 1, 0);
-
-    foundNodeIds = this._serviceableNodeIds.filter(function (id) {
-      return id.indexOf(keyword) === 0;
-    });
-  }
-
-  this._findCaches[pattern] = foundNodeIds;
-  
-  return foundNodeIds;
-};
-
-PoolCluster.prototype._getNode = function(id) {
-  return this._nodes[id] || null;
-};
-
-PoolCluster.prototype._increaseErrorCount = function(node) {
-  if (++node.errorCount >= this._removeNodeErrorCount) {
-    var index = this._serviceableNodeIds.indexOf(node.id);
-    if (index !== -1) {
-      this._serviceableNodeIds.splice(index, 1);
-      delete this._nodes[node.id];
-      
-      this._clearFindCaches();
-      
-      node.pool.end();
-
-      this.emit('remove', node.id);
-    }
-  }
-};
-
-PoolCluster.prototype._decreaseErrorCount = function(node) {
-  if (node.errorCount > 0) {
-    --node.errorCount;
-  }
-};
-
-PoolCluster.prototype._getConnection = function(node, cb) {
-  var self = this;
-
-  node.pool.getConnection(function (err, connection) {
-    if (err) {      
-      self._increaseErrorCount(node);
-      
-      if (self._canRetry) {
-        console.warn('[Error] PoolCluster : ' + err);        
-        return cb(null, 'retry');
-      } else {
-        return cb(err);
-      }
-    } else {
-      self._decreaseErrorCount(node);
-    }
-
-    connection._clusterId = node.id;
-
-    cb(null, connection);
-  });
-};
-
-PoolCluster.prototype._clearFindCaches = function() {  
-  this._findCaches = {};
-};
-
-/**
- * PoolNamespace
- */
-function PoolNamespace(cluster, pattern, selector) {
-  this._cluster = cluster;
-  this._pattern = pattern;
-  this._selector = new Selector[selector]();
-}
-
-PoolNamespace.prototype.getConnection = function(cb) {
-  var clusterNode = this._getClusterNode();
-
-  if (clusterNode === null) {
-    return cb(new Error('Pool does Not exists.'));
-  }
-
-  this._cluster._getConnection(clusterNode, function(err, connection) {
-    if (err) {
-      return cb(err);
-    }
-
-    if (connection === 'retry') {
-      return this.getConnection(cb);
-    }
-
-    cb(null, connection);
-  }.bind(this));
-};
-
-PoolNamespace.prototype._getClusterNode = function() {
-  var foundNodeIds = this._cluster._findNodeIds(this._pattern);
-
-  if (foundNodeIds.length === 0) {
-      return null;
-  }
-
-  var nodeId = (foundNodeIds.length === 1) ? foundNodeIds[0] : this._selector(foundNodeIds);
-
-  return this._cluster._getNode(nodeId);
-};
-
-/**
- * Selector
- */
-var Selector = {};
-
-Selector.RR = function () {
-  var index = 0;
-
-  return function(clusterIds) {
-    if (index >= clusterIds.length) {
-      index = 0;
-    }
-
-    var clusterId = clusterIds[index++];
-
-    return clusterId;
-  };
-};
-
-Selector.RANDOM = function () {
-  return function(clusterIds) {
-    return clusterIds[Math.floor(Math.random() * clusterIds.length)];
-  };
-};
-
-Selector.ORDER = function () {
-  return function(clusterIds) {
-    return clusterIds[0];
-  };
-};
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/pool_config.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/pool_config.js
deleted file mode 100644
index c75601e5e0ee1b6ec1bdd82fabec1e01bcbaa0ca..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/pool_config.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var ConnectionConfig = require('./connection_config.js');
-
-module.exports = PoolConfig;
-function PoolConfig(options) {
-  this.connectionConfig   = new ConnectionConfig(options);
-  this.waitForConnections = (options.waitForConnections === undefined)
-    ? true
-    : Boolean(options.waitForConnections);
-  this.connectionLimit    = (options.connectionLimit === undefined)
-    ? 10
-    : Number(options.connectionLimit);
-  this.queueLimit         = (options.queueLimit === undefined)
-    ? 0
-    : Number(options.queueLimit);
-}
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/pool_connection.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/pool_connection.js
deleted file mode 100644
index ccd2a4efe6c48409ed8d274bbbb1440d76ef49f0..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/pool_connection.js
+++ /dev/null
@@ -1,54 +0,0 @@
-var mysql        = require('../index.js');
-var Connection   = mysql.Connection;
-
-var inherits = require('util').inherits;
-
-module.exports = PoolConnection;
-inherits(PoolConnection, Connection);
-
-function PoolConnection(pool, options) {
-  Connection.call(this, options);
-  this._pool = pool;
-
-  // When a fatal error occurs the connection's protocol ends, which will cause
-  // the connection to end as well, thus we only need to watch for the end event
-  // and we will be notified of disconnects.
-  this.on('end', this._removeFromPool);
-  this.on('error', this._removeFromPool);
-}
-
-PoolConnection.prototype.release = function () {
-  if (!this._pool || this._pool._closed) {
-    return;
-  }
-
-  return this._pool.releaseConnection(this);
-};
-
-// TODO: Remove this when we are removing PoolConnection#end
-PoolConnection.prototype._realEnd = Connection.prototype.end;
-
-PoolConnection.prototype.end = function () {
-  console.warn( 'Calling conn.end() to release a pooled connection is '
-              + 'deprecated. In next version calling conn.end() will be '
-              + 'restored to default conn.end() behavior. Use '
-              + 'conn.release() instead.'
-              );
-  this.release();
-};
-
-PoolConnection.prototype.destroy = function () {
-  this._removeFromPool(this);
-  return Connection.prototype.destroy.apply(this, arguments);
-};
-
-PoolConnection.prototype._removeFromPool = function(connection) {
-  if (!this._pool || this._pool._closed) {
-    return;
-  }
-
-  var pool = this._pool;
-  this._pool = null;
-
-  pool._removeConnection(this);
-};
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/results_stream.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/results_stream.js
deleted file mode 100644
index de214fcba42c840b27037cfce8effa9714ef1536..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/results_stream.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var Readable  = require('stream').Readable;
-
-// copy-paste from https://github.com/felixge/node-mysql/blob/master/lib/protocol/sequences/Query.js
-module.exports = function (command, connectionStream) {
-  command.stream = function(options) {
-    var stream;
-
-    options = options || {};
-    options.objectMode = true;
-    stream = new Readable(options),
-
-    stream._read = function() {
-      connectionStream.resume();
-    };
-
-    this.on("result",function(row,i) {
-      if (!stream.push(row)) connectionStream.pause();
-      stream.emit("result",row,i);  // replicate old emitter
-    });
-
-    this.on("error",function(err) {
-      stream.emit("error",err);  // Pass on any errors
-    });
-
-    this.on("end", function() {
-      stream.push(null);  // pushing null, indicating EOF
-    });
-
-    this.on("fields",function(fields,i) {
-      stream.emit("fields",fields,i);  // replicate old emitter
-    });
-
-    return stream;
-  };
-};
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/server.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/server.js
deleted file mode 100644
index 0db454f8f633218400b525108b37912fb716e6d0..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/server.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var net          = require('net');
-var util         = require('util');
-var EventEmitter = require('events').EventEmitter;
-
-var Connection   = require('./connection');
-var ConnectionConfig = require('./connection_config');
-
-// TODO: inherit Server from net.Server
-function Server()
-{
-  EventEmitter.call(this);
-  this.connections = [];
-  this._server = net.createServer(this._handleConnection.bind(this));
-}
-util.inherits(Server, EventEmitter);
-
-Server.prototype._handleConnection = function(socket) {
-  var connectionConfig = new ConnectionConfig({ stream: socket, isServer: true});
-  var connection = new Connection({ config: connectionConfig});
-  this.emit('connection', connection);
-  this.connections.push(connection);
-};
-
-Server.prototype.listen = function(port, host, backlog, callback) {
-  this._server.listen.apply(this._server, arguments);
-  return this;
-};
-
-Server.prototype.close = function(cb) {
-  this._server.close(cb);
-};
-
-module.exports = Server;
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/lib/sql_string.js b/node_modules/mysql2-promise/node_modules/mysql2/lib/sql_string.js
deleted file mode 100644
index c9883daa30721ea27f384b5453360247b33d1c2d..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/lib/sql_string.js
+++ /dev/null
@@ -1,140 +0,0 @@
-var SqlString = exports;
-
-SqlString.escapeId = function (val, forbidQualified) {
-  if (Array.isArray(val)) {
-    return val.map(function(v) {
-      return SqlString.escapeId(v, forbidQualified);
-    }).join(', ');
-  }
-
-  if (forbidQualified) {
-    return '`' + val.replace(/`/g, '``') + '`';
-  }
-  return '`' + val.replace(/`/g, '``').replace(/\./g, '`.`') + '`';
-};
-
-SqlString.escape = function(val, stringifyObjects, timeZone) {
-  if (val === undefined || val === null) {
-    return 'NULL';
-  }
-
-  switch (typeof val) {
-    case 'boolean': return (val) ? 'true' : 'false';
-    case 'number': return val+'';
-  }
-
-  if (val instanceof Date) {
-    val = SqlString.dateToString(val, timeZone || 'local');
-  }
-
-  if (Buffer.isBuffer(val)) {
-    return SqlString.bufferToString(val);
-  }
-
-  if (Array.isArray(val)) {
-    return SqlString.arrayToList(val, timeZone);
-  }
-
-  if (typeof val === 'object') {
-    if (stringifyObjects) {
-      val = val.toString();
-    } else {
-      return SqlString.objectToValues(val, timeZone);
-    }
-  }
-
-  val = val.replace(/[\0\n\r\b\t\\\'\"\x1a]/g, function(s) {
-    switch(s) {
-      case "\0": return "\\0";
-      case "\n": return "\\n";
-      case "\r": return "\\r";
-      case "\b": return "\\b";
-      case "\t": return "\\t";
-      case "\x1a": return "\\Z";
-      default: return "\\"+s;
-    }
-  });
-  return "'"+val+"'";
-};
-
-SqlString.arrayToList = function(array, timeZone) {
-  return array.map(function(v) {
-    if (Array.isArray(v)) return '(' + SqlString.arrayToList(v, timeZone) + ')';
-    return SqlString.escape(v, true, timeZone);
-  }).join(', ');
-};
-
-SqlString.format = function(sql, values, stringifyObjects, timeZone) {
-  values = values == null ? [] : [].concat(values);
-
-  return sql.replace(/\?\??/g, function(match) {
-    if (!values.length) {
-      return match;
-    }
-
-    if (match == "??") {
-      return SqlString.escapeId(values.shift());
-    }
-    return SqlString.escape(values.shift(), stringifyObjects, timeZone);
-  });
-};
-
-SqlString.dateToString = function(date, timeZone) {
-  var dt = new Date(date);
-
-  if (timeZone != 'local') {
-    var tz = convertTimezone(timeZone);
-
-    dt.setTime(dt.getTime() + (dt.getTimezoneOffset() * 60000));
-    if (tz !== false) {
-      dt.setTime(dt.getTime() + (tz * 60000));
-    }
-  }
-
-  var year   = dt.getFullYear();
-  var month  = zeroPad(dt.getMonth() + 1, 2);
-  var day    = zeroPad(dt.getDate(), 2);
-  var hour   = zeroPad(dt.getHours(), 2);
-  var minute = zeroPad(dt.getMinutes(), 2);
-  var second = zeroPad(dt.getSeconds(), 2);
-  var millisecond = zeroPad(dt.getMilliseconds(), 3);
-
-  return year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second + '.' + millisecond;
-};
-
-SqlString.bufferToString = function bufferToString(buffer) {
-  return "X'" + buffer.toString('hex') + "'";
-};
-
-SqlString.objectToValues = function(object, timeZone) {
-  var values = [];
-  for (var key in object) {
-    var value = object[key];
-    if(typeof value === 'function') {
-      continue;
-    }
-
-    values.push(this.escapeId(key) + ' = ' + SqlString.escape(value, true, timeZone));
-  }
-
-  return values.join(', ');
-};
-
-function zeroPad(number, length) {
-  number = number.toString();
-  while (number.length < length) {
-    number = '0' + number;
-  }
-
-  return number;
-}
-
-function convertTimezone(tz) {
-  if (tz == "Z") return 0;
-
-  var m = tz.match(/([\+\-\s])(\d\d):?(\d\d)?/);
-  if (m) {
-    return (m[1] == '-' ? -1 : 1) * (parseInt(m[2], 10) + ((m[3] ? parseInt(m[3], 10) : 0) / 60)) * 60;
-  }
-  return false;
-}
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/package.json b/node_modules/mysql2-promise/node_modules/mysql2/package.json
deleted file mode 100644
index 9d5f99f4c7cbb5ff3592288d3eec61b35932fed0..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/package.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "name": "mysql2",
-  "version": "0.15.8",
-  "description": "fast mysql driver. Implements core protocol, prepared statements, ssl and compression in native JS",
-  "main": "index.js",
-  "directories": {
-    "example": "examples"
-  },
-  "scripts": {
-    "test": "node ./test/run.js",
-    "benchmark": "./benchmarks/run-unit.js",
-    "benchmarks": "./benchmarks/run-unit.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/sidorares/node-mysql2"
-  },
-  "keywords": [
-    "mysql",
-    "client",
-    "server"
-  ],
-  "engines": {
-    "node": ">= 0.8"
-  },
-  "author": "Andrey Sidorov <sidorares@yandex.ru>",
-  "license": "MIT",
-  "dependencies": {
-    "bn.js": "2.0.0",
-    "cardinal": "0.4.4",
-    "double-ended-queue": "2.0.0-0",
-    "named-placeholders": "0.1.3",
-    "readable-stream": "1.0.33"
-  },
-  "devDependencies": {
-    "progress": "1.1.8",
-    "urun": "0.0.8",
-    "utest": "0.0.8"
-  }
-}
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/common.js b/node_modules/mysql2-promise/node_modules/mysql2/test/common.js
deleted file mode 100644
index 21da88e4694f390bc6f5a74b79a34076686a5910..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/common.js
+++ /dev/null
@@ -1,105 +0,0 @@
-var config = {
-  host: process.env.MYSQL_HOST || '127.0.0.1',
-  user: process.env.MYSQL_USER || 'root',
-  password: process.env.CI ? process.env.MYSQL_PASSWORD : '',
-  database: process.env.MYSQL_DATABASE || 'test',
-  port: process.env.MYSQL_PORT || 3306
-};
-
-module.exports.SqlString = require('../lib/sql_string.js');
-
-module.exports.createConnection = function(args, callback) {
-  // hrtime polyfill for old node versions:
-  if (!process.hrtime)
-    process.hrtime = function(start) {
-      start = [0, 0] || start;
-      var timestamp = Date.now();
-      var seconds = Math.ceil(timestamp/1000);
-      return [seconds - start[0], (timestamp-seconds*1000)*1000 - start[1]];
-    };
-
-  if (process.env.BENCHMARK_MARIA) {
-    var Client = require('mariasql');
-    var c = new Client();
-    c.connect({
-      host: config.host,
-      user: config.user,
-      password: config.password,
-      db: config.database
-    });
-    //c.on('connect', function() {
-    //
-    //});
-    setTimeout( function() {
-    console.log('altering client...');
-    c.oldQuery = c.query;
-    c.query = function(sql, callback) {
-      var rows = [];
-      var q = c.oldQuery(sql);
-      q.on('result', function(res) {
-        res.on('row', function(row) { rows.push(row); });
-        res.on('end', function() {
-          callback(null, rows);
-        });
-      });
-    };
-    }, 1000);
-    return c;
-  }
-
-  var driver = require('../index.js');
-  if (process.env.BENCHMARK_MYSQL1)
-    driver = require('mysql');
-
-  return driver.createConnection({
-    host: config.host,
-    user: (args && args.user) || config.user,
-    password: (args && args.password) || config.password,
-    database: (args && args.database) || config.database,
-    multipleStatements: args ? args.multipleStatements : false,
-    port: (args && args.port) || config.port,
-    debug: process.env.DEBUG,
-    supportBigNumbers: args && args.supportBigNumbers,
-    bigNumberStrings: args && args.bigNumberStrings,
-    dateStrings: args && args.dateStrings
-  });
-};
-
-module.exports.createPool = function(callback) {
-  var driver = require('../index.js');
-  if (process.env.BENCHMARK_MYSQL1)
-    driver = require('mysql');
-
-  return driver.createPool(config);
-};
-
-module.exports.createTemplate = function() {
-  var jade = require('jade');
-  var template = require('fs').readFileSync(__dirname + '/template.jade', 'ascii');
-  return jade.compile(template);
-};
-
-module.exports.createServer = function(onListening, handler) {
-  var server = require('../index.js').createServer();
-  server.on('connection', function(conn) {
-    conn.on('error', function() {
-      // we are here when client drops connection
-    });
-    conn.serverHandshake({
-      protocolVersion: 10,
-      serverVersion: 'node.js rocks',
-      connectionId: 1234,
-      statusFlags: 2,
-      characterSet: 8,
-      capabilityFlags: 0xffffff
-    });
-    if (handler)
-      handler(conn);
-  });
-  server.listen(3307, onListening);
-  return server;
-};
-
-module.exports.useTestDb = function(cb) {
-  // no-op in my setup, need it for compatibility with node-mysql tests
-};
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/create-500k-random-ints-doubles-table.sql b/node_modules/mysql2-promise/node_modules/mysql2/test/create-500k-random-ints-doubles-table.sql
deleted file mode 100644
index ee4bcc77ce1ee93aa3cdda6bd80e4a85306ad8d3..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/create-500k-random-ints-doubles-table.sql
+++ /dev/null
@@ -1,32 +0,0 @@
--- from http://sixarm.com/about/mysql-create-random-data-text-strings.html
-
-drop table if exists ints;
-drop procedure if exists randomize_nums;
-
-CREATE TABLE ints (
-    id int(11) NOT NULL AUTO_INCREMENT,
-    val1 int(11),
-    val2 double,
-    PRIMARY KEY (id)
-  );
-
-delimiter $$
-create procedure randomize_nums()
-    begin
-      declare i int Default 0 ;
-      declare random int(20);
-      declare random1 double;
-      myloop: loop
-      set random=floor(rand() * 99999);
-      set random1=rand() * 99999 ;
-      insert into ints VALUES (i+1,random, random1) ;
-      set i=i+1;
-      if i=500000 then
-        leave myloop;
-  end if;
-    end loop myloop;
-  end $$
-delimiter ;
-
-call randomize_nums;
-
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/create-500k-random-rows-table.sql b/node_modules/mysql2-promise/node_modules/mysql2/test/create-500k-random-rows-table.sql
deleted file mode 100644
index 2f6a419cbf9d606a21fc670e2fa4467ef2fbac11..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/create-500k-random-rows-table.sql
+++ /dev/null
@@ -1,29 +0,0 @@
--- from http://sixarm.com/about/mysql-create-random-data-text-strings.html
-
-drop table if exists foos;
-drop procedure if exists randomizer;
-
-CREATE TABLE foos (
-    id int(11) NOT NULL AUTO_INCREMENT,
-    name char(20),
-    PRIMARY KEY (id)
-  );
-
-delimiter $$
-create procedure randomizer()
-    begin
-      declare i int Default 0 ;
-      declare random char(20);
-      myloop: loop
-      set random=conv(floor(rand() * 99999999999999), 20, 36) ;
-      insert into `foos` (`id`, `name`) VALUES (i+1,random) ;
-      set i=i+1;
-      if i=500000 then
-        leave myloop;
-  end if;
-    end loop myloop;
-  end $$
-delimiter ;
-
-call randomizer;
-
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-binary-charset-string.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-binary-charset-string.js
deleted file mode 100644
index fe32707c4b8aed07f60658dad375748d55e451b0..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-binary-charset-string.js
+++ /dev/null
@@ -1,75 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows = undefined;
-var fields = undefined;
-var rows1 = undefined;
-var fields1 = undefined;
-var rows2 = undefined;
-var fields2 = undefined;
-var rows3 = undefined;
-var fields3 = undefined;
-
-var rows4 = undefined;
-var fields4 = undefined;
-var rows5 = undefined;
-var fields5 = undefined;
-
-var query = "SELECT x'010203'";
-var query1 = "SELECT '010203'";
-
-connection.query(query, function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  fields = _fields;
-});
-
-connection.query(query, function(err, _rows, _fields) {
-  if (err) throw err;
-  rows5 = _rows;
-  fields5 = _fields;
-});
-
-connection.query(query1, function(err, _rows, _fields) {
-  if (err) throw err;
-  rows1 = _rows;
-  fields1 = _fields;
-});
-
-connection.execute(query, [], function(err, _rows, _fields) {
-  if (err) throw err;
-  rows2 = _rows;
-  fields2 = _fields;
-});
-
-// repeat same query - test cached fields and parser
-connection.execute(query, [], function(err, _rows, _fields) {
-  if (err) throw err;
-  rows4 = _rows;
-  fields4 = _fields;
-});
-
-connection.execute(query1, [], function(err, _rows, _fields) {
-  if (err) throw err;
-  rows3 = _rows;
-  fields3 = _fields;
-  connection.end();
-});
-
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{"x'010203'": Buffer([1, 2, 3])}]);
-  assert.equal(fields[0].name, "x'010203'");
-  assert.deepEqual(rows1, [{'010203': '010203'}]);
-  assert.equal(fields1[0].name, "010203");
-  assert.deepEqual(rows2, [{"x'010203'": Buffer([1, 2, 3])}]);
-  assert.equal(fields2[0].name, "x'010203'");
-  assert.deepEqual(rows3, [{'010203': '010203'}]);
-  assert.equal(fields3[0].name, "010203");
-
-  assert.deepEqual(rows4, [{"x'010203'": Buffer([1, 2, 3])}]);
-  assert.equal(fields4[0].name, "x'010203'");
-  assert.deepEqual(rows5, [{"x'010203'": Buffer([1, 2, 3])}]);
-  assert.equal(fields5[0].name, "x'010203'");
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-binary-multiple-results.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-binary-multiple-results.js
deleted file mode 100644
index e1efd51457bad894ec0fe2e63258ddc6dc222282..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-binary-multiple-results.js
+++ /dev/null
@@ -1,160 +0,0 @@
-var mysql = require('../../common.js').createConnection({multipleStatements: true});
-var assert = require('assert');
-mysql.query('CREATE TEMPORARY TABLE no_rows (test int)');
-mysql.query('CREATE TEMPORARY TABLE some_rows (test int)');
-mysql.query('INSERT INTO some_rows values(0)');
-mysql.query('INSERT INTO some_rows values(42)');
-mysql.query('INSERT INTO some_rows values(314149)');
-
-var clone = function(obj) { return JSON.parse(JSON.stringify(obj)); };
-
-var rs1 = {
-  affectedRows: 0,
-  fieldCount: 0,
-  insertId: 0,
-  serverStatus: 10,
-  warningStatus: 0
-};
-var rs2 = clone(rs1);
-rs2.serverStatus = 2;
-var rs3 = clone(rs1);
-rs3.serverStatus = 34;
-
-var twoInsertResult = [[rs1, rs2], [undefined, undefined], 2];
-var select1 = [{"1":"1"}];
-var select2 = [{"2":"2"}];
-var fields1 = [{
-  catalog: "def",
-  characterSet: 63,
-  columnLength: 1,
-  columnType: 8,
-  decimals: 0,
-  flags: 129,
-  name: "1",
-  orgName: "",
-  orgTable: "",
-  schema: "",
-  table: ""
-}];
-var nr_fields = [{
-  catalog: "def",
-  characterSet: 63,
-  columnLength: 11,
-  columnType: 3,
-  decimals: 0,
-  flags: 0,
-  name: "test",
-  orgName: "test",
-  orgTable: "no_rows",
-  schema: mysql.config.database,
-  table: "no_rows"
-}];
-
-var sr_fields = clone(nr_fields);
-sr_fields[0].orgTable = "some_rows";
-sr_fields[0].table = "some_rows";
-var select3 = [{"test":0},{"test":42},{"test":314149}];
-
-var fields2 = clone(fields1);
-fields2[0].name = "2";
-
-var tests = [
-  ["select * from some_rows", [[select3,rs3],[sr_fields,undefined],2]], //  select 3 rows
-  ["SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT; SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS", [rs2, undefined, 1]],
-  ["set @a = 1", [rs2, undefined, 1]],
-  ["set @a = 1; set @b = 2", [rs2, undefined, 1]],
-  ["select 1; select 2", [[select1,select2,rs2],[fields1,fields2,undefined], 3]],
-  ["set @a = 1; select 1", [[select1,rs2], [fields1,undefined], 2]],
-  ["select 1; set @a = 1", [[select1, rs2], [fields1, undefined], 2]],
-  ["select * from no_rows", [[[], rs3], [nr_fields, undefined], 2]],    // select 0 rows"
-  ["set @a = 1; select * from no_rows", [[[], rs3], [nr_fields, undefined], 2]], // insert + select 0 rows
-  ["select * from no_rows; set @a = 1", [[[], rs3], [nr_fields, undefined], 2]], //  select 0 rows + insert
-  ["set @a = 1; select * from some_rows", [[select3, rs3],[sr_fields,undefined],2]], // insert + select 3 rows
-  ["select * from some_rows; set @a = 1", [[select3, rs3],[sr_fields,undefined],2]] //  select 3 rows + insert
-];
-
-function procedurise(sql) {
-  return [
-    'DROP PROCEDURE IF EXISTS _as_sp_call;',
-    'CREATE PROCEDURE _as_sp_call()',
-    'BEGIN',
-     sql + ';',
-    'END',
-  ].join('\n');
-}
-
-function do_test(testIndex) {
-  var next = function() {
-    if (testIndex + 1 < tests.length)
-      do_test(testIndex + 1);
-    else {
-      mysql.end();
-    }
-  };
-
-  var entry = tests[testIndex];
-  var sql = entry[0];
-  var origSql = sql;
-  var expectation = entry[1];
-  // prepared statements do not support multiple statements itself, we need to wrap quey in a stored procedure
-  var sp = procedurise(sql);
-  mysql.query(sp, function(err) {
-    if (err)
-        throw(err);
-    sql = "CALL _as_sp_call()"; // this call is allowed with prepared statements, and result contain multiple statements
-    mysql.query(sql, function(err, _rows, _columns, _numResults) {
-      if (err)
-        throw err;
-
-      var arrOrColumn = function (c) {
-        if (Array.isArray(c))
-          return c.map(arrOrColumn);
-
-        if (typeof c == 'undefined')
-          return void(0);
-
-        return c.inspect();
-      };
-
-      assert.deepEqual(expectation[0], _rows);
-      assert.deepEqual(expectation[1], arrOrColumn(_columns));
-      assert.deepEqual(expectation[2], _numResults);
-
-      var q = mysql.execute(sql);
-      var resIndex = 0;
-      var rowIndex = 0;
-      function checkRow(row, index) {
-
-        if (_numResults == 1) {
-          assert.equal(index, 0);
-          if (row.constructor.name == 'ResultSetHeader')
-            assert.deepEqual(_rows, row);
-          else
-            assert.deepEqual(_rows[rowIndex], row);
-        } else {
-          if (resIndex != index) {
-            rowIndex = 0;
-            resIndex = index;
-          }
-          if (row.constructor.name == 'ResultSetHeader')
-            assert.deepEqual(_rows[index], row);
-          else
-            assert.deepEqual(_rows[index][rowIndex], row);
-        }
-        rowIndex++;
-      }
-      function checkFields(fields, index) {
-        if (_numResults == 1) {
-          assert.equal(index, 0);
-          assert.deepEqual(arrOrColumn(_columns), arrOrColumn(fields));
-        }
-        else
-          assert.deepEqual(arrOrColumn(_columns[index]), arrOrColumn(fields));
-      }
-      q.on('result', checkRow);
-      q.on('fields', checkFields);
-      q.on('end', next);
-    });
-  });
-}
-do_test(0);
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-binary-notnull-nulls.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-binary-notnull-nulls.js
deleted file mode 100644
index 9114ae4ba39a6061080533e7cba06af340b3b389..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-binary-notnull-nulls.js
+++ /dev/null
@@ -1,52 +0,0 @@
-var assert = require('assert');
-
-var FieldFlags = require('../../../lib/constants/field_flags.js');
-var common     = require('../../common');
-var conn       = common.createConnection();
-
-// it's possible to receive null values for columns marked with NOT_NULL flag
-// see https://github.com/sidorares/node-mysql2/issues/178 for info
-
-conn.query('CREATE TEMPORARY TABLE `tmp_account` ( ' +
-  ' `id` int(11) NOT NULL AUTO_INCREMENT, ' +
-  ' `username` varchar(64) NOT NULL, ' +
-  ' `auth_code` varchar(30) NOT NULL, ' +
-  ' `access_token` varchar(30) NOT NULL, ' +
-  ' `refresh_token` tinytext NOT NULL, ' +
-  ' PRIMARY KEY (`id`) ' +
-  ' ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8');
-conn.query("INSERT INTO `tmp_account` VALUES ('1', 'xgredx', '', '', '')");
-
-conn.query('CREATE TEMPORARY TABLE `tmp_account_flags` ( ' +
-  ' `account` int(11) NOT NULL, ' +
-  ' `flag` tinyint(3) NOT NULL, ' +
-  ' PRIMARY KEY (`account`,`flag`) ' +
-  ' ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8');
-
-conn.query("INSERT INTO `tmp_account_flags` VALUES ('1', '100')")
-
-conn.query('CREATE TEMPORARY TABLE `tmp_account_session` ( ' +
-  ' `account` int(11) NOT NULL, ' +
-  ' `ip` varchar(15) NOT NULL, ' +
-  ' `session` varchar(114) NOT NULL, ' +
-  ' `time` int(11) NOT NULL, ' +
-  ' PRIMARY KEY (`account`,`ip`) ' +
-  ' ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8');
-
-conn.query("INSERT INTO `tmp_account_session` VALUES ('1', '::1', '75efb145482ce22f4544390cad233c749c1b43e4', '1')")
-
-
-conn.connect(function(err) {
-    if (err) {
-        console.error(err);
-        return;
-    }
-
-    conn.execute("SELECT `ac`.`username`, CONCAT('[', GROUP_CONCAT(DISTINCT `acf`.`flag` SEPARATOR ','), ']') flags FROM tmp_account ac LEFT JOIN tmp_account_flags acf ON `acf`.account = `ac`.id LEFT JOIN tmp_account_session acs ON `acs`.account = `ac`.id WHERE `acs`.`session`=?", ["asid=75efb145482ce22f4544390cad233c749c1b43e4"], function(err, rows, fields) {
-        var flagNotNull = fields[0].flags & FieldFlags.NOT_NULL;
-        var valueIsNull = rows[0][fields[0].name] === null;
-        assert( flagNotNull && valueIsNull );
-        conn.end();
-    });
-
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-buffer-params.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-buffer-params.js
deleted file mode 100644
index b62b8e1349455f3e8f9e08a642da7cf2b49211b6..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-buffer-params.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows = undefined;
-var rows1 = undefined;
-var fields = undefined;
-var fields1 = undefined;
-
-var buf = Buffer([0x80, 0x90, 1, 2, 3, 4, 5, 6, 7, 8, 9, 100, 100, 255, 255]);
-connection.execute('SELECT HEX(?) as buf', [buf], function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  fields = _fields;
-});
-
-connection.query('SELECT HEX(?) as buf', [buf], function(err, _rows, _fields) {
-  if (err) throw err;
-  rows1 = _rows;
-  fields1 = _fields;
-  connection.end();
-});
-
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{buf: buf.toString('hex').toUpperCase()}]);
-  assert.deepEqual(rows1, [{buf: buf.toString('hex').toUpperCase()}]);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-change-user.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-change-user.js
deleted file mode 100644
index f3715aa4de81ccfd19115b9398a456129daf2706..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-change-user.js
+++ /dev/null
@@ -1,57 +0,0 @@
-var assert     = require('assert');
-var common     = require('../../common');
-var connection = common.createConnection();
-
-// create test user first
-connection.query("GRANT ALL ON *.* TO 'changeuser1'@'localhost' IDENTIFIED BY 'changeuser1pass'");
-connection.query("GRANT ALL ON *.* TO 'changeuser2'@'localhost' IDENTIFIED BY 'changeuser2pass'");
-connection.query('FLUSH PRIVILEGES');
-
-connection.changeUser({
-  user: 'changeuser1',
-  password: 'changeuser1pass'
-});
-connection.query('select user()', function(err, rows) {
-  if (err) throw err;
-  assert.deepEqual(rows, [ { 'user()': 'changeuser1@localhost' } ]);
-});
-
-connection.changeUser({
-  user: 'changeuser2',
-  password: 'changeuser2pass'
-});
-
-connection.query('select user()', function(err, rows) {
-  if (err) throw err;
-  assert.deepEqual(rows, [ { 'user()': 'changeuser2@localhost' } ]);
-});
-
-connection.changeUser({
-  user: 'changeuser1',
-  passwordSha1: new Buffer('f961d39c82138dcec42b8d0dcb3e40a14fb7e8cd', 'hex') // sha1(changeuser1pass)
-});
-connection.query('select user()', function(err, rows) {
-  if (err) throw err;
-  assert.deepEqual(rows, [ { 'user()': 'changeuser1@localhost' } ]);
-});
-
-connection.end();
-
-// from felixge/node-mysql/test/unit/connection/test-change-database-fatal-error.js:
-// This test verifies that changeUser errors are treated as fatal errors.  The
-// rationale for that is that a failure to execute a changeUser sequence may
-// cause unexpected behavior for queries that were enqueued under the
-// assumption of changeUser to succeed.
-
-var beforeChange = 1;
-connection.changeUser({database: 'does-not-exist'}, function (err) {
-  assert.ok(err, 'got error');
-  assert.equal(err.code, 'ER_BAD_DB_ERROR');
-  assert.equal(err.fatal, true);
-});
-
-connection.on('error', function(err) {
-  assert.ok(err, 'got disconnect');
-  assert.equal(err.code, 'PROTOCOL_CONNECTION_LOST');
-  assert.equal(beforeChange, 1);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-connect-sha1.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-connect-sha1.js
deleted file mode 100644
index bf7369b0c28af054c0f607f18a61a6acb3b32f05..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-connect-sha1.js
+++ /dev/null
@@ -1,68 +0,0 @@
-var mysql      = require('../../../index.js');
-var auth       = require('../../../lib/auth_41.js');
-var assert     = require('assert');
-
-var server;
-
-function authenticate(params, cb) {
-  var doubleSha = auth.doubleSha1('testpassword');
-  var isValid = auth.verifyToken(params.authPluginData1, params.authPluginData2, params.authToken, doubleSha);
-  assert(isValid);
-  cb(null);
-}
-
-var queryCalls = 0;
-
-var server = mysql.createServer();
-server.listen(3307);
-server.on('connection', function(conn) {
-  conn.serverHandshake({
-    protocolVersion: 10,
-    serverVersion: 'node.js rocks',
-    connectionId: 1234,
-    statusFlags: 2,
-    characterSet: 8,
-    capabilityFlags: 0xffffff,
-    authCallback: authenticate
-  });
-  conn.on('query', function(sql) {
-    assert.equal(sql, 'select 1+1');
-    queryCalls++;
-    conn.close();
-  });
-});
-
-var connection = mysql.createConnection({
-  port: 3307,
-  user: 'testuser',
-  database: 'testdatabase',
-  passwordSha1: Buffer('8bb6118f8fd6935ad0876a3be34a717d32708ffd', 'hex')
-});
-
-connection.on('error', function(err) {
-  assert.equal(err.code, 'PROTOCOL_CONNECTION_LOST');
-});
-
-connection.query('select 1+1', function(err) {
-  assert.equal(err.code, 'PROTOCOL_CONNECTION_LOST');
-  server._server.close();
-});
-
-var _1_2 = false;
-var _1_3 = false;
-
-connection.query('select 1+2', function(err) {
-  assert.equal(err.code, 'PROTOCOL_CONNECTION_LOST');
-  _1_2 = true;
-});
-
-connection.query('select 1+3', function(err) {
-  assert.equal(err.code, 'PROTOCOL_CONNECTION_LOST');
-  _1_3 = true;
-});
-
-process.on('exit', function() {
-  assert.equal(queryCalls, 1);
-  assert.equal(_1_2, true);
-  assert.equal(_1_3, true);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-custom-date-parameter.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-custom-date-parameter.js
deleted file mode 100644
index 00f3cf810578a9fa9f680fa708f48b10e641ccec..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-custom-date-parameter.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows = undefined;
-
-Date = function() {
-  var NativeDate = Date;
-  function CustomDate(str) {
-    return new NativeDate(str);
-  }
-  return CustomDate;
-}();
-
-connection.execute('SELECT UNIX_TIMESTAMP(?) t', [new Date('1990-08-08 UTC')], function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  console.log(_rows, _fields);
-  connection.end();
-});
-
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{t: 650073600}]);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-date-parameter.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-date-parameter.js
deleted file mode 100644
index 9d872097b29b087ebbb9c17f3b585d28acb02275..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-date-parameter.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows = undefined;
-
-connection.execute('SELECT UNIX_TIMESTAMP(?) t', [new Date('1990-01-01 UTC')], function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  console.log(_rows, _fields);
-  connection.end();
-});
-
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{t: 631152000}]);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-datetime.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-datetime.js
deleted file mode 100644
index 1fff096cbd05cae523c71ea3826616117b1e140a..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-datetime.js
+++ /dev/null
@@ -1,72 +0,0 @@
-var common      = require('../../common');
-var connection  = common.createConnection();
-var connection1 = common.createConnection({ dateStrings: true });
-var assert      = require('assert');
-
-var rows, rows1, rows2, rows3, rows4, rows5;
-
-var date = new Date('1990-01-01 08:15:11 UTC');
-var date1 = new Date('2000-03-03 08:15:11 UTC');
-var date2 = '2010-12-10 14:12:09.019473';
-connection.query('CREATE TEMPORARY TABLE t (d1 DATE)');
-connection.query('INSERT INTO t set d1=?', [date]);
-
-connection1.query('CREATE TEMPORARY TABLE t (d1 DATE, d2 TIMESTAMP, d3 DATETIME)');
-connection1.query('INSERT INTO t set d1=?, d2=?, d3=?', [date, date1, date2]);
-
-var dateAsStringExpected = [
-     { d1: '1990-01-01',
-       d2: '2000-03-03 08:15:11',
-       d3: '2010-12-10 14:12:09' } ];
-
-
-connection.execute('select from_unixtime(?) t', [(+date).valueOf()/1000], function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-});
-
-connection.query('select from_unixtime(631152000) t', function(err, _rows, _fields) {
-  if (err) throw err;
-  rows1 = _rows;
-});
-
-connection.query('select * from t', function(err, _rows, _fields) {
-  if (err) throw err;
-  rows2 = _rows;
-});
-
-connection.execute('select * from t', function(err, _rows, _fields) {
-  if (err) throw err;
-  rows3 = _rows;
-  connection.end();
-});
-
-connection1.query('select * from t', function(err, _rows, _fields) {
-  console.log(_rows);
-  if (err) throw err;
-  rows4 = _rows;
-});
-
-connection1.execute('select * from t', function(err, _rows, _fields) {
-  console.log(_rows);
-  if (err) throw err;
-  rows5 = _rows;
-  connection1.end();
-});
-
-process.on('exit', function() {
-  assert.equal(rows[0].t.constructor, Date);
-  assert.equal(rows[0].t.getDate(), date.getDate());
-  assert.equal(rows[0].t.getHours(), date.getHours());
-  assert.equal(rows[0].t.getMinutes(), date.getMinutes());
-  assert.equal(rows[0].t.getSeconds(), date.getSeconds());
-
-  assert.equal(rows1[0].t.constructor, Date);
-  assert.equal(rows1[0].t - new Date('Mon Jan 01 1990 11:00:00 GMT+1100 (EST)'), 0);
-
-  assert.equal(rows2[0].d1.getDate(), date.getDate());
-  assert.equal(rows3[0].d1.getDate(), date.getDate());
-
-  assert.deepEqual(rows4, dateAsStringExpected);
-  assert.deepEqual(rows5, dateAsStringExpected);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-disconnects.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-disconnects.js
deleted file mode 100644
index 05a5ca0d5e3d4c9af2782edda7687116c64c8ccc..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-disconnects.js
+++ /dev/null
@@ -1,47 +0,0 @@
-var common     = require('../../common');
-var assert     = require('assert');
-
-var rows;
-var fields;
-var err;
-var server;
-
-function test() {
-  var connection = common.createConnection({port: 3307});
-  connection.query('SELECT 123', function(err, _rows, _fields) {
-    if (err) throw err;
-
-    rows = _rows;
-    fields = _fields;
-    connection.on('error', function(_err) {
-      err = _err;
-    });
-    server.connections.forEach(function(conn) { conn.stream.end(); } );
-    server._server.close(function() {
-      assert.equal(err.code, 'PROTOCOL_CONNECTION_LOST');
-    });
-  });
-  // TODO: test connection.end() etc where we expect disconnect to happen
-}
-
-function serverHandler(conn) {
-  conn.on('query', function(q) {
-    conn.writeTextResult([ { '1': '1' } ], [ { catalog: 'def',
-     schema: '',
-     table: '',
-     orgTable: '',
-     name: '1',
-     orgName: '',
-     characterSet: 63,
-     columnLength: 1,
-     columnType: 8,
-     flags: 129,
-     decimals: 0 } ]);
-  });
-}
-server = common.createServer(test, serverHandler);
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{1: 1}]);
-  assert.equal(fields[0].name, '1');
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-domains.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-domains.js
deleted file mode 100644
index e199a3f848a5c62bd17aebe84a99000d90b54a1f..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-domains.js
+++ /dev/null
@@ -1,60 +0,0 @@
-var assert = require('assert');
-var domain = require('domain');
-var d1 = domain.create();
-var d2 = domain.create();
-var d3 = domain.create();
-var d4 = domain.create();
-var err1, err2, err3, err4;
-
-d1.run(function() {
-  var common     = require('../../common');
-  var connection = common.createConnection();
-  var assert     = require('assert');
-
-  d2.run(function() {
-    connection.query('SELECT 1', function(err, _rows, _fields) {
-      if (err) throw err;
-      throw new Error('inside domain 2');
-    });
-  });
-
-  d3.run(function() {
-    connection.execute('SELECT 1', function(err, _rows, _fields) {
-      connection.end();
-      if (err) throw err;
-      throw new Error('inside domain 3');
-    });
-  });
-
-  d4.run(function() {
-   connection.ping(function() {
-     throw new Error('inside domain 4');
-   });
-  });
-
-  setTimeout(function() {
-    throw new Error('inside domain 1');
-  }, 100);
-
-  d2.on('error', function(err) {
-    err2 = err;
-  });
-  d3.on('error', function(err) {
-    err3 = err;
-  });
-  d4.on('error', function(err) {
-    err4 = err;
-  });
-
-});
-
-d1.on('error', function(err) {
-  err1 = err;
-});
-
-process.on('exit', function() {
-  assert.equal(''+err1, 'Error: inside domain 1')
-  assert.equal(''+err2, 'Error: inside domain 2')
-  assert.equal(''+err3, 'Error: inside domain 3')
-  assert.equal(''+err4, 'Error: inside domain 4')
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-errors.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-errors.js
deleted file mode 100644
index d33b05d4e292055bcac53d050f7d29dbc8049d1f..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-errors.js
+++ /dev/null
@@ -1,46 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var onExecuteResultError = undefined;
-var onQueryResultError = undefined;
-var onExecuteErrorEvent = undefined;
-var onQueryErrorEvent = undefined;
-var onExecuteErrorEvent1 = undefined;
-var onQueryErrorEvent1 = undefined;
-
-connection.execute('error in execute', [], function(err, _rows, _fields) {
-  assert.equal(err.errno, 1064);
-  assert.equal(err.code, 'ER_PARSE_ERROR');
-  if (err) {
-    onExecuteResultError = true;
-  }
-}).on('error', function() {
-  onExecuteErrorEvent = true;
-});
-connection.query('error in query', [], function(err, _rows, _fields) {
-  assert.equal(err.errno, 1064);
-  assert.equal(err.code, 'ER_PARSE_ERROR');
-  if (err) {
-    onQueryResultError = true;
-  }
-}).on('error', function() {
-  onQueryErrorEvent = true;
-});
-connection.execute('error in execute 1', []).on('error', function() {
-  onExecuteErrorEvent1 = true;
-});
-connection.query('error in query 1').on('error', function() {
-  onQueryErrorEvent1 = true;
-  connection.end();
-});
-
-
-process.on('exit', function() {
-  assert.equal(onExecuteResultError, true);
-  assert.equal(onQueryResultError, true);
-  assert.equal(onExecuteErrorEvent, undefined);
-  assert.equal(onQueryErrorEvent, undefined);
-  assert.equal(onExecuteErrorEvent1, true);
-  assert.equal(onQueryErrorEvent1, true);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-1.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-1.js
deleted file mode 100644
index 3f8f0a5591b60a386af97b04bcf7d5dd0e65250f..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-1.js
+++ /dev/null
@@ -1,54 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows = undefined;
-var rows1 = undefined;
-var fields = undefined;
-
-connection.query([
-  'CREATE TEMPORARY TABLE `announcements` (',
-  '`id` int(11) NOT NULL AUTO_INCREMENT,',
-  '`title` varchar(255) DEFAULT NULL,',
-  '`text` varchar(255) DEFAULT NULL,',
-  'PRIMARY KEY (`id`)',
-  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-].join('\n'), function(err) {
-  if (err) throw err;
-});
-
-connection.execute('SELECT 1+? as test', [123], function(err, _rows, _fields) {
-  if (err) throw err;
-
-  rows = _rows;
-  fields = _fields;
-});
-connection.execute('SELECT 1 as test', function(err, _rows, _fields) {
-  if (err) throw err;
-
-  rows1 = _rows;
-  fields = _fields;
-});
-
-connection.execute('INSERT INTO announcements(title, text) VALUES(?, ?)', ['Есть место, где заканчивается тротуар', 'Расти борода, расти'], function(err) {
-  if (err) throw err;
-});
-connection.execute('INSERT INTO announcements(title, text) VALUES(?, ?)', ['Граждане Российской Федерации имеют право собираться мирно без оружия', 'проводить собрания, митинги и демонстрации, шествия и пикетирование'], function(err) {
-  if (err) throw err;
-});
-connection.execute('SELECT * FROM announcements', function (err, rows) {
-  if (err) throw err;
-  assert.equal(rows.length, 2);
-  assert.equal(rows[0].title, 'Есть место, где заканчивается тротуар');
-  assert.equal(rows[0].text, 'Расти борода, расти');
-  assert.equal(rows[1].title, 'Граждане Российской Федерации имеют право собираться мирно без оружия');
-  assert.equal(rows[1].text, 'проводить собрания, митинги и демонстрации, шествия и пикетирование');
-  connection.end();
-});
-
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{'test': 124}]);
-  assert.deepEqual(rows1, [{'test': 1}]);
-  assert.equal(fields[0].name, 'test');
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-and-unprepare.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-and-unprepare.js
deleted file mode 100644
index c5c928c88516650a750eef1530944c7d32e56b6b..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-and-unprepare.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var max = 500;
-var start = process.hrtime();
-function exec(i) {
-  var query = 'select 1+' + i;
-  connection.execute(query, function(err, rows, columns) {
-    connection.unprepare(query);
-    if (err) throw err;
-    if (i > max)
-      connection.end();
-    else
-      exec(i+1);
-  });
-}
-connection.query('SET GLOBAL max_prepared_stmt_count=10', function(err) {
-  if (err) throw err;
-  exec(1);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-cached.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-cached.js
deleted file mode 100644
index ee1b2c72d2448d8477c8e798f252224c9b19286d..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-cached.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows = undefined;
-var rows1 = undefined;
-var rows3 = undefined;
-
-var q = 'select 1 + ? as test';
-var key = 'undefined/undefined/undefined' + q;
-
-connection.execute(q, [123], function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  connection.execute(q, [124], function(err, _rows, _fields) {
-    if (err) throw err;
-    rows1 = _rows;
-    connection.execute(q, [125], function(err, _rows, _fields) {
-      if (err) throw err;
-      rows2 = _rows;
-      assert(Object.keys(connection._statements).length == 1);
-      assert(connection._statements[key].query == q);
-      assert(connection._statements[key].parameters.length == 1);
-      connection.end();
-    });
-  });
-});
-
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{'test': 124}]);
-  assert.deepEqual(rows1, [{'test': 125}]);
-  assert.deepEqual(rows2, [{'test': 126}]);
-});
-
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-newdecimal.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-newdecimal.js
deleted file mode 100644
index c0bebcb4dc947fa46e29da1ecf1381647f48ed21..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-newdecimal.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-connection.query('CREATE TEMPORARY TABLE t (f DECIMAL(19,4))');
-connection.query('INSERT INTO t VALUES(12345.67)');
-
-var rows, fields;
-connection.execute('SELECT f FROM t', function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  fields = _fields;
-  connection.end();
-});
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{'f': '12345.6700'}]);
-  assert.equal(fields[0].name, 'f');
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-nocolumndef.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-nocolumndef.js
deleted file mode 100644
index 7eb769c4ff19a51c55860094b25c53823eafd761..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-nocolumndef.js
+++ /dev/null
@@ -1,149 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-// https://github.com/sidorares/node-mysql2/issues/130
-// https://github.com/sidorares/node-mysql2/issues/37
-// binary protocol examples where `prepare` returns no column definitions but execute() does return fields/rows
-
-var rows;
-var fields;
-
-connection.execute('explain SELECT 1', function(err, _rows, _fields) {
-  if (err) throw err;
-
-  rows = _rows
-  fields = _fields;
-  connection.end();
-});
-
-var expectedRows;
-var expectedFields;
-
-process.on('exit', function() {
-  assert.deepEqual(rows, expectedRows);
-  var fi = fields.map(function(c) { return c.inspect() });
-  assert.deepEqual(fi, expectedFields);
-});
-
-expectedFields = [{ catalog: 'def',
-    schema: '',
-    table: '',
-    orgTable: '',
-    name: 'id',
-    orgName: '',
-    characterSet: 63,
-    columnLength: 3,
-    columnType: 8,
-    flags: 161,
-    decimals: 0 },
-  { catalog: 'def',
-    schema: '',
-    table: '',
-    orgTable: '',
-    name: 'select_type',
-    orgName: '',
-    characterSet: 33,
-    columnLength: 57,
-    columnType: 253,
-    flags: 1,
-    decimals: 31 },
-  { catalog: 'def',
-    schema: '',
-    table: '',
-    orgTable: '',
-    name: 'table',
-    orgName: '',
-    characterSet: 33,
-    columnLength: 192,
-    columnType: 253,
-    flags: 0,
-    decimals: 31 },
-  { catalog: 'def',
-    schema: '',
-    table: '',
-    orgTable: '',
-    name: 'type',
-    orgName: '',
-    characterSet: 33,
-    columnLength: 30,
-    columnType: 253,
-    flags: 0,
-    decimals: 31 },
-  { catalog: 'def',
-    schema: '',
-    table: '',
-    orgTable: '',
-    name: 'possible_keys',
-    orgName: '',
-    characterSet: 33,
-    columnLength: 12288,
-    columnType: 253,
-    flags: 0,
-    decimals: 31 },
-  { catalog: 'def',
-    schema: '',
-    table: '',
-    orgTable: '',
-    name: 'key',
-    orgName: '',
-    characterSet: 33,
-    columnLength: 192,
-    columnType: 253,
-    flags: 0,
-    decimals: 31 },
-  { catalog: 'def',
-    schema: '',
-    table: '',
-    orgTable: '',
-    name: 'key_len',
-    orgName: '',
-    characterSet: 33,
-    columnLength: 12288,
-    columnType: 253,
-    flags: 0,
-    decimals: 31 },
-  { catalog: 'def',
-    schema: '',
-    table: '',
-    orgTable: '',
-    name: 'ref',
-    orgName: '',
-    characterSet: 33,
-    columnLength: 3072,
-    columnType: 253,
-    flags: 0,
-    decimals: 31 },
-  { catalog: 'def',
-    schema: '',
-    table: '',
-    orgTable: '',
-    name: 'rows',
-    orgName: '',
-    characterSet: 63,
-    columnLength: 10,
-    columnType: 8,
-    flags: 160,
-    decimals: 0 },
-  { catalog: 'def',
-    schema: '',
-    table: '',
-    orgTable: '',
-    name: 'Extra',
-    orgName: '',
-    characterSet: 33,
-    columnLength: 765,
-    columnType: 253,
-    flags: 1,
-    decimals: 31 }];
-
-expectedRows = [ {id: 1,
-    select_type: 'SIMPLE',
-    table: null,
-    type: null,
-    possible_keys: null,
-    key: null,
-    key_len: null,
-    ref: null,
-    rows: null,
-    Extra: 'No tables used' }];
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-null-bitmap.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-null-bitmap.js
deleted file mode 100644
index c6a5959b064b927cd9553fcbf814651dcade1ffb..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-null-bitmap.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var params = [1, 2];
-var query = 'select ? + ?';
-
-function dotest() {
-  connection.execute(query + ' as t', params, function(err, _rows, _fields) {
-    assert.equal(err, null);
-    if (params.length < 50) {
-      assert.equal(_rows[0].t, params.reduce(function(x,y) {return x+y;}));
-      query += ' + ?';
-      params.push(params.length);
-      dotest();
-    } else {
-      connection.end();
-    }
-  });
-}
-
-connection.query('SET GLOBAL max_prepared_stmt_count=300', dotest);
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-signed.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-signed.js
deleted file mode 100644
index f70d82bb208421fc20bcc1e354acd5e38bbe2bcd..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-signed.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows = undefined;
-var fields = undefined;
-
-connection.query([
-  'CREATE TEMPORARY TABLE `test_table` (',
-  '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
-  '`num` int(15),',
-  '`l` long,',
-  'PRIMARY KEY (`id`)',
-  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-].join('\n'));
-
-connection.query('insert into test_table(num,l) values(?, 3)', [1]);
-connection.query('insert into test_table(num,l) values(3-?, -10)', [5]);
-connection.query('insert into test_table(num,l) values(4+?, 4000000-?)', [-5, 8000000]);
-
-connection.execute('SELECT * from test_table', [], function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  fields = _fields;
-  connection.end();
-});
-
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{"id":1,"num":1,"l": 3},{"id":2,"num":-2,"l":-10},{"id":3,"num":-1,"l":-4000000}]);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-type-casting.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-type-casting.js
deleted file mode 100644
index 107c1ddaa7a01994168f8fe3e30cd6177f76cc63..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-execute-type-casting.js
+++ /dev/null
@@ -1,71 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-common.useTestDb(connection);
-
-var tests = require('./type-casting-tests')(connection);
-
-var table = 'type_casting';
-
-var schema  = [];
-var inserts = [];
-
-tests.forEach(function(test, index) {
-  var escaped = test.insertRaw || connection.escape(test.insert);
-
-  test.columnName = test.type + '_' + index;
-
-  schema.push('`' + test.columnName + '` ' + test.type + ',');
-  inserts.push('`' + test.columnName + '` = ' + escaped);
-});
-
-var createTable = [
-  'CREATE TEMPORARY TABLE `' + table + '` (',
-  '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,'
-  ].concat(schema).concat([
-  'PRIMARY KEY (`id`)',
-  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-]).join('\n');
-
-connection.query(createTable);
-
-connection.query('INSERT INTO ' + table + ' SET' + inserts.join(',\n'));
-
-var row;
-connection.execute('SELECT * FROM ' + table + ' WHERE id = ?;', [1], function(err, rows) {
-  if (err) throw err;
-
-  row = rows[0];
-  connection.end();
-});
-
-process.on('exit', function() {
-  tests.forEach(function(test) {
-    var expected = test.expect || test.insert;
-    var got      = row[test.columnName];
-    var message;
-
-    if (expected instanceof Date) {
-      assert.equal(got instanceof Date, true, test.type);
-
-      expected = String(expected);
-      got      = String(got);
-    } else if (Buffer.isBuffer(expected)) {
-      assert.equal(Buffer.isBuffer(got), true, test.type);
-
-      expected = String(Array.prototype.slice.call(expected));
-      got      = String(Array.prototype.slice.call(got));
-    }
-
-    if (test.deep) {
-      message = 'got: "' + JSON.stringify(got) + '" expected: "' + JSON.stringify(expected) +
-                '" test: ' + test.type + '';
-      assert.deepEqual(expected, got, message);
-    } else {
-      message = 'got: "' + got + '" (' + (typeof got) + ') expected: "' + expected +
-                '" (' + (typeof expected) + ') test: ' + test.type + '';
-      assert.strictEqual(expected, got, message);
-    }
-  });
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-insert-bigint-big-number-strings.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-insert-bigint-big-number-strings.js
deleted file mode 100644
index 82eccaea7c32f3e588a6002c729e8554bf0c3575..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-insert-bigint-big-number-strings.js
+++ /dev/null
@@ -1,42 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection({ supportBigNumbers: true, bigNumberStrings: true });
-var assert     = require('assert');
-
-connection.query([
-  'CREATE TEMPORARY TABLE `bigs` (',
-  '`id` bigint NOT NULL AUTO_INCREMENT,',
-  '`title` varchar(255),',
-  'PRIMARY KEY (`id`)',
-  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-].join('\n'));
-
-connection.query("INSERT INTO bigs SET title='test', id=123");
-connection.query("INSERT INTO bigs SET title='test1'", function(err, result) {
-  if (err) throw err;
-  assert.strictEqual(result.insertId, 124);
-  // > 24 bits
-  connection.query("INSERT INTO bigs SET title='test', id=123456789");
-  connection.query("INSERT INTO bigs SET title='test2'", function(err, result) {
-    assert.strictEqual(result.insertId, 123456790);
-    // big int
-    connection.query("INSERT INTO bigs SET title='test', id=9007199254740992");
-    connection.query("INSERT INTO bigs SET title='test3'", function(err, result) {
-      assert.strictEqual(result.insertId, "9007199254740993");
-      connection.query("INSERT INTO bigs SET title='test', id=90071992547409924");
-      connection.query("INSERT INTO bigs SET title='test4'", function(err, result) {
-        assert.strictEqual(result.insertId, "90071992547409925");
-        connection.query("select * from bigs", function(err, result) {
-          assert.strictEqual(result[0].id, "123");
-          assert.strictEqual(result[1].id, "124");
-          assert.strictEqual(result[2].id, "123456789");
-          assert.strictEqual(result[3].id, "123456790");
-          assert.strictEqual(result[4].id, "9007199254740992");
-          assert.strictEqual(result[5].id, "9007199254740993");
-          assert.strictEqual(result[6].id, "90071992547409924");
-          assert.strictEqual(result[7].id, "90071992547409925");
-          connection.end();
-        });
-      });
-    });
-  });
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-insert-bigint.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-insert-bigint.js
deleted file mode 100644
index d0175800b1a0996a2a3d6ef852c2e949a30ccad8..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-insert-bigint.js
+++ /dev/null
@@ -1,45 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-var bn         = require('bn.js');
-
-var table = 'insert_test';
-connection.query([
-  'CREATE TEMPORARY TABLE `bigs` (',
-  '`id` bigint NOT NULL AUTO_INCREMENT,',
-  '`title` varchar(255),',
-  'PRIMARY KEY (`id`)',
-  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-].join('\n'));
-
-var result, result2;
-connection.query("INSERT INTO bigs SET title='test', id=123");
-connection.query("INSERT INTO bigs SET title='test1'", function(err, result) {
-  if (err) throw err;
-  assert.strictEqual(result.insertId, 124);
-  // > 24 bits
-  connection.query("INSERT INTO bigs SET title='test', id=123456789");
-  connection.query("INSERT INTO bigs SET title='test2'", function(err, result) {
-    assert.strictEqual(result.insertId, 123456790);
-    // big int
-    connection.query("INSERT INTO bigs SET title='test', id=9007199254740992");
-    connection.query("INSERT INTO bigs SET title='test3'", function(err, result) {
-      assert.strictEqual((new bn("9007199254740993")).cmp(result.insertId), 0);
-      connection.query("INSERT INTO bigs SET title='test', id=90071992547409924");
-      connection.query("INSERT INTO bigs SET title='test4'", function(err, result) {
-        assert.strictEqual((new bn("90071992547409925")).cmp(result.insertId), 0);
-        connection.query("select * from bigs", function(err, result) {
-          assert.strictEqual(result[0].id, 123);
-          assert.strictEqual(result[1].id, 124);
-          assert.strictEqual(result[2].id, 123456789);
-          assert.strictEqual(result[3].id, 123456790);
-          assert.strictEqual(result[4].id, 9007199254740992);
-          assert.strictEqual(result[5].id, "9007199254740993");
-          assert.strictEqual(result[6].id, "90071992547409924");
-          assert.strictEqual(result[7].id, "90071992547409925");
-          connection.end();
-        });
-      });
-    });
-  });
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-insert-results.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-insert-results.js
deleted file mode 100644
index 4fa7fe21a76ec883a650ced0b3537ad62c97a413..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-insert-results.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-//common.useTestDb(connection);
-
-var table = 'insert_test';
-//var text = "本日は晴天なり";
-var text = " test test test ";
-connection.query([
-  'CREATE TEMPORARY TABLE `' + table + '` (',
-  '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
-  '`title` varchar(255),',
-  'PRIMARY KEY (`id`)',
-  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-].join('\n'));
-
-var result, result2;
-connection.query('INSERT INTO ' + table + ' SET title="' + text + '"', function(err, _result) {
-  if (err) throw err;
-  result = _result;
-  connection.query('SELECT * FROM ' + table + ' WHERE id = ' + result.insertId, function(err, _result2) {
-    result2 = _result2;
-    connection.end();
-  });
-});
-
-process.on('exit', function() {
-  assert.strictEqual(result.insertId, 1);
-  assert.strictEqual(result2.length, 1);
-  // TODO: type conversions
-  assert.equal(result2[0].id, String(result.insertId));
-  assert.equal(result2[0].title, text);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-invalid-date-result.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-invalid-date-result.js
deleted file mode 100644
index e22630aa9c309a10fed72e614bfa6687720fa192..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-invalid-date-result.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows = undefined;
-
-connection.execute('SELECT TIMESTAMP(0000-00-00) t', [], function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  connection.end();
-});
-
-function isInvalidTime(t) {
-  return isNaN(t.getTime());
-}
-
-process.on('exit', function() {
-  assert.deepEqual(Object.prototype.toString.call(rows[0].t), "[object Date]");
-  assert.deepEqual(isInvalidTime(rows[0].t), true);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-load-infile.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-load-infile.js
deleted file mode 100644
index e33c04d84a52cacefbcd3c19a595695d19910b5f..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-load-infile.js
+++ /dev/null
@@ -1,73 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var table = 'load_data_test';
-connection.query([
-  'CREATE TEMPORARY TABLE `' + table + '` (',
-  '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
-  '`title` varchar(255),',
-  'PRIMARY KEY (`id`)',
-  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-].join('\n'));
-
-var path = './test/fixtures/data.csv';
-var sql =
-  'LOAD DATA LOCAL INFILE ? INTO TABLE ' + table + ' ' +
-  'FIELDS TERMINATED BY ? (id, title)';
-
-var ok;
-connection.query(sql, [path, ','], function(err, _ok) {
-  if (err) throw err;
-  ok = _ok;
-});
-
-var rows;
-connection.query('SELECT * FROM ' + table, function(err, _rows) {
-  if (err) throw err;
-  rows = _rows;
-});
-
-// Try to load a file that does not exist to see if we handle this properly
-var loadErr;
-var loadResult;
-var badPath = '/does_not_exist.csv';
-
-connection.query(sql, [badPath, ','], function(err, result) {
-  loadErr    = err;
-  loadResult = result;
-});
-
-// test path mapping
-var Stream = require('readable-stream').PassThrough;
-var myStream = new Stream();
-
-var createMyStream = function(path) { return myStream; };
-var streamResult;
-connection.query({
-    sql: sql,
-    values: [badPath, ','],
-    infileStreamFactory: createMyStream
-  }, function(err, result) {
-    if (err) throw err;
-    streamResult = result;
-  }
-);
-myStream.write('11,Hello World\n');
-myStream.write('21,One ');
-myStream.write('more row\n');
-myStream.end();
-
-connection.end();
-
-process.on('exit', function() {
-  assert.equal(ok.affectedRows, 4);
-  assert.equal(rows.length, 4);
-  assert.equal(rows[0].id, 1);
-  assert.equal(rows[0].title, 'Hello World');
-
-  assert.equal(loadErr.code, 'ENOENT');
-  assert.equal(loadResult.affectedRows, 0);
-
-  assert.equal(streamResult.affectedRows, 2);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-multiple-results.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-multiple-results.js
deleted file mode 100644
index 491f349cc54cdd8a56c433e39d8e72a0386f841f..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-multiple-results.js
+++ /dev/null
@@ -1,153 +0,0 @@
-var mysql = require('../../common.js').createConnection({multipleStatements: true});
-var assert = require('assert');
-mysql.query('CREATE TEMPORARY TABLE no_rows (test int)');
-mysql.query('CREATE TEMPORARY TABLE some_rows (test int)');
-mysql.query('INSERT INTO some_rows values(0)');
-mysql.query('INSERT INTO some_rows values(42)');
-mysql.query('INSERT INTO some_rows values(314149)');
-
-var clone = function(obj) { return JSON.parse(JSON.stringify(obj)); };
-
-var rs1 = {
-  affectedRows: 0,
-  fieldCount: 0,
-  insertId: 0,
-  serverStatus: 10,
-  warningStatus: 0
-};
-var rs2 = clone(rs1);
-rs2.serverStatus = 2;
-
-var twoInsertResult = [[rs1, rs2], [undefined, undefined], 2];
-var select1 = [{"1":"1"}];
-var select2 = [{"2":"2"}];
-var fields1 = [{
-  catalog: "def",
-  characterSet: 63,
-  columnLength: 1,
-  columnType: 8,
-  decimals: 0,
-  flags: 129,
-  name: "1",
-  orgName: "",
-  orgTable: "",
-  schema: "",
-  table: ""
-}];
-var nr_fields = [{
-  catalog: "def",
-  characterSet: 63,
-  columnLength: 11,
-  columnType: 3,
-  decimals: 0,
-  flags: 0,
-  name: "test",
-  orgName: "test",
-  orgTable: "no_rows",
-  schema: mysql.config.database,
-  table: "no_rows"
-}];
-var sr_fields = clone(nr_fields);
-sr_fields[0].orgTable = "some_rows";
-sr_fields[0].table = "some_rows";
-var select3 = [{"test":0},{"test":42},{"test":314149}];
-
-var fields2 = clone(fields1);
-fields2[0].name = "2";
-
-var tests = [
-  ["select * from some_rows", [select3,sr_fields,1]], //  select 3 rows
-  ["SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT; SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;", twoInsertResult],
-  ["/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;", twoInsertResult], // issue #26
-  ["set @a = 1", [rs2, undefined, 1]],  // one insert result
-  ["set @a = 1; set @b = 2", twoInsertResult],
-  ["select 1; select 2", [[select1,select2],[fields1,fields2], 2]],
-  ["set @a = 1; select 1", [[rs1, select1], [undefined, fields1], 2]],
-  ["select 1; set @a = 1", [[select1, rs2], [fields1, undefined], 2]],
-  ["select * from no_rows", [[], nr_fields, 1]],    // select 0 rows"
-  ["set @a = 1; select * from no_rows", [[rs1, []], [undefined, nr_fields], 2]], // insert + select 0 rows
-  ["select * from no_rows; set @a = 1", [[[], rs2], [nr_fields, undefined], 2]], //  select 0 rows + insert
-  ["set @a = 1; select * from some_rows", [[rs1, select3],[undefined,sr_fields],2]], // insert + select 3 rows
-  ["select * from some_rows; set @a = 1", [[select3,rs2],[sr_fields,undefined],2]] //  select 3 rows + insert
-];
-
-// TODO: tests with error in the query with different index
-// TODO: multiple results from single query
-
-function do_test(testIndex) {
-  var entry = tests[testIndex];
-  var sql = entry[0];
-  var expectation = entry[1];
-  mysql.query(sql, function(err, _rows, _columns) {
-    var _numResults = 0;
-    if (_rows.constructor.name == 'ResultSetHeader')
-      _numResults = 1;
-    else if (_rows.length === 0) {
-      // empty select
-      _numResults = 1;
-    }
-    else if (_rows.length > 0) {
-      if (_rows.constructor.name == 'Array' && _rows[0].constructor.name == 'TextRow')
-        _numResults = 1;
-      if (_rows.constructor.name == 'Array' &&
-        (_rows[0].constructor.name == 'Array' || _rows[0].constructor.name =='ResultSetHeader'))
-        _numResults = _rows.length
-    }
-    if (err) {
-      console.log(err);
-      process.exit(-1);
-    }
-    var arrOrColumn = function (c) {
-      if (Array.isArray(c))
-        return c.map(arrOrColumn);
-
-      if (typeof c == 'undefined')
-        return void(0);
-
-      return c.inspect();
-    };
-    assert.deepEqual(expectation, [_rows, arrOrColumn(_columns), _numResults]);
-
-    var q = mysql.query(sql);
-    var resIndex = 0;
-    var rowIndex = 0;
-    function checkRow(row, index) {
-      if (_numResults == 1) {
-        assert.equal(index, 0);
-        if (row.constructor.name == 'ResultSetHeader')
-          assert.deepEqual(_rows, row);
-        else
-          assert.deepEqual(_rows[rowIndex], row);
-      } else {
-        if (resIndex != index) {
-          rowIndex = 0;
-          resIndex = index;
-        }
-        if (row.constructor.name == 'ResultSetHeader')
-          assert.deepEqual(_rows[index], row);
-        else
-          assert.deepEqual(_rows[index][rowIndex], row);
-      }
-      rowIndex++;
-    }
-    function checkFields(fields, index) {
-      if (_numResults == 1) {
-       assert.equal(index, 0);
-       debugger
-       assert.deepEqual(arrOrColumn(_columns), arrOrColumn(fields));
-      }
-      else
-        assert.deepEqual(arrOrColumn(_columns[index]), arrOrColumn(fields));
-    }
-    q.on('result', checkRow);
-    q.on('fields', checkFields);
-    q.on('end', function() {
-      if (testIndex + 1 < tests.length)
-        do_test(testIndex + 1);
-      else {
-        mysql.end();
-      }
-    });
-  });
-}
-do_test(0);
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-named-paceholders.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-named-paceholders.js
deleted file mode 100644
index 492f8a7702693179b07b51f4e7ac2574b587a659..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-named-paceholders.js
+++ /dev/null
@@ -1,48 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-
-connection.query([
-  'CREATE TEMPORARY TABLE `test_table` (',
-  '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
-  '`num1` int(15),',
-  '`num2` int(15),',
-  'PRIMARY KEY (`id`)',
-  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-].join('\n'));
-
-connection.query('insert into test_table(num1,num2) values(?, 3)', [1]);
-connection.query('insert into test_table(num1,num2) values(3-?, -10)', [5]);
-connection.query('insert into test_table(num1,num2) values(4+?, 4000000-?)', [-5, 8000000]);
-connection.query('insert into test_table(num1,num2) values(?, ?)', [-5, 8000000]);
-
-connection.config.namedPlaceholders = true;
-var cmd = connection.execute('SELECT * from test_table where num1 < :numParam and num2 > :lParam', {lParam: 100, numParam: 2}, function(err, rows, fields) {
-  if (err) throw err;
-  assert.deepEqual(rows, [ { id: 4, num1: -5, num2: 8000000 } ]);
-});
-assert.equal(cmd.sql, 'SELECT * from test_table where num1 < ? and num2 > ?');
-assert.deepEqual(cmd.values, [2, 100]);
-
-connection.execute('SELECT :a + :a as sum', {a: 2}, function(err, rows, fields) {
-  if (err) throw err;
-  assert.deepEqual(rows, [{"sum":4}]);
-});
-
-var qCmd = connection.query('SELECT * from test_table where num1 < :numParam and num2 > :lParam', {lParam: 100, numParam: 2}, function(err, rows, fields) {
-  if (err) throw err;
-  assert.deepEqual(rows, [ { id: 4, num1: -5, num2: 8000000 } ]);
-});
-assert.equal(qCmd.sql, 'SELECT * from test_table where num1 < 2 and num2 > 100');
-assert.equal(typeof qCmd.values, 'undefined');
-
-connection.query('SELECT :a + :a as sum', {a: 2}, function(err, rows, fields) {
-  if (err) throw err;
-  assert.deepEqual(rows, [{"sum":4}]);
-});
-
-var sql = connection.format('SELECT * from test_table where num1 < :numParam and num2 > :lParam', {lParam: 100, numParam: 2});
-assert.equal(sql, 'SELECT * from test_table where num1 < 2 and num2 > 100');
-
-connection.end();
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-nested-tables-query.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-nested-tables-query.js
deleted file mode 100644
index b7e88f4e3d984e044104879dbac1bfc9a93cdd3e..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-nested-tables-query.js
+++ /dev/null
@@ -1,84 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-common.useTestDb(connection);
-
-var table = 'nested_test';
-connection.query([
-  'CREATE TEMPORARY TABLE `' + table + '` (',
-  '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
-  '`title` varchar(255),',
-  'PRIMARY KEY (`id`)',
-  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-].join('\n'));
-
-connection.query('INSERT INTO ' + table + ' SET ?', {title: 'test'});
-
-var options1 = {
-  nestTables: true,
-  sql: 'SELECT * FROM ' + table
-};
-var options2 = {
-  nestTables: '_',
-  sql: 'SELECT * FROM ' + table
-};
-var options3 = {
-  rowsAsArray: true,
-  sql: 'SELECT * FROM ' + table
-};
-var rows1, rows2, rows3, rows1e, rows2e, rows3e;
-
-connection.query(options1, function(err, _rows) {
-  if (err) throw err;
-
-  rows1 = _rows;
-});
-
-connection.query(options2, function(err, _rows) {
-  if (err) throw err;
-
-  rows2 = _rows;
-});
-
-connection.query(options3, function(err, _rows) {
-  if (err) throw err;
-
-  rows3 = _rows;
-});
-
-connection.execute(options1, function(err, _rows) {
-  if (err) throw err;
-
-  rows1e = _rows;
-});
-
-connection.execute(options2, function(err, _rows) {
-  if (err) throw err;
-
-  rows2e = _rows;
-});
-
-connection.execute(options3, function(err, _rows) {
-  if (err) throw err;
-
-  rows3e = _rows;
-  connection.end();
-});
-
-process.on('exit', function() {
-  assert.equal(rows1.length, 1);
-  assert.equal(rows1[0].nested_test.id, 1);
-  assert.equal(rows1[0].nested_test.title, 'test');
-  assert.equal(rows2.length, 1);
-  assert.equal(rows2[0].nested_test_id, 1);
-  assert.equal(rows2[0].nested_test_title, 'test');
-
-  assert.equal(Array.isArray(rows3[0]), true);
-  assert.equal(rows3[0][0], 1);
-  assert.equal(rows3[0][1], 'test');
-
-  assert.deepEqual(rows1, rows1e);
-  assert.deepEqual(rows2, rows2e);
-  assert.deepEqual(rows3, rows3e);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-null-double.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-null-double.js
deleted file mode 100644
index c1df45f36fa648371b1265ec39edba13c6c44ec3..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-null-double.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows;
-
-connection.query('CREATE TEMPORARY TABLE t (i int)');
-connection.query('INSERT INTO t VALUES(null)');
-connection.query('INSERT INTO t VALUES(123)');
-
-connection.query('SELECT * from t', function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  connection.end();
-});
-
-
-process.on('exit', function() {
-  assert.deepEqual(rows[0], {i: null});
-  assert.deepEqual(rows[1], {i: 123});
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-null-int.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-null-int.js
deleted file mode 100644
index da6c2e6395c5c893588f0e8ae3a267a53f66df19..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-null-int.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows;
-
-connection.query('CREATE TEMPORARY TABLE t (i int)');
-connection.query('INSERT INTO t VALUES(null)');
-connection.query('INSERT INTO t VALUES(123)');
-
-connection.query('SELECT * from t', function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  connection.end();
-});
-
-process.on('exit', function() {
-  assert.deepEqual(rows[0], {i: null});
-  assert.deepEqual(rows[1], {i: 123});
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-null.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-null.js
deleted file mode 100644
index 302a0313f3cfc3bc93faf6ed49be87bb4f0de10b..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-null.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows, rows1;
-var fields, fields1;
-
-connection.query('CREATE TEMPORARY TABLE t (i int)');
-connection.query('INSERT INTO t VALUES(null)');
-connection.query('SELECT cast(NULL AS CHAR)', function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  fields = _fields;
-});
-connection.query('SELECT * from t', function(err, _rows, _fields) {
-  if (err) throw err;
-  rows1 = _rows;
-  fields1 = _fields;
-  connection.end();
-});
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{'cast(NULL AS CHAR)': null}]);
-  assert.equal(fields[0].columnType, 253);
-  assert.deepEqual(rows1, [{'i': null}]);
-  assert.equal(fields1[0].columnType, 3);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-prepare-and-close.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-prepare-and-close.js
deleted file mode 100644
index d1ded761afa81a023f0acc338a4fc7b876f6736b..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-prepare-and-close.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var max = 500;
-var start = process.hrtime();
-function prepare(i) {
-  connection.prepare('select 1+' + i, function(err, stmt) {
-    stmt.close();
-    if (!err) {
-      if (i > max) {
-        var end = process.hrtime(start);
-        var ns = end[0]*1e9+end[1];
-        console.log(max*1e9/ns + ' prepares/sec');
-        return connection.end();
-      }
-      setTimeout(function() {prepare(i+1)}, 2);
-      return;
-    }
-    assert(0, 'Error in prepare!');
-  });
-}
-connection.query('SET GLOBAL max_prepared_stmt_count=10', function(err) {
-  if (err) throw err;
-  prepare(1);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-prepare-simple.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-prepare-simple.js
deleted file mode 100644
index c004a4a0287eec49da8506be3e2f2b6292ff5a11..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-prepare-simple.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var _stmt1, _stmt2, _stmt3;
-var query1 = 'select 1 + ? + ? as test';
-var query2 = 'select 1 + 1';  // no parameters
-var query3 = 'create temporary table aaa(i int);' // no parameters, no result columns
-
-connection.prepare(query1, function(err1, stmt1) {
-  _stmt1 = stmt1;
-  _stmt1.close();
-  connection.prepare(query2, function(err2, stmt2) {
-    _stmt2 = stmt2;
-    connection.prepare(query3, function(err3, stmt3) {
-      _stmt3 = stmt3;
-      _stmt2.close();
-      _stmt3.close()
-      connection.end();
-    });
-  });
-});
-
-process.on('exit', function() {
-  assert.equal(_stmt1.query, query1);
-  assert(_stmt1.id >= 0);
-  assert.equal(_stmt1.columns.length, 1);
-  assert.equal(_stmt1.parameters.length, 2);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-prepare-then-execute.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-prepare-then-execute.js
deleted file mode 100644
index e6ed9b07425d0949ea0d8627f004392716f5f266..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-prepare-then-execute.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var _stmt    = null;
-var _columns = null;
-var _rows    = null;
-
-connection.prepare('select 1 + ? + ? as test', function(err, stmt) {
-  if (err) throw err;
-  _stmt = stmt;
-  stmt.execute([111, 123], function(err, rows, columns) {
-    if (err) throw err;
-    _columns = columns;
-    _rows = rows;
-    connection.end();
-  });
-});
-
-
-process.on('exit', function() {
-  assert.equal(_stmt.columns.length, 1);
-  assert.equal(_stmt.parameters.length, 2);
-  assert.deepEqual(_rows, [ { test: 235 } ]);
-  assert.equal(_columns[0].name, 'test');
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-protocol-errors.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-protocol-errors.js
deleted file mode 100644
index 3ebcd97d5971cf9315ef18b321a7a2105640c8b8..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-protocol-errors.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var assert     = require('assert');
-var common     = require('../../common');
-var server       = common.createServer(serverReady, function(conn) {
-  conn.on('query', function(q) {
-    conn.writeTextResult([ { '1': '1' } ], [ { catalog: 'def',
-     schema: '',
-     table: '',
-     orgTable: '',
-     name: '1',
-     orgName: '',
-     characterSet: 63,
-     columnLength: 1,
-     columnType: 8,
-     flags: 129,
-     decimals: 0 } ]);
-    // this is extra (incorrect) packet - client should emit error on receiving it
-    conn.writeOk();
-  });
-});
-
-var fields, error;
-var query = 'SELECT 1';
-function serverReady() {
-  var connection = common.createConnection({ port: 3307 });
-  connection.query(query, function(err, _rows, _fields) {
-    if (err) throw err;
-    rows = _rows;
-    fields = _fields;
-  });
-
-  connection.on('error', function(err) {
-    error = err;
-    server.close();
-  });
-}
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{1: 1}]);
-  assert.equal(fields[0].name, '1');
-  assert.equal(error.message, 'Unexpected packet while no commands in the queue');
-  assert.equal(error.fatal, true);
-  assert.equal(error.code, 'PROTOCOL_UNEXPECTED_PACKET');
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-quit.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-quit.js
deleted file mode 100644
index 5784403da7cd3d6b8e6091a1b7d54a96bd764518..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-quit.js
+++ /dev/null
@@ -1,48 +0,0 @@
-var assert     = require('assert');
-var common     = require('../../common');
-var quitReceived = false;
-var queryCli     = 'SELECT 1';
-var server       = common.createServer(serverReady, function(conn) {
-  conn.on('quit', function() {
-    // COM_QUIT
-    quitReceived = true;
-    conn.stream.end();
-    server.close();
-    console.log('quit!!!');
-  });
-
-  conn.on('query', function(q) {
-    queryServ =  q;
-    conn.writeTextResult([ { '1': '1' } ], [ { catalog: 'def',
-     schema: '',
-     table: '',
-     orgTable: '',
-     name: '1',
-     orgName: '',
-     characterSet: 63,
-     columnLength: 1,
-     columnType: 8,
-     flags: 129,
-     decimals: 0 } ]);
-  });
-});
-
-function serverReady() {
-  var connection = common.createConnection({ port: 3307 });
-
-  connection.query(queryCli, function(err, _rows, _fields) {
-    if (err) throw err;
-    rows = _rows;
-    fields = _fields;
-
-    connection.end();
-  });
-}
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{1: 1}]);
-  assert.equal(fields[0].name, '1');
-  assert.equal(quitReceived, true);
-  assert.equal(queryCli, queryServ);
-
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-select-1.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-select-1.js
deleted file mode 100644
index ab8c2c5512b526b7f47de38bcea18624571f3d46..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-select-1.js
+++ /dev/null
@@ -1,18 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows = undefined;
-var fields = undefined;
-connection.query('SELECT 1', function(err, _rows, _fields) {
-  if (err) throw err;
-
-  rows = _rows;
-  fields = _fields;
-  connection.end();
-});
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{1: 1}]);
-  assert.equal(fields[0].name, '1');
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-select-empty-string.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-select-empty-string.js
deleted file mode 100644
index b3be6a3c1d3dc2d1c24628e8ed268f6e506065cc..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-select-empty-string.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows;
-connection.query('SELECT ""', function(err, _rows) {
-  if (err) throw err;
-
-  rows = _rows;
-  connection.end();
-});
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{'': ''}]);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-select-negative.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-select-negative.js
deleted file mode 100644
index 7b66aa8436a6180d4b8cc1c111bdcb60326c1e8e..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-select-negative.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows = undefined;
-var rows1 = undefined;
-var fields = undefined;
-var fields1 = undefined;
-
-connection.execute('SELECT -1 v', [], function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  fields = _fields;
-});
-
-connection.query('SELECT -1 v', function(err, _rows, _fields) {
-  if (err) throw err;
-  rows1 = _rows;
-  fields1 = _fields;
-  connection.end();
-});
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{v: -1}]);
-  assert.deepEqual(rows1, [{v: -1}]);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-select-utf8.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-select-utf8.js
deleted file mode 100644
index c81cac67b3357eaa9d2edbefed3364f4ce411925..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-select-utf8.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows = undefined;
-var fields = undefined;
-var multibyteText = '本日は晴天なり';
-connection.query("SELECT '" + multibyteText + "'", function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  fields = _fields;
-  connection.end();
-});
-
-
-process.on('exit', function() {
-  assert.equal(rows[0][multibyteText], multibyteText);
-  assert.equal(fields[0].name, multibyteText);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-select-utf8mb4.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-select-utf8mb4.js
deleted file mode 100644
index 0ad55d0a1953093615178318f431d4b19948fcf6..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-select-utf8mb4.js
+++ /dev/null
@@ -1,18 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection({charset: 'UTF8MB4_GENERAL_CI'});
-var assert     = require('assert');
-
-var rows = undefined;
-var fields = undefined;
-var multibyteText = '𠜎 𠜱 𠝹 𠱓 𠱸 𠲖 𠳏 𠳕 𠴕 𠵼 𠵿 𠸎 𠸏 𠹷 𠺝 𠺢 ';
-connection.query("SELECT '" + multibyteText + "'", function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  fields = _fields;
-  connection.end();
-});
-
-process.on('exit', function() {
-  assert.equal(rows[0][multibyteText], multibyteText);
-  assert.equal(fields[0].name, multibyteText);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-server-listen.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-server-listen.js
deleted file mode 100644
index 3dbe2993423fa40beacab216e154b7f9898a36a6..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-server-listen.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var assert = require('assert');
-var mysql = require('../../../index.js')
-
-// Verifies that the Server.listen can be called with any combination of
-// pararameters valid for net.Server.listen.
-
-var server = mysql.createServer();
-var serverListenCallbackFired = false;
-
-function testListen(argsDescription, listenCaller) {
-  var server = mysql.createServer();
-  var listenCallbackFired = false;
-
-  listenCaller(server, function() {
-    listenCallbackFired = true;
-  });
-  setTimeout(function() {
-    assert.ok(
-      listenCallbackFired,
-      'Callback for call with ' + argsDescription + ' did not fire');
-    server._server.close();
-  }, 100);
-}
-
-testListen('port', function(server, callback) {
-  server.listen(0, callback);
-});
-
-testListen('port, host', function(server, callback) {
-  server.listen(0, '127.0.0.1', callback);
-});
-
-testListen('port, host, backlog', function(server, callback) {
-  server.listen(0, '127.0.0.1', 50, callback);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-signed-tinyint.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-signed-tinyint.js
deleted file mode 100644
index e0d93ea54ba3e36da4a0f61b6b7edac9505ce787..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-signed-tinyint.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows = undefined;
-
-connection.query('CREATE TEMPORARY TABLE signed_ints  (b11 tinyint NOT NULL, b12 tinyint NOT NULL, b21 smallint NOT NULL)');
-connection.query('INSERT INTO signed_ints values (-3, -120, 500)');
-connection.query('INSERT INTO signed_ints values (3,  -110, -500)');
-
-connection.execute('SELECT * from signed_ints', [5], function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  connection.end();
-});
-
-
-process.on('exit', function() {
-  assert.deepEqual(rows, [{"b11":-3,"b12":-120,"b21":500},{"b11":3,"b12":-110,"b21":-500}]);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-stream.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-stream.js
deleted file mode 100644
index 9452d01a884a053d0ef531b5708703a62de9871b..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-stream.js
+++ /dev/null
@@ -1,47 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-var rows;
-var rows1 = [];
-var rows2 = [];
-
-connection.query([
-  'CREATE TEMPORARY TABLE `announcements` (',
-  '`id` int(11) NOT NULL AUTO_INCREMENT,',
-  '`title` varchar(255) DEFAULT NULL,',
-  '`text` varchar(255) DEFAULT NULL,',
-  'PRIMARY KEY (`id`)',
-  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-].join('\n'), function(err) {
-  if (err) throw err;
-});
-
-connection.execute('INSERT INTO announcements(title, text) VALUES(?, ?)', ['Есть место, где заканчивается тротуар', 'Расти борода, расти'], function(err) {
-  if (err) throw err;
-});
-connection.execute('INSERT INTO announcements(title, text) VALUES(?, ?)', ['Граждане Российской Федерации имеют право собираться мирно без оружия', 'проводить собрания, митинги и демонстрации, шествия и пикетирование'], function(err) {
-  if (err) throw err;
-});
-connection.execute('SELECT * FROM announcements', function(err, _rows, cols) {
-  rows = _rows;
-  var s1 = connection.query('SELECT * FROM announcements').stream();
-  s1.on('data', function(row) {
-    rows1.push(row);
-  });
-  s1.on('end', function() {
-    var s2 = connection.execute('SELECT * FROM announcements').stream();
-    s2.on('data', function(row) {
-      rows2.push(row);
-    });
-    s2.on('end', function() {
-      connection.end();
-    });
-  });
-});
-
-process.on('exit', function() {
-  assert.deepEqual(rows.length, 2);
-  assert.deepEqual(rows, rows1);
-  assert.deepEqual(rows, rows2);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-timestamp.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-timestamp.js
deleted file mode 100644
index 3839ebc35af0d480cc5dfabfe474dd6f31c1b815..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-timestamp.js
+++ /dev/null
@@ -1,36 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-connection.query('CREATE TEMPORARY TABLE t (f TIMESTAMP)');
-connection.query('INSERT INTO t VALUES(\'0000-00-00 00:00:00\')');
-connection.query('INSERT INTO t VALUES(\'2013-01-22 01:02:03\')');
-
-var rows, fields;
-var rows1, fields1;
-connection.query('SELECT f FROM t', function(err, _rows, _fields) {
-  if (err) throw err;
-  rows = _rows;
-  fields = _fields;
-});
-connection.execute('SELECT f FROM t', function(err, _rows, _fields) {
-  if (err) throw err;
-  rows1 = _rows;
-  fields1 = _fields;
-  connection.end();
-});
-
-process.on('exit', function() {
-  assert.deepEqual(rows[0].f.toString(), 'Invalid Date');
-  assert(rows[0].f instanceof Date);
-  assert(rows[1].f instanceof Date);
-  assert.equal(rows[1].f.getYear(), 113);
-  assert.equal(rows[1].f.getMonth(), 0);
-  assert.equal(rows[1].f.getDate(), 22);
-  assert.equal(rows[1].f.getHours(), 1);
-  assert.equal(rows[1].f.getMinutes(), 2);
-  assert.equal(rows[1].f.getSeconds(), 3);
-  assert.equal(fields[0].name, 'f');
-  assert.deepEqual(rows[1], rows1[1]);
-  assert.deepEqual(fields[0].inspect(), fields1[0].inspect());
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-transaction-commit.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-transaction-commit.js
deleted file mode 100644
index 88386a93be366d2bf7d472b5579de0cb4dcbe685..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-transaction-commit.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-common.useTestDb(connection);
-
-var table = 'transaction_test';
-connection.query([
-                   'CREATE TEMPORARY TABLE `' + table + '` (',
-                   '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
-                   '`title` varchar(255),',
-                   'PRIMARY KEY (`id`)',
-                   ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-                 ].join('\n'));
-
-connection.beginTransaction(function (err) {
-  assert.ifError(err);
-  
-  var row = {
-    id: 1,
-    title: 'Test row'
-  };
-
-  connection.query('INSERT INTO ' + table + ' SET ?', row, function(err) {
-    assert.ifError(err);
-
-    connection.commit(function(err) {
-      assert.ifError(err);
-
-      connection.query('SELECT * FROM ' + table, function(err, rows) {
-        assert.ifError(err);
-        connection.end();
-        assert.equal(rows.length, 1);
-      });
-    });
-  });
-});
\ No newline at end of file
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-transaction-rollback.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-transaction-rollback.js
deleted file mode 100644
index 7cbae390e8ccae43654ed5b29921f092ac4bab9a..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-transaction-rollback.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-common.useTestDb(connection);
-
-var table = 'transaction_test';
-connection.query([
-                   'CREATE TEMPORARY TABLE `' + table + '` (',
-                   '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
-                   '`title` varchar(255),',
-                   'PRIMARY KEY (`id`)',
-                   ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-                 ].join('\n'));
-
-connection.beginTransaction(function (err) {
-  assert.ifError(err);
-  
-  var row = {
-    id: 1,
-    title: 'Test row'
-  };
-
-  connection.query('INSERT INTO ' + table + ' SET ?', row, function(err) {
-    assert.ifError(err);
-
-    connection.rollback(function(err) {
-      assert.ifError(err);
-
-      connection.query('SELECT * FROM ' + table, function(err, rows) {
-        assert.ifError(err);
-        connection.end();
-        assert.equal(rows.length, 0);
-      });
-    });
-  });
-});
\ No newline at end of file
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-type-cast-null-fields.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-type-cast-null-fields.js
deleted file mode 100644
index f5aa32d9b7f14b1d4f7b832fe43acf8bc7f00b87..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-type-cast-null-fields.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-common.useTestDb(connection);
-
-var table = 'insert_test';
-connection.query([
-  'CREATE TEMPORARY TABLE `' + table + '` (',
-  '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
-  '`date` DATETIME NULL,',
-  '`number` INT NULL,',
-  'PRIMARY KEY (`id`)',
-  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-].join('\n'));
-
-connection.query('INSERT INTO ' + table + ' SET ?', {
-  date   : null,
-  number : null,
-});
-
-var results;
-connection.query('SELECT * FROM ' + table, function(err, _results) {
-  if (err) throw err;
-
-  results = _results;
-  connection.end();
-});
-
-
-process.on('exit', function() {
-  assert.strictEqual(results[0].date, null);
-  assert.strictEqual(results[0].number, null);
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-type-casting.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-type-casting.js
deleted file mode 100644
index bd5c37ee3d7e63af9a88ee848eba530b356e39c0..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/test-type-casting.js
+++ /dev/null
@@ -1,72 +0,0 @@
-var common     = require('../../common');
-var connection = common.createConnection();
-var assert     = require('assert');
-
-common.useTestDb(connection);
-
-var tests = require('./type-casting-tests')(connection);
-
-var table = 'type_casting';
-
-var schema  = [];
-var inserts = [];
-
-tests.forEach(function(test, index) {
-  var escaped = test.insertRaw || connection.escape(test.insert);
-
-  test.columnName = test.type + '_' + index;
-
-  schema.push('`' + test.columnName + '` ' + test.type + ',');
-  inserts.push('`' + test.columnName + '` = ' + escaped);
-});
-
-var createTable = [
-  'CREATE TEMPORARY TABLE `' + table + '` (',
-  '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,'
-  ].concat(schema).concat([
-  'PRIMARY KEY (`id`)',
-  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
-]).join('\n');
-
-connection.query(createTable);
-
-connection.query('INSERT INTO ' + table + ' SET' + inserts.join(',\n'));
-
-var row;
-connection.query('SELECT * FROM type_casting', function(err, rows) {
-  if (err) throw err;
-
-  row = rows[0];
-  connection.end();
-});
-
-
-process.on('exit', function() {
-  tests.forEach(function(test) {
-    var expected = test.expect || test.insert;
-    var got      = row[test.columnName];
-    var message;
-
-    if (expected instanceof Date) {
-      assert.equal(got instanceof Date, true, test.type);
-
-      expected = String(expected);
-      got      = String(got);
-    } else if (Buffer.isBuffer(expected)) {
-      assert.equal(Buffer.isBuffer(got), true, test.type);
-
-      expected = String(Array.prototype.slice.call(expected));
-      got      = String(Array.prototype.slice.call(got));
-    }
-
-    if (test.deep) {
-      message = 'got: "' + JSON.stringify(got) + '" expected: "' + JSON.stringify(expected) +
-                '" test: ' + test.type + '';
-      assert.deepEqual(expected, got, message);
-    } else {
-      message = 'got: "' + got + '" (' + (typeof got) + ') expected: "' + expected +
-                '" (' + (typeof expected) + ') test: ' + test.type + '';
-      assert.strictEqual(expected, got, message);
-    }
-  });
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/type-casting-tests.js b/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/type-casting-tests.js
deleted file mode 100644
index 66f8173153f2bb6d185f774cb086a5562f267b3a..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/integration/connection/type-casting-tests.js
+++ /dev/null
@@ -1,53 +0,0 @@
-module.exports = function(connection){
-  return [
-    {type: 'decimal(4,3)', insert: '1.234'},
-//  {type: 'decimal(3,3)', insert: 0.33},
-    {type: 'tinyint', insert: 1},
-    {type: 'smallint', insert: 2},
-    {type: 'int', insert: 3},
-    {type: 'float', insert: 4.5},
-    {type: 'double', insert: 5.5},
-    {type: 'bigint', insert: '6', expect: 6},
-    {type: 'bigint', insert: 6},
-    {type: 'mediumint', insert: 7},
-    {type: 'year', insert: 2012},
-    {type: 'timestamp', insert: new Date('2012-05-12 11:00:23')},
-    {type: 'datetime', insert: new Date('2012-05-12 12:00:23')},
-    {type: 'date', insert: new Date('2012-05-12 00:00:00')},
-    {type: 'time', insert: '13:13:23'},
-    {type: 'time', insert: '-13:13:23'},
-    {type: 'time', insert: '413:13:23'},
-    {type: 'time', insert: '-413:13:23'},
-    {type: 'binary(4)', insert: new Buffer([0, 1, 254, 255])},
-    {type: 'varbinary(4)', insert: new Buffer([0, 1, 254, 255])},
-    {type: 'tinyblob', insert: new Buffer([0, 1, 254, 255])},
-    {type: 'mediumblob', insert: new Buffer([0, 1, 254, 255])},
-    {type: 'longblob', insert: new Buffer([0, 1, 254, 255])},
-    {type: 'blob', insert: new Buffer([0, 1, 254, 255])},
-    {type: 'bit(32)', insert: new Buffer([0, 1, 254, 255])},
-    {type: 'char(5)', insert: 'Hello'},
-    {type: 'varchar(5)', insert: 'Hello'},
-    {type: 'varchar(3) character set utf8 collate utf8_bin', insert: 'bin'},
-    {type: 'tinytext', insert: 'Hello World'},
-    {type: 'mediumtext', insert: 'Hello World'},
-    {type: 'longtext', insert: 'Hello World'},
-    {type: 'text', insert: 'Hello World'},
-    {type: 'point', insertRaw: 'POINT(1.2,-3.4)', expect: {x:1.2, y:-3.4}, deep: true},
-    {type: 'point', insertRaw: (function() {
-        var buffer = new Buffer(21);
-        buffer.writeUInt8(1, 0);
-        buffer.writeUInt32LE(1, 1);
-        buffer.writeDoubleLE(-5.6, 5);
-        buffer.writeDoubleLE(10.23, 13);
-        return 'GeomFromWKB(' + connection.escape(buffer) + ')';
-      })(), expect: {x:-5.6, y:10.23}, deep: true},
-    {type: 'point', insertRaw: '', insert: null, expect: null},
-    {type: 'linestring', insertRaw: 'LINESTRING(POINT(1.2,-3.4),POINT(-5.6,10.23),POINT(0.2,0.7))', expect: [{x:1.2, y:-3.4}, {x:-5.6, y:10.23}, {x:0.2, y:0.7}], deep: true},
-    {type: 'polygon', insertRaw: "GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))')", expect: [[{x:0,y:0},{x:10,y:0},{x:10,y:10},{x:0,y:10},{x:0,y:0}],[{x:5,y:5},{x:7,y:5},{x:7,y:7},{x:5,y:7},{x:5,y:5}]], deep: true},
-    {type: 'geometry', insertRaw: 'POINT(1.2,-3.4)', expect: {x:1.2, y:-3.4}, deep: true},
-    {type: 'multipoint', insertRaw: "GeomFromText('MULTIPOINT(0 0, 20 20, 60 60)')", expect: [{x:0, y:0}, {x:20, y:20}, {x:60, y:60}], deep: true},
-    {type: 'multilinestring', insertRaw: "GeomFromText('MULTILINESTRING((10 10, 20 20), (15 15, 30 15))')", expect: [[{x:10,y:10},{x:20,y:20}],[{x:15,y:15},{x:30,y:15}]], deep: true},
-    {type: 'multipolygon', insertRaw: "GeomFromText('MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))')", expect: [[[{x:0,y:0},{x:10,y:0},{x:10,y:10},{x:0,y:10},{x:0,y:0}]],[[{x:5,y:5},{x:7,y:5},{x:7,y:7},{x:5,y:7},{x:5,y:5}]]], deep: true},
-    {type: 'geometrycollection', insertRaw: "GeomFromText('GEOMETRYCOLLECTION(POINT(11 10), POINT(31 30), LINESTRING(15 15, 20 20))')", expect: [{x:11,y:10},{x:31,y:30},[{x:15,y:15},{x:20,y:20}]], deep: true}
-  ];
-};
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/run.js b/node_modules/mysql2-promise/node_modules/mysql2/test/run.js
deleted file mode 100644
index 42fdee2cddf8cdf418c00199625dd8163ff46bf2..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/run.js
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env node
-
-var options = {};
-
-if (process.env.FILTER) {
-    options.include = new RegExp(process.env.FILTER + '.*\\.js$');
-}
-require('urun')(__dirname, options);
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/template.jade b/node_modules/mysql2-promise/node_modules/mysql2/test/template.jade
deleted file mode 100644
index a475e514397b76a2465b6af0576cbd806f5e7f95..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/template.jade
+++ /dev/null
@@ -1,5 +0,0 @@
-html
-  body
-    ul#users
-    each record in records
-      li(class='user-' + record.id) #{record.name}
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/unit/packets/test-ok-autoinc.js b/node_modules/mysql2-promise/node_modules/mysql2/test/unit/packets/test-ok-autoinc.js
deleted file mode 100644
index e10c59b25b355b8fd4657dfe1cb07f258386afd9..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/unit/packets/test-ok-autoinc.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var assert     = require('assert');
-var packets    = require('../../../lib/packets/index.js');
-
-var packet = packets.OK.toPacket({affectedRows: 0, insertId: 1});
-
-// 5 bytes for an OK packet, plus one byte to store affectedRows plus one byte to store the insertId
-assert.equal( packet.length(), 11,
-    'OK packets with 0 affectedRows and a minimal insertId should be '+
-    '11 bytes long, got '+packet.length()+' byte(s)' );
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/unit/protocol/test-SqlString.js b/node_modules/mysql2-promise/node_modules/mysql2/test/unit/protocol/test-SqlString.js
deleted file mode 100644
index dffede32fc66c17e9eb4898091a9c641768de57e..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/unit/protocol/test-SqlString.js
+++ /dev/null
@@ -1,175 +0,0 @@
-var common    = require('../../common');
-var test      = require('utest');
-var assert    = require('assert');
-var SqlString = common.SqlString;
-
-test('SqlString.escapeId', {
-  'value is quoted': function() {
-    assert.equal('`id`', SqlString.escapeId('id'));
-  },
-
-  'value containing escapes is quoted': function() {
-    assert.equal('`i``d`', SqlString.escapeId('i`d'));
-  },
-
-  'value containing separator is quoted': function() {
-    assert.equal('`id1`.`id2`', SqlString.escapeId('id1.id2'));
-  },
-  'value containing separator and escapes is quoted': function() {
-    assert.equal('`id``1`.`i``d2`', SqlString.escapeId('id`1.i`d2'));
-  },
-
-  'arrays are turned into lists': function() {
-    assert.equal(SqlString.escapeId(['a', 'b', 't.c']), "`a`, `b`, `t`.`c`");
-  },
-
-  'nested arrays are flattened': function() {
-    assert.equal(SqlString.escapeId(['a', ['b', ['t.c']]]), "`a`, `b`, `t`.`c`");
-  },
-});
-
-test('SqlString.escape', {
-  'undefined -> NULL': function() {
-    assert.equal(SqlString.escape(undefined), 'NULL');
-  },
-
-  'null -> NULL': function() {
-    assert.equal(SqlString.escape(null), 'NULL');
-  },
-
-  'booleans convert to strings': function() {
-    assert.equal(SqlString.escape(false), 'false');
-    assert.equal(SqlString.escape(true), 'true');
-  },
-
-  'numbers convert to strings': function() {
-    assert.equal(SqlString.escape(5), '5');
-  },
-
-  'objects are turned into key value pairs': function() {
-    assert.equal(SqlString.escape({a: 'b', c: 'd'}), "`a` = 'b', `c` = 'd'");
-  },
-
-  'objects function properties are ignored': function() {
-    assert.equal(SqlString.escape({a: 'b', c: function() {}}), "`a` = 'b'");
-  },
-
-  'nested objects are cast to strings': function() {
-    assert.equal(SqlString.escape({a: {nested: true}}), "`a` = '[object Object]'");
-  },
-
-  'arrays are turned into lists': function() {
-    assert.equal(SqlString.escape([1, 2, 'c']), "1, 2, 'c'");
-  },
-
-  'nested arrays are turned into grouped lists': function() {
-    assert.equal(SqlString.escape([[1,2,3], [4,5,6], ['a', 'b', {nested: true}]]), "(1, 2, 3), (4, 5, 6), ('a', 'b', '[object Object]')");
-  },
-
-  'nested objects inside arrays are cast to strings': function() {
-    assert.equal(SqlString.escape([1, {nested: true}, 2]), "1, '[object Object]', 2");
-  },
-
-  'strings are quoted': function() {
-    assert.equal(SqlString.escape('Super'), "'Super'");
-  },
-
-  '\0 gets escaped': function() {
-    assert.equal(SqlString.escape('Sup\0er'), "'Sup\\0er'");
-  },
-
-  '\b gets escaped': function() {
-    assert.equal(SqlString.escape('Sup\ber'), "'Sup\\ber'");
-  },
-
-  '\n gets escaped': function() {
-    assert.equal(SqlString.escape('Sup\ner'), "'Sup\\ner'");
-  },
-
-  '\r gets escaped': function() {
-    assert.equal(SqlString.escape('Sup\rer'), "'Sup\\rer'");
-  },
-
-  '\t gets escaped': function() {
-    assert.equal(SqlString.escape('Sup\ter'), "'Sup\\ter'");
-  },
-
-  '\\ gets escaped': function() {
-    assert.equal(SqlString.escape('Sup\\er'), "'Sup\\\\er'");
-  },
-
-  '\u001a (ascii 26) gets replaced with \\Z': function() {
-    assert.equal(SqlString.escape('Sup\u001aer'), "'Sup\\Zer'");
-  },
-
-  'single quotes get escaped': function() {
-    assert.equal(SqlString.escape('Sup\'er'), "'Sup\\'er'");
-  },
-
-  'double quotes get escaped': function() {
-    assert.equal(SqlString.escape('Sup"er'), "'Sup\\\"er'");
-  },
-
-  'dates are converted to YYYY-MM-DD HH:II:SS.sss': function() {
-    var expected = '2012-05-07 11:42:03.002';
-    var date     = new Date(2012, 4, 7, 11, 42, 3, 2);
-    var string   = SqlString.escape(date);
-
-    assert.strictEqual(string, "'" + expected + "'");
-  },
-
-  'buffers are converted to hex': function() {
-    var buffer = new Buffer([0, 1, 254, 255]);
-    var string = SqlString.escape(buffer);
-
-    assert.strictEqual(string, "X'0001feff'");
-  },
-
-  'NaN -> NaN': function() {
-    assert.equal(SqlString.escape(NaN), 'NaN');
-  },
-
-  'Infinity -> Infinity': function() {
-    assert.equal(SqlString.escape(Infinity), 'Infinity');
-  }
-});
-
-test('SqlString.format', {
-  'question marks are replaced with escaped array values': function() {
-    var sql = SqlString.format('? and ?', ['a', 'b']);
-    assert.equal(sql, "'a' and 'b'");
-  },
-
-  'extra question marks are left untouched': function() {
-    var sql = SqlString.format('? and ?', ['a']);
-    assert.equal(sql, "'a' and ?");
-  },
-
-  'extra arguments are not used': function() {
-    var sql = SqlString.format('? and ?', ['a', 'b', 'c']);
-    assert.equal(sql, "'a' and 'b'");
-  },
-
-  'question marks within values do not cause issues': function() {
-    var sql = SqlString.format('? and ?', ['hello?', 'b']);
-    assert.equal(sql, "'hello?' and 'b'");
-  },
-
-  'undefined is ignored': function () {
-    var sql = SqlString.format('?', undefined, false)
-    assert.equal(sql, '?')
-  },
-
-  'objects is converted to values': function () {
-    var sql = SqlString.format('?', { 'hello': 'world' }, false)
-    assert.equal(sql, "`hello` = 'world'")
-  },
-
-  'objects is not converted to values': function () {
-    var sql = SqlString.format('?', { 'hello': 'world' }, true)
-    assert.equal(sql, "'[object Object]'")
-
-    var sql = SqlString.format('?', { toString: function () { return 'hello' } }, true)
-    assert.equal(sql, "'hello'")
-  }
-});
diff --git a/node_modules/mysql2-promise/node_modules/mysql2/test/unit/test-packet-parser.js b/node_modules/mysql2-promise/node_modules/mysql2/test/unit/test-packet-parser.js
deleted file mode 100644
index 7e4ad2711ff2dfc5b8ca5bb2a080c8a3586dc511..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/mysql2/test/unit/test-packet-parser.js
+++ /dev/null
@@ -1,127 +0,0 @@
-var PacketParser = require('../../lib/packet_parser.js');
-var Packet       = require('../../lib/packets/packet.js');
-
-var assert = require('assert');
-
-var pp;
-var packets = [];
-function reset() {
-  pp = new PacketParser(handler);
-  packets = [];
-}
-var handler = function(p) {
-  packets.push(p);
-}
-
-function execute(str, verify) {
-  reset();
-  var buffers = str.split('|').map(function(sb) { return sb.split(',').map(Number) });
-  for(var i=0; i < buffers.length; ++i)
-    pp.execute(new Buffer(buffers[i]));
-  verify();
-}
-
-function p123() {
-  assert(packets.length === 1);
-  assert(packets[0].length() === 10);
-  assert(packets[0].sequenceId === 123);
-}
-
-function p120_121() {
-  packets.forEach(function(p) { p.dump });
-  assert(packets.length === 2);
-  assert(packets[0].length() === 0);
-  assert(packets[0].sequenceId === 120);
-  assert(packets[1].length() === 0);
-  assert(packets[1].sequenceId === 121);
-}
-
-execute("10,0,0,123,1,2,3,4,5,6,7,8,9,0", p123);
-execute("10,0,0,123|1,2,3,4,5,6,7,8,9,0", p123);
-execute("10,0,0|123,1,2,3,4,5,6,7,8,9,0", p123);
-execute("10|0,0|123,1,2,3,4,5,6,7,8,9,0", p123);
-execute("10,0,0,123,1|2,3,4,5,6|7,8,9,0", p123);
-execute("10,0,0,123,1,2|,3,4,5,6|7,8,9,0", p123);
-
-function p42() {
-  assert(packets.length === 1);
-  assert(packets[0].length() === 0);
-  assert(packets[0].sequenceId === 42);
-}
-
-execute("0,0,0,42", p42);
-execute("0|0,0,42", p42);
-execute("0,0|0,42", p42);
-execute("0,0|0|42", p42);
-execute("0,0,0|42", p42);
-execute("0|0|0|42", p42);
-execute("0|0,0|42", p42);
-
-// two zero length packets
-execute("0,0,0,120,0,0,0,121", p120_121);
-execute("0,0,0|120|0|0|0|121", p120_121);
-
-var p122_123 = function() {
-  assert(packets.length === 2);
-  assert(packets[0].length() === 5);
-  assert(packets[0].sequenceId === 122);
-  assert(packets[1].length() === 6);
-  assert(packets[1].sequenceId === 123);
-}
-// two non-zero length packets
-execute("5,0,0,122,1,2,3,4,5,6,0,0,123,1,2,3,4,5,6", p122_123);
-execute("5,0,0,122,1,2,3,4,5|6,0,0,123,1,2,3,4,5,6", p122_123);
-execute("5,0,0,122,1,2,3,4|5|6|0,0,123,1,2,3,4,5,6", p122_123);
-execute("5,0,0,122,1,2,3,4,5,6|0,0,123,1,2,3,4,5,6", p122_123);
-execute("5,0,0,122,1,2,3,4,5,6,0|0,123,1,2,3,4,5,6", p122_123);
-execute("5,0,0,122,1,2,3,4,5,6,0,0|123,1,2,3,4,5,6", p122_123);
-execute("5,0,0,122,1,2,3,4,5,6,0,0,123|1,2,3,4,5,6", p122_123);
-execute("5,0,0,122,1,2,3,4,5,6,0,0,123,1|2,3,4,5,6", p122_123);
-execute("5,0,0,122,1,2,3,4,5,6,0,0,123,1|2,3|4,5,6", p122_123);
-
-// test packet > 65536 lengt
-// TODO combine with "execute" function
-
-var length = 123000
-var pbuff = new Buffer(length+4);
-pbuff[4] = 123;
-pbuff[5] = 124;
-pbuff[6] = 125;
-var p = new Packet(144, pbuff, 4, pbuff.length - 4);
-p.writeHeader(42);
-
-function testBigPackets(chunks, cb) {
-  var packets = [];
-  var pp = new PacketParser(function(p) {
-    packets.push(p);
-  });
-  chunks.forEach(function(ch) {
-    pp.execute(ch);
-  });
-  cb(packets);
-}
-
-function assert2FullPackets(packets) {
-  function assertPacket(p) {
-    assert.equal(p.length(), length);
-    assert.equal(p.sequenceId, 42);
-    assert.equal(p.readInt8(), 123);
-    assert.equal(p.readInt8(), 124);
-    assert.equal(p.readInt8(), 125);
-  }
-  //assert.equal(packets[0].buffer.slice(0, 8).toString('hex'), expectation);
-  //assert.equal(packets[1].buffer.slice(0, 8).toString('hex'), expectation);
-  assert.equal(packets.length, 2);
-  assertPacket(packets[0]);
-  assertPacket(packets[1]);
-}
-
-// 2 full packets in 2 chunks
-testBigPackets( [ pbuff, pbuff ], assert2FullPackets);
-
-testBigPackets( [ pbuff.slice(0, 120000), pbuff.slice(120000, 123004), pbuff ], assert2FullPackets);
-var frameEnd = 120000
-testBigPackets( [ pbuff.slice(0, frameEnd), Buffer.concat([pbuff.slice(frameEnd, 123004), pbuff]) ], assert2FullPackets);
-for(var frameStart=1; frameStart < 100; frameStart++) {
-  testBigPackets([ Buffer.concat([pbuff, pbuff.slice(0, frameStart)]), pbuff.slice(frameStart, 123004) ], assert2FullPackets);
-}
diff --git a/node_modules/mysql2-promise/node_modules/named-placeholders/.npmignore b/node_modules/mysql2-promise/node_modules/named-placeholders/.npmignore
deleted file mode 100644
index 59ee6765f9ca3cebfa7c0e0258f22512333455c3..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/named-placeholders/.npmignore
+++ /dev/null
@@ -1,17 +0,0 @@
-lib-cov
-*.seed
-*.log
-*.csv
-*.dat
-*.out
-*.pid
-*.gz
-.DS_Store
-
-tmp
-pids
-logs
-
-node_modules
-npm-debug.log
-
diff --git a/node_modules/mysql2-promise/node_modules/named-placeholders/.travis.yml b/node_modules/mysql2-promise/node_modules/named-placeholders/.travis.yml
deleted file mode 100644
index 05d299e676449634733c2040c619a704e735e49a..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/named-placeholders/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
-  - "0.10"
-  - "0.11"
diff --git a/node_modules/mysql2-promise/node_modules/named-placeholders/LICENSE b/node_modules/mysql2-promise/node_modules/named-placeholders/LICENSE
deleted file mode 100644
index bc0223fcb0c3d588c073cd53c1028778942f9e5f..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/named-placeholders/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Andrey Sidorov
-
-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/mysql2-promise/node_modules/named-placeholders/README.md b/node_modules/mysql2-promise/node_modules/named-placeholders/README.md
deleted file mode 100644
index eb2e7a7a2e2c45dfe89e988118a765015418c58c..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/named-placeholders/README.md
+++ /dev/null
@@ -1,29 +0,0 @@
-[![Flattr this git repo](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=sidorares&url=https://github.com/sidorares/named-placeholders&title=named-placeholders&language=&tags=github&category=software)
-
-[![NPM](https://nodei.co/npm/named-placeholders.png?downloads=true&stars=true)](https://nodei.co/npm/named-placeholders/)
-
-[![Build Status](https://secure.travis-ci.org/sidorares/named-placeholders.png)](http://travis-ci.org/sidorares/named-placeholders)
-
-# named-placeholders
-
-compiles "select foo where foo.id = :bar and foo.baz < :baz" into "select foo where foo.id = ? and foo.baz < ?" + ["bar", "baz"]
-
-## usage
-
-```sh
-npm install named-placeholders
-```
-
-see [this mysql2 discussion](https://github.com/sidorares/node-mysql2/issues/117)
-
-```js
-var mysql = require('mysql');
-var toUnnamed = require('named-placeholders')();
-
-var q = toUnnamed('select 1+:test', { test: 123});
-mysl.createConnection().query(q[0], q[1]);
-```
-
-## credits
-
-parser is based on @mscdex code of his excellent [node-mariasql](https://github.com/mscdex/node-mariasql) library
diff --git a/node_modules/mysql2-promise/node_modules/named-placeholders/index.js b/node_modules/mysql2-promise/node_modules/named-placeholders/index.js
deleted file mode 100644
index 912ed058ff901d18b9717f56dde567e77ee787ee..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/named-placeholders/index.js
+++ /dev/null
@@ -1,110 +0,0 @@
-// based on code from Brian White @mscdex mariasql library - https://github.com/mscdex/node-mariasql/blob/master/lib/Client.js#L272-L332
-// License: https://github.com/mscdex/node-mariasql/blob/master/LICENSE
-
-var RE_PARAM = /(?:\?)|(?::(\d+|(?:[a-zA-Z][a-zA-Z0-9_]*)))/g,
-    DQUOTE = 34,
-    SQUOTE = 39,
-    BSLASH = 92;
-
-var parse = function(query) {
-  var cqfn;
-  if (this._queryCache && (cqfn = this._queryCache.get(query)))
-    return cqfn;
-
-  var ppos = RE_PARAM.exec(query), curpos = 0, start = 0, end, parts = [],
-      i, chr, inQuote = false, escape = false, qchr, tokens = [], qcnt = 0, fn;
-
-  if (ppos) {
-    do {
-      for (i=curpos,end=ppos.index; i<end; ++i) {
-        chr = query.charCodeAt(i);
-        if (chr === BSLASH)
-          escape = !escape;
-        else {
-          if (escape) {
-            escape = false;
-            continue;
-          }
-          if (inQuote && chr === qchr) {
-            if (query.charCodeAt(i + 1) === qchr) {
-              // quote escaped via "" or ''
-              ++i;
-              continue;
-            }
-            inQuote = false;
-          } else if (chr === DQUOTE || chr === SQUOTE) {
-            inQuote = true;
-            qchr = chr;
-          }
-        }
-      }
-      if (!inQuote) {
-        parts.push(query.substring(start, end));
-        tokens.push(ppos[0].length === 1 ? qcnt++ : ppos[1]);
-        start = end + ppos[0].length;
-      }
-      curpos = end + ppos[0].length;
-    } while (ppos = RE_PARAM.exec(query));
-
-    if (tokens.length) {
-      if (curpos < query.length)
-        parts.push(query.substring(curpos));
-
-      return [parts, tokens];
-    }
-  }
-  return [query];
-};
-
-var EMPTY_LRU_FN = function(key, value) {};
-
-var createCompiler = function(config) {
-  if (!config)
-    config = {};
-  if (!config.placeholder) {
-    config.placeholder = '?';
-  }
-  var ncache = 100;
-  var cache;
-  if (typeof config.cache === 'number')
-    ncache = config.cache;
-  if (typeof config.cache === 'object')
-    cache = config.cache;
-  if (config.cache !== false && !cache) {
-    cache = require('lru-cache')({ max: ncache, dispose: EMPTY_LRU_FN });
-  }
-
-  function toArrayParams(tree, params) {
-    var arr = [];
-    if (tree.length == 1)
-      return [tree[0], []];
-    var tokens = tree[1];
-    for (var i=0; i < tokens.length; ++i)
-      arr.push(params[tokens[i]]);
-    return [tree[0], arr];
-  }
-
-  function join(tree) {
-    if (tree.length == 1)
-      return tree;
-    var unnamed = tree[0].join(config.placeholder);
-    if (tree[0].length == tree[1].length)
-      unnamed += config.placeholder;
-    return [unnamed, tree[1]];
-  }
-
-  var compile = function(query, paramsObj) {
-    var tree;
-    if (cache && (tree = cache.get(query))) {
-      return toArrayParams(tree, paramsObj)
-    }
-    tree = join(parse(query));
-    cache && cache.set(query, tree);
-    return toArrayParams(tree, paramsObj);
-  }
-
-  compile.parse = parse;
-  return compile;
-}
-
-module.exports = createCompiler;
diff --git a/node_modules/mysql2-promise/node_modules/named-placeholders/package.json b/node_modules/mysql2-promise/node_modules/named-placeholders/package.json
deleted file mode 100644
index 5de7ca080ce581c894e0fd1c5c119d6cc5ae0afb..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/named-placeholders/package.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-  "name": "named-placeholders",
-  "version": "0.1.3",
-  "description": "sql named placeholders to unnamed compiler",
-  "main": "index.js",
-  "scripts": {
-    "test": "mocha"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/sidorares/named-placeholders"
-  },
-  "keywords": [
-    "sql",
-    "pdo",
-    "named",
-    "placeholders"
-  ],
-  "author": "Andrey Sidorov <sidorares@yandex.com>",
-  "license": "MIT",
-  "devDependencies": {
-    "mocha": "1.21.4",
-    "mocha.md": "0.1.0",
-    "should": "4.0.4"
-  },
-  "dependencies": {
-    "lru-cache": "2.5.0"
-  }
-}
diff --git a/node_modules/mysql2-promise/node_modules/named-placeholders/test/example.md b/node_modules/mysql2-promise/node_modules/named-placeholders/test/example.md
deleted file mode 100644
index 9272e33577222d764459e23bbc3d4bd37b033f34..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/named-placeholders/test/example.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# given input query with named parameters
-
-it should build corresponding query with `?` placeholders and fill array of parameres from input object
-
-```js
-  var compile = require('..')();
-
-  var query = 'Select users.json,EXISTS(Select 1 from moderators where moderators.id = :id) as is_moderator from users where users.id = :id and users.status = :status and users.complete_status = :complete_status';
-
-  compile(query, {id: 123, status: 'Yes!', complete_status: 'No!'})
-    .should.eql([ 'Select users.json,EXISTS(Select 1 from moderators where moderators.id = ?) as is_moderator from users where users.id = ? and users.status = ? and users.complete_status = ?',
- [ 123, 123, 'Yes!', 'No!' ] ]);
-```
diff --git a/node_modules/mysql2-promise/node_modules/named-placeholders/test/mocha.opts b/node_modules/mysql2-promise/node_modules/named-placeholders/test/mocha.opts
deleted file mode 100644
index d12be27eb16c43f0c1b9f34d7490cccb5d3d3d36..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/node_modules/named-placeholders/test/mocha.opts
+++ /dev/null
@@ -1,2 +0,0 @@
---require should
---compilers md:mocha.md
diff --git a/node_modules/mysql2-promise/package.json b/node_modules/mysql2-promise/package.json
deleted file mode 100644
index 2662b48d2b6434cf3ae83977f9c926438eb5bb05..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/package.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "name": "mysql2-promise",
-  "version": "0.1.4",
-  "description": "Small promises wrapper for mysql2.",
-  "main": "index.js",
-  "scripts": {
-    "test": "jshint index.js && ./node_modules/.bin/mocha test/*.test.js",
-    "release": "npm test && release-it -n -i patch",
-    "release:minor": "npm test && release-it -n -i minor",
-    "release:major": "npm test && release-it -n -i major"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/namshi/node-mysql2-promise"
-  },
-  "keywords": [
-    "mysql2",
-    "promise",
-    "q",
-    "mysql-promise"
-  ],
-  "author": "Hossam Fares <hossam.fares@namshi.com>",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/namshi/node-mysql2-promise/issues"
-  },
-  "dependencies": {
-    "mysql2": "^0.15.7",
-    "q": "^1.3.0"
-  },
-  "devDependencies": {
-    "jshint": "~2.1.10",
-    "mocha": "1.17.1",
-    "release-it": "0.0.9",
-    "should": "3.1.3"
-  },
-  "homepage": "https://github.com/namshi/node-mysql2-promise",
-  "directories": {
-    "test": "test"
-  }
-}
diff --git a/node_modules/mysql2-promise/test/index.test.js b/node_modules/mysql2-promise/test/index.test.js
deleted file mode 100644
index 8e3d422854353ef3d4ce7b29d2b99959e8dc33d4..0000000000000000000000000000000000000000
--- a/node_modules/mysql2-promise/test/index.test.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-var db = require('../');
-require('should');
-
-describe('mysql2-promise', function () {
-  it('should return correct instance', function () {
-    var defaultDb = db();
-    var namedDb = db('foo');
-    namedDb.should.equal(db('foo'));
-    namedDb.should.have.property('query').which.is.a.Function;
-    namedDb.should.have.property('execute').which.is.a.Function;
-    defaultDb.should.equal(db());
-    defaultDb.should.not.equal(namedDb);
-    defaultDb.should.have.property('query').which.is.a.Function;
-    defaultDb.should.have.property('execute').which.is.a.Function;
-  });
-});
\ No newline at end of file
diff --git a/node_modules/negotiator/HISTORY.md b/node_modules/negotiator/HISTORY.md
deleted file mode 100644
index a9a544914c43bb8927b9ee9ff02aa2c2c7277fdb..0000000000000000000000000000000000000000
--- a/node_modules/negotiator/HISTORY.md
+++ /dev/null
@@ -1,108 +0,0 @@
-0.6.3 / 2022-01-22
-==================
-
-  * Revert "Lazy-load modules from main entry point"
-
-0.6.2 / 2019-04-29
-==================
-
-  * Fix sorting charset, encoding, and language with extra parameters
-
-0.6.1 / 2016-05-02
-==================
-
-  * perf: improve `Accept` parsing speed
-  * perf: improve `Accept-Charset` parsing speed
-  * perf: improve `Accept-Encoding` parsing speed
-  * perf: improve `Accept-Language` parsing speed
-
-0.6.0 / 2015-09-29
-==================
-
-  * Fix including type extensions in parameters in `Accept` parsing
-  * Fix parsing `Accept` parameters with quoted equals
-  * Fix parsing `Accept` parameters with quoted semicolons
-  * Lazy-load modules from main entry point
-  * perf: delay type concatenation until needed
-  * perf: enable strict mode
-  * perf: hoist regular expressions
-  * perf: remove closures getting spec properties
-  * perf: remove a closure from media type parsing
-  * perf: remove property delete from media type parsing
-
-0.5.3 / 2015-05-10
-==================
-
-  * Fix media type parameter matching to be case-insensitive
-
-0.5.2 / 2015-05-06
-==================
-
-  * Fix comparing media types with quoted values
-  * Fix splitting media types with quoted commas
-
-0.5.1 / 2015-02-14
-==================
-
-  * Fix preference sorting to be stable for long acceptable lists
-
-0.5.0 / 2014-12-18
-==================
-
-  * Fix list return order when large accepted list
-  * Fix missing identity encoding when q=0 exists
-  * Remove dynamic building of Negotiator class
-
-0.4.9 / 2014-10-14
-==================
-
-  * Fix error when media type has invalid parameter
-
-0.4.8 / 2014-09-28
-==================
-
-  * Fix all negotiations to be case-insensitive
-  * Stable sort preferences of same quality according to client order
-  * Support Node.js 0.6
-
-0.4.7 / 2014-06-24
-==================
-
-  * Handle invalid provided languages
-  * Handle invalid provided media types
-
-0.4.6 / 2014-06-11
-==================
-
-  *  Order by specificity when quality is the same
-
-0.4.5 / 2014-05-29
-==================
-
-  * Fix regression in empty header handling
-
-0.4.4 / 2014-05-29
-==================
-
-  * Fix behaviors when headers are not present
-
-0.4.3 / 2014-04-16
-==================
-
-  * Handle slashes on media params correctly
-
-0.4.2 / 2014-02-28
-==================
-
-  * Fix media type sorting
-  * Handle media types params strictly
-
-0.4.1 / 2014-01-16
-==================
-
-  * Use most specific matches
-
-0.4.0 / 2014-01-09
-==================
-
-  * Remove preferred prefix from methods
diff --git a/node_modules/negotiator/LICENSE b/node_modules/negotiator/LICENSE
deleted file mode 100644
index ea6b9e2e9ac251526c95df2dd995cf5f1e861854..0000000000000000000000000000000000000000
--- a/node_modules/negotiator/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2012-2014 Federico Romero
-Copyright (c) 2012-2014 Isaac Z. Schlueter
-Copyright (c) 2014-2015 Douglas Christopher Wilson
-
-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/negotiator/README.md b/node_modules/negotiator/README.md
deleted file mode 100644
index 82915e521b4d321d90111316c6193706f1d7b8bf..0000000000000000000000000000000000000000
--- a/node_modules/negotiator/README.md
+++ /dev/null
@@ -1,203 +0,0 @@
-# negotiator
-
-[![NPM Version][npm-image]][npm-url]
-[![NPM Downloads][downloads-image]][downloads-url]
-[![Node.js Version][node-version-image]][node-version-url]
-[![Build Status][github-actions-ci-image]][github-actions-ci-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-An HTTP content negotiator for Node.js
-
-## Installation
-
-```sh
-$ npm install negotiator
-```
-
-## API
-
-```js
-var Negotiator = require('negotiator')
-```
-
-### Accept Negotiation
-
-```js
-availableMediaTypes = ['text/html', 'text/plain', 'application/json']
-
-// The negotiator constructor receives a request object
-negotiator = new Negotiator(request)
-
-// Let's say Accept header is 'text/html, application/*;q=0.2, image/jpeg;q=0.8'
-
-negotiator.mediaTypes()
-// -> ['text/html', 'image/jpeg', 'application/*']
-
-negotiator.mediaTypes(availableMediaTypes)
-// -> ['text/html', 'application/json']
-
-negotiator.mediaType(availableMediaTypes)
-// -> 'text/html'
-```
-
-You can check a working example at `examples/accept.js`.
-
-#### Methods
-
-##### mediaType()
-
-Returns the most preferred media type from the client.
-
-##### mediaType(availableMediaType)
-
-Returns the most preferred media type from a list of available media types.
-
-##### mediaTypes()
-
-Returns an array of preferred media types ordered by the client preference.
-
-##### mediaTypes(availableMediaTypes)
-
-Returns an array of preferred media types ordered by priority from a list of
-available media types.
-
-### Accept-Language Negotiation
-
-```js
-negotiator = new Negotiator(request)
-
-availableLanguages = ['en', 'es', 'fr']
-
-// Let's say Accept-Language header is 'en;q=0.8, es, pt'
-
-negotiator.languages()
-// -> ['es', 'pt', 'en']
-
-negotiator.languages(availableLanguages)
-// -> ['es', 'en']
-
-language = negotiator.language(availableLanguages)
-// -> 'es'
-```
-
-You can check a working example at `examples/language.js`.
-
-#### Methods
-
-##### language()
-
-Returns the most preferred language from the client.
-
-##### language(availableLanguages)
-
-Returns the most preferred language from a list of available languages.
-
-##### languages()
-
-Returns an array of preferred languages ordered by the client preference.
-
-##### languages(availableLanguages)
-
-Returns an array of preferred languages ordered by priority from a list of
-available languages.
-
-### Accept-Charset Negotiation
-
-```js
-availableCharsets = ['utf-8', 'iso-8859-1', 'iso-8859-5']
-
-negotiator = new Negotiator(request)
-
-// Let's say Accept-Charset header is 'utf-8, iso-8859-1;q=0.8, utf-7;q=0.2'
-
-negotiator.charsets()
-// -> ['utf-8', 'iso-8859-1', 'utf-7']
-
-negotiator.charsets(availableCharsets)
-// -> ['utf-8', 'iso-8859-1']
-
-negotiator.charset(availableCharsets)
-// -> 'utf-8'
-```
-
-You can check a working example at `examples/charset.js`.
-
-#### Methods
-
-##### charset()
-
-Returns the most preferred charset from the client.
-
-##### charset(availableCharsets)
-
-Returns the most preferred charset from a list of available charsets.
-
-##### charsets()
-
-Returns an array of preferred charsets ordered by the client preference.
-
-##### charsets(availableCharsets)
-
-Returns an array of preferred charsets ordered by priority from a list of
-available charsets.
-
-### Accept-Encoding Negotiation
-
-```js
-availableEncodings = ['identity', 'gzip']
-
-negotiator = new Negotiator(request)
-
-// Let's say Accept-Encoding header is 'gzip, compress;q=0.2, identity;q=0.5'
-
-negotiator.encodings()
-// -> ['gzip', 'identity', 'compress']
-
-negotiator.encodings(availableEncodings)
-// -> ['gzip', 'identity']
-
-negotiator.encoding(availableEncodings)
-// -> 'gzip'
-```
-
-You can check a working example at `examples/encoding.js`.
-
-#### Methods
-
-##### encoding()
-
-Returns the most preferred encoding from the client.
-
-##### encoding(availableEncodings)
-
-Returns the most preferred encoding from a list of available encodings.
-
-##### encodings()
-
-Returns an array of preferred encodings ordered by the client preference.
-
-##### encodings(availableEncodings)
-
-Returns an array of preferred encodings ordered by priority from a list of
-available encodings.
-
-## See Also
-
-The [accepts](https://npmjs.org/package/accepts#readme) module builds on
-this module and provides an alternative interface, mime type validation,
-and more.
-
-## License
-
-[MIT](LICENSE)
-
-[npm-image]: https://img.shields.io/npm/v/negotiator.svg
-[npm-url]: https://npmjs.org/package/negotiator
-[node-version-image]: https://img.shields.io/node/v/negotiator.svg
-[node-version-url]: https://nodejs.org/en/download/
-[coveralls-image]: https://img.shields.io/coveralls/jshttp/negotiator/master.svg
-[coveralls-url]: https://coveralls.io/r/jshttp/negotiator?branch=master
-[downloads-image]: https://img.shields.io/npm/dm/negotiator.svg
-[downloads-url]: https://npmjs.org/package/negotiator
-[github-actions-ci-image]: https://img.shields.io/github/workflow/status/jshttp/negotiator/ci/master?label=ci
-[github-actions-ci-url]: https://github.com/jshttp/negotiator/actions/workflows/ci.yml
diff --git a/node_modules/negotiator/index.js b/node_modules/negotiator/index.js
deleted file mode 100644
index 4788264b16c9f2282bba539529577ed31920425d..0000000000000000000000000000000000000000
--- a/node_modules/negotiator/index.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/*!
- * negotiator
- * Copyright(c) 2012 Federico Romero
- * Copyright(c) 2012-2014 Isaac Z. Schlueter
- * Copyright(c) 2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-var preferredCharsets = require('./lib/charset')
-var preferredEncodings = require('./lib/encoding')
-var preferredLanguages = require('./lib/language')
-var preferredMediaTypes = require('./lib/mediaType')
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = Negotiator;
-module.exports.Negotiator = Negotiator;
-
-/**
- * Create a Negotiator instance from a request.
- * @param {object} request
- * @public
- */
-
-function Negotiator(request) {
-  if (!(this instanceof Negotiator)) {
-    return new Negotiator(request);
-  }
-
-  this.request = request;
-}
-
-Negotiator.prototype.charset = function charset(available) {
-  var set = this.charsets(available);
-  return set && set[0];
-};
-
-Negotiator.prototype.charsets = function charsets(available) {
-  return preferredCharsets(this.request.headers['accept-charset'], available);
-};
-
-Negotiator.prototype.encoding = function encoding(available) {
-  var set = this.encodings(available);
-  return set && set[0];
-};
-
-Negotiator.prototype.encodings = function encodings(available) {
-  return preferredEncodings(this.request.headers['accept-encoding'], available);
-};
-
-Negotiator.prototype.language = function language(available) {
-  var set = this.languages(available);
-  return set && set[0];
-};
-
-Negotiator.prototype.languages = function languages(available) {
-  return preferredLanguages(this.request.headers['accept-language'], available);
-};
-
-Negotiator.prototype.mediaType = function mediaType(available) {
-  var set = this.mediaTypes(available);
-  return set && set[0];
-};
-
-Negotiator.prototype.mediaTypes = function mediaTypes(available) {
-  return preferredMediaTypes(this.request.headers.accept, available);
-};
-
-// Backwards compatibility
-Negotiator.prototype.preferredCharset = Negotiator.prototype.charset;
-Negotiator.prototype.preferredCharsets = Negotiator.prototype.charsets;
-Negotiator.prototype.preferredEncoding = Negotiator.prototype.encoding;
-Negotiator.prototype.preferredEncodings = Negotiator.prototype.encodings;
-Negotiator.prototype.preferredLanguage = Negotiator.prototype.language;
-Negotiator.prototype.preferredLanguages = Negotiator.prototype.languages;
-Negotiator.prototype.preferredMediaType = Negotiator.prototype.mediaType;
-Negotiator.prototype.preferredMediaTypes = Negotiator.prototype.mediaTypes;
diff --git a/node_modules/negotiator/lib/charset.js b/node_modules/negotiator/lib/charset.js
deleted file mode 100644
index cdd014803474a4b76b981c475a32ebcaa81a36e5..0000000000000000000000000000000000000000
--- a/node_modules/negotiator/lib/charset.js
+++ /dev/null
@@ -1,169 +0,0 @@
-/**
- * negotiator
- * Copyright(c) 2012 Isaac Z. Schlueter
- * Copyright(c) 2014 Federico Romero
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = preferredCharsets;
-module.exports.preferredCharsets = preferredCharsets;
-
-/**
- * Module variables.
- * @private
- */
-
-var simpleCharsetRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/;
-
-/**
- * Parse the Accept-Charset header.
- * @private
- */
-
-function parseAcceptCharset(accept) {
-  var accepts = accept.split(',');
-
-  for (var i = 0, j = 0; i < accepts.length; i++) {
-    var charset = parseCharset(accepts[i].trim(), i);
-
-    if (charset) {
-      accepts[j++] = charset;
-    }
-  }
-
-  // trim accepts
-  accepts.length = j;
-
-  return accepts;
-}
-
-/**
- * Parse a charset from the Accept-Charset header.
- * @private
- */
-
-function parseCharset(str, i) {
-  var match = simpleCharsetRegExp.exec(str);
-  if (!match) return null;
-
-  var charset = match[1];
-  var q = 1;
-  if (match[2]) {
-    var params = match[2].split(';')
-    for (var j = 0; j < params.length; j++) {
-      var p = params[j].trim().split('=');
-      if (p[0] === 'q') {
-        q = parseFloat(p[1]);
-        break;
-      }
-    }
-  }
-
-  return {
-    charset: charset,
-    q: q,
-    i: i
-  };
-}
-
-/**
- * Get the priority of a charset.
- * @private
- */
-
-function getCharsetPriority(charset, accepted, index) {
-  var priority = {o: -1, q: 0, s: 0};
-
-  for (var i = 0; i < accepted.length; i++) {
-    var spec = specify(charset, accepted[i], index);
-
-    if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
-      priority = spec;
-    }
-  }
-
-  return priority;
-}
-
-/**
- * Get the specificity of the charset.
- * @private
- */
-
-function specify(charset, spec, index) {
-  var s = 0;
-  if(spec.charset.toLowerCase() === charset.toLowerCase()){
-    s |= 1;
-  } else if (spec.charset !== '*' ) {
-    return null
-  }
-
-  return {
-    i: index,
-    o: spec.i,
-    q: spec.q,
-    s: s
-  }
-}
-
-/**
- * Get the preferred charsets from an Accept-Charset header.
- * @public
- */
-
-function preferredCharsets(accept, provided) {
-  // RFC 2616 sec 14.2: no header = *
-  var accepts = parseAcceptCharset(accept === undefined ? '*' : accept || '');
-
-  if (!provided) {
-    // sorted list of all charsets
-    return accepts
-      .filter(isQuality)
-      .sort(compareSpecs)
-      .map(getFullCharset);
-  }
-
-  var priorities = provided.map(function getPriority(type, index) {
-    return getCharsetPriority(type, accepts, index);
-  });
-
-  // sorted list of accepted charsets
-  return priorities.filter(isQuality).sort(compareSpecs).map(function getCharset(priority) {
-    return provided[priorities.indexOf(priority)];
-  });
-}
-
-/**
- * Compare two specs.
- * @private
- */
-
-function compareSpecs(a, b) {
-  return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
-}
-
-/**
- * Get full charset string.
- * @private
- */
-
-function getFullCharset(spec) {
-  return spec.charset;
-}
-
-/**
- * Check if a spec has any quality.
- * @private
- */
-
-function isQuality(spec) {
-  return spec.q > 0;
-}
diff --git a/node_modules/negotiator/lib/encoding.js b/node_modules/negotiator/lib/encoding.js
deleted file mode 100644
index 8432cd77b8a96940b87d747dbb30ee9c2d065a31..0000000000000000000000000000000000000000
--- a/node_modules/negotiator/lib/encoding.js
+++ /dev/null
@@ -1,184 +0,0 @@
-/**
- * negotiator
- * Copyright(c) 2012 Isaac Z. Schlueter
- * Copyright(c) 2014 Federico Romero
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = preferredEncodings;
-module.exports.preferredEncodings = preferredEncodings;
-
-/**
- * Module variables.
- * @private
- */
-
-var simpleEncodingRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/;
-
-/**
- * Parse the Accept-Encoding header.
- * @private
- */
-
-function parseAcceptEncoding(accept) {
-  var accepts = accept.split(',');
-  var hasIdentity = false;
-  var minQuality = 1;
-
-  for (var i = 0, j = 0; i < accepts.length; i++) {
-    var encoding = parseEncoding(accepts[i].trim(), i);
-
-    if (encoding) {
-      accepts[j++] = encoding;
-      hasIdentity = hasIdentity || specify('identity', encoding);
-      minQuality = Math.min(minQuality, encoding.q || 1);
-    }
-  }
-
-  if (!hasIdentity) {
-    /*
-     * If identity doesn't explicitly appear in the accept-encoding header,
-     * it's added to the list of acceptable encoding with the lowest q
-     */
-    accepts[j++] = {
-      encoding: 'identity',
-      q: minQuality,
-      i: i
-    };
-  }
-
-  // trim accepts
-  accepts.length = j;
-
-  return accepts;
-}
-
-/**
- * Parse an encoding from the Accept-Encoding header.
- * @private
- */
-
-function parseEncoding(str, i) {
-  var match = simpleEncodingRegExp.exec(str);
-  if (!match) return null;
-
-  var encoding = match[1];
-  var q = 1;
-  if (match[2]) {
-    var params = match[2].split(';');
-    for (var j = 0; j < params.length; j++) {
-      var p = params[j].trim().split('=');
-      if (p[0] === 'q') {
-        q = parseFloat(p[1]);
-        break;
-      }
-    }
-  }
-
-  return {
-    encoding: encoding,
-    q: q,
-    i: i
-  };
-}
-
-/**
- * Get the priority of an encoding.
- * @private
- */
-
-function getEncodingPriority(encoding, accepted, index) {
-  var priority = {o: -1, q: 0, s: 0};
-
-  for (var i = 0; i < accepted.length; i++) {
-    var spec = specify(encoding, accepted[i], index);
-
-    if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
-      priority = spec;
-    }
-  }
-
-  return priority;
-}
-
-/**
- * Get the specificity of the encoding.
- * @private
- */
-
-function specify(encoding, spec, index) {
-  var s = 0;
-  if(spec.encoding.toLowerCase() === encoding.toLowerCase()){
-    s |= 1;
-  } else if (spec.encoding !== '*' ) {
-    return null
-  }
-
-  return {
-    i: index,
-    o: spec.i,
-    q: spec.q,
-    s: s
-  }
-};
-
-/**
- * Get the preferred encodings from an Accept-Encoding header.
- * @public
- */
-
-function preferredEncodings(accept, provided) {
-  var accepts = parseAcceptEncoding(accept || '');
-
-  if (!provided) {
-    // sorted list of all encodings
-    return accepts
-      .filter(isQuality)
-      .sort(compareSpecs)
-      .map(getFullEncoding);
-  }
-
-  var priorities = provided.map(function getPriority(type, index) {
-    return getEncodingPriority(type, accepts, index);
-  });
-
-  // sorted list of accepted encodings
-  return priorities.filter(isQuality).sort(compareSpecs).map(function getEncoding(priority) {
-    return provided[priorities.indexOf(priority)];
-  });
-}
-
-/**
- * Compare two specs.
- * @private
- */
-
-function compareSpecs(a, b) {
-  return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
-}
-
-/**
- * Get full encoding string.
- * @private
- */
-
-function getFullEncoding(spec) {
-  return spec.encoding;
-}
-
-/**
- * Check if a spec has any quality.
- * @private
- */
-
-function isQuality(spec) {
-  return spec.q > 0;
-}
diff --git a/node_modules/negotiator/lib/language.js b/node_modules/negotiator/lib/language.js
deleted file mode 100644
index a23167252719be841ad570eb655a703a4ae8fe9e..0000000000000000000000000000000000000000
--- a/node_modules/negotiator/lib/language.js
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * negotiator
- * Copyright(c) 2012 Isaac Z. Schlueter
- * Copyright(c) 2014 Federico Romero
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = preferredLanguages;
-module.exports.preferredLanguages = preferredLanguages;
-
-/**
- * Module variables.
- * @private
- */
-
-var simpleLanguageRegExp = /^\s*([^\s\-;]+)(?:-([^\s;]+))?\s*(?:;(.*))?$/;
-
-/**
- * Parse the Accept-Language header.
- * @private
- */
-
-function parseAcceptLanguage(accept) {
-  var accepts = accept.split(',');
-
-  for (var i = 0, j = 0; i < accepts.length; i++) {
-    var language = parseLanguage(accepts[i].trim(), i);
-
-    if (language) {
-      accepts[j++] = language;
-    }
-  }
-
-  // trim accepts
-  accepts.length = j;
-
-  return accepts;
-}
-
-/**
- * Parse a language from the Accept-Language header.
- * @private
- */
-
-function parseLanguage(str, i) {
-  var match = simpleLanguageRegExp.exec(str);
-  if (!match) return null;
-
-  var prefix = match[1]
-  var suffix = match[2]
-  var full = prefix
-
-  if (suffix) full += "-" + suffix;
-
-  var q = 1;
-  if (match[3]) {
-    var params = match[3].split(';')
-    for (var j = 0; j < params.length; j++) {
-      var p = params[j].split('=');
-      if (p[0] === 'q') q = parseFloat(p[1]);
-    }
-  }
-
-  return {
-    prefix: prefix,
-    suffix: suffix,
-    q: q,
-    i: i,
-    full: full
-  };
-}
-
-/**
- * Get the priority of a language.
- * @private
- */
-
-function getLanguagePriority(language, accepted, index) {
-  var priority = {o: -1, q: 0, s: 0};
-
-  for (var i = 0; i < accepted.length; i++) {
-    var spec = specify(language, accepted[i], index);
-
-    if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
-      priority = spec;
-    }
-  }
-
-  return priority;
-}
-
-/**
- * Get the specificity of the language.
- * @private
- */
-
-function specify(language, spec, index) {
-  var p = parseLanguage(language)
-  if (!p) return null;
-  var s = 0;
-  if(spec.full.toLowerCase() === p.full.toLowerCase()){
-    s |= 4;
-  } else if (spec.prefix.toLowerCase() === p.full.toLowerCase()) {
-    s |= 2;
-  } else if (spec.full.toLowerCase() === p.prefix.toLowerCase()) {
-    s |= 1;
-  } else if (spec.full !== '*' ) {
-    return null
-  }
-
-  return {
-    i: index,
-    o: spec.i,
-    q: spec.q,
-    s: s
-  }
-};
-
-/**
- * Get the preferred languages from an Accept-Language header.
- * @public
- */
-
-function preferredLanguages(accept, provided) {
-  // RFC 2616 sec 14.4: no header = *
-  var accepts = parseAcceptLanguage(accept === undefined ? '*' : accept || '');
-
-  if (!provided) {
-    // sorted list of all languages
-    return accepts
-      .filter(isQuality)
-      .sort(compareSpecs)
-      .map(getFullLanguage);
-  }
-
-  var priorities = provided.map(function getPriority(type, index) {
-    return getLanguagePriority(type, accepts, index);
-  });
-
-  // sorted list of accepted languages
-  return priorities.filter(isQuality).sort(compareSpecs).map(function getLanguage(priority) {
-    return provided[priorities.indexOf(priority)];
-  });
-}
-
-/**
- * Compare two specs.
- * @private
- */
-
-function compareSpecs(a, b) {
-  return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
-}
-
-/**
- * Get full language string.
- * @private
- */
-
-function getFullLanguage(spec) {
-  return spec.full;
-}
-
-/**
- * Check if a spec has any quality.
- * @private
- */
-
-function isQuality(spec) {
-  return spec.q > 0;
-}
diff --git a/node_modules/negotiator/lib/mediaType.js b/node_modules/negotiator/lib/mediaType.js
deleted file mode 100644
index 67309dd75f1b62cfe90bfa622919fdae8b80bc0b..0000000000000000000000000000000000000000
--- a/node_modules/negotiator/lib/mediaType.js
+++ /dev/null
@@ -1,294 +0,0 @@
-/**
- * negotiator
- * Copyright(c) 2012 Isaac Z. Schlueter
- * Copyright(c) 2014 Federico Romero
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict';
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = preferredMediaTypes;
-module.exports.preferredMediaTypes = preferredMediaTypes;
-
-/**
- * Module variables.
- * @private
- */
-
-var simpleMediaTypeRegExp = /^\s*([^\s\/;]+)\/([^;\s]+)\s*(?:;(.*))?$/;
-
-/**
- * Parse the Accept header.
- * @private
- */
-
-function parseAccept(accept) {
-  var accepts = splitMediaTypes(accept);
-
-  for (var i = 0, j = 0; i < accepts.length; i++) {
-    var mediaType = parseMediaType(accepts[i].trim(), i);
-
-    if (mediaType) {
-      accepts[j++] = mediaType;
-    }
-  }
-
-  // trim accepts
-  accepts.length = j;
-
-  return accepts;
-}
-
-/**
- * Parse a media type from the Accept header.
- * @private
- */
-
-function parseMediaType(str, i) {
-  var match = simpleMediaTypeRegExp.exec(str);
-  if (!match) return null;
-
-  var params = Object.create(null);
-  var q = 1;
-  var subtype = match[2];
-  var type = match[1];
-
-  if (match[3]) {
-    var kvps = splitParameters(match[3]).map(splitKeyValuePair);
-
-    for (var j = 0; j < kvps.length; j++) {
-      var pair = kvps[j];
-      var key = pair[0].toLowerCase();
-      var val = pair[1];
-
-      // get the value, unwrapping quotes
-      var value = val && val[0] === '"' && val[val.length - 1] === '"'
-        ? val.substr(1, val.length - 2)
-        : val;
-
-      if (key === 'q') {
-        q = parseFloat(value);
-        break;
-      }
-
-      // store parameter
-      params[key] = value;
-    }
-  }
-
-  return {
-    type: type,
-    subtype: subtype,
-    params: params,
-    q: q,
-    i: i
-  };
-}
-
-/**
- * Get the priority of a media type.
- * @private
- */
-
-function getMediaTypePriority(type, accepted, index) {
-  var priority = {o: -1, q: 0, s: 0};
-
-  for (var i = 0; i < accepted.length; i++) {
-    var spec = specify(type, accepted[i], index);
-
-    if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) {
-      priority = spec;
-    }
-  }
-
-  return priority;
-}
-
-/**
- * Get the specificity of the media type.
- * @private
- */
-
-function specify(type, spec, index) {
-  var p = parseMediaType(type);
-  var s = 0;
-
-  if (!p) {
-    return null;
-  }
-
-  if(spec.type.toLowerCase() == p.type.toLowerCase()) {
-    s |= 4
-  } else if(spec.type != '*') {
-    return null;
-  }
-
-  if(spec.subtype.toLowerCase() == p.subtype.toLowerCase()) {
-    s |= 2
-  } else if(spec.subtype != '*') {
-    return null;
-  }
-
-  var keys = Object.keys(spec.params);
-  if (keys.length > 0) {
-    if (keys.every(function (k) {
-      return spec.params[k] == '*' || (spec.params[k] || '').toLowerCase() == (p.params[k] || '').toLowerCase();
-    })) {
-      s |= 1
-    } else {
-      return null
-    }
-  }
-
-  return {
-    i: index,
-    o: spec.i,
-    q: spec.q,
-    s: s,
-  }
-}
-
-/**
- * Get the preferred media types from an Accept header.
- * @public
- */
-
-function preferredMediaTypes(accept, provided) {
-  // RFC 2616 sec 14.2: no header = */*
-  var accepts = parseAccept(accept === undefined ? '*/*' : accept || '');
-
-  if (!provided) {
-    // sorted list of all types
-    return accepts
-      .filter(isQuality)
-      .sort(compareSpecs)
-      .map(getFullType);
-  }
-
-  var priorities = provided.map(function getPriority(type, index) {
-    return getMediaTypePriority(type, accepts, index);
-  });
-
-  // sorted list of accepted types
-  return priorities.filter(isQuality).sort(compareSpecs).map(function getType(priority) {
-    return provided[priorities.indexOf(priority)];
-  });
-}
-
-/**
- * Compare two specs.
- * @private
- */
-
-function compareSpecs(a, b) {
-  return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0;
-}
-
-/**
- * Get full type string.
- * @private
- */
-
-function getFullType(spec) {
-  return spec.type + '/' + spec.subtype;
-}
-
-/**
- * Check if a spec has any quality.
- * @private
- */
-
-function isQuality(spec) {
-  return spec.q > 0;
-}
-
-/**
- * Count the number of quotes in a string.
- * @private
- */
-
-function quoteCount(string) {
-  var count = 0;
-  var index = 0;
-
-  while ((index = string.indexOf('"', index)) !== -1) {
-    count++;
-    index++;
-  }
-
-  return count;
-}
-
-/**
- * Split a key value pair.
- * @private
- */
-
-function splitKeyValuePair(str) {
-  var index = str.indexOf('=');
-  var key;
-  var val;
-
-  if (index === -1) {
-    key = str;
-  } else {
-    key = str.substr(0, index);
-    val = str.substr(index + 1);
-  }
-
-  return [key, val];
-}
-
-/**
- * Split an Accept header into media types.
- * @private
- */
-
-function splitMediaTypes(accept) {
-  var accepts = accept.split(',');
-
-  for (var i = 1, j = 0; i < accepts.length; i++) {
-    if (quoteCount(accepts[j]) % 2 == 0) {
-      accepts[++j] = accepts[i];
-    } else {
-      accepts[j] += ',' + accepts[i];
-    }
-  }
-
-  // trim accepts
-  accepts.length = j + 1;
-
-  return accepts;
-}
-
-/**
- * Split a string of parameters.
- * @private
- */
-
-function splitParameters(str) {
-  var parameters = str.split(';');
-
-  for (var i = 1, j = 0; i < parameters.length; i++) {
-    if (quoteCount(parameters[j]) % 2 == 0) {
-      parameters[++j] = parameters[i];
-    } else {
-      parameters[j] += ';' + parameters[i];
-    }
-  }
-
-  // trim parameters
-  parameters.length = j + 1;
-
-  for (var i = 0; i < parameters.length; i++) {
-    parameters[i] = parameters[i].trim();
-  }
-
-  return parameters;
-}
diff --git a/node_modules/negotiator/package.json b/node_modules/negotiator/package.json
deleted file mode 100644
index 297635f6d34177956186df7c6a7e502ebb576da2..0000000000000000000000000000000000000000
--- a/node_modules/negotiator/package.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
-  "name": "negotiator",
-  "description": "HTTP content negotiation",
-  "version": "0.6.3",
-  "contributors": [
-    "Douglas Christopher Wilson <doug@somethingdoug.com>",
-    "Federico Romero <federico.romero@outboxlabs.com>",
-    "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)"
-  ],
-  "license": "MIT",
-  "keywords": [
-    "http",
-    "content negotiation",
-    "accept",
-    "accept-language",
-    "accept-encoding",
-    "accept-charset"
-  ],
-  "repository": "jshttp/negotiator",
-  "devDependencies": {
-    "eslint": "7.32.0",
-    "eslint-plugin-markdown": "2.2.1",
-    "mocha": "9.1.3",
-    "nyc": "15.1.0"
-  },
-  "files": [
-    "lib/",
-    "HISTORY.md",
-    "LICENSE",
-    "index.js",
-    "README.md"
-  ],
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "scripts": {
-    "lint": "eslint .",
-    "test": "mocha --reporter spec --check-leaks --bail test/",
-    "test-ci": "nyc --reporter=lcov --reporter=text npm test",
-    "test-cov": "nyc --reporter=html --reporter=text npm test"
-  }
-}
diff --git a/node_modules/nodemon/.prettierrc.json b/node_modules/nodemon/.prettierrc.json
deleted file mode 100644
index 544138be45652abc7bc3873341deacd3f4f90c61..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/.prettierrc.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "singleQuote": true
-}
diff --git a/node_modules/nodemon/LICENSE b/node_modules/nodemon/LICENSE
deleted file mode 100644
index 19c91a2f3ba9a1b12b0b232adcabbf9cf2a131c3..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2010 - present, Remy Sharp, https://remysharp.com <remy@remysharp.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/nodemon/README.md b/node_modules/nodemon/README.md
deleted file mode 100644
index fb645962b3c6c7f67dd099629b204ea2518f44dc..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/README.md
+++ /dev/null
@@ -1,448 +0,0 @@
-<p align="center">
-  <a href="https://nodemon.io/"><img src="https://user-images.githubusercontent.com/13700/35731649-652807e8-080e-11e8-88fd-1b2f6d553b2d.png" alt="Nodemon Logo"></a>
-</p>
-
-# nodemon
-
-nodemon is a tool that helps develop Node.js based applications by automatically restarting the node application when file changes in the directory are detected.
-
-nodemon does **not** require *any* additional changes to your code or method of development. nodemon is a replacement wrapper for `node`. To use `nodemon`, replace the word `node` on the command line when executing your script.
-
-[![NPM version](https://badge.fury.io/js/nodemon.svg)](https://npmjs.org/package/nodemon)
-[![Backers on Open Collective](https://opencollective.com/nodemon/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/nodemon/sponsors/badge.svg)](#sponsors)
-
-# Installation
-
-Either through cloning with git or by using [npm](http://npmjs.org) (the recommended way):
-
-```bash
-npm install -g nodemon # or using yarn: yarn global add nodemon
-```
-
-And nodemon will be installed globally to your system path.
-
-You can also install nodemon as a development dependency:
-
-```bash
-npm install --save-dev nodemon # or using yarn: yarn add nodemon -D
-```
-
-With a local installation, nodemon will not be available in your system path or you can't use it directly from the command line. Instead, the local installation of nodemon can be run by calling it from within an npm script (such as `npm start`) or using `npx nodemon`.
-
-# Usage
-
-nodemon wraps your application, so you can pass all the arguments you would normally pass to your app:
-
-```bash
-nodemon [your node app]
-```
-
-For CLI options, use the `-h` (or `--help`) argument:
-
-```bash
-nodemon -h
-```
-
-Using nodemon is simple, if my application accepted a host and port as the arguments, I would start it as so:
-
-```bash
-nodemon ./server.js localhost 8080
-```
-
-Any output from this script is prefixed with `[nodemon]`, otherwise all output from your application, errors included, will be echoed out as expected.
-
-You can also pass the `inspect` flag to node through the command line as you would normally:
-
-```bash
-nodemon --inspect ./server.js 80
-```
-
-If you have a `package.json` file for your app, you can omit the main script entirely and nodemon will read the `package.json` for the `main` property and use that value as the app ([ref](https://github.com/remy/nodemon/issues/14)).
-
-nodemon will also search for the `scripts.start` property in `package.json` (as of nodemon 1.1.x).
-
-Also check out the [FAQ](https://github.com/remy/nodemon/blob/master/faq.md) or [issues](https://github.com/remy/nodemon/issues) for nodemon.
-
-## Automatic re-running
-
-nodemon was originally written to restart hanging processes such as web servers, but now supports apps that cleanly exit. If your script exits cleanly, nodemon will continue to monitor the directory (or directories) and restart the script if there are any changes.
-
-## Manual restarting
-
-Whilst nodemon is running, if you need to manually restart your application, instead of stopping and restart nodemon, you can type `rs` with a carriage return, and nodemon will restart your process.
-
-## Config files
-
-nodemon supports local and global configuration files. These are usually named `nodemon.json` and can be located in the current working directory or in your home directory. An alternative local configuration file can be specified with the `--config <file>` option.
-
-The specificity is as follows, so that a command line argument will always override the config file settings:
-
-- command line arguments
-- local config
-- global config
-
-A config file can take any of the command line arguments as JSON key values, for example:
-
-```json
-{
-  "verbose": true,
-  "ignore": ["*.test.js", "**/fixtures/**"],
-  "execMap": {
-    "rb": "ruby",
-    "pde": "processing --sketch={{pwd}} --run"
-  }
-}
-```
-
-The above `nodemon.json` file might be my global config so that I have support for ruby files and processing files, and I can run `nodemon demo.pde` and nodemon will automatically know how to run the script even though out of the box support for processing scripts.
-
-A further example of options can be seen in [sample-nodemon.md](https://github.com/remy/nodemon/blob/master/doc/sample-nodemon.md)
-
-### package.json
-
-If you want to keep all your package configurations in one place, nodemon supports using `package.json` for configuration.
-Specify the config in the same format as you would for a config file but under `nodemonConfig` in the `package.json` file, for example, take the following `package.json`:
-
-```json
-{
-  "name": "nodemon",
-  "homepage": "http://nodemon.io",
-  "...": "... other standard package.json values",
-  "nodemonConfig": {
-    "ignore": ["**/test/**", "**/docs/**"],
-    "delay": 2500
-  }
-}
-```
-
-Note that if you specify a `--config` file or provide a local `nodemon.json` any `package.json` config is ignored.
-
-*This section needs better documentation, but for now you can also see `nodemon --help config` ([also here](https://github.com/remy/nodemon/blob/master/doc/cli/config.txt))*.
-
-## Using nodemon as a module
-
-Please see [doc/requireable.md](doc/requireable.md)
-
-## Using nodemon as child process
-
-Please see [doc/events.md](doc/events.md#Using_nodemon_as_child_process)
-
-## Running non-node scripts
-
-nodemon can also be used to execute and monitor other programs. nodemon will read the file extension of the script being run and monitor that extension instead of `.js` if there's no `nodemon.json`:
-
-```bash
-nodemon --exec "python -v" ./app.py
-```
-
-Now nodemon will run `app.py` with python in verbose mode (note that if you're not passing args to the exec program, you don't need the quotes), and look for new or modified files with the `.py` extension.
-
-### Default executables
-
-Using the `nodemon.json` config file, you can define your own default executables using the `execMap` property. This is particularly useful if you're working with a language that isn't supported by default by nodemon.
-
-To add support for nodemon to know about the `.pl` extension (for Perl), the `nodemon.json` file would add:
-
-```json
-{
-  "execMap": {
-    "pl": "perl"
-  }
-}
-```
-
-Now running the following, nodemon will know to use `perl` as the executable:
-
-```bash
-nodemon script.pl
-```
-
-It's generally recommended to use the global `nodemon.json` to add your own `execMap` options. However, if there's a common default that's missing, this can be merged in to the project so that nodemon supports it by default, by changing [default.js](https://github.com/remy/nodemon/blob/master/lib/config/defaults.js) and sending a pull request.
-
-## Monitoring multiple directories
-
-By default nodemon monitors the current working directory. If you want to take control of that option, use the `--watch` option to add specific paths:
-
-```bash
-nodemon --watch app --watch libs app/server.js
-```
-
-Now nodemon will only restart if there are changes in the `./app` or `./libs` directory. By default nodemon will traverse sub-directories, so there's no need in explicitly including sub-directories.
-
-Nodemon also supports unix globbing, e.g `--watch './lib/*'`. The globbing pattern must be quoted. For advanced globbing, [see `picomatch` documentation](https://github.com/micromatch/picomatch#advanced-globbing), the library that nodemon uses through `chokidar` (which in turn uses it through `anymatch`).
-
-## Specifying extension watch list
-
-By default, nodemon looks for files with the `.js`, `.mjs`, `.coffee`, `.litcoffee`, and `.json` extensions. If you use the `--exec` option and monitor `app.py` nodemon will monitor files with the extension of `.py`. However, you can specify your own list with the `-e` (or `--ext`) switch like so:
-
-```bash
-nodemon -e js,pug
-```
-
-Now nodemon will restart on any changes to files in the directory (or subdirectories) with the extensions `.js`, `.pug`.
-
-## Ignoring files
-
-By default, nodemon will only restart when a `.js` JavaScript file changes. In some cases you will want to ignore some specific files, directories or file patterns, to prevent nodemon from prematurely restarting your application.
-
-This can be done via the command line:
-
-```bash
-nodemon --ignore lib/ --ignore tests/
-```
-
-Or specific files can be ignored:
-
-```bash
-nodemon --ignore lib/app.js
-```
-
-Patterns can also be ignored (but be sure to quote the arguments):
-
-```bash
-nodemon --ignore 'lib/*.js'
-```
-
-**Important** the ignore rules are patterns matched to the full absolute path, and this determines how many files are monitored. If using a wild card glob pattern, it needs to be used as `**` or omitted entirely. For example, `nodemon --ignore '**/test/**'` will work, whereas `--ignore '*/test/*'` will not.
-
-Note that by default, nodemon will ignore the `.git`, `node_modules`, `bower_components`, `.nyc_output`, `coverage` and `.sass-cache` directories and *add* your ignored patterns to the list. If you want to indeed watch a directory like `node_modules`, you need to [override the underlying default ignore rules](https://github.com/remy/nodemon/blob/master/faq.md#overriding-the-underlying-default-ignore-rules).
-
-## Application isn't restarting
-
-In some networked environments (such as a container running nodemon reading across a mounted drive), you will need to use the `legacyWatch: true` which enables Chokidar's polling.
-
-Via the CLI, use either `--legacy-watch` or `-L` for short:
-
-```bash
-nodemon -L
-```
-
-Though this should be a last resort as it will poll every file it can find.
-
-## Delaying restarting
-
-In some situations, you may want to wait until a number of files have changed. The timeout before checking for new file changes is 1 second. If you're uploading a number of files and it's taking some number of seconds, this could cause your app to restart multiple times unnecessarily.
-
-To add an extra throttle, or delay restarting, use the `--delay` command:
-
-```bash
-nodemon --delay 10 server.js
-```
-
-For more precision, milliseconds can be specified.  Either as a float:
-
-```bash
-nodemon --delay 2.5 server.js
-```
-
-Or using the time specifier (ms):
-
-```bash
-nodemon --delay 2500ms server.js
-```
-
-The delay figure is number of seconds (or milliseconds, if specified) to delay before restarting. So nodemon will only restart your app the given number of seconds after the *last* file change.
-
-If you are setting this value in `nodemon.json`, the value will always be interpreted in milliseconds. E.g., the following are equivalent:
-
-```bash
-nodemon --delay 2.5
-
-{
-  "delay": 2500
-}
-```
-
-## Gracefully reloading down your script
-
-It is possible to have nodemon send any signal that you specify to your application.
-
-```bash
-nodemon --signal SIGHUP server.js
-```
-
-Your application can handle the signal as follows.
-
-```js
-process.on("SIGHUP", function () {
-  reloadSomeConfiguration();
-  process.kill(process.pid, "SIGTERM");
-})
-```
-
-Please note that nodemon will send this signal to every process in the process tree.
-
-If you are using `cluster`, then each workers (as well as the master) will receive the signal. If you wish to terminate all workers on receiving a `SIGHUP`, a common pattern is to catch the `SIGHUP` in the master, and forward `SIGTERM` to all workers, while ensuring that all workers ignore `SIGHUP`.
-
-```js
-if (cluster.isMaster) {
-  process.on("SIGHUP", function () {
-    for (const worker of Object.values(cluster.workers)) {
-      worker.process.kill("SIGTERM");
-    }
-  });
-} else {
-  process.on("SIGHUP", function() {})
-}
-```
-
-## Controlling shutdown of your script
-
-nodemon sends a kill signal to your application when it sees a file update. If you need to clean up on shutdown inside your script you can capture the kill signal and handle it yourself.
-
-The following example will listen once for the `SIGUSR2` signal (used by nodemon to restart), run the clean up process and then kill itself for nodemon to continue control:
-
-```js
-// important to use `on` and not `once` as nodemon can re-send the kill signal
-process.on('SIGUSR2', function () {
-  gracefulShutdown(function () {
-    process.kill(process.pid, 'SIGTERM');
-  });
-});
-```
-
-Note that the `process.kill` is *only* called once your shutdown jobs are complete. Hat tip to [Benjie Gillam](http://www.benjiegillam.com/2011/08/node-js-clean-restart-and-faster-development-with-nodemon/) for writing this technique up.
-
-## Triggering events when nodemon state changes
-
-If you want growl like notifications when nodemon restarts or to trigger an action when an event happens, then you can either `require` nodemon or add event actions to your `nodemon.json` file.
-
-For example, to trigger a notification on a Mac when nodemon restarts, `nodemon.json` looks like this:
-
-```json
-{
-  "events": {
-    "restart": "osascript -e 'display notification \"app restarted\" with title \"nodemon\"'"
-  }
-}
-```
-
-A full list of available events is listed on the [event states wiki](https://github.com/remy/nodemon/wiki/Events#states). Note that you can bind to both states and messages.
-
-## Pipe output to somewhere else
-
-```js
-nodemon({
-  script: ...,
-  stdout: false // important: this tells nodemon not to output to console
-}).on('readable', function() { // the `readable` event indicates that data is ready to pick up
-  this.stdout.pipe(fs.createWriteStream('output.txt'));
-  this.stderr.pipe(fs.createWriteStream('err.txt'));
-});
-```
-
-## Using nodemon in your gulp workflow
-
-Check out the [gulp-nodemon](https://github.com/JacksonGariety/gulp-nodemon) plugin to integrate nodemon with the rest of your project's gulp workflow.
-
-## Using nodemon in your Grunt workflow
-
-Check out the [grunt-nodemon](https://github.com/ChrisWren/grunt-nodemon) plugin to integrate nodemon with the rest of your project's grunt workflow.
-
-## Pronunciation
-
-> nodemon, is it pronounced: node-mon, no-demon or node-e-mon (like pokémon)?
-
-Well...I've been asked this many times before. I like that I've been asked this before. There's been bets as to which one it actually is.
-
-The answer is simple, but possibly frustrating. I'm not saying (how I pronounce it). It's up to you to call it as you like. All answers are correct :)
-
-## Design principles
-
-- Fewer flags is better
-- Works across all platforms
-- Fewer features
-- Let individuals build on top of nodemon
-- Offer all CLI functionality as an API
-- Contributions must have and pass tests
-
-Nodemon is not perfect, and CLI arguments has sprawled beyond where I'm completely happy, but perhaps it can be reduced a little one day.
-
-## FAQ
-
-See the [FAQ](https://github.com/remy/nodemon/blob/master/faq.md) and please add your own questions if you think they would help others.
-
-## Backers
-
-Thank you to all [our backers](https://opencollective.com/nodemon#backer)! 🙏
-
-[![nodemon backers](https://opencollective.com/nodemon/backers.svg?width=890)](https://opencollective.com/nodemon#backers)
-
-## Sponsors
-
-Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Sponsor this project today ❤️](https://opencollective.com/nodemon#sponsor)
-
-<div style="overflow: hidden; margin-bottom: 80px;"><!--oc--><a title='buy instagram followers on skweezer.net today' data-id='532050' data-tier='0' href='https://skweezer.net/buy-instagram-followers'><img alt='buy instagram followers on skweezer.net today' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/b0ddcb1b-9054-4220-8d72-05131b28a2bb/logo-skweezer-icon.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Netpositive' data-id='162674' data-tier='1' href='https://najlepsibukmacherzy.pl/ranking-legalnych-bukmacherow/'><img alt='Netpositive' src='https://opencollective-production.s3.us-west-1.amazonaws.com/52acecf0-608a-11eb-b17f-5bca7c67fe7b.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='KasynoHEX' data-id='177376' data-tier='1' href='https://pl.polskiekasynohex.org/'><img alt='KasynoHEX' src='https://opencollective-production.s3.us-west-1.amazonaws.com/2bb0d6e0-99c8-11ea-9349-199aa0d5d24a.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Casinoonlineaams.com' data-id='198634' data-tier='1' href='https://www.casinoonlineaams.com'><img alt='Casinoonlineaams.com' src='https://opencollective-production.s3.us-west-1.amazonaws.com/61bcf1d0-43ce-11ed-b562-6bf567fce1fd.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Best online casinos not on GamStop in the UK' data-id='243140' data-tier='1' href='https://casino-wise.com/'><img alt='Best online casinos not on GamStop in the UK' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/f889d209-a931-4c06-a529-fe1f86c411bf/casino-wise-logo.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='TheCasinoDB' data-id='270835' data-tier='1' href='https://www.thecasinodb.com'><img alt='TheCasinoDB' src='https://logo.clearbit.com/thecasinodb.com' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='inkedin' data-id='305884' data-tier='1' href='https://inkedin.com'><img alt='inkedin' src='https://logo.clearbit.com/inkedin.com' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Goread.io' data-id='320564' data-tier='1' href='https://goread.io/buy-instagram-followers'><img alt='Goread.io' src='https://opencollective-production.s3.us-west-1.amazonaws.com/7d1302a0-0f33-11ed-a094-3dca78aec7cd.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Best Australian online casinos. Reviewed by Correct Casinos.' data-id='322445' data-tier='1' href='https://www.correctcasinos.com/australian-online-casinos/'><img alt='Best Australian online casinos. Reviewed by Correct Casinos.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/fef95200-1551-11ed-ba3f-410c614877c8.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='' data-id='326865' data-tier='1' href='https://www.uudetkasinot.com'><img alt='' src='https://opencollective-production.s3.us-west-1.amazonaws.com/b6055950-df00-11eb-9caa-b58f40adecd5.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Do My Online Class - NoNeedToStudy.com' data-id='327241' data-tier='1' href='https://www.noneedtostudy.com/take-my-online-class/'><img alt='Do My Online Class - NoNeedToStudy.com' src='https://user-images.githubusercontent.com/13700/187039696-e2d8cd59-8b4e-438f-a052-69095212427d.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Slotmachineweb.com' data-id='329195' data-tier='1' href='https://www.slotmachineweb.com/'><img alt='Slotmachineweb.com' src='https://opencollective-production.s3.us-west-1.amazonaws.com/172f9eb0-22c2-11ed-a0b5-97427086b4aa.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Website dedicated to finding the best and safest licensed online casinos in India' data-id='342390' data-tier='1' href='https://www.ghotala.com/'><img alt='Website dedicated to finding the best and safest licensed online casinos in India' src='https://opencollective-production.s3.us-west-1.amazonaws.com/75afa9e0-4ac6-11ed-8d6a-fdcc8c0d0736.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='nongamstopcasinos.net' data-id='367236' data-tier='1' href='https://uk.nongamstopcasinos.net/'><img alt='nongamstopcasinos.net' src='https://opencollective-production.s3.us-west-1.amazonaws.com/fb8b5ba0-3904-11ed-8516-edd7b7687a36.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Scommesse777' data-id='370216' data-tier='1' href='https://www.scommesse777.com/'><img alt='Scommesse777' src='https://opencollective-production.s3.us-west-1.amazonaws.com/c0346cb0-7ad4-11ed-a9cf-49dc3536976e.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Buy Instagram Likes' data-id='411448' data-tier='1' href='https://poprey.com/'><img alt='Buy Instagram Likes' src='https://opencollective-production.s3.us-west-1.amazonaws.com/fe650970-c21c-11ec-a499-b55e54a794b4.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Norway&apos;s biggest and most reliable online casino portal' data-id='422431' data-tier='1' href='https://www.nettcasino.com/'><img alt='Norway&apos;s biggest and most reliable online casino portal' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/5d739e1a-7813-489e-ab82-697daff8bf12/nettcasino.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='OnlineCasinosSpelen' data-id='423738' data-tier='1' href='https://onlinecasinosspelen.com'><img alt='OnlineCasinosSpelen' src='https://logo.clearbit.com/onlinecasinosspelen.com' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Beoordelen van nieuwe online casino&apos;s 2023' data-id='424449' data-tier='1' href='https://Nieuwe-Casinos.net'><img alt='Beoordelen van nieuwe online casino&apos;s 2023' src='https://logo.clearbit.com/Nieuwe-Casinos.net' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='CasinoZonderRegistratie.net - Nederlandse Top Casino&apos;s' data-id='424450' data-tier='1' href='https://casinoZonderregistratie.net/'><img alt='CasinoZonderRegistratie.net - Nederlandse Top Casino&apos;s' src='https://opencollective-production.s3.us-west-1.amazonaws.com/aeb624c0-7ae7-11ed-8d0e-bda59436695a.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='OnlineCasinoProfy is your guide to the world of gambling.' data-id='426813' data-tier='1' href='https://polskiekasynaonline24.com/'><img alt='OnlineCasinoProfy is your guide to the world of gambling.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/f8b0f6de-6ab5-4860-9688-709fe03873d3/2%201%20%282%29.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Famoid is a digital marketing agency that specializes in social media services and tools.' data-id='434604' data-tier='1' href='https://famoid.com/'><img alt='Famoid is a digital marketing agency that specializes in social media services and tools.' src='https://logo.clearbit.com/famoid.com' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='ігрові автомати беткінг' data-id='443264' data-tier='1' href='https://betking.com.ua/games/all-slots/'><img alt='ігрові автомати беткінг' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/94601d07-3205-4c60-9c2d-9b8194dbefb7/skg-blue.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='We are the leading Nearshore Technology Solutions company. We architect and engineer scalable and high-performing software solutions.' data-id='452424' data-tier='1' href='https://www.bairesdev.com/sponsoring-open-source-projects/'><img alt='We are the leading Nearshore Technology Solutions company. We architect and engineer scalable and high-performing software solutions.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/dc38bc3b-7430-4cf7-9b77-36467eb92915/logo8.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Buy real Instagram followers from Twicsy starting at only $2.97. Twicsy has been voted the best site to buy followers from the likes of US Magazine.' data-id='453050' data-tier='1' href='https://twicsy.com/buy-instagram-followers'><img alt='Buy real Instagram followers from Twicsy starting at only $2.97. Twicsy has been voted the best site to buy followers from the likes of US Magazine.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/f07b6f83-d0ed-43c6-91ae-ec8fa90512cd/twicsy-followers.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='SocialWick offers the best Instagram Followers in the market. If you are looking to boost your organic growth, buy Instagram followers from SocialWick' data-id='462750' data-tier='1' href='https://www.socialwick.com/instagram/followers'><img alt='SocialWick offers the best Instagram Followers in the market. If you are looking to boost your organic growth, buy Instagram followers from SocialWick' src='https://logo.clearbit.com/socialwick.com' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Online United States Casinos' data-id='466446' data-tier='1' href='https://www.onlineunitedstatescasinos.com/'><img alt='Online United States Casinos' src='https://logo.clearbit.com/onlineunitedstatescasinos.com' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Aviators' data-id='471843' data-tier='1' href='https://aviators.com.br'><img alt='Aviators' src='https://github-production-user-asset-6210df.s3.amazonaws.com/13700/277616726-33b554c8-24e0-4570-b8ed-293fb2ab2448.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Online iGaming platform with reliable and trusted reviews.' data-id='473786' data-tier='1' href='https://onlinecasinohex.ph/'><img alt='Online iGaming platform with reliable and trusted reviews.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/b19cbf10-3a5e-11ed-9713-c7c7fc5beda8.svg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Looking to boost your YouTube channel? Buy YouTube subscribers with Views4You and watch your audience grow!' data-id='493616' data-tier='1' href='https://views4you.com/buy-youtube-subscribers/'><img alt='Looking to boost your YouTube channel? Buy YouTube subscribers with Views4You and watch your audience grow!' src='https://logo.clearbit.com/views4you.com' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Buy Telegram Members' data-id='501897' data-tier='1' href='https://buycheapestfollowers.com/buy-telegram-channel-members'><img alt='Buy Telegram Members' src='https://github-production-user-asset-6210df.s3.amazonaws.com/13700/286696172-747dca05-a1e8-4d93-a9e9-95054d1566df.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='We review the entire iGaming industry from A to Z' data-id='504258' data-tier='1' href='https://casinolandia.com'><img alt='We review the entire iGaming industry from A to Z' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/5f858add-77f1-47a2-b577-39eecb299c8c/Logo264.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='aussiecasinoreviewer.com' data-id='508822' data-tier='1' href='https://aussiecasinoreviewer.com/'><img alt='aussiecasinoreviewer.com' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/6ffb5045-e33e-4314-a891-5286fa4a220f/Aussiecasinoreviewer%20logo%20(2)%20(2).jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='MEGAFAMOUS.com' data-id='509686' data-tier='1' href='https://megafamous.com/buy-automatic-instagram-likes'><img alt='MEGAFAMOUS.com' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/c0af8a5d-8fe7-4925-b357-cee797841913/MEGAFAMOUS%20Instagram%20Likes%20.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='PopularityBazaar helps you quickly grow your social media accounts. Buy 100% real likes, followers, views, comments, and more to kickstart your online presence.' data-id='509894' data-tier='1' href='https://popularitybazaar.com/instagram-likes/'><img alt='PopularityBazaar helps you quickly grow your social media accounts. Buy 100% real likes, followers, views, comments, and more to kickstart your online presence.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/a2878e26-3710-453f-9a41-80eeee60a2cc/Group%201.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Non-GamStop NonStop Casino' data-id='510457' data-tier='1' href='https://uk.nonstopcasino.org/non-gamstop-casinos/'><img alt='Non-GamStop NonStop Casino' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/0330c03a-71ea-477c-a4d8-7eb4795d6120/non-stop-casino.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='philippinescasinos.ph' data-id='512007' data-tier='1' href='https://philippinescasinos.ph/gcash/'><img alt='philippinescasinos.ph' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/b758f1b0-3211-464b-a19e-95e2a5f4fa22/PhilippinesCasinos%20bigger.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Incognito' data-id='512350' data-tier='1' href='https://www.outlookindia.com/plugin-play/casinos-not-on-gamstop-uk-news-302214'><img alt='Incognito' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/fdf584c2-defe-4025-ab26-15e5c5ff607e/Non%20gamstop%20casino%20Outlookindia.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='NonGamStopBets Casinos not on GamStop' data-id='515480' data-tier='1' href='https://www.nongamstopbets.com/casinos-not-on-gamstop/'><img alt='NonGamStopBets Casinos not on GamStop' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/6c22601d-6a3f-4370-91dd-a9797887372a/nongamstopbets.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='UpGrow is the Best Instagram Growth Service in 2024. Get more real Instagram followers with our AI-powered growth engine to get 10x faster results. ' data-id='519002' data-tier='1' href='https://www.upgrow.com/'><img alt='UpGrow is the Best Instagram Growth Service in 2024. Get more real Instagram followers with our AI-powered growth engine to get 10x faster results. ' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/63ab7268-5ce4-4e61-b9f1-93a1bd89cd3e/ms-icon-310x310.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Analysis of payment methods for use in the iGaming' data-id='524205' data-tier='1' href='https://payidpokies.net/'><img alt='Analysis of payment methods for use in the iGaming' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/75b4e83e-ae6a-4e65-b2aa-a67d7daec775/PayIDPokies-com.webp' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='CryptoCasinos.online' data-id='525119' data-tier='1' href='https://cryptocasinos.online/'><img alt='CryptoCasinos.online' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/97712948-3b1b-4026-a109-257d879baa23/CryptoCasinos.Online-FBcover18.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='No deposit casino promo Codes 2024 - The best online Casinos websites. No deposit bonus codes, Free Spins and Promo Codes. Stake, Roobet, Jackpotcity and more.' data-id='540890' data-tier='1' href='https://www.ownedcore.com/casino'><img alt='No deposit casino promo Codes 2024 - The best online Casinos websites. No deposit bonus codes, Free Spins and Promo Codes. Stake, Roobet, Jackpotcity and more.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/8bd4b78c-95e2-4c41-b4f4-d7fd6c0e12cd/logo4-e6140c27.webp' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Online casino.' data-id='541128' data-tier='1' href='https://www.fruityking.co.nz'><img alt='Online casino.' src='https://logo.clearbit.com/fruityking.co.nz' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Listing no deposit bonus offers from various internet sites .' data-id='546391' data-tier='1' href='https://www.nodepositcasinobonus.org/'><img alt='Listing no deposit bonus offers from various internet sites .' src='https://logo.clearbit.com/nodepositcasinobonus.org' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Fortune Tiger' data-id='551192' data-tier='1' href='https://fortune-tiger-br.com/'><img alt='Fortune Tiger' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/88904f4a-f997-49e8-8fd4-5068acc85a98/fortune-tiger-slot-281-img-2.webp' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='SidesMedia' data-id='558019' data-tier='1' href='https://sidesmedia.com'><img alt='SidesMedia' src='https://logo.clearbit.com/sidesmedia.com' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Find the social proof you need to reach your audience! Boost conversions. Quickly buy Twitter Followers &amp; more with no sign-up. Taking you to the next' data-id='568449' data-tier='1' href='https://Bulkoid.com/buy-twitter-followers'><img alt='Find the social proof you need to reach your audience! Boost conversions. Quickly buy Twitter Followers &amp; more with no sign-up. Taking you to the next' src='https://logo.clearbit.com/Bulkoid.com' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Boost your social media presence effortlessly with top-quality Instagram and TikTok followers and likes.' data-id='579911' data-tier='1' href='https://leofame.com/buy-instagram-followers'><img alt='Boost your social media presence effortlessly with top-quality Instagram and TikTok followers and likes.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/186c0e19-b195-4228-901a-ab1b70d63ee5/WhatsApp%20Image%202024-06-21%20at%203.50.43%20AM.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Social Media Management and all kinds of followers' data-id='587050' data-tier='1' href='https://www.socialfollowers.uk/buy-tiktok-followers/'><img alt='Social Media Management and all kinds of followers' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/8941f043-5d00-4e33-a1fd-f2d27ca54963/Social%20Followers%20Uk%20logo%20black.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Trusted last mile route planning and route optimization' data-id='590147' data-tier='1' href='https://route4me.com/'><img alt='Trusted last mile route planning and route optimization' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/237386c3-48a2-47c6-97ac-5f888cdb4cda/Route4MeIconLogo.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Betwinner is an online bookmaker offering sports betting, casino games, and more.' data-id='594768' data-tier='1' href='https://guidebook.betwinner.com/'><img alt='Betwinner is an online bookmaker offering sports betting, casino games, and more.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/82cab29a-7002-4924-83bf-2eecb03d07c4/0x0.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Help users to find best and cheapest site to buy Instagram Followers' data-id='598908' data-tier='1' href='https://www.reddit.com/r/TikTokExpert/comments/1dpyujh/whats_the_best_site_to_buy_instagram_likes_views/'><img alt='Help users to find best and cheapest site to buy Instagram Followers' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/263abc3a-0841-4694-b24a-788460391613/communityIcon_66mltiw57b4d1.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='At Buzzoid, you can buy Instagram followers quickly, safely, and easily with just a few clicks. Rated world&apos;s #1 IG service since 2012.' data-id='602382' data-tier='1' href='https://buzzoid.com/buy-instagram-followers/'><img alt='At Buzzoid, you can buy Instagram followers quickly, safely, and easily with just a few clicks. Rated world&apos;s #1 IG service since 2012.' src='https://logo.clearbit.com/buzzoid.com' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='BonusBezDepozytu' data-id='603579' data-tier='1' href='https://bonusbezdepozytu.org/'><img alt='BonusBezDepozytu' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/ce285388-bc43-41f5-b140-e39e78d44050/Bonus%20Bez%20Depozytu%20Logo.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Tutti i siti di scommesse non AAMS' data-id='605485' data-tier='1' href='https://bsc.news/post/siti-scommesse-non-aams'><img alt='Tutti i siti di scommesse non AAMS' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/c596141a-e5a0-4e87-98a7-58cf136ec3eb/siti%20non%20aams.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Zamsino.com' data-id='608094' data-tier='1' href='https://zamsino.com/'><img alt='Zamsino.com' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/e3e99af5-a024-4d85-8594-8fd22e506bc9/Zamsino.com%20Logo.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Graming offer top-notch Instagram followers at the best prices!' data-id='608370' data-tier='1' href='https://graming.com/buy-instagram-followers/'><img alt='Graming offer top-notch Instagram followers at the best prices!' src='https://logo.clearbit.com/graming.com' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='kasyno online blik' data-id='609769' data-tier='1' href='https://top.kasynos.online/metody-platnosci/blik/'><img alt='kasyno online blik' src='https://logo.clearbit.com/kasynos.online' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Feedthebot is an informative resource with free seo tools designed to help webmasters, SEO specialists, marketers, and entrepreneurs navigate and bett' data-id='612702' data-tier='1' href='https://www.feedthebot.org/'><img alt='Feedthebot is an informative resource with free seo tools designed to help webmasters, SEO specialists, marketers, and entrepreneurs navigate and bett' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/613fd973-b367-41bb-b253-34d2ebf877e8/logo-feedthebot(2).png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Social media service' data-id='613887' data-tier='1' href='https://www.fbpostlikes.com/buy-instagram-followers.html'><img alt='Social media service' src='https://logo.clearbit.com/fbpostlikes.com' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Find the social proof you need to reach your audience! Boost conversions. Quickly buy Twitter Followers &amp; more with no sign-up. Taking you to the next' data-id='615986' data-tier='1' href='https://growthoid.com/buy-twitter-followers/'><img alt='Find the social proof you need to reach your audience! Boost conversions. Quickly buy Twitter Followers &amp; more with no sign-up. Taking you to the next' src='https://logo.clearbit.com/growthoid.com' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Playfortuneforfun.com' data-id='617861' data-tier='1' href='https://playfortuneforfun.com/'><img alt='Playfortuneforfun.com' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/15dc8611-e11e-4fdf-b80e-7dbddb4dc3db/PFFF.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Reviewing and comparing online casinos available to Finnish players. In addition, we publish relevant news and blog posts about the world of iGaming.' data-id='620398' data-tier='1' href='https://uusimmatkasinot.com/'><img alt='Reviewing and comparing online casinos available to Finnish players. In addition, we publish relevant news and blog posts about the world of iGaming.' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/d5326d0f-3cde-41f4-b480-78ef8a2fb015/Uusimmatkasinot_head_siteicon.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Jabka Skin' data-id='634777' data-tier='1' href='https://jabka.skin/ru/'><img alt='Jabka Skin' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/4c272505-2e0b-4e93-9693-c7d5c07ea0c6/IMG_0161.png' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='Онлайн казино та БК (ставки на спорт) в Україні' data-id='638974' data-tier='1' href='https://betking.com.ua/'><img alt='Онлайн казино та БК (ставки на спорт) в Україні' src='https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/08587758-582c-4136-aba5-2519230960d3/betking.jpg' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a>
-<a title='' data-id='Youraffe' data-tier='1' href='https://zimplerkasinot.net/'><img alt='' src='https://github.com/user-attachments/assets/cbeddc6e-827a-41eb-b669-a0a4575d068a' style='object-fit: contain; float: left; margin:12px' height='120' width='120'></a><!--oc-->
-</div>
-
-Please note that links to the sponsors above are not direct endorsements nor affiliated with any of contributors of the nodemon project.
-
-# License
-
-MIT [http://rem.mit-license.org](http://rem.mit-license.org)
diff --git a/node_modules/nodemon/bin/nodemon.js b/node_modules/nodemon/bin/nodemon.js
deleted file mode 100644
index 3d490f140dd264f98dfb50ab820456c88fe92a64..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/bin/nodemon.js
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env node
-
-const cli = require('../lib/cli');
-const nodemon = require('../lib/');
-const options = cli.parse(process.argv);
-
-nodemon(options);
-
-const fs = require('fs');
-
-// checks for available update and returns an instance
-const pkg = JSON.parse(fs.readFileSync(__dirname + '/../package.json'));
-
-if (pkg.version.indexOf('0.0.0') !== 0 && options.noUpdateNotifier !== true) {
-  require('simple-update-notifier')({ pkg });
-}
diff --git a/node_modules/nodemon/bin/windows-kill.exe b/node_modules/nodemon/bin/windows-kill.exe
deleted file mode 100644
index 98d7d7f7ed95fd8662f82dda3d16203f0d76e580..0000000000000000000000000000000000000000
Binary files a/node_modules/nodemon/bin/windows-kill.exe and /dev/null differ
diff --git a/node_modules/nodemon/doc/cli/authors.txt b/node_modules/nodemon/doc/cli/authors.txt
deleted file mode 100644
index 6c77a12aeee2f68df8895db02c3d4b24eb489396..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/doc/cli/authors.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-
- Remy Sharp - author and maintainer
-    https://github.com/remy
-    https://twitter.com/rem
-
- Contributors: https://github.com/remy/nodemon/graphs/contributors ❤︎
-
- Please help make nodemon better: https://github.com/remy/nodemon/
diff --git a/node_modules/nodemon/doc/cli/config.txt b/node_modules/nodemon/doc/cli/config.txt
deleted file mode 100644
index 5de9bba5745c38ec8b756a934ada8bce90ef6b27..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/doc/cli/config.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-
-  Typically the options to control nodemon are passed in via the CLI and are
-  listed under: nodemon --help options
-
-  nodemon can also be configured via a local and global config file:
-
-  * $HOME/nodemon.json
-  * $PWD/nodemon.json OR --config <file>
-  * nodemonConfig in package.json
-
-  All config options in the .json file map 1-to-1 with the CLI options, so a
-  config could read as:
-
-    {
-      "ext": "*.pde",
-      "verbose": true,
-      "exec": "processing --sketch=game --run"
-    }
-
-  There are a limited number of variables available in the config (since you
-  could use backticks on the CLI to use a variable, backticks won't work in
-  the .json config).
-
-  * {{pwd}} - the current directory
-  * {{filename}} - the filename you pass to nodemon
-
-  For example:
-
-    {
-      "ext": "*.pde",
-      "verbose": true,
-      "exec": "processing --sketch={{pwd}} --run"
-    }
-
-  The global config file is useful for setting up default executables
-  instead of repeating the same option in each of your local configs:
-
-    {
-      "verbose": true,
-      "execMap": {
-        "rb": "ruby",
-        "pde": "processing --sketch={{pwd}} --run"
-      }
-    }
diff --git a/node_modules/nodemon/doc/cli/help.txt b/node_modules/nodemon/doc/cli/help.txt
deleted file mode 100644
index 7ba4ff2a393f67640413a75cc7ff066922b1b956..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/doc/cli/help.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-  Usage: nodemon [options] [script.js] [args]
-
-  Options:
-
-  --config file ............ alternate nodemon.json config file to use
-  -e, --ext ................ extensions to look for, ie. js,pug,hbs.
-  -x, --exec app ........... execute script with "app", ie. -x "python -v".
-  -w, --watch path ......... watch directory "path" or files. use once for
-                             each directory or file to watch.
-  -i, --ignore ............. ignore specific files or directories.
-  -V, --verbose ............ show detail on what is causing restarts.
-  -- <your args> ........... to tell nodemon stop slurping arguments.
-
-  Note: if the script is omitted, nodemon will try to read "main" from
-  package.json and without a nodemon.json, nodemon will monitor .js, .mjs, .coffee,
-  .litcoffee, and .json by default.
-
-  For advanced nodemon configuration use nodemon.json: nodemon --help config
-  See also the sample: https://github.com/remy/nodemon/wiki/Sample-nodemon.json
-
-  Examples:
-
-  $ nodemon server.js
-  $ nodemon -w ../foo server.js apparg1 apparg2
-  $ nodemon --exec python app.py
-  $ nodemon --exec "make build" -e "styl hbs"
-  $ nodemon app.js -- --config # pass config to app.js
-
-  \x1B[1mAll options are documented under: \x1B[4mnodemon --help options\x1B[0m
diff --git a/node_modules/nodemon/doc/cli/logo.txt b/node_modules/nodemon/doc/cli/logo.txt
deleted file mode 100644
index 150f97f591cc291a3bf128d4ab25db9679ab0e4e..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/doc/cli/logo.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-    ;                                 ;
-    kO.                              x0
-    KMX,          .:x0kc.          'KMN
-    0MMM0:     'oKMMMMMMMXd,     ;OMMMX
-    oMMMMMWKOONMMMMMMMMMMMMMWOOKWMMMMMx
-     OMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMK.
-    .oWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd.
-    KMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN
-    KMMMMMMMMMMMMMMW0k0WMMMMMMMMMMMMMMW
-    KMMMMMMMMMMMNk:.    :xNMMMMMMMMMMMW
-    KMMMMMMMMMMK           OMMMMMMMMMMW
-    KMMMMMMMMMMO           xMMMMMMMMMMN
-    KMMMMMMMMMMO           xMMMMMMMMMMN
-    KMMMMMMMMMMO           xMMMMMMMMMMN
-    KMMMMMMMMMMO           xMMMMMMMMMMN
-    KMMMMMMMMMMO           xMMMMMMMMMMN
-    KMMMMMMMMMNc           ;NMMMMMMMMMN
-    KMMMMMW0o'               .lOWMMMMMN
-    KMMKd;                       ,oKMMN
-    kX:                             ,K0
\ No newline at end of file
diff --git a/node_modules/nodemon/doc/cli/options.txt b/node_modules/nodemon/doc/cli/options.txt
deleted file mode 100644
index 598ae63ba310e212a9cac7b2f5449cbd91e9a34f..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/doc/cli/options.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-
-Configuration
-  --config <file> .......... alternate nodemon.json config file to use
-  --exitcrash .............. exit on crash, allows nodemon to work with other watchers
-  -i, --ignore ............. ignore specific files or directories
-  --no-colors .............. disable color output
-  --signal <signal> ........ use specified kill signal instead of default (ex. SIGTERM)
-  -w, --watch path ......... watch directory "dir" or files. use once for each
-                             directory or file to watch
-  --no-update-notifier ..... opt-out of update version check
-
-Execution
-  -C, --on-change-only ..... execute script on change only, not startup
-  --cwd <dir> .............. change into <dir> before running the script
-  -e, --ext ................ extensions to look for, ie. "js,pug,hbs"
-  -I, --no-stdin ........... nodemon passes stdin directly to child process
-  --spawn .................. force nodemon to use spawn (over fork) [node only]
-  -x, --exec app ........... execute script with "app", ie. -x "python -v"
-  -- <your args> ........... to tell nodemon stop slurping arguments
-
-Watching
-  -d, --delay n ............ debounce restart for "n" seconds
-  -L, --legacy-watch ....... use polling to watch for changes (typically needed
-                             when watching over a network/Docker)
-  -P, --polling-interval ... combined with -L, milliseconds to poll for (default 100)
-
-Information
-  --dump ................... print full debug configuration
-  -h, --help ............... default help
-  --help <topic> ........... help on a specific feature. Try "--help topics"
-  -q, --quiet .............. minimise nodemon messages to start/stop only
-  -v, --version ............ current nodemon version
-  -V, --verbose ............ show detail on what is causing restarts
-
-
-> Note that any unrecognised arguments are passed to the executing command.
diff --git a/node_modules/nodemon/doc/cli/topics.txt b/node_modules/nodemon/doc/cli/topics.txt
deleted file mode 100644
index 9fe3e2b5996cbd408c82d28c3788de95aac0e530..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/doc/cli/topics.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-
-  options .................. show all available nodemon options
-  config ................... default config options using nodemon.json
-  authors .................. contributors to this project
-  logo ..................... <3
-  whoami ................... I, AM, NODEMON \o/
-
-  Please support https://github.com/remy/nodemon/
diff --git a/node_modules/nodemon/doc/cli/usage.txt b/node_modules/nodemon/doc/cli/usage.txt
deleted file mode 100644
index bca98b5e614e6f74f98e19b39384a8f694ae7370..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/doc/cli/usage.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-  Usage: nodemon [nodemon options] [script.js] [args]
-
-  See "nodemon --help" for more.
diff --git a/node_modules/nodemon/doc/cli/whoami.txt b/node_modules/nodemon/doc/cli/whoami.txt
deleted file mode 100644
index efc3382ef38e269516d61e813c49a8d4539688c9..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/doc/cli/whoami.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-__/\\\\\_____/\\\_______/\\\\\_______/\\\\\\\\\\\\_____/\\\\\\\\\\\\\\\__/\\\\____________/\\\\_______/\\\\\_______/\\\\\_____/\\\_
- _\/\\\\\\___\/\\\_____/\\\///\\\____\/\\\////////\\\__\/\\\///////////__\/\\\\\\________/\\\\\\_____/\\\///\\\____\/\\\\\\___\/\\\_
-  _\/\\\/\\\__\/\\\___/\\\/__\///\\\__\/\\\______\//\\\_\/\\\_____________\/\\\//\\\____/\\\//\\\___/\\\/__\///\\\__\/\\\/\\\__\/\\\_
-   _\/\\\//\\\_\/\\\__/\\\______\//\\\_\/\\\_______\/\\\_\/\\\\\\\\\\\_____\/\\\\///\\\/\\\/_\/\\\__/\\\______\//\\\_\/\\\//\\\_\/\\\_
-    _\/\\\\//\\\\/\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/\\\///////______\/\\\__\///\\\/___\/\\\_\/\\\_______\/\\\_\/\\\\//\\\\/\\\_
-     _\/\\\_\//\\\/\\\_\//\\\______/\\\__\/\\\_______\/\\\_\/\\\_____________\/\\\____\///_____\/\\\_\//\\\______/\\\__\/\\\_\//\\\/\\\_
-      _\/\\\__\//\\\\\\__\///\\\__/\\\____\/\\\_______/\\\__\/\\\_____________\/\\\_____________\/\\\__\///\\\__/\\\____\/\\\__\//\\\\\\_
-       _\/\\\___\//\\\\\____\///\\\\\/_____\/\\\\\\\\\\\\/___\/\\\\\\\\\\\\\\\_\/\\\_____________\/\\\____\///\\\\\/_____\/\\\___\//\\\\\_
-        _\///_____\/////_______\/////_______\////////////_____\///////////////__\///______________\///_______\/////_______\///_____\/////__
\ No newline at end of file
diff --git a/node_modules/nodemon/index.d.ts b/node_modules/nodemon/index.d.ts
deleted file mode 100644
index c8e4ec2479f4a5884f56159b8b40310be2ad4ace..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/index.d.ts
+++ /dev/null
@@ -1,125 +0,0 @@
-import type { WatchOptions } from 'chokidar'
-
-export type NodemonEventHandler =
-  | 'start'
-  | 'crash'
-  | 'exit'
-  | 'quit'
-  | 'restart'
-  | 'config:update'
-  | 'log'
-  | 'readable'
-  | 'stdout'
-  | 'stderr';
-
-export type NodemonEventListener = {
-  on(event: 'start' | 'crash' | 'readable', listener: () => void): Nodemon;
-  on(event: 'log', listener: (e: NodemonEventLog) => void): Nodemon;
-  on(event: 'stdout' | 'stderr', listener: (e: string) => void): Nodemon;
-  on(event: 'restart', listener: (e?: NodemonEventRestart) => void): Nodemon;
-  on(event: 'quit', listener: (e?: NodemonEventQuit) => void): Nodemon;
-  on(event: 'exit', listener: (e?: number) => void): Nodemon;
-  on(event: 'config:update', listener: (e?: NodemonEventConfig) => void): Nodemon;
-};
-
-export type Nodemon = {
-  removeAllListeners(event: NodemonEventHandler): Nodemon;
-  emit(type: NodemonEventHandler, event?: any): Nodemon;
-  reset(callback: Function): Nodemon;
-  restart(): Nodemon;
-  config: NodemonSettings;
-} & NodemonEventListener & {
-  [K in keyof NodemonEventListener as "addListener"]: NodemonEventListener[K];
-} & {
-  [K in keyof NodemonEventListener as "once"]: NodemonEventListener[K];
-};
-
-export type NodemonEventLog = {
-  /**
-    - detail: what you get with nodemon --verbose.
-    - status: subprocess starting, restarting.
-    - fail: is the subprocess crashing.
-    - error: is a nodemon system error.
-  */
-  type: 'detail' | 'log' | 'status' | 'error' | 'fail';
-  /** the plain text message */
-  message: string;
-  /** contains the terminal escape codes to add colour, plus the "[nodemon]" prefix */
-  colour: string;
-};
-
-export interface NodemonEventRestart {
-  matched?: {
-    result: string[];
-    total: number;
-  };
-}
-
-export type NodemonEventQuit = 143 | 130;
-
-export type NodemonEventConfig = {
-  run: boolean;
-  system: {
-    cwd: string;
-  };
-  required: boolean;
-  dirs: string[];
-  timeout: number;
-  options: NodemonConfig;
-  lastStarted: number
-  loaded: string[]
-  load: (settings: NodemonSettings, ready: (config: NodemonEventConfig) => void) => void
-  reset: () => void
-};
-
-export interface NodemonExecOptions {
-  script: string;
-  scriptPosition?: number;
-  args?: string[]
-  ext?: string; // "js,mjs" etc (should really support an array of strings, but I don't think it does right now)
-  exec?: string; // node, python, etc
-  execArgs?: string[]; // args passed to node, etc,
-  nodeArgs?: string[]; // args passed to node, etc,
-}
-
-export interface NodemonConfig {
-  /** restartable defaults to "rs" as a string the user enters */
-  restartable?: false | string;
-  colours?: boolean;
-  execMap?: { [key: string]: string };
-  ignoreRoot?: string[];
-  watch?: string[];
-  ignore?: string[];
-  stdin?: boolean;
-  runOnChangeOnly?: boolean;
-  verbose?: boolean;
-  signal?: string;
-  stdout?: boolean;
-  watchOptions?: WatchOptions;
-  help?: string
-  version?: boolean
-  cwd?: string
-  dump?: boolean
-  ignore?: string[]
-  watch?: string[]
-  monitor?: string[]
-  spawn?: boolean
-  noUpdateNotifier?: boolean
-  legacyWatch?: boolean
-  pollingInterval?: number
-  /** @deprecated as this is "on" by default */
-  js?: boolean
-  quiet?: boolean
-  configFile?: string
-  exitCrash?: boolean
-  execOptions?: NodemonExecOptions
-}
-
-export interface NodemonSettings extends NodemonConfig, NodemonExecOptions {
-  events?: { [key: string]: string };
-  env?: { [key: string]: string };
-}
-
-const nodemon: Nodemon = (settings: NodemonSettings): Nodemon => {};
-
-export = nodemon;
diff --git a/node_modules/nodemon/jsconfig.json b/node_modules/nodemon/jsconfig.json
deleted file mode 100644
index d77141cb5f4b08384f3a69650fd702e6d8f094a7..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/jsconfig.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "compilerOptions": {
-    "typeRoots": ["./index.d.ts", "./node_modules/@types"],
-    "checkJs": true
-  },
-  "exclude": ["node_modules"]
-}
diff --git a/node_modules/nodemon/lib/cli/index.js b/node_modules/nodemon/lib/cli/index.js
deleted file mode 100644
index bf9e80991e4e0a553866499b96877328a2b96042..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/cli/index.js
+++ /dev/null
@@ -1,49 +0,0 @@
-var parse = require('./parse');
-
-/**
- * Converts a string to command line args, in particular
- * groups together quoted values.
- * This is a utility function to allow calling nodemon as a required
- * library, but with the CLI args passed in (instead of an object).
- *
- * @param  {String} string
- * @return {Array}
- */
-function stringToArgs(string) {
-  var args = [];
-
-  var parts = string.split(' ');
-  var length = parts.length;
-  var i = 0;
-  var open = false;
-  var grouped = '';
-  var lead = '';
-
-  for (; i < length; i++) {
-    lead = parts[i].substring(0, 1);
-    if (lead === '"' || lead === '\'') {
-      open = lead;
-      grouped = parts[i].substring(1);
-    } else if (open && parts[i].slice(-1) === open) {
-      open = false;
-      grouped += ' ' + parts[i].slice(0, -1);
-      args.push(grouped);
-    } else if (open) {
-      grouped += ' ' + parts[i];
-    } else {
-      args.push(parts[i]);
-    }
-  }
-
-  return args;
-}
-
-module.exports = {
-  parse: function (argv) {
-    if (typeof argv === 'string') {
-      argv = stringToArgs(argv);
-    }
-
-    return parse(argv);
-  },
-};
\ No newline at end of file
diff --git a/node_modules/nodemon/lib/cli/parse.js b/node_modules/nodemon/lib/cli/parse.js
deleted file mode 100644
index 560cc71534e0439ae591ea994ab0338796565fb2..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/cli/parse.js
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
-
-nodemon is a utility for node, and replaces the use of the executable
-node. So the user calls `nodemon foo.js` instead.
-
-nodemon can be run in a number of ways:
-
-`nodemon` - tries to use package.json#main property to run
-`nodemon` - if no package, looks for index.js
-`nodemon app.js` - runs app.js
-`nodemon --arg app.js --apparg` - eats arg1, and runs app.js with apparg
-`nodemon --apparg` - as above, but passes apparg to package.json#main (or
-  index.js)
-`nodemon --debug app.js
-
-*/
-
-var fs = require('fs');
-var path = require('path');
-var existsSync = fs.existsSync || path.existsSync;
-
-module.exports = parse;
-
-/**
- * Parses the command line arguments `process.argv` and returns the
- * nodemon options, the user script and the executable script.
- *
- * @param  {Array<string> | string} argv full process arguments, including `node` leading arg
- * @return {Object} { options, script, args }
- */
-function parse(argv) {
-  if (typeof argv === 'string') {
-    argv = argv.split(' ');
-  }
-
-  var eat = function (i, args) {
-    if (i <= args.length) {
-      return args.splice(i + 1, 1).pop();
-    }
-  };
-
-  var args = argv.slice(2);
-  var script = null;
-  var nodemonOptions = { scriptPosition: null };
-
-  var nodemonOpt = nodemonOption.bind(null, nodemonOptions);
-  var lookForArgs = true;
-
-  // move forward through the arguments
-  for (var i = 0; i < args.length; i++) {
-    // if the argument looks like a file, then stop eating
-    if (!script) {
-      if (args[i] === '.' || existsSync(args[i])) {
-        script = args.splice(i, 1).pop();
-
-        // we capture the position of the script because we'll reinsert it in
-        // the right place in run.js:command (though I'm not sure we should even
-        // take it out of the array in the first place, but this solves passing
-        // arguments to the exec process for now).
-        nodemonOptions.scriptPosition = i;
-        i--;
-        continue;
-      }
-    }
-
-    if (lookForArgs) {
-      // respect the standard way of saying: hereafter belongs to my script
-      if (args[i] === '--') {
-        args.splice(i, 1);
-        nodemonOptions.scriptPosition = i;
-        // cycle back one argument, as we just ate this one up
-        i--;
-
-        // ignore all further nodemon arguments
-        lookForArgs = false;
-
-        // move to the next iteration
-        continue;
-      }
-
-      if (nodemonOpt(args[i], eat.bind(null, i, args)) !== false) {
-        args.splice(i, 1);
-        // cycle back one argument, as we just ate this one up
-        i--;
-      }
-    }
-  }
-
-  nodemonOptions.script = script;
-  nodemonOptions.args = args;
-
-  return nodemonOptions;
-}
-
-
-/**
- * Given an argument (ie. from process.argv), sets nodemon
- * options and can eat up the argument value
- *
- * @param {import('../..').NodemonSettings} options object that will be updated
- * @param {String} arg current argument from argv
- * @param {Function} eatNext the callback to eat up the next argument in argv
- * @return {Boolean} false if argument was not a nodemon arg
- */
-function nodemonOption(options, arg, eatNext) {
-  // line separation on purpose to help legibility
-  if (arg === '--help' || arg === '-h' || arg === '-?') {
-    var help = eatNext();
-    options.help = help ? help : true;
-  } else
-
-  if (arg === '--version' || arg === '-v') {
-    options.version = true;
-  } else
-
-  if (arg === '--no-update-notifier') {
-    options.noUpdateNotifier = true;
-  } else
-
-  if (arg === '--spawn') {
-    options.spawn = true;
-  } else
-
-  if (arg === '--dump') {
-    options.dump = true;
-  } else
-
-  if (arg === '--verbose' || arg === '-V') {
-    options.verbose = true;
-  } else
-
-  if (arg === '--legacy-watch' || arg === '-L') {
-    options.legacyWatch = true;
-  } else
-
-  if (arg === '--polling-interval' || arg === '-P') {
-    options.pollingInterval = parseInt(eatNext(), 10);
-  } else
-
-  // Depricated as this is "on" by default
-  if (arg === '--js') {
-    options.js = true;
-  } else
-
-  if (arg === '--quiet' || arg === '-q') {
-    options.quiet = true;
-  } else
-
-  if (arg === '--config') {
-    options.configFile = eatNext();
-  } else
-
-  if (arg === '--watch' || arg === '-w') {
-    if (!options.watch) { options.watch = []; }
-    options.watch.push(eatNext());
-  } else
-
-  if (arg === '--ignore' || arg === '-i') {
-    if (!options.ignore) { options.ignore = []; }
-    options.ignore.push(eatNext());
-  } else
-
-  if (arg === '--exitcrash') {
-    options.exitCrash = true;
-  } else
-
-  if (arg === '--delay' || arg === '-d') {
-    options.delay = parseDelay(eatNext());
-  } else
-
-  if (arg === '--exec' || arg === '-x') {
-    options.exec = eatNext();
-  } else
-
-  if (arg === '--no-stdin' || arg === '-I') {
-    options.stdin = false;
-  } else
-
-  if (arg === '--on-change-only' || arg === '-C') {
-    options.runOnChangeOnly = true;
-  } else
-
-  if (arg === '--ext' || arg === '-e') {
-    options.ext = eatNext();
-  } else
-
-  if (arg === '--no-colours' || arg === '--no-colors') {
-    options.colours = false;
-  } else
-
-  if (arg === '--signal' || arg === '-s') {
-    options.signal = eatNext();
-  } else
-
-  if (arg === '--cwd') {
-    options.cwd = eatNext();
-
-    // go ahead and change directory. This is primarily for nodemon tools like
-    // grunt-nodemon - we're doing this early because it will affect where the
-    // user script is searched for.
-    process.chdir(path.resolve(options.cwd));
-  } else {
-
-    // this means we didn't match
-    return false;
-  }
-}
-
-/**
- * Given an argument (ie. from nodemonOption()), will parse and return the
- * equivalent millisecond value or 0 if the argument cannot be parsed
- *
- * @param {String} value argument value given to the --delay option
- * @return {Number} millisecond equivalent of the argument
- */
-function parseDelay(value) {
-  var millisPerSecond = 1000;
-  var millis = 0;
-
-  if (value.match(/^\d*ms$/)) {
-    // Explicitly parse for milliseconds when using ms time specifier
-    millis = parseInt(value, 10);
-  } else {
-    // Otherwise, parse for seconds, with or without time specifier then convert
-    millis = parseFloat(value) * millisPerSecond;
-  }
-
-  return isNaN(millis) ? 0 : millis;
-}
-
diff --git a/node_modules/nodemon/lib/config/command.js b/node_modules/nodemon/lib/config/command.js
deleted file mode 100644
index 9839b5c7cba45e7df6217b23fe82bcb5cefc7dcd..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/config/command.js
+++ /dev/null
@@ -1,43 +0,0 @@
-module.exports = command;
-
-/**
- * command constructs the executable command to run in a shell including the
- * user script, the command arguments.
- *
- * @param  {Object} settings Object as:
- *                           { execOptions: {
- *                               exec: String,
- *                               [script: String],
- *                               [scriptPosition: Number],
- *                               [execArgs: Array<string>]
- *                             }
- *                           }
- * @return {Object}          an object with the node executable and the
- *                           arguments to the command
- */
-function command(settings) {
-  var options = settings.execOptions;
-  var executable = options.exec;
-  var args = [];
-
-  // after "executable" go the exec args (like --debug, etc)
-  if (options.execArgs) {
-    [].push.apply(args, options.execArgs);
-  }
-
-  // then goes the user's script arguments
-  if (options.args) {
-    [].push.apply(args, options.args);
-  }
-
-  // after the "executable" goes the user's script
-  if (options.script) {
-    args.splice((options.scriptPosition || 0) +
-      options.execArgs.length, 0, options.script);
-  }
-
-  return {
-    executable: executable,
-    args: args,
-  };
-}
diff --git a/node_modules/nodemon/lib/config/defaults.js b/node_modules/nodemon/lib/config/defaults.js
deleted file mode 100644
index dc95d346bf505e6edbf54a839e45ef76ad934dd4..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/config/defaults.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var ignoreRoot = require('ignore-by-default').directories();
-
-// default options for config.options
-const defaults = {
-  restartable: 'rs',
-  colours: true,
-  execMap: {
-    py: 'python',
-    rb: 'ruby',
-    ts: 'ts-node',
-    // more can be added here such as ls: lsc - but please ensure it's cross
-    // compatible with linux, mac and windows, or make the default.js
-    // dynamically append the `.cmd` for node based utilities
-  },
-  ignoreRoot: ignoreRoot.map((_) => `**/${_}/**`),
-  watch: ['*.*'],
-  stdin: true,
-  runOnChangeOnly: false,
-  verbose: false,
-  signal: 'SIGUSR2',
-  // 'stdout' refers to the default behaviour of a required nodemon's child,
-  // but also includes stderr. If this is false, data is still dispatched via
-  // nodemon.on('stdout/stderr')
-  stdout: true,
-  watchOptions: {},
-};
-
-const nodeOptions = process.env.NODE_OPTIONS || ''; // ?
-
-if (/--(loader|import)\b/.test(nodeOptions)) {
-  delete defaults.execMap.ts;
-}
-
-module.exports = defaults;
diff --git a/node_modules/nodemon/lib/config/exec.js b/node_modules/nodemon/lib/config/exec.js
deleted file mode 100644
index 6d17eabbe97d02834eac927c2b59d6908655bf49..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/config/exec.js
+++ /dev/null
@@ -1,234 +0,0 @@
-const path = require('path');
-const fs = require('fs');
-const existsSync = fs.existsSync;
-const utils = require('../utils');
-
-module.exports = exec;
-module.exports.expandScript = expandScript;
-
-/**
- * Reads the cwd/package.json file and looks to see if it can load a script
- * and possibly an exec first from package.main, then package.start.
- *
- * @return {Object} exec & script if found
- */
-function execFromPackage() {
-  // doing a try/catch because we can't use the path.exist callback pattern
-  // or we could, but the code would get messy, so this will do exactly
-  // what we're after - if the file doesn't exist, it'll throw.
-  try {
-    // note: this isn't nodemon's package, it's the user's cwd package
-    var pkg = require(path.join(process.cwd(), 'package.json'));
-    if (pkg.main !== undefined) {
-      // no app found to run - so give them a tip and get the feck out
-      return { exec: null, script: pkg.main };
-    }
-
-    if (pkg.scripts && pkg.scripts.start) {
-      return { exec: pkg.scripts.start };
-    }
-  } catch (e) {}
-
-  return null;
-}
-
-function replace(map, str) {
-  var re = new RegExp('{{(' + Object.keys(map).join('|') + ')}}', 'g');
-  return str.replace(re, function (all, m) {
-    return map[m] || all || '';
-  });
-}
-
-function expandScript(script, ext) {
-  if (!ext) {
-    ext = '.js';
-  }
-  if (script.indexOf(ext) !== -1) {
-    return script;
-  }
-
-  if (existsSync(path.resolve(script))) {
-    return script;
-  }
-
-  if (existsSync(path.resolve(script + ext))) {
-    return script + ext;
-  }
-
-  return script;
-}
-
-/**
- * Discovers all the options required to run the script
- * and if a custom exec has been passed in, then it will
- * also try to work out what extensions to monitor and
- * whether there's a special way of running that script.
- *
- * @param  {Object} nodemonOptions
- * @param  {Object} execMap
- * @return {Object} new and updated version of nodemonOptions
- */
-function exec(nodemonOptions, execMap) {
-  if (!execMap) {
-    execMap = {};
-  }
-
-  var options = utils.clone(nodemonOptions || {});
-  var script;
-
-  // if there's no script passed, try to get it from the first argument
-  if (!options.script && (options.args || []).length) {
-    script = expandScript(
-      options.args[0],
-      options.ext && '.' + (options.ext || 'js').split(',')[0]
-    );
-
-    // if the script was found, shift it off our args
-    if (script !== options.args[0]) {
-      options.script = script;
-      options.args.shift();
-    }
-  }
-
-  // if there's no exec found yet, then try to read it from the local
-  // package.json this logic used to sit in the cli/parse, but actually the cli
-  // should be parsed first, then the user options (via nodemon.json) then
-  // finally default down to pot shots at the directory via package.json
-  if (!options.exec && !options.script) {
-    var found = execFromPackage();
-    if (found !== null) {
-      if (found.exec) {
-        options.exec = found.exec;
-      }
-      if (!options.script) {
-        options.script = found.script;
-      }
-      if (Array.isArray(options.args) && options.scriptPosition === null) {
-        options.scriptPosition = options.args.length;
-      }
-    }
-  }
-
-  // var options = utils.clone(nodemonOptions || {});
-  script = path.basename(options.script || '');
-
-  var scriptExt = path.extname(script).slice(1);
-
-  var extension = options.ext;
-  if (extension === undefined) {
-    var isJS = scriptExt === 'js' || scriptExt === 'mjs' || scriptExt === 'cjs';
-    extension = isJS || !scriptExt ? 'js,mjs,cjs' : scriptExt;
-    extension += ',json'; // Always watch JSON files
-  }
-
-  var execDefined = !!options.exec;
-
-  // allows the user to simplify cli usage:
-  // https://github.com/remy/nodemon/issues/195
-  // but always give preference to the user defined argument
-  if (!options.exec && execMap[scriptExt] !== undefined) {
-    options.exec = execMap[scriptExt];
-    execDefined = true;
-  }
-
-  options.execArgs = nodemonOptions.execArgs || [];
-
-  if (Array.isArray(options.exec)) {
-    options.execArgs = options.exec;
-    options.exec = options.execArgs.shift();
-  }
-
-  if (options.exec === undefined) {
-    options.exec = 'node';
-  } else {
-    // allow variable substitution for {{filename}} and {{pwd}}
-    var substitution = replace.bind(null, {
-      filename: options.script,
-      pwd: process.cwd(),
-    });
-
-    var newExec = substitution(options.exec);
-    if (
-      newExec !== options.exec &&
-      options.exec.indexOf('{{filename}}') !== -1
-    ) {
-      options.script = null;
-    }
-    options.exec = newExec;
-
-    var newExecArgs = options.execArgs.map(substitution);
-    if (newExecArgs.join('') !== options.execArgs.join('')) {
-      options.execArgs = newExecArgs;
-      delete options.script;
-    }
-  }
-
-  if (options.exec === 'node' && options.nodeArgs && options.nodeArgs.length) {
-    options.execArgs = options.execArgs.concat(options.nodeArgs);
-  }
-
-  // note: indexOf('coffee') handles both .coffee and .litcoffee
-  if (
-    !execDefined &&
-    options.exec === 'node' &&
-    scriptExt.indexOf('coffee') !== -1
-  ) {
-    options.exec = 'coffee';
-
-    // we need to get execArgs set before the script
-    // for example, in `nodemon --debug my-script.coffee --my-flag`, debug is an
-    // execArg, while my-flag is a script arg
-    var leadingArgs = (options.args || []).splice(0, options.scriptPosition);
-    options.execArgs = options.execArgs.concat(leadingArgs);
-    options.scriptPosition = 0;
-
-    if (options.execArgs.length > 0) {
-      // because this is the coffee executable, we need to combine the exec args
-      // into a single argument after the nodejs flag
-      options.execArgs = ['--nodejs', options.execArgs.join(' ')];
-    }
-  }
-
-  if (options.exec === 'coffee') {
-    // don't override user specified extension tracking
-    if (options.ext === undefined) {
-      if (extension) {
-        extension += ',';
-      }
-      extension += 'coffee,litcoffee';
-    }
-
-    // because windows can't find 'coffee', it needs the real file 'coffee.cmd'
-    if (utils.isWindows) {
-      options.exec += '.cmd';
-    }
-  }
-
-  // allow users to make a mistake on the extension to monitor
-  // converts .js, pug => js,pug
-  // BIG NOTE: user can't do this: nodemon -e *.js
-  // because the terminal will automatically expand the glob against
-  // the file system :(
-  extension = (extension.match(/[^,*\s]+/g) || [])
-    .map((ext) => ext.replace(/^\./, ''))
-    .join(',');
-
-  options.ext = extension;
-
-  if (options.script) {
-    options.script = expandScript(
-      options.script,
-      extension && '.' + extension.split(',')[0]
-    );
-  }
-
-  options.env = {};
-  // make sure it's an object (and since we don't have )
-  if ({}.toString.apply(nodemonOptions.env) === '[object Object]') {
-    options.env = utils.clone(nodemonOptions.env);
-  } else if (nodemonOptions.env !== undefined) {
-    throw new Error('nodemon env values must be an object: { PORT: 8000 }');
-  }
-
-  return options;
-}
diff --git a/node_modules/nodemon/lib/config/index.js b/node_modules/nodemon/lib/config/index.js
deleted file mode 100644
index c78c435cdda56d7f231dbaea7ca13b32459f58d0..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/config/index.js
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * Manages the internal config of nodemon, checking for the state of support
- * with fs.watch, how nodemon can watch files (using find or fs methods).
- *
- * This is *not* the user's config.
- */
-var debug = require('debug')('nodemon');
-var load = require('./load');
-var rules = require('../rules');
-var utils = require('../utils');
-var pinVersion = require('../version').pin;
-var command = require('./command');
-var rulesToMonitor = require('../monitor/match').rulesToMonitor;
-var bus = utils.bus;
-
-function reset() {
-  rules.reset();
-
-  config.dirs = [];
-  config.options = { ignore: [], watch: [], monitor: [] };
-  config.lastStarted = 0;
-  config.loaded = [];
-}
-
-var config = {
-  run: false,
-  system: {
-    cwd: process.cwd(),
-  },
-  required: false,
-  dirs: [],
-  timeout: 1000,
-  options: {},
-};
-
-/**
- * Take user defined settings, then detect the local machine capability, then
- * look for local and global nodemon.json files and merge together the final
- * settings with the config for nodemon.
- *
- * @param  {Object} settings user defined settings for nodemon (typically on
- *  the cli)
- * @param  {Function} ready callback fired once the config is loaded
- */
-config.load = function (settings, ready) {
-  reset();
-  var config = this;
-  load(settings, config.options, config, function (options) {
-    config.options = options;
-
-    if (options.watch.length === 0) {
-      // this is to catch when the watch is left blank
-      options.watch.push('*.*');
-    }
-
-    if (options['watch_interval']) { // jshint ignore:line
-      options.watchInterval = options['watch_interval']; // jshint ignore:line
-    }
-
-    config.watchInterval = options.watchInterval || null;
-    if (options.signal) {
-      config.signal = options.signal;
-    }
-
-    var cmd = command(config.options);
-    config.command = {
-      raw: cmd,
-      string: utils.stringify(cmd.executable, cmd.args),
-    };
-
-    // now run automatic checks on system adding to the config object
-    options.monitor = rulesToMonitor(options.watch, options.ignore, config);
-
-    var cwd = process.cwd();
-    debug('config: dirs', config.dirs);
-    if (config.dirs.length === 0) {
-      config.dirs.unshift(cwd);
-    }
-
-    bus.emit('config:update', config);
-    pinVersion().then(function () {
-      ready(config);
-    }).catch(e => {
-      // this doesn't help testing, but does give exposure on syntax errors
-      console.error(e.stack);
-      setTimeout(() => { throw e; }, 0);
-    });
-  });
-};
-
-config.reset = reset;
-
-module.exports = config;
diff --git a/node_modules/nodemon/lib/config/load.js b/node_modules/nodemon/lib/config/load.js
deleted file mode 100644
index 7c57d32306f04986477f4777431b7200d938c81b..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/config/load.js
+++ /dev/null
@@ -1,225 +0,0 @@
-var debug = require('debug')('nodemon');
-var fs = require('fs');
-var path = require('path');
-var exists = fs.exists || path.exists;
-var utils = require('../utils');
-var rules = require('../rules');
-var parse = require('../rules/parse');
-var exec = require('./exec');
-var defaults = require('./defaults');
-
-module.exports = load;
-module.exports.mutateExecOptions = mutateExecOptions;
-
-var existsSync = fs.existsSync || path.existsSync;
-
-function findAppScript() {
-  // nodemon has been run alone, so try to read the package file
-  // or try to read the index.js file
-
-  var pkg =
-    existsSync(path.join(process.cwd(), 'package.json')) &&
-    require(path.join(process.cwd(), 'package.json'));
-  if ((!pkg || pkg.main == undefined) && existsSync('./index.js')) {
-    return 'index.js';
-  }
-}
-
-/**
- * Load the nodemon config, first reading the global root/nodemon.json, then
- * the local nodemon.json to the exec and then overwriting using any user
- * specified settings (i.e. from the cli)
- *
- * @param {Object} settings user defined settings
- * @param {Object} options global options
- * @param {Object} config the config object to be updated
- * @param {Function} callback that receives complete config
- */
-function load(settings, options, config, callback) {
-  config.loaded = [];
-  // first load the root nodemon.json
-  loadFile(options, config, utils.home, function (options) {
-    // then load the user's local configuration file
-    if (settings.configFile) {
-      options.configFile = path.resolve(settings.configFile);
-    }
-    loadFile(options, config, process.cwd(), function (options) {
-      // Then merge over with the user settings (parsed from the cli).
-      // Note that merge protects and favours existing values over new values,
-      // and thus command line arguments get priority
-      options = utils.merge(settings, options);
-
-      // legacy support
-      if (!Array.isArray(options.ignore)) {
-        options.ignore = [options.ignore];
-      }
-
-      if (!options.ignoreRoot) {
-        options.ignoreRoot = defaults.ignoreRoot;
-      }
-
-      // blend the user ignore and the default ignore together
-      if (options.ignoreRoot && options.ignore) {
-        if (!Array.isArray(options.ignoreRoot)) {
-          options.ignoreRoot = [options.ignoreRoot];
-        }
-        options.ignore = options.ignoreRoot.concat(options.ignore);
-      } else {
-        options.ignore = defaults.ignore.concat(options.ignore);
-      }
-
-      // add in any missing defaults
-      options = utils.merge(options, defaults);
-
-      if (!options.script && !options.exec) {
-        var found = findAppScript();
-        if (found) {
-          if (!options.args) {
-            options.args = [];
-          }
-          // if the script is found as a result of not being on the command
-          // line, then we move any of the pre double-dash args in execArgs
-          const n =
-            options.scriptPosition === null
-              ? options.args.length
-              : options.scriptPosition;
-
-          options.execArgs = (options.execArgs || []).concat(
-            options.args.splice(0, n)
-          );
-          options.scriptPosition = null;
-
-          options.script = found;
-        }
-      }
-
-      mutateExecOptions(options);
-
-      if (options.quiet) {
-        utils.quiet();
-      }
-
-      if (options.verbose) {
-        utils.debug = true;
-      }
-
-      // simplify the ready callback to be called after the rules are normalised
-      // from strings to regexp through the rules lib. Note that this gets
-      // created *after* options is overwritten twice in the lines above.
-      var ready = function (options) {
-        normaliseRules(options, callback);
-      };
-
-      ready(options);
-    });
-  });
-}
-
-function normaliseRules(options, ready) {
-  // convert ignore and watch options to rules/regexp
-  rules.watch.add(options.watch);
-  rules.ignore.add(options.ignore);
-
-  // normalise the watch and ignore arrays
-  options.watch = options.watch === false ? false : rules.rules.watch;
-  options.ignore = rules.rules.ignore;
-
-  ready(options);
-}
-
-/**
- * Looks for a config in the current working directory, and a config in the
- * user's home directory, merging the two together, giving priority to local
- * config. This can then be overwritten later by command line arguments
- *
- * @param  {Function} ready callback to pass loaded settings to
- */
-function loadFile(options, config, dir, ready) {
-  if (!ready) {
-    ready = function () {};
-  }
-
-  var callback = function (settings) {
-    // prefer the local nodemon.json and fill in missing items using
-    // the global options
-    ready(utils.merge(settings, options));
-  };
-
-  if (!dir) {
-    return callback({});
-  }
-
-  var filename = options.configFile || path.join(dir, 'nodemon.json');
-
-  if (config.loaded.indexOf(filename) !== -1) {
-    // don't bother re-parsing the same config file
-    return callback({});
-  }
-
-  fs.readFile(filename, 'utf8', function (err, data) {
-    if (err) {
-      if (err.code === 'ENOENT') {
-        if (!options.configFile && dir !== utils.home) {
-          // if no specified local config file and local nodemon.json
-          // doesn't exist, try the package.json
-          return loadPackageJSON(config, callback);
-        }
-      }
-      return callback({});
-    }
-
-    var settings = {};
-
-    try {
-      settings = JSON.parse(data.toString('utf8').replace(/^\uFEFF/, ''));
-      if (!filename.endsWith('package.json') || settings.nodemonConfig) {
-        config.loaded.push(filename);
-      }
-    } catch (e) {
-      utils.log.fail('Failed to parse config ' + filename);
-      console.error(e);
-      process.exit(1);
-    }
-
-    // options values will overwrite settings
-    callback(settings);
-  });
-}
-
-function loadPackageJSON(config, ready) {
-  if (!ready) {
-    ready = () => {};
-  }
-
-  const dir = process.cwd();
-  const filename = path.join(dir, 'package.json');
-  const packageLoadOptions = { configFile: filename };
-  return loadFile(packageLoadOptions, config, dir, (settings) => {
-    ready(settings.nodemonConfig || {});
-  });
-}
-
-function mutateExecOptions(options) {
-  // work out the execOptions based on the final config we have
-  options.execOptions = exec(
-    {
-      script: options.script,
-      exec: options.exec,
-      args: options.args,
-      scriptPosition: options.scriptPosition,
-      nodeArgs: options.nodeArgs,
-      execArgs: options.execArgs,
-      ext: options.ext,
-      env: options.env,
-    },
-    options.execMap
-  );
-
-  // clean up values that we don't need at the top level
-  delete options.scriptPosition;
-  delete options.script;
-  delete options.args;
-  delete options.ext;
-
-  return options;
-}
diff --git a/node_modules/nodemon/lib/help/index.js b/node_modules/nodemon/lib/help/index.js
deleted file mode 100644
index 1054b60253704f876ad69c746fae40e81e2bcff9..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/help/index.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var fs = require('fs');
-var path = require('path');
-const supportsColor = require('supports-color');
-
-module.exports = help;
-
-const highlight = supportsColor.stdout ? '\x1B\[$1m' : '';
-
-function help(item) {
-  if (!item) {
-    item = 'help';
-  } else if (item === true) { // if used with -h or --help and no args
-    item = 'help';
-  }
-
-  // cleanse the filename to only contain letters
-  // aka: /\W/g but figured this was eaiser to read
-  item = item.replace(/[^a-z]/gi, '');
-
-  try {
-    var dir = path.join(__dirname, '..', '..', 'doc', 'cli', item + '.txt');
-    var body = fs.readFileSync(dir, 'utf8');
-    return body.replace(/\\x1B\[(.)m/g, highlight);
-  } catch (e) {
-    return '"' + item + '" help can\'t be found';
-  }
-}
diff --git a/node_modules/nodemon/lib/index.js b/node_modules/nodemon/lib/index.js
deleted file mode 100644
index 0eca5c457d357f6528e263deba131848e4380154..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/index.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./nodemon');
\ No newline at end of file
diff --git a/node_modules/nodemon/lib/monitor/index.js b/node_modules/nodemon/lib/monitor/index.js
deleted file mode 100644
index 89db029b09e005e9e102a085c93f2b261eeb88b7..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/monitor/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-module.exports = {
-  run: require('./run'),
-  watch: require('./watch').watch,
-};
diff --git a/node_modules/nodemon/lib/monitor/match.js b/node_modules/nodemon/lib/monitor/match.js
deleted file mode 100644
index 11691d7ddbe44b7dc136f8a3f1a36080d20e00c6..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/monitor/match.js
+++ /dev/null
@@ -1,287 +0,0 @@
-const minimatch = require('minimatch');
-const path = require('path');
-const fs = require('fs');
-const debug = require('debug')('nodemon:match');
-const utils = require('../utils');
-
-module.exports = match;
-module.exports.rulesToMonitor = rulesToMonitor;
-
-function rulesToMonitor(watch, ignore, config) {
-  var monitor = [];
-
-  if (!Array.isArray(ignore)) {
-    if (ignore) {
-      ignore = [ignore];
-    } else {
-      ignore = [];
-    }
-  }
-
-  if (!Array.isArray(watch)) {
-    if (watch) {
-      watch = [watch];
-    } else {
-      watch = [];
-    }
-  }
-
-  if (watch && watch.length) {
-    monitor = utils.clone(watch);
-  }
-
-  if (ignore) {
-    [].push.apply(
-      monitor,
-      (ignore || []).map(function (rule) {
-        return '!' + rule;
-      })
-    );
-  }
-
-  var cwd = process.cwd();
-
-  // next check if the monitored paths are actual directories
-  // or just patterns - and expand the rule to include *.*
-  monitor = monitor.map(function (rule) {
-    var not = rule.slice(0, 1) === '!';
-
-    if (not) {
-      rule = rule.slice(1);
-    }
-
-    if (rule === '.' || rule === '.*') {
-      rule = '*.*';
-    }
-
-    var dir = path.resolve(cwd, rule);
-
-    try {
-      var stat = fs.statSync(dir);
-      if (stat.isDirectory()) {
-        rule = dir;
-        if (rule.slice(-1) !== '/') {
-          rule += '/';
-        }
-        rule += '**/*';
-
-        // `!not` ... sorry.
-        if (!not) {
-          config.dirs.push(dir);
-        }
-      } else {
-        // ensures we end up in the check that tries to get a base directory
-        // and then adds it to the watch list
-        throw new Error();
-      }
-    } catch (e) {
-      var base = tryBaseDir(dir);
-      if (!not && base) {
-        if (config.dirs.indexOf(base) === -1) {
-          config.dirs.push(base);
-        }
-      }
-    }
-
-    if (rule.slice(-1) === '/') {
-      // just slap on a * anyway
-      rule += '*';
-    }
-
-    // if the url ends with * but not **/* and not *.*
-    // then convert to **/* - somehow it was missed :-\
-    if (
-      rule.slice(-4) !== '**/*' &&
-      rule.slice(-1) === '*' &&
-      rule.indexOf('*.') === -1
-    ) {
-      if (rule.slice(-2) !== '**') {
-        rule += '*/*';
-      }
-    }
-
-    return (not ? '!' : '') + rule;
-  });
-
-  return monitor;
-}
-
-function tryBaseDir(dir) {
-  var stat;
-  if (/[?*\{\[]+/.test(dir)) {
-    // if this is pattern, then try to find the base
-    try {
-      var base = path.dirname(dir.replace(/([?*\{\[]+.*$)/, 'foo'));
-      stat = fs.statSync(base);
-      if (stat.isDirectory()) {
-        return base;
-      }
-    } catch (error) {
-      // console.log(error);
-    }
-  } else {
-    try {
-      stat = fs.statSync(dir);
-      // if this path is actually a single file that exists, then just monitor
-      // that, *specifically*.
-      if (stat.isFile() || stat.isDirectory()) {
-        return dir;
-      }
-    } catch (e) {}
-  }
-
-  return false;
-}
-
-function match(files, monitor, ext) {
-  // sort the rules by highest specificity (based on number of slashes)
-  // ignore rules (!) get sorted highest as they take precedent
-  const cwd = process.cwd();
-  var rules = monitor
-    .sort(function (a, b) {
-      var r = b.split(path.sep).length - a.split(path.sep).length;
-      var aIsIgnore = a.slice(0, 1) === '!';
-      var bIsIgnore = b.slice(0, 1) === '!';
-
-      if (aIsIgnore || bIsIgnore) {
-        if (aIsIgnore) {
-          return -1;
-        }
-
-        return 1;
-      }
-
-      if (r === 0) {
-        return b.length - a.length;
-      }
-      return r;
-    })
-    .map(function (s) {
-      var prefix = s.slice(0, 1);
-
-      if (prefix === '!') {
-        if (s.indexOf('!' + cwd) === 0) {
-          return s;
-        }
-
-        // if it starts with a period, then let's get the relative path
-        if (s.indexOf('!.') === 0) {
-          return '!' + path.resolve(cwd, s.substring(1));
-        }
-
-        return '!**' + (prefix !== path.sep ? path.sep : '') + s.slice(1);
-      }
-
-      // if it starts with a period, then let's get the relative path
-      if (s.indexOf('.') === 0) {
-        return path.resolve(cwd, s);
-      }
-
-      if (s.indexOf(cwd) === 0) {
-        return s;
-      }
-
-      return '**' + (prefix !== path.sep ? path.sep : '') + s;
-    });
-
-  debug('rules', rules);
-
-  var good = [];
-  var whitelist = []; // files that we won't check against the extension
-  var ignored = 0;
-  var watched = 0;
-  var usedRules = [];
-  var minimatchOpts = {
-    dot: true,
-  };
-
-  // enable case-insensitivity on Windows
-  if (utils.isWindows) {
-    minimatchOpts.nocase = true;
-  }
-
-  files.forEach(function (file) {
-    file = path.resolve(cwd, file);
-
-    var matched = false;
-    for (var i = 0; i < rules.length; i++) {
-      if (rules[i].slice(0, 1) === '!') {
-        if (!minimatch(file, rules[i], minimatchOpts)) {
-          debug('ignored', file, 'rule:', rules[i]);
-          ignored++;
-          matched = true;
-          break;
-        }
-      } else {
-        debug('matched', file, 'rule:', rules[i]);
-        if (minimatch(file, rules[i], minimatchOpts)) {
-          watched++;
-
-          // don't repeat the output if a rule is matched
-          if (usedRules.indexOf(rules[i]) === -1) {
-            usedRules.push(rules[i]);
-            utils.log.detail('matched rule: ' + rules[i]);
-          }
-
-          // if the rule doesn't match the WATCH EVERYTHING
-          // but *does* match a rule that ends with *.*, then
-          // white list it - in that we don't run it through
-          // the extension check too.
-          if (
-            rules[i] !== '**' + path.sep + '*.*' &&
-            rules[i].slice(-3) === '*.*'
-          ) {
-            whitelist.push(file);
-          } else if (path.basename(file) === path.basename(rules[i])) {
-            // if the file matches the actual rule, then it's put on whitelist
-            whitelist.push(file);
-          } else {
-            good.push(file);
-          }
-          matched = true;
-        } else {
-          // utils.log.detail('no match: ' + rules[i], file);
-        }
-      }
-    }
-    if (!matched) {
-      ignored++;
-    }
-  });
-
-  // finally check the good files against the extensions that we're monitoring
-  if (ext) {
-    if (ext.indexOf(',') === -1) {
-      ext = '**/*.' + ext;
-    } else {
-      ext = '**/*.{' + ext + '}';
-    }
-
-    good = good.filter(function (file) {
-      // only compare the filename to the extension test
-      return minimatch(path.basename(file), ext, minimatchOpts);
-    });
-    debug('good (filtered by ext)', good);
-  } else {
-    // else assume *.*
-    debug('good', good);
-  }
-
-  if (whitelist.length) debug('whitelist', whitelist);
-
-  var result = good.concat(whitelist);
-
-  if (utils.isWindows) {
-    // fix for windows testing - I *think* this is okay to do
-    result = result.map(function (file) {
-      return file.slice(0, 1).toLowerCase() + file.slice(1);
-    });
-  }
-
-  return {
-    result: result,
-    ignored: ignored,
-    watched: watched,
-    total: files.length,
-  };
-}
diff --git a/node_modules/nodemon/lib/monitor/run.js b/node_modules/nodemon/lib/monitor/run.js
deleted file mode 100644
index 5fa7f45ad215c29c9591ac5b0b7a7fc094f7dec9..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/monitor/run.js
+++ /dev/null
@@ -1,562 +0,0 @@
-var debug = require('debug')('nodemon:run');
-const statSync = require('fs').statSync;
-var utils = require('../utils');
-var bus = utils.bus;
-var childProcess = require('child_process');
-var spawn = childProcess.spawn;
-var exec = childProcess.exec;
-var execSync = childProcess.execSync;
-var fork = childProcess.fork;
-var watch = require('./watch').watch;
-var config = require('../config');
-var child = null; // the actual child process we spawn
-var killedAfterChange = false;
-var noop = () => {};
-var restart = null;
-var psTree = require('pstree.remy');
-var path = require('path');
-var signals = require('./signals');
-const undefsafe = require('undefsafe');
-const osRelease = parseInt(require('os').release().split('.')[0], 10);
-
-function run(options) {
-  var cmd = config.command.raw;
-  // moved up
-  // we need restart function below in the global scope for run.kill
-  /*jshint validthis:true*/
-  restart = run.bind(this, options);
-  run.restart = restart;
-
-  // binding options with instance of run
-  // so that we can use it in run.kill
-  run.options = options;
-
-  var runCmd = !options.runOnChangeOnly || config.lastStarted !== 0;
-  if (runCmd) {
-    utils.log.status('starting `' + config.command.string + '`');
-  } else {
-    // should just watch file if command is not to be run
-    // had another alternate approach
-    // to stop process being forked/spawned in the below code
-    // but this approach does early exit and makes code cleaner
-    debug('start watch on: %s', config.options.watch);
-    if (config.options.watch !== false) {
-      watch();
-      return;
-    }
-  }
-
-  config.lastStarted = Date.now();
-
-  var stdio = ['pipe', 'pipe', 'pipe'];
-
-  if (config.options.stdout) {
-    stdio = ['pipe', process.stdout, process.stderr];
-  }
-
-  if (config.options.stdin === false) {
-    stdio = [process.stdin, process.stdout, process.stderr];
-  }
-
-  var sh = 'sh';
-  var shFlag = '-c';
-
-  const binPath = process.cwd() + '/node_modules/.bin';
-
-  const spawnOptions = {
-    env: Object.assign({}, options.execOptions.env, process.env, {
-      PATH:
-        binPath +
-        path.delimiter +
-        (undefsafe(options, '.execOptions.env.PATH') || process.env.PATH),
-    }),
-    stdio: stdio,
-  };
-
-  var executable = cmd.executable;
-
-  if (utils.isWindows) {
-    // if the exec includes a forward slash, reverse it for windows compat
-    // but *only* apply to the first command, and none of the arguments.
-    // ref #1251 and #1236
-    if (executable.indexOf('/') !== -1) {
-      executable = executable
-        .split(' ')
-        .map((e, i) => {
-          if (i === 0) {
-            return path.normalize(e);
-          }
-          return e;
-        })
-        .join(' ');
-    }
-    // taken from npm's cli: https://git.io/vNFD4
-    sh = process.env.comspec || 'cmd';
-    shFlag = '/d /s /c';
-    spawnOptions.windowsVerbatimArguments = true;
-    spawnOptions.windowsHide = true;
-  }
-
-  var args = runCmd ? utils.stringify(executable, cmd.args) : ':';
-  var spawnArgs = [sh, [shFlag, args], spawnOptions];
-
-  const firstArg = cmd.args[0] || '';
-
-  var inBinPath = false;
-  try {
-    inBinPath = statSync(`${binPath}/${executable}`).isFile();
-  } catch (e) {}
-
-  // hasStdio allows us to correctly handle stdin piping
-  // see: https://git.io/vNtX3
-  const hasStdio = utils.satisfies('>= 6.4.0 || < 5');
-
-  // forking helps with sub-process handling and tends to clean up better
-  // than spawning, but it should only be used under specific conditions
-  const shouldFork =
-    !config.options.spawn &&
-    !inBinPath &&
-    !(firstArg.indexOf('-') === 0) && // don't fork if there's a node exec arg
-    firstArg !== 'inspect' && // don't fork it's `inspect` debugger
-    executable === 'node' && // only fork if node
-    utils.version.major > 4; // only fork if node version > 4
-
-  if (shouldFork) {
-    // this assumes the first argument is the script and slices it out, since
-    // we're forking
-    var forkArgs = cmd.args.slice(1);
-    var env = utils.merge(options.execOptions.env, process.env);
-    stdio.push('ipc');
-    const forkOptions = {
-      env: env,
-      stdio: stdio,
-      silent: !hasStdio,
-    };
-    if (utils.isWindows) {
-      forkOptions.windowsHide = true;
-    }
-    child = fork(options.execOptions.script, forkArgs, forkOptions);
-    utils.log.detail('forking');
-    debug('fork', sh, shFlag, args);
-  } else {
-    utils.log.detail('spawning');
-    child = spawn.apply(null, spawnArgs);
-    debug('spawn', sh, shFlag, args);
-  }
-
-  if (config.required) {
-    var emit = {
-      stdout: function (data) {
-        bus.emit('stdout', data);
-      },
-      stderr: function (data) {
-        bus.emit('stderr', data);
-      },
-    };
-
-    // now work out what to bind to...
-    if (config.options.stdout) {
-      child.on('stdout', emit.stdout).on('stderr', emit.stderr);
-    } else {
-      child.stdout.on('data', emit.stdout);
-      child.stderr.on('data', emit.stderr);
-
-      bus.stdout = child.stdout;
-      bus.stderr = child.stderr;
-    }
-
-    if (shouldFork) {
-      child.on('message', function (message, sendHandle) {
-        bus.emit('message', message, sendHandle);
-      });
-    }
-  }
-
-  bus.emit('start');
-
-  utils.log.detail('child pid: ' + child.pid);
-
-  child.on('error', function (error) {
-    bus.emit('error', error);
-    if (error.code === 'ENOENT') {
-      utils.log.error('unable to run executable: "' + cmd.executable + '"');
-      process.exit(1);
-    } else {
-      utils.log.error('failed to start child process: ' + error.code);
-      throw error;
-    }
-  });
-
-  child.on('exit', function (code, signal) {
-    if (child && child.stdin) {
-      process.stdin.unpipe(child.stdin);
-    }
-
-    if (code === 127) {
-      utils.log.error(
-        'failed to start process, "' + cmd.executable + '" exec not found'
-      );
-      bus.emit('error', code);
-      process.exit();
-    }
-
-    // If the command failed with code 2, it may or may not be a syntax error
-    // See: http://git.io/fNOAR
-    // We will only assume a parse error, if the child failed quickly
-    if (code === 2 && Date.now() < config.lastStarted + 500) {
-      utils.log.error('process failed, unhandled exit code (2)');
-      utils.log.error('');
-      utils.log.error('Either the command has a syntax error,');
-      utils.log.error('or it is exiting with reserved code 2.');
-      utils.log.error('');
-      utils.log.error('To keep nodemon running even after a code 2,');
-      utils.log.error('add this to the end of your command: || exit 1');
-      utils.log.error('');
-      utils.log.error('Read more here: https://git.io/fNOAG');
-      utils.log.error('');
-      utils.log.error('nodemon will stop now so that you can fix the command.');
-      utils.log.error('');
-      bus.emit('error', code);
-      process.exit();
-    }
-
-    // In case we killed the app ourselves, set the signal thusly
-    if (killedAfterChange) {
-      killedAfterChange = false;
-      signal = config.signal;
-    }
-    // this is nasty, but it gives it windows support
-    if (utils.isWindows && signal === 'SIGTERM') {
-      signal = config.signal;
-    }
-
-    if (signal === config.signal || code === 0) {
-      // this was a clean exit, so emit exit, rather than crash
-      debug('bus.emit(exit) via ' + config.signal);
-      bus.emit('exit', signal);
-
-      // exit the monitor, but do it gracefully
-      if (signal === config.signal) {
-        return restart();
-      }
-
-      if (code === 0) {
-        // clean exit - wait until file change to restart
-        if (runCmd) {
-          utils.log.status('clean exit - waiting for changes before restart');
-        }
-        child = null;
-      }
-    } else {
-      bus.emit('crash');
-
-      // support the old syntax of `exitcrash` - 2024-12-13
-      if (options.exitcrash) {
-        options.exitCrash = true;
-        delete options.exitcrash;
-      }
-
-      if (options.exitCrash) {
-        utils.log.fail('app crashed');
-        if (!config.required) {
-          process.exit(1);
-        }
-      } else {
-        utils.log.fail(
-          'app crashed - waiting for file changes before' + ' starting...'
-        );
-        child = null;
-      }
-    }
-
-    if (config.options.restartable) {
-      // stdin needs to kick in again to be able to listen to the
-      // restart command
-      process.stdin.resume();
-    }
-  });
-
-  // moved the run.kill outside to handle both the cases
-  // intial start
-  // no start
-
-  // connect stdin to the child process (options.stdin is on by default)
-  if (options.stdin) {
-    process.stdin.resume();
-    // FIXME decide whether or not we need to decide the encoding
-    // process.stdin.setEncoding('utf8');
-
-    // swallow the stdin error if it happens
-    // ref: https://github.com/remy/nodemon/issues/1195
-    if (hasStdio) {
-      child.stdin.on('error', () => {});
-      process.stdin.pipe(child.stdin);
-    } else {
-      if (child.stdout) {
-        child.stdout.pipe(process.stdout);
-      } else {
-        utils.log.error(
-          'running an unsupported version of node ' + process.version
-        );
-        utils.log.error(
-          'nodemon may not work as expected - ' +
-            'please consider upgrading to LTS'
-        );
-      }
-    }
-
-    bus.once('exit', function () {
-      if (child && process.stdin.unpipe) {
-        // node > 0.8
-        process.stdin.unpipe(child.stdin);
-      }
-    });
-  }
-
-  debug('start watch on: %s', config.options.watch);
-  if (config.options.watch !== false) {
-    watch();
-  }
-}
-
-function waitForSubProcesses(pid, callback) {
-  debug('checking ps tree for pids of ' + pid);
-  psTree(pid, (err, pids) => {
-    if (!pids.length) {
-      return callback();
-    }
-
-    utils.log.status(
-      `still waiting for ${pids.length} sub-process${
-        pids.length > 2 ? 'es' : ''
-      } to finish...`
-    );
-    setTimeout(() => waitForSubProcesses(pid, callback), 1000);
-  });
-}
-
-function kill(child, signal, callback) {
-  if (!callback) {
-    callback = noop;
-  }
-
-  if (utils.isWindows) {
-    const taskKill = () => {
-      try {
-        exec('taskkill /pid ' + child.pid + ' /T /F');
-      } catch (e) {
-        utils.log.error('Could not shutdown sub process cleanly');
-      }
-    };
-
-    // We are handling a 'SIGKILL' , 'SIGUSR2' and 'SIGUSR1' POSIX signal under Windows the
-    // same way it is handled on a UNIX system: We are performing
-    // a hard shutdown without waiting for the process to clean-up.
-    if (
-      signal === 'SIGKILL' ||
-      osRelease < 10 ||
-      signal === 'SIGUSR2' ||
-      signal === 'SIGUSR1'
-    ) {
-      debug('terminating process group by force: %s', child.pid);
-
-      // We are using the taskkill utility to terminate the whole
-      // process group ('/t') of the child ('/pid') by force ('/f').
-      // We need to end all sub processes, because the 'child'
-      // process in this context is actually a cmd.exe wrapper.
-      taskKill();
-      callback();
-      return;
-    }
-
-    try {
-      // We are using the Windows Management Instrumentation Command-line
-      // (wmic.exe) to resolve the sub-child process identifier, because the
-      // 'child' process in this context is actually a cmd.exe wrapper.
-      // We want to send the termination signal directly to the node process.
-      // The '2> nul' silences the no process found error message.
-      const resultBuffer = execSync(
-        `wmic process where (ParentProcessId=${child.pid}) get ProcessId 2> nul`
-      );
-      const result = resultBuffer.toString().match(/^[0-9]+/m);
-
-      // If there is no sub-child process we fall back to the child process.
-      const processId = Array.isArray(result) ? result[0] : child.pid;
-
-      debug('sending kill signal SIGINT to process: %s', processId);
-
-      // We are using the standalone 'windows-kill' executable to send the
-      // standard POSIX signal 'SIGINT' to the node process. This fixes #1720.
-      const windowsKill = path.normalize(
-        `${__dirname}/../../bin/windows-kill.exe`
-      );
-
-      // We have to detach the 'windows-kill' execution completely from this
-      // process group to avoid terminating the nodemon process itself.
-      // See: https://github.com/alirdn/windows-kill#how-it-works--limitations
-      //
-      // Therefore we are using 'start' to create a new cmd.exe context.
-      // The '/min' option hides the new terminal window and the '/wait'
-      // option lets the process wait for the command to finish.
-
-      execSync(
-        `start "windows-kill" /min /wait "${windowsKill}" -SIGINT ${processId}`
-      );
-    } catch (e) {
-      taskKill();
-    }
-    callback();
-  } else {
-    // we use psTree to kill the full subtree of nodemon, because when
-    // spawning processes like `coffee` under the `--debug` flag, it'll spawn
-    // it's own child, and that can't be killed by nodemon, so psTree gives us
-    // an array of PIDs that have spawned under nodemon, and we send each the
-    // configured signal (default: SIGUSR2) signal, which fixes #335
-    // note that psTree also works if `ps` is missing by looking in /proc
-    let sig = signal.replace('SIG', '');
-
-    psTree(child.pid, function (err, pids) {
-      // if ps isn't native to the OS, then we need to send the numeric value
-      // for the signal during the kill, `signals` is a lookup table for that.
-      if (!psTree.hasPS) {
-        sig = signals[signal];
-      }
-
-      // the sub processes need to be killed from smallest to largest
-      debug('sending kill signal to ' + pids.join(', '));
-
-      child.kill(signal);
-
-      pids.sort().forEach((pid) => exec(`kill -${sig} ${pid}`, noop));
-
-      waitForSubProcesses(child.pid, () => {
-        // finally kill the main user process
-        exec(`kill -${sig} ${child.pid}`, callback);
-      });
-    });
-  }
-}
-
-run.kill = function (noRestart, callback) {
-  // I hate code like this :(  - Remy (author of said code)
-  if (typeof noRestart === 'function') {
-    callback = noRestart;
-    noRestart = false;
-  }
-
-  if (!callback) {
-    callback = noop;
-  }
-
-  if (child !== null) {
-    // if the stdin piping is on, we need to unpipe, but also close stdin on
-    // the child, otherwise linux can throw EPIPE or ECONNRESET errors.
-    if (run.options.stdin) {
-      process.stdin.unpipe(child.stdin);
-    }
-
-    // For the on('exit', ...) handler above the following looks like a
-    // crash, so we set the killedAfterChange flag if a restart is planned
-    if (!noRestart) {
-      killedAfterChange = true;
-    }
-
-    /* Now kill the entire subtree of processes belonging to nodemon */
-    var oldPid = child.pid;
-    if (child) {
-      kill(child, config.signal, function () {
-        // this seems to fix the 0.11.x issue with the "rs" restart command,
-        // though I'm unsure why. it seems like more data is streamed in to
-        // stdin after we close.
-        if (child && run.options.stdin && child.stdin && oldPid === child.pid) {
-          child.stdin.end();
-        }
-        callback();
-      });
-    }
-  } else if (!noRestart) {
-    // if there's no child, then we need to manually start the process
-    // this is because as there was no child, the child.on('exit') event
-    // handler doesn't exist which would normally trigger the restart.
-    bus.once('start', callback);
-    run.restart();
-  } else {
-    callback();
-  }
-};
-
-run.restart = noop;
-
-bus.on('quit', function onQuit(code) {
-  if (code === undefined) {
-    code = 0;
-  }
-
-  // remove event listener
-  var exitTimer = null;
-  var exit = function () {
-    clearTimeout(exitTimer);
-    exit = noop; // null out in case of race condition
-    child = null;
-    if (!config.required) {
-      // Execute all other quit listeners.
-      bus.listeners('quit').forEach(function (listener) {
-        if (listener !== onQuit) {
-          listener();
-        }
-      });
-      process.exit(code);
-    } else {
-      bus.emit('exit');
-    }
-  };
-
-  // if we're not running already, don't bother with trying to kill
-  if (config.run === false) {
-    return exit();
-  }
-
-  // immediately try to stop any polling
-  config.run = false;
-
-  if (child) {
-    // give up waiting for the kids after 10 seconds
-    exitTimer = setTimeout(exit, 10 * 1000);
-    child.removeAllListeners('exit');
-    child.once('exit', exit);
-
-    kill(child, 'SIGINT');
-  } else {
-    exit();
-  }
-});
-
-bus.on('restart', function () {
-  // run.kill will send a SIGINT to the child process, which will cause it
-  // to terminate, which in turn uses the 'exit' event handler to restart
-  run.kill();
-});
-
-// remove the child file on exit
-process.on('exit', function () {
-  utils.log.detail('exiting');
-  if (child) {
-    child.kill();
-  }
-});
-
-// because windows borks when listening for the SIG* events
-if (!utils.isWindows) {
-  bus.once('boot', () => {
-    // usual suspect: ctrl+c exit
-    process.once('SIGINT', () => bus.emit('quit', 130));
-    process.once('SIGTERM', () => {
-      bus.emit('quit', 143);
-      if (child) {
-        child.kill('SIGTERM');
-      }
-    });
-  });
-}
-
-module.exports = run;
diff --git a/node_modules/nodemon/lib/monitor/signals.js b/node_modules/nodemon/lib/monitor/signals.js
deleted file mode 100644
index daff6e05389aedf0b669bbcb32554599692cb121..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/monitor/signals.js
+++ /dev/null
@@ -1,34 +0,0 @@
-module.exports = {
-  SIGHUP: 1,
-  SIGINT: 2,
-  SIGQUIT: 3,
-  SIGILL: 4,
-  SIGTRAP: 5,
-  SIGABRT: 6,
-  SIGBUS: 7,
-  SIGFPE: 8,
-  SIGKILL: 9,
-  SIGUSR1: 10,
-  SIGSEGV: 11,
-  SIGUSR2: 12,
-  SIGPIPE: 13,
-  SIGALRM: 14,
-  SIGTERM: 15,
-  SIGSTKFLT: 16,
-  SIGCHLD: 17,
-  SIGCONT: 18,
-  SIGSTOP: 19,
-  SIGTSTP: 20,
-  SIGTTIN: 21,
-  SIGTTOU: 22,
-  SIGURG: 23,
-  SIGXCPU: 24,
-  SIGXFSZ: 25,
-  SIGVTALRM: 26,
-  SIGPROF: 27,
-  SIGWINCH: 28,
-  SIGIO: 29,
-  SIGPWR: 30,
-  SIGSYS: 31,
-  SIGRTMIN: 35,
-}
diff --git a/node_modules/nodemon/lib/monitor/watch.js b/node_modules/nodemon/lib/monitor/watch.js
deleted file mode 100644
index d0ac7fe14f65bcafebe0ae971834fa4d6beb28e4..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/monitor/watch.js
+++ /dev/null
@@ -1,244 +0,0 @@
-module.exports.watch = watch;
-module.exports.resetWatchers = resetWatchers;
-
-var debug = require('debug')('nodemon:watch');
-var debugRoot = require('debug')('nodemon');
-var chokidar = require('chokidar');
-var undefsafe = require('undefsafe');
-var config = require('../config');
-var path = require('path');
-var utils = require('../utils');
-var bus = utils.bus;
-var match = require('./match');
-var watchers = [];
-var debouncedBus;
-
-bus.on('reset', resetWatchers);
-
-function resetWatchers() {
-  debugRoot('resetting watchers');
-  watchers.forEach(function (watcher) {
-    watcher.close();
-  });
-  watchers = [];
-}
-
-function watch() {
-  if (watchers.length) {
-    debug('early exit on watch, still watching (%s)', watchers.length);
-    return;
-  }
-
-  var dirs = [].slice.call(config.dirs);
-
-  debugRoot('start watch on: %s', dirs.join(', '));
-  const rootIgnored = config.options.ignore;
-  debugRoot('ignored', rootIgnored);
-
-  var watchedFiles = [];
-
-  const promise = new Promise(function (resolve) {
-    const dotFilePattern = /[/\\]\./;
-    var ignored = match.rulesToMonitor(
-      [], // not needed
-      Array.from(rootIgnored),
-      config
-    ).map(pattern => pattern.slice(1));
-
-    const addDotFile = dirs.filter(dir => dir.match(dotFilePattern));
-
-    // don't ignore dotfiles if explicitly watched.
-    if (addDotFile.length === 0) {
-      ignored.push(dotFilePattern);
-    }
-
-    var watchOptions = {
-      ignorePermissionErrors: true,
-      ignored: ignored,
-      persistent: true,
-      usePolling: config.options.legacyWatch || false,
-      interval: config.options.pollingInterval,
-      // note to future developer: I've gone back and forth on adding `cwd`
-      // to the props and in some cases it fixes bugs but typically it causes
-      // bugs elsewhere (since nodemon is used is so many ways). the final
-      // decision is to *not* use it at all and work around it
-      // cwd: ...
-    };
-
-    if (utils.isWindows) {
-      watchOptions.disableGlobbing = true;
-    }
-
-    if (utils.isIBMi) {
-      watchOptions.usePolling = true;
-    }
-
-    if (process.env.TEST) {
-      watchOptions.useFsEvents = false;
-    }
-
-    var watcher = chokidar.watch(
-      dirs,
-      Object.assign({}, watchOptions, config.options.watchOptions || {})
-    );
-
-    watcher.ready = false;
-
-    var total = 0;
-
-    watcher.on('change', filterAndRestart);
-    watcher.on('unlink', filterAndRestart);
-    watcher.on('add', function (file) {
-      if (watcher.ready) {
-        return filterAndRestart(file);
-      }
-
-      watchedFiles.push(file);
-      bus.emit('watching', file);
-      debug('chokidar watching: %s', file);
-    });
-    watcher.on('ready', function () {
-      watchedFiles = Array.from(new Set(watchedFiles)); // ensure no dupes
-      total = watchedFiles.length;
-      watcher.ready = true;
-      resolve(total);
-      debugRoot('watch is complete');
-    });
-
-    watcher.on('error', function (error) {
-      if (error.code === 'EINVAL') {
-        utils.log.error(
-          'Internal watch failed. Likely cause: too many ' +
-          'files being watched (perhaps from the root of a drive?\n' +
-          'See https://github.com/paulmillr/chokidar/issues/229 for details'
-        );
-      } else {
-        utils.log.error('Internal watch failed: ' + error.message);
-        process.exit(1);
-      }
-    });
-
-    watchers.push(watcher);
-  });
-
-  return promise.catch(e => {
-    // this is a core error and it should break nodemon - so I have to break
-    // out of a promise using the setTimeout
-    setTimeout(() => {
-      throw e;
-    });
-  }).then(function () {
-    utils.log.detail(`watching ${watchedFiles.length} file${
-      watchedFiles.length === 1 ? '' : 's'}`);
-    return watchedFiles;
-  });
-}
-
-function filterAndRestart(files) {
-  if (!Array.isArray(files)) {
-    files = [files];
-  }
-
-  if (files.length) {
-    var cwd = process.cwd();
-    if (this.options && this.options.cwd) {
-      cwd = this.options.cwd;
-    }
-
-    utils.log.detail(
-      'files triggering change check: ' +
-      files
-        .map(file => {
-          const res = path.relative(cwd, file);
-          return res;
-        })
-        .join(', ')
-    );
-
-    // make sure the path is right and drop an empty
-    // filenames (sometimes on windows)
-    files = files.filter(Boolean).map(file => {
-      return path.relative(process.cwd(), path.relative(cwd, file));
-    });
-
-    if (utils.isWindows) {
-      // ensure the drive letter is in uppercase (c:\foo -> C:\foo)
-      files = files.map(f => {
-        if (f.indexOf(':') === -1) { return f; }
-        return f[0].toUpperCase() + f.slice(1);
-      });
-    }
-
-
-    debug('filterAndRestart on', files);
-
-    var matched = match(
-      files,
-      config.options.monitor,
-      undefsafe(config, 'options.execOptions.ext')
-    );
-
-    debug('matched?', JSON.stringify(matched));
-
-    // if there's no matches, then test to see if the changed file is the
-    // running script, if so, let's allow a restart
-    if (config.options.execOptions && config.options.execOptions.script) {
-      const script = path.resolve(config.options.execOptions.script);
-      if (matched.result.length === 0 && script) {
-        const length = script.length;
-        files.find(file => {
-          if (file.substr(-length, length) === script) {
-            matched = {
-              result: [file],
-              total: 1,
-            };
-            return true;
-          }
-        });
-      }
-    }
-
-    utils.log.detail(
-      'changes after filters (before/after): ' +
-      [files.length, matched.result.length].join('/')
-    );
-
-    // reset the last check so we're only looking at recently modified files
-    config.lastStarted = Date.now();
-
-    if (matched.result.length) {
-      if (config.options.delay > 0) {
-        utils.log.detail('delaying restart for ' + config.options.delay + 'ms');
-        if (debouncedBus === undefined) {
-          debouncedBus = debounce(restartBus, config.options.delay);
-        }
-        debouncedBus(matched);
-      } else {
-        return restartBus(matched);
-      }
-    }
-  }
-}
-
-function restartBus(matched) {
-  utils.log.status('restarting due to changes...');
-  matched.result.map(file => {
-    utils.log.detail(path.relative(process.cwd(), file));
-  });
-
-  if (config.options.verbose) {
-    utils.log._log('');
-  }
-
-  bus.emit('restart', matched.result);
-}
-
-function debounce(fn, delay) {
-  var timer = null;
-  return function () {
-    const context = this;
-    const args = arguments;
-    clearTimeout(timer);
-    timer = setTimeout(() =>fn.apply(context, args), delay);
-  };
-}
diff --git a/node_modules/nodemon/lib/nodemon.js b/node_modules/nodemon/lib/nodemon.js
deleted file mode 100644
index 75619ba40184df7761f8a2677633d9669d990a3c..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/nodemon.js
+++ /dev/null
@@ -1,317 +0,0 @@
-var debug = require('debug')('nodemon');
-var path = require('path');
-var monitor = require('./monitor');
-var cli = require('./cli');
-var version = require('./version');
-var util = require('util');
-var utils = require('./utils');
-var bus = utils.bus;
-var help = require('./help');
-/** @type {import('..').NodemonEventConfig} */
-var config = require('./config');
-var spawn = require('./spawn');
-const defaults = require('./config/defaults')
-var eventHandlers = {};
-
-// this is fairly dirty, but theoretically sound since it's part of the
-// stable module API
-config.required = utils.isRequired;
-
-/**
- * @param {import('..').NodemonSettings | string} settings
- * @returns {import('..').Nodemon}
- */
-function nodemon(settings) {
-  bus.emit('boot');
-  nodemon.reset();
-  
-  /** @type {import('..').NodemonSettings} */
-  let options
-
-  // allow the cli string as the argument to nodemon, and allow for
-  // `node nodemon -V app.js` or just `-V app.js`
-  if (typeof settings === 'string') {
-    settings = settings.trim();
-    if (settings.indexOf('node') !== 0) {
-      if (settings.indexOf('nodemon') !== 0) {
-        settings = 'nodemon ' + settings;
-      }
-      settings = 'node ' + settings;
-    }
-    options = cli.parse(settings);
-  } else options = settings;
-
-  // set the debug flag as early as possible to get all the detailed logging
-  if (options.verbose) {
-    utils.debug = true;
-  }
-
-  if (options.help) {
-    if (process.stdout.isTTY) {
-      process.stdout._handle.setBlocking(true); // nodejs/node#6456
-    }
-    console.log(help(options.help));
-    if (!config.required) {
-      process.exit(0);
-    }
-  }
-
-  if (options.version) {
-    version().then(function (v) {
-      console.log(v);
-      if (!config.required) {
-        process.exit(0);
-      }
-    });
-    return;
-  }
-
-  // nodemon tools like grunt-nodemon. This affects where
-  // the script is being run from, and will affect where
-  // nodemon looks for the nodemon.json files
-  if (options.cwd) {
-    // this is protection to make sure we haven't dont the chdir already...
-    // say like in cli/parse.js (which is where we do this once already!)
-    if (process.cwd() !== path.resolve(config.system.cwd, options.cwd)) {
-      process.chdir(options.cwd);
-    }
-  }
-
-  config.load(options, function (config) {
-    if (!config.options.dump && !config.options.execOptions.script &&
-      config.options.execOptions.exec === 'node') {
-      if (!config.required) {
-        console.log(help('usage'));
-        process.exit();
-      }
-      return;
-    }
-
-    // before we print anything, update the colour setting on logging
-    utils.colours = config.options.colours;
-
-    // always echo out the current version
-    utils.log.info(version.pinned);
-
-    const cwd = process.cwd();
-
-    if (config.options.cwd) {
-      utils.log.detail('process root: ' + cwd);
-    }
-
-    config.loaded.map(file => file.replace(cwd, '.')).forEach(file => {
-      utils.log.detail('reading config ' + file);
-    });
-
-    if (config.options.stdin && config.options.restartable) {
-      // allow nodemon to restart when the use types 'rs\n'
-      process.stdin.resume();
-      process.stdin.setEncoding('utf8');
-      process.stdin.on('data', data => {
-        const str = data.toString().trim().toLowerCase();
-
-        // if the keys entered match the restartable value, then restart!
-        if (str === config.options.restartable) {
-          bus.emit('restart');
-        } else if (data.charCodeAt(0) === 12) { // ctrl+l
-          console.clear();
-        }
-      });
-    } else if (config.options.stdin) {
-      // so let's make sure we don't eat the key presses
-      // but also, since we're wrapping, watch out for
-      // special keys, like ctrl+c x 2 or '.exit' or ctrl+d or ctrl+l
-      var ctrlC = false;
-      var buffer = '';
-
-      process.stdin.on('data', function (data) {
-        data = data.toString();
-        buffer += data;
-        const chr = data.charCodeAt(0);
-
-        // if restartable, echo back
-        if (chr === 3) {
-          if (ctrlC) {
-            process.exit(0);
-          }
-
-          ctrlC = true;
-          return;
-        } else if (buffer === '.exit' || chr === 4) { // ctrl+d
-          process.exit();
-        } else if (chr === 13 || chr === 10) { // enter / carriage return
-          buffer = '';
-        } else if (chr === 12) { // ctrl+l
-          console.clear();
-          buffer = '';
-        }
-        ctrlC = false;
-      });
-      if (process.stdin.setRawMode) {
-        process.stdin.setRawMode(true);
-      }
-    }
-
-    if (config.options.restartable) {
-      utils.log.info('to restart at any time, enter `' +
-        config.options.restartable + '`');
-    }
-
-    if (!config.required) {
-      const restartSignal = config.options.signal === 'SIGUSR2' ? 'SIGHUP' : 'SIGUSR2';
-      process.on(restartSignal, nodemon.restart);
-      utils.bus.on('error', () => {
-        utils.log.fail((new Error().stack));
-      });
-      utils.log.detail((config.options.restartable ? 'or ' : '') + 'send ' +
-        restartSignal + ' to ' + process.pid + ' to restart');
-    }
-
-    const ignoring = config.options.monitor.map(function (rule) {
-      if (rule.slice(0, 1) !== '!') {
-        return false;
-      }
-
-      rule = rule.slice(1);
-
-      // don't notify of default ignores
-      if (defaults.ignoreRoot.indexOf(rule) !== -1) {
-        return false;
-        // return rule.slice(3).slice(0, -3);
-      }
-
-      if (rule.startsWith(cwd)) {
-        return rule.replace(cwd, '.');
-      }
-
-      return rule;
-    }).filter(Boolean).join(' ');
-    if (ignoring) utils.log.detail('ignoring: ' + ignoring);
-
-    utils.log.info('watching path(s): ' + config.options.monitor.map(function (rule) {
-      if (rule.slice(0, 1) !== '!') {
-        try {
-          rule = path.relative(process.cwd(), rule);
-        } catch (e) {}
-
-        return rule;
-      }
-
-      return false;
-    }).filter(Boolean).join(' '));
-
-    utils.log.info('watching extensions: ' + (config.options.execOptions.ext || '(all)'));
-
-    if (config.options.dump) {
-      utils.log._log('log', '--------------');
-      utils.log._log('log', 'node: ' + process.version);
-      utils.log._log('log', 'nodemon: ' + version.pinned);
-      utils.log._log('log', 'command: ' + process.argv.join(' '));
-      utils.log._log('log', 'cwd: ' + cwd);
-      utils.log._log('log', ['OS:', process.platform, process.arch].join(' '));
-      utils.log._log('log', '--------------');
-      utils.log._log('log', util.inspect(config, { depth: null }));
-      utils.log._log('log', '--------------');
-      if (!config.required) {
-        process.exit();
-      }
-
-      return;
-    }
-
-    config.run = true;
-
-    if (config.options.stdout === false) {
-      nodemon.on('start', function () {
-        nodemon.stdout = bus.stdout;
-        nodemon.stderr = bus.stderr;
-
-        bus.emit('readable');
-      });
-    }
-
-    if (config.options.events && Object.keys(config.options.events).length) {
-      Object.keys(config.options.events).forEach(function (key) {
-        utils.log.detail('bind ' + key + ' -> `' +
-          config.options.events[key] + '`');
-        nodemon.on(key, function () {
-          if (config.options && config.options.events) {
-            spawn(config.options.events[key], config,
-              [].slice.apply(arguments));
-          }
-        });
-      });
-    }
-
-    monitor.run(config.options);
-
-  });
-
-  return nodemon;
-}
-
-nodemon.restart = function () {
-  utils.log.status('restarting child process');
-  bus.emit('restart');
-  return nodemon;
-};
-
-nodemon.addListener = nodemon.on = function (event, handler) {
-  if (!eventHandlers[event]) { eventHandlers[event] = []; }
-  eventHandlers[event].push(handler);
-  bus.on(event, handler);
-  return nodemon;
-};
-
-nodemon.once = function (event, handler) {
-  if (!eventHandlers[event]) { eventHandlers[event] = []; }
-  eventHandlers[event].push(handler);
-  bus.once(event, function () {
-    debug('bus.once(%s)', event);
-    eventHandlers[event].splice(eventHandlers[event].indexOf(handler), 1);
-    handler.apply(this, arguments);
-  });
-  return nodemon;
-};
-
-nodemon.emit = function () {
-  bus.emit.apply(bus, [].slice.call(arguments));
-  return nodemon;
-};
-
-nodemon.removeAllListeners = function (event) {
-  // unbind only the `nodemon.on` event handlers
-  Object.keys(eventHandlers).filter(function (e) {
-    return event ? e === event : true;
-  }).forEach(function (event) {
-    eventHandlers[event].forEach(function (handler) {
-      bus.removeListener(event, handler);
-      eventHandlers[event].splice(eventHandlers[event].indexOf(handler), 1);
-    });
-  });
-
-  return nodemon;
-};
-
-nodemon.reset = function (done) {
-  bus.emit('reset', done);
-};
-
-bus.on('reset', function (done) {
-  debug('reset');
-  nodemon.removeAllListeners();
-  monitor.run.kill(true, function () {
-    utils.reset();
-    config.reset();
-    config.run = false;
-    if (done) {
-      done();
-    }
-  });
-});
-
-// expose the full config
-nodemon.config = config;
-
-module.exports = nodemon;
-
diff --git a/node_modules/nodemon/lib/rules/add.js b/node_modules/nodemon/lib/rules/add.js
deleted file mode 100644
index 11f1fd714a2c866e863d47794802cd7b1a8a6837..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/rules/add.js
+++ /dev/null
@@ -1,89 +0,0 @@
-'use strict';
-
-var utils = require('../utils');
-
-// internal
-var reEscComments = /\\#/g;
-// note that '^^' is used in place of escaped comments
-var reUnescapeComments = /\^\^/g;
-var reComments = /#.*$/;
-var reEscapeChars = /[.|\-[\]()\\]/g;
-var reAsterisk = /\*/g;
-
-module.exports = add;
-
-/**
- * Converts file patterns or regular expressions to nodemon
- * compatible RegExp matching rules. Note: the `rules` argument
- * object is modified to include the new rule and new RegExp
- *
- * ### Example:
- *
- *     var rules = { watch: [], ignore: [] };
- *     add(rules, 'watch', '*.js');
- *     add(rules, 'ignore', '/public/');
- *     add(rules, 'watch', ':(\d)*\.js'); // note: string based regexp
- *     add(rules, 'watch', /\d*\.js/);
- *
- * @param {Object} rules containing `watch` and `ignore`. Also updated during
- *                       execution
- * @param {String} which must be either "watch" or "ignore"
- * @param {String|RegExp} rule the actual rule.
- */
-function add(rules, which, rule) {
-  if (!{ ignore: 1, watch: 1}[which]) {
-    throw new Error('rules/index.js#add requires "ignore" or "watch" as the ' +
-      'first argument');
-  }
-
-  if (Array.isArray(rule)) {
-    rule.forEach(function (rule) {
-      add(rules, which, rule);
-    });
-    return;
-  }
-
-  // support the rule being a RegExp, but reformat it to
-  // the custom :<regexp> format that we're working with.
-  if (rule instanceof RegExp) {
-    // rule = ':' + rule.toString().replace(/^\/(.*?)\/$/g, '$1');
-    utils.log.error('RegExp format no longer supported, but globs are.');
-    return;
-  }
-
-  // remove comments and trim lines
-  // this mess of replace methods is escaping "\#" to allow for emacs temp files
-
-  // first up strip comments and remove blank head or tails
-  rule = (rule || '').replace(reEscComments, '^^')
-             .replace(reComments, '')
-             .replace(reUnescapeComments, '#').trim();
-
-  var regexp = false;
-
-  if (typeof rule === 'string' && rule.substring(0, 1) === ':') {
-    rule = rule.substring(1);
-    utils.log.error('RegExp no longer supported: ' + rule);
-    regexp = true;
-  } else if (rule.length === 0) {
-    // blank line (or it was a comment)
-    return;
-  }
-
-  if (regexp) {
-    // rules[which].push(rule);
-  } else {
-    // rule = rule.replace(reEscapeChars, '\\$&')
-    // .replace(reAsterisk, '.*');
-
-    rules[which].push(rule);
-    // compile a regexp of all the rules for this ignore or watch
-    var re = rules[which].map(function (rule) {
-      return rule.replace(reEscapeChars, '\\$&')
-                 .replace(reAsterisk, '.*');
-    }).join('|');
-
-    // used for the directory matching
-    rules[which].re = new RegExp(re);
-  }
-}
diff --git a/node_modules/nodemon/lib/rules/index.js b/node_modules/nodemon/lib/rules/index.js
deleted file mode 100644
index 04aa92f87ef0e915a4e7640ab418cb79a29df8d2..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/rules/index.js
+++ /dev/null
@@ -1,53 +0,0 @@
-'use strict';
-var utils = require('../utils');
-var add = require('./add');
-var parse = require('./parse');
-
-// exported
-var rules = { ignore: [], watch: [] };
-
-/**
- * Loads a nodemon config file and populates the ignore
- * and watch rules with it's contents, and calls callback
- * with the new rules
- *
- * @param  {String} filename
- * @param  {Function} callback
- */
-function load(filename, callback) {
-  parse(filename, function (err, result) {
-    if (err) {
-      // we should have bombed already, but
-      utils.log.error(err);
-      callback(err);
-    }
-
-    if (result.raw) {
-      result.raw.forEach(add.bind(null, rules, 'ignore'));
-    } else {
-      result.ignore.forEach(add.bind(null, rules, 'ignore'));
-      result.watch.forEach(add.bind(null, rules, 'watch'));
-    }
-
-    callback(null, rules);
-  });
-}
-
-module.exports = {
-  reset: function () { // just used for testing
-    rules.ignore.length = rules.watch.length = 0;
-    delete rules.ignore.re;
-    delete rules.watch.re;
-  },
-  load: load,
-  ignore: {
-    test: add.bind(null, rules, 'ignore'),
-    add: add.bind(null, rules, 'ignore'),
-  },
-  watch: {
-    test: add.bind(null, rules, 'watch'),
-    add: add.bind(null, rules, 'watch'),
-  },
-  add: add.bind(null, rules),
-  rules: rules,
-};
\ No newline at end of file
diff --git a/node_modules/nodemon/lib/rules/parse.js b/node_modules/nodemon/lib/rules/parse.js
deleted file mode 100644
index 6e1caceaa1e574fac2323d5e78ccf1f226bd832e..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/rules/parse.js
+++ /dev/null
@@ -1,43 +0,0 @@
-'use strict';
-var fs = require('fs');
-
-/**
- * Parse the nodemon config file, supporting both old style
- * plain text config file, and JSON version of the config
- *
- * @param  {String}   filename
- * @param  {Function} callback
- */
-function parse(filename, callback) {
-  var rules = {
-    ignore: [],
-    watch: [],
-  };
-
-  fs.readFile(filename, 'utf8', function (err, content) {
-
-    if (err) {
-      return callback(err);
-    }
-
-    var json = null;
-    try {
-      json = JSON.parse(content);
-    } catch (e) {}
-
-    if (json !== null) {
-      rules = {
-        ignore: json.ignore || [],
-        watch: json.watch || [],
-      };
-
-      return callback(null, rules);
-    }
-
-    // otherwise return the raw file
-    return callback(null, { raw: content.split(/\n/) });
-  });
-}
-
-module.exports = parse;
-
diff --git a/node_modules/nodemon/lib/spawn.js b/node_modules/nodemon/lib/spawn.js
deleted file mode 100644
index 256734a01f90029f50ffad8bfbb9a721ec68ac62..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/spawn.js
+++ /dev/null
@@ -1,74 +0,0 @@
-const path = require('path');
-const utils = require('./utils');
-const merge = utils.merge;
-const bus = utils.bus;
-const spawn = require('child_process').spawn;
-
-module.exports = function spawnCommand(command, config, eventArgs) {
-  var stdio = ['pipe', 'pipe', 'pipe'];
-
-  if (config.options.stdout) {
-    stdio = ['pipe', process.stdout, process.stderr];
-  }
-
-  const env = merge(process.env, { FILENAME: eventArgs[0] });
-
-  var sh = 'sh';
-  var shFlag = '-c';
-  var spawnOptions = {
-    env: merge(config.options.execOptions.env, env),
-    stdio: stdio,
-  };
-
-  if (!Array.isArray(command)) {
-    command = [command];
-  }
-
-  if (utils.isWindows) {
-    // if the exec includes a forward slash, reverse it for windows compat
-    // but *only* apply to the first command, and none of the arguments.
-    // ref #1251 and #1236
-    command = command.map(executable => {
-      if (executable.indexOf('/') === -1) {
-        return executable;
-      }
-
-      return  executable.split(' ').map((e, i) => {
-        if (i === 0) {
-          return path.normalize(e);
-        }
-        return e;
-      }).join(' ');
-    });
-    // taken from npm's cli: https://git.io/vNFD4
-    sh = process.env.comspec || 'cmd';
-    shFlag = '/d /s /c';
-    spawnOptions.windowsVerbatimArguments = true;
-    spawnOptions.windowsHide = true;
-  }
-
-  const args = command.join(' ');
-  const child = spawn(sh, [shFlag, args], spawnOptions);
-
-  if (config.required) {
-    var emit = {
-      stdout: function (data) {
-        bus.emit('stdout', data);
-      },
-      stderr: function (data) {
-        bus.emit('stderr', data);
-      },
-    };
-
-    // now work out what to bind to...
-    if (config.options.stdout) {
-      child.on('stdout', emit.stdout).on('stderr', emit.stderr);
-    } else {
-      child.stdout.on('data', emit.stdout);
-      child.stderr.on('data', emit.stderr);
-
-      bus.stdout = child.stdout;
-      bus.stderr = child.stderr;
-    }
-  }
-};
diff --git a/node_modules/nodemon/lib/utils/bus.js b/node_modules/nodemon/lib/utils/bus.js
deleted file mode 100644
index 4e120c58d6d4f3a1f35156b48b06eef92e233a73..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/utils/bus.js
+++ /dev/null
@@ -1,44 +0,0 @@
-var events = require('events');
-var debug = require('debug')('nodemon');
-var util = require('util');
-
-var Bus = function () {
-  events.EventEmitter.call(this);
-};
-
-util.inherits(Bus, events.EventEmitter);
-
-var bus = new Bus();
-
-// /*
-var collected = {};
-bus.on('newListener', function (event) {
-  debug('bus new listener: %s (%s)', event, bus.listeners(event).length);
-  if (!collected[event]) {
-    collected[event] = true;
-    bus.on(event, function () {
-      debug('bus emit: %s', event);
-    });
-  }
-});
-
-// */
-
-// proxy process messages (if forked) to the bus
-process.on('message', function (event) {
-  debug('process.message(%s)', event);
-  bus.emit(event);
-});
-
-var emit = bus.emit;
-
-// if nodemon was spawned via a fork, allow upstream communication
-// via process.send
-if (process.send) {
-  bus.emit = function (event, data) {
-    process.send({ type: event, data: data });
-    emit.apply(bus, arguments);
-  };
-}
-
-module.exports = bus;
diff --git a/node_modules/nodemon/lib/utils/clone.js b/node_modules/nodemon/lib/utils/clone.js
deleted file mode 100644
index 6ba6330f33551e3378bd53ab17d8a2c3a3e56b65..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/utils/clone.js
+++ /dev/null
@@ -1,40 +0,0 @@
-module.exports = clone;
-
-// via http://stackoverflow.com/a/728694/22617
-function clone(obj) {
-  // Handle the 3 simple types, and null or undefined
-  if (null === obj || 'object' !== typeof obj) {
-    return obj;
-  }
-
-  var copy;
-
-  // Handle Date
-  if (obj instanceof Date) {
-    copy = new Date();
-    copy.setTime(obj.getTime());
-    return copy;
-  }
-
-  // Handle Array
-  if (obj instanceof Array) {
-    copy = [];
-    for (var i = 0, len = obj.length; i < len; i++) {
-      copy[i] = clone(obj[i]);
-    }
-    return copy;
-  }
-
-  // Handle Object
-  if (obj instanceof Object) {
-    copy = {};
-    for (var attr in obj) {
-      if (obj.hasOwnProperty && obj.hasOwnProperty(attr)) {
-        copy[attr] = clone(obj[attr]);
-      }
-    }
-    return copy;
-  }
-
-  throw new Error('Unable to copy obj! Its type isn\'t supported.');
-}
\ No newline at end of file
diff --git a/node_modules/nodemon/lib/utils/colour.js b/node_modules/nodemon/lib/utils/colour.js
deleted file mode 100644
index 8c1b59054413d7c17868e8935a186878ed6e2238..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/utils/colour.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Encodes a string in a colour: red, yellow or green
- * @param  {String} c   colour to highlight in
- * @param  {String} str the string to encode
- * @return {String}     coloured string for terminal printing
- */
-function colour(c, str) {
-  return (colour[c] || colour.black) + str + colour.black;
-}
-
-function strip(str) {
-  re.lastIndex = 0; // reset position
-  return str.replace(re, '');
-}
-
-colour.red = '\x1B[31m';
-colour.yellow = '\x1B[33m';
-colour.green = '\x1B[32m';
-colour.black = '\x1B[39m';
-
-var reStr = Object.keys(colour).map(key => colour[key]).join('|');
-var re = new RegExp(('(' + reStr + ')').replace(/\[/g, '\\['), 'g');
-
-colour.strip = strip;
-
-module.exports = colour;
diff --git a/node_modules/nodemon/lib/utils/index.js b/node_modules/nodemon/lib/utils/index.js
deleted file mode 100644
index 92651216d2f127321b2b1cf5a08a46a92325cc73..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/utils/index.js
+++ /dev/null
@@ -1,103 +0,0 @@
-var noop = function () { };
-var path = require('path');
-const semver = require('semver');
-var version = process.versions.node.split('.') || [null, null, null];
-
-var utils = (module.exports = {
-  semver: semver,
-  satisfies: test => semver.satisfies(process.versions.node, test),
-  version: {
-    major: parseInt(version[0] || 0, 10),
-    minor: parseInt(version[1] || 0, 10),
-    patch: parseInt(version[2] || 0, 10),
-  },
-  clone: require('./clone'),
-  merge: require('./merge'),
-  bus: require('./bus'),
-  isWindows: process.platform === 'win32',
-  isMac: process.platform === 'darwin',
-  isLinux: process.platform === 'linux',
-  isIBMi: require('os').type() === 'OS400',
-  isRequired: (function () {
-    var p = module.parent;
-    while (p) {
-      // in electron.js engine it happens
-      if (!p.filename) {
-        return true;
-      }
-      if (p.filename.indexOf('bin' + path.sep + 'nodemon.js') !== -1) {
-        return false;
-      }
-      p = p.parent;
-    }
-
-    return true;
-  })(),
-  home: process.env.HOME || process.env.HOMEPATH,
-  quiet: function () {
-    // nukes the logging
-    if (!this.debug) {
-      for (var method in utils.log) {
-        if (typeof utils.log[method] === 'function') {
-          utils.log[method] = noop;
-        }
-      }
-    }
-  },
-  reset: function () {
-    if (!this.debug) {
-      for (var method in utils.log) {
-        if (typeof utils.log[method] === 'function') {
-          delete utils.log[method];
-        }
-      }
-    }
-    this.debug = false;
-  },
-  regexpToText: function (t) {
-    return t
-      .replace(/\.\*\\./g, '*.')
-      .replace(/\\{2}/g, '^^')
-      .replace(/\\/g, '')
-      .replace(/\^\^/g, '\\');
-  },
-  stringify: function (exec, args) {
-    // serializes an executable string and array of arguments into a string
-    args = args || [];
-
-    return [exec]
-      .concat(
-      args.map(function (arg) {
-        // if an argument contains a space, we want to show it with quotes
-        // around it to indicate that it is a single argument
-        if (arg.length > 0 && arg.indexOf(' ') === -1) {
-          return arg;
-        }
-        // this should correctly escape nested quotes
-        return JSON.stringify(arg);
-      })
-      )
-      .join(' ')
-      .trim();
-  },
-});
-
-utils.log = require('./log')(utils.isRequired);
-
-Object.defineProperty(utils, 'debug', {
-  set: function (value) {
-    this.log.debug = value;
-  },
-  get: function () {
-    return this.log.debug;
-  },
-});
-
-Object.defineProperty(utils, 'colours', {
-  set: function (value) {
-    this.log.useColours = value;
-  },
-  get: function () {
-    return this.log.useColours;
-  },
-});
diff --git a/node_modules/nodemon/lib/utils/log.js b/node_modules/nodemon/lib/utils/log.js
deleted file mode 100644
index 65800872d11b5fe861add16be08cf024fcbddc2d..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/utils/log.js
+++ /dev/null
@@ -1,82 +0,0 @@
-var colour = require('./colour');
-var bus = require('./bus');
-var required = false;
-var useColours = true;
-
-var coding = {
-  log: 'black',
-  info: 'yellow',
-  status: 'green',
-  detail: 'yellow',
-  fail: 'red',
-  error: 'red',
-};
-
-function log(type, text) {
-  var msg = '[nodemon] ' + (text || '');
-
-  if (useColours) {
-    msg = colour(coding[type], msg);
-  }
-
-  // always push the message through our bus, using nextTick
-  // to help testing and get _out of_ promises.
-  process.nextTick(() => {
-    bus.emit('log', { type: type, message: text, colour: msg });
-  });
-
-  // but if we're running on the command line, also echo out
-  // question: should we actually just consume our own events?
-  if (!required) {
-    if (type === 'error') {
-      console.error(msg);
-    } else {
-      console.log(msg || '');
-    }
-  }
-}
-
-var Logger = function (r) {
-  if (!(this instanceof Logger)) {
-    return new Logger(r);
-  }
-  this.required(r);
-  return this;
-};
-
-Object.keys(coding).forEach(function (type) {
-  Logger.prototype[type] = log.bind(null, type);
-});
-
-// detail is for messages that are turned on during debug
-Logger.prototype.detail = function (msg) {
-  if (this.debug) {
-    log('detail', msg);
-  }
-};
-
-Logger.prototype.required = function (val) {
-  required = val;
-};
-
-Logger.prototype.debug = false;
-Logger.prototype._log = function (type, msg) {
-  if (required) {
-    bus.emit('log', { type: type, message: msg || '', colour: msg || '' });
-  } else if (type === 'error') {
-    console.error(msg);
-  } else {
-    console.log(msg || '');
-  }
-};
-
-Object.defineProperty(Logger.prototype, 'useColours', {
-  set: function (val) {
-    useColours = val;
-  },
-  get: function () {
-    return useColours;
-  },
-});
-
-module.exports = Logger;
diff --git a/node_modules/nodemon/lib/utils/merge.js b/node_modules/nodemon/lib/utils/merge.js
deleted file mode 100644
index 1f3440bd6aa2b3815ae547818a41bfd8e86b3d75..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/utils/merge.js
+++ /dev/null
@@ -1,47 +0,0 @@
-var clone = require('./clone');
-
-module.exports = merge;
-
-function typesMatch(a, b) {
-  return (typeof a === typeof b) && (Array.isArray(a) === Array.isArray(b));
-}
-
-/**
- * A deep merge of the source based on the target.
- * @param  {Object} source   [description]
- * @param  {Object} target   [description]
- * @return {Object}          [description]
- */
-function merge(source, target, result) {
-  if (result === undefined) {
-    result = clone(source);
-  }
-
-  // merge missing values from the target to the source
-  Object.getOwnPropertyNames(target).forEach(function (key) {
-    if (source[key] === undefined) {
-      result[key] = target[key];
-    }
-  });
-
-  Object.getOwnPropertyNames(source).forEach(function (key) {
-    var value = source[key];
-
-    if (target[key] && typesMatch(value, target[key])) {
-      // merge empty values
-      if (value === '') {
-        result[key] = target[key];
-      }
-
-      if (Array.isArray(value)) {
-        if (value.length === 0 && target[key].length) {
-          result[key] = target[key].slice(0);
-        }
-      } else if (typeof value === 'object') {
-        result[key] = merge(value, target[key]);
-      }
-    }
-  });
-
-  return result;
-}
\ No newline at end of file
diff --git a/node_modules/nodemon/lib/version.js b/node_modules/nodemon/lib/version.js
deleted file mode 100644
index d0f510447f57b96aad5bf60c59f6cd3d741bfb8d..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/lib/version.js
+++ /dev/null
@@ -1,100 +0,0 @@
-module.exports = version;
-module.exports.pin = pin;
-
-var fs = require('fs');
-var path = require('path');
-var exec = require('child_process').exec;
-var root = null;
-
-function pin() {
-  return version().then(function (v) {
-    version.pinned = v;
-  });
-}
-
-function version(callback) {
-  // first find the package.json as this will be our root
-  var promise = findPackage(path.dirname(module.parent.filename))
-    .then(function (dir) {
-      // now try to load the package
-      var v = require(path.resolve(dir, 'package.json')).version;
-
-      if (v && v !== '0.0.0-development') {
-        return v;
-      }
-
-      root = dir;
-
-      // else we're in development, give the commit out
-      // get the last commit and whether the working dir is dirty
-      var promises = [
-        branch().catch(function () { return 'master'; }),
-        commit().catch(function () { return '<none>'; }),
-        dirty().catch(function () { return 0; }),
-      ];
-
-      // use the cached result as the export
-      return Promise.all(promises).then(function (res) {
-        var branch = res[0];
-        var commit = res[1];
-        var dirtyCount = parseInt(res[2], 10);
-        var curr = branch + ': ' + commit;
-        if (dirtyCount !== 0) {
-          curr += ' (' + dirtyCount + ' dirty files)';
-        }
-
-        return curr;
-      });
-    }).catch(function (error) {
-      console.log(error.stack);
-      throw error;
-    });
-
-  if (callback) {
-    promise.then(function (res) {
-      callback(null, res);
-    }, callback);
-  }
-
-  return promise;
-}
-
-function findPackage(dir) {
-  if (dir === '/') {
-    return Promise.reject(new Error('package not found'));
-  }
-  return new Promise(function (resolve) {
-    fs.stat(path.resolve(dir, 'package.json'), function (error, exists) {
-      if (error || !exists) {
-        return resolve(findPackage(path.resolve(dir, '..')));
-      }
-
-      resolve(dir);
-    });
-  });
-}
-
-function command(cmd) {
-  return new Promise(function (resolve, reject) {
-    exec(cmd, { cwd: root }, function (err, stdout, stderr) {
-      var error = stderr.trim();
-      if (error) {
-        return reject(new Error(error));
-      }
-      resolve(stdout.split('\n').join(''));
-    });
-  });
-}
-
-function commit() {
-  return command('git rev-parse HEAD');
-}
-
-function branch() {
-  return command('git rev-parse --abbrev-ref HEAD');
-}
-
-function dirty() {
-  return command('expr $(git status --porcelain 2>/dev/null| ' +
-    'egrep "^(M| M)" | wc -l)');
-}
diff --git a/node_modules/nodemon/node_modules/debug/LICENSE b/node_modules/nodemon/node_modules/debug/LICENSE
deleted file mode 100644
index 1a9820e262b26b60fe71a4dcd9bc9cfd0a01f26e..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/debug/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca>
-Copyright (c) 2018-2021 Josh Junon
-
-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/nodemon/node_modules/debug/README.md b/node_modules/nodemon/node_modules/debug/README.md
deleted file mode 100644
index 9ebdfbf1491ef8bdffb942ee0b475e38a65379bf..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/debug/README.md
+++ /dev/null
@@ -1,481 +0,0 @@
-# debug
-[![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);
-```
-
-In Chromium-based web browsers (e.g. Brave, Chrome, and Electron), the JavaScript console will—by default—only show messages logged by `debug` if the "Verbose" log level is _enabled_.
-
-<img width="647" src="https://user-images.githubusercontent.com/7143133/152083257-29034707-c42c-4959-8add-3cee850e6fcf.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_](./examples/node/stdout.js):
-
-```js
-var debug = require('debug');
-var error = debug('app:error');
-
-// by default stderr is used
-error('goes to stderr!');
-
-var log = debug('app:log');
-// set this namespace to log via console.log
-log.log = console.log.bind(console); // don't forget to bind to console!
-log('goes to stdout');
-error('still goes to stderr!');
-
-// set all output to go via console.info
-// overrides all per-namespace log settings
-debug.log = console.info.bind(console);
-error('now goes to stdout via console.info');
-log('still goes to stdout, but via console.info now');
-```
-
-## Extend
-You can simply extend debugger 
-```js
-const log = require('debug')('auth');
-
-//creates new debug instance with extended namespace
-const logSign = log.extend('sign');
-const logLogin = log.extend('login');
-
-log('hello'); // auth hello
-logSign('hello'); //auth:sign hello
-logLogin('hello'); //auth:login hello
-```
-
-## Set dynamically
-
-You can also enable debug dynamically by calling the `enable()` method :
-
-```js
-let debug = require('debug');
-
-console.log(1, debug.enabled('test'));
-
-debug.enable('test');
-console.log(2, debug.enabled('test'));
-
-debug.disable();
-console.log(3, debug.enabled('test'));
-
-```
-
-print :   
-```
-1 false
-2 true
-3 false
-```
-
-Usage :  
-`enable(namespaces)`  
-`namespaces` can include modes separated by a colon and wildcards.
-   
-Note that calling `enable()` completely overrides previously set DEBUG variable : 
-
-```
-$ DEBUG=foo node -e 'var dbg = require("debug"); dbg.enable("bar"); console.log(dbg.enabled("foo"))'
-=> false
-```
-
-`disable()`
-
-Will disable all namespaces. The functions returns the namespaces currently
-enabled (and skipped). This can be useful if you want to disable debugging
-temporarily without knowing what was enabled to begin with.
-
-For example:
-
-```js
-let debug = require('debug');
-debug.enable('foo:*,-foo:bar');
-let namespaces = debug.disable();
-debug.enable(namespaces);
-```
-
-Note: There is no guarantee that the string will be identical to the initial
-enable string, but semantically they will be identical.
-
-## Checking whether a debug target is enabled
-
-After you've created a debug instance, you can determine whether or not it is
-enabled by checking the `enabled` property:
-
-```javascript
-const debug = require('debug')('http');
-
-if (debug.enabled) {
-  // do stuff...
-}
-```
-
-You can also manually toggle this property to force the debug instance to be
-enabled or disabled.
-
-## Usage in child processes
-
-Due to the way `debug` detects if the output is a TTY or not, colors are not shown in child processes when `stderr` is piped. A solution is to pass the `DEBUG_COLORS=1` environment variable to the child process.  
-For example:
-
-```javascript
-worker = fork(WORKER_WRAP_PATH, [workerPath], {
-  stdio: [
-    /* stdin: */ 0,
-    /* stdout: */ 'pipe',
-    /* stderr: */ 'pipe',
-    'ipc',
-  ],
-  env: Object.assign({}, process.env, {
-    DEBUG_COLORS: 1 // without this settings, colors won't be shown
-  }),
-});
-
-worker.stderr.pipe(process.stderr, { end: false });
-```
-
-
-## Authors
-
- - TJ Holowaychuk
- - Nathan Rajlich
- - Andrew Rhyne
- - Josh Junon
-
-## 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;
-Copyright (c) 2018-2021 Josh Junon
-
-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/nodemon/node_modules/debug/package.json b/node_modules/nodemon/node_modules/debug/package.json
deleted file mode 100644
index 60dfcf57cae4075ae91eb6a9c8ce99356f920b69..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/debug/package.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
-  "name": "debug",
-  "version": "4.4.0",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/debug-js/debug.git"
-  },
-  "description": "Lightweight debugging utility for Node.js and the browser",
-  "keywords": [
-    "debug",
-    "log",
-    "debugger"
-  ],
-  "files": [
-    "src",
-    "LICENSE",
-    "README.md"
-  ],
-  "author": "Josh Junon (https://github.com/qix-)",
-  "contributors": [
-    "TJ Holowaychuk <tj@vision-media.ca>",
-    "Nathan Rajlich <nathan@tootallnate.net> (http://n8.io)",
-    "Andrew Rhyne <rhyneandrew@gmail.com>"
-  ],
-  "license": "MIT",
-  "scripts": {
-    "lint": "xo",
-    "test": "npm run test:node && npm run test:browser && npm run lint",
-    "test:node": "istanbul cover _mocha -- test.js test.node.js",
-    "test:browser": "karma start --single-run",
-    "test:coverage": "cat ./coverage/lcov.info | coveralls"
-  },
-  "dependencies": {
-    "ms": "^2.1.3"
-  },
-  "devDependencies": {
-    "brfs": "^2.0.1",
-    "browserify": "^16.2.3",
-    "coveralls": "^3.0.2",
-    "istanbul": "^0.4.5",
-    "karma": "^3.1.4",
-    "karma-browserify": "^6.0.0",
-    "karma-chrome-launcher": "^2.2.0",
-    "karma-mocha": "^1.3.0",
-    "mocha": "^5.2.0",
-    "mocha-lcov-reporter": "^1.2.0",
-    "sinon": "^14.0.0",
-    "xo": "^0.23.0"
-  },
-  "peerDependenciesMeta": {
-    "supports-color": {
-      "optional": true
-    }
-  },
-  "main": "./src/index.js",
-  "browser": "./src/browser.js",
-  "engines": {
-    "node": ">=6.0"
-  },
-  "xo": {
-    "rules": {
-      "import/extensions": "off"
-    }
-  }
-}
diff --git a/node_modules/nodemon/node_modules/debug/src/browser.js b/node_modules/nodemon/node_modules/debug/src/browser.js
deleted file mode 100644
index df8e179e8b5d9b1d215e4bb06beca85272031859..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/debug/src/browser.js
+++ /dev/null
@@ -1,272 +0,0 @@
-/* eslint-env browser */
-
-/**
- * This is the web browser implementation of `debug()`.
- */
-
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-exports.storage = localstorage();
-exports.destroy = (() => {
-	let warned = false;
-
-	return () => {
-		if (!warned) {
-			warned = true;
-			console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
-		}
-	};
-})();
-
-/**
- * Colors.
- */
-
-exports.colors = [
-	'#0000CC',
-	'#0000FF',
-	'#0033CC',
-	'#0033FF',
-	'#0066CC',
-	'#0066FF',
-	'#0099CC',
-	'#0099FF',
-	'#00CC00',
-	'#00CC33',
-	'#00CC66',
-	'#00CC99',
-	'#00CCCC',
-	'#00CCFF',
-	'#3300CC',
-	'#3300FF',
-	'#3333CC',
-	'#3333FF',
-	'#3366CC',
-	'#3366FF',
-	'#3399CC',
-	'#3399FF',
-	'#33CC00',
-	'#33CC33',
-	'#33CC66',
-	'#33CC99',
-	'#33CCCC',
-	'#33CCFF',
-	'#6600CC',
-	'#6600FF',
-	'#6633CC',
-	'#6633FF',
-	'#66CC00',
-	'#66CC33',
-	'#9900CC',
-	'#9900FF',
-	'#9933CC',
-	'#9933FF',
-	'#99CC00',
-	'#99CC33',
-	'#CC0000',
-	'#CC0033',
-	'#CC0066',
-	'#CC0099',
-	'#CC00CC',
-	'#CC00FF',
-	'#CC3300',
-	'#CC3333',
-	'#CC3366',
-	'#CC3399',
-	'#CC33CC',
-	'#CC33FF',
-	'#CC6600',
-	'#CC6633',
-	'#CC9900',
-	'#CC9933',
-	'#CCCC00',
-	'#CCCC33',
-	'#FF0000',
-	'#FF0033',
-	'#FF0066',
-	'#FF0099',
-	'#FF00CC',
-	'#FF00FF',
-	'#FF3300',
-	'#FF3333',
-	'#FF3366',
-	'#FF3399',
-	'#FF33CC',
-	'#FF33FF',
-	'#FF6600',
-	'#FF6633',
-	'#FF9900',
-	'#FF9933',
-	'#FFCC00',
-	'#FFCC33'
-];
-
-/**
- * Currently only WebKit-based Web Inspectors, Firefox >= v31,
- * and the Firebug extension (any Firefox version) are known
- * to support "%c" CSS customizations.
- *
- * TODO: add a `localStorage` variable to explicitly enable/disable colors
- */
-
-// eslint-disable-next-line complexity
-function useColors() {
-	// NB: In an Electron preload script, document will be defined but not fully
-	// initialized. Since we know we're in Chrome, we'll just detect this case
-	// explicitly
-	if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
-		return true;
-	}
-
-	// Internet Explorer and Edge do not support colors.
-	if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
-		return false;
-	}
-
-	let m;
-
-	// Is webkit? http://stackoverflow.com/a/16459606/376773
-	// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
-	// eslint-disable-next-line no-return-assign
-	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 && (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && parseInt(m[1], 10) >= 31) ||
-		// Double check webkit in userAgent just in case we are in a worker
-		(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
-}
-
-/**
- * Colorize log arguments if enabled.
- *
- * @api public
- */
-
-function formatArgs(args) {
-	args[0] = (this.useColors ? '%c' : '') +
-		this.namespace +
-		(this.useColors ? ' %c' : ' ') +
-		args[0] +
-		(this.useColors ? '%c ' : ' ') +
-		'+' + module.exports.humanize(this.diff);
-
-	if (!this.useColors) {
-		return;
-	}
-
-	const c = 'color: ' + this.color;
-	args.splice(1, 0, c, 'color: inherit');
-
-	// The final "%c" is somewhat tricky, because there could be other
-	// arguments passed either before or after the %c, so we need to
-	// figure out the correct index to insert the CSS into
-	let index = 0;
-	let lastC = 0;
-	args[0].replace(/%[a-zA-Z%]/g, match => {
-		if (match === '%%') {
-			return;
-		}
-		index++;
-		if (match === '%c') {
-			// We only are interested in the *last* %c
-			// (the user may have provided their own)
-			lastC = index;
-		}
-	});
-
-	args.splice(lastC, 0, c);
-}
-
-/**
- * Invokes `console.debug()` when available.
- * No-op when `console.debug` is not a "function".
- * If `console.debug` is not available, falls back
- * to `console.log`.
- *
- * @api public
- */
-exports.log = console.debug || console.log || (() => {});
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-function save(namespaces) {
-	try {
-		if (namespaces) {
-			exports.storage.setItem('debug', namespaces);
-		} else {
-			exports.storage.removeItem('debug');
-		}
-	} catch (error) {
-		// Swallow
-		// XXX (@Qix-) should we be logging these?
-	}
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-function load() {
-	let r;
-	try {
-		r = exports.storage.getItem('debug');
-	} catch (error) {
-		// Swallow
-		// XXX (@Qix-) should we be logging these?
-	}
-
-	// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
-	if (!r && typeof process !== 'undefined' && 'env' in process) {
-		r = process.env.DEBUG;
-	}
-
-	return r;
-}
-
-/**
- * Localstorage attempts to return the localstorage.
- *
- * This is necessary because safari throws
- * when a user disables cookies/localstorage
- * and you attempt to access it.
- *
- * @return {LocalStorage}
- * @api private
- */
-
-function localstorage() {
-	try {
-		// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
-		// The Browser also has localStorage in the global context.
-		return localStorage;
-	} catch (error) {
-		// Swallow
-		// XXX (@Qix-) should we be logging these?
-	}
-}
-
-module.exports = require('./common')(exports);
-
-const {formatters} = module.exports;
-
-/**
- * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
- */
-
-formatters.j = function (v) {
-	try {
-		return JSON.stringify(v);
-	} catch (error) {
-		return '[UnexpectedJSONParseError]: ' + error.message;
-	}
-};
diff --git a/node_modules/nodemon/node_modules/debug/src/common.js b/node_modules/nodemon/node_modules/debug/src/common.js
deleted file mode 100644
index 528c7ecf417cd5bcd1c20ce2fa2a961412cf660f..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/debug/src/common.js
+++ /dev/null
@@ -1,292 +0,0 @@
-
-/**
- * This is the common logic for both the Node.js and web browser
- * implementations of `debug()`.
- */
-
-function setup(env) {
-	createDebug.debug = createDebug;
-	createDebug.default = createDebug;
-	createDebug.coerce = coerce;
-	createDebug.disable = disable;
-	createDebug.enable = enable;
-	createDebug.enabled = enabled;
-	createDebug.humanize = require('ms');
-	createDebug.destroy = destroy;
-
-	Object.keys(env).forEach(key => {
-		createDebug[key] = env[key];
-	});
-
-	/**
-	* The currently active debug mode names, and names to skip.
-	*/
-
-	createDebug.names = [];
-	createDebug.skips = [];
-
-	/**
-	* Map of special "%n" handling functions, for the debug "format" argument.
-	*
-	* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
-	*/
-	createDebug.formatters = {};
-
-	/**
-	* Selects a color for a debug namespace
-	* @param {String} namespace The namespace string for the debug instance to be colored
-	* @return {Number|String} An ANSI color code for the given namespace
-	* @api private
-	*/
-	function selectColor(namespace) {
-		let hash = 0;
-
-		for (let i = 0; i < namespace.length; i++) {
-			hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
-			hash |= 0; // Convert to 32bit integer
-		}
-
-		return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
-	}
-	createDebug.selectColor = selectColor;
-
-	/**
-	* Create a debugger with the given `namespace`.
-	*
-	* @param {String} namespace
-	* @return {Function}
-	* @api public
-	*/
-	function createDebug(namespace) {
-		let prevTime;
-		let enableOverride = null;
-		let namespacesCache;
-		let enabledCache;
-
-		function debug(...args) {
-			// Disabled?
-			if (!debug.enabled) {
-				return;
-			}
-
-			const self = debug;
-
-			// Set `diff` timestamp
-			const curr = Number(new Date());
-			const ms = curr - (prevTime || curr);
-			self.diff = ms;
-			self.prev = prevTime;
-			self.curr = curr;
-			prevTime = curr;
-
-			args[0] = createDebug.coerce(args[0]);
-
-			if (typeof args[0] !== 'string') {
-				// Anything else let's inspect with %O
-				args.unshift('%O');
-			}
-
-			// Apply any `formatters` transformations
-			let index = 0;
-			args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
-				// If we encounter an escaped % then don't increase the array index
-				if (match === '%%') {
-					return '%';
-				}
-				index++;
-				const formatter = createDebug.formatters[format];
-				if (typeof formatter === 'function') {
-					const val = args[index];
-					match = formatter.call(self, val);
-
-					// Now we need to remove `args[index]` since it's inlined in the `format`
-					args.splice(index, 1);
-					index--;
-				}
-				return match;
-			});
-
-			// Apply env-specific formatting (colors, etc.)
-			createDebug.formatArgs.call(self, args);
-
-			const logFn = self.log || createDebug.log;
-			logFn.apply(self, args);
-		}
-
-		debug.namespace = namespace;
-		debug.useColors = createDebug.useColors();
-		debug.color = createDebug.selectColor(namespace);
-		debug.extend = extend;
-		debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.
-
-		Object.defineProperty(debug, 'enabled', {
-			enumerable: true,
-			configurable: false,
-			get: () => {
-				if (enableOverride !== null) {
-					return enableOverride;
-				}
-				if (namespacesCache !== createDebug.namespaces) {
-					namespacesCache = createDebug.namespaces;
-					enabledCache = createDebug.enabled(namespace);
-				}
-
-				return enabledCache;
-			},
-			set: v => {
-				enableOverride = v;
-			}
-		});
-
-		// Env-specific initialization logic for debug instances
-		if (typeof createDebug.init === 'function') {
-			createDebug.init(debug);
-		}
-
-		return debug;
-	}
-
-	function extend(namespace, delimiter) {
-		const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
-		newDebug.log = this.log;
-		return newDebug;
-	}
-
-	/**
-	* Enables a debug mode by namespaces. This can include modes
-	* separated by a colon and wildcards.
-	*
-	* @param {String} namespaces
-	* @api public
-	*/
-	function enable(namespaces) {
-		createDebug.save(namespaces);
-		createDebug.namespaces = namespaces;
-
-		createDebug.names = [];
-		createDebug.skips = [];
-
-		const split = (typeof namespaces === 'string' ? namespaces : '')
-			.trim()
-			.replace(' ', ',')
-			.split(',')
-			.filter(Boolean);
-
-		for (const ns of split) {
-			if (ns[0] === '-') {
-				createDebug.skips.push(ns.slice(1));
-			} else {
-				createDebug.names.push(ns);
-			}
-		}
-	}
-
-	/**
-	 * Checks if the given string matches a namespace template, honoring
-	 * asterisks as wildcards.
-	 *
-	 * @param {String} search
-	 * @param {String} template
-	 * @return {Boolean}
-	 */
-	function matchesTemplate(search, template) {
-		let searchIndex = 0;
-		let templateIndex = 0;
-		let starIndex = -1;
-		let matchIndex = 0;
-
-		while (searchIndex < search.length) {
-			if (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {
-				// Match character or proceed with wildcard
-				if (template[templateIndex] === '*') {
-					starIndex = templateIndex;
-					matchIndex = searchIndex;
-					templateIndex++; // Skip the '*'
-				} else {
-					searchIndex++;
-					templateIndex++;
-				}
-			} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition
-				// Backtrack to the last '*' and try to match more characters
-				templateIndex = starIndex + 1;
-				matchIndex++;
-				searchIndex = matchIndex;
-			} else {
-				return false; // No match
-			}
-		}
-
-		// Handle trailing '*' in template
-		while (templateIndex < template.length && template[templateIndex] === '*') {
-			templateIndex++;
-		}
-
-		return templateIndex === template.length;
-	}
-
-	/**
-	* Disable debug output.
-	*
-	* @return {String} namespaces
-	* @api public
-	*/
-	function disable() {
-		const namespaces = [
-			...createDebug.names,
-			...createDebug.skips.map(namespace => '-' + namespace)
-		].join(',');
-		createDebug.enable('');
-		return namespaces;
-	}
-
-	/**
-	* Returns true if the given mode name is enabled, false otherwise.
-	*
-	* @param {String} name
-	* @return {Boolean}
-	* @api public
-	*/
-	function enabled(name) {
-		for (const skip of createDebug.skips) {
-			if (matchesTemplate(name, skip)) {
-				return false;
-			}
-		}
-
-		for (const ns of createDebug.names) {
-			if (matchesTemplate(name, ns)) {
-				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;
-	}
-
-	/**
-	* XXX DO NOT USE. This is a temporary stub function.
-	* XXX It WILL be removed in the next major release.
-	*/
-	function destroy() {
-		console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
-	}
-
-	createDebug.enable(createDebug.load());
-
-	return createDebug;
-}
-
-module.exports = setup;
diff --git a/node_modules/nodemon/node_modules/debug/src/index.js b/node_modules/nodemon/node_modules/debug/src/index.js
deleted file mode 100644
index bf4c57f259df2e16761b45e2636db307c89ba419..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/debug/src/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * 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/nodemon/node_modules/debug/src/node.js b/node_modules/nodemon/node_modules/debug/src/node.js
deleted file mode 100644
index 715560a4ca8fb4c8dd6353eafdde6e83af28f05e..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/debug/src/node.js
+++ /dev/null
@@ -1,263 +0,0 @@
-/**
- * Module dependencies.
- */
-
-const tty = require('tty');
-const util = require('util');
-
-/**
- * This is the Node.js implementation of `debug()`.
- */
-
-exports.init = init;
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-exports.destroy = util.deprecate(
-	() => {},
-	'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'
-);
-
-/**
- * Colors.
- */
-
-exports.colors = [6, 2, 3, 4, 5, 1];
-
-try {
-	// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)
-	// eslint-disable-next-line import/no-extraneous-dependencies
-	const supportsColor = require('supports-color');
-
-	if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {
-		exports.colors = [
-			20,
-			21,
-			26,
-			27,
-			32,
-			33,
-			38,
-			39,
-			40,
-			41,
-			42,
-			43,
-			44,
-			45,
-			56,
-			57,
-			62,
-			63,
-			68,
-			69,
-			74,
-			75,
-			76,
-			77,
-			78,
-			79,
-			80,
-			81,
-			92,
-			93,
-			98,
-			99,
-			112,
-			113,
-			128,
-			129,
-			134,
-			135,
-			148,
-			149,
-			160,
-			161,
-			162,
-			163,
-			164,
-			165,
-			166,
-			167,
-			168,
-			169,
-			170,
-			171,
-			172,
-			173,
-			178,
-			179,
-			184,
-			185,
-			196,
-			197,
-			198,
-			199,
-			200,
-			201,
-			202,
-			203,
-			204,
-			205,
-			206,
-			207,
-			208,
-			209,
-			214,
-			215,
-			220,
-			221
-		];
-	}
-} catch (error) {
-	// Swallow - we only care if `supports-color` is available; it doesn't have to be.
-}
-
-/**
- * Build up the default `inspectOpts` object from the environment variables.
- *
- *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
- */
-
-exports.inspectOpts = Object.keys(process.env).filter(key => {
-	return /^debug_/i.test(key);
-}).reduce((obj, key) => {
-	// Camel-case
-	const prop = key
-		.substring(6)
-		.toLowerCase()
-		.replace(/_([a-z])/g, (_, k) => {
-			return k.toUpperCase();
-		});
-
-	// Coerce string value into JS value
-	let val = process.env[key];
-	if (/^(yes|on|true|enabled)$/i.test(val)) {
-		val = true;
-	} else if (/^(no|off|false|disabled)$/i.test(val)) {
-		val = false;
-	} else if (val === 'null') {
-		val = null;
-	} else {
-		val = Number(val);
-	}
-
-	obj[prop] = val;
-	return obj;
-}, {});
-
-/**
- * Is stdout a TTY? Colored output is enabled when `true`.
- */
-
-function useColors() {
-	return 'colors' in exports.inspectOpts ?
-		Boolean(exports.inspectOpts.colors) :
-		tty.isatty(process.stderr.fd);
-}
-
-/**
- * Adds ANSI color escape codes if enabled.
- *
- * @api public
- */
-
-function formatArgs(args) {
-	const {namespace: name, useColors} = this;
-
-	if (useColors) {
-		const c = this.color;
-		const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c);
-		const prefix = `  ${colorCode};1m${name} \u001B[0m`;
-
-		args[0] = prefix + args[0].split('\n').join('\n' + prefix);
-		args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m');
-	} else {
-		args[0] = getDate() + name + ' ' + args[0];
-	}
-}
-
-function getDate() {
-	if (exports.inspectOpts.hideDate) {
-		return '';
-	}
-	return new Date().toISOString() + ' ';
-}
-
-/**
- * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.
- */
-
-function log(...args) {
-	return process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\n');
-}
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-function save(namespaces) {
-	if (namespaces) {
-		process.env.DEBUG = namespaces;
-	} else {
-		// If you set a process.env field to null or undefined, it gets cast to the
-		// string 'null' or 'undefined'. Just delete instead.
-		delete process.env.DEBUG;
-	}
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-
-function load() {
-	return process.env.DEBUG;
-}
-
-/**
- * Init logic for `debug` instances.
- *
- * Create a new `inspectOpts` object in case `useColors` is set
- * differently for a particular `debug` instance.
- */
-
-function init(debug) {
-	debug.inspectOpts = {};
-
-	const keys = Object.keys(exports.inspectOpts);
-	for (let i = 0; i < keys.length; i++) {
-		debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
-	}
-}
-
-module.exports = require('./common')(exports);
-
-const {formatters} = module.exports;
-
-/**
- * Map %o to `util.inspect()`, all on a single line.
- */
-
-formatters.o = function (v) {
-	this.inspectOpts.colors = this.useColors;
-	return util.inspect(v, this.inspectOpts)
-		.split('\n')
-		.map(str => str.trim())
-		.join(' ');
-};
-
-/**
- * Map %O to `util.inspect()`, allowing multiple lines if needed.
- */
-
-formatters.O = function (v) {
-	this.inspectOpts.colors = this.useColors;
-	return util.inspect(v, this.inspectOpts);
-};
diff --git a/node_modules/nodemon/node_modules/has-flag/index.js b/node_modules/nodemon/node_modules/has-flag/index.js
deleted file mode 100644
index 5139728fba6a264353ecb5abd00135dabf8a922d..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/has-flag/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-'use strict';
-module.exports = (flag, argv) => {
-	argv = argv || process.argv;
-	const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');
-	const pos = argv.indexOf(prefix + flag);
-	const terminatorPos = argv.indexOf('--');
-	return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos);
-};
diff --git a/node_modules/nodemon/node_modules/has-flag/license b/node_modules/nodemon/node_modules/has-flag/license
deleted file mode 100644
index e7af2f77107d73046421ef56c4684cbfdd3c1e89..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/has-flag/license
+++ /dev/null
@@ -1,9 +0,0 @@
-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/nodemon/node_modules/has-flag/package.json b/node_modules/nodemon/node_modules/has-flag/package.json
deleted file mode 100644
index e1eb17a15ed8808af7bd7085dc398108d9920ba2..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/has-flag/package.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "name": "has-flag",
-  "version": "3.0.0",
-  "description": "Check if argv has a specific flag",
-  "license": "MIT",
-  "repository": "sindresorhus/has-flag",
-  "author": {
-    "name": "Sindre Sorhus",
-    "email": "sindresorhus@gmail.com",
-    "url": "sindresorhus.com"
-  },
-  "engines": {
-    "node": ">=4"
-  },
-  "scripts": {
-    "test": "xo && ava"
-  },
-  "files": [
-    "index.js"
-  ],
-  "keywords": [
-    "has",
-    "check",
-    "detect",
-    "contains",
-    "find",
-    "flag",
-    "cli",
-    "command-line",
-    "argv",
-    "process",
-    "arg",
-    "args",
-    "argument",
-    "arguments",
-    "getopt",
-    "minimist",
-    "optimist"
-  ],
-  "devDependencies": {
-    "ava": "*",
-    "xo": "*"
-  }
-}
diff --git a/node_modules/nodemon/node_modules/has-flag/readme.md b/node_modules/nodemon/node_modules/has-flag/readme.md
deleted file mode 100644
index 677893c278a2e31f9671e83dd66fed51886cd258..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/has-flag/readme.md
+++ /dev/null
@@ -1,70 +0,0 @@
-# has-flag [![Build Status](https://travis-ci.org/sindresorhus/has-flag.svg?branch=master)](https://travis-ci.org/sindresorhus/has-flag)
-
-> Check if [`argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) has a specific flag
-
-Correctly stops looking after an `--` argument terminator.
-
-
-## Install
-
-```
-$ npm install has-flag
-```
-
-
-## Usage
-
-```js
-// foo.js
-const hasFlag = require('has-flag');
-
-hasFlag('unicorn');
-//=> true
-
-hasFlag('--unicorn');
-//=> true
-
-hasFlag('f');
-//=> true
-
-hasFlag('-f');
-//=> true
-
-hasFlag('foo=bar');
-//=> true
-
-hasFlag('foo');
-//=> false
-
-hasFlag('rainbow');
-//=> false
-```
-
-```
-$ node foo.js -f --unicorn --foo=bar -- --rainbow
-```
-
-
-## API
-
-### hasFlag(flag, [argv])
-
-Returns a boolean for whether the flag exists.
-
-#### flag
-
-Type: `string`
-
-CLI flag to look for. The `--` prefix is optional.
-
-#### argv
-
-Type: `string[]`<br>
-Default: `process.argv`
-
-CLI arguments.
-
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/nodemon/node_modules/ms/index.js b/node_modules/nodemon/node_modules/ms/index.js
deleted file mode 100644
index ea734fb73820316ed1c0f6a2f6e96dce0e3eb6f0..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/ms/index.js
+++ /dev/null
@@ -1,162 +0,0 @@
-/**
- * Helpers.
- */
-
-var s = 1000;
-var m = s * 60;
-var h = m * 60;
-var d = h * 24;
-var w = d * 7;
-var y = d * 365.25;
-
-/**
- * Parse or format the given `val`.
- *
- * Options:
- *
- *  - `long` verbose formatting [false]
- *
- * @param {String|Number} val
- * @param {Object} [options]
- * @throws {Error} throw an error if val is not a non-empty string or a number
- * @return {String|Number}
- * @api public
- */
-
-module.exports = function (val, options) {
-  options = options || {};
-  var type = typeof val;
-  if (type === 'string' && val.length > 0) {
-    return parse(val);
-  } else if (type === 'number' && isFinite(val)) {
-    return options.long ? fmtLong(val) : fmtShort(val);
-  }
-  throw new Error(
-    'val is not a non-empty string or a valid number. val=' +
-      JSON.stringify(val)
-  );
-};
-
-/**
- * Parse the given `str` and return milliseconds.
- *
- * @param {String} str
- * @return {Number}
- * @api private
- */
-
-function parse(str) {
-  str = String(str);
-  if (str.length > 100) {
-    return;
-  }
-  var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
-    str
-  );
-  if (!match) {
-    return;
-  }
-  var n = parseFloat(match[1]);
-  var type = (match[2] || 'ms').toLowerCase();
-  switch (type) {
-    case 'years':
-    case 'year':
-    case 'yrs':
-    case 'yr':
-    case 'y':
-      return n * y;
-    case 'weeks':
-    case 'week':
-    case 'w':
-      return n * w;
-    case 'days':
-    case 'day':
-    case 'd':
-      return n * d;
-    case 'hours':
-    case 'hour':
-    case 'hrs':
-    case 'hr':
-    case 'h':
-      return n * h;
-    case 'minutes':
-    case 'minute':
-    case 'mins':
-    case 'min':
-    case 'm':
-      return n * m;
-    case 'seconds':
-    case 'second':
-    case 'secs':
-    case 'sec':
-    case 's':
-      return n * s;
-    case 'milliseconds':
-    case 'millisecond':
-    case 'msecs':
-    case 'msec':
-    case 'ms':
-      return n;
-    default:
-      return undefined;
-  }
-}
-
-/**
- * Short format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function fmtShort(ms) {
-  var msAbs = Math.abs(ms);
-  if (msAbs >= d) {
-    return Math.round(ms / d) + 'd';
-  }
-  if (msAbs >= h) {
-    return Math.round(ms / h) + 'h';
-  }
-  if (msAbs >= m) {
-    return Math.round(ms / m) + 'm';
-  }
-  if (msAbs >= s) {
-    return Math.round(ms / s) + 's';
-  }
-  return ms + 'ms';
-}
-
-/**
- * Long format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function fmtLong(ms) {
-  var msAbs = Math.abs(ms);
-  if (msAbs >= d) {
-    return plural(ms, msAbs, d, 'day');
-  }
-  if (msAbs >= h) {
-    return plural(ms, msAbs, h, 'hour');
-  }
-  if (msAbs >= m) {
-    return plural(ms, msAbs, m, 'minute');
-  }
-  if (msAbs >= s) {
-    return plural(ms, msAbs, s, 'second');
-  }
-  return ms + ' ms';
-}
-
-/**
- * Pluralization helper.
- */
-
-function plural(ms, msAbs, n, name) {
-  var isPlural = msAbs >= n * 1.5;
-  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
-}
diff --git a/node_modules/nodemon/node_modules/ms/license.md b/node_modules/nodemon/node_modules/ms/license.md
deleted file mode 100644
index fa5d39b6213f8a5e142b643575f99d9149cc71c6..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/ms/license.md
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2020 Vercel, 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/nodemon/node_modules/ms/package.json b/node_modules/nodemon/node_modules/ms/package.json
deleted file mode 100644
index 49971890df8e2b9a4a5f4909fbd6678b862d8a50..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/ms/package.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "name": "ms",
-  "version": "2.1.3",
-  "description": "Tiny millisecond conversion utility",
-  "repository": "vercel/ms",
-  "main": "./index",
-  "files": [
-    "index.js"
-  ],
-  "scripts": {
-    "precommit": "lint-staged",
-    "lint": "eslint lib/* bin/*",
-    "test": "mocha tests.js"
-  },
-  "eslintConfig": {
-    "extends": "eslint:recommended",
-    "env": {
-      "node": true,
-      "es6": true
-    }
-  },
-  "lint-staged": {
-    "*.js": [
-      "npm run lint",
-      "prettier --single-quote --write",
-      "git add"
-    ]
-  },
-  "license": "MIT",
-  "devDependencies": {
-    "eslint": "4.18.2",
-    "expect.js": "0.3.1",
-    "husky": "0.14.3",
-    "lint-staged": "5.0.0",
-    "mocha": "4.0.1",
-    "prettier": "2.0.5"
-  }
-}
diff --git a/node_modules/nodemon/node_modules/ms/readme.md b/node_modules/nodemon/node_modules/ms/readme.md
deleted file mode 100644
index 0fc1abb3b8e30a3ab97023d243127c75b1b3a4d7..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/ms/readme.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# ms
-
-![CI](https://github.com/vercel/ms/workflows/CI/badge.svg)
-
-Use this package to easily convert various time formats to milliseconds.
-
-## Examples
-
-```js
-ms('2 days')  // 172800000
-ms('1d')      // 86400000
-ms('10h')     // 36000000
-ms('2.5 hrs') // 9000000
-ms('2h')      // 7200000
-ms('1m')      // 60000
-ms('5s')      // 5000
-ms('1y')      // 31557600000
-ms('100')     // 100
-ms('-3 days') // -259200000
-ms('-1h')     // -3600000
-ms('-200')    // -200
-```
-
-### Convert from Milliseconds
-
-```js
-ms(60000)             // "1m"
-ms(2 * 60000)         // "2m"
-ms(-3 * 60000)        // "-3m"
-ms(ms('10 hours'))    // "10h"
-```
-
-### Time Format Written-Out
-
-```js
-ms(60000, { long: true })             // "1 minute"
-ms(2 * 60000, { long: true })         // "2 minutes"
-ms(-3 * 60000, { long: true })        // "-3 minutes"
-ms(ms('10 hours'), { long: true })    // "10 hours"
-```
-
-## Features
-
-- Works both in [Node.js](https://nodejs.org) and in the browser
-- If a number is supplied to `ms`, a string with a unit is returned
-- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`)
-- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned
-
-## Related Packages
-
-- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time.
-
-## Caught a Bug?
-
-1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device
-2. Link the package to the global module directory: `npm link`
-3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms!
-
-As always, you can run the tests using: `npm test`
diff --git a/node_modules/nodemon/node_modules/supports-color/browser.js b/node_modules/nodemon/node_modules/supports-color/browser.js
deleted file mode 100644
index 62afa3a7425dc6a1eeafd1333afc15d429c5d10d..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/supports-color/browser.js
+++ /dev/null
@@ -1,5 +0,0 @@
-'use strict';
-module.exports = {
-	stdout: false,
-	stderr: false
-};
diff --git a/node_modules/nodemon/node_modules/supports-color/index.js b/node_modules/nodemon/node_modules/supports-color/index.js
deleted file mode 100644
index 1704131bdf6c8f1bddd360ed0ce42185590d2787..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/supports-color/index.js
+++ /dev/null
@@ -1,131 +0,0 @@
-'use strict';
-const os = require('os');
-const hasFlag = require('has-flag');
-
-const env = process.env;
-
-let forceColor;
-if (hasFlag('no-color') ||
-	hasFlag('no-colors') ||
-	hasFlag('color=false')) {
-	forceColor = false;
-} else if (hasFlag('color') ||
-	hasFlag('colors') ||
-	hasFlag('color=true') ||
-	hasFlag('color=always')) {
-	forceColor = true;
-}
-if ('FORCE_COLOR' in env) {
-	forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0;
-}
-
-function translateLevel(level) {
-	if (level === 0) {
-		return false;
-	}
-
-	return {
-		level,
-		hasBasic: true,
-		has256: level >= 2,
-		has16m: level >= 3
-	};
-}
-
-function supportsColor(stream) {
-	if (forceColor === false) {
-		return 0;
-	}
-
-	if (hasFlag('color=16m') ||
-		hasFlag('color=full') ||
-		hasFlag('color=truecolor')) {
-		return 3;
-	}
-
-	if (hasFlag('color=256')) {
-		return 2;
-	}
-
-	if (stream && !stream.isTTY && forceColor !== true) {
-		return 0;
-	}
-
-	const min = forceColor ? 1 : 0;
-
-	if (process.platform === 'win32') {
-		// Node.js 7.5.0 is the first version of Node.js to include a patch to
-		// libuv that enables 256 color output on Windows. Anything earlier and it
-		// won't work. However, here we target Node.js 8 at minimum as it is an LTS
-		// release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows
-		// release that supports 256 colors. Windows 10 build 14931 is the first release
-		// that supports 16m/TrueColor.
-		const osRelease = os.release().split('.');
-		if (
-			Number(process.versions.node.split('.')[0]) >= 8 &&
-			Number(osRelease[0]) >= 10 &&
-			Number(osRelease[2]) >= 10586
-		) {
-			return Number(osRelease[2]) >= 14931 ? 3 : 2;
-		}
-
-		return 1;
-	}
-
-	if ('CI' in env) {
-		if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') {
-			return 1;
-		}
-
-		return min;
-	}
-
-	if ('TEAMCITY_VERSION' in env) {
-		return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
-	}
-
-	if (env.COLORTERM === 'truecolor') {
-		return 3;
-	}
-
-	if ('TERM_PROGRAM' in env) {
-		const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);
-
-		switch (env.TERM_PROGRAM) {
-			case 'iTerm.app':
-				return version >= 3 ? 3 : 2;
-			case 'Apple_Terminal':
-				return 2;
-			// No default
-		}
-	}
-
-	if (/-256(color)?$/i.test(env.TERM)) {
-		return 2;
-	}
-
-	if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
-		return 1;
-	}
-
-	if ('COLORTERM' in env) {
-		return 1;
-	}
-
-	if (env.TERM === 'dumb') {
-		return min;
-	}
-
-	return min;
-}
-
-function getSupportLevel(stream) {
-	const level = supportsColor(stream);
-	return translateLevel(level);
-}
-
-module.exports = {
-	supportsColor: getSupportLevel,
-	stdout: getSupportLevel(process.stdout),
-	stderr: getSupportLevel(process.stderr)
-};
diff --git a/node_modules/nodemon/node_modules/supports-color/license b/node_modules/nodemon/node_modules/supports-color/license
deleted file mode 100644
index e7af2f77107d73046421ef56c4684cbfdd3c1e89..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/supports-color/license
+++ /dev/null
@@ -1,9 +0,0 @@
-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/nodemon/node_modules/supports-color/package.json b/node_modules/nodemon/node_modules/supports-color/package.json
deleted file mode 100644
index ad199f5cdb0436335d11d8650821e394bd276e56..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/supports-color/package.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
-	"name": "supports-color",
-	"version": "5.5.0",
-	"description": "Detect whether a terminal supports color",
-	"license": "MIT",
-	"repository": "chalk/supports-color",
-	"author": {
-		"name": "Sindre Sorhus",
-		"email": "sindresorhus@gmail.com",
-		"url": "sindresorhus.com"
-	},
-	"engines": {
-		"node": ">=4"
-	},
-	"scripts": {
-		"test": "xo && ava"
-	},
-	"files": [
-		"index.js",
-		"browser.js"
-	],
-	"keywords": [
-		"color",
-		"colour",
-		"colors",
-		"terminal",
-		"console",
-		"cli",
-		"ansi",
-		"styles",
-		"tty",
-		"rgb",
-		"256",
-		"shell",
-		"xterm",
-		"command-line",
-		"support",
-		"supports",
-		"capability",
-		"detect",
-		"truecolor",
-		"16m"
-	],
-	"dependencies": {
-		"has-flag": "^3.0.0"
-	},
-	"devDependencies": {
-		"ava": "^0.25.0",
-		"import-fresh": "^2.0.0",
-		"xo": "^0.20.0"
-	},
-	"browser": "browser.js"
-}
diff --git a/node_modules/nodemon/node_modules/supports-color/readme.md b/node_modules/nodemon/node_modules/supports-color/readme.md
deleted file mode 100644
index f6e40195730ae8c665bdd898cfe0442e9ac08105..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/node_modules/supports-color/readme.md
+++ /dev/null
@@ -1,66 +0,0 @@
-# supports-color [![Build Status](https://travis-ci.org/chalk/supports-color.svg?branch=master)](https://travis-ci.org/chalk/supports-color)
-
-> Detect whether a terminal supports color
-
-
-## Install
-
-```
-$ npm install supports-color
-```
-
-
-## Usage
-
-```js
-const supportsColor = require('supports-color');
-
-if (supportsColor.stdout) {
-	console.log('Terminal stdout supports color');
-}
-
-if (supportsColor.stdout.has256) {
-	console.log('Terminal stdout supports 256 colors');
-}
-
-if (supportsColor.stderr.has16m) {
-	console.log('Terminal stderr supports 16 million colors (truecolor)');
-}
-```
-
-
-## API
-
-Returns an `Object` with a `stdout` and `stderr` property for testing either streams. Each property is an `Object`, or `false` if color is not supported.
-
-The `stdout`/`stderr` objects specifies a level of support for color through a `.level` property and a corresponding flag:
-
-- `.level = 1` and `.hasBasic = true`: Basic color support (16 colors)
-- `.level = 2` and `.has256 = true`: 256 color support
-- `.level = 3` and `.has16m = true`: Truecolor support (16 million colors)
-
-
-## Info
-
-It obeys the `--color` and `--no-color` CLI flags.
-
-Can be overridden by the user with the flags `--color` and `--no-color`. For situations where using `--color` is not possible, add the environment variable `FORCE_COLOR=1` to forcefully enable color or `FORCE_COLOR=0` to forcefully disable. The use of `FORCE_COLOR` overrides all other color support checks.
-
-Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively.
-
-
-## Related
-
-- [supports-color-cli](https://github.com/chalk/supports-color-cli) - CLI for this module
-- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right
-
-
-## Maintainers
-
-- [Sindre Sorhus](https://github.com/sindresorhus)
-- [Josh Junon](https://github.com/qix-)
-
-
-## License
-
-MIT
diff --git a/node_modules/nodemon/package.json b/node_modules/nodemon/package.json
deleted file mode 100644
index bcf34c0cf8a4a359eddc575a9cfa62b2d087ddcf..0000000000000000000000000000000000000000
--- a/node_modules/nodemon/package.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
-  "name": "nodemon",
-  "homepage": "https://nodemon.io",
-  "author": {
-    "name": "Remy Sharp",
-    "url": "https://github.com/remy"
-  },
-  "bin": {
-    "nodemon": "./bin/nodemon.js"
-  },
-  "engines": {
-    "node": ">=10"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/remy/nodemon.git"
-  },
-  "description": "Simple monitor script for use during development of a Node.js app.",
-  "keywords": [
-    "cli",
-    "monitor",
-    "monitor",
-    "development",
-    "restart",
-    "autoload",
-    "reload",
-    "terminal"
-  ],
-  "license": "MIT",
-  "types": "./index.d.ts",
-  "main": "./lib/nodemon",
-  "scripts": {
-    "commitmsg": "commitlint -e",
-    "coverage": "istanbul cover _mocha -- --timeout 30000 --ui bdd --reporter list test/**/*.test.js",
-    "lint": "eslint lib/**/*.js",
-    "test": "npm run lint && npm run spec",
-    "spec": "for FILE in test/**/*.test.js; do echo $FILE; TEST=1 mocha --exit --timeout 30000 $FILE; if [ $? -ne 0 ]; then exit 1; fi; sleep 1; done",
-    "postspec": "npm run clean",
-    "clean": "rm -rf test/fixtures/test*.js test/fixtures/test*.md",
-    "web": "node web",
-    "semantic-release": "semantic-release",
-    "prepush": "npm run lint",
-    "killall": "ps auxww | grep node | grep -v grep | awk '{ print $2 }' | xargs kill -9"
-  },
-  "devDependencies": {
-    "@commitlint/cli": "^11.0.0",
-    "@commitlint/config-conventional": "^11.0.0",
-    "async": "1.4.2",
-    "coffee-script": "~1.7.1",
-    "eslint": "^7.32.0",
-    "husky": "^7.0.4",
-    "mocha": "^2.5.3",
-    "nyc": "^15.1.0",
-    "proxyquire": "^1.8.0",
-    "semantic-release": "^18.0.0",
-    "should": "~4.0.0"
-  },
-  "dependencies": {
-    "chokidar": "^3.5.2",
-    "debug": "^4",
-    "ignore-by-default": "^1.0.1",
-    "minimatch": "^3.1.2",
-    "pstree.remy": "^1.1.8",
-    "semver": "^7.5.3",
-    "simple-update-notifier": "^2.0.0",
-    "supports-color": "^5.5.0",
-    "touch": "^3.1.0",
-    "undefsafe": "^2.0.5"
-  },
-  "version": "3.1.9",
-  "funding": {
-    "type": "opencollective",
-    "url": "https://opencollective.com/nodemon"
-  }
-}
diff --git a/node_modules/normalize-path/LICENSE b/node_modules/normalize-path/LICENSE
deleted file mode 100644
index d32ab4426a5f6bd7986ed80df4073bbf997903d1..0000000000000000000000000000000000000000
--- a/node_modules/normalize-path/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014-2018, Jon Schlinkert.
-
-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/normalize-path/README.md b/node_modules/normalize-path/README.md
deleted file mode 100644
index 726d4d6891a295fbd2706d7c98ba72f09b8a4a6b..0000000000000000000000000000000000000000
--- a/node_modules/normalize-path/README.md
+++ /dev/null
@@ -1,127 +0,0 @@
-# normalize-path [![NPM version](https://img.shields.io/npm/v/normalize-path.svg?style=flat)](https://www.npmjs.com/package/normalize-path) [![NPM monthly downloads](https://img.shields.io/npm/dm/normalize-path.svg?style=flat)](https://npmjs.org/package/normalize-path) [![NPM total downloads](https://img.shields.io/npm/dt/normalize-path.svg?style=flat)](https://npmjs.org/package/normalize-path) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/normalize-path.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/normalize-path)
-
-> Normalize slashes in a file path to be posix/unix-like forward slashes. Also condenses repeat slashes to a single slash and removes and trailing slashes, unless disabled.
-
-Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-$ npm install --save normalize-path
-```
-
-## Usage
-
-```js
-const normalize = require('normalize-path');
-
-console.log(normalize('\\foo\\bar\\baz\\')); 
-//=> '/foo/bar/baz'
-```
-
-**win32 namespaces**
-
-```js
-console.log(normalize('\\\\?\\UNC\\Server01\\user\\docs\\Letter.txt')); 
-//=> '//?/UNC/Server01/user/docs/Letter.txt'
-
-console.log(normalize('\\\\.\\CdRomX')); 
-//=> '//./CdRomX'
-```
-
-**Consecutive slashes**
-
-Condenses multiple consecutive forward slashes (except for leading slashes in win32 namespaces) to a single slash.
-
-```js
-console.log(normalize('.//foo//bar///////baz/')); 
-//=> './foo/bar/baz'
-```
-
-### Trailing slashes
-
-By default trailing slashes are removed. Pass `false` as the last argument to disable this behavior and _**keep** trailing slashes_:
-
-```js
-console.log(normalize('foo\\bar\\baz\\', false)); //=> 'foo/bar/baz/'
-console.log(normalize('./foo/bar/baz/', false)); //=> './foo/bar/baz/'
-```
-
-## Release history
-
-### v3.0
-
-No breaking changes in this release.
-
-* a check was added to ensure that [win32 namespaces](https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces) are handled properly by win32 `path.parse()` after a path has been normalized by this library.
-* a minor optimization was made to simplify how the trailing separator was handled
-
-## About
-
-<details>
-<summary><strong>Contributing</strong></summary>
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-</details>
-
-<details>
-<summary><strong>Running Tests</strong></summary>
-
-Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
-
-```sh
-$ npm install && npm test
-```
-
-</details>
-
-<details>
-<summary><strong>Building docs</strong></summary>
-
-_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
-
-To generate the readme, run the following command:
-
-```sh
-$ npm install -g verbose/verb#dev verb-generate-readme && verb
-```
-
-</details>
-
-### Related projects
-
-Other useful path-related libraries:
-
-* [contains-path](https://www.npmjs.com/package/contains-path): Return true if a file path contains the given path. | [homepage](https://github.com/jonschlinkert/contains-path "Return true if a file path contains the given path.")
-* [is-absolute](https://www.npmjs.com/package/is-absolute): Returns true if a file path is absolute. Does not rely on the path module… [more](https://github.com/jonschlinkert/is-absolute) | [homepage](https://github.com/jonschlinkert/is-absolute "Returns true if a file path is absolute. Does not rely on the path module and can be used as a polyfill for node.js native `path.isAbolute`.")
-* [is-relative](https://www.npmjs.com/package/is-relative): Returns `true` if the path appears to be relative. | [homepage](https://github.com/jonschlinkert/is-relative "Returns `true` if the path appears to be relative.")
-* [parse-filepath](https://www.npmjs.com/package/parse-filepath): Pollyfill for node.js `path.parse`, parses a filepath into an object. | [homepage](https://github.com/jonschlinkert/parse-filepath "Pollyfill for node.js `path.parse`, parses a filepath into an object.")
-* [path-ends-with](https://www.npmjs.com/package/path-ends-with): Return `true` if a file path ends with the given string/suffix. | [homepage](https://github.com/jonschlinkert/path-ends-with "Return `true` if a file path ends with the given string/suffix.")
-* [unixify](https://www.npmjs.com/package/unixify): Convert Windows file paths to unix paths. | [homepage](https://github.com/jonschlinkert/unixify "Convert Windows file paths to unix paths.")
-
-### Contributors
-
-| **Commits** | **Contributor** | 
-| --- | --- |
-| 35 | [jonschlinkert](https://github.com/jonschlinkert) |
-| 1 | [phated](https://github.com/phated) |
-
-### Author
-
-**Jon Schlinkert**
-
-* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
-* [GitHub Profile](https://github.com/jonschlinkert)
-* [Twitter Profile](https://twitter.com/jonschlinkert)
-
-### License
-
-Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT License](LICENSE).
-
-***
-
-_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on April 19, 2018._
\ No newline at end of file
diff --git a/node_modules/normalize-path/index.js b/node_modules/normalize-path/index.js
deleted file mode 100644
index 6fac553a30915ee38b6c1552b8df343da69f3926..0000000000000000000000000000000000000000
--- a/node_modules/normalize-path/index.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*!
- * normalize-path <https://github.com/jonschlinkert/normalize-path>
- *
- * Copyright (c) 2014-2018, Jon Schlinkert.
- * Released under the MIT License.
- */
-
-module.exports = function(path, stripTrailing) {
-  if (typeof path !== 'string') {
-    throw new TypeError('expected path to be a string');
-  }
-
-  if (path === '\\' || path === '/') return '/';
-
-  var len = path.length;
-  if (len <= 1) return path;
-
-  // ensure that win32 namespaces has two leading slashes, so that the path is
-  // handled properly by the win32 version of path.parse() after being normalized
-  // https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces
-  var prefix = '';
-  if (len > 4 && path[3] === '\\') {
-    var ch = path[2];
-    if ((ch === '?' || ch === '.') && path.slice(0, 2) === '\\\\') {
-      path = path.slice(2);
-      prefix = '//';
-    }
-  }
-
-  var segs = path.split(/[/\\]+/);
-  if (stripTrailing !== false && segs[segs.length - 1] === '') {
-    segs.pop();
-  }
-  return prefix + segs.join('/');
-};
diff --git a/node_modules/normalize-path/package.json b/node_modules/normalize-path/package.json
deleted file mode 100644
index ad61098a8a8fc51a4be93b25769a47959abd5ade..0000000000000000000000000000000000000000
--- a/node_modules/normalize-path/package.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
-  "name": "normalize-path",
-  "description": "Normalize slashes in a file path to be posix/unix-like forward slashes. Also condenses repeat slashes to a single slash and removes and trailing slashes, unless disabled.",
-  "version": "3.0.0",
-  "homepage": "https://github.com/jonschlinkert/normalize-path",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "contributors": [
-    "Blaine Bublitz (https://twitter.com/BlaineBublitz)",
-    "Jon Schlinkert (http://twitter.com/jonschlinkert)"
-  ],
-  "repository": "jonschlinkert/normalize-path",
-  "bugs": {
-    "url": "https://github.com/jonschlinkert/normalize-path/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "scripts": {
-    "test": "mocha"
-  },
-  "devDependencies": {
-    "gulp-format-md": "^1.0.0",
-    "minimist": "^1.2.0",
-    "mocha": "^3.5.3"
-  },
-  "keywords": [
-    "absolute",
-    "backslash",
-    "delimiter",
-    "file",
-    "file-path",
-    "filepath",
-    "fix",
-    "forward",
-    "fp",
-    "fs",
-    "normalize",
-    "path",
-    "relative",
-    "separator",
-    "slash",
-    "slashes",
-    "trailing",
-    "unix",
-    "urix"
-  ],
-  "verb": {
-    "toc": false,
-    "layout": "default",
-    "tasks": [
-      "readme"
-    ],
-    "plugins": [
-      "gulp-format-md"
-    ],
-    "related": {
-      "description": "Other useful path-related libraries:",
-      "list": [
-        "contains-path",
-        "is-absolute",
-        "is-relative",
-        "parse-filepath",
-        "path-ends-with",
-        "path-ends-with",
-        "unixify"
-      ]
-    },
-    "lint": {
-      "reflinks": true
-    }
-  }
-}
diff --git a/node_modules/path-to-regexp/LICENSE b/node_modules/path-to-regexp/LICENSE
deleted file mode 100644
index 983fbe8aec3f4e2d4add592bb1083b00d7366f66..0000000000000000000000000000000000000000
--- a/node_modules/path-to-regexp/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/node_modules/path-to-regexp/Readme.md b/node_modules/path-to-regexp/Readme.md
deleted file mode 100644
index 95452a6e9ee2ca18ec76107d4f7c78a5ef7991db..0000000000000000000000000000000000000000
--- a/node_modules/path-to-regexp/Readme.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# Path-to-RegExp
-
-Turn an Express-style path string such as `/user/:name` into a regular expression.
-
-**Note:** This is a legacy branch. You should upgrade to `1.x`.
-
-## Usage
-
-```javascript
-var pathToRegexp = require('path-to-regexp');
-```
-
-### pathToRegexp(path, keys, options)
-
- - **path** A string in the express format, an array of such strings, or a regular expression
- - **keys** An array to be populated with the keys present in the url.  Once the function completes, this will be an array of strings.
- - **options**
-   - **options.sensitive** Defaults to false, set this to true to make routes case sensitive
-   - **options.strict** Defaults to false, set this to true to make the trailing slash matter.
-   - **options.end** Defaults to true, set this to false to only match the prefix of the URL.
-
-```javascript
-var keys = [];
-var exp = pathToRegexp('/foo/:bar', keys);
-//keys = ['bar']
-//exp = /^\/foo\/(?:([^\/]+?))\/?$/i
-```
-
-## Live Demo
-
-You can see a live demo of this library in use at [express-route-tester](http://forbeslindesay.github.com/express-route-tester/).
-
-## License
-
-  MIT
diff --git a/node_modules/path-to-regexp/index.js b/node_modules/path-to-regexp/index.js
deleted file mode 100644
index 95d2f4bbad4a8fb52c7937fc3abdc28ea68b7d72..0000000000000000000000000000000000000000
--- a/node_modules/path-to-regexp/index.js
+++ /dev/null
@@ -1,156 +0,0 @@
-/**
- * Expose `pathToRegexp`.
- */
-
-module.exports = pathToRegexp;
-
-/**
- * Match matching groups in a regular expression.
- */
-var MATCHING_GROUP_REGEXP = /\\.|\((?:\?<(.*?)>)?(?!\?)/g;
-
-/**
- * Normalize the given path string,
- * returning a regular expression.
- *
- * An empty array should be passed,
- * which will contain the placeholder
- * key names. For example "/user/:id" will
- * then contain ["id"].
- *
- * @param  {String|RegExp|Array} path
- * @param  {Array} keys
- * @param  {Object} options
- * @return {RegExp}
- * @api private
- */
-
-function pathToRegexp(path, keys, options) {
-  options = options || {};
-  keys = keys || [];
-  var strict = options.strict;
-  var end = options.end !== false;
-  var flags = options.sensitive ? '' : 'i';
-  var lookahead = options.lookahead !== false;
-  var extraOffset = 0;
-  var keysOffset = keys.length;
-  var i = 0;
-  var name = 0;
-  var pos = 0;
-  var backtrack = '';
-  var m;
-
-  if (path instanceof RegExp) {
-    while (m = MATCHING_GROUP_REGEXP.exec(path.source)) {
-      if (m[0][0] === '\\') continue;
-
-      keys.push({
-        name: m[1] || name++,
-        optional: false,
-        offset: m.index
-      });
-    }
-
-    return path;
-  }
-
-  if (Array.isArray(path)) {
-    // Map array parts into regexps and return their source. We also pass
-    // the same keys and options instance into every generation to get
-    // consistent matching groups before we join the sources together.
-    path = path.map(function (value) {
-      return pathToRegexp(value, keys, options).source;
-    });
-
-    return new RegExp(path.join('|'), flags);
-  }
-
-  if (typeof path !== 'string') {
-    throw new TypeError('path must be a string, array of strings, or regular expression');
-  }
-
-  path = path.replace(
-    /\\.|(\/)?(\.)?:(\w+)(\(.*?\))?(\*)?(\?)?|[.*]|\/\(/g,
-    function (match, slash, format, key, capture, star, optional, offset) {
-      if (match[0] === '\\') {
-        backtrack += match;
-        pos += 2;
-        return match;
-      }
-
-      if (match === '.') {
-        backtrack += '\\.';
-        extraOffset += 1;
-        pos += 1;
-        return '\\.';
-      }
-
-      if (slash || format) {
-        backtrack = '';
-      } else {
-        backtrack += path.slice(pos, offset);
-      }
-
-      pos = offset + match.length;
-
-      if (match === '*') {
-        extraOffset += 3;
-        return '(.*)';
-      }
-
-      if (match === '/(') {
-        backtrack += '/';
-        extraOffset += 2;
-        return '/(?:';
-      }
-
-      slash = slash || '';
-      format = format ? '\\.' : '';
-      optional = optional || '';
-      capture = capture ?
-        capture.replace(/\\.|\*/, function (m) { return m === '*' ? '(.*)' : m; }) :
-        (backtrack ? '((?:(?!/|' + backtrack + ').)+?)' : '([^/' + format + ']+?)');
-
-      keys.push({
-        name: key,
-        optional: !!optional,
-        offset: offset + extraOffset
-      });
-
-      var result = '(?:'
-        + format + slash + capture
-        + (star ? '((?:[/' + format + '].+?)?)' : '')
-        + ')'
-        + optional;
-
-      extraOffset += result.length - match.length;
-
-      return result;
-    });
-
-  // This is a workaround for handling unnamed matching groups.
-  while (m = MATCHING_GROUP_REGEXP.exec(path)) {
-    if (m[0][0] === '\\') continue;
-
-    if (keysOffset + i === keys.length || keys[keysOffset + i].offset > m.index) {
-      keys.splice(keysOffset + i, 0, {
-        name: name++, // Unnamed matching groups must be consistently linear.
-        optional: false,
-        offset: m.index
-      });
-    }
-
-    i++;
-  }
-
-  path += strict ? '' : path[path.length - 1] === '/' ? '?' : '/?';
-
-  // If the path is non-ending, match until the end or a slash.
-  if (end) {
-    path += '$';
-  } else if (path[path.length - 1] !== '/') {
-    path += lookahead ? '(?=/|$)' : '(?:/|$)';
-  }
-
-  return new RegExp('^' + path, flags);
-};
diff --git a/node_modules/path-to-regexp/package.json b/node_modules/path-to-regexp/package.json
deleted file mode 100644
index 23b4b6a3bdcfc64317349c90dd867859a6b93728..0000000000000000000000000000000000000000
--- a/node_modules/path-to-regexp/package.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "name": "path-to-regexp",
-  "description": "Express style path to RegExp utility",
-  "version": "0.1.12",
-  "files": [
-    "index.js",
-    "LICENSE"
-  ],
-  "scripts": {
-    "test": "istanbul cover _mocha -- -R spec"
-  },
-  "keywords": [
-    "express",
-    "regexp"
-  ],
-  "component": {
-    "scripts": {
-      "path-to-regexp": "index.js"
-    }
-  },
-  "license": "MIT",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/pillarjs/path-to-regexp.git"
-  },
-  "devDependencies": {
-    "mocha": "^1.17.1",
-    "istanbul": "^0.2.6"
-  }
-}
diff --git a/node_modules/picomatch/CHANGELOG.md b/node_modules/picomatch/CHANGELOG.md
deleted file mode 100644
index 8ccc6c1bab0138d0d4da5e604fcb9608790b1692..0000000000000000000000000000000000000000
--- a/node_modules/picomatch/CHANGELOG.md
+++ /dev/null
@@ -1,136 +0,0 @@
-# Release history
-
-**All notable changes to this project will be documented in this file.**
-
-The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
-and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
-
-<details>
-  <summary><strong>Guiding Principles</strong></summary>
-
-- Changelogs are for humans, not machines.
-- There should be an entry for every single version.
-- The same types of changes should be grouped.
-- Versions and sections should be linkable.
-- The latest version comes first.
-- The release date of each versions is displayed.
-- Mention whether you follow Semantic Versioning.
-
-</details>
-
-<details>
-  <summary><strong>Types of changes</strong></summary>
-
-Changelog entries are classified using the following labels _(from [keep-a-changelog](http://keepachangelog.com/)_):
-
-- `Added` for new features.
-- `Changed` for changes in existing functionality.
-- `Deprecated` for soon-to-be removed features.
-- `Removed` for now removed features.
-- `Fixed` for any bug fixes.
-- `Security` in case of vulnerabilities.
-
-</details>
-
-## 2.3.1 (2022-01-02)
-
-### Fixed
-
-* Fixes bug when a pattern containing an expression after the closing parenthesis (`/!(*.d).{ts,tsx}`) was incorrectly converted to regexp ([9f241ef](https://github.com/micromatch/picomatch/commit/9f241ef)).
-
-### Changed
-
-* Some documentation improvements ([f81d236](https://github.com/micromatch/picomatch/commit/f81d236), [421e0e7](https://github.com/micromatch/picomatch/commit/421e0e7)).
-
-## 2.3.0 (2021-05-21)
-
-### Fixed
-
-* Fixes bug where file names with two dots were not being matched consistently with negation extglobs containing a star ([56083ef](https://github.com/micromatch/picomatch/commit/56083ef))
-
-## 2.2.3 (2021-04-10)
-
-### Fixed
-
-* Do not skip pattern seperator for square brackets ([fb08a30](https://github.com/micromatch/picomatch/commit/fb08a30)).
-* Set negatedExtGlob also if it does not span the whole pattern ([032e3f5](https://github.com/micromatch/picomatch/commit/032e3f5)).
-
-## 2.2.2 (2020-03-21)
-
-### Fixed
-
-* Correctly handle parts of the pattern after parentheses in the `scan` method ([e15b920](https://github.com/micromatch/picomatch/commit/e15b920)).
-
-## 2.2.1 (2020-01-04)
-
-* Fixes [#49](https://github.com/micromatch/picomatch/issues/49), so that braces with no sets or ranges are now propertly treated as literals.
-
-## 2.2.0 (2020-01-04)
-
-* Disable fastpaths mode for the parse method ([5b8d33f](https://github.com/micromatch/picomatch/commit/5b8d33f))
-* Add `tokens`, `slashes`, and `parts` to the object returned by `picomatch.scan()`.
-
-## 2.1.0 (2019-10-31)
-
-* add benchmarks for scan ([4793b92](https://github.com/micromatch/picomatch/commit/4793b92))
-* Add eslint object-curly-spacing rule ([707c650](https://github.com/micromatch/picomatch/commit/707c650))
-* Add prefer-const eslint rule ([5c7501c](https://github.com/micromatch/picomatch/commit/5c7501c))
-* Add support for nonegate in scan API ([275c9b9](https://github.com/micromatch/picomatch/commit/275c9b9))
-* Change lets to consts. Move root import up. ([4840625](https://github.com/micromatch/picomatch/commit/4840625))
-* closes https://github.com/micromatch/picomatch/issues/21 ([766bcb0](https://github.com/micromatch/picomatch/commit/766bcb0))
-* Fix "Extglobs" table in readme ([eb19da8](https://github.com/micromatch/picomatch/commit/eb19da8))
-* fixes https://github.com/micromatch/picomatch/issues/20 ([9caca07](https://github.com/micromatch/picomatch/commit/9caca07))
-* fixes https://github.com/micromatch/picomatch/issues/26 ([fa58f45](https://github.com/micromatch/picomatch/commit/fa58f45))
-* Lint test ([d433a34](https://github.com/micromatch/picomatch/commit/d433a34))
-* lint unit tests ([0159b55](https://github.com/micromatch/picomatch/commit/0159b55))
-* Make scan work with noext ([6c02e03](https://github.com/micromatch/picomatch/commit/6c02e03))
-* minor linting ([c2a2b87](https://github.com/micromatch/picomatch/commit/c2a2b87))
-* minor parser improvements ([197671d](https://github.com/micromatch/picomatch/commit/197671d))
-* remove eslint since it... ([07876fa](https://github.com/micromatch/picomatch/commit/07876fa))
-* remove funding file ([8ebe96d](https://github.com/micromatch/picomatch/commit/8ebe96d))
-* Remove unused funks ([cbc6d54](https://github.com/micromatch/picomatch/commit/cbc6d54))
-* Run eslint during pretest, fix existing eslint findings ([0682367](https://github.com/micromatch/picomatch/commit/0682367))
-* support `noparen` in scan ([3d37569](https://github.com/micromatch/picomatch/commit/3d37569))
-* update changelog ([7b34e77](https://github.com/micromatch/picomatch/commit/7b34e77))
-* update travis ([777f038](https://github.com/micromatch/picomatch/commit/777f038))
-* Use eslint-disable-next-line instead of eslint-disable ([4e7c1fd](https://github.com/micromatch/picomatch/commit/4e7c1fd))
-
-## 2.0.7 (2019-05-14)
-
-* 2.0.7 ([9eb9a71](https://github.com/micromatch/picomatch/commit/9eb9a71))
-* supports lookbehinds ([1f63f7e](https://github.com/micromatch/picomatch/commit/1f63f7e))
-* update .verb.md file with typo change ([2741279](https://github.com/micromatch/picomatch/commit/2741279))
-* fix: typo in README ([0753e44](https://github.com/micromatch/picomatch/commit/0753e44))
-
-## 2.0.4 (2019-04-10)
-
-### Fixed
-
-- Readme link [fixed](https://github.com/micromatch/picomatch/pull/13/commits/a96ab3aa2b11b6861c23289964613d85563b05df) by @danez.
-- `options.capture` now works as expected when fastpaths are enabled. See https://github.com/micromatch/picomatch/pull/12/commits/26aefd71f1cfaf95c37f1c1fcab68a693b037304. Thanks to @DrPizza.
-
-## 2.0.0 (2019-04-10)
-
-### Added
-
-- Adds support for `options.onIgnore`. See the readme for details
-- Adds support for `options.onResult`. See the readme for details
-
-### Breaking changes
-
-- The unixify option was renamed to `windows`
-- caching and all related options and methods have been removed
-
-## 1.0.0 (2018-11-05)
-
-- adds `.onMatch` option
-- improvements to `.scan` method
-- numerous improvements and optimizations for matching and parsing
-- better windows path handling
-
-## 0.1.0 - 2017-04-13
-
-First release.
-
-
-[keep-a-changelog]: https://github.com/olivierlacan/keep-a-changelog
diff --git a/node_modules/picomatch/LICENSE b/node_modules/picomatch/LICENSE
deleted file mode 100644
index 3608dca25e30b572b6ad6935c8c7918bf70e3d2f..0000000000000000000000000000000000000000
--- a/node_modules/picomatch/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2017-present, Jon Schlinkert.
-
-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/picomatch/README.md b/node_modules/picomatch/README.md
deleted file mode 100644
index b0526e28a319d84a5a7b654d5c93d87aab9350e3..0000000000000000000000000000000000000000
--- a/node_modules/picomatch/README.md
+++ /dev/null
@@ -1,708 +0,0 @@
-<h1 align="center">Picomatch</h1>
-
-<p align="center">
-<a href="https://npmjs.org/package/picomatch">
-<img src="https://img.shields.io/npm/v/picomatch.svg" alt="version">
-</a>
-<a href="https://github.com/micromatch/picomatch/actions?workflow=Tests">
-<img src="https://github.com/micromatch/picomatch/workflows/Tests/badge.svg" alt="test status">
-</a>
-<a href="https://coveralls.io/github/micromatch/picomatch">
-<img src="https://img.shields.io/coveralls/github/micromatch/picomatch/master.svg" alt="coverage status">
-</a>
-<a href="https://npmjs.org/package/picomatch">
-<img src="https://img.shields.io/npm/dm/picomatch.svg" alt="downloads">
-</a>
-</p>
-
-<br>
-<br>
-
-<p align="center">
-<strong>Blazing fast and accurate glob matcher written in JavaScript.</strong></br>
-<em>No dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions.</em>
-</p>
-
-<br>
-<br>
-
-## Why picomatch?
-
-* **Lightweight** - No dependencies
-* **Minimal** - Tiny API surface. Main export is a function that takes a glob pattern and returns a matcher function.
-* **Fast** - Loads in about 2ms (that's several times faster than a [single frame of a HD movie](http://www.endmemo.com/sconvert/framespersecondframespermillisecond.php) at 60fps)
-* **Performant** - Use the returned matcher function to speed up repeat matching (like when watching files)
-* **Accurate matching** - Using wildcards (`*` and `?`), globstars (`**`) for nested directories, [advanced globbing](#advanced-globbing) with extglobs, braces, and POSIX brackets, and support for escaping special characters with `\` or quotes.
-* **Well tested** - Thousands of unit tests
-
-See the [library comparison](#library-comparisons) to other libraries.
-
-<br>
-<br>
-
-## Table of Contents
-
-<details><summary> Click to expand </summary>
-
-- [Install](#install)
-- [Usage](#usage)
-- [API](#api)
-  * [picomatch](#picomatch)
-  * [.test](#test)
-  * [.matchBase](#matchbase)
-  * [.isMatch](#ismatch)
-  * [.parse](#parse)
-  * [.scan](#scan)
-  * [.compileRe](#compilere)
-  * [.makeRe](#makere)
-  * [.toRegex](#toregex)
-- [Options](#options)
-  * [Picomatch options](#picomatch-options)
-  * [Scan Options](#scan-options)
-  * [Options Examples](#options-examples)
-- [Globbing features](#globbing-features)
-  * [Basic globbing](#basic-globbing)
-  * [Advanced globbing](#advanced-globbing)
-  * [Braces](#braces)
-  * [Matching special characters as literals](#matching-special-characters-as-literals)
-- [Library Comparisons](#library-comparisons)
-- [Benchmarks](#benchmarks)
-- [Philosophies](#philosophies)
-- [About](#about)
-  * [Author](#author)
-  * [License](#license)
-
-_(TOC generated by [verb](https://github.com/verbose/verb) using [markdown-toc](https://github.com/jonschlinkert/markdown-toc))_
-
-</details>
-
-<br>
-<br>
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-npm install --save picomatch
-```
-
-<br>
-
-## Usage
-
-The main export is a function that takes a glob pattern and an options object and returns a function for matching strings.
-
-```js
-const pm = require('picomatch');
-const isMatch = pm('*.js');
-
-console.log(isMatch('abcd')); //=> false
-console.log(isMatch('a.js')); //=> true
-console.log(isMatch('a.md')); //=> false
-console.log(isMatch('a/b.js')); //=> false
-```
-
-<br>
-
-## API
-
-### [picomatch](lib/picomatch.js#L32)
-
-Creates a matcher function from one or more glob patterns. The returned function takes a string to match as its first argument, and returns true if the string is a match. The returned matcher function also takes a boolean as the second argument that, when true, returns an object with additional information.
-
-**Params**
-
-* `globs` **{String|Array}**: One or more glob patterns.
-* `options` **{Object=}**
-* `returns` **{Function=}**: Returns a matcher function.
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-// picomatch(glob[, options]);
-
-const isMatch = picomatch('*.!(*a)');
-console.log(isMatch('a.a')); //=> false
-console.log(isMatch('a.b')); //=> true
-```
-
-### [.test](lib/picomatch.js#L117)
-
-Test `input` with the given `regex`. This is used by the main `picomatch()` function to test the input string.
-
-**Params**
-
-* `input` **{String}**: String to test.
-* `regex` **{RegExp}**
-* `returns` **{Object}**: Returns an object with matching info.
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-// picomatch.test(input, regex[, options]);
-
-console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/));
-// { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }
-```
-
-### [.matchBase](lib/picomatch.js#L161)
-
-Match the basename of a filepath.
-
-**Params**
-
-* `input` **{String}**: String to test.
-* `glob` **{RegExp|String}**: Glob pattern or regex created by [.makeRe](#makeRe).
-* `returns` **{Boolean}**
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-// picomatch.matchBase(input, glob[, options]);
-console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true
-```
-
-### [.isMatch](lib/picomatch.js#L183)
-
-Returns true if **any** of the given glob `patterns` match the specified `string`.
-
-**Params**
-
-* **{String|Array}**: str The string to test.
-* **{String|Array}**: patterns One or more glob patterns to use for matching.
-* **{Object}**: See available [options](#options).
-* `returns` **{Boolean}**: Returns true if any patterns match `str`
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-// picomatch.isMatch(string, patterns[, options]);
-
-console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true
-console.log(picomatch.isMatch('a.a', 'b.*')); //=> false
-```
-
-### [.parse](lib/picomatch.js#L199)
-
-Parse a glob pattern to create the source string for a regular expression.
-
-**Params**
-
-* `pattern` **{String}**
-* `options` **{Object}**
-* `returns` **{Object}**: Returns an object with useful properties and output to be used as a regex source string.
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-const result = picomatch.parse(pattern[, options]);
-```
-
-### [.scan](lib/picomatch.js#L231)
-
-Scan a glob pattern to separate the pattern into segments.
-
-**Params**
-
-* `input` **{String}**: Glob pattern to scan.
-* `options` **{Object}**
-* `returns` **{Object}**: Returns an object with
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-// picomatch.scan(input[, options]);
-
-const result = picomatch.scan('!./foo/*.js');
-console.log(result);
-{ prefix: '!./',
-  input: '!./foo/*.js',
-  start: 3,
-  base: 'foo',
-  glob: '*.js',
-  isBrace: false,
-  isBracket: false,
-  isGlob: true,
-  isExtglob: false,
-  isGlobstar: false,
-  negated: true }
-```
-
-### [.compileRe](lib/picomatch.js#L245)
-
-Compile a regular expression from the `state` object returned by the
-[parse()](#parse) method.
-
-**Params**
-
-* `state` **{Object}**
-* `options` **{Object}**
-* `returnOutput` **{Boolean}**: Intended for implementors, this argument allows you to return the raw output from the parser.
-* `returnState` **{Boolean}**: Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.
-* `returns` **{RegExp}**
-
-### [.makeRe](lib/picomatch.js#L286)
-
-Create a regular expression from a parsed glob pattern.
-
-**Params**
-
-* `state` **{String}**: The object returned from the `.parse` method.
-* `options` **{Object}**
-* `returnOutput` **{Boolean}**: Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.
-* `returnState` **{Boolean}**: Implementors may use this argument to return the state from the parsed glob with the returned regular expression.
-* `returns` **{RegExp}**: Returns a regex created from the given pattern.
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-const state = picomatch.parse('*.js');
-// picomatch.compileRe(state[, options]);
-
-console.log(picomatch.compileRe(state));
-//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
-```
-
-### [.toRegex](lib/picomatch.js#L321)
-
-Create a regular expression from the given regex source string.
-
-**Params**
-
-* `source` **{String}**: Regular expression source string.
-* `options` **{Object}**
-* `returns` **{RegExp}**
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-// picomatch.toRegex(source[, options]);
-
-const { output } = picomatch.parse('*.js');
-console.log(picomatch.toRegex(output));
-//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
-```
-
-<br>
-
-## Options
-
-### Picomatch options
-
-The following options may be used with the main `picomatch()` function or any of the methods on the picomatch API.
-
-| **Option** | **Type** | **Default value** | **Description** |
-| --- | --- | --- | --- |
-| `basename`            | `boolean`      | `false`     | If set, then patterns without slashes will be matched against the basename of the path if it contains slashes.  For example, `a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. |
-| `bash`                | `boolean`      | `false`     | Follow bash matching rules more strictly - disallows backslashes as escape characters, and treats single stars as globstars (`**`). |
-| `capture`             | `boolean`      | `undefined` | Return regex matches in supporting methods. |
-| `contains`            | `boolean`      | `undefined` | Allows glob to match any part of the given string(s). |
-| `cwd`                 | `string`       | `process.cwd()` | Current working directory. Used by `picomatch.split()` |
-| `debug`               | `boolean`      | `undefined` | Debug regular expressions when an error is thrown. |
-| `dot`                 | `boolean`      | `false`     | Enable dotfile matching. By default, dotfiles are ignored unless a `.` is explicitly defined in the pattern, or `options.dot` is true |
-| `expandRange`         | `function`     | `undefined` | Custom function for expanding ranges in brace patterns, such as `{a..z}`. The function receives the range values as two arguments, and it must return a string to be used in the generated regex. It's recommended that returned strings be wrapped in parentheses. |
-| `failglob`            | `boolean`      | `false`     | Throws an error if no matches are found. Based on the bash option of the same name. |
-| `fastpaths`           | `boolean`      | `true`      | To speed up processing, full parsing is skipped for a handful common glob patterns. Disable this behavior by setting this option to `false`. |
-| `flags`               | `string`      | `undefined` | Regex flags to use in the generated regex. If defined, the `nocase` option will be overridden. |
-| [format](#optionsformat) | `function` | `undefined` | Custom function for formatting the returned string. This is useful for removing leading slashes, converting Windows paths to Posix paths, etc. |
-| `ignore`              | `array\|string` | `undefined` | One or more glob patterns for excluding strings that should not be matched from the result. |
-| `keepQuotes`          | `boolean`      | `false`     | Retain quotes in the generated regex, since quotes may also be used as an alternative to backslashes.  |
-| `literalBrackets`     | `boolean`      | `undefined` | When `true`, brackets in the glob pattern will be escaped so that only literal brackets will be matched. |
-| `matchBase`           | `boolean`      | `false`     | Alias for `basename` |
-| `maxLength`           | `boolean`      | `65536`     | Limit the max length of the input string. An error is thrown if the input string is longer than this value. |
-| `nobrace`             | `boolean`      | `false`     | Disable brace matching, so that `{a,b}` and `{1..3}` would be treated as literal characters. |
-| `nobracket`           | `boolean`      | `undefined` | Disable matching with regex brackets. |
-| `nocase`              | `boolean`      | `false`     | Make matching case-insensitive. Equivalent to the regex `i` flag. Note that this option is overridden by the `flags` option. |
-| `nodupes`             | `boolean`      | `true`      | Deprecated, use `nounique` instead. This option will be removed in a future major release. By default duplicates are removed. Disable uniquification by setting this option to false. |
-| `noext`               | `boolean`      | `false`     | Alias for `noextglob` |
-| `noextglob`           | `boolean`      | `false`     | Disable support for matching with extglobs (like `+(a\|b)`) |
-| `noglobstar`          | `boolean`      | `false`     | Disable support for matching nested directories with globstars (`**`) |
-| `nonegate`            | `boolean`      | `false`     | Disable support for negating with leading `!` |
-| `noquantifiers`       | `boolean`      | `false`     | Disable support for regex quantifiers (like `a{1,2}`) and treat them as brace patterns to be expanded. |
-| [onIgnore](#optionsonIgnore) | `function` | `undefined` | Function to be called on ignored items. |
-| [onMatch](#optionsonMatch) | `function` | `undefined` | Function to be called on matched items. |
-| [onResult](#optionsonResult) | `function` | `undefined` | Function to be called on all items, regardless of whether or not they are matched or ignored. |
-| `posix`               | `boolean`      | `false`     | Support POSIX character classes ("posix brackets"). |
-| `posixSlashes`        | `boolean`      | `undefined` | Convert all slashes in file paths to forward slashes. This does not convert slashes in the glob pattern itself |
-| `prepend`             | `boolean`      | `undefined` | String to prepend to the generated regex used for matching. |
-| `regex`               | `boolean`      | `false`     | Use regular expression rules for `+` (instead of matching literal `+`), and for stars that follow closing parentheses or brackets (as in `)*` and `]*`). |
-| `strictBrackets`      | `boolean`      | `undefined` | Throw an error if brackets, braces, or parens are imbalanced. |
-| `strictSlashes`       | `boolean`      | `undefined` | When true, picomatch won't match trailing slashes with single stars. |
-| `unescape`            | `boolean`      | `undefined` | Remove backslashes preceding escaped characters in the glob pattern. By default, backslashes are retained. |
-| `unixify`             | `boolean`      | `undefined` | Alias for `posixSlashes`, for backwards compatibility. |
-
-picomatch has automatic detection for regex positive and negative lookbehinds. If the pattern contains a negative lookbehind, you must be using Node.js >= 8.10 or else picomatch will throw an error.
-
-### Scan Options
-
-In addition to the main [picomatch options](#picomatch-options), the following options may also be used with the [.scan](#scan) method.
-
-| **Option** | **Type** | **Default value** | **Description** |
-| --- | --- | --- | --- |
-| `tokens` | `boolean` | `false` | When `true`, the returned object will include an array of tokens (objects), representing each path "segment" in the scanned glob pattern |
-| `parts` | `boolean` | `false` | When `true`, the returned object will include an array of strings representing each path "segment" in the scanned glob pattern. This is automatically enabled when `options.tokens` is true |
-
-**Example**
-
-```js
-const picomatch = require('picomatch');
-const result = picomatch.scan('!./foo/*.js', { tokens: true });
-console.log(result);
-// {
-//   prefix: '!./',
-//   input: '!./foo/*.js',
-//   start: 3,
-//   base: 'foo',
-//   glob: '*.js',
-//   isBrace: false,
-//   isBracket: false,
-//   isGlob: true,
-//   isExtglob: false,
-//   isGlobstar: false,
-//   negated: true,
-//   maxDepth: 2,
-//   tokens: [
-//     { value: '!./', depth: 0, isGlob: false, negated: true, isPrefix: true },
-//     { value: 'foo', depth: 1, isGlob: false },
-//     { value: '*.js', depth: 1, isGlob: true }
-//   ],
-//   slashes: [ 2, 6 ],
-//   parts: [ 'foo', '*.js' ]
-// }
-```
-
-<br>
-
-### Options Examples
-
-#### options.expandRange
-
-**Type**: `function`
-
-**Default**: `undefined`
-
-Custom function for expanding ranges in brace patterns. The [fill-range](https://github.com/jonschlinkert/fill-range) library is ideal for this purpose, or you can use custom code to do whatever you need.
-
-**Example**
-
-The following example shows how to create a glob that matches a folder
-
-```js
-const fill = require('fill-range');
-const regex = pm.makeRe('foo/{01..25}/bar', {
-  expandRange(a, b) {
-    return `(${fill(a, b, { toRegex: true })})`;
-  }
-});
-
-console.log(regex);
-//=> /^(?:foo\/((?:0[1-9]|1[0-9]|2[0-5]))\/bar)$/
-
-console.log(regex.test('foo/00/bar'))  // false
-console.log(regex.test('foo/01/bar'))  // true
-console.log(regex.test('foo/10/bar')) // true
-console.log(regex.test('foo/22/bar')) // true
-console.log(regex.test('foo/25/bar')) // true
-console.log(regex.test('foo/26/bar')) // false
-```
-
-#### options.format
-
-**Type**: `function`
-
-**Default**: `undefined`
-
-Custom function for formatting strings before they're matched.
-
-**Example**
-
-```js
-// strip leading './' from strings
-const format = str => str.replace(/^\.\//, '');
-const isMatch = picomatch('foo/*.js', { format });
-console.log(isMatch('./foo/bar.js')); //=> true
-```
-
-#### options.onMatch
-
-```js
-const onMatch = ({ glob, regex, input, output }) => {
-  console.log({ glob, regex, input, output });
-};
-
-const isMatch = picomatch('*', { onMatch });
-isMatch('foo');
-isMatch('bar');
-isMatch('baz');
-```
-
-#### options.onIgnore
-
-```js
-const onIgnore = ({ glob, regex, input, output }) => {
-  console.log({ glob, regex, input, output });
-};
-
-const isMatch = picomatch('*', { onIgnore, ignore: 'f*' });
-isMatch('foo');
-isMatch('bar');
-isMatch('baz');
-```
-
-#### options.onResult
-
-```js
-const onResult = ({ glob, regex, input, output }) => {
-  console.log({ glob, regex, input, output });
-};
-
-const isMatch = picomatch('*', { onResult, ignore: 'f*' });
-isMatch('foo');
-isMatch('bar');
-isMatch('baz');
-```
-
-<br>
-<br>
-
-## Globbing features
-
-* [Basic globbing](#basic-globbing) (Wildcard matching)
-* [Advanced globbing](#advanced-globbing) (extglobs, posix brackets, brace matching)
-
-### Basic globbing
-
-| **Character** | **Description** |
-| --- | --- |
-| `*` | Matches any character zero or more times, excluding path separators. Does _not match_ path separators or hidden files or directories ("dotfiles"), unless explicitly enabled by setting the `dot` option to `true`. |
-| `**` | Matches any character zero or more times, including path separators. Note that `**` will only match path separators (`/`, and `\\` on Windows) when they are the only characters in a path segment. Thus, `foo**/bar` is equivalent to `foo*/bar`, and `foo/a**b/bar` is equivalent to `foo/a*b/bar`, and _more than two_ consecutive stars in a glob path segment are regarded as _a single star_. Thus, `foo/***/bar` is equivalent to `foo/*/bar`. |
-| `?` | Matches any character excluding path separators one time. Does _not match_ path separators or leading dots.  |
-| `[abc]` | Matches any characters inside the brackets. For example, `[abc]` would match the characters `a`, `b` or `c`, and nothing else. |
-
-#### Matching behavior vs. Bash
-
-Picomatch's matching features and expected results in unit tests are based on Bash's unit tests and the Bash 4.3 specification, with the following exceptions:
-
-* Bash will match `foo/bar/baz` with `*`. Picomatch only matches nested directories with `**`.
-* Bash greedily matches with negated extglobs. For example, Bash 4.3 says that `!(foo)*` should match `foo` and `foobar`, since the trailing `*` bracktracks to match the preceding pattern. This is very memory-inefficient, and IMHO, also incorrect. Picomatch would return `false` for both `foo` and `foobar`.
-
-<br>
-
-### Advanced globbing
-
-* [extglobs](#extglobs)
-* [POSIX brackets](#posix-brackets)
-* [Braces](#brace-expansion)
-
-#### Extglobs
-
-| **Pattern** | **Description** |
-| --- | --- |
-| `@(pattern)` | Match _only one_ consecutive occurrence of `pattern` |
-| `*(pattern)` | Match _zero or more_ consecutive occurrences of `pattern` |
-| `+(pattern)` | Match _one or more_ consecutive occurrences of `pattern` |
-| `?(pattern)` | Match _zero or **one**_ consecutive occurrences of `pattern` |
-| `!(pattern)` | Match _anything but_ `pattern` |
-
-**Examples**
-
-```js
-const pm = require('picomatch');
-
-// *(pattern) matches ZERO or more of "pattern"
-console.log(pm.isMatch('a', 'a*(z)')); // true
-console.log(pm.isMatch('az', 'a*(z)')); // true
-console.log(pm.isMatch('azzz', 'a*(z)')); // true
-
-// +(pattern) matches ONE or more of "pattern"
-console.log(pm.isMatch('a', 'a*(z)')); // true
-console.log(pm.isMatch('az', 'a*(z)')); // true
-console.log(pm.isMatch('azzz', 'a*(z)')); // true
-
-// supports multiple extglobs
-console.log(pm.isMatch('foo.bar', '!(foo).!(bar)')); // false
-
-// supports nested extglobs
-console.log(pm.isMatch('foo.bar', '!(!(foo)).!(!(bar))')); // true
-```
-
-#### POSIX brackets
-
-POSIX classes are disabled by default. Enable this feature by setting the `posix` option to true.
-
-**Enable POSIX bracket support**
-
-```js
-console.log(pm.makeRe('[[:word:]]+', { posix: true }));
-//=> /^(?:(?=.)[A-Za-z0-9_]+\/?)$/
-```
-
-**Supported POSIX classes**
-
-The following named POSIX bracket expressions are supported:
-
-* `[:alnum:]` - Alphanumeric characters, equ `[a-zA-Z0-9]`
-* `[:alpha:]` - Alphabetical characters, equivalent to `[a-zA-Z]`.
-* `[:ascii:]` - ASCII characters, equivalent to `[\\x00-\\x7F]`.
-* `[:blank:]` - Space and tab characters, equivalent to `[ \\t]`.
-* `[:cntrl:]` - Control characters, equivalent to `[\\x00-\\x1F\\x7F]`.
-* `[:digit:]` - Numerical digits, equivalent to `[0-9]`.
-* `[:graph:]` - Graph characters, equivalent to `[\\x21-\\x7E]`.
-* `[:lower:]` - Lowercase letters, equivalent to `[a-z]`.
-* `[:print:]` - Print characters, equivalent to `[\\x20-\\x7E ]`.
-* `[:punct:]` - Punctuation and symbols, equivalent to `[\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~]`.
-* `[:space:]` - Extended space characters, equivalent to `[ \\t\\r\\n\\v\\f]`.
-* `[:upper:]` - Uppercase letters, equivalent to `[A-Z]`.
-* `[:word:]` -  Word characters (letters, numbers and underscores), equivalent to `[A-Za-z0-9_]`.
-* `[:xdigit:]` - Hexadecimal digits, equivalent to `[A-Fa-f0-9]`.
-
-See the [Bash Reference Manual](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html) for more information.
-
-### Braces
-
-Picomatch does not do brace expansion. For [brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html) and advanced matching with braces, use [micromatch](https://github.com/micromatch/micromatch) instead. Picomatch has very basic support for braces.
-
-### Matching special characters as literals
-
-If you wish to match the following special characters in a filepath, and you want to use these characters in your glob pattern, they must be escaped with backslashes or quotes:
-
-**Special Characters**
-
-Some characters that are used for matching in regular expressions are also regarded as valid file path characters on some platforms.
-
-To match any of the following characters as literals: `$^*+?()[]
-
-Examples:
-
-```js
-console.log(pm.makeRe('foo/bar \\(1\\)'));
-console.log(pm.makeRe('foo/bar \\(1\\)'));
-```
-
-<br>
-<br>
-
-## Library Comparisons
-
-The following table shows which features are supported by [minimatch](https://github.com/isaacs/minimatch), [micromatch](https://github.com/micromatch/micromatch), [picomatch](https://github.com/micromatch/picomatch), [nanomatch](https://github.com/micromatch/nanomatch), [extglob](https://github.com/micromatch/extglob), [braces](https://github.com/micromatch/braces), and [expand-brackets](https://github.com/micromatch/expand-brackets).
-
-| **Feature** | `minimatch` | `micromatch` | `picomatch` | `nanomatch` | `extglob` | `braces` | `expand-brackets` |
-| --- | --- | --- | --- | --- | --- | --- | --- |
-| Wildcard matching (`*?+`) | ✔ | ✔ | ✔ | ✔ | - | - | - |
-| Advancing globbing        | ✔ | ✔ | ✔ | - | - | - | - |
-| Brace _matching_          | ✔ | ✔ | ✔ | - | - | ✔ | - |
-| Brace _expansion_         | ✔ | ✔ | - | - | - | ✔ | - |
-| Extglobs                  | partial | ✔ | ✔ | - | ✔ | - | - |
-| Posix brackets            | - | ✔ | ✔ | - | - | - | ✔ |
-| Regular expression syntax | - | ✔ | ✔ | ✔ | ✔ | - | ✔ |
-| File system operations    | - | - | - | - | - | - | - |
-
-<br>
-<br>
-
-## Benchmarks
-
-Performance comparison of picomatch and minimatch.
-
-```
-# .makeRe star
-  picomatch x 1,993,050 ops/sec ±0.51% (91 runs sampled)
-  minimatch x 627,206 ops/sec ±1.96% (87 runs sampled))
-
-# .makeRe star; dot=true
-  picomatch x 1,436,640 ops/sec ±0.62% (91 runs sampled)
-  minimatch x 525,876 ops/sec ±0.60% (88 runs sampled)
-
-# .makeRe globstar
-  picomatch x 1,592,742 ops/sec ±0.42% (90 runs sampled)
-  minimatch x 962,043 ops/sec ±1.76% (91 runs sampled)d)
-
-# .makeRe globstars
-  picomatch x 1,615,199 ops/sec ±0.35% (94 runs sampled)
-  minimatch x 477,179 ops/sec ±1.33% (91 runs sampled)
-
-# .makeRe with leading star
-  picomatch x 1,220,856 ops/sec ±0.40% (92 runs sampled)
-  minimatch x 453,564 ops/sec ±1.43% (94 runs sampled)
-
-# .makeRe - basic braces
-  picomatch x 392,067 ops/sec ±0.70% (90 runs sampled)
-  minimatch x 99,532 ops/sec ±2.03% (87 runs sampled))
-```
-
-<br>
-<br>
-
-## Philosophies
-
-The goal of this library is to be blazing fast, without compromising on accuracy.
-
-**Accuracy**
-
-The number one of goal of this library is accuracy. However, it's not unusual for different glob implementations to have different rules for matching behavior, even with simple wildcard matching. It gets increasingly more complicated when combinations of different features are combined, like when extglobs are combined with globstars, braces, slashes, and so on: `!(**/{a,b,*/c})`.
-
-Thus, given that there is no canonical glob specification to use as a single source of truth when differences of opinion arise regarding behavior, sometimes we have to implement our best judgement and rely on feedback from users to make improvements.
-
-**Performance**
-
-Although this library performs well in benchmarks, and in most cases it's faster than other popular libraries we benchmarked against, we will always choose accuracy over performance. It's not helpful to anyone if our library is faster at returning the wrong answer.
-
-<br>
-<br>
-
-## About
-
-<details>
-<summary><strong>Contributing</strong></summary>
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-Please read the [contributing guide](.github/contributing.md) for advice on opening issues, pull requests, and coding standards.
-
-</details>
-
-<details>
-<summary><strong>Running Tests</strong></summary>
-
-Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
-
-```sh
-npm install && npm test
-```
-
-</details>
-
-<details>
-<summary><strong>Building docs</strong></summary>
-
-_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
-
-To generate the readme, run the following command:
-
-```sh
-npm install -g verbose/verb#dev verb-generate-readme && verb
-```
-
-</details>
-
-### Author
-
-**Jon Schlinkert**
-
-* [GitHub Profile](https://github.com/jonschlinkert)
-* [Twitter Profile](https://twitter.com/jonschlinkert)
-* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
-
-### License
-
-Copyright © 2017-present, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT License](LICENSE).
diff --git a/node_modules/picomatch/index.js b/node_modules/picomatch/index.js
deleted file mode 100644
index d2f2bc59d0ac7c40b35c574c45bcedbf26263d75..0000000000000000000000000000000000000000
--- a/node_modules/picomatch/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-'use strict';
-
-module.exports = require('./lib/picomatch');
diff --git a/node_modules/picomatch/lib/constants.js b/node_modules/picomatch/lib/constants.js
deleted file mode 100644
index a62ef3879552505852ef3a7b9ebe15cdae5e52cf..0000000000000000000000000000000000000000
--- a/node_modules/picomatch/lib/constants.js
+++ /dev/null
@@ -1,179 +0,0 @@
-'use strict';
-
-const path = require('path');
-const WIN_SLASH = '\\\\/';
-const WIN_NO_SLASH = `[^${WIN_SLASH}]`;
-
-/**
- * Posix glob regex
- */
-
-const DOT_LITERAL = '\\.';
-const PLUS_LITERAL = '\\+';
-const QMARK_LITERAL = '\\?';
-const SLASH_LITERAL = '\\/';
-const ONE_CHAR = '(?=.)';
-const QMARK = '[^/]';
-const END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;
-const START_ANCHOR = `(?:^|${SLASH_LITERAL})`;
-const DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;
-const NO_DOT = `(?!${DOT_LITERAL})`;
-const NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;
-const NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;
-const NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;
-const QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;
-const STAR = `${QMARK}*?`;
-
-const POSIX_CHARS = {
-  DOT_LITERAL,
-  PLUS_LITERAL,
-  QMARK_LITERAL,
-  SLASH_LITERAL,
-  ONE_CHAR,
-  QMARK,
-  END_ANCHOR,
-  DOTS_SLASH,
-  NO_DOT,
-  NO_DOTS,
-  NO_DOT_SLASH,
-  NO_DOTS_SLASH,
-  QMARK_NO_DOT,
-  STAR,
-  START_ANCHOR
-};
-
-/**
- * Windows glob regex
- */
-
-const WINDOWS_CHARS = {
-  ...POSIX_CHARS,
-
-  SLASH_LITERAL: `[${WIN_SLASH}]`,
-  QMARK: WIN_NO_SLASH,
-  STAR: `${WIN_NO_SLASH}*?`,
-  DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,
-  NO_DOT: `(?!${DOT_LITERAL})`,
-  NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,
-  NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,
-  NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,
-  QMARK_NO_DOT: `[^.${WIN_SLASH}]`,
-  START_ANCHOR: `(?:^|[${WIN_SLASH}])`,
-  END_ANCHOR: `(?:[${WIN_SLASH}]|$)`
-};
-
-/**
- * POSIX Bracket Regex
- */
-
-const POSIX_REGEX_SOURCE = {
-  alnum: 'a-zA-Z0-9',
-  alpha: 'a-zA-Z',
-  ascii: '\\x00-\\x7F',
-  blank: ' \\t',
-  cntrl: '\\x00-\\x1F\\x7F',
-  digit: '0-9',
-  graph: '\\x21-\\x7E',
-  lower: 'a-z',
-  print: '\\x20-\\x7E ',
-  punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~',
-  space: ' \\t\\r\\n\\v\\f',
-  upper: 'A-Z',
-  word: 'A-Za-z0-9_',
-  xdigit: 'A-Fa-f0-9'
-};
-
-module.exports = {
-  MAX_LENGTH: 1024 * 64,
-  POSIX_REGEX_SOURCE,
-
-  // regular expressions
-  REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g,
-  REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/,
-  REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/,
-  REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g,
-  REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g,
-  REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g,
-
-  // Replace globs with equivalent patterns to reduce parsing time.
-  REPLACEMENTS: {
-    '***': '*',
-    '**/**': '**',
-    '**/**/**': '**'
-  },
-
-  // Digits
-  CHAR_0: 48, /* 0 */
-  CHAR_9: 57, /* 9 */
-
-  // Alphabet chars.
-  CHAR_UPPERCASE_A: 65, /* A */
-  CHAR_LOWERCASE_A: 97, /* a */
-  CHAR_UPPERCASE_Z: 90, /* Z */
-  CHAR_LOWERCASE_Z: 122, /* z */
-
-  CHAR_LEFT_PARENTHESES: 40, /* ( */
-  CHAR_RIGHT_PARENTHESES: 41, /* ) */
-
-  CHAR_ASTERISK: 42, /* * */
-
-  // Non-alphabetic chars.
-  CHAR_AMPERSAND: 38, /* & */
-  CHAR_AT: 64, /* @ */
-  CHAR_BACKWARD_SLASH: 92, /* \ */
-  CHAR_CARRIAGE_RETURN: 13, /* \r */
-  CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */
-  CHAR_COLON: 58, /* : */
-  CHAR_COMMA: 44, /* , */
-  CHAR_DOT: 46, /* . */
-  CHAR_DOUBLE_QUOTE: 34, /* " */
-  CHAR_EQUAL: 61, /* = */
-  CHAR_EXCLAMATION_MARK: 33, /* ! */
-  CHAR_FORM_FEED: 12, /* \f */
-  CHAR_FORWARD_SLASH: 47, /* / */
-  CHAR_GRAVE_ACCENT: 96, /* ` */
-  CHAR_HASH: 35, /* # */
-  CHAR_HYPHEN_MINUS: 45, /* - */
-  CHAR_LEFT_ANGLE_BRACKET: 60, /* < */
-  CHAR_LEFT_CURLY_BRACE: 123, /* { */
-  CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */
-  CHAR_LINE_FEED: 10, /* \n */
-  CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */
-  CHAR_PERCENT: 37, /* % */
-  CHAR_PLUS: 43, /* + */
-  CHAR_QUESTION_MARK: 63, /* ? */
-  CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */
-  CHAR_RIGHT_CURLY_BRACE: 125, /* } */
-  CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */
-  CHAR_SEMICOLON: 59, /* ; */
-  CHAR_SINGLE_QUOTE: 39, /* ' */
-  CHAR_SPACE: 32, /*   */
-  CHAR_TAB: 9, /* \t */
-  CHAR_UNDERSCORE: 95, /* _ */
-  CHAR_VERTICAL_LINE: 124, /* | */
-  CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */
-
-  SEP: path.sep,
-
-  /**
-   * Create EXTGLOB_CHARS
-   */
-
-  extglobChars(chars) {
-    return {
-      '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },
-      '?': { type: 'qmark', open: '(?:', close: ')?' },
-      '+': { type: 'plus', open: '(?:', close: ')+' },
-      '*': { type: 'star', open: '(?:', close: ')*' },
-      '@': { type: 'at', open: '(?:', close: ')' }
-    };
-  },
-
-  /**
-   * Create GLOB_CHARS
-   */
-
-  globChars(win32) {
-    return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;
-  }
-};
diff --git a/node_modules/picomatch/lib/parse.js b/node_modules/picomatch/lib/parse.js
deleted file mode 100644
index 58269d018dc9512349adbdbe0f14171b398d342a..0000000000000000000000000000000000000000
--- a/node_modules/picomatch/lib/parse.js
+++ /dev/null
@@ -1,1091 +0,0 @@
-'use strict';
-
-const constants = require('./constants');
-const utils = require('./utils');
-
-/**
- * Constants
- */
-
-const {
-  MAX_LENGTH,
-  POSIX_REGEX_SOURCE,
-  REGEX_NON_SPECIAL_CHARS,
-  REGEX_SPECIAL_CHARS_BACKREF,
-  REPLACEMENTS
-} = constants;
-
-/**
- * Helpers
- */
-
-const expandRange = (args, options) => {
-  if (typeof options.expandRange === 'function') {
-    return options.expandRange(...args, options);
-  }
-
-  args.sort();
-  const value = `[${args.join('-')}]`;
-
-  try {
-    /* eslint-disable-next-line no-new */
-    new RegExp(value);
-  } catch (ex) {
-    return args.map(v => utils.escapeRegex(v)).join('..');
-  }
-
-  return value;
-};
-
-/**
- * Create the message for a syntax error
- */
-
-const syntaxError = (type, char) => {
-  return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`;
-};
-
-/**
- * Parse the given input string.
- * @param {String} input
- * @param {Object} options
- * @return {Object}
- */
-
-const parse = (input, options) => {
-  if (typeof input !== 'string') {
-    throw new TypeError('Expected a string');
-  }
-
-  input = REPLACEMENTS[input] || input;
-
-  const opts = { ...options };
-  const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;
-
-  let len = input.length;
-  if (len > max) {
-    throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);
-  }
-
-  const bos = { type: 'bos', value: '', output: opts.prepend || '' };
-  const tokens = [bos];
-
-  const capture = opts.capture ? '' : '?:';
-  const win32 = utils.isWindows(options);
-
-  // create constants based on platform, for windows or posix
-  const PLATFORM_CHARS = constants.globChars(win32);
-  const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS);
-
-  const {
-    DOT_LITERAL,
-    PLUS_LITERAL,
-    SLASH_LITERAL,
-    ONE_CHAR,
-    DOTS_SLASH,
-    NO_DOT,
-    NO_DOT_SLASH,
-    NO_DOTS_SLASH,
-    QMARK,
-    QMARK_NO_DOT,
-    STAR,
-    START_ANCHOR
-  } = PLATFORM_CHARS;
-
-  const globstar = opts => {
-    return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;
-  };
-
-  const nodot = opts.dot ? '' : NO_DOT;
-  const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;
-  let star = opts.bash === true ? globstar(opts) : STAR;
-
-  if (opts.capture) {
-    star = `(${star})`;
-  }
-
-  // minimatch options support
-  if (typeof opts.noext === 'boolean') {
-    opts.noextglob = opts.noext;
-  }
-
-  const state = {
-    input,
-    index: -1,
-    start: 0,
-    dot: opts.dot === true,
-    consumed: '',
-    output: '',
-    prefix: '',
-    backtrack: false,
-    negated: false,
-    brackets: 0,
-    braces: 0,
-    parens: 0,
-    quotes: 0,
-    globstar: false,
-    tokens
-  };
-
-  input = utils.removePrefix(input, state);
-  len = input.length;
-
-  const extglobs = [];
-  const braces = [];
-  const stack = [];
-  let prev = bos;
-  let value;
-
-  /**
-   * Tokenizing helpers
-   */
-
-  const eos = () => state.index === len - 1;
-  const peek = state.peek = (n = 1) => input[state.index + n];
-  const advance = state.advance = () => input[++state.index] || '';
-  const remaining = () => input.slice(state.index + 1);
-  const consume = (value = '', num = 0) => {
-    state.consumed += value;
-    state.index += num;
-  };
-
-  const append = token => {
-    state.output += token.output != null ? token.output : token.value;
-    consume(token.value);
-  };
-
-  const negate = () => {
-    let count = 1;
-
-    while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {
-      advance();
-      state.start++;
-      count++;
-    }
-
-    if (count % 2 === 0) {
-      return false;
-    }
-
-    state.negated = true;
-    state.start++;
-    return true;
-  };
-
-  const increment = type => {
-    state[type]++;
-    stack.push(type);
-  };
-
-  const decrement = type => {
-    state[type]--;
-    stack.pop();
-  };
-
-  /**
-   * Push tokens onto the tokens array. This helper speeds up
-   * tokenizing by 1) helping us avoid backtracking as much as possible,
-   * and 2) helping us avoid creating extra tokens when consecutive
-   * characters are plain text. This improves performance and simplifies
-   * lookbehinds.
-   */
-
-  const push = tok => {
-    if (prev.type === 'globstar') {
-      const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');
-      const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));
-
-      if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {
-        state.output = state.output.slice(0, -prev.output.length);
-        prev.type = 'star';
-        prev.value = '*';
-        prev.output = star;
-        state.output += prev.output;
-      }
-    }
-
-    if (extglobs.length && tok.type !== 'paren') {
-      extglobs[extglobs.length - 1].inner += tok.value;
-    }
-
-    if (tok.value || tok.output) append(tok);
-    if (prev && prev.type === 'text' && tok.type === 'text') {
-      prev.value += tok.value;
-      prev.output = (prev.output || '') + tok.value;
-      return;
-    }
-
-    tok.prev = prev;
-    tokens.push(tok);
-    prev = tok;
-  };
-
-  const extglobOpen = (type, value) => {
-    const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };
-
-    token.prev = prev;
-    token.parens = state.parens;
-    token.output = state.output;
-    const output = (opts.capture ? '(' : '') + token.open;
-
-    increment('parens');
-    push({ type, value, output: state.output ? '' : ONE_CHAR });
-    push({ type: 'paren', extglob: true, value: advance(), output });
-    extglobs.push(token);
-  };
-
-  const extglobClose = token => {
-    let output = token.close + (opts.capture ? ')' : '');
-    let rest;
-
-    if (token.type === 'negate') {
-      let extglobStar = star;
-
-      if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {
-        extglobStar = globstar(opts);
-      }
-
-      if (extglobStar !== star || eos() || /^\)+$/.test(remaining())) {
-        output = token.close = `)$))${extglobStar}`;
-      }
-
-      if (token.inner.includes('*') && (rest = remaining()) && /^\.[^\\/.]+$/.test(rest)) {
-        // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis.
-        // In this case, we need to parse the string and use it in the output of the original pattern.
-        // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`.
-        //
-        // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`.
-        const expression = parse(rest, { ...options, fastpaths: false }).output;
-
-        output = token.close = `)${expression})${extglobStar})`;
-      }
-
-      if (token.prev.type === 'bos') {
-        state.negatedExtglob = true;
-      }
-    }
-
-    push({ type: 'paren', extglob: true, value, output });
-    decrement('parens');
-  };
-
-  /**
-   * Fast paths
-   */
-
-  if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) {
-    let backslashes = false;
-
-    let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {
-      if (first === '\\') {
-        backslashes = true;
-        return m;
-      }
-
-      if (first === '?') {
-        if (esc) {
-          return esc + first + (rest ? QMARK.repeat(rest.length) : '');
-        }
-        if (index === 0) {
-          return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');
-        }
-        return QMARK.repeat(chars.length);
-      }
-
-      if (first === '.') {
-        return DOT_LITERAL.repeat(chars.length);
-      }
-
-      if (first === '*') {
-        if (esc) {
-          return esc + first + (rest ? star : '');
-        }
-        return star;
-      }
-      return esc ? m : `\\${m}`;
-    });
-
-    if (backslashes === true) {
-      if (opts.unescape === true) {
-        output = output.replace(/\\/g, '');
-      } else {
-        output = output.replace(/\\+/g, m => {
-          return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : '');
-        });
-      }
-    }
-
-    if (output === input && opts.contains === true) {
-      state.output = input;
-      return state;
-    }
-
-    state.output = utils.wrapOutput(output, state, options);
-    return state;
-  }
-
-  /**
-   * Tokenize input until we reach end-of-string
-   */
-
-  while (!eos()) {
-    value = advance();
-
-    if (value === '\u0000') {
-      continue;
-    }
-
-    /**
-     * Escaped characters
-     */
-
-    if (value === '\\') {
-      const next = peek();
-
-      if (next === '/' && opts.bash !== true) {
-        continue;
-      }
-
-      if (next === '.' || next === ';') {
-        continue;
-      }
-
-      if (!next) {
-        value += '\\';
-        push({ type: 'text', value });
-        continue;
-      }
-
-      // collapse slashes to reduce potential for exploits
-      const match = /^\\+/.exec(remaining());
-      let slashes = 0;
-
-      if (match && match[0].length > 2) {
-        slashes = match[0].length;
-        state.index += slashes;
-        if (slashes % 2 !== 0) {
-          value += '\\';
-        }
-      }
-
-      if (opts.unescape === true) {
-        value = advance();
-      } else {
-        value += advance();
-      }
-
-      if (state.brackets === 0) {
-        push({ type: 'text', value });
-        continue;
-      }
-    }
-
-    /**
-     * If we're inside a regex character class, continue
-     * until we reach the closing bracket.
-     */
-
-    if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {
-      if (opts.posix !== false && value === ':') {
-        const inner = prev.value.slice(1);
-        if (inner.includes('[')) {
-          prev.posix = true;
-
-          if (inner.includes(':')) {
-            const idx = prev.value.lastIndexOf('[');
-            const pre = prev.value.slice(0, idx);
-            const rest = prev.value.slice(idx + 2);
-            const posix = POSIX_REGEX_SOURCE[rest];
-            if (posix) {
-              prev.value = pre + posix;
-              state.backtrack = true;
-              advance();
-
-              if (!bos.output && tokens.indexOf(prev) === 1) {
-                bos.output = ONE_CHAR;
-              }
-              continue;
-            }
-          }
-        }
-      }
-
-      if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {
-        value = `\\${value}`;
-      }
-
-      if (value === ']' && (prev.value === '[' || prev.value === '[^')) {
-        value = `\\${value}`;
-      }
-
-      if (opts.posix === true && value === '!' && prev.value === '[') {
-        value = '^';
-      }
-
-      prev.value += value;
-      append({ value });
-      continue;
-    }
-
-    /**
-     * If we're inside a quoted string, continue
-     * until we reach the closing double quote.
-     */
-
-    if (state.quotes === 1 && value !== '"') {
-      value = utils.escapeRegex(value);
-      prev.value += value;
-      append({ value });
-      continue;
-    }
-
-    /**
-     * Double quotes
-     */
-
-    if (value === '"') {
-      state.quotes = state.quotes === 1 ? 0 : 1;
-      if (opts.keepQuotes === true) {
-        push({ type: 'text', value });
-      }
-      continue;
-    }
-
-    /**
-     * Parentheses
-     */
-
-    if (value === '(') {
-      increment('parens');
-      push({ type: 'paren', value });
-      continue;
-    }
-
-    if (value === ')') {
-      if (state.parens === 0 && opts.strictBrackets === true) {
-        throw new SyntaxError(syntaxError('opening', '('));
-      }
-
-      const extglob = extglobs[extglobs.length - 1];
-      if (extglob && state.parens === extglob.parens + 1) {
-        extglobClose(extglobs.pop());
-        continue;
-      }
-
-      push({ type: 'paren', value, output: state.parens ? ')' : '\\)' });
-      decrement('parens');
-      continue;
-    }
-
-    /**
-     * Square brackets
-     */
-
-    if (value === '[') {
-      if (opts.nobracket === true || !remaining().includes(']')) {
-        if (opts.nobracket !== true && opts.strictBrackets === true) {
-          throw new SyntaxError(syntaxError('closing', ']'));
-        }
-
-        value = `\\${value}`;
-      } else {
-        increment('brackets');
-      }
-
-      push({ type: 'bracket', value });
-      continue;
-    }
-
-    if (value === ']') {
-      if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {
-        push({ type: 'text', value, output: `\\${value}` });
-        continue;
-      }
-
-      if (state.brackets === 0) {
-        if (opts.strictBrackets === true) {
-          throw new SyntaxError(syntaxError('opening', '['));
-        }
-
-        push({ type: 'text', value, output: `\\${value}` });
-        continue;
-      }
-
-      decrement('brackets');
-
-      const prevValue = prev.value.slice(1);
-      if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {
-        value = `/${value}`;
-      }
-
-      prev.value += value;
-      append({ value });
-
-      // when literal brackets are explicitly disabled
-      // assume we should match with a regex character class
-      if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) {
-        continue;
-      }
-
-      const escaped = utils.escapeRegex(prev.value);
-      state.output = state.output.slice(0, -prev.value.length);
-
-      // when literal brackets are explicitly enabled
-      // assume we should escape the brackets to match literal characters
-      if (opts.literalBrackets === true) {
-        state.output += escaped;
-        prev.value = escaped;
-        continue;
-      }
-
-      // when the user specifies nothing, try to match both
-      prev.value = `(${capture}${escaped}|${prev.value})`;
-      state.output += prev.value;
-      continue;
-    }
-
-    /**
-     * Braces
-     */
-
-    if (value === '{' && opts.nobrace !== true) {
-      increment('braces');
-
-      const open = {
-        type: 'brace',
-        value,
-        output: '(',
-        outputIndex: state.output.length,
-        tokensIndex: state.tokens.length
-      };
-
-      braces.push(open);
-      push(open);
-      continue;
-    }
-
-    if (value === '}') {
-      const brace = braces[braces.length - 1];
-
-      if (opts.nobrace === true || !brace) {
-        push({ type: 'text', value, output: value });
-        continue;
-      }
-
-      let output = ')';
-
-      if (brace.dots === true) {
-        const arr = tokens.slice();
-        const range = [];
-
-        for (let i = arr.length - 1; i >= 0; i--) {
-          tokens.pop();
-          if (arr[i].type === 'brace') {
-            break;
-          }
-          if (arr[i].type !== 'dots') {
-            range.unshift(arr[i].value);
-          }
-        }
-
-        output = expandRange(range, opts);
-        state.backtrack = true;
-      }
-
-      if (brace.comma !== true && brace.dots !== true) {
-        const out = state.output.slice(0, brace.outputIndex);
-        const toks = state.tokens.slice(brace.tokensIndex);
-        brace.value = brace.output = '\\{';
-        value = output = '\\}';
-        state.output = out;
-        for (const t of toks) {
-          state.output += (t.output || t.value);
-        }
-      }
-
-      push({ type: 'brace', value, output });
-      decrement('braces');
-      braces.pop();
-      continue;
-    }
-
-    /**
-     * Pipes
-     */
-
-    if (value === '|') {
-      if (extglobs.length > 0) {
-        extglobs[extglobs.length - 1].conditions++;
-      }
-      push({ type: 'text', value });
-      continue;
-    }
-
-    /**
-     * Commas
-     */
-
-    if (value === ',') {
-      let output = value;
-
-      const brace = braces[braces.length - 1];
-      if (brace && stack[stack.length - 1] === 'braces') {
-        brace.comma = true;
-        output = '|';
-      }
-
-      push({ type: 'comma', value, output });
-      continue;
-    }
-
-    /**
-     * Slashes
-     */
-
-    if (value === '/') {
-      // if the beginning of the glob is "./", advance the start
-      // to the current index, and don't add the "./" characters
-      // to the state. This greatly simplifies lookbehinds when
-      // checking for BOS characters like "!" and "." (not "./")
-      if (prev.type === 'dot' && state.index === state.start + 1) {
-        state.start = state.index + 1;
-        state.consumed = '';
-        state.output = '';
-        tokens.pop();
-        prev = bos; // reset "prev" to the first token
-        continue;
-      }
-
-      push({ type: 'slash', value, output: SLASH_LITERAL });
-      continue;
-    }
-
-    /**
-     * Dots
-     */
-
-    if (value === '.') {
-      if (state.braces > 0 && prev.type === 'dot') {
-        if (prev.value === '.') prev.output = DOT_LITERAL;
-        const brace = braces[braces.length - 1];
-        prev.type = 'dots';
-        prev.output += value;
-        prev.value += value;
-        brace.dots = true;
-        continue;
-      }
-
-      if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {
-        push({ type: 'text', value, output: DOT_LITERAL });
-        continue;
-      }
-
-      push({ type: 'dot', value, output: DOT_LITERAL });
-      continue;
-    }
-
-    /**
-     * Question marks
-     */
-
-    if (value === '?') {
-      const isGroup = prev && prev.value === '(';
-      if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {
-        extglobOpen('qmark', value);
-        continue;
-      }
-
-      if (prev && prev.type === 'paren') {
-        const next = peek();
-        let output = value;
-
-        if (next === '<' && !utils.supportsLookbehinds()) {
-          throw new Error('Node.js v10 or higher is required for regex lookbehinds');
-        }
-
-        if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\w+>)/.test(remaining()))) {
-          output = `\\${value}`;
-        }
-
-        push({ type: 'text', value, output });
-        continue;
-      }
-
-      if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {
-        push({ type: 'qmark', value, output: QMARK_NO_DOT });
-        continue;
-      }
-
-      push({ type: 'qmark', value, output: QMARK });
-      continue;
-    }
-
-    /**
-     * Exclamation
-     */
-
-    if (value === '!') {
-      if (opts.noextglob !== true && peek() === '(') {
-        if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {
-          extglobOpen('negate', value);
-          continue;
-        }
-      }
-
-      if (opts.nonegate !== true && state.index === 0) {
-        negate();
-        continue;
-      }
-    }
-
-    /**
-     * Plus
-     */
-
-    if (value === '+') {
-      if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {
-        extglobOpen('plus', value);
-        continue;
-      }
-
-      if ((prev && prev.value === '(') || opts.regex === false) {
-        push({ type: 'plus', value, output: PLUS_LITERAL });
-        continue;
-      }
-
-      if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {
-        push({ type: 'plus', value });
-        continue;
-      }
-
-      push({ type: 'plus', value: PLUS_LITERAL });
-      continue;
-    }
-
-    /**
-     * Plain text
-     */
-
-    if (value === '@') {
-      if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {
-        push({ type: 'at', extglob: true, value, output: '' });
-        continue;
-      }
-
-      push({ type: 'text', value });
-      continue;
-    }
-
-    /**
-     * Plain text
-     */
-
-    if (value !== '*') {
-      if (value === '$' || value === '^') {
-        value = `\\${value}`;
-      }
-
-      const match = REGEX_NON_SPECIAL_CHARS.exec(remaining());
-      if (match) {
-        value += match[0];
-        state.index += match[0].length;
-      }
-
-      push({ type: 'text', value });
-      continue;
-    }
-
-    /**
-     * Stars
-     */
-
-    if (prev && (prev.type === 'globstar' || prev.star === true)) {
-      prev.type = 'star';
-      prev.star = true;
-      prev.value += value;
-      prev.output = star;
-      state.backtrack = true;
-      state.globstar = true;
-      consume(value);
-      continue;
-    }
-
-    let rest = remaining();
-    if (opts.noextglob !== true && /^\([^?]/.test(rest)) {
-      extglobOpen('star', value);
-      continue;
-    }
-
-    if (prev.type === 'star') {
-      if (opts.noglobstar === true) {
-        consume(value);
-        continue;
-      }
-
-      const prior = prev.prev;
-      const before = prior.prev;
-      const isStart = prior.type === 'slash' || prior.type === 'bos';
-      const afterStar = before && (before.type === 'star' || before.type === 'globstar');
-
-      if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {
-        push({ type: 'star', value, output: '' });
-        continue;
-      }
-
-      const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');
-      const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');
-      if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {
-        push({ type: 'star', value, output: '' });
-        continue;
-      }
-
-      // strip consecutive `/**/`
-      while (rest.slice(0, 3) === '/**') {
-        const after = input[state.index + 4];
-        if (after && after !== '/') {
-          break;
-        }
-        rest = rest.slice(3);
-        consume('/**', 3);
-      }
-
-      if (prior.type === 'bos' && eos()) {
-        prev.type = 'globstar';
-        prev.value += value;
-        prev.output = globstar(opts);
-        state.output = prev.output;
-        state.globstar = true;
-        consume(value);
-        continue;
-      }
-
-      if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {
-        state.output = state.output.slice(0, -(prior.output + prev.output).length);
-        prior.output = `(?:${prior.output}`;
-
-        prev.type = 'globstar';
-        prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');
-        prev.value += value;
-        state.globstar = true;
-        state.output += prior.output + prev.output;
-        consume(value);
-        continue;
-      }
-
-      if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {
-        const end = rest[1] !== void 0 ? '|$' : '';
-
-        state.output = state.output.slice(0, -(prior.output + prev.output).length);
-        prior.output = `(?:${prior.output}`;
-
-        prev.type = 'globstar';
-        prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;
-        prev.value += value;
-
-        state.output += prior.output + prev.output;
-        state.globstar = true;
-
-        consume(value + advance());
-
-        push({ type: 'slash', value: '/', output: '' });
-        continue;
-      }
-
-      if (prior.type === 'bos' && rest[0] === '/') {
-        prev.type = 'globstar';
-        prev.value += value;
-        prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;
-        state.output = prev.output;
-        state.globstar = true;
-        consume(value + advance());
-        push({ type: 'slash', value: '/', output: '' });
-        continue;
-      }
-
-      // remove single star from output
-      state.output = state.output.slice(0, -prev.output.length);
-
-      // reset previous token to globstar
-      prev.type = 'globstar';
-      prev.output = globstar(opts);
-      prev.value += value;
-
-      // reset output with globstar
-      state.output += prev.output;
-      state.globstar = true;
-      consume(value);
-      continue;
-    }
-
-    const token = { type: 'star', value, output: star };
-
-    if (opts.bash === true) {
-      token.output = '.*?';
-      if (prev.type === 'bos' || prev.type === 'slash') {
-        token.output = nodot + token.output;
-      }
-      push(token);
-      continue;
-    }
-
-    if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {
-      token.output = value;
-      push(token);
-      continue;
-    }
-
-    if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {
-      if (prev.type === 'dot') {
-        state.output += NO_DOT_SLASH;
-        prev.output += NO_DOT_SLASH;
-
-      } else if (opts.dot === true) {
-        state.output += NO_DOTS_SLASH;
-        prev.output += NO_DOTS_SLASH;
-
-      } else {
-        state.output += nodot;
-        prev.output += nodot;
-      }
-
-      if (peek() !== '*') {
-        state.output += ONE_CHAR;
-        prev.output += ONE_CHAR;
-      }
-    }
-
-    push(token);
-  }
-
-  while (state.brackets > 0) {
-    if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']'));
-    state.output = utils.escapeLast(state.output, '[');
-    decrement('brackets');
-  }
-
-  while (state.parens > 0) {
-    if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')'));
-    state.output = utils.escapeLast(state.output, '(');
-    decrement('parens');
-  }
-
-  while (state.braces > 0) {
-    if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}'));
-    state.output = utils.escapeLast(state.output, '{');
-    decrement('braces');
-  }
-
-  if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {
-    push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });
-  }
-
-  // rebuild the output if we had to backtrack at any point
-  if (state.backtrack === true) {
-    state.output = '';
-
-    for (const token of state.tokens) {
-      state.output += token.output != null ? token.output : token.value;
-
-      if (token.suffix) {
-        state.output += token.suffix;
-      }
-    }
-  }
-
-  return state;
-};
-
-/**
- * Fast paths for creating regular expressions for common glob patterns.
- * This can significantly speed up processing and has very little downside
- * impact when none of the fast paths match.
- */
-
-parse.fastpaths = (input, options) => {
-  const opts = { ...options };
-  const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;
-  const len = input.length;
-  if (len > max) {
-    throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);
-  }
-
-  input = REPLACEMENTS[input] || input;
-  const win32 = utils.isWindows(options);
-
-  // create constants based on platform, for windows or posix
-  const {
-    DOT_LITERAL,
-    SLASH_LITERAL,
-    ONE_CHAR,
-    DOTS_SLASH,
-    NO_DOT,
-    NO_DOTS,
-    NO_DOTS_SLASH,
-    STAR,
-    START_ANCHOR
-  } = constants.globChars(win32);
-
-  const nodot = opts.dot ? NO_DOTS : NO_DOT;
-  const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;
-  const capture = opts.capture ? '' : '?:';
-  const state = { negated: false, prefix: '' };
-  let star = opts.bash === true ? '.*?' : STAR;
-
-  if (opts.capture) {
-    star = `(${star})`;
-  }
-
-  const globstar = opts => {
-    if (opts.noglobstar === true) return star;
-    return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;
-  };
-
-  const create = str => {
-    switch (str) {
-      case '*':
-        return `${nodot}${ONE_CHAR}${star}`;
-
-      case '.*':
-        return `${DOT_LITERAL}${ONE_CHAR}${star}`;
-
-      case '*.*':
-        return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;
-
-      case '*/*':
-        return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;
-
-      case '**':
-        return nodot + globstar(opts);
-
-      case '**/*':
-        return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;
-
-      case '**/*.*':
-        return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;
-
-      case '**/.*':
-        return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;
-
-      default: {
-        const match = /^(.*?)\.(\w+)$/.exec(str);
-        if (!match) return;
-
-        const source = create(match[1]);
-        if (!source) return;
-
-        return source + DOT_LITERAL + match[2];
-      }
-    }
-  };
-
-  const output = utils.removePrefix(input, state);
-  let source = create(output);
-
-  if (source && opts.strictSlashes !== true) {
-    source += `${SLASH_LITERAL}?`;
-  }
-
-  return source;
-};
-
-module.exports = parse;
diff --git a/node_modules/picomatch/lib/picomatch.js b/node_modules/picomatch/lib/picomatch.js
deleted file mode 100644
index 782d809435a75989f2f3d7801f45b4fab398cb36..0000000000000000000000000000000000000000
--- a/node_modules/picomatch/lib/picomatch.js
+++ /dev/null
@@ -1,342 +0,0 @@
-'use strict';
-
-const path = require('path');
-const scan = require('./scan');
-const parse = require('./parse');
-const utils = require('./utils');
-const constants = require('./constants');
-const isObject = val => val && typeof val === 'object' && !Array.isArray(val);
-
-/**
- * Creates a matcher function from one or more glob patterns. The
- * returned function takes a string to match as its first argument,
- * and returns true if the string is a match. The returned matcher
- * function also takes a boolean as the second argument that, when true,
- * returns an object with additional information.
- *
- * ```js
- * const picomatch = require('picomatch');
- * // picomatch(glob[, options]);
- *
- * const isMatch = picomatch('*.!(*a)');
- * console.log(isMatch('a.a')); //=> false
- * console.log(isMatch('a.b')); //=> true
- * ```
- * @name picomatch
- * @param {String|Array} `globs` One or more glob patterns.
- * @param {Object=} `options`
- * @return {Function=} Returns a matcher function.
- * @api public
- */
-
-const picomatch = (glob, options, returnState = false) => {
-  if (Array.isArray(glob)) {
-    const fns = glob.map(input => picomatch(input, options, returnState));
-    const arrayMatcher = str => {
-      for (const isMatch of fns) {
-        const state = isMatch(str);
-        if (state) return state;
-      }
-      return false;
-    };
-    return arrayMatcher;
-  }
-
-  const isState = isObject(glob) && glob.tokens && glob.input;
-
-  if (glob === '' || (typeof glob !== 'string' && !isState)) {
-    throw new TypeError('Expected pattern to be a non-empty string');
-  }
-
-  const opts = options || {};
-  const posix = utils.isWindows(options);
-  const regex = isState
-    ? picomatch.compileRe(glob, options)
-    : picomatch.makeRe(glob, options, false, true);
-
-  const state = regex.state;
-  delete regex.state;
-
-  let isIgnored = () => false;
-  if (opts.ignore) {
-    const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };
-    isIgnored = picomatch(opts.ignore, ignoreOpts, returnState);
-  }
-
-  const matcher = (input, returnObject = false) => {
-    const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix });
-    const result = { glob, state, regex, posix, input, output, match, isMatch };
-
-    if (typeof opts.onResult === 'function') {
-      opts.onResult(result);
-    }
-
-    if (isMatch === false) {
-      result.isMatch = false;
-      return returnObject ? result : false;
-    }
-
-    if (isIgnored(input)) {
-      if (typeof opts.onIgnore === 'function') {
-        opts.onIgnore(result);
-      }
-      result.isMatch = false;
-      return returnObject ? result : false;
-    }
-
-    if (typeof opts.onMatch === 'function') {
-      opts.onMatch(result);
-    }
-    return returnObject ? result : true;
-  };
-
-  if (returnState) {
-    matcher.state = state;
-  }
-
-  return matcher;
-};
-
-/**
- * Test `input` with the given `regex`. This is used by the main
- * `picomatch()` function to test the input string.
- *
- * ```js
- * const picomatch = require('picomatch');
- * // picomatch.test(input, regex[, options]);
- *
- * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/));
- * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }
- * ```
- * @param {String} `input` String to test.
- * @param {RegExp} `regex`
- * @return {Object} Returns an object with matching info.
- * @api public
- */
-
-picomatch.test = (input, regex, options, { glob, posix } = {}) => {
-  if (typeof input !== 'string') {
-    throw new TypeError('Expected input to be a string');
-  }
-
-  if (input === '') {
-    return { isMatch: false, output: '' };
-  }
-
-  const opts = options || {};
-  const format = opts.format || (posix ? utils.toPosixSlashes : null);
-  let match = input === glob;
-  let output = (match && format) ? format(input) : input;
-
-  if (match === false) {
-    output = format ? format(input) : input;
-    match = output === glob;
-  }
-
-  if (match === false || opts.capture === true) {
-    if (opts.matchBase === true || opts.basename === true) {
-      match = picomatch.matchBase(input, regex, options, posix);
-    } else {
-      match = regex.exec(output);
-    }
-  }
-
-  return { isMatch: Boolean(match), match, output };
-};
-
-/**
- * Match the basename of a filepath.
- *
- * ```js
- * const picomatch = require('picomatch');
- * // picomatch.matchBase(input, glob[, options]);
- * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true
- * ```
- * @param {String} `input` String to test.
- * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).
- * @return {Boolean}
- * @api public
- */
-
-picomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => {
-  const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);
-  return regex.test(path.basename(input));
-};
-
-/**
- * Returns true if **any** of the given glob `patterns` match the specified `string`.
- *
- * ```js
- * const picomatch = require('picomatch');
- * // picomatch.isMatch(string, patterns[, options]);
- *
- * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true
- * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false
- * ```
- * @param {String|Array} str The string to test.
- * @param {String|Array} patterns One or more glob patterns to use for matching.
- * @param {Object} [options] See available [options](#options).
- * @return {Boolean} Returns true if any patterns match `str`
- * @api public
- */
-
-picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);
-
-/**
- * Parse a glob pattern to create the source string for a regular
- * expression.
- *
- * ```js
- * const picomatch = require('picomatch');
- * const result = picomatch.parse(pattern[, options]);
- * ```
- * @param {String} `pattern`
- * @param {Object} `options`
- * @return {Object} Returns an object with useful properties and output to be used as a regex source string.
- * @api public
- */
-
-picomatch.parse = (pattern, options) => {
-  if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options));
-  return parse(pattern, { ...options, fastpaths: false });
-};
-
-/**
- * Scan a glob pattern to separate the pattern into segments.
- *
- * ```js
- * const picomatch = require('picomatch');
- * // picomatch.scan(input[, options]);
- *
- * const result = picomatch.scan('!./foo/*.js');
- * console.log(result);
- * { prefix: '!./',
- *   input: '!./foo/*.js',
- *   start: 3,
- *   base: 'foo',
- *   glob: '*.js',
- *   isBrace: false,
- *   isBracket: false,
- *   isGlob: true,
- *   isExtglob: false,
- *   isGlobstar: false,
- *   negated: true }
- * ```
- * @param {String} `input` Glob pattern to scan.
- * @param {Object} `options`
- * @return {Object} Returns an object with
- * @api public
- */
-
-picomatch.scan = (input, options) => scan(input, options);
-
-/**
- * Compile a regular expression from the `state` object returned by the
- * [parse()](#parse) method.
- *
- * @param {Object} `state`
- * @param {Object} `options`
- * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.
- * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.
- * @return {RegExp}
- * @api public
- */
-
-picomatch.compileRe = (state, options, returnOutput = false, returnState = false) => {
-  if (returnOutput === true) {
-    return state.output;
-  }
-
-  const opts = options || {};
-  const prepend = opts.contains ? '' : '^';
-  const append = opts.contains ? '' : '$';
-
-  let source = `${prepend}(?:${state.output})${append}`;
-  if (state && state.negated === true) {
-    source = `^(?!${source}).*$`;
-  }
-
-  const regex = picomatch.toRegex(source, options);
-  if (returnState === true) {
-    regex.state = state;
-  }
-
-  return regex;
-};
-
-/**
- * Create a regular expression from a parsed glob pattern.
- *
- * ```js
- * const picomatch = require('picomatch');
- * const state = picomatch.parse('*.js');
- * // picomatch.compileRe(state[, options]);
- *
- * console.log(picomatch.compileRe(state));
- * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
- * ```
- * @param {String} `state` The object returned from the `.parse` method.
- * @param {Object} `options`
- * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.
- * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.
- * @return {RegExp} Returns a regex created from the given pattern.
- * @api public
- */
-
-picomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {
-  if (!input || typeof input !== 'string') {
-    throw new TypeError('Expected a non-empty string');
-  }
-
-  let parsed = { negated: false, fastpaths: true };
-
-  if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {
-    parsed.output = parse.fastpaths(input, options);
-  }
-
-  if (!parsed.output) {
-    parsed = parse(input, options);
-  }
-
-  return picomatch.compileRe(parsed, options, returnOutput, returnState);
-};
-
-/**
- * Create a regular expression from the given regex source string.
- *
- * ```js
- * const picomatch = require('picomatch');
- * // picomatch.toRegex(source[, options]);
- *
- * const { output } = picomatch.parse('*.js');
- * console.log(picomatch.toRegex(output));
- * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/
- * ```
- * @param {String} `source` Regular expression source string.
- * @param {Object} `options`
- * @return {RegExp}
- * @api public
- */
-
-picomatch.toRegex = (source, options) => {
-  try {
-    const opts = options || {};
-    return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));
-  } catch (err) {
-    if (options && options.debug === true) throw err;
-    return /$^/;
-  }
-};
-
-/**
- * Picomatch constants.
- * @return {Object}
- */
-
-picomatch.constants = constants;
-
-/**
- * Expose "picomatch"
- */
-
-module.exports = picomatch;
diff --git a/node_modules/picomatch/lib/scan.js b/node_modules/picomatch/lib/scan.js
deleted file mode 100644
index e59cd7a1357b184b0c70409b161fcf0ce5433af1..0000000000000000000000000000000000000000
--- a/node_modules/picomatch/lib/scan.js
+++ /dev/null
@@ -1,391 +0,0 @@
-'use strict';
-
-const utils = require('./utils');
-const {
-  CHAR_ASTERISK,             /* * */
-  CHAR_AT,                   /* @ */
-  CHAR_BACKWARD_SLASH,       /* \ */
-  CHAR_COMMA,                /* , */
-  CHAR_DOT,                  /* . */
-  CHAR_EXCLAMATION_MARK,     /* ! */
-  CHAR_FORWARD_SLASH,        /* / */
-  CHAR_LEFT_CURLY_BRACE,     /* { */
-  CHAR_LEFT_PARENTHESES,     /* ( */
-  CHAR_LEFT_SQUARE_BRACKET,  /* [ */
-  CHAR_PLUS,                 /* + */
-  CHAR_QUESTION_MARK,        /* ? */
-  CHAR_RIGHT_CURLY_BRACE,    /* } */
-  CHAR_RIGHT_PARENTHESES,    /* ) */
-  CHAR_RIGHT_SQUARE_BRACKET  /* ] */
-} = require('./constants');
-
-const isPathSeparator = code => {
-  return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;
-};
-
-const depth = token => {
-  if (token.isPrefix !== true) {
-    token.depth = token.isGlobstar ? Infinity : 1;
-  }
-};
-
-/**
- * Quickly scans a glob pattern and returns an object with a handful of
- * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),
- * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not
- * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).
- *
- * ```js
- * const pm = require('picomatch');
- * console.log(pm.scan('foo/bar/*.js'));
- * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }
- * ```
- * @param {String} `str`
- * @param {Object} `options`
- * @return {Object} Returns an object with tokens and regex source string.
- * @api public
- */
-
-const scan = (input, options) => {
-  const opts = options || {};
-
-  const length = input.length - 1;
-  const scanToEnd = opts.parts === true || opts.scanToEnd === true;
-  const slashes = [];
-  const tokens = [];
-  const parts = [];
-
-  let str = input;
-  let index = -1;
-  let start = 0;
-  let lastIndex = 0;
-  let isBrace = false;
-  let isBracket = false;
-  let isGlob = false;
-  let isExtglob = false;
-  let isGlobstar = false;
-  let braceEscaped = false;
-  let backslashes = false;
-  let negated = false;
-  let negatedExtglob = false;
-  let finished = false;
-  let braces = 0;
-  let prev;
-  let code;
-  let token = { value: '', depth: 0, isGlob: false };
-
-  const eos = () => index >= length;
-  const peek = () => str.charCodeAt(index + 1);
-  const advance = () => {
-    prev = code;
-    return str.charCodeAt(++index);
-  };
-
-  while (index < length) {
-    code = advance();
-    let next;
-
-    if (code === CHAR_BACKWARD_SLASH) {
-      backslashes = token.backslashes = true;
-      code = advance();
-
-      if (code === CHAR_LEFT_CURLY_BRACE) {
-        braceEscaped = true;
-      }
-      continue;
-    }
-
-    if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {
-      braces++;
-
-      while (eos() !== true && (code = advance())) {
-        if (code === CHAR_BACKWARD_SLASH) {
-          backslashes = token.backslashes = true;
-          advance();
-          continue;
-        }
-
-        if (code === CHAR_LEFT_CURLY_BRACE) {
-          braces++;
-          continue;
-        }
-
-        if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {
-          isBrace = token.isBrace = true;
-          isGlob = token.isGlob = true;
-          finished = true;
-
-          if (scanToEnd === true) {
-            continue;
-          }
-
-          break;
-        }
-
-        if (braceEscaped !== true && code === CHAR_COMMA) {
-          isBrace = token.isBrace = true;
-          isGlob = token.isGlob = true;
-          finished = true;
-
-          if (scanToEnd === true) {
-            continue;
-          }
-
-          break;
-        }
-
-        if (code === CHAR_RIGHT_CURLY_BRACE) {
-          braces--;
-
-          if (braces === 0) {
-            braceEscaped = false;
-            isBrace = token.isBrace = true;
-            finished = true;
-            break;
-          }
-        }
-      }
-
-      if (scanToEnd === true) {
-        continue;
-      }
-
-      break;
-    }
-
-    if (code === CHAR_FORWARD_SLASH) {
-      slashes.push(index);
-      tokens.push(token);
-      token = { value: '', depth: 0, isGlob: false };
-
-      if (finished === true) continue;
-      if (prev === CHAR_DOT && index === (start + 1)) {
-        start += 2;
-        continue;
-      }
-
-      lastIndex = index + 1;
-      continue;
-    }
-
-    if (opts.noext !== true) {
-      const isExtglobChar = code === CHAR_PLUS
-        || code === CHAR_AT
-        || code === CHAR_ASTERISK
-        || code === CHAR_QUESTION_MARK
-        || code === CHAR_EXCLAMATION_MARK;
-
-      if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {
-        isGlob = token.isGlob = true;
-        isExtglob = token.isExtglob = true;
-        finished = true;
-        if (code === CHAR_EXCLAMATION_MARK && index === start) {
-          negatedExtglob = true;
-        }
-
-        if (scanToEnd === true) {
-          while (eos() !== true && (code = advance())) {
-            if (code === CHAR_BACKWARD_SLASH) {
-              backslashes = token.backslashes = true;
-              code = advance();
-              continue;
-            }
-
-            if (code === CHAR_RIGHT_PARENTHESES) {
-              isGlob = token.isGlob = true;
-              finished = true;
-              break;
-            }
-          }
-          continue;
-        }
-        break;
-      }
-    }
-
-    if (code === CHAR_ASTERISK) {
-      if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;
-      isGlob = token.isGlob = true;
-      finished = true;
-
-      if (scanToEnd === true) {
-        continue;
-      }
-      break;
-    }
-
-    if (code === CHAR_QUESTION_MARK) {
-      isGlob = token.isGlob = true;
-      finished = true;
-
-      if (scanToEnd === true) {
-        continue;
-      }
-      break;
-    }
-
-    if (code === CHAR_LEFT_SQUARE_BRACKET) {
-      while (eos() !== true && (next = advance())) {
-        if (next === CHAR_BACKWARD_SLASH) {
-          backslashes = token.backslashes = true;
-          advance();
-          continue;
-        }
-
-        if (next === CHAR_RIGHT_SQUARE_BRACKET) {
-          isBracket = token.isBracket = true;
-          isGlob = token.isGlob = true;
-          finished = true;
-          break;
-        }
-      }
-
-      if (scanToEnd === true) {
-        continue;
-      }
-
-      break;
-    }
-
-    if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {
-      negated = token.negated = true;
-      start++;
-      continue;
-    }
-
-    if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {
-      isGlob = token.isGlob = true;
-
-      if (scanToEnd === true) {
-        while (eos() !== true && (code = advance())) {
-          if (code === CHAR_LEFT_PARENTHESES) {
-            backslashes = token.backslashes = true;
-            code = advance();
-            continue;
-          }
-
-          if (code === CHAR_RIGHT_PARENTHESES) {
-            finished = true;
-            break;
-          }
-        }
-        continue;
-      }
-      break;
-    }
-
-    if (isGlob === true) {
-      finished = true;
-
-      if (scanToEnd === true) {
-        continue;
-      }
-
-      break;
-    }
-  }
-
-  if (opts.noext === true) {
-    isExtglob = false;
-    isGlob = false;
-  }
-
-  let base = str;
-  let prefix = '';
-  let glob = '';
-
-  if (start > 0) {
-    prefix = str.slice(0, start);
-    str = str.slice(start);
-    lastIndex -= start;
-  }
-
-  if (base && isGlob === true && lastIndex > 0) {
-    base = str.slice(0, lastIndex);
-    glob = str.slice(lastIndex);
-  } else if (isGlob === true) {
-    base = '';
-    glob = str;
-  } else {
-    base = str;
-  }
-
-  if (base && base !== '' && base !== '/' && base !== str) {
-    if (isPathSeparator(base.charCodeAt(base.length - 1))) {
-      base = base.slice(0, -1);
-    }
-  }
-
-  if (opts.unescape === true) {
-    if (glob) glob = utils.removeBackslashes(glob);
-
-    if (base && backslashes === true) {
-      base = utils.removeBackslashes(base);
-    }
-  }
-
-  const state = {
-    prefix,
-    input,
-    start,
-    base,
-    glob,
-    isBrace,
-    isBracket,
-    isGlob,
-    isExtglob,
-    isGlobstar,
-    negated,
-    negatedExtglob
-  };
-
-  if (opts.tokens === true) {
-    state.maxDepth = 0;
-    if (!isPathSeparator(code)) {
-      tokens.push(token);
-    }
-    state.tokens = tokens;
-  }
-
-  if (opts.parts === true || opts.tokens === true) {
-    let prevIndex;
-
-    for (let idx = 0; idx < slashes.length; idx++) {
-      const n = prevIndex ? prevIndex + 1 : start;
-      const i = slashes[idx];
-      const value = input.slice(n, i);
-      if (opts.tokens) {
-        if (idx === 0 && start !== 0) {
-          tokens[idx].isPrefix = true;
-          tokens[idx].value = prefix;
-        } else {
-          tokens[idx].value = value;
-        }
-        depth(tokens[idx]);
-        state.maxDepth += tokens[idx].depth;
-      }
-      if (idx !== 0 || value !== '') {
-        parts.push(value);
-      }
-      prevIndex = i;
-    }
-
-    if (prevIndex && prevIndex + 1 < input.length) {
-      const value = input.slice(prevIndex + 1);
-      parts.push(value);
-
-      if (opts.tokens) {
-        tokens[tokens.length - 1].value = value;
-        depth(tokens[tokens.length - 1]);
-        state.maxDepth += tokens[tokens.length - 1].depth;
-      }
-    }
-
-    state.slashes = slashes;
-    state.parts = parts;
-  }
-
-  return state;
-};
-
-module.exports = scan;
diff --git a/node_modules/picomatch/lib/utils.js b/node_modules/picomatch/lib/utils.js
deleted file mode 100644
index c3ca766a7bef961c6cc9c5b5e04c930aa05d7608..0000000000000000000000000000000000000000
--- a/node_modules/picomatch/lib/utils.js
+++ /dev/null
@@ -1,64 +0,0 @@
-'use strict';
-
-const path = require('path');
-const win32 = process.platform === 'win32';
-const {
-  REGEX_BACKSLASH,
-  REGEX_REMOVE_BACKSLASH,
-  REGEX_SPECIAL_CHARS,
-  REGEX_SPECIAL_CHARS_GLOBAL
-} = require('./constants');
-
-exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);
-exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);
-exports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);
-exports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\$1');
-exports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');
-
-exports.removeBackslashes = str => {
-  return str.replace(REGEX_REMOVE_BACKSLASH, match => {
-    return match === '\\' ? '' : match;
-  });
-};
-
-exports.supportsLookbehinds = () => {
-  const segs = process.version.slice(1).split('.').map(Number);
-  if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) {
-    return true;
-  }
-  return false;
-};
-
-exports.isWindows = options => {
-  if (options && typeof options.windows === 'boolean') {
-    return options.windows;
-  }
-  return win32 === true || path.sep === '\\';
-};
-
-exports.escapeLast = (input, char, lastIdx) => {
-  const idx = input.lastIndexOf(char, lastIdx);
-  if (idx === -1) return input;
-  if (input[idx - 1] === '\\') return exports.escapeLast(input, char, idx - 1);
-  return `${input.slice(0, idx)}\\${input.slice(idx)}`;
-};
-
-exports.removePrefix = (input, state = {}) => {
-  let output = input;
-  if (output.startsWith('./')) {
-    output = output.slice(2);
-    state.prefix = './';
-  }
-  return output;
-};
-
-exports.wrapOutput = (input, state = {}, options = {}) => {
-  const prepend = options.contains ? '' : '^';
-  const append = options.contains ? '' : '$';
-
-  let output = `${prepend}(?:${input})${append}`;
-  if (state.negated === true) {
-    output = `(?:^(?!${output}).*$)`;
-  }
-  return output;
-};
diff --git a/node_modules/picomatch/package.json b/node_modules/picomatch/package.json
deleted file mode 100644
index 3db22d408f024ad3b0de10acc3a7c0ce4200c0e8..0000000000000000000000000000000000000000
--- a/node_modules/picomatch/package.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
-  "name": "picomatch",
-  "description": "Blazing fast and accurate glob matcher written in JavaScript, with no dependencies and full support for standard and extended Bash glob features, including braces, extglobs, POSIX brackets, and regular expressions.",
-  "version": "2.3.1",
-  "homepage": "https://github.com/micromatch/picomatch",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "funding": "https://github.com/sponsors/jonschlinkert",
-  "repository": "micromatch/picomatch",
-  "bugs": {
-    "url": "https://github.com/micromatch/picomatch/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js",
-    "lib"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=8.6"
-  },
-  "scripts": {
-    "lint": "eslint --cache --cache-location node_modules/.cache/.eslintcache --report-unused-disable-directives --ignore-path .gitignore .",
-    "mocha": "mocha --reporter dot",
-    "test": "npm run lint && npm run mocha",
-    "test:ci": "npm run test:cover",
-    "test:cover": "nyc npm run mocha"
-  },
-  "devDependencies": {
-    "eslint": "^6.8.0",
-    "fill-range": "^7.0.1",
-    "gulp-format-md": "^2.0.0",
-    "mocha": "^6.2.2",
-    "nyc": "^15.0.0",
-    "time-require": "github:jonschlinkert/time-require"
-  },
-  "keywords": [
-    "glob",
-    "match",
-    "picomatch"
-  ],
-  "nyc": {
-    "reporter": [
-      "html",
-      "lcov",
-      "text-summary"
-    ]
-  },
-  "verb": {
-    "toc": {
-      "render": true,
-      "method": "preWrite",
-      "maxdepth": 3
-    },
-    "layout": "empty",
-    "tasks": [
-      "readme"
-    ],
-    "plugins": [
-      "gulp-format-md"
-    ],
-    "lint": {
-      "reflinks": true
-    },
-    "related": {
-      "list": [
-        "braces",
-        "micromatch"
-      ]
-    },
-    "reflinks": [
-      "braces",
-      "expand-brackets",
-      "extglob",
-      "fill-range",
-      "micromatch",
-      "minimatch",
-      "nanomatch",
-      "picomatch"
-    ]
-  }
-}
diff --git a/node_modules/proxy-addr/HISTORY.md b/node_modules/proxy-addr/HISTORY.md
deleted file mode 100644
index 8480242a0c43af25ec8d685e941b6a79a65c8fb4..0000000000000000000000000000000000000000
--- a/node_modules/proxy-addr/HISTORY.md
+++ /dev/null
@@ -1,161 +0,0 @@
-2.0.7 / 2021-05-31
-==================
-
-  * deps: forwarded@0.2.0
-    - Use `req.socket` over deprecated `req.connection`
-
-2.0.6 / 2020-02-24
-==================
-
-  * deps: ipaddr.js@1.9.1
-
-2.0.5 / 2019-04-16
-==================
-
-  * deps: ipaddr.js@1.9.0
-
-2.0.4 / 2018-07-26
-==================
-
-  * deps: ipaddr.js@1.8.0
-
-2.0.3 / 2018-02-19
-==================
-
-  * deps: ipaddr.js@1.6.0
-
-2.0.2 / 2017-09-24
-==================
-
-  * deps: forwarded@~0.1.2
-    - perf: improve header parsing
-    - perf: reduce overhead when no `X-Forwarded-For` header
-
-2.0.1 / 2017-09-10
-==================
-
-  * deps: forwarded@~0.1.1
-    - Fix trimming leading / trailing OWS
-    - perf: hoist regular expression
-  * deps: ipaddr.js@1.5.2
-
-2.0.0 / 2017-08-08
-==================
-
-  * Drop support for Node.js below 0.10
-
-1.1.5 / 2017-07-25
-==================
-
-  * Fix array argument being altered
-  * deps: ipaddr.js@1.4.0
-
-1.1.4 / 2017-03-24
-==================
-
-  * deps: ipaddr.js@1.3.0
-
-1.1.3 / 2017-01-14
-==================
-
-  * deps: ipaddr.js@1.2.0
-
-1.1.2 / 2016-05-29
-==================
-
-  * deps: ipaddr.js@1.1.1
-    - Fix IPv6-mapped IPv4 validation edge cases
-
-1.1.1 / 2016-05-03
-==================
-
-  * Fix regression matching mixed versions against multiple subnets
-
-1.1.0 / 2016-05-01
-==================
-
-  * Fix accepting various invalid netmasks
-    - IPv4 netmasks must be contingous
-    - IPv6 addresses cannot be used as a netmask
-  * deps: ipaddr.js@1.1.0
-
-1.0.10 / 2015-12-09
-===================
-
-  * deps: ipaddr.js@1.0.5
-    - Fix regression in `isValid` with non-string arguments
-
-1.0.9 / 2015-12-01
-==================
-
-  * deps: ipaddr.js@1.0.4
-    - Fix accepting some invalid IPv6 addresses
-    - Reject CIDRs with negative or overlong masks
-  * perf: enable strict mode
-
-1.0.8 / 2015-05-10
-==================
-
-  * deps: ipaddr.js@1.0.1
-
-1.0.7 / 2015-03-16
-==================
-
-  * deps: ipaddr.js@0.1.9
-    - Fix OOM on certain inputs to `isValid`
-
-1.0.6 / 2015-02-01
-==================
-
-  * deps: ipaddr.js@0.1.8
-
-1.0.5 / 2015-01-08
-==================
-
-  * deps: ipaddr.js@0.1.6
-
-1.0.4 / 2014-11-23
-==================
-
-  * deps: ipaddr.js@0.1.5
-    - Fix edge cases with `isValid`
-
-1.0.3 / 2014-09-21
-==================
-
-  * Use `forwarded` npm module
-
-1.0.2 / 2014-09-18
-==================
-
-  * Fix a global leak when multiple subnets are trusted
-  * Support Node.js 0.6
-  * deps: ipaddr.js@0.1.3
-
-1.0.1 / 2014-06-03
-==================
-
-  * Fix links in npm package
-
-1.0.0 / 2014-05-08
-==================
-
-  * Add `trust` argument to determine proxy trust on
-    * Accepts custom function
-    * Accepts IPv4/IPv6 address(es)
-    * Accepts subnets
-    * Accepts pre-defined names
-  * Add optional `trust` argument to `proxyaddr.all` to
-    stop at first untrusted
-  * Add `proxyaddr.compile` to pre-compile `trust` function
-    to make subsequent calls faster
-
-0.0.1 / 2014-05-04
-==================
-
-  * Fix bad npm publish
-
-0.0.0 / 2014-05-04
-==================
-
-  * Initial release
diff --git a/node_modules/proxy-addr/LICENSE b/node_modules/proxy-addr/LICENSE
deleted file mode 100644
index cab251c2b9a81318267600f68130faa3a290e5fd..0000000000000000000000000000000000000000
--- a/node_modules/proxy-addr/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014-2016 Douglas Christopher Wilson
-
-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/proxy-addr/README.md b/node_modules/proxy-addr/README.md
deleted file mode 100644
index 69c0b63eab22e32821df374c5e84a37c665c28c3..0000000000000000000000000000000000000000
--- a/node_modules/proxy-addr/README.md
+++ /dev/null
@@ -1,139 +0,0 @@
-# proxy-addr
-
-[![NPM Version][npm-version-image]][npm-url]
-[![NPM Downloads][npm-downloads-image]][npm-url]
-[![Node.js Version][node-image]][node-url]
-[![Build Status][ci-image]][ci-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-Determine address of proxied request
-
-## Install
-
-This is a [Node.js](https://nodejs.org/en/) module available through the
-[npm registry](https://www.npmjs.com/). Installation is done using the
-[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
-
-```sh
-$ npm install proxy-addr
-```
-
-## API
-
-```js
-var proxyaddr = require('proxy-addr')
-```
-
-### proxyaddr(req, trust)
-
-Return the address of the request, using the given `trust` parameter.
-
-The `trust` argument is a function that returns `true` if you trust
-the address, `false` if you don't. The closest untrusted address is
-returned.
-
-```js
-proxyaddr(req, function (addr) { return addr === '127.0.0.1' })
-proxyaddr(req, function (addr, i) { return i < 1 })
-```
-
-The `trust` arugment may also be a single IP address string or an
-array of trusted addresses, as plain IP addresses, CIDR-formatted
-strings, or IP/netmask strings.
-
-```js
-proxyaddr(req, '127.0.0.1')
-proxyaddr(req, ['127.0.0.0/8', '10.0.0.0/8'])
-proxyaddr(req, ['127.0.0.0/255.0.0.0', '192.168.0.0/255.255.0.0'])
-```
-
-This module also supports IPv6. Your IPv6 addresses will be normalized
-automatically (i.e. `fe80::00ed:1` equals `fe80:0:0:0:0:0:ed:1`).
-
-```js
-proxyaddr(req, '::1')
-proxyaddr(req, ['::1/128', 'fe80::/10'])
-```
-
-This module will automatically work with IPv4-mapped IPv6 addresses
-as well to support node.js in IPv6-only mode. This means that you do
-not have to specify both `::ffff:a00:1` and `10.0.0.1`.
-
-As a convenience, this module also takes certain pre-defined names
-in addition to IP addresses, which expand into IP addresses:
-
-```js
-proxyaddr(req, 'loopback')
-proxyaddr(req, ['loopback', 'fc00:ac:1ab5:fff::1/64'])
-```
-
-  * `loopback`: IPv4 and IPv6 loopback addresses (like `::1` and
-    `127.0.0.1`).
-  * `linklocal`: IPv4 and IPv6 link-local addresses (like
-    `fe80::1:1:1:1` and `169.254.0.1`).
-  * `uniquelocal`: IPv4 private addresses and IPv6 unique-local
-    addresses (like `fc00:ac:1ab5:fff::1` and `192.168.0.1`).
-
-When `trust` is specified as a function, it will be called for each
-address to determine if it is a trusted address. The function is
-given two arguments: `addr` and `i`, where `addr` is a string of
-the address to check and `i` is a number that represents the distance
-from the socket address.
-
-### proxyaddr.all(req, [trust])
-
-Return all the addresses of the request, optionally stopping at the
-first untrusted. This array is ordered from closest to furthest
-(i.e. `arr[0] === req.connection.remoteAddress`).
-
-```js
-proxyaddr.all(req)
-```
-
-The optional `trust` argument takes the same arguments as `trust`
-does in `proxyaddr(req, trust)`.
-
-```js
-proxyaddr.all(req, 'loopback')
-```
-
-### proxyaddr.compile(val)
-
-Compiles argument `val` into a `trust` function. This function takes
-the same arguments as `trust` does in `proxyaddr(req, trust)` and
-returns a function suitable for `proxyaddr(req, trust)`.
-
-```js
-var trust = proxyaddr.compile('loopback')
-var addr = proxyaddr(req, trust)
-```
-
-This function is meant to be optimized for use against every request.
-It is recommend to compile a trust function up-front for the trusted
-configuration and pass that to `proxyaddr(req, trust)` for each request.
-
-## Testing
-
-```sh
-$ npm test
-```
-
-## Benchmarks
-
-```sh
-$ npm run-script bench
-```
-
-## License
-
-[MIT](LICENSE)
-
-[ci-image]: https://badgen.net/github/checks/jshttp/proxy-addr/master?label=ci
-[ci-url]: https://github.com/jshttp/proxy-addr/actions?query=workflow%3Aci
-[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/proxy-addr/master
-[coveralls-url]: https://coveralls.io/r/jshttp/proxy-addr?branch=master
-[node-image]: https://badgen.net/npm/node/proxy-addr
-[node-url]: https://nodejs.org/en/download
-[npm-downloads-image]: https://badgen.net/npm/dm/proxy-addr
-[npm-url]: https://npmjs.org/package/proxy-addr
-[npm-version-image]: https://badgen.net/npm/v/proxy-addr
diff --git a/node_modules/proxy-addr/index.js b/node_modules/proxy-addr/index.js
deleted file mode 100644
index a909b05064a377ed49b5aea673d0849970f050e9..0000000000000000000000000000000000000000
--- a/node_modules/proxy-addr/index.js
+++ /dev/null
@@ -1,327 +0,0 @@
-/*!
- * proxy-addr
- * Copyright(c) 2014-2016 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = proxyaddr
-module.exports.all = alladdrs
-module.exports.compile = compile
-
-/**
- * Module dependencies.
- * @private
- */
-
-var forwarded = require('forwarded')
-var ipaddr = require('ipaddr.js')
-
-/**
- * Variables.
- * @private
- */
-
-var DIGIT_REGEXP = /^[0-9]+$/
-var isip = ipaddr.isValid
-var parseip = ipaddr.parse
-
-/**
- * Pre-defined IP ranges.
- * @private
- */
-
-var IP_RANGES = {
-  linklocal: ['169.254.0.0/16', 'fe80::/10'],
-  loopback: ['127.0.0.1/8', '::1/128'],
-  uniquelocal: ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fc00::/7']
-}
-
-/**
- * Get all addresses in the request, optionally stopping
- * at the first untrusted.
- *
- * @param {Object} request
- * @param {Function|Array|String} [trust]
- * @public
- */
-
-function alladdrs (req, trust) {
-  // get addresses
-  var addrs = forwarded(req)
-
-  if (!trust) {
-    // Return all addresses
-    return addrs
-  }
-
-  if (typeof trust !== 'function') {
-    trust = compile(trust)
-  }
-
-  for (var i = 0; i < addrs.length - 1; i++) {
-    if (trust(addrs[i], i)) continue
-
-    addrs.length = i + 1
-  }
-
-  return addrs
-}
-
-/**
- * Compile argument into trust function.
- *
- * @param {Array|String} val
- * @private
- */
-
-function compile (val) {
-  if (!val) {
-    throw new TypeError('argument is required')
-  }
-
-  var trust
-
-  if (typeof val === 'string') {
-    trust = [val]
-  } else if (Array.isArray(val)) {
-    trust = val.slice()
-  } else {
-    throw new TypeError('unsupported trust argument')
-  }
-
-  for (var i = 0; i < trust.length; i++) {
-    val = trust[i]
-
-    if (!Object.prototype.hasOwnProperty.call(IP_RANGES, val)) {
-      continue
-    }
-
-    // Splice in pre-defined range
-    val = IP_RANGES[val]
-    trust.splice.apply(trust, [i, 1].concat(val))
-    i += val.length - 1
-  }
-
-  return compileTrust(compileRangeSubnets(trust))
-}
-
-/**
- * Compile `arr` elements into range subnets.
- *
- * @param {Array} arr
- * @private
- */
-
-function compileRangeSubnets (arr) {
-  var rangeSubnets = new Array(arr.length)
-
-  for (var i = 0; i < arr.length; i++) {
-    rangeSubnets[i] = parseipNotation(arr[i])
-  }
-
-  return rangeSubnets
-}
-
-/**
- * Compile range subnet array into trust function.
- *
- * @param {Array} rangeSubnets
- * @private
- */
-
-function compileTrust (rangeSubnets) {
-  // Return optimized function based on length
-  var len = rangeSubnets.length
-  return len === 0
-    ? trustNone
-    : len === 1
-      ? trustSingle(rangeSubnets[0])
-      : trustMulti(rangeSubnets)
-}
-
-/**
- * Parse IP notation string into range subnet.
- *
- * @param {String} note
- * @private
- */
-
-function parseipNotation (note) {
-  var pos = note.lastIndexOf('/')
-  var str = pos !== -1
-    ? note.substring(0, pos)
-    : note
-
-  if (!isip(str)) {
-    throw new TypeError('invalid IP address: ' + str)
-  }
-
-  var ip = parseip(str)
-
-  if (pos === -1 && ip.kind() === 'ipv6' && ip.isIPv4MappedAddress()) {
-    // Store as IPv4
-    ip = ip.toIPv4Address()
-  }
-
-  var max = ip.kind() === 'ipv6'
-    ? 128
-    : 32
-
-  var range = pos !== -1
-    ? note.substring(pos + 1, note.length)
-    : null
-
-  if (range === null) {
-    range = max
-  } else if (DIGIT_REGEXP.test(range)) {
-    range = parseInt(range, 10)
-  } else if (ip.kind() === 'ipv4' && isip(range)) {
-    range = parseNetmask(range)
-  } else {
-    range = null
-  }
-
-  if (range <= 0 || range > max) {
-    throw new TypeError('invalid range on address: ' + note)
-  }
-
-  return [ip, range]
-}
-
-/**
- * Parse netmask string into CIDR range.
- *
- * @param {String} netmask
- * @private
- */
-
-function parseNetmask (netmask) {
-  var ip = parseip(netmask)
-  var kind = ip.kind()
-
-  return kind === 'ipv4'
-    ? ip.prefixLengthFromSubnetMask()
-    : null
-}
-
-/**
- * Determine address of proxied request.
- *
- * @param {Object} request
- * @param {Function|Array|String} trust
- * @public
- */
-
-function proxyaddr (req, trust) {
-  if (!req) {
-    throw new TypeError('req argument is required')
-  }
-
-  if (!trust) {
-    throw new TypeError('trust argument is required')
-  }
-
-  var addrs = alladdrs(req, trust)
-  var addr = addrs[addrs.length - 1]
-
-  return addr
-}
-
-/**
- * Static trust function to trust nothing.
- *
- * @private
- */
-
-function trustNone () {
-  return false
-}
-
-/**
- * Compile trust function for multiple subnets.
- *
- * @param {Array} subnets
- * @private
- */
-
-function trustMulti (subnets) {
-  return function trust (addr) {
-    if (!isip(addr)) return false
-
-    var ip = parseip(addr)
-    var ipconv
-    var kind = ip.kind()
-
-    for (var i = 0; i < subnets.length; i++) {
-      var subnet = subnets[i]
-      var subnetip = subnet[0]
-      var subnetkind = subnetip.kind()
-      var subnetrange = subnet[1]
-      var trusted = ip
-
-      if (kind !== subnetkind) {
-        if (subnetkind === 'ipv4' && !ip.isIPv4MappedAddress()) {
-          // Incompatible IP addresses
-          continue
-        }
-
-        if (!ipconv) {
-          // Convert IP to match subnet IP kind
-          ipconv = subnetkind === 'ipv4'
-            ? ip.toIPv4Address()
-            : ip.toIPv4MappedAddress()
-        }
-
-        trusted = ipconv
-      }
-
-      if (trusted.match(subnetip, subnetrange)) {
-        return true
-      }
-    }
-
-    return false
-  }
-}
-
-/**
- * Compile trust function for single subnet.
- *
- * @param {Object} subnet
- * @private
- */
-
-function trustSingle (subnet) {
-  var subnetip = subnet[0]
-  var subnetkind = subnetip.kind()
-  var subnetisipv4 = subnetkind === 'ipv4'
-  var subnetrange = subnet[1]
-
-  return function trust (addr) {
-    if (!isip(addr)) return false
-
-    var ip = parseip(addr)
-    var kind = ip.kind()
-
-    if (kind !== subnetkind) {
-      if (subnetisipv4 && !ip.isIPv4MappedAddress()) {
-        // Incompatible IP addresses
-        return false
-      }
-
-      // Convert IP to match subnet IP kind
-      ip = subnetisipv4
-        ? ip.toIPv4Address()
-        : ip.toIPv4MappedAddress()
-    }
-
-    return ip.match(subnetip, subnetrange)
-  }
-}
diff --git a/node_modules/proxy-addr/package.json b/node_modules/proxy-addr/package.json
deleted file mode 100644
index 24ba8f7db3cf17d87cff4bd53977b5239d459f90..0000000000000000000000000000000000000000
--- a/node_modules/proxy-addr/package.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "name": "proxy-addr",
-  "description": "Determine address of proxied request",
-  "version": "2.0.7",
-  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
-  "license": "MIT",
-  "keywords": [
-    "ip",
-    "proxy",
-    "x-forwarded-for"
-  ],
-  "repository": "jshttp/proxy-addr",
-  "dependencies": {
-    "forwarded": "0.2.0",
-    "ipaddr.js": "1.9.1"
-  },
-  "devDependencies": {
-    "benchmark": "2.1.4",
-    "beautify-benchmark": "0.2.4",
-    "deep-equal": "1.0.1",
-    "eslint": "7.26.0",
-    "eslint-config-standard": "14.1.1",
-    "eslint-plugin-import": "2.23.4",
-    "eslint-plugin-markdown": "2.2.0",
-    "eslint-plugin-node": "11.1.0",
-    "eslint-plugin-promise": "4.3.1",
-    "eslint-plugin-standard": "4.1.0",
-    "mocha": "8.4.0",
-    "nyc": "15.1.0"
-  },
-  "files": [
-    "LICENSE",
-    "HISTORY.md",
-    "README.md",
-    "index.js"
-  ],
-  "engines": {
-    "node": ">= 0.10"
-  },
-  "scripts": {
-    "bench": "node benchmark/index.js",
-    "lint": "eslint .",
-    "test": "mocha --reporter spec --bail --check-leaks test/",
-    "test-ci": "nyc --reporter=lcov --reporter=text npm test",
-    "test-cov": "nyc --reporter=html --reporter=text npm test"
-  }
-}
diff --git a/node_modules/pstree.remy/.travis.yml b/node_modules/pstree.remy/.travis.yml
deleted file mode 100644
index 5bf093eef9cde801cdce8d7df5c31c67d5949deb..0000000000000000000000000000000000000000
--- a/node_modules/pstree.remy/.travis.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-language: node_js
-cache:
-  directories:
-    - ~/.npm
-notifications:
-  email: false
-node_js:
-  - '8'
diff --git a/node_modules/pstree.remy/LICENSE b/node_modules/pstree.remy/LICENSE
deleted file mode 100644
index e83bea65c6c23bd6a0d29ea096b99072ac2ea3e2..0000000000000000000000000000000000000000
--- a/node_modules/pstree.remy/LICENSE
+++ /dev/null
@@ -1,7 +0,0 @@
-The MIT License (MIT)
-Copyright © 2019 Remy Sharp, https://remysharp.com <remy@remysharp.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/pstree.remy/README.md b/node_modules/pstree.remy/README.md
deleted file mode 100644
index 5f44c6292af24eac89f377302561c1eb71460ed2..0000000000000000000000000000000000000000
--- a/node_modules/pstree.remy/README.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# pstree.remy
-
-> Cross platform ps-tree (including unix flavours without ps)
-
-## Installation
-
-```shel
-npm install pstree.remy
-```
-
-## Usage
-
-```js
-const psTree = psTree require('pstree.remy');
-
-psTree(PID, (err, pids) => {
-  if (err) {
-    console.error(err);
-  }
-  console.log(pids)
-});
-
-console.log(psTree.hasPS
-  ? "This platform has the ps shell command"
-  : "This platform does not have the ps shell command");
-```
diff --git a/node_modules/pstree.remy/lib/index.js b/node_modules/pstree.remy/lib/index.js
deleted file mode 100644
index 743e9979504edb1ef8e78a38a6d56341c0721657..0000000000000000000000000000000000000000
--- a/node_modules/pstree.remy/lib/index.js
+++ /dev/null
@@ -1,37 +0,0 @@
-const exec = require('child_process').exec;
-const tree = require('./tree');
-const utils = require('./utils');
-var hasPS = true;
-
-// discover if the OS has `ps`, and therefore can use psTree
-exec('ps', (error) => {
-  module.exports.hasPS = hasPS = !error;
-});
-
-module.exports = function main(pid, callback) {
-  if (typeof pid === 'number') {
-    pid = pid.toString();
-  }
-
-  if (hasPS && !process.env.NO_PS) {
-    return tree(pid, callback);
-  }
-
-  utils
-    .getStat()
-    .then(utils.tree)
-    .then((tree) => utils.pidsForTree(tree, pid))
-    .then((res) =>
-      callback(
-        null,
-        res.map((p) => p.PID)
-      )
-    )
-    .catch((error) => callback(error));
-};
-
-if (!module.parent) {
-  module.exports(process.argv[2], (e, pids) => console.log(pids));
-}
-
-module.exports.hasPS = hasPS;
diff --git a/node_modules/pstree.remy/lib/tree.js b/node_modules/pstree.remy/lib/tree.js
deleted file mode 100644
index bac7cce65cda9e39a45af6675853cba8c4414c0d..0000000000000000000000000000000000000000
--- a/node_modules/pstree.remy/lib/tree.js
+++ /dev/null
@@ -1,37 +0,0 @@
-const spawn = require('child_process').spawn;
-
-module.exports = function (rootPid, callback) {
-  const pidsOfInterest = new Set([parseInt(rootPid, 10)]);
-  var output = '';
-
-  // *nix
-  const ps = spawn('ps', ['-A', '-o', 'ppid,pid']);
-  ps.stdout.on('data', (data) => {
-    output += data.toString('ascii');
-  });
-
-  ps.on('close', () => {
-    try {
-      const res = output
-        .split('\n')
-        .slice(1)
-        .map((_) => _.trim())
-        .reduce((acc, line) => {
-          const pids = line.split(/\s+/);
-          const ppid = parseInt(pids[0], 10);
-
-          if (pidsOfInterest.has(ppid)) {
-            const pid = parseInt(pids[1], 10);
-            acc.push(pid);
-            pidsOfInterest.add(pid);
-          }
-
-          return acc;
-        }, []);
-
-      callback(null, res);
-    } catch (e) {
-      callback(e, null);
-    }
-  });
-};
diff --git a/node_modules/pstree.remy/lib/utils.js b/node_modules/pstree.remy/lib/utils.js
deleted file mode 100644
index 8fa5719e2b714ccaec9f3f5177c0ebcf427d7b13..0000000000000000000000000000000000000000
--- a/node_modules/pstree.remy/lib/utils.js
+++ /dev/null
@@ -1,53 +0,0 @@
-const spawn = require('child_process').spawn;
-
-module.exports = { tree, pidsForTree, getStat };
-
-function getStat() {
-  return new Promise((resolve) => {
-    const command = `ls /proc | grep -E '^[0-9]+$' | xargs -I{} cat /proc/{}/stat`;
-    const spawned = spawn('sh', ['-c', command], {
-      stdio: ['pipe', 'pipe', 'pipe'],
-    });
-
-    var res = '';
-    spawned.stdout.on('data', (data) => (res += data));
-    spawned.on('close', () => resolve(res));
-  });
-}
-
-function template(s) {
-  var stat = null;
-  // 'pid', 'comm', 'state', 'ppid', 'pgrp'
-  // %d     (%s)    %c       %d      %d
-  s.replace(
-    /(\d+) \((.*?)\)\s(.+?)\s(\d+)\s/g,
-    (all, PID, COMMAND, STAT, PPID) => {
-      stat = { PID, COMMAND, PPID, STAT };
-    }
-  );
-
-  return stat;
-}
-
-function tree(stats) {
-  const processes = stats.split('\n').map(template).filter(Boolean);
-
-  return processes;
-}
-
-function pidsForTree(tree, pid) {
-  if (typeof pid === 'number') {
-    pid = pid.toString();
-  }
-  const parents = [pid];
-  const pids = [];
-
-  tree.forEach((proc) => {
-    if (parents.indexOf(proc.PPID) !== -1) {
-      parents.push(proc.PID);
-      pids.push(proc);
-    }
-  });
-
-  return pids;
-}
diff --git a/node_modules/pstree.remy/package.json b/node_modules/pstree.remy/package.json
deleted file mode 100644
index 35c70683d3f5cfaa0b52d7c798b26b33e0bc9503..0000000000000000000000000000000000000000
--- a/node_modules/pstree.remy/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "pstree.remy",
-  "version": "1.1.8",
-  "main": "lib/index.js",
-  "prettier": {
-    "trailingComma": "es5",
-    "semi": true,
-    "singleQuote": true
-  },
-  "scripts": {
-    "test": "tap tests/*.test.js",
-    "_prepublish": "npm test"
-  },
-  "keywords": [
-    "ps",
-    "pstree",
-    "ps tree"
-  ],
-  "author": "Remy Sharp",
-  "license": "MIT",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/remy/pstree.git"
-  },
-  "devDependencies": {
-    "tap": "^11.0.0"
-  },
-  "directories": {
-    "test": "tests"
-  },
-  "dependencies": {},
-  "description": "Collects the full tree of processes from /proc"
-}
diff --git a/node_modules/pstree.remy/tests/fixtures/index.js b/node_modules/pstree.remy/tests/fixtures/index.js
deleted file mode 100644
index 4cdbcb1b324cb2cf85ead43f535b15a2188ae622..0000000000000000000000000000000000000000
--- a/node_modules/pstree.remy/tests/fixtures/index.js
+++ /dev/null
@@ -1,13 +0,0 @@
-const spawn = require('child_process').spawn;
-function run() {
-  spawn(
-    'sh',
-    ['-c', 'node -e "setInterval(() => console.log(`running`), 200)"'],
-    {
-      stdio: 'pipe',
-    }
-  );
-}
-
-var runCallCount = process.argv[2] || 1;
-for (var i = 0; i < runCallCount; i++) run();
diff --git a/node_modules/pstree.remy/tests/fixtures/out1 b/node_modules/pstree.remy/tests/fixtures/out1
deleted file mode 100644
index abfe5810e063c544d3b525d9243777792ddf5192..0000000000000000000000000000000000000000
--- a/node_modules/pstree.remy/tests/fixtures/out1
+++ /dev/null
@@ -1,10 +0,0 @@
-1 (npm) S 0 1 1 34816 1 4210944 11112 0 0 0 45 8 0 0 20 0 10 0 330296 1089871872 11809 18446744073709551615 4194304 29343848 140726436642896 0 0 0 0 4096 2072112895 0 0 0 17 0 0 0 0 0 0 31441000 31537208 37314560 140726436650815 140726436650847 140726436650847 140726436650986 0
-15 (sh) S 1 1 1 34816 1 4210688 115 0 0 0 0 0 0 0 20 0 1 0 330372 4399104 187 18446744073709551615 94374393548800 94374393655428 140722913272992 0 0 0 0 0 65538 0 0 0 17 0 0 0 0 0 0 94374395756424 94374395761184 94374404673536 140722913278928 140722913278959 140722913278959 140722913284080 0
-16 (node) S 15 1 1 34816 1 4210688 6930 103 0 0 32 2 0 0 20 0 10 0 330373 1068478464 8412 18446744073709551615 4194304 29343848 140727228046064 0 0 0 0 4096 134300162 0 0 0 17 1 0 0 1 0 0 31441000 31537208 52584448 140727228050313 140727228050383 140727228050383 140727228055530 0
-27 (sh) S 16 1 1 34816 1 4210688 111 0 0 0 0 0 0 0 20 0 1 0 330410 4399104 193 18446744073709551615 94848235986944 94848236093572 140727019991184 0 0 0 0 0 65538 0 0 0 17 1 0 0 0 0 0 94848238194568 94848238199328 94848261660672 140727019998122 140727019998165 140727019998165 140727020003312 0
-28 (node) S 27 1 1 34816 1 4210688 3576 268 0 0 12 2 0 0 20 0 10 0 330411 930213888 6760 18446744073709551615 4194304 29343848 140726559664992 0 0 0 0 4096 134300162 0 0 0 17 1 0 0 0 0 0 31441000 31537208 32591872 140726559669117 140726559669199 140726559669199 140726559674346 0
-39 (node) S 28 1 1 34816 1 4210688 47517 0 0 0 151 9 0 0 20 0 6 0 330427 985739264 31859 18446744073709551615 4194304 29343848 140737324503920 0 0 0 0 4096 134234626 0 0 0 17 0 0 0 0 0 0 31441000 31537208 51585024 140737324510060 140737324510159 140737324510159 140737324515306 0
-45 (bash) S 0 45 45 34817 50 4210944 752 256 0 0 2 0 0 0 20 0 1 0 331039 18628608 789 18446744073709551615 4194304 5242124 140724425887696 0 0 0 65536 3670020 1266777851 0 0 0 17 1 0 0 0 0 0 7341384 7388228 30310400 140724425891678 140724425891683 140724425891683 140724425891822 0
-cat: /proc/50/stat: No such file or directory
-cat: /proc/51/stat: No such file or directory
-52 (xargs) S 45 50 45 34817 50 4210688 179 661 0 0 0 0 0 0 20 0 1 0 331544 4608000 346 18446744073709551615 94587588550656 94587588614028 140735223856048 0 0 0 0 0 2560 0 0 0 17 1 0 0 0 0 0 94587590711464 94587590713504 94587603169280 140735223861006 140735223861035 140735223861035 140735223861225 0
diff --git a/node_modules/pstree.remy/tests/fixtures/out2 b/node_modules/pstree.remy/tests/fixtures/out2
deleted file mode 100644
index 3b31137db22a9886f20d2a7a1e7e2a14f64722a3..0000000000000000000000000000000000000000
--- a/node_modules/pstree.remy/tests/fixtures/out2
+++ /dev/null
@@ -1,29 +0,0 @@
-cat: /proc/4087/stat: No such file or directory
-cat: /proc/4088/stat: No such file or directory
-1 (init) S 0 1 1 0 -1 4210944 9227 55994 29 319 7 5 68 16 20 0 1 0 1286281 33660928 855 18446744073709551615 1 1 0 0 0 0 0 4096 536962595 0 0 0 17 4 0 0 3 0 0 0 0 0 0 0 0 0 0
-1032 (ntpd) S 1 1032 1032 0 -1 4211008 178 0 1 0 0 0 0 0 20 0 1 0 1287033 25743360 1058 18446744073709551615 1 1 0 0 0 0 0 4096 27207 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-126 (irqbalance) S 1 126 126 0 -1 1077952832 1217 0 0 0 1 6 0 0 20 0 1 0 1286749 20189184 647 18446744073709551615 1 1 0 0 0 0 0 0 3 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-181 (mysqld) S 1 181 181 0 -1 4210944 6399 0 46 0 8 6 0 0 20 0 22 0 1286761 748453888 14476 18446744073709551615 1 1 0 0 0 0 552967 4096 26345 0 0 0 17 4 0 0 10 0 0 0 0 0 0 0 0 0 0
-194 (memcached) S 1 187 187 0 -1 4210944 252 0 4 0 0 0 0 0 20 0 6 0 1286766 333221888 648 18446744073709551615 1 1 0 0 0 0 0 4096 2 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-243 (dbus-daemon) S 1 243 243 0 -1 4211008 67 0 0 0 0 0 0 0 20 0 1 0 1286779 40087552 598 18446744073709551615 1 1 0 0 0 0 0 0 16385 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-254 (rsyslogd) S 1 254 254 0 -1 4211008 107 0 0 0 2 2 0 0 20 0 3 0 1286782 186601472 696 18446744073709551615 1 1 0 0 0 0 0 16781830 1133601 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0
-265 (systemd-logind) S 1 265 265 0 -1 4210944 276 0 2 0 0 0 0 0 20 0 1 0 1286786 35880960 720 18446744073709551615 1 1 0 0 0 0 0 0 0 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-333 (postgres) S 1 303 303 0 -1 4210688 3169 3466 15 18 0 1 1 1 20 0 1 0 1286817 156073984 5002 18446744073709551615 1 1 0 0 0 0 0 19935232 84487 0 0 0 17 5 0 0 1 0 0 0 0 0 0 0 0 0 0
-359 (postgres) S 333 359 359 0 -1 4210752 90 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16805888 2567 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-360 (postgres) S 333 360 360 0 -1 4210752 119 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16791554 16901 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-361 (postgres) S 333 361 361 0 -1 4210752 87 0 0 0 0 0 0 0 20 0 1 0 1286822 156073984 827 18446744073709551615 1 1 0 0 0 0 0 16791552 16903 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-362 (postgres) S 333 362 362 0 -1 4210752 292 0 3 0 0 0 0 0 20 0 1 0 1286822 156930048 1373 18446744073709551615 1 1 0 0 0 0 0 19927040 27271 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0
-363 (postgres) S 333 363 363 0 -1 4210752 82 0 0 0 0 0 0 0 20 0 1 0 1286822 115924992 887 18446744073709551615 1 1 0 0 0 0 0 16808450 5 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0
-4050 (npm) S 50 50 50 34817 50 4210688 5109 0 0 0 36 3 0 0 20 0 10 0 1292968 738025472 10051 18446744073709551615 4194304 33165900 140723623956256 0 0 0 0 4096 134300162 0 0 0 17 4 0 0 0 0 0 35263056 35370992 48369664 140723623964237 140723623964294 140723623964294 140723623968712 0
-4060 (sh) S 4050 50 50 34817 50 4210688 121 0 0 0 0 0 0 0 20 0 1 0 1293007 4579328 174 18446744073709551615 94347643936768 94347644049516 140735136055088 0 0 0 0 0 65538 1 0 0 17 5 0 0 0 0 0 94347646148008 94347646153216 94347660038144 140735136063095 140735136063129 140735136063129 140735136071664 0
-4061 (node) S 4060 50 50 34817 50 4210688 6501 0 0 0 42 2 0 0 20 0 6 0 1293008 705769472 10211 18446744073709551615 4194304 33165900 140730532686288 0 0 0 0 4096 2072111671 0 0 0 17 5 0 0 0 0 0 35263056 35370992 45867008 140730532695579 140730532695657 140730532695657 140730532704200 0
-4067 (node) S 4061 50 50 34817 50 4210688 6746 221 0 0 38 3 0 0 20 0 10 0 1293051 738910208 10527 18446744073709551615 4194304 33165900 140724824971632 0 0 0 0 4096 2072111671 0 0 0 17 4 0 0 0 0 0 35263056 35370992 68595712 140724824980995 140724824981063 140724824981063 140724824989640 0
-4079 (sh) S 4067 50 50 34817 50 4210688 118 0 0 0 0 0 0 0 20 0 1 0 1293092 4579328 194 18446744073709551615 94573702131712 94573702244460 140724712357120 0 0 0 0 0 65538 1 0 0 17 4 0 0 0 0 0 94573704342952 94573704348160 94573718511616 140724712361487 140724712361583 140724712361583 140724712370160 0
-4080 (node) S 4079 50 50 34817 50 4210688 2428 0 0 0 8 1 0 0 20 0 6 0 1293093 693059584 7251 18446744073709551615 4194304 33165900 140726023392816 0 0 0 0 4096 134234626 0 0 0 17 5 0 0 0 0 0 35263056 35370992 55226368 140726023396847 140726023396935 140726023396935 140726023405512 0
-4086 (sh) S 4067 50 50 34817 50 4210688 131 244 0 0 0 0 0 0 20 0 1 0 1293143 4579328 200 18446744073709551615 94347550273536 94347550386284 140737219399136 0 0 0 0 0 65538 1 0 0 17 5 0 0 0 0 0 94347552484776 94347552489984 94347554299904 140737219403308 140737219403375 140737219403375 140737219411952 0
-4089 (xargs) S 4086 50 50 34817 50 4210688 333 1924 0 0 0 0 0 0 20 0 1 0 1293143 17600512 477 18446744073709551615 4194304 4232732 140721633759248 0 0 0 0 0 0 1 0 0 17 5 0 0 0 0 0 6331920 6332980 32182272 140721633762891 140721633762920 140721633762920 140721633771497 0
-50 (bash) S 0 50 50 34817 50 4210944 43914 1032463 9 705 44 21 4213 818 20 0 1 0 1286336 42266624 3599 18446744073709551615 4194304 5173404 140732749083280 0 0 0 65536 4 1132560123 1 0 0 17 4 0 0 410 0 0 7273968 7310504 21196800 140732749086490 140732749086517 140732749086517 140732749086702 0
-79 (acpid) S 1 79 79 0 -1 4210752 46 0 0 0 0 0 0 0 20 0 1 0 1286717 4493312 407 18446744073709551615 1 1 0 0 0 0 0 4096 16391 0 0 0 17 5 0 0 0 0 0 0 0 0 0 0 0 0 0
-83 (sshd) S 1 83 83 0 -1 4210944 354 0 27 0 0 0 0 0 20 0 1 0 1286718 62873600 1290 18446744073709551615 1 1 0 0 0 0 0 4096 81925 0 0 0 17 4 0 0 30 0 0 0 0 0 0 0 0 0 0
-94 (cron) S 1 94 94 0 -1 1077952576 103 449 0 1 0 0 0 0 20 0 1 0 1286743 24240128 559 18446744073709551615 1 1 0 0 0 0 0 0 65537 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
-95 (atd) S 1 95 95 0 -1 1077952576 28 0 0 0 0 0 0 0 20 0 1 0 1286743 19615744 41 18446744073709551615 1 1 0 0 0 0 0 0 81923 0 0 0 17 4 0 0 0 0 0 0 0 0 0 0 0 0 0
diff --git a/node_modules/pstree.remy/tests/index.test.js b/node_modules/pstree.remy/tests/index.test.js
deleted file mode 100644
index 50096b95a34b87e9848417a02ce6e79ba08ddce4..0000000000000000000000000000000000000000
--- a/node_modules/pstree.remy/tests/index.test.js
+++ /dev/null
@@ -1,51 +0,0 @@
-const tap = require('tap');
-const test = tap.test;
-const readFile = require('fs').readFileSync;
-const spawn = require('child_process').spawn;
-const pstree = require('../');
-const { tree, pidsForTree, getStat } = require('../lib/utils');
-
-if (process.platform !== 'darwin') {
-  test('reads from /proc', async (t) => {
-    const ps = await getStat();
-    t.ok(ps.split('\n').length > 1);
-  });
-}
-
-test('tree for live env', async (t) => {
-  const pid = 4079;
-  const fixture = readFile(__dirname + '/fixtures/out2', 'utf8');
-  const ps = await tree(fixture);
-  t.deepEqual(
-    pidsForTree(ps, pid).map((_) => _.PID),
-    ['4080']
-  );
-});
-
-function testTree(t, runCallCount) {
-  const sub = spawn('node', [`${__dirname}/fixtures/index.js`, runCallCount], {
-    stdio: 'pipe',
-  });
-  setTimeout(() => {
-    const pid = sub.pid;
-
-    pstree(pid, (error, pids) => {
-      pids.concat([pid]).forEach((p) => {
-        spawn('kill', ['-s', 'SIGTERM', p]);
-      });
-
-      // the fixture launches `sh` which launches node which is why we
-      // are looking for two processes.
-      // Important: IDKW but MacOS seems to skip the `sh` process. no idea.
-      t.equal(pids.length, runCallCount * 2);
-      t.end();
-    });
-  }, 1000);
-}
-
-test('can read full process tree', (t) => {
-  testTree(t, 1);
-});
-test('can read full process tree with multiple processes', (t) => {
-  testTree(t, 2);
-});
diff --git a/node_modules/q/CHANGES.md b/node_modules/q/CHANGES.md
deleted file mode 100644
index 766fcdc21f88e1a02b8d8ecd780104f10c02271d..0000000000000000000000000000000000000000
--- a/node_modules/q/CHANGES.md
+++ /dev/null
@@ -1,800 +0,0 @@
-
-## 1.5.1
-
- - Q.any now annotates its error message to clarify that Q.any was involved and
-   includes only the last error emitted. (Ivan Etchart)
- - Avoid domain.dispose during tests in preparation for Node.js 9. (Anna
-   Henningsen)
-
-## 1.5.0
-
- - Q.any gives an error message from the last rejected promise
- - Throw if callback supplied to "finally" is invalid (@grahamrhay)
- - Long stack trace improvements, can now construct long stack traces
-   across rethrows.
-
-## 1.4.1
-
- - Address an issue that prevented Q from being used as a `<script>` for
-   Firefox add-ons. Q can now be used in any environment that provides `window`
-   or `self` globals, favoring `window` since add-ons have an an immutable
-   `self` that is distinct from `window`.
-
-## 1.4.0
-
- - Add `noConflict` support for use in `<script>` (@jahnjw).
-
-## 1.3.0
-
- - Add tracking for unhandled and handled rejections in Node.js (@benjamingr).
-
-## 1.2.1
-
- - Fix Node.js environment detection for modern Browserify (@kahnjw).
-
-## 1.2.0
-
- - Added Q.any(promisesArray) method (@vergara).
-   Returns a promise fulfilled with the value of the first resolved promise in
-   promisesArray. If all promises in promisesArray are rejected, it returns
-   a rejected promise.
-
-## 1.1.2
-
- - Removed extraneous files from the npm package by using the "files"
-   whitelist in package.json instead of the .npmignore blacklist.
-   (@anton-rudeshko)
-
-## 1.1.1
-
- - Fix a pair of regressions in bootstrapping, one which precluded
-   WebWorker support, and another that precluded support in
-   ``<script>`` usage outright. #607
-
-## 1.1.0
-
- - Adds support for enabling long stack traces in node.js by setting
-   environment variable `Q_DEBUG=1`.
- - Introduces the `tap` method to promises, which will see a value
-   pass through without alteration.
- - Use instanceof to recognize own promise instances as opposed to
-   thenables.
- - Construct timeout errors with `code === ETIMEDOUT` (Kornel Lesiński)
- - More descriminant CommonJS module environment detection.
- - Dropped continuous integration for Node.js 0.6 and 0.8 because of
-   changes to npm that preclude the use of new `^` version predicate
-   operator in any transitive dependency.
- - Users can now override `Q.nextTick`.
-
-## 1.0.1
-
- - Adds support for `Q.Promise`, which implements common usage of the
-   ES6 `Promise` constructor and its methods. `Promise` does not have
-   a valid promise constructor and a proper implementation awaits
-   version 2 of Q.
- - Removes the console stopgap for a promise inspector. This no longer
-   works with any degree of reliability.
- - Fixes support for content security policies that forbid eval. Now
-   using the `StopIteration` global to distinguish SpiderMonkey
-   generators from ES6 generators, assuming that they will never
-   coexist.
-
-## 1.0.0
-
-:cake: This is all but a re-release of version 0.9, which has settled
-into a gentle maintenance mode and rightly deserves an official 1.0.
-An ambitious 2.0 release is already around the corner, but 0.9/1.0
-have been distributed far and wide and demand long term support.
-
- - Q will now attempt to post a debug message in browsers regardless
-   of whether window.Touch is defined. Chrome at least now has this
-   property regardless of whether touch is supported by the underlying
-   hardware.
- - Remove deprecation warning from `promise.valueOf`. The function is
-   called by the browser in various ways so there is no way to
-   distinguish usage that should be migrated from usage that cannot be
-   altered.
-
-## 0.9.7
-
- - :warning: `q.min.js` is no longer checked-in.  It is however still
-   created by Grunt and NPM.
- - Fixes a bug that inhibited `Q.async` with implementations of the new
-   ES6 generators.
- - Fixes a bug with `nextTick` affecting Safari 6.0.5 the first time a
-   page loads when an `iframe` is involved.
- - Introduces `passByCopy`, `join`, and `race`.
- - Shows stack traces or error messages on the console, instead of
-   `Error` objects.
- - Elimintates wrapper methods for improved performance.
- - `Q.all` now propagates progress notifications of the form you might
-   expect of ES6 iterations, `{value, index}` where the `value` is the
-   progress notification from the promise at `index`.
-
-## 0.9.6
-
- - Fixes a bug in recognizing the difference between compatible Q
-   promises, and Q promises from before the implementation of "inspect".
-   The latter are now coerced.
- - Fixes an infinite asynchronous coercion cycle introduced by former
-   solution, in two independently sufficient ways.  1.) All promises
-   returned by makePromise now implement "inspect", albeit a default
-   that reports that the promise has an "unknown" state.  2.) The
-   implementation of "then/when" is now in "then" instead of "when", so
-   that the responsibility to "coerce" the given promise rests solely in
-   the "when" method and the "then" method may assume that "this" is a
-   promise of the right type.
- - Refactors `nextTick` to use an unrolled microtask within Q regardless
-   of how new ticks a requested. #316 @rkatic
-
-## 0.9.5
-
- - Introduces `inspect` for getting the state of a promise as
-   `{state: "fulfilled" | "rejected" | "pending", value | reason}`.
- - Introduces `allSettled` which produces an array of promises states
-   for the input promises once they have all "settled".  This is in
-   accordance with a discussion on Promises/A+ that "settled" refers to
-   a promise that is "fulfilled" or "rejected".  "resolved" refers to a
-   deferred promise that has been "resolved" to another promise,
-   "sealing its fate" to the fate of the successor promise.
- - Long stack traces are now off by default.  Set `Q.longStackSupport`
-   to true to enable long stack traces.
- - Long stack traces can now follow the entire asynchronous history of a
-   promise, not just a single jump.
- - Introduces `spawn` for an immediately invoked asychronous generator.
-   @jlongster
- - Support for *experimental* synonyms `mapply`, `mcall`, `nmapply`,
-   `nmcall` for method invocation.
-
-## 0.9.4
-
- - `isPromise` and `isPromiseAlike` now always returns a boolean
-   (even for falsy values). #284 @lfac-pt
- - Support for ES6 Generators in `async` #288 @andywingo
- - Clear duplicate promise rejections from dispatch methods #238 @SLaks
- - Unhandled rejection API #296 @domenic
-   `stopUnhandledRejectionTracking`, `getUnhandledReasons`,
-   `resetUnhandledRejections`.
-
-## 0.9.3
-
- - Add the ability to give `Q.timeout`'s errors a custom error message. #270
-   @jgrenon
- - Fix Q's call-stack busting behavior in Node.js 0.10, by switching from
-   `process.nextTick` to `setImmediate`. #254 #259
- - Fix Q's behavior when used with the Mocha test runner in the browser, since
-   Mocha introduces a fake `process` global without a `nextTick` property. #267
- - Fix some, but not all, cases wherein Q would give false positives in its
-   unhandled rejection detection (#252). A fix for other cases (#238) is
-   hopefully coming soon.
- - Made `Q.promise` throw early if given a non-function.
-
-## 0.9.2
-
- - Pass through progress notifications when using `timeout`. #229 @omares
- - Pass through progress notifications when using `delay`.
- - Fix `nbind` to actually bind the `thisArg`. #232 @davidpadbury
-
-## 0.9.1
-
- - Made the AMD detection compatible with the RequireJS optimizer's `namespace`
-   option. #225 @terinjokes
- - Fix side effects from `valueOf`, and thus from `isFulfilled`, `isRejected`,
-   and `isPending`. #226 @benjamn
-
-## 0.9.0
-
-This release removes many layers of deprecated methods and brings Q closer to
-alignment with Mark Miller’s TC39 [strawman][] for concurrency. At the same
-time, it fixes many bugs and adds a few features around error handling. Finally,
-it comes with an updated and comprehensive [API Reference][].
-
-[strawman]: http://wiki.ecmascript.org/doku.php?id=strawman:concurrency
-[API Reference]: https://github.com/kriskowal/q/wiki/API-Reference
-
-### API Cleanup
-
-The following deprecated or undocumented methods have been removed.
-Their replacements are listed here:
-
-<table>
-   <thead>
-      <tr>
-         <th>0.8.x method</th>
-         <th>0.9 replacement</th>
-      </tr>
-   </thead>
-   <tbody>
-      <tr>
-         <td><code>Q.ref</code></td>
-         <td><code>Q</code></td>
-      </tr>
-      <tr>
-         <td><code>call</code>, <code>apply</code>, <code>bind</code> (*)</td>
-         <td><code>fcall</code>/<code>invoke</code>, <code>fapply</code>/<code>post</code>, <code>fbind</code></td>
-      </tr>
-      <tr>
-         <td><code>ncall</code>, <code>napply</code> (*)</td>
-         <td><code>nfcall</code>/<code>ninvoke</code>, <code>nfapply</code>/<code>npost</code></td>
-      </tr>
-      <tr>
-         <td><code>end</code></td>
-         <td><code>done</code></td>
-      </tr>
-      <tr>
-         <td><code>put</code></td>
-         <td><code>set</code></td>
-      </tr>
-      <tr>
-         <td><code>node</code></td>
-         <td><code>nbind</code></td>
-      </tr>
-      <tr>
-         <td><code>nend</code></td>
-         <td><code>nodeify</code></td>
-      </tr>
-      <tr>
-         <td><code>isResolved</code></td>
-         <td><code>isPending</code></td>
-      </tr>
-      <tr>
-         <td><code>deferred.node</code></td>
-         <td><code>deferred.makeNodeResolver</code></td>
-      </tr>
-      <tr>
-         <td><code>Method</code>, <code>sender</code></td>
-         <td><code>dispatcher</code></td>
-      </tr>
-      <tr>
-         <td><code>send</code></td>
-         <td><code>dispatch</code></td>
-      </tr>
-      <tr>
-         <td><code>view</code>, <code>viewInfo</code></td>
-         <td>(none)</td>
-      </tr>
-   </tbody>
-</table>
-
-
-(*) Use of ``thisp`` is discouraged. For calling methods, use ``post`` or
-``invoke``.
-
-### Alignment with the Concurrency Strawman
-
--   Q now exports a `Q(value)` function, an alias for `resolve`.
-    `Q.call`, `Q.apply`, and `Q.bind` were removed to make room for the
-    same methods on the function prototype.
--   `invoke` has been aliased to `send` in all its forms.
--   `post` with no method name acts like `fapply`.
-
-### Error Handling
-
--   Long stack traces can be turned off by setting `Q.stackJumpLimit` to zero.
-    In the future, this property will be used to fine tune how many stack jumps
-    are retained in long stack traces; for now, anything nonzero is treated as
-    one (since Q only tracks one stack jump at the moment, see #144). #168
--   In Node.js, if there are unhandled rejections when the process exits, they
-    are output to the console. #115
-
-### Other
-
--   `delete` and `set` (née `put`) no longer have a fulfillment value.
--   Q promises are no longer frozen, which
-    [helps with performance](http://code.google.com/p/v8/issues/detail?id=1858).
--   `thenReject` is now included, as a counterpart to `thenResolve`.
--   The included browser `nextTick` shim is now faster. #195 @rkatic.
-
-### Bug Fixes
-
--   Q now works in Internet Explorer 10. #186 @ForbesLindesay
--   `fbind` no longer hard-binds the returned function's `this` to `undefined`.
-    #202
--   `Q.reject` no longer leaks memory. #148
--   `npost` with no arguments now works. #207
--   `allResolved` now works with non-Q promises ("thenables"). #179
--   `keys` behavior is now correct even in browsers without native
-    `Object.keys`. #192 @rkatic
--   `isRejected` and the `exception` property now work correctly if the
-    rejection reason is falsy. #198
-
-### Internals and Advanced
-
--   The internal interface for a promise now uses
-    `dispatchPromise(resolve, op, operands)` instead of `sendPromise(op,
-    resolve, ...operands)`, which reduces the cases where Q needs to do
-    argument slicing.
--   The internal protocol uses different operands. "put" is now "set".
-    "del" is now "delete". "view" and "viewInfo" have been removed.
--   `Q.fulfill` has been added. It is distinct from `Q.resolve` in that
-    it does not pass promises through, nor coerces promises from other
-    systems. The promise becomes the fulfillment value. This is only
-    recommended for use when trying to fulfill a promise with an object that has
-    a `then` function that is at the same time not a promise.
-
-## 0.8.12
-- Treat foreign promises as unresolved in `Q.isFulfilled`; this lets `Q.all`
-  work on arrays containing foreign promises. #154
-- Fix minor incompliances with the [Promises/A+ spec][] and [test suite][]. #157
-  #158
-
-[Promises/A+ spec]: http://promises-aplus.github.com/promises-spec/
-[test suite]: https://github.com/promises-aplus/promises-tests
-
-## 0.8.11
-
- - Added ``nfcall``, ``nfapply``, and ``nfbind`` as ``thisp``-less versions of
-   ``ncall``, ``napply``, and ``nbind``. The latter are now deprecated. #142
- - Long stack traces no longer cause linearly-growing memory usage when chaining
-   promises together. #111
- - Inspecting ``error.stack`` in a rejection handler will now give a long stack
-   trace. #103
- - Fixed ``Q.timeout`` to clear its timeout handle when the promise is rejected;
-   previously, it kept the event loop alive until the timeout period expired.
-   #145 @dfilatov
- - Added `q/queue` module, which exports an infinite promise queue
-   constructor.
-
-## 0.8.10
-
- - Added ``done`` as a replacement for ``end``, taking the usual fulfillment,
-   rejection, and progress handlers. It's essentially equivalent to
-   ``then(f, r, p).end()``.
- - Added ``Q.onerror``, a settable error trap that you can use to get full stack
-   traces for uncaught errors. #94
- - Added ``thenResolve`` as a shortcut for returning a constant value once a
-   promise is fulfilled. #108 @ForbesLindesay
- - Various tweaks to progress notification, including propagation and
-   transformation of progress values and only forwarding a single progress
-   object.
- - Renamed ``nend`` to ``nodeify``. It no longer returns an always-fulfilled
-   promise when a Node callback is passed.
- - ``deferred.resolve`` and ``deferred.reject`` no longer (sometimes) return
-   ``deferred.promise``.
- - Fixed stack traces getting mangled if they hit ``end`` twice. #116 #121 @ef4
- - Fixed ``ninvoke`` and ``npost`` to work on promises for objects with Node
-   methods. #134
- - Fixed accidental coercion of objects with nontrivial ``valueOf`` methods,
-   like ``Date``s, by the promise's ``valueOf`` method. #135
- - Fixed ``spread`` not calling the passed rejection handler if given a rejected
-   promise.
-
-## 0.8.9
-
- - Added ``nend``
- - Added preliminary progress notification support, via
-   ``promise.then(onFulfilled, onRejected, onProgress)``,
-   ``promise.progress(onProgress)``, and ``deferred.notify(...progressData)``.
- - Made ``put`` and ``del`` return the object acted upon for easier chaining.
-   #84
- - Fixed coercion cycles with cooperating promises. #106
-
-## 0.8.7
-
- - Support [Montage Require](http://github.com/kriskowal/mr)
-
-## 0.8.6
-
- - Fixed ``npost`` and ``ninvoke`` to pass the correct ``thisp``. #74
- - Fixed various cases involving unorthodox rejection reasons. #73 #90
-   @ef4
- - Fixed double-resolving of misbehaved custom promises. #75
- - Sped up ``Q.all`` for arrays contain already-resolved promises or scalar
-   values. @ForbesLindesay
- - Made stack trace filtering work when concatenating assets. #93 @ef4
- - Added warnings for deprecated methods. @ForbesLindesay
- - Added ``.npmignore`` file so that dependent packages get a slimmer
-   ``node_modules`` directory.
-
-## 0.8.5
-
- - Added preliminary support for long traces (@domenic)
- - Added ``fapply``, ``fcall``, ``fbind`` for non-thisp
-   promised function calls.
- - Added ``return`` for async generators, where generators
-   are implemented.
- - Rejected promises now have an "exception" property.  If an object
-   isRejected(object), then object.valueOf().exception will
-   be the wrapped error.
- - Added Jasmine specifications
- - Support Internet Explorers 7–9 (with multiple bug fixes @domenic)
- - Support Firefox 12
- - Support Safari 5.1.5
- - Support Chrome 18
-
-## 0.8.4
-
- - WARNING: ``promise.timeout`` is now rejected with an ``Error`` object
-   and the message now includes the duration of the timeout in
-   miliseconds.  This doesn't constitute (in my opinion) a
-   backward-incompatibility since it is a change of an undocumented and
-   unspecified public behavior, but if you happened to depend on the
-   exception being a string, you will need to revise your code.
- - Added ``deferred.makeNodeResolver()`` to replace the more cryptic
-   ``deferred.node()`` method.
- - Added experimental ``Q.promise(maker(resolve, reject))`` to make a
-   promise inside a callback, such that thrown exceptions in the
-   callback are converted and the resolver and rejecter are arguments.
-   This is a shorthand for making a deferred directly and inspired by
-   @gozala’s stream constructor pattern and the Microsoft Windows Metro
-   Promise constructor interface.
- - Added experimental ``Q.begin()`` that is intended to kick off chains
-   of ``.then`` so that each of these can be reordered without having to
-   edit the new and former first step.
-
-## 0.8.3
-
- - Added ``isFulfilled``, ``isRejected``, and ``isResolved``
-   to the promise prototype.
- - Added ``allResolved`` for waiting for every promise to either be
-   fulfilled or rejected, without propagating an error. @utvara #53
- - Added ``Q.bind`` as a method to transform functions that
-   return and throw into promise-returning functions. See
-   [an example](https://gist.github.com/1782808). @domenic
- - Renamed ``node`` export to ``nbind``, and added ``napply`` to
-   complete the set. ``node`` remains as deprecated. @domenic #58
- - Renamed ``Method`` export to ``sender``.  ``Method``
-   remains as deprecated and will be removed in the next
-   major version since I expect it has very little usage.
- - Added browser console message indicating a live list of
-   unhandled errors.
- - Added support for ``msSetImmediate`` (IE10) or ``setImmediate``
-   (available via [polyfill](https://github.com/NobleJS/setImmediate))
-   as a browser-side ``nextTick`` implementation. #44 #50 #59
- - Stopped using the event-queue dependency, which was in place for
-   Narwhal support: now directly using ``process.nextTick``.
- - WARNING: EXPERIMENTAL: added ``finally`` alias for ``fin``, ``catch``
-   alias for ``fail``, ``try`` alias for ``call``, and ``delete`` alias
-   for ``del``.  These properties are enquoted in the library for
-   cross-browser compatibility, but may be used as property names in
-   modern engines.
-
-## 0.8.2
-
- - Deprecated ``ref`` in favor of ``resolve`` as recommended by
-   @domenic.
- - Update event-queue dependency.
-
-## 0.8.1
-
- - Fixed Opera bug. #35 @cadorn
- - Fixed ``Q.all([])`` #32 @domenic
-
-## 0.8.0
-
- - WARNING: ``enqueue`` removed.  Use ``nextTick`` instead.
-   This is more consistent with NodeJS and (subjectively)
-   more explicit and intuitive.
- - WARNING: ``def`` removed.  Use ``master`` instead.  The
-   term ``def`` was too confusing to new users.
- - WARNING: ``spy`` removed in favor of ``fin``.
- - WARNING: ``wait`` removed. Do ``all(args).get(0)`` instead.
- - WARNING: ``join`` removed. Do ``all(args).spread(callback)`` instead.
- - WARNING: Removed the ``Q`` function module.exports alias
-   for ``Q.ref``. It conflicts with ``Q.apply`` in weird
-   ways, making it uncallable.
- - Revised ``delay`` so that it accepts both ``(value,
-   timeout)`` and ``(timeout)`` variations based on
-   arguments length.
- - Added ``ref().spread(cb(...args))``, a variant of
-   ``then`` that spreads an array across multiple arguments.
-   Useful with ``all()``.
- - Added ``defer().node()`` Node callback generator.  The
-   callback accepts ``(error, value)`` or ``(error,
-   ...values)``.  For multiple value arguments, the
-   fulfillment value is an array, useful in conjunction with
-   ``spread``.
- - Added ``node`` and ``ncall``, both with the signature
-   ``(fun, thisp_opt, ...args)``.  The former is a decorator
-   and the latter calls immediately.  ``node`` optional
-   binds and partially applies.  ``ncall`` can bind and pass
-   arguments.
-
-## 0.7.2
-
- - Fixed thenable promise assimilation.
-
-## 0.7.1
-
- - Stopped shimming ``Array.prototype.reduce``. The
-   enumerable property has bad side-effects.  Libraries that
-   depend on this (for example, QQ) will need to be revised.
-
-## 0.7.0 - BACKWARD INCOMPATIBILITY
-
- - WARNING: Removed ``report`` and ``asap``
- - WARNING: The ``callback`` argument of the ``fin``
-   function no longer receives any arguments. Thus, it can
-   be used to call functions that should not receive
-   arguments on resolution.  Use ``when``, ``then``, or
-   ``fail`` if you need a value.
- - IMPORTANT: Fixed a bug in the use of ``MessageChannel``
-   for ``nextTick``.
- - Renamed ``enqueue`` to ``nextTick``.
- - Added experimental ``view`` and ``viewInfo`` for creating
-   views of promises either when or before they're
-   fulfilled.
- - Shims are now externally applied so subsequent scripts or
-   dependees can use them.
- - Improved minification results.
- - Improved readability.
-
-## 0.6.0 - BACKWARD INCOMPATIBILITY
-
- - WARNING: In practice, the implementation of ``spy`` and
-   the name ``fin`` were useful.  I've removed the old
-   ``fin`` implementation and renamed/aliased ``spy``.
- - The "q" module now exports its ``ref`` function as a "Q"
-   constructor, with module systems that support exports
-   assignment including NodeJS, RequireJS, and when used as
-   a ``<script>`` tag. Notably, strictly compliant CommonJS
-   does not support this, but UncommonJS does.
- - Added ``async`` decorator for generators that use yield
-   to "trampoline" promises. In engines that support
-   generators (SpiderMonkey), this will greatly reduce the
-   need for nested callbacks.
- - Made ``when`` chainable.
- - Made ``all`` chainable.
-
-## 0.5.3
-
- - Added ``all`` and refactored ``join`` and ``wait`` to use
-   it.  All of these will now reject at the earliest
-   rejection.
-
-## 0.5.2
-
- - Minor improvement to ``spy``; now waits for resolution of
-   callback promise.
-
-## 0.5.1
-
- - Made most Q API methods chainable on promise objects, and
-   turned the previous promise-methods of ``join``,
-   ``wait``, and ``report`` into Q API methods.
- - Added ``apply`` and ``call`` to the Q API, and ``apply``
-   as a promise handler.
- - Added ``fail``, ``fin``, and ``spy`` to Q and the promise
-   prototype for convenience when observing rejection,
-   fulfillment and rejection, or just observing without
-   affecting the resolution.
- - Renamed ``def`` (although ``def`` remains shimmed until
-   the next major release) to ``master``.
- - Switched to using ``MessageChannel`` for next tick task
-   enqueue in browsers that support it.
-
-## 0.5.0 - MINOR BACKWARD INCOMPATIBILITY
-
- - Exceptions are no longer reported when consumed.
- - Removed ``error`` from the API.  Since exceptions are
-   getting consumed, throwing them in an errback causes the
-   exception to silently disappear.  Use ``end``.
- - Added ``end`` as both an API method and a promise-chain
-   ending method.  It causes propagated rejections to be
-   thrown, which allows Node to write stack traces and
-   emit ``uncaughtException`` events, and browsers to
-   likewise emit ``onerror`` and log to the console.
- - Added ``join`` and ``wait`` as promise chain functions,
-   so you can wait for variadic promises, returning your own
-   promise back, or join variadic promises, resolving with a
-   callback that receives variadic fulfillment values.
-
-## 0.4.4
-
- - ``end`` no longer returns a promise. It is the end of the
-   promise chain.
- - Stopped reporting thrown exceptions in ``when`` callbacks
-   and errbacks.  These must be explicitly reported through
-   ``.end()``, ``.then(null, Q.error)``, or some other
-   mechanism.
- - Added ``report`` as an API method, which can be used as
-   an errback to report and propagate an error.
- - Added ``report`` as a promise-chain method, so an error
-   can be reported if it passes such a gate.
-
-## 0.4.3
-
- - Fixed ``<script>`` support that regressed with 0.4.2
-   because of "use strict" in the module system
-   multi-plexer.
-
-## 0.4.2
-
- - Added support for RequireJS (jburke)
-
-## 0.4.1
-
- - Added an "end" method to the promise prototype,
-   as a shorthand for waiting for the promise to
-   be resolved gracefully, and failing to do so,
-   to dump an error message.
-
-## 0.4.0 - BACKWARD INCOMPATIBLE*
-
- - *Removed the utility modules. NPM and Node no longer
-   expose any module except the main module.  These have
-   been moved and merged into the "qq" package.
- - *In a non-CommonJS browser, q.js can be used as a script.
-   It now creates a Q global variable.
- - Fixed thenable assimilation.
- - Fixed some issues with asap, when it resolves to
-   undefined, or throws an exception.
-
-## 0.3.0 - BACKWARD-INCOMPATIBLE
-
- - The `post` method has been reverted to its original
-   signature, as provided in Tyler Close's `ref_send` API.
-   That is, `post` accepts two arguments, the second of
-   which is an arbitrary object, but usually invocation
-   arguments as an `Array`.  To provide variadic arguments
-   to `post`, there is a new `invoke` function that posts
-   the variadic arguments to the value given in the first
-   argument.
- - The `defined` method has been moved from `q` to `q/util`
-   since it gets no use in practice but is still
-   theoretically useful.
- - The `Promise` constructor has been renamed to
-   `makePromise` to be consistent with the convention that
-   functions that do not require the `new` keyword to be
-   used as constructors have camelCase names.
- - The `isResolved` function has been renamed to
-   `isFulfilled`.  There is a new `isResolved` function that
-   indicates whether a value is not a promise or, if it is a
-   promise, whether it has been either fulfilled or
-   rejected.  The code has been revised to reflect this
-   nuance in terminology.
-
-## 0.2.10
-
- - Added `join` to `"q/util"` for variadically joining
-   multiple promises.
-
-## 0.2.9
-
- - The future-compatible `invoke` method has been added,
-   to replace `post`, since `post` will become backward-
-   incompatible in the next major release.
- - Exceptions thrown in the callbacks of a `when` call are
-   now emitted to Node's `"uncaughtException"` `process`
-   event in addition to being returned as a rejection reason.
-
-## 0.2.8
-
- - Exceptions thrown in the callbacks of a `when` call
-   are now consumed, warned, and transformed into
-   rejections of the promise returned by `when`.
-
-## 0.2.7
-
- - Fixed a minor bug in thenable assimilation, regressed
-   because of the change in the forwarding protocol.
- - Fixed behavior of "q/util" `deep` method on dates and
-   other primitives. Github issue #11.
-
-## 0.2.6
-
- - Thenables (objects with a "then" method) are accepted
-   and provided, bringing this implementation of Q
-   into conformance with Promises/A, B, and D.
- - Added `makePromise`, to replace the `Promise` function
-   eventually.
- - Rejections are now also duck-typed. A rejection is a
-   promise with a valueOf method that returns a rejection
-   descriptor. A rejection descriptor has a
-   "promiseRejected" property equal to "true" and a
-   "reason" property corresponding to the rejection reason.
- - Altered the `makePromise` API such that the `fallback`
-   method no longer receives a superfluous `resolved` method
-   after the `operator`.  The fallback method is responsible
-   only for returning a resolution.  This breaks an
-   undocumented API, so third-party API's depending on the
-   previous undocumented behavior may break.
-
-## 0.2.5
-
- - Changed promises into a duck-type such that multiple
-   instances of the Q module can exchange promise objects.
-   A promise is now defined as "an object that implements the
-   `promiseSend(op, resolved, ...)` method and `valueOf`".
- - Exceptions in promises are now captured and returned
-   as rejections.
-
-## 0.2.4
-
- - Fixed bug in `ref` that prevented `del` messages from
-   being received (gozala)
- - Fixed a conflict with FireFox 4; constructor property
-   is now read-only.
-
-## 0.2.3
-
- - Added `keys` message to promises and to the promise API.
-
-## 0.2.2
-
- - Added boilerplate to `q/queue` and `q/util`.
- - Fixed missing dependency to `q/queue`.
-
-## 0.2.1
-
- - The `resolve` and `reject` methods of `defer` objects now
-   return the resolution promise for convenience.
- - Added `q/util`, which provides `step`, `delay`, `shallow`,
-   `deep`, and three reduction orders.
- - Added `q/queue` module for a promise `Queue`.
- - Added `q-comm` to the list of compatible libraries.
- - Deprecated `defined` from `q`, with intent to move it to
-   `q/util`.
-
-## 0.2.0 - BACKWARD INCOMPATIBLE
-
- - Changed post(ref, name, args) to variadic
-   post(ref, name, ...args). BACKWARD INCOMPATIBLE
- - Added a def(value) method to annotate an object as being
-   necessarily a local value that cannot be serialized, such
-   that inter-process/worker/vat promise communication
-   libraries will send messages to it, but never send it
-   back.
- - Added a send(value, op, ...args) method to the public API, for
-   forwarding messages to a value or promise in a future turn.
-
-## 0.1.9
-
- - Added isRejected() for testing whether a value is a rejected
-   promise.  isResolved() retains the behavior of stating
-   that rejected promises are not resolved.
-
-## 0.1.8
-
- - Fixed isResolved(null) and isResolved(undefined) [issue #9]
- - Fixed a problem with the Object.create shim
-
-## 0.1.7
-
- - shimmed ES5 Object.create in addition to Object.freeze
-   for compatibility on non-ES5 engines (gozala)
-
-## 0.1.6
-
- - Q.isResolved added
- - promise.valueOf() now returns the value of resolved
-   and near values
- - asap retried
- - promises are frozen when possible
-
-## 0.1.5
-
- - fixed dependency list for Teleport (gozala)
- - all unit tests now pass (gozala)
-
-## 0.1.4
-
- - added support for Teleport as an engine (gozala)
- - simplified and updated methods for getting internal
-   print and enqueue functions universally (gozala)
-
-## 0.1.3
-
- - fixed erroneous link to the q module in package.json
-
-## 0.1.2
-
- - restructured for overlay style package compatibility
-
-## 0.1.0
-
- - removed asap because it was broken, probably down to the
-   philosophy.
-
-## 0.0.3
-
- - removed q-util
- - fixed asap so it returns a value if completed
-
-## 0.0.2
-
- - added q-util
-
-## 0.0.1
-
- - initial version
diff --git a/node_modules/q/LICENSE b/node_modules/q/LICENSE
deleted file mode 100644
index 9ce1ea591fca2060658d95475291967610763b2b..0000000000000000000000000000000000000000
--- a/node_modules/q/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-Copyright 2009–2017 Kristopher Michael Kowal. 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/q/README.md b/node_modules/q/README.md
deleted file mode 100644
index d2f57a6f66e819eb353645ca1759d8d9853c651a..0000000000000000000000000000000000000000
--- a/node_modules/q/README.md
+++ /dev/null
@@ -1,874 +0,0 @@
-[![Build Status](https://secure.travis-ci.org/kriskowal/q.svg?branch=master)](http://travis-ci.org/kriskowal/q)
-[![CDNJS](https://img.shields.io/cdnjs/v/q.js.svg)](https://cdnjs.com/libraries/q.js)
-
-<a href="http://promises-aplus.github.com/promises-spec">
-    <img src="http://kriskowal.github.io/q/q.png" align="right" alt="Q logo" />
-</a>
-
-If a function cannot return a value or throw an exception without
-blocking, it can return a promise instead.  A promise is an object
-that represents the return value or the thrown exception that the
-function may eventually provide.  A promise can also be used as a
-proxy for a [remote object][Q-Connection] to overcome latency.
-
-[Q-Connection]: https://github.com/kriskowal/q-connection
-
-On the first pass, promises can mitigate the “[Pyramid of
-Doom][POD]”: the situation where code marches to the right faster
-than it marches forward.
-
-[POD]: http://calculist.org/blog/2011/12/14/why-coroutines-wont-work-on-the-web/
-
-```javascript
-step1(function (value1) {
-    step2(value1, function(value2) {
-        step3(value2, function(value3) {
-            step4(value3, function(value4) {
-                // Do something with value4
-            });
-        });
-    });
-});
-```
-
-With a promise library, you can flatten the pyramid.
-
-```javascript
-Q.fcall(promisedStep1)
-.then(promisedStep2)
-.then(promisedStep3)
-.then(promisedStep4)
-.then(function (value4) {
-    // Do something with value4
-})
-.catch(function (error) {
-    // Handle any error from all above steps
-})
-.done();
-```
-
-With this approach, you also get implicit error propagation, just like `try`,
-`catch`, and `finally`.  An error in `promisedStep1` will flow all the way to
-the `catch` function, where it’s caught and handled.  (Here `promisedStepN` is
-a version of `stepN` that returns a promise.)
-
-The callback approach is called an “inversion of control”.
-A function that accepts a callback instead of a return value
-is saying, “Don’t call me, I’ll call you.”.  Promises
-[un-invert][IOC] the inversion, cleanly separating the input
-arguments from control flow arguments.  This simplifies the
-use and creation of API’s, particularly variadic,
-rest and spread arguments.
-
-[IOC]: http://www.slideshare.net/domenicdenicola/callbacks-promises-and-coroutines-oh-my-the-evolution-of-asynchronicity-in-javascript
-
-
-## Getting Started
-
-The Q module can be loaded as:
-
--   A ``<script>`` tag (creating a ``Q`` global variable): ~2.5 KB minified and
-    gzipped.
--   A Node.js and CommonJS module, available in [npm](https://npmjs.org/) as
-    the [q](https://npmjs.org/package/q) package
--   An AMD module
--   A [component](https://github.com/component/component) as ``microjs/q``
--   Using [bower](http://bower.io/) as `q#^1.4.1`
--   Using [NuGet](http://nuget.org/) as [Q](https://nuget.org/packages/q)
-
-Q can exchange promises with jQuery, Dojo, When.js, WinJS, and more.
-
-## Resources
-
-Our [wiki][] contains a number of useful resources, including:
-
-- A method-by-method [Q API reference][reference].
-- A growing [examples gallery][examples], showing how Q can be used to make
-  everything better. From XHR to database access to accessing the Flickr API,
-  Q is there for you.
-- There are many libraries that produce and consume Q promises for everything
-  from file system/database access or RPC to templating. For a list of some of
-  the more popular ones, see [Libraries][].
-- If you want materials that introduce the promise concept generally, and the
-  below tutorial isn't doing it for you, check out our collection of
-  [presentations, blog posts, and podcasts][resources].
-- A guide for those [coming from jQuery's `$.Deferred`][jquery].
-
-We'd also love to have you join the Q-Continuum [mailing list][].
-
-[wiki]: https://github.com/kriskowal/q/wiki
-[reference]: https://github.com/kriskowal/q/wiki/API-Reference
-[examples]: https://github.com/kriskowal/q/wiki/Examples-Gallery
-[Libraries]: https://github.com/kriskowal/q/wiki/Libraries
-[resources]: https://github.com/kriskowal/q/wiki/General-Promise-Resources
-[jquery]: https://github.com/kriskowal/q/wiki/Coming-from-jQuery
-[mailing list]: https://groups.google.com/forum/#!forum/q-continuum
-
-
-## Tutorial
-
-Promises have a ``then`` method, which you can use to get the eventual
-return value (fulfillment) or thrown exception (rejection).
-
-```javascript
-promiseMeSomething()
-.then(function (value) {
-}, function (reason) {
-});
-```
-
-If ``promiseMeSomething`` returns a promise that gets fulfilled later
-with a return value, the first function (the fulfillment handler) will be
-called with the value.  However, if the ``promiseMeSomething`` function
-gets rejected later by a thrown exception, the second function (the
-rejection handler) will be called with the exception.
-
-Note that resolution of a promise is always asynchronous: that is, the
-fulfillment or rejection handler will always be called in the next turn of the
-event loop (i.e. `process.nextTick` in Node). This gives you a nice
-guarantee when mentally tracing the flow of your code, namely that
-``then`` will always return before either handler is executed.
-
-In this tutorial, we begin with how to consume and work with promises. We'll
-talk about how to create them, and thus create functions like
-`promiseMeSomething` that return promises, [below](#the-beginning).
-
-
-### Propagation
-
-The ``then`` method returns a promise, which in this example, I’m
-assigning to ``outputPromise``.
-
-```javascript
-var outputPromise = getInputPromise()
-.then(function (input) {
-}, function (reason) {
-});
-```
-
-The ``outputPromise`` variable becomes a new promise for the return
-value of either handler.  Since a function can only either return a
-value or throw an exception, only one handler will ever be called and it
-will be responsible for resolving ``outputPromise``.
-
--   If you return a value in a handler, ``outputPromise`` will get
-    fulfilled.
-
--   If you throw an exception in a handler, ``outputPromise`` will get
-    rejected.
-
--   If you return a **promise** in a handler, ``outputPromise`` will
-    “become” that promise.  Being able to become a new promise is useful
-    for managing delays, combining results, or recovering from errors.
-
-If the ``getInputPromise()`` promise gets rejected and you omit the
-rejection handler, the **error** will go to ``outputPromise``:
-
-```javascript
-var outputPromise = getInputPromise()
-.then(function (value) {
-});
-```
-
-If the input promise gets fulfilled and you omit the fulfillment handler, the
-**value** will go to ``outputPromise``:
-
-```javascript
-var outputPromise = getInputPromise()
-.then(null, function (error) {
-});
-```
-
-Q promises provide a ``fail`` shorthand for ``then`` when you are only
-interested in handling the error:
-
-```javascript
-var outputPromise = getInputPromise()
-.fail(function (error) {
-});
-```
-
-If you are writing JavaScript for modern engines only or using
-CoffeeScript, you may use `catch` instead of `fail`.
-
-Promises also have a ``fin`` function that is like a ``finally`` clause.
-The final handler gets called, with no arguments, when the promise
-returned by ``getInputPromise()`` either returns a value or throws an
-error.  The value returned or error thrown by ``getInputPromise()``
-passes directly to ``outputPromise`` unless the final handler fails, and
-may be delayed if the final handler returns a promise.
-
-```javascript
-var outputPromise = getInputPromise()
-.fin(function () {
-    // close files, database connections, stop servers, conclude tests
-});
-```
-
--   If the handler returns a value, the value is ignored
--   If the handler throws an error, the error passes to ``outputPromise``
--   If the handler returns a promise, ``outputPromise`` gets postponed.  The
-    eventual value or error has the same effect as an immediate return
-    value or thrown error: a value would be ignored, an error would be
-    forwarded.
-
-If you are writing JavaScript for modern engines only or using
-CoffeeScript, you may use `finally` instead of `fin`.
-
-### Chaining
-
-There are two ways to chain promises.  You can chain promises either
-inside or outside handlers.  The next two examples are equivalent.
-
-```javascript
-return getUsername()
-.then(function (username) {
-    return getUser(username)
-    .then(function (user) {
-        // if we get here without an error,
-        // the value returned here
-        // or the exception thrown here
-        // resolves the promise returned
-        // by the first line
-    })
-});
-```
-
-```javascript
-return getUsername()
-.then(function (username) {
-    return getUser(username);
-})
-.then(function (user) {
-    // if we get here without an error,
-    // the value returned here
-    // or the exception thrown here
-    // resolves the promise returned
-    // by the first line
-});
-```
-
-The only difference is nesting.  It’s useful to nest handlers if you
-need to capture multiple input values in your closure.
-
-```javascript
-function authenticate() {
-    return getUsername()
-    .then(function (username) {
-        return getUser(username);
-    })
-    // chained because we will not need the user name in the next event
-    .then(function (user) {
-        return getPassword()
-        // nested because we need both user and password next
-        .then(function (password) {
-            if (user.passwordHash !== hash(password)) {
-                throw new Error("Can't authenticate");
-            }
-        });
-    });
-}
-```
-
-
-### Combination
-
-You can turn an array of promises into a promise for the whole,
-fulfilled array using ``all``.
-
-```javascript
-return Q.all([
-    eventualAdd(2, 2),
-    eventualAdd(10, 20)
-]);
-```
-
-If you have a promise for an array, you can use ``spread`` as a
-replacement for ``then``.  The ``spread`` function “spreads” the
-values over the arguments of the fulfillment handler.  The rejection handler
-will get called at the first sign of failure.  That is, whichever of
-the received promises fails first gets handled by the rejection handler.
-
-```javascript
-function eventualAdd(a, b) {
-    return Q.spread([a, b], function (a, b) {
-        return a + b;
-    })
-}
-```
-
-But ``spread`` calls ``all`` initially, so you can skip it in chains.
-
-```javascript
-return getUsername()
-.then(function (username) {
-    return [username, getUser(username)];
-})
-.spread(function (username, user) {
-});
-```
-
-The ``all`` function returns a promise for an array of values.  When this
-promise is fulfilled, the array contains the fulfillment values of the original
-promises, in the same order as those promises.  If one of the given promises
-is rejected, the returned promise is immediately rejected, not waiting for the
-rest of the batch.  If you want to wait for all of the promises to either be
-fulfilled or rejected, you can use ``allSettled``.
-
-```javascript
-Q.allSettled(promises)
-.then(function (results) {
-    results.forEach(function (result) {
-        if (result.state === "fulfilled") {
-            var value = result.value;
-        } else {
-            var reason = result.reason;
-        }
-    });
-});
-```
-
-The ``any`` function accepts an array of promises and returns a promise that is
-fulfilled by the first given promise to be fulfilled, or rejected if all of the
-given promises are rejected.
-
-```javascript
-Q.any(promises)
-.then(function (first) {
-    // Any of the promises was fulfilled.
-}, function (error) {
-    // All of the promises were rejected.
-});
-```
-
-### Sequences
-
-If you have a number of promise-producing functions that need
-to be run sequentially, you can of course do so manually:
-
-```javascript
-return foo(initialVal).then(bar).then(baz).then(qux);
-```
-
-However, if you want to run a dynamically constructed sequence of
-functions, you'll want something like this:
-
-```javascript
-var funcs = [foo, bar, baz, qux];
-
-var result = Q(initialVal);
-funcs.forEach(function (f) {
-    result = result.then(f);
-});
-return result;
-```
-
-You can make this slightly more compact using `reduce`:
-
-```javascript
-return funcs.reduce(function (soFar, f) {
-    return soFar.then(f);
-}, Q(initialVal));
-```
-
-Or, you could use the ultra-compact version:
-
-```javascript
-return funcs.reduce(Q.when, Q(initialVal));
-```
-
-### Handling Errors
-
-One sometimes-unintuitive aspect of promises is that if you throw an
-exception in the fulfillment handler, it will not be caught by the error
-handler.
-
-```javascript
-return foo()
-.then(function (value) {
-    throw new Error("Can't bar.");
-}, function (error) {
-    // We only get here if "foo" fails
-});
-```
-
-To see why this is, consider the parallel between promises and
-``try``/``catch``. We are ``try``-ing to execute ``foo()``: the error
-handler represents a ``catch`` for ``foo()``, while the fulfillment handler
-represents code that happens *after* the ``try``/``catch`` block.
-That code then needs its own ``try``/``catch`` block.
-
-In terms of promises, this means chaining your rejection handler:
-
-```javascript
-return foo()
-.then(function (value) {
-    throw new Error("Can't bar.");
-})
-.fail(function (error) {
-    // We get here with either foo's error or bar's error
-});
-```
-
-### Progress Notification
-
-It's possible for promises to report their progress, e.g. for tasks that take a
-long time like a file upload. Not all promises will implement progress
-notifications, but for those that do, you can consume the progress values using
-a third parameter to ``then``:
-
-```javascript
-return uploadFile()
-.then(function () {
-    // Success uploading the file
-}, function (err) {
-    // There was an error, and we get the reason for error
-}, function (progress) {
-    // We get notified of the upload's progress as it is executed
-});
-```
-
-Like `fail`, Q also provides a shorthand for progress callbacks
-called `progress`:
-
-```javascript
-return uploadFile().progress(function (progress) {
-    // We get notified of the upload's progress
-});
-```
-
-### The End
-
-When you get to the end of a chain of promises, you should either
-return the last promise or end the chain.  Since handlers catch
-errors, it’s an unfortunate pattern that the exceptions can go
-unobserved.
-
-So, either return it,
-
-```javascript
-return foo()
-.then(function () {
-    return "bar";
-});
-```
-
-Or, end it.
-
-```javascript
-foo()
-.then(function () {
-    return "bar";
-})
-.done();
-```
-
-Ending a promise chain makes sure that, if an error doesn’t get
-handled before the end, it will get rethrown and reported.
-
-This is a stopgap. We are exploring ways to make unhandled errors
-visible without any explicit handling.
-
-
-### The Beginning
-
-Everything above assumes you get a promise from somewhere else.  This
-is the common case.  Every once in a while, you will need to create a
-promise from scratch.
-
-#### Using ``Q.fcall``
-
-You can create a promise from a value using ``Q.fcall``.  This returns a
-promise for 10.
-
-```javascript
-return Q.fcall(function () {
-    return 10;
-});
-```
-
-You can also use ``fcall`` to get a promise for an exception.
-
-```javascript
-return Q.fcall(function () {
-    throw new Error("Can't do it");
-});
-```
-
-As the name implies, ``fcall`` can call functions, or even promised
-functions.  This uses the ``eventualAdd`` function above to add two
-numbers.
-
-```javascript
-return Q.fcall(eventualAdd, 2, 2);
-```
-
-
-#### Using Deferreds
-
-If you have to interface with asynchronous functions that are callback-based
-instead of promise-based, Q provides a few shortcuts (like ``Q.nfcall`` and
-friends). But much of the time, the solution will be to use *deferreds*.
-
-```javascript
-var deferred = Q.defer();
-FS.readFile("foo.txt", "utf-8", function (error, text) {
-    if (error) {
-        deferred.reject(new Error(error));
-    } else {
-        deferred.resolve(text);
-    }
-});
-return deferred.promise;
-```
-
-Note that a deferred can be resolved with a value or a promise.  The
-``reject`` function is a shorthand for resolving with a rejected
-promise.
-
-```javascript
-// this:
-deferred.reject(new Error("Can't do it"));
-
-// is shorthand for:
-var rejection = Q.fcall(function () {
-    throw new Error("Can't do it");
-});
-deferred.resolve(rejection);
-```
-
-This is a simplified implementation of ``Q.delay``.
-
-```javascript
-function delay(ms) {
-    var deferred = Q.defer();
-    setTimeout(deferred.resolve, ms);
-    return deferred.promise;
-}
-```
-
-This is a simplified implementation of ``Q.timeout``
-
-```javascript
-function timeout(promise, ms) {
-    var deferred = Q.defer();
-    Q.when(promise, deferred.resolve);
-    delay(ms).then(function () {
-        deferred.reject(new Error("Timed out"));
-    });
-    return deferred.promise;
-}
-```
-
-Finally, you can send a progress notification to the promise with
-``deferred.notify``.
-
-For illustration, this is a wrapper for XML HTTP requests in the browser. Note
-that a more [thorough][XHR] implementation would be in order in practice.
-
-[XHR]: https://github.com/montagejs/mr/blob/71e8df99bb4f0584985accd6f2801ef3015b9763/browser.js#L29-L73
-
-```javascript
-function requestOkText(url) {
-    var request = new XMLHttpRequest();
-    var deferred = Q.defer();
-
-    request.open("GET", url, true);
-    request.onload = onload;
-    request.onerror = onerror;
-    request.onprogress = onprogress;
-    request.send();
-
-    function onload() {
-        if (request.status === 200) {
-            deferred.resolve(request.responseText);
-        } else {
-            deferred.reject(new Error("Status code was " + request.status));
-        }
-    }
-
-    function onerror() {
-        deferred.reject(new Error("Can't XHR " + JSON.stringify(url)));
-    }
-
-    function onprogress(event) {
-        deferred.notify(event.loaded / event.total);
-    }
-
-    return deferred.promise;
-}
-```
-
-Below is an example of how to use this ``requestOkText`` function:
-
-```javascript
-requestOkText("http://localhost:3000")
-.then(function (responseText) {
-    // If the HTTP response returns 200 OK, log the response text.
-    console.log(responseText);
-}, function (error) {
-    // If there's an error or a non-200 status code, log the error.
-    console.error(error);
-}, function (progress) {
-    // Log the progress as it comes in.
-    console.log("Request progress: " + Math.round(progress * 100) + "%");
-});
-```
-
-#### Using `Q.Promise`
-
-This is an alternative promise-creation API that has the same power as
-the deferred concept, but without introducing another conceptual entity.
-
-Rewriting the `requestOkText` example above using `Q.Promise`:
-
-```javascript
-function requestOkText(url) {
-    return Q.Promise(function(resolve, reject, notify) {
-        var request = new XMLHttpRequest();
-
-        request.open("GET", url, true);
-        request.onload = onload;
-        request.onerror = onerror;
-        request.onprogress = onprogress;
-        request.send();
-
-        function onload() {
-            if (request.status === 200) {
-                resolve(request.responseText);
-            } else {
-                reject(new Error("Status code was " + request.status));
-            }
-        }
-
-        function onerror() {
-            reject(new Error("Can't XHR " + JSON.stringify(url)));
-        }
-
-        function onprogress(event) {
-            notify(event.loaded / event.total);
-        }
-    });
-}
-```
-
-If `requestOkText` were to throw an exception, the returned promise would be
-rejected with that thrown exception as the rejection reason.
-
-### The Middle
-
-If you are using a function that may return a promise, but just might
-return a value if it doesn’t need to defer, you can use the “static”
-methods of the Q library.
-
-The ``when`` function is the static equivalent for ``then``.
-
-```javascript
-return Q.when(valueOrPromise, function (value) {
-}, function (error) {
-});
-```
-
-All of the other methods on a promise have static analogs with the
-same name.
-
-The following are equivalent:
-
-```javascript
-return Q.all([a, b]);
-```
-
-```javascript
-return Q.fcall(function () {
-    return [a, b];
-})
-.all();
-```
-
-When working with promises provided by other libraries, you should
-convert it to a Q promise.  Not all promise libraries make the same
-guarantees as Q and certainly don’t provide all of the same methods.
-Most libraries only provide a partially functional ``then`` method.
-This thankfully is all we need to turn them into vibrant Q promises.
-
-```javascript
-return Q($.ajax(...))
-.then(function () {
-});
-```
-
-If there is any chance that the promise you receive is not a Q promise
-as provided by your library, you should wrap it using a Q function.
-You can even use ``Q.invoke`` as a shorthand.
-
-```javascript
-return Q.invoke($, 'ajax', ...)
-.then(function () {
-});
-```
-
-
-### Over the Wire
-
-A promise can serve as a proxy for another object, even a remote
-object.  There are methods that allow you to optimistically manipulate
-properties or call functions.  All of these interactions return
-promises, so they can be chained.
-
-```
-direct manipulation         using a promise as a proxy
---------------------------  -------------------------------
-value.foo                   promise.get("foo")
-value.foo = value           promise.put("foo", value)
-delete value.foo            promise.del("foo")
-value.foo(...args)          promise.post("foo", [args])
-value.foo(...args)          promise.invoke("foo", ...args)
-value(...args)              promise.fapply([args])
-value(...args)              promise.fcall(...args)
-```
-
-If the promise is a proxy for a remote object, you can shave
-round-trips by using these functions instead of ``then``.  To take
-advantage of promises for remote objects, check out [Q-Connection][].
-
-[Q-Connection]: https://github.com/kriskowal/q-connection
-
-Even in the case of non-remote objects, these methods can be used as
-shorthand for particularly-simple fulfillment handlers. For example, you
-can replace
-
-```javascript
-return Q.fcall(function () {
-    return [{ foo: "bar" }, { foo: "baz" }];
-})
-.then(function (value) {
-    return value[0].foo;
-});
-```
-
-with
-
-```javascript
-return Q.fcall(function () {
-    return [{ foo: "bar" }, { foo: "baz" }];
-})
-.get(0)
-.get("foo");
-```
-
-
-### Adapting Node
-
-If you're working with functions that make use of the Node.js callback pattern,
-where callbacks are in the form of `function(err, result)`, Q provides a few
-useful utility functions for converting between them. The most straightforward
-are probably `Q.nfcall` and `Q.nfapply` ("Node function call/apply") for calling
-Node.js-style functions and getting back a promise:
-
-```javascript
-return Q.nfcall(FS.readFile, "foo.txt", "utf-8");
-return Q.nfapply(FS.readFile, ["foo.txt", "utf-8"]);
-```
-
-If you are working with methods, instead of simple functions, you can easily
-run in to the usual problems where passing a method to another function—like
-`Q.nfcall`—"un-binds" the method from its owner. To avoid this, you can either
-use `Function.prototype.bind` or some nice shortcut methods we provide:
-
-```javascript
-return Q.ninvoke(redisClient, "get", "user:1:id");
-return Q.npost(redisClient, "get", ["user:1:id"]);
-```
-
-You can also create reusable wrappers with `Q.denodeify` or `Q.nbind`:
-
-```javascript
-var readFile = Q.denodeify(FS.readFile);
-return readFile("foo.txt", "utf-8");
-
-var redisClientGet = Q.nbind(redisClient.get, redisClient);
-return redisClientGet("user:1:id");
-```
-
-Finally, if you're working with raw deferred objects, there is a
-`makeNodeResolver` method on deferreds that can be handy:
-
-```javascript
-var deferred = Q.defer();
-FS.readFile("foo.txt", "utf-8", deferred.makeNodeResolver());
-return deferred.promise;
-```
-
-### Long Stack Traces
-
-Q comes with optional support for “long stack traces,” wherein the `stack`
-property of `Error` rejection reasons is rewritten to be traced along
-asynchronous jumps instead of stopping at the most recent one. As an example:
-
-```js
-function theDepthsOfMyProgram() {
-  Q.delay(100).done(function explode() {
-    throw new Error("boo!");
-  });
-}
-
-theDepthsOfMyProgram();
-```
-
-usually would give a rather unhelpful stack trace looking something like
-
-```
-Error: boo!
-    at explode (/path/to/test.js:3:11)
-    at _fulfilled (/path/to/test.js:q:54)
-    at resolvedValue.promiseDispatch.done (/path/to/q.js:823:30)
-    at makePromise.promise.promiseDispatch (/path/to/q.js:496:13)
-    at pending (/path/to/q.js:397:39)
-    at process.startup.processNextTick.process._tickCallback (node.js:244:9)
-```
-
-But, if you turn this feature on by setting
-
-```js
-Q.longStackSupport = true;
-```
-
-then the above code gives a nice stack trace to the tune of
-
-```
-Error: boo!
-    at explode (/path/to/test.js:3:11)
-From previous event:
-    at theDepthsOfMyProgram (/path/to/test.js:2:16)
-    at Object.<anonymous> (/path/to/test.js:7:1)
-```
-
-Note how you can see the function that triggered the async operation in the
-stack trace! This is very helpful for debugging, as otherwise you end up getting
-only the first line, plus a bunch of Q internals, with no sign of where the
-operation started.
-
-In node.js, this feature can also be enabled through the Q_DEBUG environment
-variable:
-
-```
-Q_DEBUG=1 node server.js
-```
-
-This will enable long stack support in every instance of Q.
-
-This feature does come with somewhat-serious performance and memory overhead,
-however. If you're working with lots of promises, or trying to scale a server
-to many users, you should probably keep it off. But in development, go for it!
-
-## Tests
-
-You can view the results of the Q test suite [in your browser][tests]!
-
-[tests]: https://rawgithub.com/kriskowal/q/v1/spec/q-spec.html
-
-## License
-
-Copyright 2009–2017 Kristopher Michael Kowal and contributors
-MIT License (enclosed)
-
diff --git a/node_modules/q/package.json b/node_modules/q/package.json
deleted file mode 100644
index 8c3b5fe378311869f4baee1352d184b4a5ba681e..0000000000000000000000000000000000000000
--- a/node_modules/q/package.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "name": "q",
-  "version": "1.5.1",
-  "description": "A library for promises (CommonJS/Promises/A,B,D)",
-  "homepage": "https://github.com/kriskowal/q",
-  "author": "Kris Kowal <kris@cixar.com> (https://github.com/kriskowal)",
-  "keywords": [
-    "q",
-    "promise",
-    "promises",
-    "promises-a",
-    "promises-aplus",
-    "deferred",
-    "future",
-    "async",
-    "flow control",
-    "fluent",
-    "browser",
-    "node"
-  ],
-  "contributors": [
-    "Kris Kowal <kris@cixar.com> (https://github.com/kriskowal)",
-    "Irakli Gozalishvili <rfobic@gmail.com> (http://jeditoolkit.com)",
-    "Domenic Denicola <domenic@domenicdenicola.com> (http://domenicdenicola.com)"
-  ],
-  "bugs": {
-    "mail": "kris@cixar.com",
-    "url": "http://github.com/kriskowal/q/issues"
-  },
-  "license": "MIT",
-  "main": "q.js",
-  "files": [
-    "LICENSE",
-    "q.js",
-    "queue.js"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/kriskowal/q.git"
-  },
-  "engines": {
-    "node": ">=0.6.0",
-    "teleport": ">=0.2.0"
-  },
-  "dependencies": {},
-  "devDependencies": {
-    "cover": "*",
-    "grunt": "~0.4.1",
-    "grunt-cli": "~0.1.9",
-    "grunt-contrib-uglify": "~0.9.1",
-    "jasmine-node": "1.11.0",
-    "jshint": "~2.1.9",
-    "matcha": "~0.2.0",
-    "opener": "*",
-    "promises-aplus-tests": "1.x"
-  },
-  "scripts": {
-    "test": "npm ls -s && jasmine-node spec && promises-aplus-tests spec/aplus-adapter && npm run -s lint",
-    "test-browser": "opener spec/q-spec.html",
-    "benchmark": "matcha",
-    "lint": "jshint q.js",
-    "cover": "cover run jasmine-node spec && cover report html && opener cover_html/index.html",
-    "minify": "grunt",
-    "prepublish": "grunt"
-  },
-  "overlay": {
-    "teleport": {
-      "dependencies": {
-        "system": ">=0.0.4"
-      }
-    }
-  },
-  "directories": {
-    "test": "./spec"
-  }
-}
diff --git a/node_modules/q/q.js b/node_modules/q/q.js
deleted file mode 100644
index 6e467958297e2d0f5206a7dc4ae357123d838a2f..0000000000000000000000000000000000000000
--- a/node_modules/q/q.js
+++ /dev/null
@@ -1,2076 +0,0 @@
-// vim:ts=4:sts=4:sw=4:
-/*!
- *
- * Copyright 2009-2017 Kris Kowal under the terms of the MIT
- * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
- *
- * With parts by Tyler Close
- * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
- * at http://www.opensource.org/licenses/mit-license.html
- * Forked at ref_send.js version: 2009-05-11
- *
- * With parts by Mark Miller
- * Copyright (C) 2011 Google Inc.
- *
- * 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.
- *
- */
-
-(function (definition) {
-    "use strict";
-
-    // This file will function properly as a <script> tag, or a module
-    // using CommonJS and NodeJS or RequireJS module formats.  In
-    // Common/Node/RequireJS, the module exports the Q API and when
-    // executed as a simple <script>, it creates a Q global instead.
-
-    // Montage Require
-    if (typeof bootstrap === "function") {
-        bootstrap("promise", definition);
-
-    // CommonJS
-    } else if (typeof exports === "object" && typeof module === "object") {
-        module.exports = definition();
-
-    // RequireJS
-    } else if (typeof define === "function" && define.amd) {
-        define(definition);
-
-    // SES (Secure EcmaScript)
-    } else if (typeof ses !== "undefined") {
-        if (!ses.ok()) {
-            return;
-        } else {
-            ses.makeQ = definition;
-        }
-
-    // <script>
-    } else if (typeof window !== "undefined" || typeof self !== "undefined") {
-        // Prefer window over self for add-on scripts. Use self for
-        // non-windowed contexts.
-        var global = typeof window !== "undefined" ? window : self;
-
-        // Get the `window` object, save the previous Q global
-        // and initialize Q as a global.
-        var previousQ = global.Q;
-        global.Q = definition();
-
-        // Add a noConflict function so Q can be removed from the
-        // global namespace.
-        global.Q.noConflict = function () {
-            global.Q = previousQ;
-            return this;
-        };
-
-    } else {
-        throw new Error("This environment was not anticipated by Q. Please file a bug.");
-    }
-
-})(function () {
-"use strict";
-
-var hasStacks = false;
-try {
-    throw new Error();
-} catch (e) {
-    hasStacks = !!e.stack;
-}
-
-// All code after this point will be filtered from stack traces reported
-// by Q.
-var qStartingLine = captureLine();
-var qFileName;
-
-// shims
-
-// used for fallback in "allResolved"
-var noop = function () {};
-
-// Use the fastest possible means to execute a task in a future turn
-// of the event loop.
-var nextTick =(function () {
-    // linked list of tasks (single, with head node)
-    var head = {task: void 0, next: null};
-    var tail = head;
-    var flushing = false;
-    var requestTick = void 0;
-    var isNodeJS = false;
-    // queue for late tasks, used by unhandled rejection tracking
-    var laterQueue = [];
-
-    function flush() {
-        /* jshint loopfunc: true */
-        var task, domain;
-
-        while (head.next) {
-            head = head.next;
-            task = head.task;
-            head.task = void 0;
-            domain = head.domain;
-
-            if (domain) {
-                head.domain = void 0;
-                domain.enter();
-            }
-            runSingle(task, domain);
-
-        }
-        while (laterQueue.length) {
-            task = laterQueue.pop();
-            runSingle(task);
-        }
-        flushing = false;
-    }
-    // runs a single function in the async queue
-    function runSingle(task, domain) {
-        try {
-            task();
-
-        } catch (e) {
-            if (isNodeJS) {
-                // In node, uncaught exceptions are considered fatal errors.
-                // Re-throw them synchronously to interrupt flushing!
-
-                // Ensure continuation if the uncaught exception is suppressed
-                // listening "uncaughtException" events (as domains does).
-                // Continue in next event to avoid tick recursion.
-                if (domain) {
-                    domain.exit();
-                }
-                setTimeout(flush, 0);
-                if (domain) {
-                    domain.enter();
-                }
-
-                throw e;
-
-            } else {
-                // In browsers, uncaught exceptions are not fatal.
-                // Re-throw them asynchronously to avoid slow-downs.
-                setTimeout(function () {
-                    throw e;
-                }, 0);
-            }
-        }
-
-        if (domain) {
-            domain.exit();
-        }
-    }
-
-    nextTick = function (task) {
-        tail = tail.next = {
-            task: task,
-            domain: isNodeJS && process.domain,
-            next: null
-        };
-
-        if (!flushing) {
-            flushing = true;
-            requestTick();
-        }
-    };
-
-    if (typeof process === "object" &&
-        process.toString() === "[object process]" && process.nextTick) {
-        // Ensure Q is in a real Node environment, with a `process.nextTick`.
-        // To see through fake Node environments:
-        // * Mocha test runner - exposes a `process` global without a `nextTick`
-        // * Browserify - exposes a `process.nexTick` function that uses
-        //   `setTimeout`. In this case `setImmediate` is preferred because
-        //    it is faster. Browserify's `process.toString()` yields
-        //   "[object Object]", while in a real Node environment
-        //   `process.toString()` yields "[object process]".
-        isNodeJS = true;
-
-        requestTick = function () {
-            process.nextTick(flush);
-        };
-
-    } else if (typeof setImmediate === "function") {
-        // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
-        if (typeof window !== "undefined") {
-            requestTick = setImmediate.bind(window, flush);
-        } else {
-            requestTick = function () {
-                setImmediate(flush);
-            };
-        }
-
-    } else if (typeof MessageChannel !== "undefined") {
-        // modern browsers
-        // http://www.nonblocking.io/2011/06/windownexttick.html
-        var channel = new MessageChannel();
-        // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
-        // working message ports the first time a page loads.
-        channel.port1.onmessage = function () {
-            requestTick = requestPortTick;
-            channel.port1.onmessage = flush;
-            flush();
-        };
-        var requestPortTick = function () {
-            // Opera requires us to provide a message payload, regardless of
-            // whether we use it.
-            channel.port2.postMessage(0);
-        };
-        requestTick = function () {
-            setTimeout(flush, 0);
-            requestPortTick();
-        };
-
-    } else {
-        // old browsers
-        requestTick = function () {
-            setTimeout(flush, 0);
-        };
-    }
-    // runs a task after all other tasks have been run
-    // this is useful for unhandled rejection tracking that needs to happen
-    // after all `then`d tasks have been run.
-    nextTick.runAfter = function (task) {
-        laterQueue.push(task);
-        if (!flushing) {
-            flushing = true;
-            requestTick();
-        }
-    };
-    return nextTick;
-})();
-
-// Attempt to make generics safe in the face of downstream
-// modifications.
-// There is no situation where this is necessary.
-// If you need a security guarantee, these primordials need to be
-// deeply frozen anyway, and if you don’t need a security guarantee,
-// this is just plain paranoid.
-// However, this **might** have the nice side-effect of reducing the size of
-// the minified code by reducing x.call() to merely x()
-// See Mark Miller’s explanation of what this does.
-// http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
-var call = Function.call;
-function uncurryThis(f) {
-    return function () {
-        return call.apply(f, arguments);
-    };
-}
-// This is equivalent, but slower:
-// uncurryThis = Function_bind.bind(Function_bind.call);
-// http://jsperf.com/uncurrythis
-
-var array_slice = uncurryThis(Array.prototype.slice);
-
-var array_reduce = uncurryThis(
-    Array.prototype.reduce || function (callback, basis) {
-        var index = 0,
-            length = this.length;
-        // concerning the initial value, if one is not provided
-        if (arguments.length === 1) {
-            // seek to the first value in the array, accounting
-            // for the possibility that is is a sparse array
-            do {
-                if (index in this) {
-                    basis = this[index++];
-                    break;
-                }
-                if (++index >= length) {
-                    throw new TypeError();
-                }
-            } while (1);
-        }
-        // reduce
-        for (; index < length; index++) {
-            // account for the possibility that the array is sparse
-            if (index in this) {
-                basis = callback(basis, this[index], index);
-            }
-        }
-        return basis;
-    }
-);
-
-var array_indexOf = uncurryThis(
-    Array.prototype.indexOf || function (value) {
-        // not a very good shim, but good enough for our one use of it
-        for (var i = 0; i < this.length; i++) {
-            if (this[i] === value) {
-                return i;
-            }
-        }
-        return -1;
-    }
-);
-
-var array_map = uncurryThis(
-    Array.prototype.map || function (callback, thisp) {
-        var self = this;
-        var collect = [];
-        array_reduce(self, function (undefined, value, index) {
-            collect.push(callback.call(thisp, value, index, self));
-        }, void 0);
-        return collect;
-    }
-);
-
-var object_create = Object.create || function (prototype) {
-    function Type() { }
-    Type.prototype = prototype;
-    return new Type();
-};
-
-var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
-    obj[prop] = descriptor.value;
-    return obj;
-};
-
-var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
-
-var object_keys = Object.keys || function (object) {
-    var keys = [];
-    for (var key in object) {
-        if (object_hasOwnProperty(object, key)) {
-            keys.push(key);
-        }
-    }
-    return keys;
-};
-
-var object_toString = uncurryThis(Object.prototype.toString);
-
-function isObject(value) {
-    return value === Object(value);
-}
-
-// generator related shims
-
-// FIXME: Remove this function once ES6 generators are in SpiderMonkey.
-function isStopIteration(exception) {
-    return (
-        object_toString(exception) === "[object StopIteration]" ||
-        exception instanceof QReturnValue
-    );
-}
-
-// FIXME: Remove this helper and Q.return once ES6 generators are in
-// SpiderMonkey.
-var QReturnValue;
-if (typeof ReturnValue !== "undefined") {
-    QReturnValue = ReturnValue;
-} else {
-    QReturnValue = function (value) {
-        this.value = value;
-    };
-}
-
-// long stack traces
-
-var STACK_JUMP_SEPARATOR = "From previous event:";
-
-function makeStackTraceLong(error, promise) {
-    // If possible, transform the error stack trace by removing Node and Q
-    // cruft, then concatenating with the stack trace of `promise`. See #57.
-    if (hasStacks &&
-        promise.stack &&
-        typeof error === "object" &&
-        error !== null &&
-        error.stack
-    ) {
-        var stacks = [];
-        for (var p = promise; !!p; p = p.source) {
-            if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
-                object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
-                stacks.unshift(p.stack);
-            }
-        }
-        stacks.unshift(error.stack);
-
-        var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
-        var stack = filterStackString(concatedStacks);
-        object_defineProperty(error, "stack", {value: stack, configurable: true});
-    }
-}
-
-function filterStackString(stackString) {
-    var lines = stackString.split("\n");
-    var desiredLines = [];
-    for (var i = 0; i < lines.length; ++i) {
-        var line = lines[i];
-
-        if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
-            desiredLines.push(line);
-        }
-    }
-    return desiredLines.join("\n");
-}
-
-function isNodeFrame(stackLine) {
-    return stackLine.indexOf("(module.js:") !== -1 ||
-           stackLine.indexOf("(node.js:") !== -1;
-}
-
-function getFileNameAndLineNumber(stackLine) {
-    // Named functions: "at functionName (filename:lineNumber:columnNumber)"
-    // In IE10 function name can have spaces ("Anonymous function") O_o
-    var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
-    if (attempt1) {
-        return [attempt1[1], Number(attempt1[2])];
-    }
-
-    // Anonymous functions: "at filename:lineNumber:columnNumber"
-    var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
-    if (attempt2) {
-        return [attempt2[1], Number(attempt2[2])];
-    }
-
-    // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
-    var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
-    if (attempt3) {
-        return [attempt3[1], Number(attempt3[2])];
-    }
-}
-
-function isInternalFrame(stackLine) {
-    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
-
-    if (!fileNameAndLineNumber) {
-        return false;
-    }
-
-    var fileName = fileNameAndLineNumber[0];
-    var lineNumber = fileNameAndLineNumber[1];
-
-    return fileName === qFileName &&
-        lineNumber >= qStartingLine &&
-        lineNumber <= qEndingLine;
-}
-
-// discover own file name and line number range for filtering stack
-// traces
-function captureLine() {
-    if (!hasStacks) {
-        return;
-    }
-
-    try {
-        throw new Error();
-    } catch (e) {
-        var lines = e.stack.split("\n");
-        var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
-        var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
-        if (!fileNameAndLineNumber) {
-            return;
-        }
-
-        qFileName = fileNameAndLineNumber[0];
-        return fileNameAndLineNumber[1];
-    }
-}
-
-function deprecate(callback, name, alternative) {
-    return function () {
-        if (typeof console !== "undefined" &&
-            typeof console.warn === "function") {
-            console.warn(name + " is deprecated, use " + alternative +
-                         " instead.", new Error("").stack);
-        }
-        return callback.apply(callback, arguments);
-    };
-}
-
-// end of shims
-// beginning of real work
-
-/**
- * Constructs a promise for an immediate reference, passes promises through, or
- * coerces promises from different systems.
- * @param value immediate reference or promise
- */
-function Q(value) {
-    // If the object is already a Promise, return it directly.  This enables
-    // the resolve function to both be used to created references from objects,
-    // but to tolerably coerce non-promises to promises.
-    if (value instanceof Promise) {
-        return value;
-    }
-
-    // assimilate thenables
-    if (isPromiseAlike(value)) {
-        return coerce(value);
-    } else {
-        return fulfill(value);
-    }
-}
-Q.resolve = Q;
-
-/**
- * Performs a task in a future turn of the event loop.
- * @param {Function} task
- */
-Q.nextTick = nextTick;
-
-/**
- * Controls whether or not long stack traces will be on
- */
-Q.longStackSupport = false;
-
-/**
- * The counter is used to determine the stopping point for building
- * long stack traces. In makeStackTraceLong we walk backwards through
- * the linked list of promises, only stacks which were created before
- * the rejection are concatenated.
- */
-var longStackCounter = 1;
-
-// enable long stacks if Q_DEBUG is set
-if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
-    Q.longStackSupport = true;
-}
-
-/**
- * Constructs a {promise, resolve, reject} object.
- *
- * `resolve` is a callback to invoke with a more resolved value for the
- * promise. To fulfill the promise, invoke `resolve` with any value that is
- * not a thenable. To reject the promise, invoke `resolve` with a rejected
- * thenable, or invoke `reject` with the reason directly. To resolve the
- * promise to another thenable, thus putting it in the same state, invoke
- * `resolve` with that other thenable.
- */
-Q.defer = defer;
-function defer() {
-    // if "messages" is an "Array", that indicates that the promise has not yet
-    // been resolved.  If it is "undefined", it has been resolved.  Each
-    // element of the messages array is itself an array of complete arguments to
-    // forward to the resolved promise.  We coerce the resolution value to a
-    // promise using the `resolve` function because it handles both fully
-    // non-thenable values and other thenables gracefully.
-    var messages = [], progressListeners = [], resolvedPromise;
-
-    var deferred = object_create(defer.prototype);
-    var promise = object_create(Promise.prototype);
-
-    promise.promiseDispatch = function (resolve, op, operands) {
-        var args = array_slice(arguments);
-        if (messages) {
-            messages.push(args);
-            if (op === "when" && operands[1]) { // progress operand
-                progressListeners.push(operands[1]);
-            }
-        } else {
-            Q.nextTick(function () {
-                resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
-            });
-        }
-    };
-
-    // XXX deprecated
-    promise.valueOf = function () {
-        if (messages) {
-            return promise;
-        }
-        var nearerValue = nearer(resolvedPromise);
-        if (isPromise(nearerValue)) {
-            resolvedPromise = nearerValue; // shorten chain
-        }
-        return nearerValue;
-    };
-
-    promise.inspect = function () {
-        if (!resolvedPromise) {
-            return { state: "pending" };
-        }
-        return resolvedPromise.inspect();
-    };
-
-    if (Q.longStackSupport && hasStacks) {
-        try {
-            throw new Error();
-        } catch (e) {
-            // NOTE: don't try to use `Error.captureStackTrace` or transfer the
-            // accessor around; that causes memory leaks as per GH-111. Just
-            // reify the stack trace as a string ASAP.
-            //
-            // At the same time, cut off the first line; it's always just
-            // "[object Promise]\n", as per the `toString`.
-            promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
-            promise.stackCounter = longStackCounter++;
-        }
-    }
-
-    // NOTE: we do the checks for `resolvedPromise` in each method, instead of
-    // consolidating them into `become`, since otherwise we'd create new
-    // promises with the lines `become(whatever(value))`. See e.g. GH-252.
-
-    function become(newPromise) {
-        resolvedPromise = newPromise;
-
-        if (Q.longStackSupport && hasStacks) {
-            // Only hold a reference to the new promise if long stacks
-            // are enabled to reduce memory usage
-            promise.source = newPromise;
-        }
-
-        array_reduce(messages, function (undefined, message) {
-            Q.nextTick(function () {
-                newPromise.promiseDispatch.apply(newPromise, message);
-            });
-        }, void 0);
-
-        messages = void 0;
-        progressListeners = void 0;
-    }
-
-    deferred.promise = promise;
-    deferred.resolve = function (value) {
-        if (resolvedPromise) {
-            return;
-        }
-
-        become(Q(value));
-    };
-
-    deferred.fulfill = function (value) {
-        if (resolvedPromise) {
-            return;
-        }
-
-        become(fulfill(value));
-    };
-    deferred.reject = function (reason) {
-        if (resolvedPromise) {
-            return;
-        }
-
-        become(reject(reason));
-    };
-    deferred.notify = function (progress) {
-        if (resolvedPromise) {
-            return;
-        }
-
-        array_reduce(progressListeners, function (undefined, progressListener) {
-            Q.nextTick(function () {
-                progressListener(progress);
-            });
-        }, void 0);
-    };
-
-    return deferred;
-}
-
-/**
- * Creates a Node-style callback that will resolve or reject the deferred
- * promise.
- * @returns a nodeback
- */
-defer.prototype.makeNodeResolver = function () {
-    var self = this;
-    return function (error, value) {
-        if (error) {
-            self.reject(error);
-        } else if (arguments.length > 2) {
-            self.resolve(array_slice(arguments, 1));
-        } else {
-            self.resolve(value);
-        }
-    };
-};
-
-/**
- * @param resolver {Function} a function that returns nothing and accepts
- * the resolve, reject, and notify functions for a deferred.
- * @returns a promise that may be resolved with the given resolve and reject
- * functions, or rejected by a thrown exception in resolver
- */
-Q.Promise = promise; // ES6
-Q.promise = promise;
-function promise(resolver) {
-    if (typeof resolver !== "function") {
-        throw new TypeError("resolver must be a function.");
-    }
-    var deferred = defer();
-    try {
-        resolver(deferred.resolve, deferred.reject, deferred.notify);
-    } catch (reason) {
-        deferred.reject(reason);
-    }
-    return deferred.promise;
-}
-
-promise.race = race; // ES6
-promise.all = all; // ES6
-promise.reject = reject; // ES6
-promise.resolve = Q; // ES6
-
-// XXX experimental.  This method is a way to denote that a local value is
-// serializable and should be immediately dispatched to a remote upon request,
-// instead of passing a reference.
-Q.passByCopy = function (object) {
-    //freeze(object);
-    //passByCopies.set(object, true);
-    return object;
-};
-
-Promise.prototype.passByCopy = function () {
-    //freeze(object);
-    //passByCopies.set(object, true);
-    return this;
-};
-
-/**
- * If two promises eventually fulfill to the same value, promises that value,
- * but otherwise rejects.
- * @param x {Any*}
- * @param y {Any*}
- * @returns {Any*} a promise for x and y if they are the same, but a rejection
- * otherwise.
- *
- */
-Q.join = function (x, y) {
-    return Q(x).join(y);
-};
-
-Promise.prototype.join = function (that) {
-    return Q([this, that]).spread(function (x, y) {
-        if (x === y) {
-            // TODO: "===" should be Object.is or equiv
-            return x;
-        } else {
-            throw new Error("Q can't join: not the same: " + x + " " + y);
-        }
-    });
-};
-
-/**
- * Returns a promise for the first of an array of promises to become settled.
- * @param answers {Array[Any*]} promises to race
- * @returns {Any*} the first promise to be settled
- */
-Q.race = race;
-function race(answerPs) {
-    return promise(function (resolve, reject) {
-        // Switch to this once we can assume at least ES5
-        // answerPs.forEach(function (answerP) {
-        //     Q(answerP).then(resolve, reject);
-        // });
-        // Use this in the meantime
-        for (var i = 0, len = answerPs.length; i < len; i++) {
-            Q(answerPs[i]).then(resolve, reject);
-        }
-    });
-}
-
-Promise.prototype.race = function () {
-    return this.then(Q.race);
-};
-
-/**
- * Constructs a Promise with a promise descriptor object and optional fallback
- * function.  The descriptor contains methods like when(rejected), get(name),
- * set(name, value), post(name, args), and delete(name), which all
- * return either a value, a promise for a value, or a rejection.  The fallback
- * accepts the operation name, a resolver, and any further arguments that would
- * have been forwarded to the appropriate method above had a method been
- * provided with the proper name.  The API makes no guarantees about the nature
- * of the returned object, apart from that it is usable whereever promises are
- * bought and sold.
- */
-Q.makePromise = Promise;
-function Promise(descriptor, fallback, inspect) {
-    if (fallback === void 0) {
-        fallback = function (op) {
-            return reject(new Error(
-                "Promise does not support operation: " + op
-            ));
-        };
-    }
-    if (inspect === void 0) {
-        inspect = function () {
-            return {state: "unknown"};
-        };
-    }
-
-    var promise = object_create(Promise.prototype);
-
-    promise.promiseDispatch = function (resolve, op, args) {
-        var result;
-        try {
-            if (descriptor[op]) {
-                result = descriptor[op].apply(promise, args);
-            } else {
-                result = fallback.call(promise, op, args);
-            }
-        } catch (exception) {
-            result = reject(exception);
-        }
-        if (resolve) {
-            resolve(result);
-        }
-    };
-
-    promise.inspect = inspect;
-
-    // XXX deprecated `valueOf` and `exception` support
-    if (inspect) {
-        var inspected = inspect();
-        if (inspected.state === "rejected") {
-            promise.exception = inspected.reason;
-        }
-
-        promise.valueOf = function () {
-            var inspected = inspect();
-            if (inspected.state === "pending" ||
-                inspected.state === "rejected") {
-                return promise;
-            }
-            return inspected.value;
-        };
-    }
-
-    return promise;
-}
-
-Promise.prototype.toString = function () {
-    return "[object Promise]";
-};
-
-Promise.prototype.then = function (fulfilled, rejected, progressed) {
-    var self = this;
-    var deferred = defer();
-    var done = false;   // ensure the untrusted promise makes at most a
-                        // single call to one of the callbacks
-
-    function _fulfilled(value) {
-        try {
-            return typeof fulfilled === "function" ? fulfilled(value) : value;
-        } catch (exception) {
-            return reject(exception);
-        }
-    }
-
-    function _rejected(exception) {
-        if (typeof rejected === "function") {
-            makeStackTraceLong(exception, self);
-            try {
-                return rejected(exception);
-            } catch (newException) {
-                return reject(newException);
-            }
-        }
-        return reject(exception);
-    }
-
-    function _progressed(value) {
-        return typeof progressed === "function" ? progressed(value) : value;
-    }
-
-    Q.nextTick(function () {
-        self.promiseDispatch(function (value) {
-            if (done) {
-                return;
-            }
-            done = true;
-
-            deferred.resolve(_fulfilled(value));
-        }, "when", [function (exception) {
-            if (done) {
-                return;
-            }
-            done = true;
-
-            deferred.resolve(_rejected(exception));
-        }]);
-    });
-
-    // Progress propagator need to be attached in the current tick.
-    self.promiseDispatch(void 0, "when", [void 0, function (value) {
-        var newValue;
-        var threw = false;
-        try {
-            newValue = _progressed(value);
-        } catch (e) {
-            threw = true;
-            if (Q.onerror) {
-                Q.onerror(e);
-            } else {
-                throw e;
-            }
-        }
-
-        if (!threw) {
-            deferred.notify(newValue);
-        }
-    }]);
-
-    return deferred.promise;
-};
-
-Q.tap = function (promise, callback) {
-    return Q(promise).tap(callback);
-};
-
-/**
- * Works almost like "finally", but not called for rejections.
- * Original resolution value is passed through callback unaffected.
- * Callback may return a promise that will be awaited for.
- * @param {Function} callback
- * @returns {Q.Promise}
- * @example
- * doSomething()
- *   .then(...)
- *   .tap(console.log)
- *   .then(...);
- */
-Promise.prototype.tap = function (callback) {
-    callback = Q(callback);
-
-    return this.then(function (value) {
-        return callback.fcall(value).thenResolve(value);
-    });
-};
-
-/**
- * Registers an observer on a promise.
- *
- * Guarantees:
- *
- * 1. that fulfilled and rejected will be called only once.
- * 2. that either the fulfilled callback or the rejected callback will be
- *    called, but not both.
- * 3. that fulfilled and rejected will not be called in this turn.
- *
- * @param value      promise or immediate reference to observe
- * @param fulfilled  function to be called with the fulfilled value
- * @param rejected   function to be called with the rejection exception
- * @param progressed function to be called on any progress notifications
- * @return promise for the return value from the invoked callback
- */
-Q.when = when;
-function when(value, fulfilled, rejected, progressed) {
-    return Q(value).then(fulfilled, rejected, progressed);
-}
-
-Promise.prototype.thenResolve = function (value) {
-    return this.then(function () { return value; });
-};
-
-Q.thenResolve = function (promise, value) {
-    return Q(promise).thenResolve(value);
-};
-
-Promise.prototype.thenReject = function (reason) {
-    return this.then(function () { throw reason; });
-};
-
-Q.thenReject = function (promise, reason) {
-    return Q(promise).thenReject(reason);
-};
-
-/**
- * If an object is not a promise, it is as "near" as possible.
- * If a promise is rejected, it is as "near" as possible too.
- * If it’s a fulfilled promise, the fulfillment value is nearer.
- * If it’s a deferred promise and the deferred has been resolved, the
- * resolution is "nearer".
- * @param object
- * @returns most resolved (nearest) form of the object
- */
-
-// XXX should we re-do this?
-Q.nearer = nearer;
-function nearer(value) {
-    if (isPromise(value)) {
-        var inspected = value.inspect();
-        if (inspected.state === "fulfilled") {
-            return inspected.value;
-        }
-    }
-    return value;
-}
-
-/**
- * @returns whether the given object is a promise.
- * Otherwise it is a fulfilled value.
- */
-Q.isPromise = isPromise;
-function isPromise(object) {
-    return object instanceof Promise;
-}
-
-Q.isPromiseAlike = isPromiseAlike;
-function isPromiseAlike(object) {
-    return isObject(object) && typeof object.then === "function";
-}
-
-/**
- * @returns whether the given object is a pending promise, meaning not
- * fulfilled or rejected.
- */
-Q.isPending = isPending;
-function isPending(object) {
-    return isPromise(object) && object.inspect().state === "pending";
-}
-
-Promise.prototype.isPending = function () {
-    return this.inspect().state === "pending";
-};
-
-/**
- * @returns whether the given object is a value or fulfilled
- * promise.
- */
-Q.isFulfilled = isFulfilled;
-function isFulfilled(object) {
-    return !isPromise(object) || object.inspect().state === "fulfilled";
-}
-
-Promise.prototype.isFulfilled = function () {
-    return this.inspect().state === "fulfilled";
-};
-
-/**
- * @returns whether the given object is a rejected promise.
- */
-Q.isRejected = isRejected;
-function isRejected(object) {
-    return isPromise(object) && object.inspect().state === "rejected";
-}
-
-Promise.prototype.isRejected = function () {
-    return this.inspect().state === "rejected";
-};
-
-//// BEGIN UNHANDLED REJECTION TRACKING
-
-// This promise library consumes exceptions thrown in handlers so they can be
-// handled by a subsequent promise.  The exceptions get added to this array when
-// they are created, and removed when they are handled.  Note that in ES6 or
-// shimmed environments, this would naturally be a `Set`.
-var unhandledReasons = [];
-var unhandledRejections = [];
-var reportedUnhandledRejections = [];
-var trackUnhandledRejections = true;
-
-function resetUnhandledRejections() {
-    unhandledReasons.length = 0;
-    unhandledRejections.length = 0;
-
-    if (!trackUnhandledRejections) {
-        trackUnhandledRejections = true;
-    }
-}
-
-function trackRejection(promise, reason) {
-    if (!trackUnhandledRejections) {
-        return;
-    }
-    if (typeof process === "object" && typeof process.emit === "function") {
-        Q.nextTick.runAfter(function () {
-            if (array_indexOf(unhandledRejections, promise) !== -1) {
-                process.emit("unhandledRejection", reason, promise);
-                reportedUnhandledRejections.push(promise);
-            }
-        });
-    }
-
-    unhandledRejections.push(promise);
-    if (reason && typeof reason.stack !== "undefined") {
-        unhandledReasons.push(reason.stack);
-    } else {
-        unhandledReasons.push("(no stack) " + reason);
-    }
-}
-
-function untrackRejection(promise) {
-    if (!trackUnhandledRejections) {
-        return;
-    }
-
-    var at = array_indexOf(unhandledRejections, promise);
-    if (at !== -1) {
-        if (typeof process === "object" && typeof process.emit === "function") {
-            Q.nextTick.runAfter(function () {
-                var atReport = array_indexOf(reportedUnhandledRejections, promise);
-                if (atReport !== -1) {
-                    process.emit("rejectionHandled", unhandledReasons[at], promise);
-                    reportedUnhandledRejections.splice(atReport, 1);
-                }
-            });
-        }
-        unhandledRejections.splice(at, 1);
-        unhandledReasons.splice(at, 1);
-    }
-}
-
-Q.resetUnhandledRejections = resetUnhandledRejections;
-
-Q.getUnhandledReasons = function () {
-    // Make a copy so that consumers can't interfere with our internal state.
-    return unhandledReasons.slice();
-};
-
-Q.stopUnhandledRejectionTracking = function () {
-    resetUnhandledRejections();
-    trackUnhandledRejections = false;
-};
-
-resetUnhandledRejections();
-
-//// END UNHANDLED REJECTION TRACKING
-
-/**
- * Constructs a rejected promise.
- * @param reason value describing the failure
- */
-Q.reject = reject;
-function reject(reason) {
-    var rejection = Promise({
-        "when": function (rejected) {
-            // note that the error has been handled
-            if (rejected) {
-                untrackRejection(this);
-            }
-            return rejected ? rejected(reason) : this;
-        }
-    }, function fallback() {
-        return this;
-    }, function inspect() {
-        return { state: "rejected", reason: reason };
-    });
-
-    // Note that the reason has not been handled.
-    trackRejection(rejection, reason);
-
-    return rejection;
-}
-
-/**
- * Constructs a fulfilled promise for an immediate reference.
- * @param value immediate reference
- */
-Q.fulfill = fulfill;
-function fulfill(value) {
-    return Promise({
-        "when": function () {
-            return value;
-        },
-        "get": function (name) {
-            return value[name];
-        },
-        "set": function (name, rhs) {
-            value[name] = rhs;
-        },
-        "delete": function (name) {
-            delete value[name];
-        },
-        "post": function (name, args) {
-            // Mark Miller proposes that post with no name should apply a
-            // promised function.
-            if (name === null || name === void 0) {
-                return value.apply(void 0, args);
-            } else {
-                return value[name].apply(value, args);
-            }
-        },
-        "apply": function (thisp, args) {
-            return value.apply(thisp, args);
-        },
-        "keys": function () {
-            return object_keys(value);
-        }
-    }, void 0, function inspect() {
-        return { state: "fulfilled", value: value };
-    });
-}
-
-/**
- * Converts thenables to Q promises.
- * @param promise thenable promise
- * @returns a Q promise
- */
-function coerce(promise) {
-    var deferred = defer();
-    Q.nextTick(function () {
-        try {
-            promise.then(deferred.resolve, deferred.reject, deferred.notify);
-        } catch (exception) {
-            deferred.reject(exception);
-        }
-    });
-    return deferred.promise;
-}
-
-/**
- * Annotates an object such that it will never be
- * transferred away from this process over any promise
- * communication channel.
- * @param object
- * @returns promise a wrapping of that object that
- * additionally responds to the "isDef" message
- * without a rejection.
- */
-Q.master = master;
-function master(object) {
-    return Promise({
-        "isDef": function () {}
-    }, function fallback(op, args) {
-        return dispatch(object, op, args);
-    }, function () {
-        return Q(object).inspect();
-    });
-}
-
-/**
- * Spreads the values of a promised array of arguments into the
- * fulfillment callback.
- * @param fulfilled callback that receives variadic arguments from the
- * promised array
- * @param rejected callback that receives the exception if the promise
- * is rejected.
- * @returns a promise for the return value or thrown exception of
- * either callback.
- */
-Q.spread = spread;
-function spread(value, fulfilled, rejected) {
-    return Q(value).spread(fulfilled, rejected);
-}
-
-Promise.prototype.spread = function (fulfilled, rejected) {
-    return this.all().then(function (array) {
-        return fulfilled.apply(void 0, array);
-    }, rejected);
-};
-
-/**
- * The async function is a decorator for generator functions, turning
- * them into asynchronous generators.  Although generators are only part
- * of the newest ECMAScript 6 drafts, this code does not cause syntax
- * errors in older engines.  This code should continue to work and will
- * in fact improve over time as the language improves.
- *
- * ES6 generators are currently part of V8 version 3.19 with the
- * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
- * for longer, but under an older Python-inspired form.  This function
- * works on both kinds of generators.
- *
- * Decorates a generator function such that:
- *  - it may yield promises
- *  - execution will continue when that promise is fulfilled
- *  - the value of the yield expression will be the fulfilled value
- *  - it returns a promise for the return value (when the generator
- *    stops iterating)
- *  - the decorated function returns a promise for the return value
- *    of the generator or the first rejected promise among those
- *    yielded.
- *  - if an error is thrown in the generator, it propagates through
- *    every following yield until it is caught, or until it escapes
- *    the generator function altogether, and is translated into a
- *    rejection for the promise returned by the decorated generator.
- */
-Q.async = async;
-function async(makeGenerator) {
-    return function () {
-        // when verb is "send", arg is a value
-        // when verb is "throw", arg is an exception
-        function continuer(verb, arg) {
-            var result;
-
-            // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
-            // engine that has a deployed base of browsers that support generators.
-            // However, SM's generators use the Python-inspired semantics of
-            // outdated ES6 drafts.  We would like to support ES6, but we'd also
-            // like to make it possible to use generators in deployed browsers, so
-            // we also support Python-style generators.  At some point we can remove
-            // this block.
-
-            if (typeof StopIteration === "undefined") {
-                // ES6 Generators
-                try {
-                    result = generator[verb](arg);
-                } catch (exception) {
-                    return reject(exception);
-                }
-                if (result.done) {
-                    return Q(result.value);
-                } else {
-                    return when(result.value, callback, errback);
-                }
-            } else {
-                // SpiderMonkey Generators
-                // FIXME: Remove this case when SM does ES6 generators.
-                try {
-                    result = generator[verb](arg);
-                } catch (exception) {
-                    if (isStopIteration(exception)) {
-                        return Q(exception.value);
-                    } else {
-                        return reject(exception);
-                    }
-                }
-                return when(result, callback, errback);
-            }
-        }
-        var generator = makeGenerator.apply(this, arguments);
-        var callback = continuer.bind(continuer, "next");
-        var errback = continuer.bind(continuer, "throw");
-        return callback();
-    };
-}
-
-/**
- * The spawn function is a small wrapper around async that immediately
- * calls the generator and also ends the promise chain, so that any
- * unhandled errors are thrown instead of forwarded to the error
- * handler. This is useful because it's extremely common to run
- * generators at the top-level to work with libraries.
- */
-Q.spawn = spawn;
-function spawn(makeGenerator) {
-    Q.done(Q.async(makeGenerator)());
-}
-
-// FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
-/**
- * Throws a ReturnValue exception to stop an asynchronous generator.
- *
- * This interface is a stop-gap measure to support generator return
- * values in older Firefox/SpiderMonkey.  In browsers that support ES6
- * generators like Chromium 29, just use "return" in your generator
- * functions.
- *
- * @param value the return value for the surrounding generator
- * @throws ReturnValue exception with the value.
- * @example
- * // ES6 style
- * Q.async(function* () {
- *      var foo = yield getFooPromise();
- *      var bar = yield getBarPromise();
- *      return foo + bar;
- * })
- * // Older SpiderMonkey style
- * Q.async(function () {
- *      var foo = yield getFooPromise();
- *      var bar = yield getBarPromise();
- *      Q.return(foo + bar);
- * })
- */
-Q["return"] = _return;
-function _return(value) {
-    throw new QReturnValue(value);
-}
-
-/**
- * The promised function decorator ensures that any promise arguments
- * are settled and passed as values (`this` is also settled and passed
- * as a value).  It will also ensure that the result of a function is
- * always a promise.
- *
- * @example
- * var add = Q.promised(function (a, b) {
- *     return a + b;
- * });
- * add(Q(a), Q(B));
- *
- * @param {function} callback The function to decorate
- * @returns {function} a function that has been decorated.
- */
-Q.promised = promised;
-function promised(callback) {
-    return function () {
-        return spread([this, all(arguments)], function (self, args) {
-            return callback.apply(self, args);
-        });
-    };
-}
-
-/**
- * sends a message to a value in a future turn
- * @param object* the recipient
- * @param op the name of the message operation, e.g., "when",
- * @param args further arguments to be forwarded to the operation
- * @returns result {Promise} a promise for the result of the operation
- */
-Q.dispatch = dispatch;
-function dispatch(object, op, args) {
-    return Q(object).dispatch(op, args);
-}
-
-Promise.prototype.dispatch = function (op, args) {
-    var self = this;
-    var deferred = defer();
-    Q.nextTick(function () {
-        self.promiseDispatch(deferred.resolve, op, args);
-    });
-    return deferred.promise;
-};
-
-/**
- * Gets the value of a property in a future turn.
- * @param object    promise or immediate reference for target object
- * @param name      name of property to get
- * @return promise for the property value
- */
-Q.get = function (object, key) {
-    return Q(object).dispatch("get", [key]);
-};
-
-Promise.prototype.get = function (key) {
-    return this.dispatch("get", [key]);
-};
-
-/**
- * Sets the value of a property in a future turn.
- * @param object    promise or immediate reference for object object
- * @param name      name of property to set
- * @param value     new value of property
- * @return promise for the return value
- */
-Q.set = function (object, key, value) {
-    return Q(object).dispatch("set", [key, value]);
-};
-
-Promise.prototype.set = function (key, value) {
-    return this.dispatch("set", [key, value]);
-};
-
-/**
- * Deletes a property in a future turn.
- * @param object    promise or immediate reference for target object
- * @param name      name of property to delete
- * @return promise for the return value
- */
-Q.del = // XXX legacy
-Q["delete"] = function (object, key) {
-    return Q(object).dispatch("delete", [key]);
-};
-
-Promise.prototype.del = // XXX legacy
-Promise.prototype["delete"] = function (key) {
-    return this.dispatch("delete", [key]);
-};
-
-/**
- * Invokes a method in a future turn.
- * @param object    promise or immediate reference for target object
- * @param name      name of method to invoke
- * @param value     a value to post, typically an array of
- *                  invocation arguments for promises that
- *                  are ultimately backed with `resolve` values,
- *                  as opposed to those backed with URLs
- *                  wherein the posted value can be any
- *                  JSON serializable object.
- * @return promise for the return value
- */
-// bound locally because it is used by other methods
-Q.mapply = // XXX As proposed by "Redsandro"
-Q.post = function (object, name, args) {
-    return Q(object).dispatch("post", [name, args]);
-};
-
-Promise.prototype.mapply = // XXX As proposed by "Redsandro"
-Promise.prototype.post = function (name, args) {
-    return this.dispatch("post", [name, args]);
-};
-
-/**
- * Invokes a method in a future turn.
- * @param object    promise or immediate reference for target object
- * @param name      name of method to invoke
- * @param ...args   array of invocation arguments
- * @return promise for the return value
- */
-Q.send = // XXX Mark Miller's proposed parlance
-Q.mcall = // XXX As proposed by "Redsandro"
-Q.invoke = function (object, name /*...args*/) {
-    return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
-};
-
-Promise.prototype.send = // XXX Mark Miller's proposed parlance
-Promise.prototype.mcall = // XXX As proposed by "Redsandro"
-Promise.prototype.invoke = function (name /*...args*/) {
-    return this.dispatch("post", [name, array_slice(arguments, 1)]);
-};
-
-/**
- * Applies the promised function in a future turn.
- * @param object    promise or immediate reference for target function
- * @param args      array of application arguments
- */
-Q.fapply = function (object, args) {
-    return Q(object).dispatch("apply", [void 0, args]);
-};
-
-Promise.prototype.fapply = function (args) {
-    return this.dispatch("apply", [void 0, args]);
-};
-
-/**
- * Calls the promised function in a future turn.
- * @param object    promise or immediate reference for target function
- * @param ...args   array of application arguments
- */
-Q["try"] =
-Q.fcall = function (object /* ...args*/) {
-    return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
-};
-
-Promise.prototype.fcall = function (/*...args*/) {
-    return this.dispatch("apply", [void 0, array_slice(arguments)]);
-};
-
-/**
- * Binds the promised function, transforming return values into a fulfilled
- * promise and thrown errors into a rejected one.
- * @param object    promise or immediate reference for target function
- * @param ...args   array of application arguments
- */
-Q.fbind = function (object /*...args*/) {
-    var promise = Q(object);
-    var args = array_slice(arguments, 1);
-    return function fbound() {
-        return promise.dispatch("apply", [
-            this,
-            args.concat(array_slice(arguments))
-        ]);
-    };
-};
-Promise.prototype.fbind = function (/*...args*/) {
-    var promise = this;
-    var args = array_slice(arguments);
-    return function fbound() {
-        return promise.dispatch("apply", [
-            this,
-            args.concat(array_slice(arguments))
-        ]);
-    };
-};
-
-/**
- * Requests the names of the owned properties of a promised
- * object in a future turn.
- * @param object    promise or immediate reference for target object
- * @return promise for the keys of the eventually settled object
- */
-Q.keys = function (object) {
-    return Q(object).dispatch("keys", []);
-};
-
-Promise.prototype.keys = function () {
-    return this.dispatch("keys", []);
-};
-
-/**
- * Turns an array of promises into a promise for an array.  If any of
- * the promises gets rejected, the whole array is rejected immediately.
- * @param {Array*} an array (or promise for an array) of values (or
- * promises for values)
- * @returns a promise for an array of the corresponding values
- */
-// By Mark Miller
-// http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
-Q.all = all;
-function all(promises) {
-    return when(promises, function (promises) {
-        var pendingCount = 0;
-        var deferred = defer();
-        array_reduce(promises, function (undefined, promise, index) {
-            var snapshot;
-            if (
-                isPromise(promise) &&
-                (snapshot = promise.inspect()).state === "fulfilled"
-            ) {
-                promises[index] = snapshot.value;
-            } else {
-                ++pendingCount;
-                when(
-                    promise,
-                    function (value) {
-                        promises[index] = value;
-                        if (--pendingCount === 0) {
-                            deferred.resolve(promises);
-                        }
-                    },
-                    deferred.reject,
-                    function (progress) {
-                        deferred.notify({ index: index, value: progress });
-                    }
-                );
-            }
-        }, void 0);
-        if (pendingCount === 0) {
-            deferred.resolve(promises);
-        }
-        return deferred.promise;
-    });
-}
-
-Promise.prototype.all = function () {
-    return all(this);
-};
-
-/**
- * Returns the first resolved promise of an array. Prior rejected promises are
- * ignored.  Rejects only if all promises are rejected.
- * @param {Array*} an array containing values or promises for values
- * @returns a promise fulfilled with the value of the first resolved promise,
- * or a rejected promise if all promises are rejected.
- */
-Q.any = any;
-
-function any(promises) {
-    if (promises.length === 0) {
-        return Q.resolve();
-    }
-
-    var deferred = Q.defer();
-    var pendingCount = 0;
-    array_reduce(promises, function (prev, current, index) {
-        var promise = promises[index];
-
-        pendingCount++;
-
-        when(promise, onFulfilled, onRejected, onProgress);
-        function onFulfilled(result) {
-            deferred.resolve(result);
-        }
-        function onRejected(err) {
-            pendingCount--;
-            if (pendingCount === 0) {
-                var rejection = err || new Error("" + err);
-
-                rejection.message = ("Q can't get fulfillment value from any promise, all " +
-                    "promises were rejected. Last error message: " + rejection.message);
-
-                deferred.reject(rejection);
-            }
-        }
-        function onProgress(progress) {
-            deferred.notify({
-                index: index,
-                value: progress
-            });
-        }
-    }, undefined);
-
-    return deferred.promise;
-}
-
-Promise.prototype.any = function () {
-    return any(this);
-};
-
-/**
- * Waits for all promises to be settled, either fulfilled or
- * rejected.  This is distinct from `all` since that would stop
- * waiting at the first rejection.  The promise returned by
- * `allResolved` will never be rejected.
- * @param promises a promise for an array (or an array) of promises
- * (or values)
- * @return a promise for an array of promises
- */
-Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
-function allResolved(promises) {
-    return when(promises, function (promises) {
-        promises = array_map(promises, Q);
-        return when(all(array_map(promises, function (promise) {
-            return when(promise, noop, noop);
-        })), function () {
-            return promises;
-        });
-    });
-}
-
-Promise.prototype.allResolved = function () {
-    return allResolved(this);
-};
-
-/**
- * @see Promise#allSettled
- */
-Q.allSettled = allSettled;
-function allSettled(promises) {
-    return Q(promises).allSettled();
-}
-
-/**
- * Turns an array of promises into a promise for an array of their states (as
- * returned by `inspect`) when they have all settled.
- * @param {Array[Any*]} values an array (or promise for an array) of values (or
- * promises for values)
- * @returns {Array[State]} an array of states for the respective values.
- */
-Promise.prototype.allSettled = function () {
-    return this.then(function (promises) {
-        return all(array_map(promises, function (promise) {
-            promise = Q(promise);
-            function regardless() {
-                return promise.inspect();
-            }
-            return promise.then(regardless, regardless);
-        }));
-    });
-};
-
-/**
- * Captures the failure of a promise, giving an oportunity to recover
- * with a callback.  If the given promise is fulfilled, the returned
- * promise is fulfilled.
- * @param {Any*} promise for something
- * @param {Function} callback to fulfill the returned promise if the
- * given promise is rejected
- * @returns a promise for the return value of the callback
- */
-Q.fail = // XXX legacy
-Q["catch"] = function (object, rejected) {
-    return Q(object).then(void 0, rejected);
-};
-
-Promise.prototype.fail = // XXX legacy
-Promise.prototype["catch"] = function (rejected) {
-    return this.then(void 0, rejected);
-};
-
-/**
- * Attaches a listener that can respond to progress notifications from a
- * promise's originating deferred. This listener receives the exact arguments
- * passed to ``deferred.notify``.
- * @param {Any*} promise for something
- * @param {Function} callback to receive any progress notifications
- * @returns the given promise, unchanged
- */
-Q.progress = progress;
-function progress(object, progressed) {
-    return Q(object).then(void 0, void 0, progressed);
-}
-
-Promise.prototype.progress = function (progressed) {
-    return this.then(void 0, void 0, progressed);
-};
-
-/**
- * Provides an opportunity to observe the settling of a promise,
- * regardless of whether the promise is fulfilled or rejected.  Forwards
- * the resolution to the returned promise when the callback is done.
- * The callback can return a promise to defer completion.
- * @param {Any*} promise
- * @param {Function} callback to observe the resolution of the given
- * promise, takes no arguments.
- * @returns a promise for the resolution of the given promise when
- * ``fin`` is done.
- */
-Q.fin = // XXX legacy
-Q["finally"] = function (object, callback) {
-    return Q(object)["finally"](callback);
-};
-
-Promise.prototype.fin = // XXX legacy
-Promise.prototype["finally"] = function (callback) {
-    if (!callback || typeof callback.apply !== "function") {
-        throw new Error("Q can't apply finally callback");
-    }
-    callback = Q(callback);
-    return this.then(function (value) {
-        return callback.fcall().then(function () {
-            return value;
-        });
-    }, function (reason) {
-        // TODO attempt to recycle the rejection with "this".
-        return callback.fcall().then(function () {
-            throw reason;
-        });
-    });
-};
-
-/**
- * Terminates a chain of promises, forcing rejections to be
- * thrown as exceptions.
- * @param {Any*} promise at the end of a chain of promises
- * @returns nothing
- */
-Q.done = function (object, fulfilled, rejected, progress) {
-    return Q(object).done(fulfilled, rejected, progress);
-};
-
-Promise.prototype.done = function (fulfilled, rejected, progress) {
-    var onUnhandledError = function (error) {
-        // forward to a future turn so that ``when``
-        // does not catch it and turn it into a rejection.
-        Q.nextTick(function () {
-            makeStackTraceLong(error, promise);
-            if (Q.onerror) {
-                Q.onerror(error);
-            } else {
-                throw error;
-            }
-        });
-    };
-
-    // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
-    var promise = fulfilled || rejected || progress ?
-        this.then(fulfilled, rejected, progress) :
-        this;
-
-    if (typeof process === "object" && process && process.domain) {
-        onUnhandledError = process.domain.bind(onUnhandledError);
-    }
-
-    promise.then(void 0, onUnhandledError);
-};
-
-/**
- * Causes a promise to be rejected if it does not get fulfilled before
- * some milliseconds time out.
- * @param {Any*} promise
- * @param {Number} milliseconds timeout
- * @param {Any*} custom error message or Error object (optional)
- * @returns a promise for the resolution of the given promise if it is
- * fulfilled before the timeout, otherwise rejected.
- */
-Q.timeout = function (object, ms, error) {
-    return Q(object).timeout(ms, error);
-};
-
-Promise.prototype.timeout = function (ms, error) {
-    var deferred = defer();
-    var timeoutId = setTimeout(function () {
-        if (!error || "string" === typeof error) {
-            error = new Error(error || "Timed out after " + ms + " ms");
-            error.code = "ETIMEDOUT";
-        }
-        deferred.reject(error);
-    }, ms);
-
-    this.then(function (value) {
-        clearTimeout(timeoutId);
-        deferred.resolve(value);
-    }, function (exception) {
-        clearTimeout(timeoutId);
-        deferred.reject(exception);
-    }, deferred.notify);
-
-    return deferred.promise;
-};
-
-/**
- * Returns a promise for the given value (or promised value), some
- * milliseconds after it resolved. Passes rejections immediately.
- * @param {Any*} promise
- * @param {Number} milliseconds
- * @returns a promise for the resolution of the given promise after milliseconds
- * time has elapsed since the resolution of the given promise.
- * If the given promise rejects, that is passed immediately.
- */
-Q.delay = function (object, timeout) {
-    if (timeout === void 0) {
-        timeout = object;
-        object = void 0;
-    }
-    return Q(object).delay(timeout);
-};
-
-Promise.prototype.delay = function (timeout) {
-    return this.then(function (value) {
-        var deferred = defer();
-        setTimeout(function () {
-            deferred.resolve(value);
-        }, timeout);
-        return deferred.promise;
-    });
-};
-
-/**
- * Passes a continuation to a Node function, which is called with the given
- * arguments provided as an array, and returns a promise.
- *
- *      Q.nfapply(FS.readFile, [__filename])
- *      .then(function (content) {
- *      })
- *
- */
-Q.nfapply = function (callback, args) {
-    return Q(callback).nfapply(args);
-};
-
-Promise.prototype.nfapply = function (args) {
-    var deferred = defer();
-    var nodeArgs = array_slice(args);
-    nodeArgs.push(deferred.makeNodeResolver());
-    this.fapply(nodeArgs).fail(deferred.reject);
-    return deferred.promise;
-};
-
-/**
- * Passes a continuation to a Node function, which is called with the given
- * arguments provided individually, and returns a promise.
- * @example
- * Q.nfcall(FS.readFile, __filename)
- * .then(function (content) {
- * })
- *
- */
-Q.nfcall = function (callback /*...args*/) {
-    var args = array_slice(arguments, 1);
-    return Q(callback).nfapply(args);
-};
-
-Promise.prototype.nfcall = function (/*...args*/) {
-    var nodeArgs = array_slice(arguments);
-    var deferred = defer();
-    nodeArgs.push(deferred.makeNodeResolver());
-    this.fapply(nodeArgs).fail(deferred.reject);
-    return deferred.promise;
-};
-
-/**
- * Wraps a NodeJS continuation passing function and returns an equivalent
- * version that returns a promise.
- * @example
- * Q.nfbind(FS.readFile, __filename)("utf-8")
- * .then(console.log)
- * .done()
- */
-Q.nfbind =
-Q.denodeify = function (callback /*...args*/) {
-    if (callback === undefined) {
-        throw new Error("Q can't wrap an undefined function");
-    }
-    var baseArgs = array_slice(arguments, 1);
-    return function () {
-        var nodeArgs = baseArgs.concat(array_slice(arguments));
-        var deferred = defer();
-        nodeArgs.push(deferred.makeNodeResolver());
-        Q(callback).fapply(nodeArgs).fail(deferred.reject);
-        return deferred.promise;
-    };
-};
-
-Promise.prototype.nfbind =
-Promise.prototype.denodeify = function (/*...args*/) {
-    var args = array_slice(arguments);
-    args.unshift(this);
-    return Q.denodeify.apply(void 0, args);
-};
-
-Q.nbind = function (callback, thisp /*...args*/) {
-    var baseArgs = array_slice(arguments, 2);
-    return function () {
-        var nodeArgs = baseArgs.concat(array_slice(arguments));
-        var deferred = defer();
-        nodeArgs.push(deferred.makeNodeResolver());
-        function bound() {
-            return callback.apply(thisp, arguments);
-        }
-        Q(bound).fapply(nodeArgs).fail(deferred.reject);
-        return deferred.promise;
-    };
-};
-
-Promise.prototype.nbind = function (/*thisp, ...args*/) {
-    var args = array_slice(arguments, 0);
-    args.unshift(this);
-    return Q.nbind.apply(void 0, args);
-};
-
-/**
- * Calls a method of a Node-style object that accepts a Node-style
- * callback with a given array of arguments, plus a provided callback.
- * @param object an object that has the named method
- * @param {String} name name of the method of object
- * @param {Array} args arguments to pass to the method; the callback
- * will be provided by Q and appended to these arguments.
- * @returns a promise for the value or error
- */
-Q.nmapply = // XXX As proposed by "Redsandro"
-Q.npost = function (object, name, args) {
-    return Q(object).npost(name, args);
-};
-
-Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
-Promise.prototype.npost = function (name, args) {
-    var nodeArgs = array_slice(args || []);
-    var deferred = defer();
-    nodeArgs.push(deferred.makeNodeResolver());
-    this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
-    return deferred.promise;
-};
-
-/**
- * Calls a method of a Node-style object that accepts a Node-style
- * callback, forwarding the given variadic arguments, plus a provided
- * callback argument.
- * @param object an object that has the named method
- * @param {String} name name of the method of object
- * @param ...args arguments to pass to the method; the callback will
- * be provided by Q and appended to these arguments.
- * @returns a promise for the value or error
- */
-Q.nsend = // XXX Based on Mark Miller's proposed "send"
-Q.nmcall = // XXX Based on "Redsandro's" proposal
-Q.ninvoke = function (object, name /*...args*/) {
-    var nodeArgs = array_slice(arguments, 2);
-    var deferred = defer();
-    nodeArgs.push(deferred.makeNodeResolver());
-    Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
-    return deferred.promise;
-};
-
-Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
-Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
-Promise.prototype.ninvoke = function (name /*...args*/) {
-    var nodeArgs = array_slice(arguments, 1);
-    var deferred = defer();
-    nodeArgs.push(deferred.makeNodeResolver());
-    this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
-    return deferred.promise;
-};
-
-/**
- * If a function would like to support both Node continuation-passing-style and
- * promise-returning-style, it can end its internal promise chain with
- * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
- * elects to use a nodeback, the result will be sent there.  If they do not
- * pass a nodeback, they will receive the result promise.
- * @param object a result (or a promise for a result)
- * @param {Function} nodeback a Node.js-style callback
- * @returns either the promise or nothing
- */
-Q.nodeify = nodeify;
-function nodeify(object, nodeback) {
-    return Q(object).nodeify(nodeback);
-}
-
-Promise.prototype.nodeify = function (nodeback) {
-    if (nodeback) {
-        this.then(function (value) {
-            Q.nextTick(function () {
-                nodeback(null, value);
-            });
-        }, function (error) {
-            Q.nextTick(function () {
-                nodeback(error);
-            });
-        });
-    } else {
-        return this;
-    }
-};
-
-Q.noConflict = function() {
-    throw new Error("Q.noConflict only works when Q is used as a global");
-};
-
-// All code before this point will be filtered from stack traces.
-var qEndingLine = captureLine();
-
-return Q;
-
-});
diff --git a/node_modules/q/queue.js b/node_modules/q/queue.js
deleted file mode 100644
index 1505fd0b369a44ee62081501b5a0454f11b9d918..0000000000000000000000000000000000000000
--- a/node_modules/q/queue.js
+++ /dev/null
@@ -1,35 +0,0 @@
-
-var Q = require("./q");
-
-module.exports = Queue;
-function Queue() {
-    var ends = Q.defer();
-    var closed = Q.defer();
-    return {
-        put: function (value) {
-            var next = Q.defer();
-            ends.resolve({
-                head: value,
-                tail: next.promise
-            });
-            ends.resolve = next.resolve;
-        },
-        get: function () {
-            var result = ends.promise.get("head");
-            ends.promise = ends.promise.get("tail");
-            return result.fail(function (error) {
-                closed.resolve(error);
-                throw error;
-            });
-        },
-        closed: closed.promise,
-        close: function (error) {
-            error = error || new Error("Can't get value from closed queue");
-            var end = {head: Q.reject(error)};
-            end.tail = end;
-            ends.resolve(end);
-            return closed.promise;
-        }
-    };
-}
-
diff --git a/node_modules/range-parser/HISTORY.md b/node_modules/range-parser/HISTORY.md
deleted file mode 100644
index 70a973d800ef108fda6ee25ad76ec626594b656d..0000000000000000000000000000000000000000
--- a/node_modules/range-parser/HISTORY.md
+++ /dev/null
@@ -1,56 +0,0 @@
-1.2.1 / 2019-05-10
-==================
-
-  * Improve error when `str` is not a string
-
-1.2.0 / 2016-06-01
-==================
-
-  * Add `combine` option to combine overlapping ranges
-
-1.1.0 / 2016-05-13
-==================
-
-  * Fix incorrectly returning -1 when there is at least one valid range
-  * perf: remove internal function
-
-1.0.3 / 2015-10-29
-==================
-
-  * perf: enable strict mode
-
-1.0.2 / 2014-09-08
-==================
-
-  * Support Node.js 0.6
-
-1.0.1 / 2014-09-07
-==================
-
-  * Move repository to jshttp
-
-1.0.0 / 2013-12-11
-==================
-
-  * Add repository to package.json
-  * Add MIT license
-
-0.0.4 / 2012-06-17
-==================
-
-  * Change ret -1 for unsatisfiable and -2 when invalid
-
-0.0.3 / 2012-06-17
-==================
-
-  * Fix last-byte-pos default to len - 1
-
-0.0.2 / 2012-06-14
-==================
-
-  * Add `.type`
-
-0.0.1 / 2012-06-11
-==================
-
-  * Initial release
diff --git a/node_modules/range-parser/LICENSE b/node_modules/range-parser/LICENSE
deleted file mode 100644
index 359995436311ca2c69c0d05c1b7ad389aa63e9b9..0000000000000000000000000000000000000000
--- a/node_modules/range-parser/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2012-2014 TJ Holowaychuk <tj@vision-media.ca>
-Copyright (c) 2015-2016 Douglas Christopher Wilson <doug@somethingdoug.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/range-parser/README.md b/node_modules/range-parser/README.md
deleted file mode 100644
index c247e826e67075a49071a07f830fadc62d28d86a..0000000000000000000000000000000000000000
--- a/node_modules/range-parser/README.md
+++ /dev/null
@@ -1,84 +0,0 @@
-# range-parser
-
-[![NPM Version][npm-version-image]][npm-url]
-[![NPM Downloads][npm-downloads-image]][npm-url]
-[![Node.js Version][node-image]][node-url]
-[![Build Status][travis-image]][travis-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-Range header field parser.
-
-## Installation
-
-This is a [Node.js](https://nodejs.org/en/) module available through the
-[npm registry](https://www.npmjs.com/). Installation is done using the
-[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
-
-```sh
-$ npm install range-parser
-```
-
-## API
-
-<!-- eslint-disable no-unused-vars -->
-
-```js
-var parseRange = require('range-parser')
-```
-
-### parseRange(size, header, options)
-
-Parse the given `header` string where `size` is the maximum size of the resource.
-An array of ranges will be returned or negative numbers indicating an error parsing.
-
-  * `-2` signals a malformed header string
-  * `-1` signals an unsatisfiable range
-
-<!-- eslint-disable no-undef -->
-
-```js
-// parse header from request
-var range = parseRange(size, req.headers.range)
-
-// the type of the range
-if (range.type === 'bytes') {
-  // the ranges
-  range.forEach(function (r) {
-    // do something with r.start and r.end
-  })
-}
-```
-
-#### Options
-
-These properties are accepted in the options object.
-
-##### combine
-
-Specifies if overlapping & adjacent ranges should be combined, defaults to `false`.
-When `true`, ranges will be combined and returned as if they were specified that
-way in the header.
-
-<!-- eslint-disable no-undef -->
-
-```js
-parseRange(100, 'bytes=50-55,0-10,5-10,56-60', { combine: true })
-// => [
-//      { start: 0,  end: 10 },
-//      { start: 50, end: 60 }
-//    ]
-```
-
-## License
-
-[MIT](LICENSE)
-
-[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/range-parser/master
-[coveralls-url]: https://coveralls.io/r/jshttp/range-parser?branch=master
-[node-image]: https://badgen.net/npm/node/range-parser
-[node-url]: https://nodejs.org/en/download
-[npm-downloads-image]: https://badgen.net/npm/dm/range-parser
-[npm-url]: https://npmjs.org/package/range-parser
-[npm-version-image]: https://badgen.net/npm/v/range-parser
-[travis-image]: https://badgen.net/travis/jshttp/range-parser/master
-[travis-url]: https://travis-ci.org/jshttp/range-parser
diff --git a/node_modules/range-parser/index.js b/node_modules/range-parser/index.js
deleted file mode 100644
index b7dc5c0f15fe00172c496cae3bc48f238a3a8469..0000000000000000000000000000000000000000
--- a/node_modules/range-parser/index.js
+++ /dev/null
@@ -1,162 +0,0 @@
-/*!
- * range-parser
- * Copyright(c) 2012-2014 TJ Holowaychuk
- * Copyright(c) 2015-2016 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = rangeParser
-
-/**
- * Parse "Range" header `str` relative to the given file `size`.
- *
- * @param {Number} size
- * @param {String} str
- * @param {Object} [options]
- * @return {Array}
- * @public
- */
-
-function rangeParser (size, str, options) {
-  if (typeof str !== 'string') {
-    throw new TypeError('argument str must be a string')
-  }
-
-  var index = str.indexOf('=')
-
-  if (index === -1) {
-    return -2
-  }
-
-  // split the range string
-  var arr = str.slice(index + 1).split(',')
-  var ranges = []
-
-  // add ranges type
-  ranges.type = str.slice(0, index)
-
-  // parse all ranges
-  for (var i = 0; i < arr.length; i++) {
-    var range = arr[i].split('-')
-    var start = parseInt(range[0], 10)
-    var end = parseInt(range[1], 10)
-
-    // -nnn
-    if (isNaN(start)) {
-      start = size - end
-      end = size - 1
-    // nnn-
-    } else if (isNaN(end)) {
-      end = size - 1
-    }
-
-    // limit last-byte-pos to current length
-    if (end > size - 1) {
-      end = size - 1
-    }
-
-    // invalid or unsatisifiable
-    if (isNaN(start) || isNaN(end) || start > end || start < 0) {
-      continue
-    }
-
-    // add range
-    ranges.push({
-      start: start,
-      end: end
-    })
-  }
-
-  if (ranges.length < 1) {
-    // unsatisifiable
-    return -1
-  }
-
-  return options && options.combine
-    ? combineRanges(ranges)
-    : ranges
-}
-
-/**
- * Combine overlapping & adjacent ranges.
- * @private
- */
-
-function combineRanges (ranges) {
-  var ordered = ranges.map(mapWithIndex).sort(sortByRangeStart)
-
-  for (var j = 0, i = 1; i < ordered.length; i++) {
-    var range = ordered[i]
-    var current = ordered[j]
-
-    if (range.start > current.end + 1) {
-      // next range
-      ordered[++j] = range
-    } else if (range.end > current.end) {
-      // extend range
-      current.end = range.end
-      current.index = Math.min(current.index, range.index)
-    }
-  }
-
-  // trim ordered array
-  ordered.length = j + 1
-
-  // generate combined range
-  var combined = ordered.sort(sortByRangeIndex).map(mapWithoutIndex)
-
-  // copy ranges type
-  combined.type = ranges.type
-
-  return combined
-}
-
-/**
- * Map function to add index value to ranges.
- * @private
- */
-
-function mapWithIndex (range, index) {
-  return {
-    start: range.start,
-    end: range.end,
-    index: index
-  }
-}
-
-/**
- * Map function to remove index value from ranges.
- * @private
- */
-
-function mapWithoutIndex (range) {
-  return {
-    start: range.start,
-    end: range.end
-  }
-}
-
-/**
- * Sort function to sort ranges by index.
- * @private
- */
-
-function sortByRangeIndex (a, b) {
-  return a.index - b.index
-}
-
-/**
- * Sort function to sort ranges by start position.
- * @private
- */
-
-function sortByRangeStart (a, b) {
-  return a.start - b.start
-}
diff --git a/node_modules/range-parser/package.json b/node_modules/range-parser/package.json
deleted file mode 100644
index abea6d852e9baa772152be996c4a6ed5b2e8e514..0000000000000000000000000000000000000000
--- a/node_modules/range-parser/package.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "name": "range-parser",
-  "author": "TJ Holowaychuk <tj@vision-media.ca> (http://tjholowaychuk.com)",
-  "description": "Range header field string parser",
-  "version": "1.2.1",
-  "contributors": [
-    "Douglas Christopher Wilson <doug@somethingdoug.com>",
-    "James Wyatt Cready <wyatt.cready@lanetix.com>",
-    "Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"
-  ],
-  "license": "MIT",
-  "keywords": [
-    "range",
-    "parser",
-    "http"
-  ],
-  "repository": "jshttp/range-parser",
-  "devDependencies": {
-    "deep-equal": "1.0.1",
-    "eslint": "5.16.0",
-    "eslint-config-standard": "12.0.0",
-    "eslint-plugin-markdown": "1.0.0",
-    "eslint-plugin-import": "2.17.2",
-    "eslint-plugin-node": "8.0.1",
-    "eslint-plugin-promise": "4.1.1",
-    "eslint-plugin-standard": "4.0.0",
-    "mocha": "6.1.4",
-    "nyc": "14.1.1"
-  },
-  "files": [
-    "HISTORY.md",
-    "LICENSE",
-    "index.js"
-  ],
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "scripts": {
-    "lint": "eslint --plugin markdown --ext js,md .",
-    "test": "mocha --reporter spec",
-    "test-cov": "nyc --reporter=html --reporter=text npm test",
-    "test-travis": "nyc --reporter=text npm test"
-  }
-}
diff --git a/node_modules/readable-stream/.npmignore b/node_modules/readable-stream/.npmignore
deleted file mode 100644
index 38344f87a627666b74f24036111558589b0bf508..0000000000000000000000000000000000000000
--- a/node_modules/readable-stream/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-build/
-test/
-examples/
-fs.js
-zlib.js
\ No newline at end of file
diff --git a/node_modules/readable-stream/LICENSE b/node_modules/readable-stream/LICENSE
deleted file mode 100644
index e3d4e695a4cff2bf9c1da6c69841ca22bc9f0224..0000000000000000000000000000000000000000
--- a/node_modules/readable-stream/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-Copyright Joyent, Inc. and other Node contributors. All rights reserved.
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
diff --git a/node_modules/readable-stream/README.md b/node_modules/readable-stream/README.md
deleted file mode 100644
index 3fb3e8023eb3bd323487a2317defcce20b310b94..0000000000000000000000000000000000000000
--- a/node_modules/readable-stream/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# readable-stream
-
-***Node-core streams for userland***
-
-[![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/)
-
-This package is a mirror of the Streams2 and Streams3 implementations in Node-core.
-
-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.
-
-**readable-stream** comes in two major versions, v1.0.x and v1.1.x. The former tracks the Streams2 implementation in Node 0.10, including bug-fixes and minor improvements as they are added. The latter tracks Streams3 as it develops in Node 0.11; we will likely see a v1.2.x branch for Node 0.12.
-
-**readable-stream** uses proper patch-level versioning so if you pin to `"~1.0.0"` you’ll get the latest Node 0.10 Streams2 implementation, including any fixes and minor non-breaking improvements. The patch-level versions of 1.0.x and 1.1.x should mirror the patch-level versions of Node-core releases. You should prefer the **1.0.x** releases for now and when you’re ready to start using Streams3, pin to `"~1.1.0"`
-
diff --git a/node_modules/readable-stream/duplex.js b/node_modules/readable-stream/duplex.js
deleted file mode 100644
index ca807af87620dd789b4f72984b813618fc1a76ff..0000000000000000000000000000000000000000
--- a/node_modules/readable-stream/duplex.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_duplex.js")
diff --git a/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/readable-stream/lib/_stream_duplex.js
deleted file mode 100644
index b513d61a963a4099d226be27850bb7c6edb8fc55..0000000000000000000000000000000000000000
--- a/node_modules/readable-stream/lib/_stream_duplex.js
+++ /dev/null
@@ -1,89 +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.
-
-module.exports = Duplex;
-
-/*<replacement>*/
-var objectKeys = Object.keys || function (obj) {
-  var keys = [];
-  for (var key in obj) keys.push(key);
-  return keys;
-}
-/*</replacement>*/
-
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-var Readable = require('./_stream_readable');
-var Writable = require('./_stream_writable');
-
-util.inherits(Duplex, Readable);
-
-forEach(objectKeys(Writable.prototype), function(method) {
-  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);
-}
-
-// 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.
-  process.nextTick(this.end.bind(this));
-}
-
-function forEach (xs, f) {
-  for (var i = 0, l = xs.length; i < l; i++) {
-    f(xs[i], i);
-  }
-}
diff --git a/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/readable-stream/lib/_stream_passthrough.js
deleted file mode 100644
index 895ca50a1d208a8e0a19fb77f61e7264fc9b5a72..0000000000000000000000000000000000000000
--- a/node_modules/readable-stream/lib/_stream_passthrough.js
+++ /dev/null
@@ -1,46 +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.
-
-module.exports = PassThrough;
-
-var Transform = require('./_stream_transform');
-
-/*<replacement>*/
-var util = 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);
-};
diff --git a/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/readable-stream/lib/_stream_readable.js
deleted file mode 100644
index 630722099e9936982f6bf7c2b313df58d85cdfbf..0000000000000000000000000000000000000000
--- a/node_modules/readable-stream/lib/_stream_readable.js
+++ /dev/null
@@ -1,982 +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.
-
-module.exports = Readable;
-
-/*<replacement>*/
-var isArray = require('isarray');
-/*</replacement>*/
-
-
-/*<replacement>*/
-var Buffer = require('buffer').Buffer;
-/*</replacement>*/
-
-Readable.ReadableState = ReadableState;
-
-var EE = require('events').EventEmitter;
-
-/*<replacement>*/
-if (!EE.listenerCount) EE.listenerCount = function(emitter, type) {
-  return emitter.listeners(type).length;
-};
-/*</replacement>*/
-
-var Stream = require('stream');
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-var StringDecoder;
-
-util.inherits(Readable, Stream);
-
-function ReadableState(options, stream) {
-  options = options || {};
-
-  // 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;
-  this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024;
-
-  // cast to ints.
-  this.highWaterMark = ~~this.highWaterMark;
-
-  this.buffer = [];
-  this.length = 0;
-  this.pipes = null;
-  this.pipesCount = 0;
-  this.flowing = false;
-  this.ended = false;
-  this.endEmitted = false;
-  this.reading = false;
-
-  // In streams that never have any data, and do push(null) right away,
-  // the consumer can miss the 'end' event if they do some I/O before
-  // consuming the stream.  So, we don't emit('end') until some reading
-  // happens.
-  this.calledRead = false;
-
-  // 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, becuase any
-  // actions that shouldn't happen until "later" should generally also
-  // not happen before the first write 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;
-
-
-  // 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;
-
-  // 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';
-
-  // when piping, we only care about 'readable' events that happen
-  // after read()ing all the bytes and not getting any pushback.
-  this.ranOut = false;
-
-  // 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) {
-  if (!(this instanceof Readable))
-    return new Readable(options);
-
-  this._readableState = new ReadableState(options, this);
-
-  // legacy
-  this.readable = true;
-
-  Stream.call(this);
-}
-
-// 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;
-
-  if (typeof chunk === 'string' && !state.objectMode) {
-    encoding = encoding || state.defaultEncoding;
-    if (encoding !== state.encoding) {
-      chunk = new Buffer(chunk, encoding);
-      encoding = '';
-    }
-  }
-
-  return readableAddChunk(this, state, chunk, encoding, false);
-};
-
-// Unshift should *always* be something directly out of read()
-Readable.prototype.unshift = function(chunk) {
-  var state = this._readableState;
-  return readableAddChunk(this, state, chunk, '', true);
-};
-
-function readableAddChunk(stream, state, chunk, encoding, addToFront) {
-  var er = chunkInvalid(state, chunk);
-  if (er) {
-    stream.emit('error', er);
-  } else if (chunk === null || chunk === undefined) {
-    state.reading = false;
-    if (!state.ended)
-      onEofChunk(stream, state);
-  } else if (state.objectMode || chunk && chunk.length > 0) {
-    if (state.ended && !addToFront) {
-      var e = new Error('stream.push() after EOF');
-      stream.emit('error', e);
-    } else if (state.endEmitted && addToFront) {
-      var e = new Error('stream.unshift() after end event');
-      stream.emit('error', e);
-    } else {
-      if (state.decoder && !addToFront && !encoding)
-        chunk = state.decoder.write(chunk);
-
-      // update the buffer info.
-      state.length += state.objectMode ? 1 : chunk.length;
-      if (addToFront) {
-        state.buffer.unshift(chunk);
-      } else {
-        state.reading = false;
-        state.buffer.push(chunk);
-      }
-
-      if (state.needReadable)
-        emitReadable(stream);
-
-      maybeReadMore(stream, state);
-    }
-  } else if (!addToFront) {
-    state.reading = false;
-  }
-
-  return needMoreData(state);
-}
-
-
-
-// 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);
-}
-
-// backwards compatibility.
-Readable.prototype.setEncoding = function(enc) {
-  if (!StringDecoder)
-    StringDecoder = require('string_decoder/').StringDecoder;
-  this._readableState.decoder = new StringDecoder(enc);
-  this._readableState.encoding = enc;
-};
-
-// Don't raise the hwm > 128MB
-var MAX_HWM = 0x800000;
-function roundUpToNextPowerOf2(n) {
-  if (n >= MAX_HWM) {
-    n = MAX_HWM;
-  } else {
-    // Get the next highest power of 2
-    n--;
-    for (var p = 1; p < 32; p <<= 1) n |= n >> p;
-    n++;
-  }
-  return n;
-}
-
-function howMuchToRead(n, state) {
-  if (state.length === 0 && state.ended)
-    return 0;
-
-  if (state.objectMode)
-    return n === 0 ? 0 : 1;
-
-  if (n === null || isNaN(n)) {
-    // only flow one buffer at a time
-    if (state.flowing && state.buffer.length)
-      return state.buffer[0].length;
-    else
-      return state.length;
-  }
-
-  if (n <= 0)
-    return 0;
-
-  // If we're asking for more than the target buffer level,
-  // then raise the water mark.  Bump up to the next highest
-  // power of 2, to prevent increasing it excessively in tiny
-  // amounts.
-  if (n > state.highWaterMark)
-    state.highWaterMark = roundUpToNextPowerOf2(n);
-
-  // don't have that much.  return null, unless we've ended.
-  if (n > state.length) {
-    if (!state.ended) {
-      state.needReadable = true;
-      return 0;
-    } else
-      return state.length;
-  }
-
-  return n;
-}
-
-// you can override either this method, or the async _read(n) below.
-Readable.prototype.read = function(n) {
-  var state = this._readableState;
-  state.calledRead = true;
-  var nOrig = n;
-  var ret;
-
-  if (typeof n !== 'number' || 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)) {
-    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) {
-    ret = null;
-
-    // In cases where the decoder did not receive enough data
-    // to produce a full chunk, then immediately received an
-    // EOF, state.buffer will contain [<Buffer >, <Buffer 00 ...>].
-    // howMuchToRead will see this and coerce the amount to
-    // read to zero (because it's looking at the length of the
-    // first <Buffer > in state.buffer), and we'll end up here.
-    //
-    // This can only happen via state.decoder -- no other venue
-    // exists for pushing a zero-length chunk into state.buffer
-    // and triggering this behavior. In this case, we return our
-    // remaining data and end the stream, if appropriate.
-    if (state.length > 0 && state.decoder) {
-      ret = fromList(n, state);
-      state.length -= ret.length;
-    }
-
-    if (state.length === 0)
-      endReadable(this);
-
-    return ret;
-  }
-
-  // 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;
-
-  // if we currently have less than the highWaterMark, then also read some
-  if (state.length - n <= state.highWaterMark)
-    doRead = true;
-
-  // 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;
-
-  if (doRead) {
-    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 called its callback synchronously, then `reading`
-  // will be false, and we need to re-evaluate how much data we
-  // can return to the user.
-  if (doRead && !state.reading)
-    n = howMuchToRead(nOrig, state);
-
-  if (n > 0)
-    ret = fromList(n, state);
-  else
-    ret = null;
-
-  if (ret === null) {
-    state.needReadable = true;
-    n = 0;
-  }
-
-  state.length -= n;
-
-  // If we have nothing in the buffer, then we want to know
-  // as soon as we *do* get something into the buffer.
-  if (state.length === 0 && !state.ended)
-    state.needReadable = true;
-
-  // If we happened to read() exactly the remaining amount in the
-  // buffer, and the EOF has been seen at this point, then make sure
-  // that we emit 'end' on the very next tick.
-  if (state.ended && !state.endEmitted && state.length === 0)
-    endReadable(this);
-
-  return ret;
-};
-
-function chunkInvalid(state, chunk) {
-  var er = null;
-  if (!Buffer.isBuffer(chunk) &&
-      'string' !== typeof chunk &&
-      chunk !== null &&
-      chunk !== undefined &&
-      !state.objectMode) {
-    er = new TypeError('Invalid non-string/buffer chunk');
-  }
-  return er;
-}
-
-
-function onEofChunk(stream, state) {
-  if (state.decoder && !state.ended) {
-    var chunk = state.decoder.end();
-    if (chunk && chunk.length) {
-      state.buffer.push(chunk);
-      state.length += state.objectMode ? 1 : chunk.length;
-    }
-  }
-  state.ended = true;
-
-  // if we've ended and we have some data left, then emit
-  // 'readable' now to make sure it gets picked up.
-  if (state.length > 0)
-    emitReadable(stream);
-  else
-    endReadable(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)
-    return;
-
-  state.emittedReadable = true;
-  if (state.sync)
-    process.nextTick(function() {
-      emitReadable_(stream);
-    });
-  else
-    emitReadable_(stream);
-}
-
-function emitReadable_(stream) {
-  stream.emit('readable');
-}
-
-
-// at this point, the user has presumably seen the 'readable' event,
-// and called read() to consume some data.  that may have triggered
-// in turn another _read(n) call, in which case reading = true if
-// it's in progress.
-// However, if we're not ended, or reading, and the length < hwm,
-// then go ahead and try to read some more preemptively.
-function maybeReadMore(stream, state) {
-  if (!state.readingMore) {
-    state.readingMore = true;
-    process.nextTick(function() {
-      maybeReadMore_(stream, state);
-    });
-  }
-}
-
-function maybeReadMore_(stream, state) {
-  var len = state.length;
-  while (!state.reading && !state.flowing && !state.ended &&
-         state.length < state.highWaterMark) {
-    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('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;
-
-  var doEnd = (!pipeOpts || pipeOpts.end !== false) &&
-              dest !== process.stdout &&
-              dest !== process.stderr;
-
-  var endFn = doEnd ? onend : cleanup;
-  if (state.endEmitted)
-    process.nextTick(endFn);
-  else
-    src.once('end', endFn);
-
-  dest.on('unpipe', onunpipe);
-  function onunpipe(readable) {
-    if (readable !== src) return;
-    cleanup();
-  }
-
-  function 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);
-
-  function 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', cleanup);
-
-    // 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 (!dest._writableState || dest._writableState.needDrain)
-      ondrain();
-  }
-
-  // if the dest has an error, then stop piping into it.
-  // however, don't suppress the throwing behavior for this.
-  function onerror(er) {
-    unpipe();
-    dest.removeListener('error', onerror);
-    if (EE.listenerCount(dest, 'error') === 0)
-      dest.emit('error', er);
-  }
-  // This is a brutally ugly hack to make sure that our error handler
-  // is attached before any userland ones.  NEVER DO THIS.
-  if (!dest._events || !dest._events.error)
-    dest.on('error', onerror);
-  else if (isArray(dest._events.error))
-    dest._events.error.unshift(onerror);
-  else
-    dest._events.error = [onerror, dest._events.error];
-
-
-
-  // Both close and finish should trigger unpipe, but only once.
-  function onclose() {
-    dest.removeListener('finish', onfinish);
-    unpipe();
-  }
-  dest.once('close', onclose);
-  function onfinish() {
-    dest.removeListener('close', onclose);
-    unpipe();
-  }
-  dest.once('finish', onfinish);
-
-  function 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) {
-    // the handler that waits for readable events after all
-    // the data gets sucked out in flow.
-    // This would be easier to follow with a .once() handler
-    // in flow(), but that is too slow.
-    this.on('readable', pipeOnReadable);
-
-    state.flowing = true;
-    process.nextTick(function() {
-      flow(src);
-    });
-  }
-
-  return dest;
-};
-
-function pipeOnDrain(src) {
-  return function() {
-    var dest = this;
-    var state = src._readableState;
-    state.awaitDrain--;
-    if (state.awaitDrain === 0)
-      flow(src);
-  };
-}
-
-function flow(src) {
-  var state = src._readableState;
-  var chunk;
-  state.awaitDrain = 0;
-
-  function write(dest, i, list) {
-    var written = dest.write(chunk);
-    if (false === written) {
-      state.awaitDrain++;
-    }
-  }
-
-  while (state.pipesCount && null !== (chunk = src.read())) {
-
-    if (state.pipesCount === 1)
-      write(state.pipes, 0, null);
-    else
-      forEach(state.pipes, write);
-
-    src.emit('data', chunk);
-
-    // if anyone needs a drain, then we have to wait for that.
-    if (state.awaitDrain > 0)
-      return;
-  }
-
-  // if every destination was unpiped, either before entering this
-  // function, or in the while loop, then stop flowing.
-  //
-  // NB: This is a pretty rare edge case.
-  if (state.pipesCount === 0) {
-    state.flowing = false;
-
-    // if there were data event listeners added, then switch to old mode.
-    if (EE.listenerCount(src, 'data') > 0)
-      emitDataEvents(src);
-    return;
-  }
-
-  // at this point, no one needed a drain, so we just ran out of data
-  // on the next readable event, start it over again.
-  state.ranOut = true;
-}
-
-function pipeOnReadable() {
-  if (this._readableState.ranOut) {
-    this._readableState.ranOut = false;
-    flow(this);
-  }
-}
-
-
-Readable.prototype.unpipe = function(dest) {
-  var state = this._readableState;
-
-  // 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;
-    this.removeListener('readable', pipeOnReadable);
-    state.flowing = false;
-    if (dest)
-      dest.emit('unpipe', this);
-    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;
-    this.removeListener('readable', pipeOnReadable);
-    state.flowing = false;
-
-    for (var i = 0; i < len; i++)
-      dests[i].emit('unpipe', this);
-    return this;
-  }
-
-  // try to find the right one.
-  var i = indexOf(state.pipes, dest);
-  if (i === -1)
-    return this;
-
-  state.pipes.splice(i, 1);
-  state.pipesCount -= 1;
-  if (state.pipesCount === 1)
-    state.pipes = state.pipes[0];
-
-  dest.emit('unpipe', this);
-
-  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' && !this._readableState.flowing)
-    emitDataEvents(this);
-
-  if (ev === 'readable' && this.readable) {
-    var state = this._readableState;
-    if (!state.readableListening) {
-      state.readableListening = true;
-      state.emittedReadable = false;
-      state.needReadable = true;
-      if (!state.reading) {
-        this.read(0);
-      } else if (state.length) {
-        emitReadable(this, state);
-      }
-    }
-  }
-
-  return res;
-};
-Readable.prototype.addListener = Readable.prototype.on;
-
-// 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() {
-  emitDataEvents(this);
-  this.read(0);
-  this.emit('resume');
-};
-
-Readable.prototype.pause = function() {
-  emitDataEvents(this, true);
-  this.emit('pause');
-};
-
-function emitDataEvents(stream, startPaused) {
-  var state = stream._readableState;
-
-  if (state.flowing) {
-    // https://github.com/isaacs/readable-stream/issues/16
-    throw new Error('Cannot switch to old mode now.');
-  }
-
-  var paused = startPaused || false;
-  var readable = false;
-
-  // convert to an old-style stream.
-  stream.readable = true;
-  stream.pipe = Stream.prototype.pipe;
-  stream.on = stream.addListener = Stream.prototype.on;
-
-  stream.on('readable', function() {
-    readable = true;
-
-    var c;
-    while (!paused && (null !== (c = stream.read())))
-      stream.emit('data', c);
-
-    if (c === null) {
-      readable = false;
-      stream._readableState.needReadable = true;
-    }
-  });
-
-  stream.pause = function() {
-    paused = true;
-    this.emit('pause');
-  };
-
-  stream.resume = function() {
-    paused = false;
-    if (readable)
-      process.nextTick(function() {
-        stream.emit('readable');
-      });
-    else
-      this.read(0);
-    this.emit('resume');
-  };
-
-  // now make it start, just in case it hadn't already.
-  stream.emit('readable');
-}
-
-// 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 state = this._readableState;
-  var paused = false;
-
-  var self = this;
-  stream.on('end', function() {
-    if (state.decoder && !state.ended) {
-      var chunk = state.decoder.end();
-      if (chunk && chunk.length)
-        self.push(chunk);
-    }
-
-    self.push(null);
-  });
-
-  stream.on('data', function(chunk) {
-    if (state.decoder)
-      chunk = state.decoder.write(chunk);
-
-    // don't skip over falsy values in objectMode
-    //if (state.objectMode && util.isNullOrUndefined(chunk))
-    if (state.objectMode && (chunk === null || chunk === undefined))
-      return;
-    else if (!state.objectMode && (!chunk || !chunk.length))
-      return;
-
-    var ret = self.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 (typeof stream[i] === 'function' &&
-        typeof this[i] === 'undefined') {
-      this[i] = function(method) { return function() {
-        return stream[method].apply(stream, arguments);
-      }}(i);
-    }
-  }
-
-  // proxy certain important events.
-  var events = ['error', 'close', 'destroy', 'pause', 'resume'];
-  forEach(events, function(ev) {
-    stream.on(ev, self.emit.bind(self, ev));
-  });
-
-  // when we try to consume some more bytes, simply unpause the
-  // underlying stream.
-  self._read = function(n) {
-    if (paused) {
-      paused = false;
-      stream.resume();
-    }
-  };
-
-  return self;
-};
-
-
-
-// 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.
-function fromList(n, state) {
-  var list = state.buffer;
-  var length = state.length;
-  var stringMode = !!state.decoder;
-  var objectMode = !!state.objectMode;
-  var ret;
-
-  // nothing in the list, definitely empty.
-  if (list.length === 0)
-    return null;
-
-  if (length === 0)
-    ret = null;
-  else if (objectMode)
-    ret = list.shift();
-  else if (!n || n >= length) {
-    // read it all, truncate the array.
-    if (stringMode)
-      ret = list.join('');
-    else
-      ret = Buffer.concat(list, length);
-    list.length = 0;
-  } else {
-    // read just some of it.
-    if (n < list[0].length) {
-      // just take a part of the first list item.
-      // slice is the same for buffers and strings.
-      var buf = list[0];
-      ret = buf.slice(0, n);
-      list[0] = buf.slice(n);
-    } else if (n === list[0].length) {
-      // first list is a perfect match
-      ret = list.shift();
-    } else {
-      // complex case.
-      // we have enough to cover it, but it spans past the first buffer.
-      if (stringMode)
-        ret = '';
-      else
-        ret = new Buffer(n);
-
-      var c = 0;
-      for (var i = 0, l = list.length; i < l && c < n; i++) {
-        var buf = list[0];
-        var cpy = Math.min(n - c, buf.length);
-
-        if (stringMode)
-          ret += buf.slice(0, cpy);
-        else
-          buf.copy(ret, c, 0, cpy);
-
-        if (cpy < buf.length)
-          list[0] = buf.slice(cpy);
-        else
-          list.shift();
-
-        c += cpy;
-      }
-    }
-  }
-
-  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.calledRead) {
-    state.ended = true;
-    process.nextTick(function() {
-      // 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 forEach (xs, f) {
-  for (var i = 0, l = xs.length; i < l; i++) {
-    f(xs[i], i);
-  }
-}
-
-function indexOf (xs, x) {
-  for (var i = 0, l = xs.length; i < l; i++) {
-    if (xs[i] === x) return i;
-  }
-  return -1;
-}
diff --git a/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/readable-stream/lib/_stream_transform.js
deleted file mode 100644
index eb188df3e86b41cf6a4e70b1e2b0427a15b61eaf..0000000000000000000000000000000000000000
--- a/node_modules/readable-stream/lib/_stream_transform.js
+++ /dev/null
@@ -1,210 +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.
-
-module.exports = Transform;
-
-var Duplex = require('./_stream_duplex');
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-util.inherits(Transform, Duplex);
-
-
-function TransformState(options, stream) {
-  this.afterTransform = function(er, data) {
-    return afterTransform(stream, er, data);
-  };
-
-  this.needTransform = false;
-  this.transforming = false;
-  this.writecb = null;
-  this.writechunk = null;
-}
-
-function afterTransform(stream, er, data) {
-  var ts = stream._transformState;
-  ts.transforming = false;
-
-  var cb = ts.writecb;
-
-  if (!cb)
-    return stream.emit('error', new Error('no writecb in Transform class'));
-
-  ts.writechunk = null;
-  ts.writecb = null;
-
-  if (data !== null && data !== undefined)
-    stream.push(data);
-
-  if (cb)
-    cb(er);
-
-  var rs = stream._readableState;
-  rs.reading = false;
-  if (rs.needReadable || rs.length < rs.highWaterMark) {
-    stream._read(rs.highWaterMark);
-  }
-}
-
-
-function Transform(options) {
-  if (!(this instanceof Transform))
-    return new Transform(options);
-
-  Duplex.call(this, options);
-
-  var ts = this._transformState = new TransformState(options, this);
-
-  // when the writable side finishes, then flush out anything remaining.
-  var stream = this;
-
-  // 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;
-
-  this.once('finish', function() {
-    if ('function' === typeof this._flush)
-      this._flush(function(er) {
-        done(stream, er);
-      });
-    else
-      done(stream);
-  });
-}
-
-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('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;
-  }
-};
-
-
-function done(stream, er) {
-  if (er)
-    return stream.emit('error', er);
-
-  // if there's nothing in the write buffer, then that means
-  // that nothing more will ever be provided
-  var ws = stream._writableState;
-  var rs = stream._readableState;
-  var ts = stream._transformState;
-
-  if (ws.length)
-    throw new Error('calling transform done when ws.length != 0');
-
-  if (ts.transforming)
-    throw new Error('calling transform done when still transforming');
-
-  return stream.push(null);
-}
diff --git a/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/readable-stream/lib/_stream_writable.js
deleted file mode 100644
index 4bdaa4fa49188d108dfacd9f33969049d9bd9803..0000000000000000000000000000000000000000
--- a/node_modules/readable-stream/lib/_stream_writable.js
+++ /dev/null
@@ -1,386 +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, cb), and it'll handle all
-// the drain event emission and buffering.
-
-module.exports = Writable;
-
-/*<replacement>*/
-var Buffer = require('buffer').Buffer;
-/*</replacement>*/
-
-Writable.WritableState = WritableState;
-
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-var Stream = require('stream');
-
-util.inherits(Writable, Stream);
-
-function WriteReq(chunk, encoding, cb) {
-  this.chunk = chunk;
-  this.encoding = encoding;
-  this.callback = cb;
-}
-
-function WritableState(options, stream) {
-  options = options || {};
-
-  // 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;
-  this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024;
-
-  // object stream flag to indicate whether or not this stream
-  // contains buffers or objects.
-  this.objectMode = !!options.objectMode;
-
-  // cast to ints.
-  this.highWaterMark = ~~this.highWaterMark;
-
-  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;
-
-  // 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;
-
-  // 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, becuase 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.buffer = [];
-
-  // True if the error was already emitted and should not be thrown again
-  this.errorEmitted = false;
-}
-
-function Writable(options) {
-  var Duplex = require('./_stream_duplex');
-
-  // Writable ctor is applied to Duplexes, though they're not
-  // instanceof Writable, they're instanceof Readable.
-  if (!(this instanceof Writable) && !(this instanceof Duplex))
-    return new Writable(options);
-
-  this._writableState = new WritableState(options, this);
-
-  // legacy.
-  this.writable = true;
-
-  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, state, cb) {
-  var er = new Error('write after end');
-  // TODO: defer error events consistently everywhere, not just the cb
-  stream.emit('error', er);
-  process.nextTick(function() {
-    cb(er);
-  });
-}
-
-// If we get something that is not a buffer, string, null, or undefined,
-// and we're not in objectMode, then that's an error.
-// Otherwise stream chunks are all considered to be of length=1, and the
-// watermarks determine how many objects to keep in the buffer, rather than
-// how many bytes or characters.
-function validChunk(stream, state, chunk, cb) {
-  var valid = true;
-  if (!Buffer.isBuffer(chunk) &&
-      'string' !== typeof chunk &&
-      chunk !== null &&
-      chunk !== undefined &&
-      !state.objectMode) {
-    var er = new TypeError('Invalid non-string/buffer chunk');
-    stream.emit('error', er);
-    process.nextTick(function() {
-      cb(er);
-    });
-    valid = false;
-  }
-  return valid;
-}
-
-Writable.prototype.write = function(chunk, encoding, cb) {
-  var state = this._writableState;
-  var ret = false;
-
-  if (typeof encoding === 'function') {
-    cb = encoding;
-    encoding = null;
-  }
-
-  if (Buffer.isBuffer(chunk))
-    encoding = 'buffer';
-  else if (!encoding)
-    encoding = state.defaultEncoding;
-
-  if (typeof cb !== 'function')
-    cb = function() {};
-
-  if (state.ended)
-    writeAfterEnd(this, state, cb);
-  else if (validChunk(this, state, chunk, cb))
-    ret = writeOrBuffer(this, state, chunk, encoding, cb);
-
-  return ret;
-};
-
-function decodeChunk(state, chunk, encoding) {
-  if (!state.objectMode &&
-      state.decodeStrings !== false &&
-      typeof chunk === 'string') {
-    chunk = new Buffer(chunk, encoding);
-  }
-  return chunk;
-}
-
-// 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, chunk, encoding, cb) {
-  chunk = decodeChunk(state, chunk, encoding);
-  if (Buffer.isBuffer(chunk))
-    encoding = 'buffer';
-  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.buffer.push(new WriteReq(chunk, encoding, cb));
-  else
-    doWrite(stream, state, len, chunk, encoding, cb);
-
-  return ret;
-}
-
-function doWrite(stream, state, len, chunk, encoding, cb) {
-  state.writelen = len;
-  state.writecb = cb;
-  state.writing = true;
-  state.sync = true;
-  stream._write(chunk, encoding, state.onwrite);
-  state.sync = false;
-}
-
-function onwriteError(stream, state, sync, er, cb) {
-  if (sync)
-    process.nextTick(function() {
-      cb(er);
-    });
-  else
-    cb(er);
-
-  stream._writableState.errorEmitted = true;
-  stream.emit('error', er);
-}
-
-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(stream, state);
-
-    if (!finished && !state.bufferProcessing && state.buffer.length)
-      clearBuffer(stream, state);
-
-    if (sync) {
-      process.nextTick(function() {
-        afterWrite(stream, state, finished, cb);
-      });
-    } else {
-      afterWrite(stream, state, finished, cb);
-    }
-  }
-}
-
-function afterWrite(stream, state, finished, cb) {
-  if (!finished)
-    onwriteDrain(stream, state);
-  cb();
-  if (finished)
-    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;
-
-  for (var c = 0; c < state.buffer.length; c++) {
-    var entry = state.buffer[c];
-    var chunk = entry.chunk;
-    var encoding = entry.encoding;
-    var cb = entry.callback;
-    var len = state.objectMode ? 1 : chunk.length;
-
-    doWrite(stream, state, len, chunk, encoding, cb);
-
-    // 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) {
-      c++;
-      break;
-    }
-  }
-
-  state.bufferProcessing = false;
-  if (c < state.buffer.length)
-    state.buffer = state.buffer.slice(c);
-  else
-    state.buffer.length = 0;
-}
-
-Writable.prototype._write = function(chunk, encoding, cb) {
-  cb(new Error('not implemented'));
-};
-
-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 (typeof chunk !== 'undefined' && chunk !== null)
-    this.write(chunk, encoding);
-
-  // ignore unnecessary end() calls.
-  if (!state.ending && !state.finished)
-    endWritable(this, state, cb);
-};
-
-
-function needFinish(stream, state) {
-  return (state.ending &&
-          state.length === 0 &&
-          !state.finished &&
-          !state.writing);
-}
-
-function finishMaybe(stream, state) {
-  var need = needFinish(stream, state);
-  if (need) {
-    state.finished = true;
-    stream.emit('finish');
-  }
-  return need;
-}
-
-function endWritable(stream, state, cb) {
-  state.ending = true;
-  finishMaybe(stream, state);
-  if (cb) {
-    if (state.finished)
-      process.nextTick(cb);
-    else
-      stream.once('finish', cb);
-  }
-  state.ended = true;
-}
diff --git a/node_modules/readable-stream/package.json b/node_modules/readable-stream/package.json
deleted file mode 100644
index 2f9e1e91db7cefe531a60fcb4c94d108fe2a572c..0000000000000000000000000000000000000000
--- a/node_modules/readable-stream/package.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "name": "readable-stream",
-  "version": "1.0.33",
-  "description": "Streams2, a user-land copy of the stream library from Node.js v0.10.x",
-  "main": "readable.js",
-  "dependencies": {
-    "core-util-is": "~1.0.0",
-    "isarray": "0.0.1",
-    "string_decoder": "~0.10.x",
-    "inherits": "~2.0.1"
-  },
-  "devDependencies": {
-    "tap": "~0.2.6"
-  },
-  "scripts": {
-    "test": "tap test/simple/*.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/readable-stream"
-  },
-  "keywords": [
-    "readable",
-    "stream",
-    "pipe"
-  ],
-  "browser": {
-    "util": false
-  },
-  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
-  "license": "MIT"
-}
diff --git a/node_modules/readable-stream/passthrough.js b/node_modules/readable-stream/passthrough.js
deleted file mode 100644
index 27e8d8a55165f9d1d7d1d1905d8d70e9c5a24f6e..0000000000000000000000000000000000000000
--- a/node_modules/readable-stream/passthrough.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_passthrough.js")
diff --git a/node_modules/readable-stream/readable.js b/node_modules/readable-stream/readable.js
deleted file mode 100644
index 8b5337b5c500f3c39762de822186f80ad96d4eeb..0000000000000000000000000000000000000000
--- a/node_modules/readable-stream/readable.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var Stream = require('stream'); // hack to fix a circular dependency issue when used with browserify
-exports = module.exports = require('./lib/_stream_readable.js');
-exports.Stream = Stream;
-exports.Readable = exports;
-exports.Writable = require('./lib/_stream_writable.js');
-exports.Duplex = require('./lib/_stream_duplex.js');
-exports.Transform = require('./lib/_stream_transform.js');
-exports.PassThrough = require('./lib/_stream_passthrough.js');
diff --git a/node_modules/readable-stream/transform.js b/node_modules/readable-stream/transform.js
deleted file mode 100644
index 5d482f0780e9934896cd693414fee2b9b425778f..0000000000000000000000000000000000000000
--- a/node_modules/readable-stream/transform.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_transform.js")
diff --git a/node_modules/readable-stream/writable.js b/node_modules/readable-stream/writable.js
deleted file mode 100644
index e1e9efdf3c12e938a4fd0659f2af60dbe65bf240..0000000000000000000000000000000000000000
--- a/node_modules/readable-stream/writable.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_writable.js")
diff --git a/node_modules/readdirp/LICENSE b/node_modules/readdirp/LICENSE
deleted file mode 100644
index 037cbb4e6952c1b92a9f76af95c7ce1da0ac7479..0000000000000000000000000000000000000000
--- a/node_modules/readdirp/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller (https://paulmillr.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/readdirp/README.md b/node_modules/readdirp/README.md
deleted file mode 100644
index 465593c9d44500e5713917325925b3fb76023888..0000000000000000000000000000000000000000
--- a/node_modules/readdirp/README.md
+++ /dev/null
@@ -1,122 +0,0 @@
-# readdirp [![Weekly downloads](https://img.shields.io/npm/dw/readdirp.svg)](https://github.com/paulmillr/readdirp)
-
-Recursive version of [fs.readdir](https://nodejs.org/api/fs.html#fs_fs_readdir_path_options_callback). Exposes a **stream API** and a **promise API**.
-
-
-```sh
-npm install readdirp
-```
-
-```javascript
-const readdirp = require('readdirp');
-
-// Use streams to achieve small RAM & CPU footprint.
-// 1) Streams example with for-await.
-for await (const entry of readdirp('.')) {
-  const {path} = entry;
-  console.log(`${JSON.stringify({path})}`);
-}
-
-// 2) Streams example, non for-await.
-// Print out all JS files along with their size within the current folder & subfolders.
-readdirp('.', {fileFilter: '*.js', alwaysStat: true})
-  .on('data', (entry) => {
-    const {path, stats: {size}} = entry;
-    console.log(`${JSON.stringify({path, size})}`);
-  })
-  // Optionally call stream.destroy() in `warn()` in order to abort and cause 'close' to be emitted
-  .on('warn', error => console.error('non-fatal error', error))
-  .on('error', error => console.error('fatal error', error))
-  .on('end', () => console.log('done'));
-
-// 3) Promise example. More RAM and CPU than streams / for-await.
-const files = await readdirp.promise('.');
-console.log(files.map(file => file.path));
-
-// Other options.
-readdirp('test', {
-  fileFilter: '*.js',
-  directoryFilter: ['!.git', '!*modules']
-  // directoryFilter: (di) => di.basename.length === 9
-  type: 'files_directories',
-  depth: 1
-});
-```
-
-For more examples, check out `examples` directory.
-
-## API
-
-`const stream = readdirp(root[, options])` — **Stream API**
-
-- Reads given root recursively and returns a `stream` of [entry infos](#entryinfo)
-- Optionally can be used like `for await (const entry of stream)` with node.js 10+ (`asyncIterator`).
-- `on('data', (entry) => {})` [entry info](#entryinfo) for every file / dir.
-- `on('warn', (error) => {})` non-fatal `Error` that prevents a file / dir from being processed. Example: inaccessible to the user.
-- `on('error', (error) => {})` fatal `Error` which also ends the stream. Example: illegal options where passed.
-- `on('end')` — we are done. Called when all entries were found and no more will be emitted.
-- `on('close')` — stream is destroyed via `stream.destroy()`.
-  Could be useful if you want to manually abort even on a non fatal error.
-  At that point the stream is no longer `readable` and no more entries, warning or errors are emitted
-- To learn more about streams, consult the very detailed [nodejs streams documentation](https://nodejs.org/api/stream.html)
-  or the [stream-handbook](https://github.com/substack/stream-handbook)
-
-`const entries = await readdirp.promise(root[, options])` — **Promise API**. Returns a list of [entry infos](#entryinfo).
-
-First argument is awalys `root`, path in which to start reading and recursing into subdirectories.
-
-### options
-
-- `fileFilter: ["*.js"]`: filter to include or exclude files. A `Function`, Glob string or Array of glob strings.
-    - **Function**: a function that takes an entry info as a parameter and returns true to include or false to exclude the entry
-    - **Glob string**: a string (e.g., `*.js`) which is matched using [picomatch](https://github.com/micromatch/picomatch), so go there for more
-        information. Globstars (`**`) are not supported since specifying a recursive pattern for an already recursive function doesn't make sense. Negated globs (as explained in the minimatch documentation) are allowed, e.g., `!*.txt` matches everything but text files.
-    - **Array of glob strings**: either need to be all inclusive or all exclusive (negated) patterns otherwise an error is thrown.
-        `['*.json', '*.js']` includes all JavaScript and Json files.
-        `['!.git', '!node_modules']` includes all directories except the '.git' and 'node_modules'.
-    - Directories that do not pass a filter will not be recursed into.
-- `directoryFilter: ['!.git']`: filter to include/exclude directories found and to recurse into. Directories that do not pass a filter will not be recursed into.
-- `depth: 5`: depth at which to stop recursing even if more subdirectories are found
-- `type: 'files'`: determines if data events on the stream should be emitted for `'files'` (default), `'directories'`, `'files_directories'`, or `'all'`. Setting to `'all'` will also include entries for other types of file descriptors like character devices, unix sockets and named pipes.
-- `alwaysStat: false`: always return `stats` property for every file. Default is `false`, readdirp will return `Dirent` entries. Setting it to `true` can double readdir execution time - use it only when you need file `size`, `mtime` etc. Cannot be enabled on node <10.10.0.
-- `lstat: false`: include symlink entries in the stream along with files. When `true`, `fs.lstat` would be used instead of `fs.stat`
-
-### `EntryInfo`
-
-Has the following properties:
-
-- `path: 'assets/javascripts/react.js'`: path to the file/directory (relative to given root)
-- `fullPath: '/Users/dev/projects/app/assets/javascripts/react.js'`: full path to the file/directory found
-- `basename: 'react.js'`: name of the file/directory
-- `dirent: fs.Dirent`: built-in [dir entry object](https://nodejs.org/api/fs.html#fs_class_fs_dirent) - only with `alwaysStat: false`
-- `stats: fs.Stats`: built in [stat object](https://nodejs.org/api/fs.html#fs_class_fs_stats) - only with `alwaysStat: true`
-
-## Changelog
-
-- 3.5 (Oct 13, 2020) disallows recursive directory-based symlinks.
-  Before, it could have entered infinite loop.
-- 3.4 (Mar 19, 2020) adds support for directory-based symlinks.
-- 3.3 (Dec 6, 2019) stabilizes RAM consumption and enables perf management with `highWaterMark` option. Fixes race conditions related to `for-await` looping.
-- 3.2 (Oct 14, 2019) improves performance by 250% and makes streams implementation more idiomatic.
-- 3.1 (Jul 7, 2019) brings `bigint` support to `stat` output on Windows. This is backwards-incompatible for some cases. Be careful. It you use it incorrectly, you'll see "TypeError: Cannot mix BigInt and other types, use explicit conversions".
-- 3.0 brings huge performance improvements and stream backpressure support.
-- Upgrading 2.x to 3.x:
-    - Signature changed from `readdirp(options)` to `readdirp(root, options)`
-    - Replaced callback API with promise API.
-    - Renamed `entryType` option to `type`
-    - Renamed `entryType: 'both'` to `'files_directories'`
-    - `EntryInfo`
-        - Renamed `stat` to `stats`
-            - Emitted only when `alwaysStat: true`
-            - `dirent` is emitted instead of `stats` by default with `alwaysStat: false`
-        - Renamed `name` to `basename`
-        - Removed `parentDir` and `fullParentDir` properties
-- Supported node.js versions:
-    - 3.x: node 8+
-    - 2.x: node 0.6+
-
-## License
-
-Copyright (c) 2012-2019 Thorsten Lorenz, Paul Miller (<https://paulmillr.com>)
-
-MIT License, see [LICENSE](LICENSE) file.
diff --git a/node_modules/readdirp/index.d.ts b/node_modules/readdirp/index.d.ts
deleted file mode 100644
index cbbd76ca1768c6e4e4030210cf56c88a1000e5fb..0000000000000000000000000000000000000000
--- a/node_modules/readdirp/index.d.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-// TypeScript Version: 3.2
-
-/// <reference types="node" lib="esnext" />
-
-import * as fs from 'fs';
-import { Readable } from 'stream';
-
-declare namespace readdir {
-  interface EntryInfo {
-    path: string;
-    fullPath: string;
-    basename: string;
-    stats?: fs.Stats;
-    dirent?: fs.Dirent;
-  }
-
-  interface ReaddirpOptions {
-    root?: string;
-    fileFilter?: string | string[] | ((entry: EntryInfo) => boolean);
-    directoryFilter?: string | string[] | ((entry: EntryInfo) => boolean);
-    type?: 'files' | 'directories' | 'files_directories' | 'all';
-    lstat?: boolean;
-    depth?: number;
-    alwaysStat?: boolean;
-  }
-
-  interface ReaddirpStream extends Readable, AsyncIterable<EntryInfo> {
-    read(): EntryInfo;
-    [Symbol.asyncIterator](): AsyncIterableIterator<EntryInfo>;
-  }
-
-  function promise(
-    root: string,
-    options?: ReaddirpOptions
-  ): Promise<EntryInfo[]>;
-}
-
-declare function readdir(
-  root: string,
-  options?: readdir.ReaddirpOptions
-): readdir.ReaddirpStream;
-
-export = readdir;
diff --git a/node_modules/readdirp/index.js b/node_modules/readdirp/index.js
deleted file mode 100644
index cf739b2dc5f56a2860667ce8e3f8f7f04ad551d0..0000000000000000000000000000000000000000
--- a/node_modules/readdirp/index.js
+++ /dev/null
@@ -1,287 +0,0 @@
-'use strict';
-
-const fs = require('fs');
-const { Readable } = require('stream');
-const sysPath = require('path');
-const { promisify } = require('util');
-const picomatch = require('picomatch');
-
-const readdir = promisify(fs.readdir);
-const stat = promisify(fs.stat);
-const lstat = promisify(fs.lstat);
-const realpath = promisify(fs.realpath);
-
-/**
- * @typedef {Object} EntryInfo
- * @property {String} path
- * @property {String} fullPath
- * @property {fs.Stats=} stats
- * @property {fs.Dirent=} dirent
- * @property {String} basename
- */
-
-const BANG = '!';
-const RECURSIVE_ERROR_CODE = 'READDIRP_RECURSIVE_ERROR';
-const NORMAL_FLOW_ERRORS = new Set(['ENOENT', 'EPERM', 'EACCES', 'ELOOP', RECURSIVE_ERROR_CODE]);
-const FILE_TYPE = 'files';
-const DIR_TYPE = 'directories';
-const FILE_DIR_TYPE = 'files_directories';
-const EVERYTHING_TYPE = 'all';
-const ALL_TYPES = [FILE_TYPE, DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE];
-
-const isNormalFlowError = error => NORMAL_FLOW_ERRORS.has(error.code);
-const [maj, min] = process.versions.node.split('.').slice(0, 2).map(n => Number.parseInt(n, 10));
-const wantBigintFsStats = process.platform === 'win32' && (maj > 10 || (maj === 10 && min >= 5));
-
-const normalizeFilter = filter => {
-  if (filter === undefined) return;
-  if (typeof filter === 'function') return filter;
-
-  if (typeof filter === 'string') {
-    const glob = picomatch(filter.trim());
-    return entry => glob(entry.basename);
-  }
-
-  if (Array.isArray(filter)) {
-    const positive = [];
-    const negative = [];
-    for (const item of filter) {
-      const trimmed = item.trim();
-      if (trimmed.charAt(0) === BANG) {
-        negative.push(picomatch(trimmed.slice(1)));
-      } else {
-        positive.push(picomatch(trimmed));
-      }
-    }
-
-    if (negative.length > 0) {
-      if (positive.length > 0) {
-        return entry =>
-          positive.some(f => f(entry.basename)) && !negative.some(f => f(entry.basename));
-      }
-      return entry => !negative.some(f => f(entry.basename));
-    }
-    return entry => positive.some(f => f(entry.basename));
-  }
-};
-
-class ReaddirpStream extends Readable {
-  static get defaultOptions() {
-    return {
-      root: '.',
-      /* eslint-disable no-unused-vars */
-      fileFilter: (path) => true,
-      directoryFilter: (path) => true,
-      /* eslint-enable no-unused-vars */
-      type: FILE_TYPE,
-      lstat: false,
-      depth: 2147483648,
-      alwaysStat: false
-    };
-  }
-
-  constructor(options = {}) {
-    super({
-      objectMode: true,
-      autoDestroy: true,
-      highWaterMark: options.highWaterMark || 4096
-    });
-    const opts = { ...ReaddirpStream.defaultOptions, ...options };
-    const { root, type } = opts;
-
-    this._fileFilter = normalizeFilter(opts.fileFilter);
-    this._directoryFilter = normalizeFilter(opts.directoryFilter);
-
-    const statMethod = opts.lstat ? lstat : stat;
-    // Use bigint stats if it's windows and stat() supports options (node 10+).
-    if (wantBigintFsStats) {
-      this._stat = path => statMethod(path, { bigint: true });
-    } else {
-      this._stat = statMethod;
-    }
-
-    this._maxDepth = opts.depth;
-    this._wantsDir = [DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type);
-    this._wantsFile = [FILE_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type);
-    this._wantsEverything = type === EVERYTHING_TYPE;
-    this._root = sysPath.resolve(root);
-    this._isDirent = ('Dirent' in fs) && !opts.alwaysStat;
-    this._statsProp = this._isDirent ? 'dirent' : 'stats';
-    this._rdOptions = { encoding: 'utf8', withFileTypes: this._isDirent };
-
-    // Launch stream with one parent, the root dir.
-    this.parents = [this._exploreDir(root, 1)];
-    this.reading = false;
-    this.parent = undefined;
-  }
-
-  async _read(batch) {
-    if (this.reading) return;
-    this.reading = true;
-
-    try {
-      while (!this.destroyed && batch > 0) {
-        const { path, depth, files = [] } = this.parent || {};
-
-        if (files.length > 0) {
-          const slice = files.splice(0, batch).map(dirent => this._formatEntry(dirent, path));
-          for (const entry of await Promise.all(slice)) {
-            if (this.destroyed) return;
-
-            const entryType = await this._getEntryType(entry);
-            if (entryType === 'directory' && this._directoryFilter(entry)) {
-              if (depth <= this._maxDepth) {
-                this.parents.push(this._exploreDir(entry.fullPath, depth + 1));
-              }
-
-              if (this._wantsDir) {
-                this.push(entry);
-                batch--;
-              }
-            } else if ((entryType === 'file' || this._includeAsFile(entry)) && this._fileFilter(entry)) {
-              if (this._wantsFile) {
-                this.push(entry);
-                batch--;
-              }
-            }
-          }
-        } else {
-          const parent = this.parents.pop();
-          if (!parent) {
-            this.push(null);
-            break;
-          }
-          this.parent = await parent;
-          if (this.destroyed) return;
-        }
-      }
-    } catch (error) {
-      this.destroy(error);
-    } finally {
-      this.reading = false;
-    }
-  }
-
-  async _exploreDir(path, depth) {
-    let files;
-    try {
-      files = await readdir(path, this._rdOptions);
-    } catch (error) {
-      this._onError(error);
-    }
-    return { files, depth, path };
-  }
-
-  async _formatEntry(dirent, path) {
-    let entry;
-    try {
-      const basename = this._isDirent ? dirent.name : dirent;
-      const fullPath = sysPath.resolve(sysPath.join(path, basename));
-      entry = { path: sysPath.relative(this._root, fullPath), fullPath, basename };
-      entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath);
-    } catch (err) {
-      this._onError(err);
-    }
-    return entry;
-  }
-
-  _onError(err) {
-    if (isNormalFlowError(err) && !this.destroyed) {
-      this.emit('warn', err);
-    } else {
-      this.destroy(err);
-    }
-  }
-
-  async _getEntryType(entry) {
-    // entry may be undefined, because a warning or an error were emitted
-    // and the statsProp is undefined
-    const stats = entry && entry[this._statsProp];
-    if (!stats) {
-      return;
-    }
-    if (stats.isFile()) {
-      return 'file';
-    }
-    if (stats.isDirectory()) {
-      return 'directory';
-    }
-    if (stats && stats.isSymbolicLink()) {
-      const full = entry.fullPath;
-      try {
-        const entryRealPath = await realpath(full);
-        const entryRealPathStats = await lstat(entryRealPath);
-        if (entryRealPathStats.isFile()) {
-          return 'file';
-        }
-        if (entryRealPathStats.isDirectory()) {
-          const len = entryRealPath.length;
-          if (full.startsWith(entryRealPath) && full.substr(len, 1) === sysPath.sep) {
-            const recursiveError = new Error(
-              `Circular symlink detected: "${full}" points to "${entryRealPath}"`
-            );
-            recursiveError.code = RECURSIVE_ERROR_CODE;
-            return this._onError(recursiveError);
-          }
-          return 'directory';
-        }
-      } catch (error) {
-        this._onError(error);
-      }
-    }
-  }
-
-  _includeAsFile(entry) {
-    const stats = entry && entry[this._statsProp];
-
-    return stats && this._wantsEverything && !stats.isDirectory();
-  }
-}
-
-/**
- * @typedef {Object} ReaddirpArguments
- * @property {Function=} fileFilter
- * @property {Function=} directoryFilter
- * @property {String=} type
- * @property {Number=} depth
- * @property {String=} root
- * @property {Boolean=} lstat
- * @property {Boolean=} bigint
- */
-
-/**
- * Main function which ends up calling readdirRec and reads all files and directories in given root recursively.
- * @param {String} root Root directory
- * @param {ReaddirpArguments=} options Options to specify root (start directory), filters and recursion depth
- */
-const readdirp = (root, options = {}) => {
-  let type = options.entryType || options.type;
-  if (type === 'both') type = FILE_DIR_TYPE; // backwards-compatibility
-  if (type) options.type = type;
-  if (!root) {
-    throw new Error('readdirp: root argument is required. Usage: readdirp(root, options)');
-  } else if (typeof root !== 'string') {
-    throw new TypeError('readdirp: root argument must be a string. Usage: readdirp(root, options)');
-  } else if (type && !ALL_TYPES.includes(type)) {
-    throw new Error(`readdirp: Invalid type passed. Use one of ${ALL_TYPES.join(', ')}`);
-  }
-
-  options.root = root;
-  return new ReaddirpStream(options);
-};
-
-const readdirpPromise = (root, options = {}) => {
-  return new Promise((resolve, reject) => {
-    const files = [];
-    readdirp(root, options)
-      .on('data', entry => files.push(entry))
-      .on('end', () => resolve(files))
-      .on('error', error => reject(error));
-  });
-};
-
-readdirp.promise = readdirpPromise;
-readdirp.ReaddirpStream = ReaddirpStream;
-readdirp.default = readdirp;
-
-module.exports = readdirp;
diff --git a/node_modules/readdirp/package.json b/node_modules/readdirp/package.json
deleted file mode 100644
index dba53888eab84f1e2657ea3516971fe2eb225743..0000000000000000000000000000000000000000
--- a/node_modules/readdirp/package.json
+++ /dev/null
@@ -1,122 +0,0 @@
-{
-  "name": "readdirp",
-  "description": "Recursive version of fs.readdir with streaming API.",
-  "version": "3.6.0",
-  "homepage": "https://github.com/paulmillr/readdirp",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/paulmillr/readdirp.git"
-  },
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/paulmillr/readdirp/issues"
-  },
-  "author": "Thorsten Lorenz <thlorenz@gmx.de> (thlorenz.com)",
-  "contributors": [
-    "Thorsten Lorenz <thlorenz@gmx.de> (thlorenz.com)",
-    "Paul Miller (https://paulmillr.com)"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=8.10.0"
-  },
-  "files": [
-    "index.js",
-    "index.d.ts"
-  ],
-  "keywords": [
-    "recursive",
-    "fs",
-    "stream",
-    "streams",
-    "readdir",
-    "filesystem",
-    "find",
-    "filter"
-  ],
-  "scripts": {
-    "dtslint": "dtslint",
-    "nyc": "nyc",
-    "mocha": "mocha --exit",
-    "lint": "eslint --report-unused-disable-directives --ignore-path .gitignore .",
-    "test": "npm run lint && nyc npm run mocha"
-  },
-  "dependencies": {
-    "picomatch": "^2.2.1"
-  },
-  "devDependencies": {
-    "@types/node": "^14",
-    "chai": "^4.2",
-    "chai-subset": "^1.6",
-    "dtslint": "^3.3.0",
-    "eslint": "^7.0.0",
-    "mocha": "^7.1.1",
-    "nyc": "^15.0.0",
-    "rimraf": "^3.0.0",
-    "typescript": "^4.0.3"
-  },
-  "nyc": {
-    "reporter": [
-      "html",
-      "text"
-    ]
-  },
-  "eslintConfig": {
-    "root": true,
-    "extends": "eslint:recommended",
-    "parserOptions": {
-      "ecmaVersion": 9,
-      "sourceType": "script"
-    },
-    "env": {
-      "node": true,
-      "es6": true
-    },
-    "rules": {
-      "array-callback-return": "error",
-      "no-empty": [
-        "error",
-        {
-          "allowEmptyCatch": true
-        }
-      ],
-      "no-else-return": [
-        "error",
-        {
-          "allowElseIf": false
-        }
-      ],
-      "no-lonely-if": "error",
-      "no-var": "error",
-      "object-shorthand": "error",
-      "prefer-arrow-callback": [
-        "error",
-        {
-          "allowNamedFunctions": true
-        }
-      ],
-      "prefer-const": [
-        "error",
-        {
-          "ignoreReadBeforeAssign": true
-        }
-      ],
-      "prefer-destructuring": [
-        "error",
-        {
-          "object": true,
-          "array": false
-        }
-      ],
-      "prefer-spread": "error",
-      "prefer-template": "error",
-      "radix": "error",
-      "semi": "error",
-      "strict": "error",
-      "quotes": [
-        "error",
-        "single"
-      ]
-    }
-  }
-}
diff --git a/node_modules/redeyed/.npmignore b/node_modules/redeyed/.npmignore
deleted file mode 100644
index 7dccd970766aff6bd61d92a96b35a805c90678c6..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/.npmignore
+++ /dev/null
@@ -1,15 +0,0 @@
-lib-cov
-*.seed
-*.log
-*.csv
-*.dat
-*.out
-*.pid
-*.gz
-
-pids
-logs
-results
-
-node_modules
-npm-debug.log
\ No newline at end of file
diff --git a/node_modules/redeyed/.travis.yml b/node_modules/redeyed/.travis.yml
deleted file mode 100644
index 84fd7ca248abca3d4407f1a1c2430f55f5d90bf2..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: node_js
-node_js:
-  - 0.6
-  - 0.8
-  - 0.9
diff --git a/node_modules/redeyed/Changelog.md b/node_modules/redeyed/Changelog.md
deleted file mode 100644
index ab1f7bbadea07c4154268a4a94c3dd504e0d9077..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/Changelog.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Changelog
-
-### 0.4
-- browser support
-
-### 0.3
-- passing more information into {Function} config
-- API change: returning {Object} with code, ast, comments and tokens attached instead of just a code {String}
-- comments support
-
-### 0.2 
-- upgrade to Esprima 1.0.0
-
-### 0.1
-- first working version
diff --git a/node_modules/redeyed/LICENSE b/node_modules/redeyed/LICENSE
deleted file mode 100644
index 19c037f3b9ccd64a734039fb973be4b72b944a55..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-Copyright 2012 Thorsten Lorenz. 
-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/redeyed/README.md b/node_modules/redeyed/README.md
deleted file mode 100644
index 81b8a533eb5711653ef8ae41387ddba7e4923588..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/README.md
+++ /dev/null
@@ -1,192 +0,0 @@
-# redeyed [![build status](https://secure.travis-ci.org/thlorenz/redeyed.png?branch=master)](http://travis-ci.org/thlorenz/redeyed)
-
-*Add color to your JavaScript!*
-
-![frog](http://allaboutfrogs.org/gallery/photos/redeyes/red1.gif)
-
-[Red Eyed Tree Frog](http://allaboutfrogs.org/info/species/redeye.html) *(Agalychnis callidryas)*
-
-## What?
-
-Takes JavaScript code, along with a config and returns the original code with tokens wrapped and/or replaced as configured.
-
-## Where?
-
-- server side using nodejs
-- in the [browser](#browser-support)
-
-## What for?
-
-One usecase is adding metadata to your code that can then be used to apply syntax highlighting.
-
-## How?
-
-- copy the [config.js](https://github.com/thlorenz/redeyed/blob/master/config.js) and edit it in order to specify how
-  certain tokens are to be surrounded/replaced
-- replace the `undefined` of each token you want to configure with one of the following
-
-### {String} config
-
-`'before:after'`
-
-wraps the token inside before/after 
-
-### {Object} config
-
-`{ _before: 'before', _after: 'after' }`
-
-wraps token inside before/after
-
-#### Missing before and after resolution for {String} and {Object} config
-
-For the `{String}` and `{Object}` configurations, 'before' or 'after' may be omitted:
-
-- `{String}`: 
-  - `'before:'` (omitting 'after')
-  - `':after'` (omitting 'before')
-- `{Object}`: 
-  - `{ _before: 'before' }` (omitting '_after')
-  - `{ _after: 'after' }` (omitting '_before')
-
-In these cases the missing half is resolved as follows:
-
-- from the `parent._default` (i.e., `Keyword._default`) if found
-- otherwise from the `config._default` if found
-- otherwise `''` (empty string)
-
-### {Function} config
-
-`function (tokenString, info) { return {String}|{Object}; }`
-
-#### Inputs
-
-- tokenString: the content of the token that is currently being processed
-- info: an object with the following structure
-
-```js
-{
-    // {Int}
-    // the index of the token being processed inside tokens
-    tokenIndex
-
-    // {Array}
-    // all tokens that are being processed including comments 
-    // (i.e. the result of merging esprima tokens and comments)
-  , tokens  
-
-    // {Object} 
-    // the abstract syntax tree of the parsed code
-  , ast  
-
-    // {String}
-    // the code that was parsed (same string as the one passed to redeyed(code ..)
-  , code
-}
-```
-
-In most cases the `tokenString` is all you need. The extra info object is passed in case you need to gather more
-information about the `token`'s surroundings in order to decide how to transform it. 
-See: [replace-log-example](https://github.com/thlorenz/redeyed/blob/master/examples/replace-log.js)
-
-#### Output
-
-You can return a {String} or an {Object} from a {Function} config.
-
-- when returning a {String}, the token value will be replaced with it
-- when returning an {Object}, it should be of the following form:
-
-```js
-{
-    // {String}
-    // the string that should be substituted for the value of the current and all skipped tokens
-    replacement
-
-    // {Object} (Token)
-    // the token after which processing should continue
-    // all tokens in between the current one and this one inclusive will be ignored
-  , skipPastToken
-}
-```
-
-### Transforming JavaScript code
-
-***redeyed(code, config[, opts])***
-
-Invoke redeyed with your **config**uration, a **code** snippet and maybe **opts** as in the below example:
-
-```javascript
-var redeyed = require('redeyed')
-  , config = require('./path/to/config')
-  , code = 'var a = 3;'
-  , result;
-
-// redeyed will throw an error (caused by the esprima parser) if the code has invalid javascript
-try {
-  result = redeyed(code, config);
-  console.log(result.code);
-} catch(err) {
-  console.error(err);
-}
-```
-
-***opts***:
-```js
-{ // {Boolean}
-  // if true `result.code` is not assigned and therefore `undefined`
-  // if false (default) `result.code` property contains the result of `split.join`
-  nojoin: true|false
-}
-```
-
-***return value***:
-
-```js
-{   ast      
-  , tokens   
-  , comments 
-  , splits   
-  , code     
-}
-```
-
-- ast `{Array}`: [abstract syntax tree](http://en.wikipedia.org/wiki/Abstract_syntax_tree) as returned by [esprima
-  parse](http://en.wikipedia.org/wiki/Abstract_syntax_tree)
-- tokens `{Array}`: [tokens](http://en.wikipedia.org/wiki/Token_(parser)) provided by esprima (excluding
-  comments)
-- comments `{Array}`: block and line comments as provided by esprima
-- splits `{Array}`: code pieces split up, some of which where transformed as configured
-- code `{String}`: transformed code, same as `splits.join('')` unless this step has been skipped (see opts)
-
-## Browser Support
-
-### AMD
-
-Ensure to include [esprima](https://github.com/ariya/esprima) as one of your dependencies
-
-```js
-define(['redeyed'], function (redeyed) {
- [ .. ]
-});
-```
-
-### Attached to global window object
-
-The `redeyed {Function}` will be exposed globally as `window.redeyed` - big surprise!
-
-```html
-<script type="text/javascript" src="https://raw.github.com/ariya/esprima/master/esprima.js"></script>
-<script type="text/javascript" src="path/to/redeyed.js"></script>
-```
-
-## redeyed in the wild
-
-- [cardinal](https://github.com/thlorenz/cardinal): Syntax highlights JavaScript code with ANSI colors to be printed to
-  the terminal
-- [peacock](http://thlorenz.github.com/peacock/): JavaScript syntax highlighter that generates html that is compatible
-  with pygments styles.
-
-## Examples
-
-- `npm explore redeyed; npm demo` will let you try the [browser example](https://github.com/thlorenz/redeyed/tree/master/examples/browser)
-- `npm explore redeyed; npm demo-log` will let you try the [replace log example](https://github.com/thlorenz/redeyed/blob/master/examples/replace-log.js)
-
diff --git a/node_modules/redeyed/config.js b/node_modules/redeyed/config.js
deleted file mode 100644
index ade0de8e7250072f51d051702d464f9b8ab15703..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/config.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/* 
- * Copy this file and use it as a starting point for your redeyed config.
- * Just fill in the tokens you want to surround/replace.
- * Keep in mind that more specific configurations override less specific ones.
- */
-
-module.exports = {
-
-    'Boolean': {
-      'true'   :  undefined
-    , 'false'  :  undefined
-    , _default :  undefined
-    }
-
-  , 'Identifier': {
-      _default: undefined
-    }
-
-  , 'Null': {
-      _default: undefined
-    }
-
-  , 'Numeric': {
-      _default: undefined
-    }
-
-  , 'String': {
-      _default: undefined
-    }
-
-  , 'Keyword': {
-      'break'       :  undefined
-
-    , 'case'        :  undefined
-    , 'catch'       :  undefined
-    , 'continue'    :  undefined
-
-    , 'debugger'    :  undefined
-    , 'default'     :  undefined
-    , 'delete'      :  undefined
-    , 'do'          :  undefined
-
-    , 'else'        :  undefined
-
-    , 'finally'     :  undefined
-    , 'for'         :  undefined
-    , 'function'    :  undefined
-
-    , 'if'          :  undefined
-    , 'in'          :  undefined
-    , 'instanceof'  :  undefined
-
-    , 'new'         :  undefined
-    , 'return'      :  undefined
-    , 'switch'      :  undefined
-
-    , 'this'        :  undefined
-    , 'throw'       :  undefined
-    , 'try'         :  undefined
-    , 'typeof'      :  undefined
-
-    , 'var'         :  undefined
-    , 'void'        :  undefined
-
-    , 'while'       :  undefined
-    , 'with'        :  undefined
-    , _default      :  undefined
-  }
-  , 'Punctuator': {
-      ';': undefined  
-    , '.': undefined  
-    , ',': undefined  
-
-    , '{': undefined  
-    , '}': undefined  
-    , '(': undefined  
-    , ')': undefined  
-    , '[': undefined
-    , ']': undefined
-
-    , '<': undefined
-    , '>': undefined
-    , '+': undefined
-    , '-': undefined
-    , '*': undefined
-    , '%': undefined
-    , '&': undefined
-    , '|': undefined
-    , '^': undefined
-    , '!': undefined
-    , '~': undefined
-    , '?': undefined
-    , ':': undefined
-    , '=': undefined
-
-    , '<=': undefined
-    , '>=': undefined
-    , '==': undefined
-    , '!=': undefined
-    , '++': undefined
-    , '--': undefined
-    , '<<': undefined
-    , '>>': undefined
-    , '&&': undefined
-    , '||': undefined
-    , '+=': undefined
-    , '-=': undefined
-    , '*=': undefined
-    , '%=': undefined
-    , '&=': undefined
-    , '|=': undefined
-    , '^=': undefined
-    , '/=': undefined
-
-    , '===': undefined
-    , '!==': undefined
-    , '>>>': undefined
-    , '<<=': undefined
-    , '>>=': undefined
-    
-    , '>>>=': undefined
-
-    , _default: undefined
-  }
-
-  // line comment
-  , Line: {
-     _default: undefined
-    }
-
-  /* block comment */
-  , Block: {
-     _default: undefined
-    }
-
-  , _default: undefined
-};
diff --git a/node_modules/redeyed/examples/browser/index.css b/node_modules/redeyed/examples/browser/index.css
deleted file mode 100644
index fc9206eeced7daaba1c8ec502ee427e184d31a14..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/examples/browser/index.css
+++ /dev/null
@@ -1,31 +0,0 @@
-.code {
-  width: 500px;
-  height: 500px;
-  display: block;
-}
-
-.config {
-  width: 500px;
-  height: 400px;
-  display: block;
-}
-
-.go {
-  display: block;
-  float: right;
-  font-size: 18px;
-}
-
-.result {
-  width: 500px;
-  height: 1000px;
-  display: block;
-}
-
-.edit {
-  float: left;
-}
-
-.results {
-  float: left;
-}
diff --git a/node_modules/redeyed/examples/browser/index.html b/node_modules/redeyed/examples/browser/index.html
deleted file mode 100644
index a20ea4c70a72da5c75a96f043e7ce8e1a9095968..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/examples/browser/index.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <meta charset=utf-8 />
-    <title></title>
-    <link rel="stylesheet" type="text/css" media="screen" href="index.css" />
-</head>
-<body>
-    <header>
-        <span>Change the config and/or the original code in order to affect the "redeyed" result</span>
-    </header>
-    <section class="edit">
-        <section>
-            <h3>Redeyed Config </h3>
-            <textarea class="config"></textarea>
-            <button class="go">Go</button>
-        </section>
-        <section>
-            <h3>Original Code</h3>
-            <textarea class="code"></textarea>
-        </section>
-    </section>
-    <section class="results">
-        <h3>Result</h3>
-        <textarea class="result" readonly="readonly"></textarea>
-    </section>
-
-
-    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
-    <script type="text/javascript" src="https://raw.github.com/ariya/esprima/master/esprima.js"></script>
-    <script type="text/javascript" src="../../redeyed.js"></script>
-    <script type="text/javascript" src="./sample-config.js"></script>
-    <script type="text/javascript" src="./index.js"></script>
-</body>
-</html>
diff --git a/node_modules/redeyed/examples/browser/index.js b/node_modules/redeyed/examples/browser/index.js
deleted file mode 100644
index 82fd22fc49e22860f9156f123156316f6352cd36..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/examples/browser/index.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var $code   =  $('.code')
-  , $config =  $('.config')
-  , $result =  $('.result')
-  ;
-
-function go () {
-  var config;
-  try {
-     config = JSON.parse($config.val());
-  } catch (e) {
-    $result.val('In "Redeyed Config": ' + e.toString());
-    return;
-  }
-
-  try {
-    var code = $code.val()
-      , result = redeyed(code, config);
-
-    $result.val(result.code);
-  } catch (e) {
-    $result.val('In "Original Code": ' + e.toString());
-  }
-}
-
-$code.val(window.redeyed.toString());
-
-$config.val(JSON.stringify(window.sampleConfig, false, 2));
-
-$('.go').click(go);
-
-go();
-
-
diff --git a/node_modules/redeyed/examples/browser/sample-config.js b/node_modules/redeyed/examples/browser/sample-config.js
deleted file mode 100644
index 47456efa20479d52e03653c91f96746f2f847f40..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/examples/browser/sample-config.js
+++ /dev/null
@@ -1,131 +0,0 @@
-window.sampleConfig = {
-
-    'Boolean': {
-      'true'   :  undefined
-    , 'false'  :  undefined
-    , _default :  '?:?'
-    }
-
-  , 'Identifier': {
-      _default: '-> : <-'
-    }
-
-  , 'Null': {
-      _default: '**:**'
-    }
-
-  , 'Numeric': {
-      _default: 'n:N'
-    }
-
-  , 'String': {
-      _default: 'string -> :'
-    }
-
-  , 'Keyword': {
-      'break'       :  undefined
-
-    , 'case'        :  undefined
-    , 'catch'       :  undefined
-    , 'continue'    :  undefined
-
-    , 'debugger'    :  undefined
-    , 'default'     :  undefined
-    , 'delete'      :  undefined
-    , 'do'          :  undefined
-
-    , 'else'        :  undefined
-
-    , 'finally'     :  undefined
-    , 'for'         :  undefined
-    , 'function'    :  undefined
-
-    , 'if'          :  undefined
-    , 'in'          :  undefined
-    , 'instanceof'  :  undefined
-
-    , 'new'         :  undefined
-    , 'return'      :  undefined
-    , 'switch'      :  undefined
-
-    , 'this'        :  undefined
-    , 'throw'       :  undefined
-    , 'try'         :  undefined
-    , 'typeof'      :  undefined
-
-    , 'var'         :  undefined
-    , 'void'        :  undefined
-
-    , 'while'       :  undefined
-    , 'with'        :  undefined
-    , _default      :  ': <- keyword'
-  }
-  , 'Punctuator': {
-      ';': undefined  
-    , '.': undefined  
-    , ',': undefined  
-
-    , '{': undefined  
-    , '}': undefined  
-    , '(': undefined  
-    , ')': undefined  
-    , '[': undefined
-    , ']': undefined
-
-    , '<': undefined
-    , '>': undefined
-    , '+': undefined
-    , '-': undefined
-    , '*': undefined
-    , '%': undefined
-    , '&': undefined
-    , '|': undefined
-    , '^': undefined
-    , '!': undefined
-    , '~': undefined
-    , '?': undefined
-    , ':': undefined
-    , '=': undefined
-
-    , '<=': undefined
-    , '>=': undefined
-    , '==': undefined
-    , '!=': undefined
-    , '++': undefined
-    , '--': undefined
-    , '<<': undefined
-    , '>>': undefined
-    , '&&': undefined
-    , '||': undefined
-    , '+=': undefined
-    , '-=': undefined
-    , '*=': undefined
-    , '%=': undefined
-    , '&=': undefined
-    , '|=': undefined
-    , '^=': undefined
-    , '/=': undefined
-
-    , '===': undefined
-    , '!==': undefined
-    , '>>>': undefined
-    , '<<=': undefined
-    , '>>=': undefined
-    
-    , '>>>=': undefined
-
-    , _default: undefined
-  }
-
-  // line comment
-  , Line: {
-     _default: undefined
-    }
-
-  /* block comment */
-  , Block: {
-     _default: undefined
-    }
-
-  , _default: undefined
-};
diff --git a/node_modules/redeyed/examples/replace-log.js b/node_modules/redeyed/examples/replace-log.js
deleted file mode 100644
index 4b12ccf9b49cbd6b8ec5d76189c7acffa1b0d51a..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/examples/replace-log.js
+++ /dev/null
@@ -1,61 +0,0 @@
-var path    =  require('path')
-  , fs      =  require('fs')
-  , redeyed =  require('..')
-  , vm      =  require('vm')
-  ;
-
-var samplePath =  path.join(__dirname, 'sources', 'log.js')
-  , origCode   =  fs.readFileSync(samplePath, 'utf-8')
-  , kinds = ['silly', 'info', 'warn', 'error' ]
-  ;
-
-function replaceConsole(s, info) {
-  var code        =  info.code
-    , idx         =  info.tokenIndex
-    , tokens      =  info.tokens
-    , next        =  tokens[idx + 1].value
-    , kind        =  tokens[idx + 2].value
-    , openParen   =  tokens[idx + 3].value
-    , firstArgTkn =  tokens[idx + 4]
-    , argIdx      =  idx + 3
-    , open
-    , tkn
-    ;
-
-  if (kind === 'log') kind = 'silly';
-
-  // not a console.xxx(...) statement? -> just return original
-  if (next !== '.' || !~kinds.indexOf(kind) || openParen !== '(') return s;
-
-  // skip past arguments to console.xxx all args from ( to )
-  open = 1;
-  while (open) {
-    tkn = tokens[++argIdx];
-
-    // count open parens vs. closed ones to handle things like console.log(new Error('..'));
-    if (tkn.value === '(') open++;
-    if (tkn.value === ')') open--;
-  }
-
-  // tkn now is the last closing paren
-  var argsIncludingClosingParen =  code.slice(firstArgTkn.range[0], tkn.range[1])
-    , result                    =  'log.' + kind + '("main-logger", ' + argsIncludingClosingParen;
-  
-  // tell redeyed to skip the entire console.xxx(..) statement since we are replacing it all
-  return { replacement: result, skipPastToken: tkn }; 
-}
-
-function transformAndRun () {
-  var config = {
-        Identifier: { console: replaceConsole }
-      }
-    , code        =  redeyed(origCode, config).code
-    , context     =  vm.createContext({ require: require });
-
-  console.log('Original code:\n', origCode);
-  console.log('\nlog calls replaced:\n', code);
-  console.log('\nLets run it:');
-  vm.runInContext(code, context, 'transformed-log.vm');
-}
-
-transformAndRun();
diff --git a/node_modules/redeyed/examples/sources/log.js b/node_modules/redeyed/examples/sources/log.js
deleted file mode 100644
index 7994d2fb9c07704e7d336d04e1b17ee0ed574426..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/examples/sources/log.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// First two lines will be needed when we replaced all console.xxx statements with log.xxx
-var log = require('npmlog');
-log.level = 'silly';
-
-console.info('info ', 1);
-console.log('log ', 2);
-console.warn('warn ', 3);
-console.error('error ', new Error('oh my!'));
diff --git a/node_modules/redeyed/package.json b/node_modules/redeyed/package.json
deleted file mode 100644
index 7ceeca2299e5ddb7244e28815e0ad02543b93129..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "redeyed",
-  "version": "0.4.4",
-  "description": "Takes JavaScript code, along with a config and returns the original code with tokens wrapped as configured.",
-  "author": "Thorsten Lorenz <thlorenz@gmx.de> (thlorenz.com)",
-  "main": "redeyed.js",
-  "scripts": {
-    "test": "tap test/*.js",
-    "demo-log": "node examples/replace-log",
-    "demo": "cd examples/browser; open index.html"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/thlorenz/redeyed.git"
-  },
-  "keywords": [
-    "ast",
-    "syntax",
-    "tree",
-    "source",
-    "wrap",
-    "metadata"
-  ],
-  "license": "MIT",
-  "devDependencies": {
-    "tap": "~0.4.8",
-    "readdirp": "~0.3.3",
-    "cardinal": "~0.4.4"
-  },
-  "dependencies": {
-    "esprima": "~1.0.4"
-  }
-}
diff --git a/node_modules/redeyed/redeyed.js b/node_modules/redeyed/redeyed.js
deleted file mode 100644
index 7a326cb92f4e2fb58bcd87773a4b0eff7e297daa..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/redeyed.js
+++ /dev/null
@@ -1,291 +0,0 @@
-;(function () {
-
-'use strict';
-/*jshint laxbreak: true,  browser:true */
-/*global define*/
-
-var esprima
-  , exportFn
-  , toString = Object.prototype.toString
-  ;
-
-if (typeof module === 'object' && typeof module.exports === 'object' && typeof require === 'function') {
-  // server side
-  esprima = require('esprima');
-  exportFn = function (redeyed) { module.exports = redeyed; };
-  bootstrap(esprima, exportFn);
-} else if (typeof define === 'function' && define.amd) {
-  // client side
-  // amd
-  define(['esprima'], function (esprima) {
-      return bootstrap(esprima);
-  });
-} else if (typeof window === 'object') {
-  // no amd -> attach to window if it exists
-  // Note that this requires 'esprima' to be defined on the window, so that script has to be loaded first
-  window.redeyed = bootstrap(window.esprima);
-}
-
-function bootstrap(esprima, exportFn) {
-
-  function isFunction (obj) {
-    return toString.call(obj) === '[object Function]';
-  }
-
-  function isString (obj) {
-    return toString.call(obj) === '[object String]';
-  }
-
-  function isNumber (obj) {
-    return toString.call(obj) === '[object Number]';
-  }
-
-  function isObject (obj) {
-    return toString.call(obj) === '[object Object]';
-  }
-
-  function surroundWith (before, after) {
-    return function (s) { return before + s + after; };
-  }
-
-  function isNonCircular(key) { 
-    return key !== '_parent'; 
-  }
-
-  function objectizeString (value) {
-    var vals = value.split(':');
-
-    if (0 === vals.length || vals.length > 2) 
-      throw new Error(
-        'illegal string config: ' + value +
-        '\nShould be of format "before:after"'
-      );
-
-    if (vals.length === 1 || vals[1].length === 0) {
-      return vals.indexOf(':') < 0 ? { _before: vals[0] } : { _after: vals[0] };
-    } else {
-      return { _before: vals[0], _after: vals[1] };
-    }
-  }
-
-  function objectize (node) {
-
-    // Converts 'bef:aft' to { _before: bef, _after: aft } 
-    // and resolves undefined before/after from parent or root
-
-    function resolve (value, key) {
-      // resolve before/after from root or parent if it isn't present on the current node
-      if (!value._parent) return undefined;
-      
-      // Immediate parent
-      if (value._parent._default && value._parent._default[key]) return value._parent._default[key];
-
-      // Root
-      var root = value._parent._parent;
-      if (!root) return undefined;
-
-      return root._default ? root._default[key] : undefined;
-    }
-
-    function process (key) {
-      var value = node[key];
-
-      if (!value) return;
-      if (isFunction(value)) return;
-
-      // normalize all strings to objects
-      if (isString(value)) {
-        node[key] = value = objectizeString(value);
-      }
-      
-      value._parent = node;
-      if (isObject(value)) {
-        if (!value._before && !value._after) return objectize (value);
-
-        // resolve missing _before or _after from parent(s) 
-        // in case we only have either one on this node
-        value._before =  value._before || resolve(value, '_before');
-        value._after  =  value._after  || resolve(value, '_after');
-        
-        return;
-      } 
-
-      throw new Error('nodes need to be either {String}, {Object} or {Function}.' + value + ' is neither.');
-    }
-
-    // Process _default ones first so children can resolve missing before/after from them
-    if (node._default) process('_default');
-
-    Object.keys(node)
-      .filter(function (key) {
-        return isNonCircular(key) 
-          && node.hasOwnProperty(key)
-          && key !== '_before' 
-          && key !== '_after' 
-          && key !== '_default';
-      })
-      .forEach(process);
-  }
-
-  function functionize (node) {
-    Object.keys(node)
-      .filter(function (key) { 
-        return isNonCircular(key) && node.hasOwnProperty(key);
-      })
-      .forEach(function (key) {
-        var value = node[key];
-
-        if (isFunction(value)) return;
-
-        if (isObject(value)) {
-
-          if (!value._before && !value._after) return functionize(value);
-
-          // at this point before/after were "inherited" from the parent or root
-          // (see objectize)
-          var before = value._before || '';
-          var after = value._after || '';
-
-          node[key] = surroundWith (before, after);
-          return node[key];
-        }
-      });
-  }
-
-  function normalize (root) {
-    objectize(root);
-    functionize(root);
-  }
-
-  function mergeTokensAndComments(tokens, comments) {
-    var all = {};
-
-    function addToAllByRangeStart(t) { all[ t.range[0] ] = t; }
-
-    tokens.forEach(addToAllByRangeStart);
-    comments.forEach(addToAllByRangeStart);
-
-    // keys are sorted automatically
-    return Object.keys(all)
-      .map(function (k) { return all[k]; });
-  }
-
-  function redeyed (code, config, opts) {
-    opts = opts || {};
-
-    // remove shebang
-    code = code.replace(/^\#\!.*/, '');
-
-    var ast = esprima.parse(code, { tokens: true, comment: true, range: true, tolerant: true })
-      , tokens = ast.tokens
-      , comments = ast.comments
-      , lastSplitEnd = 0
-      , splits = []
-      , transformedCode
-      , all
-      , info
-      ;
-
-    normalize(config);
-
-    function tokenIndex(tokens, tkn, start) {
-      var current
-        , rangeStart = tkn.range[0];
-
-      for (current = start; current < tokens.length; current++) {
-        if (tokens[current].range[0] === rangeStart) return current;
-      }
-
-      throw new Error('Token %s not found at or after index: %d', tkn, start);
-    }
-
-    function process(surround) {
-      var result
-        , currentIndex
-        , nextIndex
-        , skip = 0
-        , splitEnd
-        ;
-
-      result = surround(code.slice(start, end), info);
-      if (isObject(result)) {
-        splits.push(result.replacement);
-
-        currentIndex =  info.tokenIndex;
-        nextIndex    =  tokenIndex(info.tokens, result.skipPastToken, currentIndex);
-        skip         =  nextIndex - currentIndex;
-        splitEnd     =  skip > 0 ? tokens[nextIndex - 1].range[1] : end;
-      } else {
-        splits.push(result);
-        splitEnd = end;
-      }
-
-      return { skip: skip, splitEnd: splitEnd  };
-    }
-
-    function addSplit (start, end, surround, info) {
-      var result
-        , nextIndex
-        , skip = 0
-        ;
-
-      if (start >= end) return;
-      if (surround) {
-        result       =  process(surround);
-        skip         =  result.skip;
-        lastSplitEnd =  result.splitEnd;
-      } else {
-        splits.push(code.slice(start, end));
-        lastSplitEnd = end;
-      }
-
-      return skip;
-    }
-
-    all = mergeTokensAndComments(tokens, comments);
-    for (var tokenIdx = 0; tokenIdx < all.length; tokenIdx++) {
-      var token = all[tokenIdx]
-        , surroundForType = config[token.type]
-        , surround
-        , start
-        , end;
-      
-      // At least the type (e.g., 'Keyword') needs to be specified for the token to be surrounded
-      if (surroundForType) {
-
-        // root defaults are only taken into account while resolving before/after otherwise
-        // a root default would apply to everything, even if no type default was specified
-        surround = surroundForType 
-          && surroundForType.hasOwnProperty(token.value) 
-          && surroundForType[token.value]
-          && isFunction(surroundForType[token.value])
-            ? surroundForType[token.value] 
-            : surroundForType._default;
-
-        start = token.range[0];
-        end = token.range[1];
-
-        addSplit(lastSplitEnd, start);
-        info = { tokenIndex: tokenIdx, tokens: all, ast: ast, code: code };
-        tokenIdx += addSplit(start, end, surround, info);
-      }
-    }
-
-    if (lastSplitEnd < code.length) {
-      addSplit(lastSplitEnd, code.length);
-    }
-
-  transformedCode = opts.nojoin ? undefined : splits.join('');
-
-    return { 
-        ast      :  ast
-      , tokens   :  tokens
-      , comments :  comments
-      , splits   :  splits
-      , code     :  transformedCode
-    };
-  }
-
-  return exportFn ? exportFn(redeyed) : redeyed;
-}
-})();
diff --git a/node_modules/redeyed/test/redeyed-before-after-config.js b/node_modules/redeyed/test/redeyed-before-after-config.js
deleted file mode 100644
index d0f8284c762a8a33cdda3dfa655fc0115f38edcb..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/test/redeyed-before-after-config.js
+++ /dev/null
@@ -1,54 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , redeyed = require('..')
-
-function inspect (obj) {
-  return util.inspect(obj, false, 5, true)
-}
-
-test('adding custom asserts ... ', function (t) {
-  t.constructor.prototype.assertSurrounds = function (code, opts, expected) {
-    var result = redeyed(code, opts).code
-    this.equals(result, expected, inspect(code) + ' => ' + inspect(expected))
-    return this;
-  }
-
-  t.end() 
-})
-test('\nbefore/after config, keywords', function (t) {
-
-  var opts001 = { Keyword: { _default: { _before: '*', _after: '&' } } };  
-  t.test('\n# ' + inspect(opts001), function (t) {
-    t.assertSurrounds('this', opts001, '*this&')
-    t.assertSurrounds('if (a == 1) return', opts001, '*if& (a == 1) *return&')
-    t.assertSurrounds('var n = new Test();', opts001, '*var& n = *new& Test();')
-    t.end()
-  })
-  
-  var opts002 = { 
-    Keyword: { 
-        'function': { _before: '^' }
-      , 'return': { _before: '(', _after: ')' }
-      , _default: { _before: '*' , _after: '&' }
-    } 
-  };  
-
-  t.test('\n# ' + inspect(opts002), function (t) {
-    t.assertSurrounds(
-        [ 'function foo (bar) {'
-        , ' var a = 3;'
-        , ' return bar + a;'
-        , '}'
-        ].join('\n')
-      , opts002
-      , [ '^function& foo (bar) {'
-        , ' *var& a = 3;'
-        , ' (return) bar + a;'
-        , '}'
-        ].join('\n'))
-    t.end()
-  })
-})
diff --git a/node_modules/redeyed/test/redeyed-browser.js b/node_modules/redeyed/test/redeyed-browser.js
deleted file mode 100644
index ddb25ce46d430c8b36bb4905283f42b8db8bf12a..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/test/redeyed-browser.js
+++ /dev/null
@@ -1,69 +0,0 @@
-'use strict'
-/*jshint asi: true, browser: true*/
-/*global define window */
-
-var test = require('tap').test
-  , util = require('util')
-  , redeyedExport = require('..')
-  , redeyedkey = require.resolve('..')
-  , esprima = require('esprima')
-
-function setup() {
-  // remove redeyed from require cache to force re-require for each test
-  delete require.cache[redeyedkey];
-  
-  // remove globals
-  delete global.window;
-  delete global.define;
-}
-
-// TODO: need to run in vm in order to properly simulate require and module not being present
-return;
-test('define and window exist', function (t) {
-  var defineCb
-    , deps
-
-  setup()  
-
-  // declare browser globals
-  global.window = { }
-
-  global.define = function (deps_, cb) { 
-    deps_ = deps 
-    defineCb = cb 
-  }
-
-  define.amd = true
-
-  var redeyed = require('..')
-    , definedredeyed = defineCb(esprima)
-
-  t.equal(window.redeyed, undefined, 'redeyed is not attached to window')
-  t.notEqual(redeyed.toString(), redeyedExport.toString(), 'redeyed is not exported')
-  t.equal(definedredeyed.toString(), redeyedExport.toString(), 'redeyed is defined')
-
-  t.end()
-})
-
-test('window exists, but define doesn\'t', function (t) {
-  setup()  
-
-  // declare browser globals
-  global.window = { esprima: esprima }
-    
-  var redeyed = require('..')
-
-  t.equal(window.redeyed.toString(), redeyedExport.toString(), 'redeyed is attached to window')
-  t.notEqual(redeyed.toString(), redeyedExport.toString(), 'redeyed is not exported')
-  t.end()
-})
-
-test('neither window nor define exist', function (t) {
-  setup()  
-
-  var redeyed = require('..')
-
-  t.equal(redeyed.toString(), redeyedExport.toString(), 'redeyed is exported')
-  t.end()
-})
-
diff --git a/node_modules/redeyed/test/redeyed-comments.js b/node_modules/redeyed/test/redeyed-comments.js
deleted file mode 100644
index 09392cc5710cbd835c0c0f8276fef324e7ecaed0..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/test/redeyed-comments.js
+++ /dev/null
@@ -1,71 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , redeyed = require('..')
-
-function inspect (obj) {
-  return util.inspect(obj, false, 5, true)
-}
-
-test('adding custom asserts ... ', function (t) {
-  t.constructor.prototype.assertSurrounds = function (code, opts, expected) {
-    var result = redeyed(code, opts)
-    this.equals(result.code, expected, inspect(code) + ' => ' + inspect(expected))
-    return this;
-  }
-
-  t.end() 
-})
-
-test('\nstring config, Line comments', function (t) {
-  var opts = { Line: { _default: '*:&' } };
-  t.test('\n# ' + inspect(opts), function (t) {
-
-    t.assertSurrounds(
-        '// a comment'
-      , opts
-      , '*// a comment&'
-    )
-    t.assertSurrounds(
-        '// comment then new line\nif (a == 1) return'
-      , opts
-      , '*// comment then new line&\nif (a == 1) return'
-    )
-    t.assertSurrounds(
-        'var n = new Test();// some comment after\n//more comment\nvar s = 3;'
-      , opts
-      , 'var n = new Test();*// some comment after&\n*//more comment&\nvar s = 3;'
-    )
-    t.end()
-  })
-})
-
-test('\nstring config, Block comments', function (t) {
-  var opts = { Block: { _default: '_:-' } };
-  t.test('\n# ' + inspect(opts), function (t) {
-
-    t.assertSurrounds(
-        '/* a comment */'
-      , opts
-      , '_/* a comment */-'
-    )
-    t.assertSurrounds(
-        '/* comment then new line*/\nif (a == 1) /* inline */ return'
-      , opts
-      , '_/* comment then new line*/-\nif (a == 1) _/* inline */- return'
-    )
-    t.assertSurrounds(
-        'var n = new Test();/* some comment after*/\n/*more comment*/\nvar s = 3;'
-      , opts
-      , 'var n = new Test();_/* some comment after*/-\n_/*more comment*/-\nvar s = 3;'
-    )
-    t.assertSurrounds(
-        'var a = 4;\n/* Multi line comment\n * Next line\n * and another\n*/ var morecode = "here";'
-      , opts
-      , 'var a = 4;\n_/* Multi line comment\n * Next line\n * and another\n*/- var morecode = "here";'
-    )
-    t.end()
-  })
-})
diff --git a/node_modules/redeyed/test/redeyed-config-with-undefineds.js b/node_modules/redeyed/test/redeyed-config-with-undefineds.js
deleted file mode 100644
index 5ddc40d8f93b1efb8f1dcf3aa4afa172824dcfb6..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/test/redeyed-config-with-undefineds.js
+++ /dev/null
@@ -1,60 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , redeyed = require('..')
-
-function inspect (obj) {
-  return util.inspect(obj, false, 5, true)
-}
-
-test('adding custom asserts ... ', function (t) {
-  t.constructor.prototype.assertSurrounds = function (code, opts, expected) {
-    var optsi = inspect(opts);
-    var result = redeyed(code, opts).code
-
-    this.equals(  result
-                , expected
-                , util.format('%s: %s => %s', optsi, inspect(code), inspect(expected))
-               )
-    return this;
-  }
-
-  t.end() 
-})
-
-test('\n undefineds only', function (t) {
-  t.assertSurrounds('1 + 2', { Numeric: { _default: undefined } }, '1 + 2')
-  t.assertSurrounds('1 + 2', { Numeric: { _default: undefined }, _default: undefined }, '1 + 2')
-
-  t.assertSurrounds(
-      'return true'
-    , { 'Boolean': { 'true': undefined, 'false': undefined, _default: undefined } , _default: undefined }
-    , 'return true'
-  )
-
-  t.end()
-})
-
-test('\n mixed', function (t) {
-  t.assertSurrounds(
-      'return true || false'
-    , { 'Boolean': { 'true': '&:', 'false': undefined, _default: undefined } , _default: undefined }
-    , 'return &true || false'
-  )
-
-  t.assertSurrounds(
-      'return true || false'
-    , { 'Boolean': { 'true': '&:', 'false': undefined, _default: ':?' } , _default: undefined }
-    , 'return &true? || false?'
-  )
-
-  t.assertSurrounds(
-      'return true || false'
-    , { 'Boolean': { 'true': '&:', 'false': undefined, _default: undefined } , _default: ':?' }
-    , 'return &true? || false'
-  )
-  
-  t.end()
-})
diff --git a/node_modules/redeyed/test/redeyed-function-config-extra-params.js b/node_modules/redeyed/test/redeyed-function-config-extra-params.js
deleted file mode 100644
index f962b7cf74a6890009cdf286cd2ce2f3663771dd..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/test/redeyed-function-config-extra-params.js
+++ /dev/null
@@ -1,57 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , redeyed = require('..')
-
-function inspect (obj) {
-  return util.inspect(obj, false, 5, true)
-}
-
-test('function - config passing idx and tokens', function (t) {
-
-  var args = [] 
-    , opts001 = { 
-          Boolean: { 
-            _default: identity 
-          } 
-        , Keyword: { 
-            _default: identity 
-          } 
-        , Identifier: { 
-            _default: identity 
-          } 
-        , Punctuator: { 
-            _default: identity 
-          } 
-      }
-    , code = 'var fn = function () { return true; }'
-
-  function identity (s, info) { 
-    args.push( { value: s, idx: info.tokenIndex, tokens: info.tokens, code: info.code }) 
-    // returning unchanged string will keep the splits be equal to the original tokens
-    return s 
-  } 
-
-  function tokenValue (t) { return t.value; }
-
-  t.test(inspect(opts001) + ' -- ' + code, function (t) {
-
-    var result = redeyed(code, opts001, { splits: true })
-      , tokens = result.tokens
-    
-      t.equals(args.length, tokens.length, 'called with all tokens')
-      
-      for (var i = 0; i < tokens.length; i++) {
-        var token = tokens[i]
-          , arg = args[i]
-
-        t.equals(arg.value, token.value, 'passes correct value: ' + inspect([ arg.value, token.value ]))
-        t.equals(arg.idx, i, 'passes correct index')
-        t.equals(arg.code, code, 'passes code')
-        t.deepEquals(arg.tokens, tokens, 'passes all tokens')
-      }
-    t.end()
-  })
-})
diff --git a/node_modules/redeyed/test/redeyed-function-config-skipping-tokens.js b/node_modules/redeyed/test/redeyed-function-config-skipping-tokens.js
deleted file mode 100644
index ff142737b6e2ab28c18ed0f4d097ca8c6cc6f1c6..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/test/redeyed-function-config-skipping-tokens.js
+++ /dev/null
@@ -1,89 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , redeyed = require('..')
-
-function inspect (obj) {
-  return util.inspect(obj, false, 5, true)
-}
-
-          
-test('given i skip 2 more tokens after each semicolon', function (t) {
-  var calls = 0
-    , opts = {
-        Punctuator: {
-          ';':  function identity (s, info) {
-                  // tell it to skip past second to last token that is 2 ahead of the current one
-                  calls++
-                  var skipToken = info.tokens[info.tokenIndex + 2]
-                  return skipToken ? { replacement: s, skipPastToken: skipToken } : s;
-                }
-        }
-      }
-    ;
-
-  [  { code: ';;;'                   ,  expectedCalls: 1 }
-  ,  { code: ';;;;'                  ,  expectedCalls: 2 }
-  ,  { code: '; ; ; ;'               ,  expectedCalls: 2 }
-  ,  { code: ';;; ;;; ;;; ;'         ,  expectedCalls: 4 }
-  ,  { code: ';;; ;;; ;;; ;;; ;'     ,  expectedCalls: 5 }
-  ,  { code: ';;; ;;; ;;; ;;; ;;;'   ,  expectedCalls: 5 }
-  ,  { code: ';;; ;;; ;;; ;;; ;;; ;' ,  expectedCalls: 6 }
-  ].forEach(function (x) {
-      calls = 0
-      redeyed(x.code, opts);
-      t.equals(calls, x.expectedCalls, 'calls ' + x.expectedCalls + ' times for ' + x.code)
-    });
-  t.end()
-})
-
-test('replace log', function (t) {
-  var kinds = [ 'info', 'warn', 'error' ]
-    , opts = {
-        Identifier: { 
-          console: function replaceLog(s, info) {
-            var code        =  info.code
-              , idx         =  info.tokenIndex
-              , tokens      =  info.tokens
-              , kind        =  tokens[idx + 2].value
-              , openParen   =  tokens[idx + 3].value
-              , firstArgTkn =  tokens[idx + 4]
-              , argIdx      =  idx + 3
-              , open
-              , tkn
-              ;
-
-            open = 1;
-            while (open) {
-              tkn = tokens[++argIdx];
-
-              if (tkn.value === '(') open++;
-              if (tkn.value === ')') open--;
-            }
-
-            var argsIncludingClosingParen =  code.slice(firstArgTkn.range[0], tkn.range[1])
-              , result                    =  'log.' + kind + '("main-logger", ' + argsIncludingClosingParen;
-            
-            return { replacement: result, skipPastToken: tkn }; 
-          }
-        }
-      }
-
-   , origCode = [
-       'console.info("info ", 1);'
-     , 'console.warn("warn ", 3);'
-     , 'console.error("error ", new Error("oh my!"));'
-    ].join('\n')
-  
-  , expectedCode = [
-      'log.info("main-logger", "info ", 1));'
-    , 'log.warn("main-logger", "warn ", 3));'
-    , 'log.error("main-logger", "error ", new Error("oh my!")));'
-    ].join('\n')
-  , code = redeyed(origCode, opts).code
-
-  t.equals(code, expectedCode, 'transforms all log statements')
-  t.end()
-});
diff --git a/node_modules/redeyed/test/redeyed-function-config.js b/node_modules/redeyed/test/redeyed-function-config.js
deleted file mode 100644
index 6c5ed29e68c2388312d0f2d04e1754731c2eb943..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/test/redeyed-function-config.js
+++ /dev/null
@@ -1,142 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , redeyed = require('..')
-
-function inspect (obj) {
-  return util.inspect(obj, false, 5, true)
-}
-
-test('adding custom asserts ... ', function (t) {
-  t.constructor.prototype.assertSurrounds = function (code, opts, expected) {
-    var result = redeyed(code, opts).code
-    this.equals(result, expected, inspect(code) + ' => ' + inspect(expected))
-    return this;
-  }
-
-  t.end() 
-})
-
-test('\nfunction config, keywords', function (t) {
-
-  var opts001 = { Keyword: { _default: function (s) { return '*' + s + '&'; } } };
-  t.test('\n# ' + inspect(opts001), function (t) {
-    t.assertSurrounds('this', opts001, '*this&')
-
-    t.assertSurrounds('this ', opts001, '*this& ')
-    t.assertSurrounds(' this', opts001, ' *this&')
-    t.assertSurrounds('  this  ', opts001, '  *this&  ')
-    t.assertSurrounds('if (a == 1) return', opts001, '*if& (a == 1) *return&')
-    t.assertSurrounds('var n = new Test();', opts001, '*var& n = *new& Test();')
-    t.assertSurrounds(
-        [ 'function foo (bar) {'
-        , ' var a = 3;'
-        , ' return bar + a;'
-        , '}'
-        ].join('\n')
-      , opts001
-      , [ '*function& foo (bar) {'
-        , ' *var& a = 3;'
-        , ' *return& bar + a;'
-        , '}'
-        ].join('\n'))
-    t.end()
-  })
-
-  var opts002 = { 
-    Keyword: { 
-        'function': function (s) { return '^' + s + '&' }
-      , 'return':  function (s) { return '(' + s + ')' }
-      , _default: function (s) { return '*' + s + '&' }
-    } 
-  };  
-
-  t.test('\n# ' + inspect(opts002), function (t) {
-    t.assertSurrounds(
-        [ 'function foo (bar) {'
-        , ' var a = 3;'
-        , ' return bar + a;'
-        , '}'
-        ].join('\n')
-      , opts002
-      , [ '^function& foo (bar) {'
-        , ' *var& a = 3;'
-        , ' (return) bar + a;'
-        , '}'
-        ].join('\n'))
-    t.end()
-  })
-})
-
-test('#\n functin config - resolving', function (t) {
-  var opts001 = { 
-      Keyword: { 
-        'var': function (s) { return '^' + s + '&' }
-      }
-    , _default: function (s) { return '*' + s + '&' }
-  };  
-  t.test('\n# specific but no type default and root default - root default not applied' + inspect(opts001), function (t) {
-    t.assertSurrounds('var n = new Test();', opts001, '^var& n = new Test();').end();
-  })
-
-  var opts002 = { 
-      Keyword: { 
-        'var': function (s) { return '^' + s + '&' }
-      , _default: function (s) { return '*' + s + '&' }
-      }
-    , _default: function (s) { return '(' + s + ')' }
-  };  
-  t.test('\n# no type default but root default' + inspect(opts002), function (t) {
-    t.assertSurrounds('var n = new Test();', opts002, '^var& n = *new& Test();').end();
-  })
-})
-
-test('#\n function config - replacing', function (t) {
-  var opts001 = { 
-      Keyword: { 
-        'var': function () { return 'const' }
-      }
-  };  
-  t.test('\n# type default and root default (type wins)' + inspect(opts001), function (t) {
-    t.assertSurrounds('var n = new Test();', opts001, 'const n = new Test();').end();
-  })
-
-  var opts002 = { 
-      Keyword: { 
-        _default: function () { return 'const' }
-      }
-  };  
-  t.test('\n# type default' + inspect(opts002), function (t) {
-    t.assertSurrounds('var n = new Test();', opts002, 'const n = const Test();').end();
-  })
-  
-  var opts003 = { 
-      Keyword: { 
-          'new': function () { return 'NEW'; }
-        , _default: function () { return 'const' }
-      }
-  };  
-  t.test('\n# specific and type default' + inspect(opts003), function (t) {
-    t.assertSurrounds('var n = new Test();', opts003, 'const n = NEW Test();').end();
-  })
-
-  var opts004 = { 
-      Keyword: { 
-        _default: function (s) { return s.toUpperCase() }
-      }
-      , _default: function (s) { return 'not applied'; }
-  };  
-  t.test('\n# type default and root default (type wins)' + inspect(opts004), function (t) {
-    t.assertSurrounds('var n = new Test();', opts004, 'VAR n = NEW Test();').end();
-  })
-
-  var opts005 = { 
-        Keyword: { }
-      , _default: function (s) { return s.toUpperCase() }
-  };  
-  t.test('\n# no type default only root default - not applied' + inspect(opts005), function (t) {
-    t.assertSurrounds('var n = new Test();', opts005, 'var n = new Test();').end();
-  })
-})
diff --git a/node_modules/redeyed/test/redeyed-mixed.js b/node_modules/redeyed/test/redeyed-mixed.js
deleted file mode 100644
index 2346ba9cf121bdc967a548ea259af565a4612cf0..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/test/redeyed-mixed.js
+++ /dev/null
@@ -1,46 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , redeyed = require('..')
-
-function inspect (obj) {
-  return util.inspect(obj, false, 5, true)
-}
-
-test('adding custom asserts ... ', function (t) {
-  t.constructor.prototype.assertSurrounds = function (code, opts, expected) {
-    var result = redeyed(code, opts).code
-    this.equals(result, expected, inspect(code) + ' => ' + inspect(expected))
-    return this;
-  }
-
-  t.end() 
-})
-
-test('\nmixed config, keywords', function (t) {
-  var opts001 = { 
-    Keyword: { 
-        'this': function (s) { return '_' + s; }
-      , 'if': { _before: '^' }
-      , _default: '*:&' 
-    } 
-  };
-  t.test('\n# ' + inspect(opts001), function (t) {
-   t.assertSurrounds('if (this.hello) return "world";', opts001, '^if& (_this.hello) *return& "world";').end()
-  })
-  
-  var opts002 = { 
-      Keyword: { 
-          'this': function (s) { return '_' + s; }
-        , 'if': { _before: '^' }
-        , 'return': ':)'
-        , _default: ':&' 
-      } 
-    , _default: '*:&' 
-  };
-  t.test('\n# ' + inspect(opts002), function (t) {
-   t.assertSurrounds('if (this.hello) return "world";', opts002, '^if& (_this.hello) *return) "world";').end()
-  })
-})
diff --git a/node_modules/redeyed/test/redeyed-result.js b/node_modules/redeyed/test/redeyed-result.js
deleted file mode 100644
index 9a138dca1c3a179db13f833427ad12d066340171..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/test/redeyed-result.js
+++ /dev/null
@@ -1,48 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , redeyed = require('..')
-  , esprima = require('esprima')
-
-function inspect (obj) {
-  return util.inspect(obj, false, 5, true)
-}
-
-test('redeyed result has esprima ast, tokens, comments and splits and transformed code', function (t) {
-  var code = '// a comment\nvar a = 3;'
-    , conf = { Keyword: { _default: '_:-' } }
-
-    , ast    =  esprima.parse(code, { tokens: true, comment: true, range: true, tolerant: true })
-    , tokens =  ast.tokens
-    , comments = ast.comments
-
-    , result = redeyed(code, conf)
-
-    console.log(ast)
-  t.deepEquals(result.ast, ast, 'ast')
-  t.deepEquals(result.tokens, tokens, 'tokens')
-  t.deepEquals(result.comments, comments, 'comments')
-  t.notEquals(result.code, undefined, 'code')
-
-  t.end()
-});
-
-test('redeyed result - { nojoin } has esprima ast, tokens, comments and splits but no transformed code', function (t) {
-  var code = '// a comment\nvar a = 3;'
-    , conf = { Keyword: { _default: '_:-' } }
-
-    , ast    =  esprima.parse(code, { tokens: true, comment: true, range: true, tolerant: true })
-    , tokens =  ast.tokens
-    , comments = ast.comments
-
-    , result = redeyed(code, conf, { nojoin: true })
-
-  t.deepEquals(result.ast, ast, 'ast')
-  t.deepEquals(result.tokens, tokens, 'tokens')
-  t.deepEquals(result.comments, comments, 'comments')
-  t.equals(result.code, undefined, 'code')
-
-  t.end()
-});
diff --git a/node_modules/redeyed/test/redeyed-script-level-return.js b/node_modules/redeyed/test/redeyed-script-level-return.js
deleted file mode 100644
index bbdbbb74b0cf841976beb7a3d5f0d1fc46fff224..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/test/redeyed-script-level-return.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , redeyed = require('..')
-
-function inspect (obj) {
-  return util.inspect(obj, false, 5, true)
-}
-
-test('properly handles script level return -- no blow up', function (t) {
-  var code = [
-      , 'return 1;'
-      ].join('\n')
-    , opts = { Keyword: { 'return': '%:^' } }
-    , expected = '\n%return^ 1;'
-    , res = redeyed(code, opts).code
-
-  t.equals(res, expected, inspect(code) + ' opts: ' + inspect(opts) + ' => ' + inspect(expected))
-  t.end()
-})
diff --git a/node_modules/redeyed/test/redeyed-shebang.js b/node_modules/redeyed/test/redeyed-shebang.js
deleted file mode 100644
index f94ee394a1b75408c2db0e3cec2abeda049ef738..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/test/redeyed-shebang.js
+++ /dev/null
@@ -1,23 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , redeyed = require('..')
-
-function inspect (obj) {
-  return util.inspect(obj, false, 5, true)
-}
-
-test('removes shebang from the code before parsing it', function (t) {
-  var code = [
-        '#!/usr/bin/env node'
-      , 'var util = require("util");'
-      ].join('\n')
-    , opts = { Keyword: { 'var': '%:^' } }
-    , expected = '\n%var^ util = require("util");'
-    , res = redeyed(code, opts).code
-
-  t.equals(res, expected, inspect(code) + ' opts: ' + inspect(opts) + ' => ' + inspect(expected))
-  t.end()
-})
diff --git a/node_modules/redeyed/test/redeyed-smoke.js b/node_modules/redeyed/test/redeyed-smoke.js
deleted file mode 100644
index cf6c81b38a36898b639b92ef53212f26098cfd72..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/test/redeyed-smoke.js
+++ /dev/null
@@ -1,57 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-// applying redeyed to a bunch of files of contained libraries as a smoke test
-var test     =  require('tap').test
-  , path     =  require('path')
-  , fs       =  require('fs')
-  , readdirp =  require('readdirp')
-  , redeyed  =  require('..')
-  , node_modules =  path.join(__dirname, '..', 'node_modules')
-  , tapdir       =  path.join(node_modules, 'tap')
-  , esprimadir   =  path.join(node_modules, 'esprima')
-
-test('tap', function (t) {
-  var invalidTapFiles = [
-      'async-map-ordered.js'
-    , 'prof.js'
-  ]
-
-  readdirp({ root: tapdir, fileFilter: '*.js' })
-    .on('data', function (entry) {
-      
-      if (~invalidTapFiles.indexOf(entry.name)) return
-
-      var code = fs.readFileSync(entry.fullPath, 'utf-8')
-        , result = redeyed(code, { Keyword: { 'var': '+:-' } }).code
-
-      t.assert(~result.indexOf('+var-') || !(~result.indexOf('var ')), 'redeyed ' + entry.path)
-    })
-    .on('end', t.end.bind(t))
-})
-
-test('esprima', function (t) {
-
-  readdirp({ root: esprimadir, fileFilter: '*.js' })
-    .on('data', function (entry) {
-      
-      var code = fs.readFileSync(entry.fullPath, 'utf-8')
-        , result = redeyed(code, { Keyword: { 'var': '+:-' } }).code
-
-      t.assert(~result.indexOf('+var-') || !(~result.indexOf('var ')), 'redeyed ' + entry.path)
-    })
-    .on('end', t.end.bind(t))
-})
-
-test('redeyed', function (t) {
-
-  readdirp({ root: path.join(__dirname, '..'), fileFilter: '*.js', directoryFilter: ['!.git', '!node_modules' ] })
-    .on('data', function (entry) {
-      
-      var code = fs.readFileSync(entry.fullPath, 'utf-8')
-        , result = redeyed(code, { Keyword: { 'var': '+:-' } }).code
-
-        t.assert(~result.indexOf('+var-') || !(~result.indexOf('var ')), 'redeyed ' + entry.path)
-    })
-    .on('end', t.end.bind(t))
-})
diff --git a/node_modules/redeyed/test/redeyed-string-config.js b/node_modules/redeyed/test/redeyed-string-config.js
deleted file mode 100644
index 25a8953adf278b2d8609ee6050c484055181717c..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/test/redeyed-string-config.js
+++ /dev/null
@@ -1,124 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , redeyed = require('..')
-
-function inspect (obj) {
-  return util.inspect(obj, false, 5, true)
-}
-
-test('adding custom asserts ... ', function (t) {
-  t.constructor.prototype.assertSurrounds = function (code, opts, expected) {
-    var result = redeyed(code, opts).code
-    this.equals(result, expected, inspect(code) + ' => ' + inspect(expected))
-    return this;
-  }
-
-  t.end() 
-})
-
-test('\nstring config, keywords', function (t) {
-
-  var opts001 = { Keyword: { _default: '*:&' } };
-  t.test('\n# ' + inspect(opts001), function (t) {
-    t.assertSurrounds('this', opts001, '*this&')
-    t.assertSurrounds('if (a == 1) return', opts001, '*if& (a == 1) *return&')
-    t.assertSurrounds('var n = new Test();', opts001, '*var& n = *new& Test();')
-    t.end()
-  })
-
-  var opts002 = { 
-    Keyword: { 
-        'function': '^:'
-      , 'return':  '(:)' 
-      , _default: '*:&'
-    } 
-  };  
-
-  t.test('\n# ' + inspect(opts002), function (t) {
-    t.assertSurrounds(
-        [ 'function foo (bar) {'
-        , ' var a = 3;'
-        , ' return bar + a;'
-        , '}'
-        ].join('\n')
-      , opts002
-      , [ '^function& foo (bar) {'
-        , ' *var& a = 3;'
-        , ' (return) bar + a;'
-        , '}'
-        ].join('\n'))
-    t.end()
-  })
-})
-
-test('\nstring configs resolve from type and root', function (t) {
-  var code = 'var a = new Test();'
-  
-  function run(t, conf, expected, code_) {
-    t.test('\n# '  + inspect(conf), function (t) {
-      t.assertSurrounds(code_ || code, conf, expected);
-      t.end()
-    })
-  }
-
-  // at least the token kind has to be configured in order for the root_default to be applied
-  // otherwise a root._default would affect all tokens, even the ones we want to leave unchanged
-  run(t, { _default: '*:' }, 'var a = new Test();')
-
-  t.test('\n\n# only before or after specified, but no root._default', function (t) {
-    run(t, { Keyword: { _default: '*:' } }, '*var a = *new Test();')
-    run(t, { Keyword: { _default: ':-' } }, 'var- a = new- Test();')
-    t.end()
-  })
-
-  t.test('\n\n# resolve missing from root._default', function (t) {
-    run(t, { Keyword: { _default: '*:' }, _default: '(:-' }, '*var- a = *new- Test();')
-    run(t, { Keyword: { _default: ':-' }, _default: '*:)' }, '*var- a = *new- Test();')
-    t.end()
-  })
-
-  t.test('\n\n# no resolve if all specified', function (t) {
-    run(t, { Keyword: { _default: '+:-' }, _default: '*:)' }, '+var- a = +new- Test();')
-    run(t, { Keyword: { _default: ':-' }, _default: ':)' }, 'var- a = new- Test();')
-    t.end()
-  })
-
-  t.test('\n\n# resolve specific token no defaults', function (t) {
-    run(t, { Keyword: { 'var': '*:' } }, '*var a = new Test();')
-    run(t, { Keyword: { 'var': ':-' } }, 'var- a = new Test();')
-    t.end()
-  })
-
-  t.test('\n\n# resolve specific token with type defaults', function (t) {
-    run(t, { Keyword: { 'var': '*:', _default: ':-' } }, '*var- a = new- Test();')
-    run(t, { Keyword: { 'var': '*:', _default: '(:-' } }, '*var- a = (new- Test();')
-    run(t, { Keyword: { 'var': ':-', _default: '*:' } }, '*var- a = *new Test();')
-    run(t, { Keyword: { 'var': ':-', _default: '*:)' } }, '*var- a = *new) Test();')
-    run(t, { Keyword: { 'var': ':-', 'new': ':&', _default: '*:' } }, '*var- a = *new& Test();')
-    t.end()
-  })
-
-  t.test(
-      '\n\n# resolve specific token with root defaults, but no type default - root default not applied to unspecified tokens'
-    , function (t) {
-        run(t, { Keyword: { 'var': '*:' }, _default: ':-' }, '*var- a = new Test();')
-        run(t, { Keyword: { 'var': ':-' }, _default: '*:' }, '*var- a = new Test();')
-        t.end()
-      }
-  )
-
-  t.test('\n\n# resolve specific token with type and root defaults', function (t) {
-    run(t, { Keyword: { 'var': '*:', _default: '+:-' }, _default: ':)' }, '*var- a = +new- Test();')
-    run(t, { Keyword: { 'var': ':-', _default: '*:+' }, _default: '(:' }, '*var- a = *new+ Test();')
-    t.end()
-  })
-
-  t.test('all exact tokens undefined, but type default', function (t) {
-    run(t, { 'Boolean': { 'true': undefined, 'false': undefined, _default: '+:-' } }, 'return +true- || +false-;', 'return true || false;')
-  })
-  
-  t.end()
-})
diff --git a/node_modules/redeyed/test/redeyed-types.js b/node_modules/redeyed/test/redeyed-types.js
deleted file mode 100644
index ca4837d8559daa1c3bac0a00313375a092297e6c..0000000000000000000000000000000000000000
--- a/node_modules/redeyed/test/redeyed-types.js
+++ /dev/null
@@ -1,71 +0,0 @@
-'use strict';
-/*jshint asi: true*/
-
-var test = require('tap').test
-  , util = require('util')
-  , redeyed = require('..')
-
-function inspect (obj) {
-  return util.inspect(obj, false, 5, true)
-}
-
-test('adding custom asserts ... ', function (t) {
-  t.constructor.prototype.assertSurrounds = function (code, opts, expected) {
-    var optsi = inspect(opts);
-    var result = redeyed(code, opts).code
-
-    this.equals(  result
-                , expected
-                , util.format('%s: %s => %s', optsi, inspect(code), inspect(expected))
-               )
-    return this;
-  }
-
-  t.end() 
-})
-
-test('types', function (t) {
-  t.test('\n# Boolean', function (t) {
-    t.assertSurrounds('return true;', { 'Boolean': { _default: '$:%' } }, 'return $true%;')
-    t.assertSurrounds(  'return true; return false;'
-                      , { 'Boolean': { 'false': '#:', _default: '$:%' } }
-                      , 'return $true%; return #false%;')
-    t.end()
-  })
-
-  t.test('\n# Identifier', function (t) {
-    t.assertSurrounds('var a = 1;', { 'Identifier': { _default: '$:%' } }, 'var $a% = 1;')
-    t.assertSurrounds(  'var a = 1; const b = 2;'
-                      , { 'Identifier': { 'b': '#:', _default: '$:%' } }
-                      , 'var $a% = 1; const #b% = 2;')
-    t.end()
-  })
-
-  t.test('\n# Null', function (t) {
-    t.assertSurrounds('return null;', { 'Null': { _default: '$:%' } }, 'return $null%;').end()
-  })
-
-  t.test('\n# Numeric', function (t) {
-    t.assertSurrounds('return 1;', { 'Numeric': { _default: '$:%' } }, 'return $1%;')
-    t.assertSurrounds(  'return 1; return 2;'
-                      , { 'Numeric': { '2': '#:', _default: '$:%' } }
-                      , 'return $1%; return #2%;')
-    t.end()
-  })
-
-  t.test('\n# Punctuator', function (t) {
-    t.assertSurrounds('return 2 * 2;', { 'Punctuator': { _default: '$:%' } }, 'return 2 $*% 2$;%')
-    t.assertSurrounds(  'return 2 * 2;'
-                      , { 'Punctuator': {'*': '#:', _default: '$:%' } }
-                      , 'return 2 #*% 2$;%')
-    t.end()
-  })
-
-  t.test('\n# String', function (t) {
-    t.assertSurrounds('return "hello";', { 'String': { _default: '$:%' } }, 'return $"hello"%;')
-    t.assertSurrounds(  'return "hello"; return "world";'
-                      , { 'String': { '"world"': '#:', _default: '$:%' } }
-                      , 'return $"hello"%; return #"world"%;')
-    t.end()
-  })
-})
diff --git a/node_modules/semver/LICENSE b/node_modules/semver/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/node_modules/semver/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/semver/README.md b/node_modules/semver/README.md
deleted file mode 100644
index e9522153976da589c8b66b0d44da1596cb410749..0000000000000000000000000000000000000000
--- a/node_modules/semver/README.md
+++ /dev/null
@@ -1,664 +0,0 @@
-semver(1) -- The semantic versioner for npm
-===========================================
-
-## Install
-
-```bash
-npm install semver
-````
-
-## Usage
-
-As a node module:
-
-```js
-const semver = require('semver')
-
-semver.valid('1.2.3') // '1.2.3'
-semver.valid('a.b.c') // null
-semver.clean('  =v1.2.3   ') // '1.2.3'
-semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true
-semver.gt('1.2.3', '9.8.7') // false
-semver.lt('1.2.3', '9.8.7') // true
-semver.minVersion('>=1.0.0') // '1.0.0'
-semver.valid(semver.coerce('v2')) // '2.0.0'
-semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
-```
-
-You can also just load the module for the function that you care about if
-you'd like to minimize your footprint.
-
-```js
-// load the whole API at once in a single object
-const semver = require('semver')
-
-// or just load the bits you need
-// all of them listed here, just pick and choose what you want
-
-// classes
-const SemVer = require('semver/classes/semver')
-const Comparator = require('semver/classes/comparator')
-const Range = require('semver/classes/range')
-
-// functions for working with versions
-const semverParse = require('semver/functions/parse')
-const semverValid = require('semver/functions/valid')
-const semverClean = require('semver/functions/clean')
-const semverInc = require('semver/functions/inc')
-const semverDiff = require('semver/functions/diff')
-const semverMajor = require('semver/functions/major')
-const semverMinor = require('semver/functions/minor')
-const semverPatch = require('semver/functions/patch')
-const semverPrerelease = require('semver/functions/prerelease')
-const semverCompare = require('semver/functions/compare')
-const semverRcompare = require('semver/functions/rcompare')
-const semverCompareLoose = require('semver/functions/compare-loose')
-const semverCompareBuild = require('semver/functions/compare-build')
-const semverSort = require('semver/functions/sort')
-const semverRsort = require('semver/functions/rsort')
-
-// low-level comparators between versions
-const semverGt = require('semver/functions/gt')
-const semverLt = require('semver/functions/lt')
-const semverEq = require('semver/functions/eq')
-const semverNeq = require('semver/functions/neq')
-const semverGte = require('semver/functions/gte')
-const semverLte = require('semver/functions/lte')
-const semverCmp = require('semver/functions/cmp')
-const semverCoerce = require('semver/functions/coerce')
-
-// working with ranges
-const semverSatisfies = require('semver/functions/satisfies')
-const semverMaxSatisfying = require('semver/ranges/max-satisfying')
-const semverMinSatisfying = require('semver/ranges/min-satisfying')
-const semverToComparators = require('semver/ranges/to-comparators')
-const semverMinVersion = require('semver/ranges/min-version')
-const semverValidRange = require('semver/ranges/valid')
-const semverOutside = require('semver/ranges/outside')
-const semverGtr = require('semver/ranges/gtr')
-const semverLtr = require('semver/ranges/ltr')
-const semverIntersects = require('semver/ranges/intersects')
-const semverSimplifyRange = require('semver/ranges/simplify')
-const semverRangeSubset = require('semver/ranges/subset')
-```
-
-As a command-line utility:
-
-```
-$ semver -h
-
-A JavaScript implementation of the https://semver.org/ specification
-Copyright Isaac Z. Schlueter
-
-Usage: semver [options] <version> [<version> [...]]
-Prints valid versions sorted by SemVer precedence
-
-Options:
--r --range <range>
-        Print versions that match the specified range.
-
--i --increment [<level>]
-        Increment a version by the specified level.  Level can
-        be one of: major, minor, patch, premajor, preminor,
-        prepatch, prerelease, or release.  Default level is 'patch'.
-        Only one version may be specified.
-
---preid <identifier>
-        Identifier to be used to prefix premajor, preminor,
-        prepatch or prerelease version increments.
-
--l --loose
-        Interpret versions and ranges loosely
-
--n <0|1>
-        This is the base to be used for the prerelease identifier.
-
--p --include-prerelease
-        Always include prerelease versions in range matching
-
--c --coerce
-        Coerce a string into SemVer if possible
-        (does not imply --loose)
-
---rtl
-        Coerce version strings right to left
-
---ltr
-        Coerce version strings left to right (default)
-
-Program exits successfully if any valid version satisfies
-all supplied ranges, and prints all satisfying versions.
-
-If no satisfying versions are found, then exits failure.
-
-Versions are printed in ascending order, so supplying
-multiple versions to the utility will just sort them.
-```
-
-## Versions
-
-A "version" is described by the `v2.0.0` specification found at
-<https://semver.org/>.
-
-A leading `"="` or `"v"` character is stripped off and ignored.
-Support for stripping a leading "v" is kept for compatibility with `v1.0.0` of the SemVer
-specification but should not be used anymore.
-
-## Ranges
-
-A `version range` is a set of `comparators` that specify versions
-that satisfy the range.
-
-A `comparator` is composed of an `operator` and a `version`.  The set
-of primitive `operators` is:
-
-* `<` Less than
-* `<=` Less than or equal to
-* `>` Greater than
-* `>=` Greater than or equal to
-* `=` Equal.  If no operator is specified, then equality is assumed,
-  so this operator is optional but MAY be included.
-
-For example, the comparator `>=1.2.7` would match the versions
-`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6`
-or `1.1.0`. The comparator `>1` is equivalent to `>=2.0.0` and
-would match the versions `2.0.0` and `3.1.0`, but not the versions
-`1.0.1` or `1.1.0`.
-
-Comparators can be joined by whitespace to form a `comparator set`,
-which is satisfied by the **intersection** of all of the comparators
-it includes.
-
-A range is composed of one or more comparator sets, joined by `||`.  A
-version matches a range if and only if every comparator in at least
-one of the `||`-separated comparator sets is satisfied by the version.
-
-For example, the range `>=1.2.7 <1.3.0` would match the versions
-`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`,
-or `1.1.0`.
-
-The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`,
-`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`.
-
-### Prerelease Tags
-
-If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then
-it will only be allowed to satisfy comparator sets if at least one
-comparator with the same `[major, minor, patch]` tuple also has a
-prerelease tag.
-
-For example, the range `>1.2.3-alpha.3` would be allowed to match the
-version `1.2.3-alpha.7`, but it would *not* be satisfied by
-`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater
-than" `1.2.3-alpha.3` according to the SemVer sort rules.  The version
-range only accepts prerelease tags on the `1.2.3` version.
-Version `3.4.5` *would* satisfy the range because it does not have a
-prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`.
-
-The purpose of this behavior is twofold.  First, prerelease versions
-frequently are updated very quickly, and contain many breaking changes
-that are (by the author's design) not yet fit for public consumption.
-Therefore, by default, they are excluded from range-matching
-semantics.
-
-Second, a user who has opted into using a prerelease version has
-indicated the intent to use *that specific* set of
-alpha/beta/rc versions.  By including a prerelease tag in the range,
-the user is indicating that they are aware of the risk.  However, it
-is still not appropriate to assume that they have opted into taking a
-similar risk on the *next* set of prerelease versions.
-
-Note that this behavior can be suppressed (treating all prerelease
-versions as if they were normal versions, for range-matching)
-by setting the `includePrerelease` flag on the options
-object to any
-[functions](https://github.com/npm/node-semver#functions) that do
-range matching.
-
-#### Prerelease Identifiers
-
-The method `.inc` takes an additional `identifier` string argument that
-will append the value of the string as a prerelease identifier:
-
-```javascript
-semver.inc('1.2.3', 'prerelease', 'beta')
-// '1.2.4-beta.0'
-```
-
-command-line example:
-
-```bash
-$ semver 1.2.3 -i prerelease --preid beta
-1.2.4-beta.0
-```
-
-Which then can be used to increment further:
-
-```bash
-$ semver 1.2.4-beta.0 -i prerelease
-1.2.4-beta.1
-```
-
-To get out of the prerelease phase, use the `release` option:
-
-```bash
-$ semver 1.2.4-beta.1 -i release
-1.2.4
-```
-
-#### Prerelease Identifier Base
-
-The method `.inc` takes an optional parameter 'identifierBase' string
-that will let you let your prerelease number as zero-based or one-based.
-Set to `false` to omit the prerelease number altogether.
-If you do not specify this parameter, it will default to zero-based.
-
-```javascript
-semver.inc('1.2.3', 'prerelease', 'beta', '1')
-// '1.2.4-beta.1'
-```
-
-```javascript
-semver.inc('1.2.3', 'prerelease', 'beta', false)
-// '1.2.4-beta'
-```
-
-command-line example:
-
-```bash
-$ semver 1.2.3 -i prerelease --preid beta -n 1
-1.2.4-beta.1
-```
-
-```bash
-$ semver 1.2.3 -i prerelease --preid beta -n false
-1.2.4-beta
-```
-
-### Advanced Range Syntax
-
-Advanced range syntax desugars to primitive comparators in
-deterministic ways.
-
-Advanced ranges may be combined in the same way as primitive
-comparators using white space or `||`.
-
-#### Hyphen Ranges `X.Y.Z - A.B.C`
-
-Specifies an inclusive set.
-
-* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`
-
-If a partial version is provided as the first version in the inclusive
-range, then the missing pieces are replaced with zeroes.
-
-* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4`
-
-If a partial version is provided as the second version in the
-inclusive range, then all versions that start with the supplied parts
-of the tuple are accepted, but nothing that would be greater than the
-provided tuple parts.
-
-* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0-0`
-* `1.2.3 - 2` := `>=1.2.3 <3.0.0-0`
-
-#### X-Ranges `1.2.x` `1.X` `1.2.*` `*`
-
-Any of `X`, `x`, or `*` may be used to "stand in" for one of the
-numeric values in the `[major, minor, patch]` tuple.
-
-* `*` := `>=0.0.0` (Any non-prerelease version satisfies, unless
-  `includePrerelease` is specified, in which case any version at all
-  satisfies)
-* `1.x` := `>=1.0.0 <2.0.0-0` (Matching major version)
-* `1.2.x` := `>=1.2.0 <1.3.0-0` (Matching major and minor versions)
-
-A partial version range is treated as an X-Range, so the special
-character is in fact optional.
-
-* `""` (empty string) := `*` := `>=0.0.0`
-* `1` := `1.x.x` := `>=1.0.0 <2.0.0-0`
-* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0-0`
-
-#### Tilde Ranges `~1.2.3` `~1.2` `~1`
-
-Allows patch-level changes if a minor version is specified on the
-comparator.  Allows minor-level changes if not.
-
-* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0-0`
-* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0-0` (Same as `1.2.x`)
-* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0-0` (Same as `1.x`)
-* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0-0`
-* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0-0` (Same as `0.2.x`)
-* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0-0` (Same as `0.x`)
-* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0-0` Note that prereleases in
-  the `1.2.3` version will be allowed, if they are greater than or
-  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but
-  `1.2.4-beta.2` would not, because it is a prerelease of a
-  different `[major, minor, patch]` tuple.
-
-#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4`
-
-Allows changes that do not modify the left-most non-zero element in the
-`[major, minor, patch]` tuple.  In other words, this allows patch and
-minor updates for versions `1.0.0` and above, patch updates for
-versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`.
-
-Many authors treat a `0.x` version as if the `x` were the major
-"breaking-change" indicator.
-
-Caret ranges are ideal when an author may make breaking changes
-between `0.2.4` and `0.3.0` releases, which is a common practice.
-However, it presumes that there will *not* be breaking changes between
-`0.2.4` and `0.2.5`.  It allows for changes that are presumed to be
-additive (but non-breaking), according to commonly observed practices.
-
-* `^1.2.3` := `>=1.2.3 <2.0.0-0`
-* `^0.2.3` := `>=0.2.3 <0.3.0-0`
-* `^0.0.3` := `>=0.0.3 <0.0.4-0`
-* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0-0` Note that prereleases in
-  the `1.2.3` version will be allowed, if they are greater than or
-  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but
-  `1.2.4-beta.2` would not, because it is a prerelease of a
-  different `[major, minor, patch]` tuple.
-* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4-0`  Note that prereleases in the
-  `0.0.3` version *only* will be allowed, if they are greater than or
-  equal to `beta`.  So, `0.0.3-pr.2` would be allowed.
-
-When parsing caret ranges, a missing `patch` value desugars to the
-number `0`, but will allow flexibility within that value, even if the
-major and minor versions are both `0`.
-
-* `^1.2.x` := `>=1.2.0 <2.0.0-0`
-* `^0.0.x` := `>=0.0.0 <0.1.0-0`
-* `^0.0` := `>=0.0.0 <0.1.0-0`
-
-A missing `minor` and `patch` values will desugar to zero, but also
-allow flexibility within those values, even if the major version is
-zero.
-
-* `^1.x` := `>=1.0.0 <2.0.0-0`
-* `^0.x` := `>=0.0.0 <1.0.0-0`
-
-### Range Grammar
-
-Putting all this together, here is a Backus-Naur grammar for ranges,
-for the benefit of parser authors:
-
-```bnf
-range-set  ::= range ( logical-or range ) *
-logical-or ::= ( ' ' ) * '||' ( ' ' ) *
-range      ::= hyphen | simple ( ' ' simple ) * | ''
-hyphen     ::= partial ' - ' partial
-simple     ::= primitive | partial | tilde | caret
-primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
-partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
-xr         ::= 'x' | 'X' | '*' | nr
-nr         ::= '0' | ['1'-'9'] ( ['0'-'9'] ) *
-tilde      ::= '~' partial
-caret      ::= '^' partial
-qualifier  ::= ( '-' pre )? ( '+' build )?
-pre        ::= parts
-build      ::= parts
-parts      ::= part ( '.' part ) *
-part       ::= nr | [-0-9A-Za-z]+
-```
-
-## Functions
-
-All methods and classes take a final `options` object argument.  All
-options in this object are `false` by default.  The options supported
-are:
-
-- `loose`: Be more forgiving about not-quite-valid semver strings.
-  (Any resulting output will always be 100% strict compliant, of
-  course.)  For backwards compatibility reasons, if the `options`
-  argument is a boolean value instead of an object, it is interpreted
-  to be the `loose` param.
-- `includePrerelease`: Set to suppress the [default
-  behavior](https://github.com/npm/node-semver#prerelease-tags) of
-  excluding prerelease tagged versions from ranges unless they are
-  explicitly opted into.
-
-Strict-mode Comparators and Ranges will be strict about the SemVer
-strings that they parse.
-
-* `valid(v)`: Return the parsed version, or null if it's not valid.
-* `inc(v, releaseType, options, identifier, identifierBase)`: 
-  Return the version incremented by the release
-  type (`major`, `premajor`, `minor`, `preminor`, `patch`,
-  `prepatch`, `prerelease`, or `release`), or null if it's not valid
-  * `premajor` in one call will bump the version up to the next major
-    version and down to a prerelease of that major version.
-    `preminor`, and `prepatch` work the same way.
-  * If called from a non-prerelease version, `prerelease` will work the
-    same as `prepatch`. It increments the patch version and then makes a
-    prerelease. If the input version is already a prerelease it simply
-    increments it.
-  * `release` will remove any prerelease part of the version.
-  * `identifier` can be used to prefix `premajor`, `preminor`,
-    `prepatch`, or `prerelease` version increments. `identifierBase`
-    is the base to be used for the `prerelease` identifier.
-* `prerelease(v)`: Returns an array of prerelease components, or null
-  if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]`
-* `major(v)`: Return the major version number.
-* `minor(v)`: Return the minor version number.
-* `patch(v)`: Return the patch version number.
-* `intersects(r1, r2, loose)`: Return true if the two supplied ranges
-  or comparators intersect.
-* `parse(v)`: Attempt to parse a string as a semantic version, returning either
-  a `SemVer` object or `null`.
-
-### Comparison
-
-* `gt(v1, v2)`: `v1 > v2`
-* `gte(v1, v2)`: `v1 >= v2`
-* `lt(v1, v2)`: `v1 < v2`
-* `lte(v1, v2)`: `v1 <= v2`
-* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,
-  even if they're not the same string.  You already know how to
-  compare strings.
-* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.
-* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call
-  the corresponding function above.  `"==="` and `"!=="` do simple
-  string comparison, but are included for completeness.  Throws if an
-  invalid comparison string is provided.
-* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if
-  `v2` is greater.  Sorts in ascending order if passed to `Array.sort()`.
-* `rcompare(v1, v2)`: The reverse of `compare`.  Sorts an array of versions
-  in descending order when passed to `Array.sort()`.
-* `compareBuild(v1, v2)`: The same as `compare` but considers `build` when two versions
-  are equal.  Sorts in ascending order if passed to `Array.sort()`.
-* `compareLoose(v1, v2)`: Short for `compare(v1, v2, { loose: true })`.
-* `diff(v1, v2)`: Returns the difference between two versions by the release type
-  (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`),
-  or null if the versions are the same.
-
-### Sorting
-
-* `sort(versions)`: Returns a sorted array of versions based on the `compareBuild` 
-  function.
-* `rsort(versions)`: The reverse of `sort`. Returns an array of versions based on
-  the `compareBuild` function in descending order.
-
-### Comparators
-
-* `intersects(comparator)`: Return true if the comparators intersect
-
-### Ranges
-
-* `validRange(range)`: Return the valid range or null if it's not valid.
-* `satisfies(version, range)`: Return true if the version satisfies the
-  range.
-* `maxSatisfying(versions, range)`: Return the highest version in the list
-  that satisfies the range, or `null` if none of them do.
-* `minSatisfying(versions, range)`: Return the lowest version in the list
-  that satisfies the range, or `null` if none of them do.
-* `minVersion(range)`: Return the lowest version that can match
-  the given range.
-* `gtr(version, range)`: Return `true` if the version is greater than all the
-  versions possible in the range.
-* `ltr(version, range)`: Return `true` if the version is less than all the
-  versions possible in the range.
-* `outside(version, range, hilo)`: Return true if the version is outside
-  the bounds of the range in either the high or low direction.  The
-  `hilo` argument must be either the string `'>'` or `'<'`.  (This is
-  the function called by `gtr` and `ltr`.)
-* `intersects(range)`: Return true if any of the range comparators intersect.
-* `simplifyRange(versions, range)`: Return a "simplified" range that
-  matches the same items in the `versions` list as the range specified.  Note
-  that it does *not* guarantee that it would match the same versions in all
-  cases, only for the set of versions provided.  This is useful when
-  generating ranges by joining together multiple versions with `||`
-  programmatically, to provide the user with something a bit more
-  ergonomic.  If the provided range is shorter in string-length than the
-  generated range, then that is returned.
-* `subset(subRange, superRange)`: Return `true` if the `subRange` range is
-  entirely contained by the `superRange` range.
-
-Note that, since ranges may be non-contiguous, a version might not be
-greater than a range, less than a range, *or* satisfy a range!  For
-example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`
-until `2.0.0`, so version `1.2.10` would not be greater than the
-range (because `2.0.1` satisfies, which is higher), nor less than the
-range (since `1.2.8` satisfies, which is lower), and it also does not
-satisfy the range.
-
-If you want to know if a version satisfies or does not satisfy a
-range, use the `satisfies(version, range)` function.
-
-### Coercion
-
-* `coerce(version, options)`: Coerces a string to semver if possible
-
-This aims to provide a very forgiving translation of a non-semver string to
-semver. It looks for the first digit in a string and consumes all
-remaining characters which satisfy at least a partial semver (e.g., `1`,
-`1.2`, `1.2.3`) up to the max permitted length (256 characters).  Longer
-versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`).  All
-surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes
-`3.4.0`).  Only text which lacks digits will fail coercion (`version one`
-is not valid).  The maximum length for any semver component considered for
-coercion is 16 characters; longer components will be ignored
-(`10000000000000000.4.7.4` becomes `4.7.4`).  The maximum value for any
-semver component is `Number.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value
-components are invalid (`9999999999999999.4.7.4` is likely invalid).
-
-If the `options.rtl` flag is set, then `coerce` will return the right-most
-coercible tuple that does not share an ending index with a longer coercible
-tuple.  For example, `1.2.3.4` will return `2.3.4` in rtl mode, not
-`4.0.0`.  `1.2.3/4` will return `4.0.0`, because the `4` is not a part of
-any other overlapping SemVer tuple.
-
-If the `options.includePrerelease` flag is set, then the `coerce` result will contain
-prerelease and build parts of a version.  For example, `1.2.3.4-rc.1+rev.2`
-will preserve prerelease `rc.1` and build `rev.2` in the result.
-
-### Clean
-
-* `clean(version)`: Clean a string to be a valid semver if possible
-
-This will return a cleaned and trimmed semver version. If the provided
-version is not valid a null will be returned. This does not work for
-ranges.
-
-ex.
-* `s.clean(' = v 2.1.5foo')`: `null`
-* `s.clean(' = v 2.1.5foo', { loose: true })`: `'2.1.5-foo'`
-* `s.clean(' = v 2.1.5-foo')`: `null`
-* `s.clean(' = v 2.1.5-foo', { loose: true })`: `'2.1.5-foo'`
-* `s.clean('=v2.1.5')`: `'2.1.5'`
-* `s.clean('  =v2.1.5')`: `'2.1.5'`
-* `s.clean('      2.1.5   ')`: `'2.1.5'`
-* `s.clean('~1.0.0')`: `null`
-
-## Constants
-
-As a convenience, helper constants are exported to provide information about what `node-semver` supports:
-
-### `RELEASE_TYPES`
-
-- major
-- premajor
-- minor
-- preminor
-- patch
-- prepatch
-- prerelease
-
-```
-const semver = require('semver');
-
-if (semver.RELEASE_TYPES.includes(arbitraryUserInput)) {
-  console.log('This is a valid release type!');
-} else {
-  console.warn('This is NOT a valid release type!');
-}
-```
-
-### `SEMVER_SPEC_VERSION`
-
-2.0.0
-
-```
-const semver = require('semver');
-
-console.log('We are currently using the semver specification version:', semver.SEMVER_SPEC_VERSION);
-```
-
-## Exported Modules
-
-<!--
-TODO: Make sure that all of these items are documented (classes aren't,
-eg), and then pull the module name into the documentation for that specific
-thing.
--->
-
-You may pull in just the part of this semver utility that you need if you
-are sensitive to packing and tree-shaking concerns.  The main
-`require('semver')` export uses getter functions to lazily load the parts
-of the API that are used.
-
-The following modules are available:
-
-* `require('semver')`
-* `require('semver/classes')`
-* `require('semver/classes/comparator')`
-* `require('semver/classes/range')`
-* `require('semver/classes/semver')`
-* `require('semver/functions/clean')`
-* `require('semver/functions/cmp')`
-* `require('semver/functions/coerce')`
-* `require('semver/functions/compare')`
-* `require('semver/functions/compare-build')`
-* `require('semver/functions/compare-loose')`
-* `require('semver/functions/diff')`
-* `require('semver/functions/eq')`
-* `require('semver/functions/gt')`
-* `require('semver/functions/gte')`
-* `require('semver/functions/inc')`
-* `require('semver/functions/lt')`
-* `require('semver/functions/lte')`
-* `require('semver/functions/major')`
-* `require('semver/functions/minor')`
-* `require('semver/functions/neq')`
-* `require('semver/functions/parse')`
-* `require('semver/functions/patch')`
-* `require('semver/functions/prerelease')`
-* `require('semver/functions/rcompare')`
-* `require('semver/functions/rsort')`
-* `require('semver/functions/satisfies')`
-* `require('semver/functions/sort')`
-* `require('semver/functions/valid')`
-* `require('semver/ranges/gtr')`
-* `require('semver/ranges/intersects')`
-* `require('semver/ranges/ltr')`
-* `require('semver/ranges/max-satisfying')`
-* `require('semver/ranges/min-satisfying')`
-* `require('semver/ranges/min-version')`
-* `require('semver/ranges/outside')`
-* `require('semver/ranges/simplify')`
-* `require('semver/ranges/subset')`
-* `require('semver/ranges/to-comparators')`
-* `require('semver/ranges/valid')`
-
diff --git a/node_modules/semver/bin/semver.js b/node_modules/semver/bin/semver.js
deleted file mode 100644
index 22fc76ea2506e8f937814f4424293a9728892144..0000000000000000000000000000000000000000
--- a/node_modules/semver/bin/semver.js
+++ /dev/null
@@ -1,189 +0,0 @@
-#!/usr/bin/env node
-// Standalone semver comparison program.
-// Exits successfully and prints matching version(s) if
-// any supplied version is valid and passes all tests.
-
-const argv = process.argv.slice(2)
-
-let versions = []
-
-const range = []
-
-let inc = null
-
-const version = require('../package.json').version
-
-let loose = false
-
-let includePrerelease = false
-
-let coerce = false
-
-let rtl = false
-
-let identifier
-
-let identifierBase
-
-const semver = require('../')
-const parseOptions = require('../internal/parse-options')
-
-let reverse = false
-
-let options = {}
-
-const main = () => {
-  if (!argv.length) {
-    return help()
-  }
-  while (argv.length) {
-    let a = argv.shift()
-    const indexOfEqualSign = a.indexOf('=')
-    if (indexOfEqualSign !== -1) {
-      const value = a.slice(indexOfEqualSign + 1)
-      a = a.slice(0, indexOfEqualSign)
-      argv.unshift(value)
-    }
-    switch (a) {
-      case '-rv': case '-rev': case '--rev': case '--reverse':
-        reverse = true
-        break
-      case '-l': case '--loose':
-        loose = true
-        break
-      case '-p': case '--include-prerelease':
-        includePrerelease = true
-        break
-      case '-v': case '--version':
-        versions.push(argv.shift())
-        break
-      case '-i': case '--inc': case '--increment':
-        switch (argv[0]) {
-          case 'major': case 'minor': case 'patch': case 'prerelease':
-          case 'premajor': case 'preminor': case 'prepatch':
-          case 'release':
-            inc = argv.shift()
-            break
-          default:
-            inc = 'patch'
-            break
-        }
-        break
-      case '--preid':
-        identifier = argv.shift()
-        break
-      case '-r': case '--range':
-        range.push(argv.shift())
-        break
-      case '-n':
-        identifierBase = argv.shift()
-        if (identifierBase === 'false') {
-          identifierBase = false
-        }
-        break
-      case '-c': case '--coerce':
-        coerce = true
-        break
-      case '--rtl':
-        rtl = true
-        break
-      case '--ltr':
-        rtl = false
-        break
-      case '-h': case '--help': case '-?':
-        return help()
-      default:
-        versions.push(a)
-        break
-    }
-  }
-
-  options = parseOptions({ loose, includePrerelease, rtl })
-
-  versions = versions.map((v) => {
-    return coerce ? (semver.coerce(v, options) || { version: v }).version : v
-  }).filter((v) => {
-    return semver.valid(v)
-  })
-  if (!versions.length) {
-    return fail()
-  }
-  if (inc && (versions.length !== 1 || range.length)) {
-    return failInc()
-  }
-
-  for (let i = 0, l = range.length; i < l; i++) {
-    versions = versions.filter((v) => {
-      return semver.satisfies(v, range[i], options)
-    })
-    if (!versions.length) {
-      return fail()
-    }
-  }
-  versions
-    .sort((a, b) => semver[reverse ? 'rcompare' : 'compare'](a, b, options))
-    .map(v => semver.clean(v, options))
-    .map(v => inc ? semver.inc(v, inc, options, identifier, identifierBase) : v)
-    .forEach(v => console.log(v))
-}
-
-const failInc = () => {
-  console.error('--inc can only be used on a single version with no range')
-  fail()
-}
-
-const fail = () => process.exit(1)
-
-const help = () => console.log(
-`SemVer ${version}
-
-A JavaScript implementation of the https://semver.org/ specification
-Copyright Isaac Z. Schlueter
-
-Usage: semver [options] <version> [<version> [...]]
-Prints valid versions sorted by SemVer precedence
-
-Options:
--r --range <range>
-        Print versions that match the specified range.
-
--i --increment [<level>]
-        Increment a version by the specified level.  Level can
-        be one of: major, minor, patch, premajor, preminor,
-        prepatch, prerelease, or release.  Default level is 'patch'.
-        Only one version may be specified.
-
---preid <identifier>
-        Identifier to be used to prefix premajor, preminor,
-        prepatch or prerelease version increments.
-
--l --loose
-        Interpret versions and ranges loosely
-
--p --include-prerelease
-        Always include prerelease versions in range matching
-
--c --coerce
-        Coerce a string into SemVer if possible
-        (does not imply --loose)
-
---rtl
-        Coerce version strings right to left
-
---ltr
-        Coerce version strings left to right (default)
-
--n <base>
-        Base number to be used for the prerelease identifier.
-        Can be either 0 or 1, or false to omit the number altogether.
-        Defaults to 0.
-
-Program exits successfully if any valid version satisfies
-all supplied ranges, and prints all satisfying versions.
-
-If no satisfying versions are found, then exits failure.
-
-Versions are printed in ascending order, so supplying
-multiple versions to the utility will just sort them.`)
-
-main()
diff --git a/node_modules/semver/classes/comparator.js b/node_modules/semver/classes/comparator.js
deleted file mode 100644
index 3d39c0eef78023b9d91d09536d4827376b61f23d..0000000000000000000000000000000000000000
--- a/node_modules/semver/classes/comparator.js
+++ /dev/null
@@ -1,141 +0,0 @@
-const ANY = Symbol('SemVer ANY')
-// hoisted class for cyclic dependency
-class Comparator {
-  static get ANY () {
-    return ANY
-  }
-
-  constructor (comp, options) {
-    options = parseOptions(options)
-
-    if (comp instanceof Comparator) {
-      if (comp.loose === !!options.loose) {
-        return comp
-      } else {
-        comp = comp.value
-      }
-    }
-
-    comp = comp.trim().split(/\s+/).join(' ')
-    debug('comparator', comp, options)
-    this.options = options
-    this.loose = !!options.loose
-    this.parse(comp)
-
-    if (this.semver === ANY) {
-      this.value = ''
-    } else {
-      this.value = this.operator + this.semver.version
-    }
-
-    debug('comp', this)
-  }
-
-  parse (comp) {
-    const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
-    const m = comp.match(r)
-
-    if (!m) {
-      throw new TypeError(`Invalid comparator: ${comp}`)
-    }
-
-    this.operator = m[1] !== undefined ? m[1] : ''
-    if (this.operator === '=') {
-      this.operator = ''
-    }
-
-    // if it literally is just '>' or '' then allow anything.
-    if (!m[2]) {
-      this.semver = ANY
-    } else {
-      this.semver = new SemVer(m[2], this.options.loose)
-    }
-  }
-
-  toString () {
-    return this.value
-  }
-
-  test (version) {
-    debug('Comparator.test', version, this.options.loose)
-
-    if (this.semver === ANY || version === ANY) {
-      return true
-    }
-
-    if (typeof version === 'string') {
-      try {
-        version = new SemVer(version, this.options)
-      } catch (er) {
-        return false
-      }
-    }
-
-    return cmp(version, this.operator, this.semver, this.options)
-  }
-
-  intersects (comp, options) {
-    if (!(comp instanceof Comparator)) {
-      throw new TypeError('a Comparator is required')
-    }
-
-    if (this.operator === '') {
-      if (this.value === '') {
-        return true
-      }
-      return new Range(comp.value, options).test(this.value)
-    } else if (comp.operator === '') {
-      if (comp.value === '') {
-        return true
-      }
-      return new Range(this.value, options).test(comp.semver)
-    }
-
-    options = parseOptions(options)
-
-    // Special cases where nothing can possibly be lower
-    if (options.includePrerelease &&
-      (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {
-      return false
-    }
-    if (!options.includePrerelease &&
-      (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {
-      return false
-    }
-
-    // Same direction increasing (> or >=)
-    if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {
-      return true
-    }
-    // Same direction decreasing (< or <=)
-    if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {
-      return true
-    }
-    // same SemVer and both sides are inclusive (<= or >=)
-    if (
-      (this.semver.version === comp.semver.version) &&
-      this.operator.includes('=') && comp.operator.includes('=')) {
-      return true
-    }
-    // opposite directions less than
-    if (cmp(this.semver, '<', comp.semver, options) &&
-      this.operator.startsWith('>') && comp.operator.startsWith('<')) {
-      return true
-    }
-    // opposite directions greater than
-    if (cmp(this.semver, '>', comp.semver, options) &&
-      this.operator.startsWith('<') && comp.operator.startsWith('>')) {
-      return true
-    }
-    return false
-  }
-}
-
-module.exports = Comparator
-
-const parseOptions = require('../internal/parse-options')
-const { safeRe: re, t } = require('../internal/re')
-const cmp = require('../functions/cmp')
-const debug = require('../internal/debug')
-const SemVer = require('./semver')
-const Range = require('./range')
diff --git a/node_modules/semver/classes/index.js b/node_modules/semver/classes/index.js
deleted file mode 100644
index 5e3f5c9b19cef1ace7f0a65b97d54a681a46dd3f..0000000000000000000000000000000000000000
--- a/node_modules/semver/classes/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
-  SemVer: require('./semver.js'),
-  Range: require('./range.js'),
-  Comparator: require('./comparator.js'),
-}
diff --git a/node_modules/semver/classes/range.js b/node_modules/semver/classes/range.js
deleted file mode 100644
index ceee23144d3b892065ce736c929bdae99898ae4e..0000000000000000000000000000000000000000
--- a/node_modules/semver/classes/range.js
+++ /dev/null
@@ -1,554 +0,0 @@
-const SPACE_CHARACTERS = /\s+/g
-
-// hoisted class for cyclic dependency
-class Range {
-  constructor (range, options) {
-    options = parseOptions(options)
-
-    if (range instanceof Range) {
-      if (
-        range.loose === !!options.loose &&
-        range.includePrerelease === !!options.includePrerelease
-      ) {
-        return range
-      } else {
-        return new Range(range.raw, options)
-      }
-    }
-
-    if (range instanceof Comparator) {
-      // just put it in the set and return
-      this.raw = range.value
-      this.set = [[range]]
-      this.formatted = undefined
-      return this
-    }
-
-    this.options = options
-    this.loose = !!options.loose
-    this.includePrerelease = !!options.includePrerelease
-
-    // First reduce all whitespace as much as possible so we do not have to rely
-    // on potentially slow regexes like \s*. This is then stored and used for
-    // future error messages as well.
-    this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')
-
-    // First, split on ||
-    this.set = this.raw
-      .split('||')
-      // map the range to a 2d array of comparators
-      .map(r => this.parseRange(r.trim()))
-      // throw out any comparator lists that are empty
-      // this generally means that it was not a valid range, which is allowed
-      // in loose mode, but will still throw if the WHOLE range is invalid.
-      .filter(c => c.length)
-
-    if (!this.set.length) {
-      throw new TypeError(`Invalid SemVer Range: ${this.raw}`)
-    }
-
-    // if we have any that are not the null set, throw out null sets.
-    if (this.set.length > 1) {
-      // keep the first one, in case they're all null sets
-      const first = this.set[0]
-      this.set = this.set.filter(c => !isNullSet(c[0]))
-      if (this.set.length === 0) {
-        this.set = [first]
-      } else if (this.set.length > 1) {
-        // if we have any that are *, then the range is just *
-        for (const c of this.set) {
-          if (c.length === 1 && isAny(c[0])) {
-            this.set = [c]
-            break
-          }
-        }
-      }
-    }
-
-    this.formatted = undefined
-  }
-
-  get range () {
-    if (this.formatted === undefined) {
-      this.formatted = ''
-      for (let i = 0; i < this.set.length; i++) {
-        if (i > 0) {
-          this.formatted += '||'
-        }
-        const comps = this.set[i]
-        for (let k = 0; k < comps.length; k++) {
-          if (k > 0) {
-            this.formatted += ' '
-          }
-          this.formatted += comps[k].toString().trim()
-        }
-      }
-    }
-    return this.formatted
-  }
-
-  format () {
-    return this.range
-  }
-
-  toString () {
-    return this.range
-  }
-
-  parseRange (range) {
-    // memoize range parsing for performance.
-    // this is a very hot path, and fully deterministic.
-    const memoOpts =
-      (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |
-      (this.options.loose && FLAG_LOOSE)
-    const memoKey = memoOpts + ':' + range
-    const cached = cache.get(memoKey)
-    if (cached) {
-      return cached
-    }
-
-    const loose = this.options.loose
-    // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
-    const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]
-    range = range.replace(hr, hyphenReplace(this.options.includePrerelease))
-    debug('hyphen replace', range)
-
-    // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
-    range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)
-    debug('comparator trim', range)
-
-    // `~ 1.2.3` => `~1.2.3`
-    range = range.replace(re[t.TILDETRIM], tildeTrimReplace)
-    debug('tilde trim', range)
-
-    // `^ 1.2.3` => `^1.2.3`
-    range = range.replace(re[t.CARETTRIM], caretTrimReplace)
-    debug('caret trim', range)
-
-    // At this point, the range is completely trimmed and
-    // ready to be split into comparators.
-
-    let rangeList = range
-      .split(' ')
-      .map(comp => parseComparator(comp, this.options))
-      .join(' ')
-      .split(/\s+/)
-      // >=0.0.0 is equivalent to *
-      .map(comp => replaceGTE0(comp, this.options))
-
-    if (loose) {
-      // in loose mode, throw out any that are not valid comparators
-      rangeList = rangeList.filter(comp => {
-        debug('loose invalid filter', comp, this.options)
-        return !!comp.match(re[t.COMPARATORLOOSE])
-      })
-    }
-    debug('range list', rangeList)
-
-    // if any comparators are the null set, then replace with JUST null set
-    // if more than one comparator, remove any * comparators
-    // also, don't include the same comparator more than once
-    const rangeMap = new Map()
-    const comparators = rangeList.map(comp => new Comparator(comp, this.options))
-    for (const comp of comparators) {
-      if (isNullSet(comp)) {
-        return [comp]
-      }
-      rangeMap.set(comp.value, comp)
-    }
-    if (rangeMap.size > 1 && rangeMap.has('')) {
-      rangeMap.delete('')
-    }
-
-    const result = [...rangeMap.values()]
-    cache.set(memoKey, result)
-    return result
-  }
-
-  intersects (range, options) {
-    if (!(range instanceof Range)) {
-      throw new TypeError('a Range is required')
-    }
-
-    return this.set.some((thisComparators) => {
-      return (
-        isSatisfiable(thisComparators, options) &&
-        range.set.some((rangeComparators) => {
-          return (
-            isSatisfiable(rangeComparators, options) &&
-            thisComparators.every((thisComparator) => {
-              return rangeComparators.every((rangeComparator) => {
-                return thisComparator.intersects(rangeComparator, options)
-              })
-            })
-          )
-        })
-      )
-    })
-  }
-
-  // if ANY of the sets match ALL of its comparators, then pass
-  test (version) {
-    if (!version) {
-      return false
-    }
-
-    if (typeof version === 'string') {
-      try {
-        version = new SemVer(version, this.options)
-      } catch (er) {
-        return false
-      }
-    }
-
-    for (let i = 0; i < this.set.length; i++) {
-      if (testSet(this.set[i], version, this.options)) {
-        return true
-      }
-    }
-    return false
-  }
-}
-
-module.exports = Range
-
-const LRU = require('../internal/lrucache')
-const cache = new LRU()
-
-const parseOptions = require('../internal/parse-options')
-const Comparator = require('./comparator')
-const debug = require('../internal/debug')
-const SemVer = require('./semver')
-const {
-  safeRe: re,
-  t,
-  comparatorTrimReplace,
-  tildeTrimReplace,
-  caretTrimReplace,
-} = require('../internal/re')
-const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')
-
-const isNullSet = c => c.value === '<0.0.0-0'
-const isAny = c => c.value === ''
-
-// take a set of comparators and determine whether there
-// exists a version which can satisfy it
-const isSatisfiable = (comparators, options) => {
-  let result = true
-  const remainingComparators = comparators.slice()
-  let testComparator = remainingComparators.pop()
-
-  while (result && remainingComparators.length) {
-    result = remainingComparators.every((otherComparator) => {
-      return testComparator.intersects(otherComparator, options)
-    })
-
-    testComparator = remainingComparators.pop()
-  }
-
-  return result
-}
-
-// comprised of xranges, tildes, stars, and gtlt's at this point.
-// already replaced the hyphen ranges
-// turn into a set of JUST comparators.
-const parseComparator = (comp, options) => {
-  debug('comp', comp, options)
-  comp = replaceCarets(comp, options)
-  debug('caret', comp)
-  comp = replaceTildes(comp, options)
-  debug('tildes', comp)
-  comp = replaceXRanges(comp, options)
-  debug('xrange', comp)
-  comp = replaceStars(comp, options)
-  debug('stars', comp)
-  return comp
-}
-
-const isX = id => !id || id.toLowerCase() === 'x' || id === '*'
-
-// ~, ~> --> * (any, kinda silly)
-// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0
-// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0
-// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0
-// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0
-// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0
-// ~0.0.1 --> >=0.0.1 <0.1.0-0
-const replaceTildes = (comp, options) => {
-  return comp
-    .trim()
-    .split(/\s+/)
-    .map((c) => replaceTilde(c, options))
-    .join(' ')
-}
-
-const replaceTilde = (comp, options) => {
-  const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]
-  return comp.replace(r, (_, M, m, p, pr) => {
-    debug('tilde', comp, _, M, m, p, pr)
-    let ret
-
-    if (isX(M)) {
-      ret = ''
-    } else if (isX(m)) {
-      ret = `>=${M}.0.0 <${+M + 1}.0.0-0`
-    } else if (isX(p)) {
-      // ~1.2 == >=1.2.0 <1.3.0-0
-      ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`
-    } else if (pr) {
-      debug('replaceTilde pr', pr)
-      ret = `>=${M}.${m}.${p}-${pr
-      } <${M}.${+m + 1}.0-0`
-    } else {
-      // ~1.2.3 == >=1.2.3 <1.3.0-0
-      ret = `>=${M}.${m}.${p
-      } <${M}.${+m + 1}.0-0`
-    }
-
-    debug('tilde return', ret)
-    return ret
-  })
-}
-
-// ^ --> * (any, kinda silly)
-// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0
-// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0
-// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0
-// ^1.2.3 --> >=1.2.3 <2.0.0-0
-// ^1.2.0 --> >=1.2.0 <2.0.0-0
-// ^0.0.1 --> >=0.0.1 <0.0.2-0
-// ^0.1.0 --> >=0.1.0 <0.2.0-0
-const replaceCarets = (comp, options) => {
-  return comp
-    .trim()
-    .split(/\s+/)
-    .map((c) => replaceCaret(c, options))
-    .join(' ')
-}
-
-const replaceCaret = (comp, options) => {
-  debug('caret', comp, options)
-  const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]
-  const z = options.includePrerelease ? '-0' : ''
-  return comp.replace(r, (_, M, m, p, pr) => {
-    debug('caret', comp, _, M, m, p, pr)
-    let ret
-
-    if (isX(M)) {
-      ret = ''
-    } else if (isX(m)) {
-      ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`
-    } else if (isX(p)) {
-      if (M === '0') {
-        ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`
-      } else {
-        ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`
-      }
-    } else if (pr) {
-      debug('replaceCaret pr', pr)
-      if (M === '0') {
-        if (m === '0') {
-          ret = `>=${M}.${m}.${p}-${pr
-          } <${M}.${m}.${+p + 1}-0`
-        } else {
-          ret = `>=${M}.${m}.${p}-${pr
-          } <${M}.${+m + 1}.0-0`
-        }
-      } else {
-        ret = `>=${M}.${m}.${p}-${pr
-        } <${+M + 1}.0.0-0`
-      }
-    } else {
-      debug('no pr')
-      if (M === '0') {
-        if (m === '0') {
-          ret = `>=${M}.${m}.${p
-          }${z} <${M}.${m}.${+p + 1}-0`
-        } else {
-          ret = `>=${M}.${m}.${p
-          }${z} <${M}.${+m + 1}.0-0`
-        }
-      } else {
-        ret = `>=${M}.${m}.${p
-        } <${+M + 1}.0.0-0`
-      }
-    }
-
-    debug('caret return', ret)
-    return ret
-  })
-}
-
-const replaceXRanges = (comp, options) => {
-  debug('replaceXRanges', comp, options)
-  return comp
-    .split(/\s+/)
-    .map((c) => replaceXRange(c, options))
-    .join(' ')
-}
-
-const replaceXRange = (comp, options) => {
-  comp = comp.trim()
-  const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]
-  return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
-    debug('xRange', comp, ret, gtlt, M, m, p, pr)
-    const xM = isX(M)
-    const xm = xM || isX(m)
-    const xp = xm || isX(p)
-    const anyX = xp
-
-    if (gtlt === '=' && anyX) {
-      gtlt = ''
-    }
-
-    // if we're including prereleases in the match, then we need
-    // to fix this to -0, the lowest possible prerelease value
-    pr = options.includePrerelease ? '-0' : ''
-
-    if (xM) {
-      if (gtlt === '>' || gtlt === '<') {
-        // nothing is allowed
-        ret = '<0.0.0-0'
-      } else {
-        // nothing is forbidden
-        ret = '*'
-      }
-    } else if (gtlt && anyX) {
-      // we know patch is an x, because we have any x at all.
-      // replace X with 0
-      if (xm) {
-        m = 0
-      }
-      p = 0
-
-      if (gtlt === '>') {
-        // >1 => >=2.0.0
-        // >1.2 => >=1.3.0
-        gtlt = '>='
-        if (xm) {
-          M = +M + 1
-          m = 0
-          p = 0
-        } else {
-          m = +m + 1
-          p = 0
-        }
-      } else if (gtlt === '<=') {
-        // <=0.7.x is actually <0.8.0, since any 0.7.x should
-        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
-        gtlt = '<'
-        if (xm) {
-          M = +M + 1
-        } else {
-          m = +m + 1
-        }
-      }
-
-      if (gtlt === '<') {
-        pr = '-0'
-      }
-
-      ret = `${gtlt + M}.${m}.${p}${pr}`
-    } else if (xm) {
-      ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`
-    } else if (xp) {
-      ret = `>=${M}.${m}.0${pr
-      } <${M}.${+m + 1}.0-0`
-    }
-
-    debug('xRange return', ret)
-
-    return ret
-  })
-}
-
-// Because * is AND-ed with everything else in the comparator,
-// and '' means "any version", just remove the *s entirely.
-const replaceStars = (comp, options) => {
-  debug('replaceStars', comp, options)
-  // Looseness is ignored here.  star is always as loose as it gets!
-  return comp
-    .trim()
-    .replace(re[t.STAR], '')
-}
-
-const replaceGTE0 = (comp, options) => {
-  debug('replaceGTE0', comp, options)
-  return comp
-    .trim()
-    .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')
-}
-
-// This function is passed to string.replace(re[t.HYPHENRANGE])
-// M, m, patch, prerelease, build
-// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
-// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do
-// 1.2 - 3.4 => >=1.2.0 <3.5.0-0
-// TODO build?
-const hyphenReplace = incPr => ($0,
-  from, fM, fm, fp, fpr, fb,
-  to, tM, tm, tp, tpr) => {
-  if (isX(fM)) {
-    from = ''
-  } else if (isX(fm)) {
-    from = `>=${fM}.0.0${incPr ? '-0' : ''}`
-  } else if (isX(fp)) {
-    from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`
-  } else if (fpr) {
-    from = `>=${from}`
-  } else {
-    from = `>=${from}${incPr ? '-0' : ''}`
-  }
-
-  if (isX(tM)) {
-    to = ''
-  } else if (isX(tm)) {
-    to = `<${+tM + 1}.0.0-0`
-  } else if (isX(tp)) {
-    to = `<${tM}.${+tm + 1}.0-0`
-  } else if (tpr) {
-    to = `<=${tM}.${tm}.${tp}-${tpr}`
-  } else if (incPr) {
-    to = `<${tM}.${tm}.${+tp + 1}-0`
-  } else {
-    to = `<=${to}`
-  }
-
-  return `${from} ${to}`.trim()
-}
-
-const testSet = (set, version, options) => {
-  for (let i = 0; i < set.length; i++) {
-    if (!set[i].test(version)) {
-      return false
-    }
-  }
-
-  if (version.prerelease.length && !options.includePrerelease) {
-    // Find the set of versions that are allowed to have prereleases
-    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
-    // That should allow `1.2.3-pr.2` to pass.
-    // However, `1.2.4-alpha.notready` should NOT be allowed,
-    // even though it's within the range set by the comparators.
-    for (let i = 0; i < set.length; i++) {
-      debug(set[i].semver)
-      if (set[i].semver === Comparator.ANY) {
-        continue
-      }
-
-      if (set[i].semver.prerelease.length > 0) {
-        const allowed = set[i].semver
-        if (allowed.major === version.major &&
-            allowed.minor === version.minor &&
-            allowed.patch === version.patch) {
-          return true
-        }
-      }
-    }
-
-    // Version has a -pre, but it's not one of the ones we like.
-    return false
-  }
-
-  return true
-}
diff --git a/node_modules/semver/classes/semver.js b/node_modules/semver/classes/semver.js
deleted file mode 100644
index 6fbc062bc246a1fea912e08a615fa2939d67864d..0000000000000000000000000000000000000000
--- a/node_modules/semver/classes/semver.js
+++ /dev/null
@@ -1,318 +0,0 @@
-const debug = require('../internal/debug')
-const { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')
-const { safeRe: re, safeSrc: src, t } = require('../internal/re')
-
-const parseOptions = require('../internal/parse-options')
-const { compareIdentifiers } = require('../internal/identifiers')
-class SemVer {
-  constructor (version, options) {
-    options = parseOptions(options)
-
-    if (version instanceof SemVer) {
-      if (version.loose === !!options.loose &&
-        version.includePrerelease === !!options.includePrerelease) {
-        return version
-      } else {
-        version = version.version
-      }
-    } else if (typeof version !== 'string') {
-      throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`)
-    }
-
-    if (version.length > MAX_LENGTH) {
-      throw new TypeError(
-        `version is longer than ${MAX_LENGTH} characters`
-      )
-    }
-
-    debug('SemVer', version, options)
-    this.options = options
-    this.loose = !!options.loose
-    // this isn't actually relevant for versions, but keep it so that we
-    // don't run into trouble passing this.options around.
-    this.includePrerelease = !!options.includePrerelease
-
-    const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])
-
-    if (!m) {
-      throw new TypeError(`Invalid Version: ${version}`)
-    }
-
-    this.raw = version
-
-    // these are actually numbers
-    this.major = +m[1]
-    this.minor = +m[2]
-    this.patch = +m[3]
-
-    if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
-      throw new TypeError('Invalid major version')
-    }
-
-    if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
-      throw new TypeError('Invalid minor version')
-    }
-
-    if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
-      throw new TypeError('Invalid patch version')
-    }
-
-    // numberify any prerelease numeric ids
-    if (!m[4]) {
-      this.prerelease = []
-    } else {
-      this.prerelease = m[4].split('.').map((id) => {
-        if (/^[0-9]+$/.test(id)) {
-          const num = +id
-          if (num >= 0 && num < MAX_SAFE_INTEGER) {
-            return num
-          }
-        }
-        return id
-      })
-    }
-
-    this.build = m[5] ? m[5].split('.') : []
-    this.format()
-  }
-
-  format () {
-    this.version = `${this.major}.${this.minor}.${this.patch}`
-    if (this.prerelease.length) {
-      this.version += `-${this.prerelease.join('.')}`
-    }
-    return this.version
-  }
-
-  toString () {
-    return this.version
-  }
-
-  compare (other) {
-    debug('SemVer.compare', this.version, this.options, other)
-    if (!(other instanceof SemVer)) {
-      if (typeof other === 'string' && other === this.version) {
-        return 0
-      }
-      other = new SemVer(other, this.options)
-    }
-
-    if (other.version === this.version) {
-      return 0
-    }
-
-    return this.compareMain(other) || this.comparePre(other)
-  }
-
-  compareMain (other) {
-    if (!(other instanceof SemVer)) {
-      other = new SemVer(other, this.options)
-    }
-
-    return (
-      compareIdentifiers(this.major, other.major) ||
-      compareIdentifiers(this.minor, other.minor) ||
-      compareIdentifiers(this.patch, other.patch)
-    )
-  }
-
-  comparePre (other) {
-    if (!(other instanceof SemVer)) {
-      other = new SemVer(other, this.options)
-    }
-
-    // NOT having a prerelease is > having one
-    if (this.prerelease.length && !other.prerelease.length) {
-      return -1
-    } else if (!this.prerelease.length && other.prerelease.length) {
-      return 1
-    } else if (!this.prerelease.length && !other.prerelease.length) {
-      return 0
-    }
-
-    let i = 0
-    do {
-      const a = this.prerelease[i]
-      const b = other.prerelease[i]
-      debug('prerelease compare', i, a, b)
-      if (a === undefined && b === undefined) {
-        return 0
-      } else if (b === undefined) {
-        return 1
-      } else if (a === undefined) {
-        return -1
-      } else if (a === b) {
-        continue
-      } else {
-        return compareIdentifiers(a, b)
-      }
-    } while (++i)
-  }
-
-  compareBuild (other) {
-    if (!(other instanceof SemVer)) {
-      other = new SemVer(other, this.options)
-    }
-
-    let i = 0
-    do {
-      const a = this.build[i]
-      const b = other.build[i]
-      debug('build compare', i, a, b)
-      if (a === undefined && b === undefined) {
-        return 0
-      } else if (b === undefined) {
-        return 1
-      } else if (a === undefined) {
-        return -1
-      } else if (a === b) {
-        continue
-      } else {
-        return compareIdentifiers(a, b)
-      }
-    } while (++i)
-  }
-
-  // preminor will bump the version up to the next minor release, and immediately
-  // down to pre-release. premajor and prepatch work the same way.
-  inc (release, identifier, identifierBase) {
-    if (release.startsWith('pre')) {
-      if (!identifier && identifierBase === false) {
-        throw new Error('invalid increment argument: identifier is empty')
-      }
-      // Avoid an invalid semver results
-      if (identifier) {
-        const r = new RegExp(`^${this.options.loose ? src[t.PRERELEASELOOSE] : src[t.PRERELEASE]}$`)
-        const match = `-${identifier}`.match(r)
-        if (!match || match[1] !== identifier) {
-          throw new Error(`invalid identifier: ${identifier}`)
-        }
-      }
-    }
-
-    switch (release) {
-      case 'premajor':
-        this.prerelease.length = 0
-        this.patch = 0
-        this.minor = 0
-        this.major++
-        this.inc('pre', identifier, identifierBase)
-        break
-      case 'preminor':
-        this.prerelease.length = 0
-        this.patch = 0
-        this.minor++
-        this.inc('pre', identifier, identifierBase)
-        break
-      case 'prepatch':
-        // If this is already a prerelease, it will bump to the next version
-        // drop any prereleases that might already exist, since they are not
-        // relevant at this point.
-        this.prerelease.length = 0
-        this.inc('patch', identifier, identifierBase)
-        this.inc('pre', identifier, identifierBase)
-        break
-      // If the input is a non-prerelease version, this acts the same as
-      // prepatch.
-      case 'prerelease':
-        if (this.prerelease.length === 0) {
-          this.inc('patch', identifier, identifierBase)
-        }
-        this.inc('pre', identifier, identifierBase)
-        break
-      case 'release':
-        if (this.prerelease.length === 0) {
-          throw new Error(`version ${this.raw} is not a prerelease`)
-        }
-        this.prerelease.length = 0
-        break
-
-      case 'major':
-        // If this is a pre-major version, bump up to the same major version.
-        // Otherwise increment major.
-        // 1.0.0-5 bumps to 1.0.0
-        // 1.1.0 bumps to 2.0.0
-        if (
-          this.minor !== 0 ||
-          this.patch !== 0 ||
-          this.prerelease.length === 0
-        ) {
-          this.major++
-        }
-        this.minor = 0
-        this.patch = 0
-        this.prerelease = []
-        break
-      case 'minor':
-        // If this is a pre-minor version, bump up to the same minor version.
-        // Otherwise increment minor.
-        // 1.2.0-5 bumps to 1.2.0
-        // 1.2.1 bumps to 1.3.0
-        if (this.patch !== 0 || this.prerelease.length === 0) {
-          this.minor++
-        }
-        this.patch = 0
-        this.prerelease = []
-        break
-      case 'patch':
-        // If this is not a pre-release version, it will increment the patch.
-        // If it is a pre-release it will bump up to the same patch version.
-        // 1.2.0-5 patches to 1.2.0
-        // 1.2.0 patches to 1.2.1
-        if (this.prerelease.length === 0) {
-          this.patch++
-        }
-        this.prerelease = []
-        break
-      // This probably shouldn't be used publicly.
-      // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.
-      case 'pre': {
-        const base = Number(identifierBase) ? 1 : 0
-
-        if (this.prerelease.length === 0) {
-          this.prerelease = [base]
-        } else {
-          let i = this.prerelease.length
-          while (--i >= 0) {
-            if (typeof this.prerelease[i] === 'number') {
-              this.prerelease[i]++
-              i = -2
-            }
-          }
-          if (i === -1) {
-            // didn't increment anything
-            if (identifier === this.prerelease.join('.') && identifierBase === false) {
-              throw new Error('invalid increment argument: identifier already exists')
-            }
-            this.prerelease.push(base)
-          }
-        }
-        if (identifier) {
-          // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
-          // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
-          let prerelease = [identifier, base]
-          if (identifierBase === false) {
-            prerelease = [identifier]
-          }
-          if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
-            if (isNaN(this.prerelease[1])) {
-              this.prerelease = prerelease
-            }
-          } else {
-            this.prerelease = prerelease
-          }
-        }
-        break
-      }
-      default:
-        throw new Error(`invalid increment argument: ${release}`)
-    }
-    this.raw = this.format()
-    if (this.build.length) {
-      this.raw += `+${this.build.join('.')}`
-    }
-    return this
-  }
-}
-
-module.exports = SemVer
diff --git a/node_modules/semver/functions/clean.js b/node_modules/semver/functions/clean.js
deleted file mode 100644
index 811fe6b82cb73eeace0db4ecdcddcbc22bc02d5c..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/clean.js
+++ /dev/null
@@ -1,6 +0,0 @@
-const parse = require('./parse')
-const clean = (version, options) => {
-  const s = parse(version.trim().replace(/^[=v]+/, ''), options)
-  return s ? s.version : null
-}
-module.exports = clean
diff --git a/node_modules/semver/functions/cmp.js b/node_modules/semver/functions/cmp.js
deleted file mode 100644
index 40119094747dd068d244f261210bbdf23dc6460c..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/cmp.js
+++ /dev/null
@@ -1,52 +0,0 @@
-const eq = require('./eq')
-const neq = require('./neq')
-const gt = require('./gt')
-const gte = require('./gte')
-const lt = require('./lt')
-const lte = require('./lte')
-
-const cmp = (a, op, b, loose) => {
-  switch (op) {
-    case '===':
-      if (typeof a === 'object') {
-        a = a.version
-      }
-      if (typeof b === 'object') {
-        b = b.version
-      }
-      return a === b
-
-    case '!==':
-      if (typeof a === 'object') {
-        a = a.version
-      }
-      if (typeof b === 'object') {
-        b = b.version
-      }
-      return a !== b
-
-    case '':
-    case '=':
-    case '==':
-      return eq(a, b, loose)
-
-    case '!=':
-      return neq(a, b, loose)
-
-    case '>':
-      return gt(a, b, loose)
-
-    case '>=':
-      return gte(a, b, loose)
-
-    case '<':
-      return lt(a, b, loose)
-
-    case '<=':
-      return lte(a, b, loose)
-
-    default:
-      throw new TypeError(`Invalid operator: ${op}`)
-  }
-}
-module.exports = cmp
diff --git a/node_modules/semver/functions/coerce.js b/node_modules/semver/functions/coerce.js
deleted file mode 100644
index b378dcea4e5a7428d8ad21777a15c67c5441c41a..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/coerce.js
+++ /dev/null
@@ -1,60 +0,0 @@
-const SemVer = require('../classes/semver')
-const parse = require('./parse')
-const { safeRe: re, t } = require('../internal/re')
-
-const coerce = (version, options) => {
-  if (version instanceof SemVer) {
-    return version
-  }
-
-  if (typeof version === 'number') {
-    version = String(version)
-  }
-
-  if (typeof version !== 'string') {
-    return null
-  }
-
-  options = options || {}
-
-  let match = null
-  if (!options.rtl) {
-    match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])
-  } else {
-    // Find the right-most coercible string that does not share
-    // a terminus with a more left-ward coercible string.
-    // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
-    // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'
-    //
-    // Walk through the string checking with a /g regexp
-    // Manually set the index so as to pick up overlapping matches.
-    // Stop when we get a match that ends at the string end, since no
-    // coercible string can be more right-ward without the same terminus.
-    const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]
-    let next
-    while ((next = coerceRtlRegex.exec(version)) &&
-        (!match || match.index + match[0].length !== version.length)
-    ) {
-      if (!match ||
-            next.index + next[0].length !== match.index + match[0].length) {
-        match = next
-      }
-      coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length
-    }
-    // leave it in a clean state
-    coerceRtlRegex.lastIndex = -1
-  }
-
-  if (match === null) {
-    return null
-  }
-
-  const major = match[2]
-  const minor = match[3] || '0'
-  const patch = match[4] || '0'
-  const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''
-  const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''
-
-  return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)
-}
-module.exports = coerce
diff --git a/node_modules/semver/functions/compare-build.js b/node_modules/semver/functions/compare-build.js
deleted file mode 100644
index 9eb881bef0fddc7bdef1084460b5588a18790377..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/compare-build.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const SemVer = require('../classes/semver')
-const compareBuild = (a, b, loose) => {
-  const versionA = new SemVer(a, loose)
-  const versionB = new SemVer(b, loose)
-  return versionA.compare(versionB) || versionA.compareBuild(versionB)
-}
-module.exports = compareBuild
diff --git a/node_modules/semver/functions/compare-loose.js b/node_modules/semver/functions/compare-loose.js
deleted file mode 100644
index 4881fbe00250c53f1508d86192be31bae9781f3e..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/compare-loose.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const compare = require('./compare')
-const compareLoose = (a, b) => compare(a, b, true)
-module.exports = compareLoose
diff --git a/node_modules/semver/functions/compare.js b/node_modules/semver/functions/compare.js
deleted file mode 100644
index 748b7afa514a9f356b3f180a34e9150df3777ecd..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/compare.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const SemVer = require('../classes/semver')
-const compare = (a, b, loose) =>
-  new SemVer(a, loose).compare(new SemVer(b, loose))
-
-module.exports = compare
diff --git a/node_modules/semver/functions/diff.js b/node_modules/semver/functions/diff.js
deleted file mode 100644
index 33171dc1ca45ae69504028ddcc7876f510edc6e4..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/diff.js
+++ /dev/null
@@ -1,58 +0,0 @@
-const parse = require('./parse.js')
-
-const diff = (version1, version2) => {
-  const v1 = parse(version1, null, true)
-  const v2 = parse(version2, null, true)
-  const comparison = v1.compare(v2)
-
-  if (comparison === 0) {
-    return null
-  }
-
-  const v1Higher = comparison > 0
-  const highVersion = v1Higher ? v1 : v2
-  const lowVersion = v1Higher ? v2 : v1
-  const highHasPre = !!highVersion.prerelease.length
-  const lowHasPre = !!lowVersion.prerelease.length
-
-  if (lowHasPre && !highHasPre) {
-    // Going from prerelease -> no prerelease requires some special casing
-
-    // If the low version has only a major, then it will always be a major
-    // Some examples:
-    // 1.0.0-1 -> 1.0.0
-    // 1.0.0-1 -> 1.1.1
-    // 1.0.0-1 -> 2.0.0
-    if (!lowVersion.patch && !lowVersion.minor) {
-      return 'major'
-    }
-
-    // If the main part has no difference
-    if (lowVersion.compareMain(highVersion) === 0) {
-      if (lowVersion.minor && !lowVersion.patch) {
-        return 'minor'
-      }
-      return 'patch'
-    }
-  }
-
-  // add the `pre` prefix if we are going to a prerelease version
-  const prefix = highHasPre ? 'pre' : ''
-
-  if (v1.major !== v2.major) {
-    return prefix + 'major'
-  }
-
-  if (v1.minor !== v2.minor) {
-    return prefix + 'minor'
-  }
-
-  if (v1.patch !== v2.patch) {
-    return prefix + 'patch'
-  }
-
-  // high and low are preleases
-  return 'prerelease'
-}
-
-module.exports = diff
diff --git a/node_modules/semver/functions/eq.js b/node_modules/semver/functions/eq.js
deleted file mode 100644
index 271fed976f34a6e881f7b5205d509ab61e24a498..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/eq.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const compare = require('./compare')
-const eq = (a, b, loose) => compare(a, b, loose) === 0
-module.exports = eq
diff --git a/node_modules/semver/functions/gt.js b/node_modules/semver/functions/gt.js
deleted file mode 100644
index d9b2156d8b56c3b7e478a294b78653b955820931..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/gt.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const compare = require('./compare')
-const gt = (a, b, loose) => compare(a, b, loose) > 0
-module.exports = gt
diff --git a/node_modules/semver/functions/gte.js b/node_modules/semver/functions/gte.js
deleted file mode 100644
index 5aeaa634707a0c464b55c81555779aefc36732bb..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/gte.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const compare = require('./compare')
-const gte = (a, b, loose) => compare(a, b, loose) >= 0
-module.exports = gte
diff --git a/node_modules/semver/functions/inc.js b/node_modules/semver/functions/inc.js
deleted file mode 100644
index 7670b1bea1a497db92353bdd8b6c0687df0cb38b..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/inc.js
+++ /dev/null
@@ -1,19 +0,0 @@
-const SemVer = require('../classes/semver')
-
-const inc = (version, release, options, identifier, identifierBase) => {
-  if (typeof (options) === 'string') {
-    identifierBase = identifier
-    identifier = options
-    options = undefined
-  }
-
-  try {
-    return new SemVer(
-      version instanceof SemVer ? version.version : version,
-      options
-    ).inc(release, identifier, identifierBase).version
-  } catch (er) {
-    return null
-  }
-}
-module.exports = inc
diff --git a/node_modules/semver/functions/lt.js b/node_modules/semver/functions/lt.js
deleted file mode 100644
index b440ab7d4212d3500c12fba05520c0d39bacac2c..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/lt.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const compare = require('./compare')
-const lt = (a, b, loose) => compare(a, b, loose) < 0
-module.exports = lt
diff --git a/node_modules/semver/functions/lte.js b/node_modules/semver/functions/lte.js
deleted file mode 100644
index 6dcc956505584ea53d2680d6f2bc1f317bfa2019..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/lte.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const compare = require('./compare')
-const lte = (a, b, loose) => compare(a, b, loose) <= 0
-module.exports = lte
diff --git a/node_modules/semver/functions/major.js b/node_modules/semver/functions/major.js
deleted file mode 100644
index 4283165e9d27198f495588d07f3bc0c26a9ab83e..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/major.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const SemVer = require('../classes/semver')
-const major = (a, loose) => new SemVer(a, loose).major
-module.exports = major
diff --git a/node_modules/semver/functions/minor.js b/node_modules/semver/functions/minor.js
deleted file mode 100644
index 57b3455f827bac6a3376df0e782d1259cef2e3c9..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/minor.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const SemVer = require('../classes/semver')
-const minor = (a, loose) => new SemVer(a, loose).minor
-module.exports = minor
diff --git a/node_modules/semver/functions/neq.js b/node_modules/semver/functions/neq.js
deleted file mode 100644
index f944c01576973f8c98ad4d446f7f85295a4b1d4a..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/neq.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const compare = require('./compare')
-const neq = (a, b, loose) => compare(a, b, loose) !== 0
-module.exports = neq
diff --git a/node_modules/semver/functions/parse.js b/node_modules/semver/functions/parse.js
deleted file mode 100644
index 459b3b17375c820308133a0f4d7fe1bf7452c73a..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/parse.js
+++ /dev/null
@@ -1,16 +0,0 @@
-const SemVer = require('../classes/semver')
-const parse = (version, options, throwErrors = false) => {
-  if (version instanceof SemVer) {
-    return version
-  }
-  try {
-    return new SemVer(version, options)
-  } catch (er) {
-    if (!throwErrors) {
-      return null
-    }
-    throw er
-  }
-}
-
-module.exports = parse
diff --git a/node_modules/semver/functions/patch.js b/node_modules/semver/functions/patch.js
deleted file mode 100644
index 63afca2524fca975831dcbfc13d011fad4ca6be8..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/patch.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const SemVer = require('../classes/semver')
-const patch = (a, loose) => new SemVer(a, loose).patch
-module.exports = patch
diff --git a/node_modules/semver/functions/prerelease.js b/node_modules/semver/functions/prerelease.js
deleted file mode 100644
index 06aa13248ae65180cce1f2b3567be654c92b467a..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/prerelease.js
+++ /dev/null
@@ -1,6 +0,0 @@
-const parse = require('./parse')
-const prerelease = (version, options) => {
-  const parsed = parse(version, options)
-  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
-}
-module.exports = prerelease
diff --git a/node_modules/semver/functions/rcompare.js b/node_modules/semver/functions/rcompare.js
deleted file mode 100644
index 0ac509e79dc8cfcde46be9d8247b91dd301fbde8..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/rcompare.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const compare = require('./compare')
-const rcompare = (a, b, loose) => compare(b, a, loose)
-module.exports = rcompare
diff --git a/node_modules/semver/functions/rsort.js b/node_modules/semver/functions/rsort.js
deleted file mode 100644
index 82404c5cfe0266acc57d58db007d02dc355a8658..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/rsort.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const compareBuild = require('./compare-build')
-const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))
-module.exports = rsort
diff --git a/node_modules/semver/functions/satisfies.js b/node_modules/semver/functions/satisfies.js
deleted file mode 100644
index 50af1c199b6caedb386f3591e1e70a02dd2c01d7..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/satisfies.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const Range = require('../classes/range')
-const satisfies = (version, range, options) => {
-  try {
-    range = new Range(range, options)
-  } catch (er) {
-    return false
-  }
-  return range.test(version)
-}
-module.exports = satisfies
diff --git a/node_modules/semver/functions/sort.js b/node_modules/semver/functions/sort.js
deleted file mode 100644
index 4d10917aba8e5a6cb01284b6987642b50f655eef..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/sort.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const compareBuild = require('./compare-build')
-const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))
-module.exports = sort
diff --git a/node_modules/semver/functions/valid.js b/node_modules/semver/functions/valid.js
deleted file mode 100644
index f27bae10731c0cfedf0419993e291ef44aac072c..0000000000000000000000000000000000000000
--- a/node_modules/semver/functions/valid.js
+++ /dev/null
@@ -1,6 +0,0 @@
-const parse = require('./parse')
-const valid = (version, options) => {
-  const v = parse(version, options)
-  return v ? v.version : null
-}
-module.exports = valid
diff --git a/node_modules/semver/index.js b/node_modules/semver/index.js
deleted file mode 100644
index 86d42ac16a840bb83cdba9b94ec4ff2359e7af47..0000000000000000000000000000000000000000
--- a/node_modules/semver/index.js
+++ /dev/null
@@ -1,89 +0,0 @@
-// just pre-load all the stuff that index.js lazily exports
-const internalRe = require('./internal/re')
-const constants = require('./internal/constants')
-const SemVer = require('./classes/semver')
-const identifiers = require('./internal/identifiers')
-const parse = require('./functions/parse')
-const valid = require('./functions/valid')
-const clean = require('./functions/clean')
-const inc = require('./functions/inc')
-const diff = require('./functions/diff')
-const major = require('./functions/major')
-const minor = require('./functions/minor')
-const patch = require('./functions/patch')
-const prerelease = require('./functions/prerelease')
-const compare = require('./functions/compare')
-const rcompare = require('./functions/rcompare')
-const compareLoose = require('./functions/compare-loose')
-const compareBuild = require('./functions/compare-build')
-const sort = require('./functions/sort')
-const rsort = require('./functions/rsort')
-const gt = require('./functions/gt')
-const lt = require('./functions/lt')
-const eq = require('./functions/eq')
-const neq = require('./functions/neq')
-const gte = require('./functions/gte')
-const lte = require('./functions/lte')
-const cmp = require('./functions/cmp')
-const coerce = require('./functions/coerce')
-const Comparator = require('./classes/comparator')
-const Range = require('./classes/range')
-const satisfies = require('./functions/satisfies')
-const toComparators = require('./ranges/to-comparators')
-const maxSatisfying = require('./ranges/max-satisfying')
-const minSatisfying = require('./ranges/min-satisfying')
-const minVersion = require('./ranges/min-version')
-const validRange = require('./ranges/valid')
-const outside = require('./ranges/outside')
-const gtr = require('./ranges/gtr')
-const ltr = require('./ranges/ltr')
-const intersects = require('./ranges/intersects')
-const simplifyRange = require('./ranges/simplify')
-const subset = require('./ranges/subset')
-module.exports = {
-  parse,
-  valid,
-  clean,
-  inc,
-  diff,
-  major,
-  minor,
-  patch,
-  prerelease,
-  compare,
-  rcompare,
-  compareLoose,
-  compareBuild,
-  sort,
-  rsort,
-  gt,
-  lt,
-  eq,
-  neq,
-  gte,
-  lte,
-  cmp,
-  coerce,
-  Comparator,
-  Range,
-  satisfies,
-  toComparators,
-  maxSatisfying,
-  minSatisfying,
-  minVersion,
-  validRange,
-  outside,
-  gtr,
-  ltr,
-  intersects,
-  simplifyRange,
-  subset,
-  SemVer,
-  re: internalRe.re,
-  src: internalRe.src,
-  tokens: internalRe.t,
-  SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,
-  RELEASE_TYPES: constants.RELEASE_TYPES,
-  compareIdentifiers: identifiers.compareIdentifiers,
-  rcompareIdentifiers: identifiers.rcompareIdentifiers,
-}
diff --git a/node_modules/semver/internal/constants.js b/node_modules/semver/internal/constants.js
deleted file mode 100644
index 94be1c570277a5b43c70636bfb469eb370a606c5..0000000000000000000000000000000000000000
--- a/node_modules/semver/internal/constants.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// Note: this is the semver.org version of the spec that it implements
-// Not necessarily the package version of this code.
-const SEMVER_SPEC_VERSION = '2.0.0'
-
-const MAX_LENGTH = 256
-const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
-/* istanbul ignore next */ 9007199254740991
-
-// Max safe segment length for coercion.
-const MAX_SAFE_COMPONENT_LENGTH = 16
-
-// Max safe length for a build identifier. The max length minus 6 characters for
-// the shortest version with a build 0.0.0+BUILD.
-const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6
-
-const RELEASE_TYPES = [
-  'major',
-  'premajor',
-  'minor',
-  'preminor',
-  'patch',
-  'prepatch',
-  'prerelease',
-]
-
-module.exports = {
-  MAX_LENGTH,
-  MAX_SAFE_COMPONENT_LENGTH,
-  MAX_SAFE_BUILD_LENGTH,
-  MAX_SAFE_INTEGER,
-  RELEASE_TYPES,
-  SEMVER_SPEC_VERSION,
-  FLAG_INCLUDE_PRERELEASE: 0b001,
-  FLAG_LOOSE: 0b010,
-}
diff --git a/node_modules/semver/internal/debug.js b/node_modules/semver/internal/debug.js
deleted file mode 100644
index 1c00e1369aa2a00122407dc3887a45a29be3210e..0000000000000000000000000000000000000000
--- a/node_modules/semver/internal/debug.js
+++ /dev/null
@@ -1,9 +0,0 @@
-const debug = (
-  typeof process === 'object' &&
-  process.env &&
-  process.env.NODE_DEBUG &&
-  /\bsemver\b/i.test(process.env.NODE_DEBUG)
-) ? (...args) => console.error('SEMVER', ...args)
-  : () => {}
-
-module.exports = debug
diff --git a/node_modules/semver/internal/identifiers.js b/node_modules/semver/internal/identifiers.js
deleted file mode 100644
index e612d0a3d83619b20830a9ebfa5bdd0d1c317dcd..0000000000000000000000000000000000000000
--- a/node_modules/semver/internal/identifiers.js
+++ /dev/null
@@ -1,23 +0,0 @@
-const numeric = /^[0-9]+$/
-const compareIdentifiers = (a, b) => {
-  const anum = numeric.test(a)
-  const bnum = numeric.test(b)
-
-  if (anum && bnum) {
-    a = +a
-    b = +b
-  }
-
-  return a === b ? 0
-    : (anum && !bnum) ? -1
-    : (bnum && !anum) ? 1
-    : a < b ? -1
-    : 1
-}
-
-const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)
-
-module.exports = {
-  compareIdentifiers,
-  rcompareIdentifiers,
-}
diff --git a/node_modules/semver/internal/lrucache.js b/node_modules/semver/internal/lrucache.js
deleted file mode 100644
index 6d89ec948d0f1f0f1972e0e805aa76fc81e73597..0000000000000000000000000000000000000000
--- a/node_modules/semver/internal/lrucache.js
+++ /dev/null
@@ -1,40 +0,0 @@
-class LRUCache {
-  constructor () {
-    this.max = 1000
-    this.map = new Map()
-  }
-
-  get (key) {
-    const value = this.map.get(key)
-    if (value === undefined) {
-      return undefined
-    } else {
-      // Remove the key from the map and add it to the end
-      this.map.delete(key)
-      this.map.set(key, value)
-      return value
-    }
-  }
-
-  delete (key) {
-    return this.map.delete(key)
-  }
-
-  set (key, value) {
-    const deleted = this.delete(key)
-
-    if (!deleted && value !== undefined) {
-      // If cache is full, delete the least recently used item
-      if (this.map.size >= this.max) {
-        const firstKey = this.map.keys().next().value
-        this.delete(firstKey)
-      }
-
-      this.map.set(key, value)
-    }
-
-    return this
-  }
-}
-
-module.exports = LRUCache
diff --git a/node_modules/semver/internal/parse-options.js b/node_modules/semver/internal/parse-options.js
deleted file mode 100644
index 10d64ce06d3c596dd93fdf283f11ae23e7f33363..0000000000000000000000000000000000000000
--- a/node_modules/semver/internal/parse-options.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// parse out just the options we care about
-const looseOption = Object.freeze({ loose: true })
-const emptyOpts = Object.freeze({ })
-const parseOptions = options => {
-  if (!options) {
-    return emptyOpts
-  }
-
-  if (typeof options !== 'object') {
-    return looseOption
-  }
-
-  return options
-}
-module.exports = parseOptions
diff --git a/node_modules/semver/internal/re.js b/node_modules/semver/internal/re.js
deleted file mode 100644
index 2a956ba0a318deb2c43336696ed8b5826295b578..0000000000000000000000000000000000000000
--- a/node_modules/semver/internal/re.js
+++ /dev/null
@@ -1,219 +0,0 @@
-const {
-  MAX_SAFE_COMPONENT_LENGTH,
-  MAX_SAFE_BUILD_LENGTH,
-  MAX_LENGTH,
-} = require('./constants')
-const debug = require('./debug')
-exports = module.exports = {}
-
-// The actual regexps go on exports.re
-const re = exports.re = []
-const safeRe = exports.safeRe = []
-const src = exports.src = []
-const safeSrc = exports.safeSrc = []
-const t = exports.t = {}
-let R = 0
-
-const LETTERDASHNUMBER = '[a-zA-Z0-9-]'
-
-// Replace some greedy regex tokens to prevent regex dos issues. These regex are
-// used internally via the safeRe object since all inputs in this library get
-// normalized first to trim and collapse all extra whitespace. The original
-// regexes are exported for userland consumption and lower level usage. A
-// future breaking change could export the safer regex only with a note that
-// all input should have extra whitespace removed.
-const safeRegexReplacements = [
-  ['\\s', 1],
-  ['\\d', MAX_LENGTH],
-  [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],
-]
-
-const makeSafeRegex = (value) => {
-  for (const [token, max] of safeRegexReplacements) {
-    value = value
-      .split(`${token}*`).join(`${token}{0,${max}}`)
-      .split(`${token}+`).join(`${token}{1,${max}}`)
-  }
-  return value
-}
-
-const createToken = (name, value, isGlobal) => {
-  const safe = makeSafeRegex(value)
-  const index = R++
-  debug(name, index, value)
-  t[name] = index
-  src[index] = value
-  safeSrc[index] = safe
-  re[index] = new RegExp(value, isGlobal ? 'g' : undefined)
-  safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)
-}
-
-// The following Regular Expressions can be used for tokenizing,
-// validating, and parsing SemVer version strings.
-
-// ## Numeric Identifier
-// A single `0`, or a non-zero digit followed by zero or more digits.
-
-createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*')
-createToken('NUMERICIDENTIFIERLOOSE', '\\d+')
-
-// ## Non-numeric Identifier
-// Zero or more digits, followed by a letter or hyphen, and then zero or
-// more letters, digits, or hyphens.
-
-createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)
-
-// ## Main Version
-// Three dot-separated numeric identifiers.
-
-createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` +
-                   `(${src[t.NUMERICIDENTIFIER]})\\.` +
-                   `(${src[t.NUMERICIDENTIFIER]})`)
-
-createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
-                        `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
-                        `(${src[t.NUMERICIDENTIFIERLOOSE]})`)
-
-// ## Pre-release Version Identifier
-// A numeric identifier, or a non-numeric identifier.
-
-createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]
-}|${src[t.NONNUMERICIDENTIFIER]})`)
-
-createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]
-}|${src[t.NONNUMERICIDENTIFIER]})`)
-
-// ## Pre-release Version
-// Hyphen, followed by one or more dot-separated pre-release version
-// identifiers.
-
-createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]
-}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`)
-
-createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]
-}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)
-
-// ## Build Metadata Identifier
-// Any combination of digits, letters, or hyphens.
-
-createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)
-
-// ## Build Metadata
-// Plus sign, followed by one or more period-separated build metadata
-// identifiers.
-
-createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER]
-}(?:\\.${src[t.BUILDIDENTIFIER]})*))`)
-
-// ## Full Version String
-// A main version, followed optionally by a pre-release version and
-// build metadata.
-
-// Note that the only major, minor, patch, and pre-release sections of
-// the version string are capturing groups.  The build metadata is not a
-// capturing group, because it should not ever be used in version
-// comparison.
-
-createToken('FULLPLAIN', `v?${src[t.MAINVERSION]
-}${src[t.PRERELEASE]}?${
-  src[t.BUILD]}?`)
-
-createToken('FULL', `^${src[t.FULLPLAIN]}$`)
-
-// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
-// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
-// common in the npm registry.
-createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE]
-}${src[t.PRERELEASELOOSE]}?${
-  src[t.BUILD]}?`)
-
-createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)
-
-createToken('GTLT', '((?:<|>)?=?)')
-
-// Something like "2.*" or "1.2.x".
-// Note that "x.x" is a valid xRange identifer, meaning "any version"
-// Only the first item is strictly required.
-createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`)
-createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`)
-
-createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` +
-                   `(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
-                   `(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
-                   `(?:${src[t.PRERELEASE]})?${
-                     src[t.BUILD]}?` +
-                   `)?)?`)
-
-createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +
-                        `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
-                        `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
-                        `(?:${src[t.PRERELEASELOOSE]})?${
-                          src[t.BUILD]}?` +
-                        `)?)?`)
-
-createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`)
-createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`)
-
-// Coercion.
-// Extract anything that could conceivably be a part of a valid semver
-createToken('COERCEPLAIN', `${'(^|[^\\d])' +
-              '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +
-              `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
-              `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)
-createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`)
-createToken('COERCEFULL', src[t.COERCEPLAIN] +
-              `(?:${src[t.PRERELEASE]})?` +
-              `(?:${src[t.BUILD]})?` +
-              `(?:$|[^\\d])`)
-createToken('COERCERTL', src[t.COERCE], true)
-createToken('COERCERTLFULL', src[t.COERCEFULL], true)
-
-// Tilde ranges.
-// Meaning is "reasonably at or greater than"
-createToken('LONETILDE', '(?:~>?)')
-
-createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true)
-exports.tildeTrimReplace = '$1~'
-
-createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)
-createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)
-
-// Caret ranges.
-// Meaning is "at least and backwards compatible with"
-createToken('LONECARET', '(?:\\^)')
-
-createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true)
-exports.caretTrimReplace = '$1^'
-
-createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)
-createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)
-
-// A simple gt/lt/eq thing, or just "" to indicate "any version"
-createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`)
-createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`)
-
-// An expression to strip any whitespace between the gtlt and the thing
-// it modifies, so that `> 1.2.3` ==> `>1.2.3`
-createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT]
-}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)
-exports.comparatorTrimReplace = '$1$2$3'
-
-// Something like `1.2.3 - 1.2.4`
-// Note that these all use the loose form, because they'll be
-// checked against either the strict or loose comparator form
-// later.
-createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` +
-                   `\\s+-\\s+` +
-                   `(${src[t.XRANGEPLAIN]})` +
-                   `\\s*$`)
-
-createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` +
-                        `\\s+-\\s+` +
-                        `(${src[t.XRANGEPLAINLOOSE]})` +
-                        `\\s*$`)
-
-// Star ranges basically just allow anything at all.
-createToken('STAR', '(<|>)?=?\\s*\\*')
-// >=0.0.0 is like a star
-createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$')
-createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$')
diff --git a/node_modules/semver/package.json b/node_modules/semver/package.json
deleted file mode 100644
index c2644547a2a67825ba61cd7323ef80149a996a9e..0000000000000000000000000000000000000000
--- a/node_modules/semver/package.json
+++ /dev/null
@@ -1,78 +0,0 @@
-{
-  "name": "semver",
-  "version": "7.7.1",
-  "description": "The semantic version parser used by npm.",
-  "main": "index.js",
-  "scripts": {
-    "test": "tap",
-    "snap": "tap",
-    "lint": "npm run eslint",
-    "postlint": "template-oss-check",
-    "lintfix": "npm run eslint -- --fix",
-    "posttest": "npm run lint",
-    "template-oss-apply": "template-oss-apply --force",
-    "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\""
-  },
-  "devDependencies": {
-    "@npmcli/eslint-config": "^5.0.0",
-    "@npmcli/template-oss": "4.23.4",
-    "benchmark": "^2.1.4",
-    "tap": "^16.0.0"
-  },
-  "license": "ISC",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/node-semver.git"
-  },
-  "bin": {
-    "semver": "bin/semver.js"
-  },
-  "files": [
-    "bin/",
-    "lib/",
-    "classes/",
-    "functions/",
-    "internal/",
-    "ranges/",
-    "index.js",
-    "preload.js",
-    "range.bnf"
-  ],
-  "tap": {
-    "timeout": 30,
-    "coverage-map": "map.js",
-    "nyc-arg": [
-      "--exclude",
-      "tap-snapshots/**"
-    ]
-  },
-  "engines": {
-    "node": ">=10"
-  },
-  "author": "GitHub Inc.",
-  "templateOSS": {
-    "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.",
-    "version": "4.23.4",
-    "engines": ">=10",
-    "distPaths": [
-      "classes/",
-      "functions/",
-      "internal/",
-      "ranges/",
-      "index.js",
-      "preload.js",
-      "range.bnf"
-    ],
-    "allowPaths": [
-      "/classes/",
-      "/functions/",
-      "/internal/",
-      "/ranges/",
-      "/index.js",
-      "/preload.js",
-      "/range.bnf",
-      "/benchmarks"
-    ],
-    "publish": "true"
-  }
-}
diff --git a/node_modules/semver/preload.js b/node_modules/semver/preload.js
deleted file mode 100644
index 947cd4f7917fff7fe04a850e96e37c29eddc4634..0000000000000000000000000000000000000000
--- a/node_modules/semver/preload.js
+++ /dev/null
@@ -1,2 +0,0 @@
-// XXX remove in v8 or beyond
-module.exports = require('./index.js')
diff --git a/node_modules/semver/range.bnf b/node_modules/semver/range.bnf
deleted file mode 100644
index d4c6ae0d76c9ac0c10c93062e5ff9cec277b07cd..0000000000000000000000000000000000000000
--- a/node_modules/semver/range.bnf
+++ /dev/null
@@ -1,16 +0,0 @@
-range-set  ::= range ( logical-or range ) *
-logical-or ::= ( ' ' ) * '||' ( ' ' ) *
-range      ::= hyphen | simple ( ' ' simple ) * | ''
-hyphen     ::= partial ' - ' partial
-simple     ::= primitive | partial | tilde | caret
-primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
-partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
-xr         ::= 'x' | 'X' | '*' | nr
-nr         ::= '0' | [1-9] ( [0-9] ) *
-tilde      ::= '~' partial
-caret      ::= '^' partial
-qualifier  ::= ( '-' pre )? ( '+' build )?
-pre        ::= parts
-build      ::= parts
-parts      ::= part ( '.' part ) *
-part       ::= nr | [-0-9A-Za-z]+
diff --git a/node_modules/semver/ranges/gtr.js b/node_modules/semver/ranges/gtr.js
deleted file mode 100644
index db7e35599dd56651565ca7b85d752bb8f5dfe4a6..0000000000000000000000000000000000000000
--- a/node_modules/semver/ranges/gtr.js
+++ /dev/null
@@ -1,4 +0,0 @@
-// Determine if version is greater than all the versions possible in the range.
-const outside = require('./outside')
-const gtr = (version, range, options) => outside(version, range, '>', options)
-module.exports = gtr
diff --git a/node_modules/semver/ranges/intersects.js b/node_modules/semver/ranges/intersects.js
deleted file mode 100644
index e0e9b7ce000e47a935c0eef9565a22525f539965..0000000000000000000000000000000000000000
--- a/node_modules/semver/ranges/intersects.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const Range = require('../classes/range')
-const intersects = (r1, r2, options) => {
-  r1 = new Range(r1, options)
-  r2 = new Range(r2, options)
-  return r1.intersects(r2, options)
-}
-module.exports = intersects
diff --git a/node_modules/semver/ranges/ltr.js b/node_modules/semver/ranges/ltr.js
deleted file mode 100644
index 528a885ebdfcdb951068aced65526fab71cfe7d6..0000000000000000000000000000000000000000
--- a/node_modules/semver/ranges/ltr.js
+++ /dev/null
@@ -1,4 +0,0 @@
-const outside = require('./outside')
-// Determine if version is less than all the versions possible in the range
-const ltr = (version, range, options) => outside(version, range, '<', options)
-module.exports = ltr
diff --git a/node_modules/semver/ranges/max-satisfying.js b/node_modules/semver/ranges/max-satisfying.js
deleted file mode 100644
index 6e3d993c67860c941fb68e66911d40e174e09ab3..0000000000000000000000000000000000000000
--- a/node_modules/semver/ranges/max-satisfying.js
+++ /dev/null
@@ -1,25 +0,0 @@
-const SemVer = require('../classes/semver')
-const Range = require('../classes/range')
-
-const maxSatisfying = (versions, range, options) => {
-  let max = null
-  let maxSV = null
-  let rangeObj = null
-  try {
-    rangeObj = new Range(range, options)
-  } catch (er) {
-    return null
-  }
-  versions.forEach((v) => {
-    if (rangeObj.test(v)) {
-      // satisfies(v, range, options)
-      if (!max || maxSV.compare(v) === -1) {
-        // compare(max, v, true)
-        max = v
-        maxSV = new SemVer(max, options)
-      }
-    }
-  })
-  return max
-}
-module.exports = maxSatisfying
diff --git a/node_modules/semver/ranges/min-satisfying.js b/node_modules/semver/ranges/min-satisfying.js
deleted file mode 100644
index 9b60974e2253a014563270788d390938ffa3e71d..0000000000000000000000000000000000000000
--- a/node_modules/semver/ranges/min-satisfying.js
+++ /dev/null
@@ -1,24 +0,0 @@
-const SemVer = require('../classes/semver')
-const Range = require('../classes/range')
-const minSatisfying = (versions, range, options) => {
-  let min = null
-  let minSV = null
-  let rangeObj = null
-  try {
-    rangeObj = new Range(range, options)
-  } catch (er) {
-    return null
-  }
-  versions.forEach((v) => {
-    if (rangeObj.test(v)) {
-      // satisfies(v, range, options)
-      if (!min || minSV.compare(v) === 1) {
-        // compare(min, v, true)
-        min = v
-        minSV = new SemVer(min, options)
-      }
-    }
-  })
-  return min
-}
-module.exports = minSatisfying
diff --git a/node_modules/semver/ranges/min-version.js b/node_modules/semver/ranges/min-version.js
deleted file mode 100644
index 350e1f78368ea22cc07ddfc65b94776945788f22..0000000000000000000000000000000000000000
--- a/node_modules/semver/ranges/min-version.js
+++ /dev/null
@@ -1,61 +0,0 @@
-const SemVer = require('../classes/semver')
-const Range = require('../classes/range')
-const gt = require('../functions/gt')
-
-const minVersion = (range, loose) => {
-  range = new Range(range, loose)
-
-  let minver = new SemVer('0.0.0')
-  if (range.test(minver)) {
-    return minver
-  }
-
-  minver = new SemVer('0.0.0-0')
-  if (range.test(minver)) {
-    return minver
-  }
-
-  minver = null
-  for (let i = 0; i < range.set.length; ++i) {
-    const comparators = range.set[i]
-
-    let setMin = null
-    comparators.forEach((comparator) => {
-      // Clone to avoid manipulating the comparator's semver object.
-      const compver = new SemVer(comparator.semver.version)
-      switch (comparator.operator) {
-        case '>':
-          if (compver.prerelease.length === 0) {
-            compver.patch++
-          } else {
-            compver.prerelease.push(0)
-          }
-          compver.raw = compver.format()
-          /* fallthrough */
-        case '':
-        case '>=':
-          if (!setMin || gt(compver, setMin)) {
-            setMin = compver
-          }
-          break
-        case '<':
-        case '<=':
-          /* Ignore maximum versions */
-          break
-        /* istanbul ignore next */
-        default:
-          throw new Error(`Unexpected operation: ${comparator.operator}`)
-      }
-    })
-    if (setMin && (!minver || gt(minver, setMin))) {
-      minver = setMin
-    }
-  }
-
-  if (minver && range.test(minver)) {
-    return minver
-  }
-
-  return null
-}
-module.exports = minVersion
diff --git a/node_modules/semver/ranges/outside.js b/node_modules/semver/ranges/outside.js
deleted file mode 100644
index ae99b10a5b9e6a8fbcee92ca73440e358e99f83f..0000000000000000000000000000000000000000
--- a/node_modules/semver/ranges/outside.js
+++ /dev/null
@@ -1,80 +0,0 @@
-const SemVer = require('../classes/semver')
-const Comparator = require('../classes/comparator')
-const { ANY } = Comparator
-const Range = require('../classes/range')
-const satisfies = require('../functions/satisfies')
-const gt = require('../functions/gt')
-const lt = require('../functions/lt')
-const lte = require('../functions/lte')
-const gte = require('../functions/gte')
-
-const outside = (version, range, hilo, options) => {
-  version = new SemVer(version, options)
-  range = new Range(range, options)
-
-  let gtfn, ltefn, ltfn, comp, ecomp
-  switch (hilo) {
-    case '>':
-      gtfn = gt
-      ltefn = lte
-      ltfn = lt
-      comp = '>'
-      ecomp = '>='
-      break
-    case '<':
-      gtfn = lt
-      ltefn = gte
-      ltfn = gt
-      comp = '<'
-      ecomp = '<='
-      break
-    default:
-      throw new TypeError('Must provide a hilo val of "<" or ">"')
-  }
-
-  // If it satisfies the range it is not outside
-  if (satisfies(version, range, options)) {
-    return false
-  }
-
-  // From now on, variable terms are as if we're in "gtr" mode.
-  // but note that everything is flipped for the "ltr" function.
-
-  for (let i = 0; i < range.set.length; ++i) {
-    const comparators = range.set[i]
-
-    let high = null
-    let low = null
-
-    comparators.forEach((comparator) => {
-      if (comparator.semver === ANY) {
-        comparator = new Comparator('>=0.0.0')
-      }
-      high = high || comparator
-      low = low || comparator
-      if (gtfn(comparator.semver, high.semver, options)) {
-        high = comparator
-      } else if (ltfn(comparator.semver, low.semver, options)) {
-        low = comparator
-      }
-    })
-
-    // If the edge version comparator has a operator then our version
-    // isn't outside it
-    if (high.operator === comp || high.operator === ecomp) {
-      return false
-    }
-
-    // If the lowest version comparator has an operator and our version
-    // is less than it then it isn't higher than the range
-    if ((!low.operator || low.operator === comp) &&
-        ltefn(version, low.semver)) {
-      return false
-    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
-      return false
-    }
-  }
-  return true
-}
-
-module.exports = outside
diff --git a/node_modules/semver/ranges/simplify.js b/node_modules/semver/ranges/simplify.js
deleted file mode 100644
index 618d5b62735518dd6ad586d38ae6eecff6fb3f14..0000000000000000000000000000000000000000
--- a/node_modules/semver/ranges/simplify.js
+++ /dev/null
@@ -1,47 +0,0 @@
-// given a set of versions and a range, create a "simplified" range
-// that includes the same versions that the original range does
-// If the original range is shorter than the simplified one, return that.
-const satisfies = require('../functions/satisfies.js')
-const compare = require('../functions/compare.js')
-module.exports = (versions, range, options) => {
-  const set = []
-  let first = null
-  let prev = null
-  const v = versions.sort((a, b) => compare(a, b, options))
-  for (const version of v) {
-    const included = satisfies(version, range, options)
-    if (included) {
-      prev = version
-      if (!first) {
-        first = version
-      }
-    } else {
-      if (prev) {
-        set.push([first, prev])
-      }
-      prev = null
-      first = null
-    }
-  }
-  if (first) {
-    set.push([first, null])
-  }
-
-  const ranges = []
-  for (const [min, max] of set) {
-    if (min === max) {
-      ranges.push(min)
-    } else if (!max && min === v[0]) {
-      ranges.push('*')
-    } else if (!max) {
-      ranges.push(`>=${min}`)
-    } else if (min === v[0]) {
-      ranges.push(`<=${max}`)
-    } else {
-      ranges.push(`${min} - ${max}`)
-    }
-  }
-  const simplified = ranges.join(' || ')
-  const original = typeof range.raw === 'string' ? range.raw : String(range)
-  return simplified.length < original.length ? simplified : range
-}
diff --git a/node_modules/semver/ranges/subset.js b/node_modules/semver/ranges/subset.js
deleted file mode 100644
index 1e5c26837c047d6e3e522fcf85e4ad15ce99bf30..0000000000000000000000000000000000000000
--- a/node_modules/semver/ranges/subset.js
+++ /dev/null
@@ -1,247 +0,0 @@
-const Range = require('../classes/range.js')
-const Comparator = require('../classes/comparator.js')
-const { ANY } = Comparator
-const satisfies = require('../functions/satisfies.js')
-const compare = require('../functions/compare.js')
-
-// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:
-// - Every simple range `r1, r2, ...` is a null set, OR
-// - Every simple range `r1, r2, ...` which is not a null set is a subset of
-//   some `R1, R2, ...`
-//
-// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:
-// - If c is only the ANY comparator
-//   - If C is only the ANY comparator, return true
-//   - Else if in prerelease mode, return false
-//   - else replace c with `[>=0.0.0]`
-// - If C is only the ANY comparator
-//   - if in prerelease mode, return true
-//   - else replace C with `[>=0.0.0]`
-// - Let EQ be the set of = comparators in c
-// - If EQ is more than one, return true (null set)
-// - Let GT be the highest > or >= comparator in c
-// - Let LT be the lowest < or <= comparator in c
-// - If GT and LT, and GT.semver > LT.semver, return true (null set)
-// - If any C is a = range, and GT or LT are set, return false
-// - If EQ
-//   - If GT, and EQ does not satisfy GT, return true (null set)
-//   - If LT, and EQ does not satisfy LT, return true (null set)
-//   - If EQ satisfies every C, return true
-//   - Else return false
-// - If GT
-//   - If GT.semver is lower than any > or >= comp in C, return false
-//   - If GT is >=, and GT.semver does not satisfy every C, return false
-//   - If GT.semver has a prerelease, and not in prerelease mode
-//     - If no C has a prerelease and the GT.semver tuple, return false
-// - If LT
-//   - If LT.semver is greater than any < or <= comp in C, return false
-//   - If LT is <=, and LT.semver does not satisfy every C, return false
-//   - If GT.semver has a prerelease, and not in prerelease mode
-//     - If no C has a prerelease and the LT.semver tuple, return false
-// - Else return true
-
-const subset = (sub, dom, options = {}) => {
-  if (sub === dom) {
-    return true
-  }
-
-  sub = new Range(sub, options)
-  dom = new Range(dom, options)
-  let sawNonNull = false
-
-  OUTER: for (const simpleSub of sub.set) {
-    for (const simpleDom of dom.set) {
-      const isSub = simpleSubset(simpleSub, simpleDom, options)
-      sawNonNull = sawNonNull || isSub !== null
-      if (isSub) {
-        continue OUTER
-      }
-    }
-    // the null set is a subset of everything, but null simple ranges in
-    // a complex range should be ignored.  so if we saw a non-null range,
-    // then we know this isn't a subset, but if EVERY simple range was null,
-    // then it is a subset.
-    if (sawNonNull) {
-      return false
-    }
-  }
-  return true
-}
-
-const minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]
-const minimumVersion = [new Comparator('>=0.0.0')]
-
-const simpleSubset = (sub, dom, options) => {
-  if (sub === dom) {
-    return true
-  }
-
-  if (sub.length === 1 && sub[0].semver === ANY) {
-    if (dom.length === 1 && dom[0].semver === ANY) {
-      return true
-    } else if (options.includePrerelease) {
-      sub = minimumVersionWithPreRelease
-    } else {
-      sub = minimumVersion
-    }
-  }
-
-  if (dom.length === 1 && dom[0].semver === ANY) {
-    if (options.includePrerelease) {
-      return true
-    } else {
-      dom = minimumVersion
-    }
-  }
-
-  const eqSet = new Set()
-  let gt, lt
-  for (const c of sub) {
-    if (c.operator === '>' || c.operator === '>=') {
-      gt = higherGT(gt, c, options)
-    } else if (c.operator === '<' || c.operator === '<=') {
-      lt = lowerLT(lt, c, options)
-    } else {
-      eqSet.add(c.semver)
-    }
-  }
-
-  if (eqSet.size > 1) {
-    return null
-  }
-
-  let gtltComp
-  if (gt && lt) {
-    gtltComp = compare(gt.semver, lt.semver, options)
-    if (gtltComp > 0) {
-      return null
-    } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {
-      return null
-    }
-  }
-
-  // will iterate one or zero times
-  for (const eq of eqSet) {
-    if (gt && !satisfies(eq, String(gt), options)) {
-      return null
-    }
-
-    if (lt && !satisfies(eq, String(lt), options)) {
-      return null
-    }
-
-    for (const c of dom) {
-      if (!satisfies(eq, String(c), options)) {
-        return false
-      }
-    }
-
-    return true
-  }
-
-  let higher, lower
-  let hasDomLT, hasDomGT
-  // if the subset has a prerelease, we need a comparator in the superset
-  // with the same tuple and a prerelease, or it's not a subset
-  let needDomLTPre = lt &&
-    !options.includePrerelease &&
-    lt.semver.prerelease.length ? lt.semver : false
-  let needDomGTPre = gt &&
-    !options.includePrerelease &&
-    gt.semver.prerelease.length ? gt.semver : false
-  // exception: <1.2.3-0 is the same as <1.2.3
-  if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&
-      lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {
-    needDomLTPre = false
-  }
-
-  for (const c of dom) {
-    hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='
-    hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='
-    if (gt) {
-      if (needDomGTPre) {
-        if (c.semver.prerelease && c.semver.prerelease.length &&
-            c.semver.major === needDomGTPre.major &&
-            c.semver.minor === needDomGTPre.minor &&
-            c.semver.patch === needDomGTPre.patch) {
-          needDomGTPre = false
-        }
-      }
-      if (c.operator === '>' || c.operator === '>=') {
-        higher = higherGT(gt, c, options)
-        if (higher === c && higher !== gt) {
-          return false
-        }
-      } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {
-        return false
-      }
-    }
-    if (lt) {
-      if (needDomLTPre) {
-        if (c.semver.prerelease && c.semver.prerelease.length &&
-            c.semver.major === needDomLTPre.major &&
-            c.semver.minor === needDomLTPre.minor &&
-            c.semver.patch === needDomLTPre.patch) {
-          needDomLTPre = false
-        }
-      }
-      if (c.operator === '<' || c.operator === '<=') {
-        lower = lowerLT(lt, c, options)
-        if (lower === c && lower !== lt) {
-          return false
-        }
-      } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {
-        return false
-      }
-    }
-    if (!c.operator && (lt || gt) && gtltComp !== 0) {
-      return false
-    }
-  }
-
-  // if there was a < or >, and nothing in the dom, then must be false
-  // UNLESS it was limited by another range in the other direction.
-  // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0
-  if (gt && hasDomLT && !lt && gtltComp !== 0) {
-    return false
-  }
-
-  if (lt && hasDomGT && !gt && gtltComp !== 0) {
-    return false
-  }
-
-  // we needed a prerelease range in a specific tuple, but didn't get one
-  // then this isn't a subset.  eg >=1.2.3-pre is not a subset of >=1.0.0,
-  // because it includes prereleases in the 1.2.3 tuple
-  if (needDomGTPre || needDomLTPre) {
-    return false
-  }
-
-  return true
-}
-
-// >=1.2.3 is lower than >1.2.3
-const higherGT = (a, b, options) => {
-  if (!a) {
-    return b
-  }
-  const comp = compare(a.semver, b.semver, options)
-  return comp > 0 ? a
-    : comp < 0 ? b
-    : b.operator === '>' && a.operator === '>=' ? b
-    : a
-}
-
-// <=1.2.3 is higher than <1.2.3
-const lowerLT = (a, b, options) => {
-  if (!a) {
-    return b
-  }
-  const comp = compare(a.semver, b.semver, options)
-  return comp < 0 ? a
-    : comp > 0 ? b
-    : b.operator === '<' && a.operator === '<=' ? b
-    : a
-}
-
-module.exports = subset
diff --git a/node_modules/semver/ranges/to-comparators.js b/node_modules/semver/ranges/to-comparators.js
deleted file mode 100644
index 6c8bc7e6f15a408e3707195add970bf707817dd9..0000000000000000000000000000000000000000
--- a/node_modules/semver/ranges/to-comparators.js
+++ /dev/null
@@ -1,8 +0,0 @@
-const Range = require('../classes/range')
-
-// Mostly just for testing and legacy API reasons
-const toComparators = (range, options) =>
-  new Range(range, options).set
-    .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))
-
-module.exports = toComparators
diff --git a/node_modules/semver/ranges/valid.js b/node_modules/semver/ranges/valid.js
deleted file mode 100644
index 365f35689d358b34637f1710b25002c9f7a6feb2..0000000000000000000000000000000000000000
--- a/node_modules/semver/ranges/valid.js
+++ /dev/null
@@ -1,11 +0,0 @@
-const Range = require('../classes/range')
-const validRange = (range, options) => {
-  try {
-    // Return '*' instead of '' so that truthiness works.
-    // This will throw if it's invalid anyway
-    return new Range(range, options).range || '*'
-  } catch (er) {
-    return null
-  }
-}
-module.exports = validRange
diff --git a/node_modules/send/HISTORY.md b/node_modules/send/HISTORY.md
deleted file mode 100644
index 0dd29d0f0f8b2d5f5b7d413d74e3ba5e81e6a4d1..0000000000000000000000000000000000000000
--- a/node_modules/send/HISTORY.md
+++ /dev/null
@@ -1,526 +0,0 @@
-0.19.0 / 2024-09-10
-===================
-
-* Remove link renderization in html while redirecting
-
-0.18.0 / 2022-03-23
-===================
-
-  * Fix emitted 416 error missing headers property
-  * Limit the headers removed for 304 response
-  * deps: depd@2.0.0
-    - Replace internal `eval` usage with `Function` constructor
-    - Use instance methods on `process` to check for listeners
-  * deps: destroy@1.2.0
-  * deps: http-errors@2.0.0
-    - deps: depd@2.0.0
-    - deps: statuses@2.0.1
-  * deps: on-finished@2.4.1
-  * deps: statuses@2.0.1
-
-0.17.2 / 2021-12-11
-===================
-
-  * pref: ignore empty http tokens
-  * deps: http-errors@1.8.1
-    - deps: inherits@2.0.4
-    - deps: toidentifier@1.0.1
-    - deps: setprototypeof@1.2.0
-  * deps: ms@2.1.3
-
-0.17.1 / 2019-05-10
-===================
-
-  * Set stricter CSP header in redirect & error responses
-  * deps: range-parser@~1.2.1
-
-0.17.0 / 2019-05-03
-===================
-
-  * deps: http-errors@~1.7.2
-    - Set constructor name when possible
-    - Use `toidentifier` module to make class names
-    - deps: depd@~1.1.2
-    - deps: setprototypeof@1.1.1
-    - deps: statuses@'>= 1.5.0 < 2'
-  * deps: mime@1.6.0
-    - Add extensions for JPEG-2000 images
-    - Add new `font/*` types from IANA
-    - Add WASM mapping
-    - Update `.bdoc` to `application/bdoc`
-    - Update `.bmp` to `image/bmp`
-    - Update `.m4a` to `audio/mp4`
-    - Update `.rtf` to `application/rtf`
-    - Update `.wav` to `audio/wav`
-    - Update `.xml` to `application/xml`
-    - Update generic extensions to `application/octet-stream`:
-      `.deb`, `.dll`, `.dmg`, `.exe`, `.iso`, `.msi`
-    - Use mime-score module to resolve extension conflicts
-  * deps: ms@2.1.1
-    - Add `week`/`w` support
-    - Fix negative number handling
-  * deps: statuses@~1.5.0
-  * perf: remove redundant `path.normalize` call
-
-0.16.2 / 2018-02-07
-===================
-
-  * Fix incorrect end tag in default error & redirects
-  * deps: depd@~1.1.2
-    - perf: remove argument reassignment
-  * deps: encodeurl@~1.0.2
-    - Fix encoding `%` as last character
-  * deps: statuses@~1.4.0
-
-0.16.1 / 2017-09-29
-===================
-
-  * Fix regression in edge-case behavior for empty `path`
-
-0.16.0 / 2017-09-27
-===================
-
-  * Add `immutable` option
-  * Fix missing `</html>` in default error & redirects
-  * Use instance methods on steam to check for listeners
-  * deps: mime@1.4.1
-    - Add 70 new types for file extensions
-    - Set charset as "UTF-8" for .js and .json
-  * perf: improve path validation speed
-
-0.15.6 / 2017-09-22
-===================
-
-  * deps: debug@2.6.9
-  * perf: improve `If-Match` token parsing
-
-0.15.5 / 2017-09-20
-===================
-
-  * deps: etag@~1.8.1
-    - perf: replace regular expression with substring
-  * deps: fresh@0.5.2
-    - Fix handling of modified headers with invalid dates
-    - perf: improve ETag match loop
-    - perf: improve `If-None-Match` token parsing
-
-0.15.4 / 2017-08-05
-===================
-
-  * deps: debug@2.6.8
-  * deps: depd@~1.1.1
-    - Remove unnecessary `Buffer` loading
-  * deps: http-errors@~1.6.2
-    - deps: depd@1.1.1
-
-0.15.3 / 2017-05-16
-===================
-
-  * deps: debug@2.6.7
-    - deps: ms@2.0.0
-  * deps: ms@2.0.0
-
-0.15.2 / 2017-04-26
-===================
-
-  * deps: debug@2.6.4
-    - Fix `DEBUG_MAX_ARRAY_LENGTH`
-    - deps: ms@0.7.3
-  * deps: ms@1.0.0
-
-0.15.1 / 2017-03-04
-===================
-
-  * Fix issue when `Date.parse` does not return `NaN` on invalid date
-  * Fix strict violation in broken environments
-
-0.15.0 / 2017-02-25
-===================
-
-  * Support `If-Match` and `If-Unmodified-Since` headers
-  * Add `res` and `path` arguments to `directory` event
-  * Remove usage of `res._headers` private field
-    - Improves compatibility with Node.js 8 nightly
-  * Send complete HTML document in redirect & error responses
-  * Set default CSP header in redirect & error responses
-  * Use `res.getHeaderNames()` when available
-  * Use `res.headersSent` when available
-  * deps: debug@2.6.1
-    - Allow colors in workers
-    - Deprecated `DEBUG_FD` environment variable set to `3` or higher
-    - Fix error when running under React Native
-    - Use same color for same namespace
-    - deps: ms@0.7.2
-  * deps: etag@~1.8.0
-  * deps: fresh@0.5.0
-    - Fix false detection of `no-cache` request directive
-    - Fix incorrect result when `If-None-Match` has both `*` and ETags
-    - Fix weak `ETag` matching to match spec
-    - perf: delay reading header values until needed
-    - perf: enable strict mode
-    - perf: hoist regular expressions
-    - perf: remove duplicate conditional
-    - perf: remove unnecessary boolean coercions
-    - perf: skip checking modified time if ETag check failed
-    - perf: skip parsing `If-None-Match` when no `ETag` header
-    - perf: use `Date.parse` instead of `new Date`
-  * deps: http-errors@~1.6.1
-    - Make `message` property enumerable for `HttpError`s
-    - deps: setprototypeof@1.0.3
-
-0.14.2 / 2017-01-23
-===================
-
-  * deps: http-errors@~1.5.1
-    - deps: inherits@2.0.3
-    - deps: setprototypeof@1.0.2
-    - deps: statuses@'>= 1.3.1 < 2'
-  * deps: ms@0.7.2
-  * deps: statuses@~1.3.1
-
-0.14.1 / 2016-06-09
-===================
-
-  * Fix redirect error when `path` contains raw non-URL characters
-  * Fix redirect when `path` starts with multiple forward slashes
-
-0.14.0 / 2016-06-06
-===================
-
-  * Add `acceptRanges` option
-  * Add `cacheControl` option
-  * Attempt to combine multiple ranges into single range
-  * Correctly inherit from `Stream` class
-  * Fix `Content-Range` header in 416 responses when using `start`/`end` options
-  * Fix `Content-Range` header missing from default 416 responses
-  * Ignore non-byte `Range` headers
-  * deps: http-errors@~1.5.0
-    - Add `HttpError` export, for `err instanceof createError.HttpError`
-    - Support new code `421 Misdirected Request`
-    - Use `setprototypeof` module to replace `__proto__` setting
-    - deps: inherits@2.0.1
-    - deps: statuses@'>= 1.3.0 < 2'
-    - perf: enable strict mode
-  * deps: range-parser@~1.2.0
-    - Fix incorrectly returning -1 when there is at least one valid range
-    - perf: remove internal function
-  * deps: statuses@~1.3.0
-    - Add `421 Misdirected Request`
-    - perf: enable strict mode
-  * perf: remove argument reassignment
-
-0.13.2 / 2016-03-05
-===================
-
-  * Fix invalid `Content-Type` header when `send.mime.default_type` unset
-
-0.13.1 / 2016-01-16
-===================
-
-  * deps: depd@~1.1.0
-    - Support web browser loading
-    - perf: enable strict mode
-  * deps: destroy@~1.0.4
-    - perf: enable strict mode
-  * deps: escape-html@~1.0.3
-    - perf: enable strict mode
-    - perf: optimize string replacement
-    - perf: use faster string coercion
-  * deps: range-parser@~1.0.3
-    - perf: enable strict mode
-
-0.13.0 / 2015-06-16
-===================
-
-  * Allow Node.js HTTP server to set `Date` response header
-  * Fix incorrectly removing `Content-Location` on 304 response
-  * Improve the default redirect response headers
-  * Send appropriate headers on default error response
-  * Use `http-errors` for standard emitted errors
-  * Use `statuses` instead of `http` module for status messages
-  * deps: escape-html@1.0.2
-  * deps: etag@~1.7.0
-    - Improve stat performance by removing hashing
-  * deps: fresh@0.3.0
-    - Add weak `ETag` matching support
-  * deps: on-finished@~2.3.0
-    - Add defined behavior for HTTP `CONNECT` requests
-    - Add defined behavior for HTTP `Upgrade` requests
-    - deps: ee-first@1.1.1
-  * perf: enable strict mode
-  * perf: remove unnecessary array allocations
-
-0.12.3 / 2015-05-13
-===================
-
-  * deps: debug@~2.2.0
-    - deps: ms@0.7.1
-  * deps: depd@~1.0.1
-  * deps: etag@~1.6.0
-   - Improve support for JXcore
-   - Support "fake" stats objects in environments without `fs`
-  * deps: ms@0.7.1
-    - Prevent extraordinarily long inputs
-  * deps: on-finished@~2.2.1
-
-0.12.2 / 2015-03-13
-===================
-
-  * Throw errors early for invalid `extensions` or `index` options
-  * deps: debug@~2.1.3
-    - Fix high intensity foreground color for bold
-    - deps: ms@0.7.0
-
-0.12.1 / 2015-02-17
-===================
-
-  * Fix regression sending zero-length files
-
-0.12.0 / 2015-02-16
-===================
-
-  * Always read the stat size from the file
-  * Fix mutating passed-in `options`
-  * deps: mime@1.3.4
-
-0.11.1 / 2015-01-20
-===================
-
-  * Fix `root` path disclosure
-
-0.11.0 / 2015-01-05
-===================
-
-  * deps: debug@~2.1.1
-  * deps: etag@~1.5.1
-    - deps: crc@3.2.1
-  * deps: ms@0.7.0
-    - Add `milliseconds`
-    - Add `msecs`
-    - Add `secs`
-    - Add `mins`
-    - Add `hrs`
-    - Add `yrs`
-  * deps: on-finished@~2.2.0
-
-0.10.1 / 2014-10-22
-===================
-
-  * deps: on-finished@~2.1.1
-    - Fix handling of pipelined requests
-
-0.10.0 / 2014-10-15
-===================
-
-  * deps: debug@~2.1.0
-    - Implement `DEBUG_FD` env variable support
-  * deps: depd@~1.0.0
-  * deps: etag@~1.5.0
-    - Improve string performance
-    - Slightly improve speed for weak ETags over 1KB
-
-0.9.3 / 2014-09-24
-==================
-
-  * deps: etag@~1.4.0
-    - Support "fake" stats objects
-
-0.9.2 / 2014-09-15
-==================
-
-  * deps: depd@0.4.5
-  * deps: etag@~1.3.1
-  * deps: range-parser@~1.0.2
-
-0.9.1 / 2014-09-07
-==================
-
-  * deps: fresh@0.2.4
-
-0.9.0 / 2014-09-07
-==================
-
-  * Add `lastModified` option
-  * Use `etag` to generate `ETag` header
-  * deps: debug@~2.0.0
-
-0.8.5 / 2014-09-04
-==================
-
-  * Fix malicious path detection for empty string path
-
-0.8.4 / 2014-09-04
-==================
-
-  * Fix a path traversal issue when using `root`
-
-0.8.3 / 2014-08-16
-==================
-
-  * deps: destroy@1.0.3
-    - renamed from dethroy
-  * deps: on-finished@2.1.0
-
-0.8.2 / 2014-08-14
-==================
-
-  * Work around `fd` leak in Node.js 0.10 for `fs.ReadStream`
-  * deps: dethroy@1.0.2
-
-0.8.1 / 2014-08-05
-==================
-
-  * Fix `extensions` behavior when file already has extension
-
-0.8.0 / 2014-08-05
-==================
-
-  * Add `extensions` option
-
-0.7.4 / 2014-08-04
-==================
-
-  * Fix serving index files without root dir
-
-0.7.3 / 2014-07-29
-==================
-
-  * Fix incorrect 403 on Windows and Node.js 0.11
-
-0.7.2 / 2014-07-27
-==================
-
-  * deps: depd@0.4.4
-    - Work-around v8 generating empty stack traces
-
-0.7.1 / 2014-07-26
-==================
-
- * deps: depd@0.4.3
-   - Fix exception when global `Error.stackTraceLimit` is too low
-
-0.7.0 / 2014-07-20
-==================
-
- * Deprecate `hidden` option; use `dotfiles` option
- * Add `dotfiles` option
- * deps: debug@1.0.4
- * deps: depd@0.4.2
-   - Add `TRACE_DEPRECATION` environment variable
-   - Remove non-standard grey color from color output
-   - Support `--no-deprecation` argument
-   - Support `--trace-deprecation` argument
-
-0.6.0 / 2014-07-11
-==================
-
- * Deprecate `from` option; use `root` option
- * Deprecate `send.etag()` -- use `etag` in `options`
- * Deprecate `send.hidden()` -- use `hidden` in `options`
- * Deprecate `send.index()` -- use `index` in `options`
- * Deprecate `send.maxage()` -- use `maxAge` in `options`
- * Deprecate `send.root()` -- use `root` in `options`
- * Cap `maxAge` value to 1 year
- * deps: debug@1.0.3
-   - Add support for multiple wildcards in namespaces
-
-0.5.0 / 2014-06-28
-==================
-
- * Accept string for `maxAge` (converted by `ms`)
- * Add `headers` event
- * Include link in default redirect response
- * Use `EventEmitter.listenerCount` to count listeners
-
-0.4.3 / 2014-06-11
-==================
-
- * Do not throw un-catchable error on file open race condition
- * Use `escape-html` for HTML escaping
- * deps: debug@1.0.2
-   - fix some debugging output colors on node.js 0.8
- * deps: finished@1.2.2
- * deps: fresh@0.2.2
-
-0.4.2 / 2014-06-09
-==================
-
- * fix "event emitter leak" warnings
- * deps: debug@1.0.1
- * deps: finished@1.2.1
-
-0.4.1 / 2014-06-02
-==================
-
- * Send `max-age` in `Cache-Control` in correct format
-
-0.4.0 / 2014-05-27
-==================
-
- * Calculate ETag with md5 for reduced collisions
- * Fix wrong behavior when index file matches directory
- * Ignore stream errors after request ends
-   - Goodbye `EBADF, read`
- * Skip directories in index file search
- * deps: debug@0.8.1
-
-0.3.0 / 2014-04-24
-==================
-
- * Fix sending files with dots without root set
- * Coerce option types
- * Accept API options in options object
- * Set etags to "weak"
- * Include file path in etag
- * Make "Can't set headers after they are sent." catchable
- * Send full entity-body for multi range requests
- * Default directory access to 403 when index disabled
- * Support multiple index paths
- * Support "If-Range" header
- * Control whether to generate etags
- * deps: mime@1.2.11
-
-0.2.0 / 2014-01-29
-==================
-
- * update range-parser and fresh
-
-0.1.4 / 2013-08-11 
-==================
-
- * update fresh
-
-0.1.3 / 2013-07-08 
-==================
-
- * Revert "Fix fd leak"
-
-0.1.2 / 2013-07-03 
-==================
-
- * Fix fd leak
-
-0.1.0 / 2012-08-25 
-==================
-
-  * add options parameter to send() that is passed to fs.createReadStream() [kanongil]
-
-0.0.4 / 2012-08-16 
-==================
-
-  * allow custom "Accept-Ranges" definition
-
-0.0.3 / 2012-07-16 
-==================
-
-  * fix normalization of the root directory. Closes #3
-
-0.0.2 / 2012-07-09 
-==================
-
-  * add passing of req explicitly for now (YUCK)
-
-0.0.1 / 2010-01-03
-==================
-
-  * Initial release
diff --git a/node_modules/send/LICENSE b/node_modules/send/LICENSE
deleted file mode 100644
index b6ea1c1fd44ff6f4af6a8e4e5d4793004b9e8524..0000000000000000000000000000000000000000
--- a/node_modules/send/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2012 TJ Holowaychuk
-Copyright (c) 2014-2022 Douglas Christopher Wilson
-
-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/send/README.md b/node_modules/send/README.md
deleted file mode 100644
index fadf8383c056f23dc8634cec647e2244bd94fce7..0000000000000000000000000000000000000000
--- a/node_modules/send/README.md
+++ /dev/null
@@ -1,327 +0,0 @@
-# send
-
-[![NPM Version][npm-version-image]][npm-url]
-[![NPM Downloads][npm-downloads-image]][npm-url]
-[![Linux Build][github-actions-ci-image]][github-actions-ci-url]
-[![Windows Build][appveyor-image]][appveyor-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-Send is a library for streaming files from the file system as a http response
-supporting partial responses (Ranges), conditional-GET negotiation (If-Match,
-If-Unmodified-Since, If-None-Match, If-Modified-Since), high test coverage,
-and granular events which may be leveraged to take appropriate actions in your
-application or framework.
-
-Looking to serve up entire folders mapped to URLs? Try [serve-static](https://www.npmjs.org/package/serve-static).
-
-## Installation
-
-This is a [Node.js](https://nodejs.org/en/) module available through the
-[npm registry](https://www.npmjs.com/). Installation is done using the
-[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
-
-```bash
-$ npm install send
-```
-
-## API
-
-```js
-var send = require('send')
-```
-
-### send(req, path, [options])
-
-Create a new `SendStream` for the given path to send to a `res`. The `req` is
-the Node.js HTTP request and the `path` is a urlencoded path to send (urlencoded,
-not the actual file-system path).
-
-#### Options
-
-##### acceptRanges
-
-Enable or disable accepting ranged requests, defaults to true.
-Disabling this will not send `Accept-Ranges` and ignore the contents
-of the `Range` request header.
-
-##### cacheControl
-
-Enable or disable setting `Cache-Control` response header, defaults to
-true. Disabling this will ignore the `immutable` and `maxAge` options.
-
-##### dotfiles
-
-Set how "dotfiles" are treated when encountered. A dotfile is a file
-or directory that begins with a dot ("."). Note this check is done on
-the path itself without checking if the path actually exists on the
-disk. If `root` is specified, only the dotfiles above the root are
-checked (i.e. the root itself can be within a dotfile when when set
-to "deny").
-
-  - `'allow'` No special treatment for dotfiles.
-  - `'deny'` Send a 403 for any request for a dotfile.
-  - `'ignore'` Pretend like the dotfile does not exist and 404.
-
-The default value is _similar_ to `'ignore'`, with the exception that
-this default will not ignore the files within a directory that begins
-with a dot, for backward-compatibility.
-
-##### end
-
-Byte offset at which the stream ends, defaults to the length of the file
-minus 1. The end is inclusive in the stream, meaning `end: 3` will include
-the 4th byte in the stream.
-
-##### etag
-
-Enable or disable etag generation, defaults to true.
-
-##### extensions
-
-If a given file doesn't exist, try appending one of the given extensions,
-in the given order. By default, this is disabled (set to `false`). An
-example value that will serve extension-less HTML files: `['html', 'htm']`.
-This is skipped if the requested file already has an extension.
-
-##### immutable
-
-Enable or disable the `immutable` directive in the `Cache-Control` response
-header, defaults to `false`. If set to `true`, the `maxAge` option should
-also be specified to enable caching. The `immutable` directive will prevent
-supported clients from making conditional requests during the life of the
-`maxAge` option to check if the file has changed.
-
-##### index
-
-By default send supports "index.html" files, to disable this
-set `false` or to supply a new index pass a string or an array
-in preferred order.
-
-##### lastModified
-
-Enable or disable `Last-Modified` header, defaults to true. Uses the file
-system's last modified value.
-
-##### maxAge
-
-Provide a max-age in milliseconds for http caching, defaults to 0.
-This can also be a string accepted by the
-[ms](https://www.npmjs.org/package/ms#readme) module.
-
-##### root
-
-Serve files relative to `path`.
-
-##### start
-
-Byte offset at which the stream starts, defaults to 0. The start is inclusive,
-meaning `start: 2` will include the 3rd byte in the stream.
-
-#### Events
-
-The `SendStream` is an event emitter and will emit the following events:
-
-  - `error` an error occurred `(err)`
-  - `directory` a directory was requested `(res, path)`
-  - `file` a file was requested `(path, stat)`
-  - `headers` the headers are about to be set on a file `(res, path, stat)`
-  - `stream` file streaming has started `(stream)`
-  - `end` streaming has completed
-
-#### .pipe
-
-The `pipe` method is used to pipe the response into the Node.js HTTP response
-object, typically `send(req, path, options).pipe(res)`.
-
-### .mime
-
-The `mime` export is the global instance of of the
-[`mime` npm module](https://www.npmjs.com/package/mime).
-
-This is used to configure the MIME types that are associated with file extensions
-as well as other options for how to resolve the MIME type of a file (like the
-default type to use for an unknown file extension).
-
-## Error-handling
-
-By default when no `error` listeners are present an automatic response will be
-made, otherwise you have full control over the response, aka you may show a 5xx
-page etc.
-
-## Caching
-
-It does _not_ perform internal caching, you should use a reverse proxy cache
-such as Varnish for this, or those fancy things called CDNs. If your
-application is small enough that it would benefit from single-node memory
-caching, it's small enough that it does not need caching at all ;).
-
-## Debugging
-
-To enable `debug()` instrumentation output export __DEBUG__:
-
-```
-$ DEBUG=send node app
-```
-
-## Running tests
-
-```
-$ npm install
-$ npm test
-```
-
-## Examples
-
-### Serve a specific file
-
-This simple example will send a specific file to all requests.
-
-```js
-var http = require('http')
-var send = require('send')
-
-var server = http.createServer(function onRequest (req, res) {
-  send(req, '/path/to/index.html')
-    .pipe(res)
-})
-
-server.listen(3000)
-```
-
-### Serve all files from a directory
-
-This simple example will just serve up all the files in a
-given directory as the top-level. For example, a request
-`GET /foo.txt` will send back `/www/public/foo.txt`.
-
-```js
-var http = require('http')
-var parseUrl = require('parseurl')
-var send = require('send')
-
-var server = http.createServer(function onRequest (req, res) {
-  send(req, parseUrl(req).pathname, { root: '/www/public' })
-    .pipe(res)
-})
-
-server.listen(3000)
-```
-
-### Custom file types
-
-```js
-var http = require('http')
-var parseUrl = require('parseurl')
-var send = require('send')
-
-// Default unknown types to text/plain
-send.mime.default_type = 'text/plain'
-
-// Add a custom type
-send.mime.define({
-  'application/x-my-type': ['x-mt', 'x-mtt']
-})
-
-var server = http.createServer(function onRequest (req, res) {
-  send(req, parseUrl(req).pathname, { root: '/www/public' })
-    .pipe(res)
-})
-
-server.listen(3000)
-```
-
-### Custom directory index view
-
-This is a example of serving up a structure of directories with a
-custom function to render a listing of a directory.
-
-```js
-var http = require('http')
-var fs = require('fs')
-var parseUrl = require('parseurl')
-var send = require('send')
-
-// Transfer arbitrary files from within /www/example.com/public/*
-// with a custom handler for directory listing
-var server = http.createServer(function onRequest (req, res) {
-  send(req, parseUrl(req).pathname, { index: false, root: '/www/public' })
-    .once('directory', directory)
-    .pipe(res)
-})
-
-server.listen(3000)
-
-// Custom directory handler
-function directory (res, path) {
-  var stream = this
-
-  // redirect to trailing slash for consistent url
-  if (!stream.hasTrailingSlash()) {
-    return stream.redirect(path)
-  }
-
-  // get directory list
-  fs.readdir(path, function onReaddir (err, list) {
-    if (err) return stream.error(err)
-
-    // render an index for the directory
-    res.setHeader('Content-Type', 'text/plain; charset=UTF-8')
-    res.end(list.join('\n') + '\n')
-  })
-}
-```
-
-### Serving from a root directory with custom error-handling
-
-```js
-var http = require('http')
-var parseUrl = require('parseurl')
-var send = require('send')
-
-var server = http.createServer(function onRequest (req, res) {
-  // your custom error-handling logic:
-  function error (err) {
-    res.statusCode = err.status || 500
-    res.end(err.message)
-  }
-
-  // your custom headers
-  function headers (res, path, stat) {
-    // serve all files for download
-    res.setHeader('Content-Disposition', 'attachment')
-  }
-
-  // your custom directory handling logic:
-  function redirect () {
-    res.statusCode = 301
-    res.setHeader('Location', req.url + '/')
-    res.end('Redirecting to ' + req.url + '/')
-  }
-
-  // transfer arbitrary files from within
-  // /www/example.com/public/*
-  send(req, parseUrl(req).pathname, { root: '/www/public' })
-    .on('error', error)
-    .on('directory', redirect)
-    .on('headers', headers)
-    .pipe(res)
-})
-
-server.listen(3000)
-```
-
-## License
-
-[MIT](LICENSE)
-
-[appveyor-image]: https://badgen.net/appveyor/ci/dougwilson/send/master?label=windows
-[appveyor-url]: https://ci.appveyor.com/project/dougwilson/send
-[coveralls-image]: https://badgen.net/coveralls/c/github/pillarjs/send/master
-[coveralls-url]: https://coveralls.io/r/pillarjs/send?branch=master
-[github-actions-ci-image]: https://badgen.net/github/checks/pillarjs/send/master?label=linux
-[github-actions-ci-url]: https://github.com/pillarjs/send/actions/workflows/ci.yml
-[node-image]: https://badgen.net/npm/node/send
-[node-url]: https://nodejs.org/en/download/
-[npm-downloads-image]: https://badgen.net/npm/dm/send
-[npm-url]: https://npmjs.org/package/send
-[npm-version-image]: https://badgen.net/npm/v/send
diff --git a/node_modules/send/SECURITY.md b/node_modules/send/SECURITY.md
deleted file mode 100644
index 46b48f7b0733cdfa849734a92b51bfc213a2ee49..0000000000000000000000000000000000000000
--- a/node_modules/send/SECURITY.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# Security Policies and Procedures
-
-## Reporting a Bug
-
-The `send` team and community take all security bugs seriously. Thank you
-for improving the security of Express. We appreciate your efforts and
-responsible disclosure and will make every effort to acknowledge your
-contributions.
-
-Report security bugs by emailing the current owner(s) of `send`. This information
-can be found in the npm registry using the command `npm owner ls send`.
-If unsure or unable to get the information from the above, open an issue
-in the [project issue tracker](https://github.com/pillarjs/send/issues)
-asking for the current contact information.
-
-To ensure the timely response to your report, please ensure that the entirety
-of the report is contained within the email body and not solely behind a web
-link or an attachment.
-
-At least one owner will acknowledge your email within 48 hours, and will send a
-more detailed response within 48 hours indicating the next steps in handling
-your report. After the initial reply to your report, the owners will
-endeavor to keep you informed of the progress towards a fix and full
-announcement, and may ask for additional information or guidance.
diff --git a/node_modules/send/index.js b/node_modules/send/index.js
deleted file mode 100644
index 768f8ca60ccb772ef00c6a910753793ad73440c1..0000000000000000000000000000000000000000
--- a/node_modules/send/index.js
+++ /dev/null
@@ -1,1142 +0,0 @@
-/*!
- * send
- * Copyright(c) 2012 TJ Holowaychuk
- * Copyright(c) 2014-2022 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module dependencies.
- * @private
- */
-
-var createError = require('http-errors')
-var debug = require('debug')('send')
-var deprecate = require('depd')('send')
-var destroy = require('destroy')
-var encodeUrl = require('encodeurl')
-var escapeHtml = require('escape-html')
-var etag = require('etag')
-var fresh = require('fresh')
-var fs = require('fs')
-var mime = require('mime')
-var ms = require('ms')
-var onFinished = require('on-finished')
-var parseRange = require('range-parser')
-var path = require('path')
-var statuses = require('statuses')
-var Stream = require('stream')
-var util = require('util')
-
-/**
- * Path function references.
- * @private
- */
-
-var extname = path.extname
-var join = path.join
-var normalize = path.normalize
-var resolve = path.resolve
-var sep = path.sep
-
-/**
- * Regular expression for identifying a bytes Range header.
- * @private
- */
-
-var BYTES_RANGE_REGEXP = /^ *bytes=/
-
-/**
- * Maximum value allowed for the max age.
- * @private
- */
-
-var MAX_MAXAGE = 60 * 60 * 24 * 365 * 1000 // 1 year
-
-/**
- * Regular expression to match a path with a directory up component.
- * @private
- */
-
-var UP_PATH_REGEXP = /(?:^|[\\/])\.\.(?:[\\/]|$)/
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = send
-module.exports.mime = mime
-
-/**
- * Return a `SendStream` for `req` and `path`.
- *
- * @param {object} req
- * @param {string} path
- * @param {object} [options]
- * @return {SendStream}
- * @public
- */
-
-function send (req, path, options) {
-  return new SendStream(req, path, options)
-}
-
-/**
- * Initialize a `SendStream` with the given `path`.
- *
- * @param {Request} req
- * @param {String} path
- * @param {object} [options]
- * @private
- */
-
-function SendStream (req, path, options) {
-  Stream.call(this)
-
-  var opts = options || {}
-
-  this.options = opts
-  this.path = path
-  this.req = req
-
-  this._acceptRanges = opts.acceptRanges !== undefined
-    ? Boolean(opts.acceptRanges)
-    : true
-
-  this._cacheControl = opts.cacheControl !== undefined
-    ? Boolean(opts.cacheControl)
-    : true
-
-  this._etag = opts.etag !== undefined
-    ? Boolean(opts.etag)
-    : true
-
-  this._dotfiles = opts.dotfiles !== undefined
-    ? opts.dotfiles
-    : 'ignore'
-
-  if (this._dotfiles !== 'ignore' && this._dotfiles !== 'allow' && this._dotfiles !== 'deny') {
-    throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"')
-  }
-
-  this._hidden = Boolean(opts.hidden)
-
-  if (opts.hidden !== undefined) {
-    deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead')
-  }
-
-  // legacy support
-  if (opts.dotfiles === undefined) {
-    this._dotfiles = undefined
-  }
-
-  this._extensions = opts.extensions !== undefined
-    ? normalizeList(opts.extensions, 'extensions option')
-    : []
-
-  this._immutable = opts.immutable !== undefined
-    ? Boolean(opts.immutable)
-    : false
-
-  this._index = opts.index !== undefined
-    ? normalizeList(opts.index, 'index option')
-    : ['index.html']
-
-  this._lastModified = opts.lastModified !== undefined
-    ? Boolean(opts.lastModified)
-    : true
-
-  this._maxage = opts.maxAge || opts.maxage
-  this._maxage = typeof this._maxage === 'string'
-    ? ms(this._maxage)
-    : Number(this._maxage)
-  this._maxage = !isNaN(this._maxage)
-    ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE)
-    : 0
-
-  this._root = opts.root
-    ? resolve(opts.root)
-    : null
-
-  if (!this._root && opts.from) {
-    this.from(opts.from)
-  }
-}
-
-/**
- * Inherits from `Stream`.
- */
-
-util.inherits(SendStream, Stream)
-
-/**
- * Enable or disable etag generation.
- *
- * @param {Boolean} val
- * @return {SendStream}
- * @api public
- */
-
-SendStream.prototype.etag = deprecate.function(function etag (val) {
-  this._etag = Boolean(val)
-  debug('etag %s', this._etag)
-  return this
-}, 'send.etag: pass etag as option')
-
-/**
- * Enable or disable "hidden" (dot) files.
- *
- * @param {Boolean} path
- * @return {SendStream}
- * @api public
- */
-
-SendStream.prototype.hidden = deprecate.function(function hidden (val) {
-  this._hidden = Boolean(val)
-  this._dotfiles = undefined
-  debug('hidden %s', this._hidden)
-  return this
-}, 'send.hidden: use dotfiles option')
-
-/**
- * Set index `paths`, set to a falsy
- * value to disable index support.
- *
- * @param {String|Boolean|Array} paths
- * @return {SendStream}
- * @api public
- */
-
-SendStream.prototype.index = deprecate.function(function index (paths) {
-  var index = !paths ? [] : normalizeList(paths, 'paths argument')
-  debug('index %o', paths)
-  this._index = index
-  return this
-}, 'send.index: pass index as option')
-
-/**
- * Set root `path`.
- *
- * @param {String} path
- * @return {SendStream}
- * @api public
- */
-
-SendStream.prototype.root = function root (path) {
-  this._root = resolve(String(path))
-  debug('root %s', this._root)
-  return this
-}
-
-SendStream.prototype.from = deprecate.function(SendStream.prototype.root,
-  'send.from: pass root as option')
-
-SendStream.prototype.root = deprecate.function(SendStream.prototype.root,
-  'send.root: pass root as option')
-
-/**
- * Set max-age to `maxAge`.
- *
- * @param {Number} maxAge
- * @return {SendStream}
- * @api public
- */
-
-SendStream.prototype.maxage = deprecate.function(function maxage (maxAge) {
-  this._maxage = typeof maxAge === 'string'
-    ? ms(maxAge)
-    : Number(maxAge)
-  this._maxage = !isNaN(this._maxage)
-    ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE)
-    : 0
-  debug('max-age %d', this._maxage)
-  return this
-}, 'send.maxage: pass maxAge as option')
-
-/**
- * Emit error with `status`.
- *
- * @param {number} status
- * @param {Error} [err]
- * @private
- */
-
-SendStream.prototype.error = function error (status, err) {
-  // emit if listeners instead of responding
-  if (hasListeners(this, 'error')) {
-    return this.emit('error', createHttpError(status, err))
-  }
-
-  var res = this.res
-  var msg = statuses.message[status] || String(status)
-  var doc = createHtmlDocument('Error', escapeHtml(msg))
-
-  // clear existing headers
-  clearHeaders(res)
-
-  // add error headers
-  if (err && err.headers) {
-    setHeaders(res, err.headers)
-  }
-
-  // send basic response
-  res.statusCode = status
-  res.setHeader('Content-Type', 'text/html; charset=UTF-8')
-  res.setHeader('Content-Length', Buffer.byteLength(doc))
-  res.setHeader('Content-Security-Policy', "default-src 'none'")
-  res.setHeader('X-Content-Type-Options', 'nosniff')
-  res.end(doc)
-}
-
-/**
- * Check if the pathname ends with "/".
- *
- * @return {boolean}
- * @private
- */
-
-SendStream.prototype.hasTrailingSlash = function hasTrailingSlash () {
-  return this.path[this.path.length - 1] === '/'
-}
-
-/**
- * Check if this is a conditional GET request.
- *
- * @return {Boolean}
- * @api private
- */
-
-SendStream.prototype.isConditionalGET = function isConditionalGET () {
-  return this.req.headers['if-match'] ||
-    this.req.headers['if-unmodified-since'] ||
-    this.req.headers['if-none-match'] ||
-    this.req.headers['if-modified-since']
-}
-
-/**
- * Check if the request preconditions failed.
- *
- * @return {boolean}
- * @private
- */
-
-SendStream.prototype.isPreconditionFailure = function isPreconditionFailure () {
-  var req = this.req
-  var res = this.res
-
-  // if-match
-  var match = req.headers['if-match']
-  if (match) {
-    var etag = res.getHeader('ETag')
-    return !etag || (match !== '*' && parseTokenList(match).every(function (match) {
-      return match !== etag && match !== 'W/' + etag && 'W/' + match !== etag
-    }))
-  }
-
-  // if-unmodified-since
-  var unmodifiedSince = parseHttpDate(req.headers['if-unmodified-since'])
-  if (!isNaN(unmodifiedSince)) {
-    var lastModified = parseHttpDate(res.getHeader('Last-Modified'))
-    return isNaN(lastModified) || lastModified > unmodifiedSince
-  }
-
-  return false
-}
-
-/**
- * Strip various content header fields for a change in entity.
- *
- * @private
- */
-
-SendStream.prototype.removeContentHeaderFields = function removeContentHeaderFields () {
-  var res = this.res
-
-  res.removeHeader('Content-Encoding')
-  res.removeHeader('Content-Language')
-  res.removeHeader('Content-Length')
-  res.removeHeader('Content-Range')
-  res.removeHeader('Content-Type')
-}
-
-/**
- * Respond with 304 not modified.
- *
- * @api private
- */
-
-SendStream.prototype.notModified = function notModified () {
-  var res = this.res
-  debug('not modified')
-  this.removeContentHeaderFields()
-  res.statusCode = 304
-  res.end()
-}
-
-/**
- * Raise error that headers already sent.
- *
- * @api private
- */
-
-SendStream.prototype.headersAlreadySent = function headersAlreadySent () {
-  var err = new Error('Can\'t set headers after they are sent.')
-  debug('headers already sent')
-  this.error(500, err)
-}
-
-/**
- * Check if the request is cacheable, aka
- * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}).
- *
- * @return {Boolean}
- * @api private
- */
-
-SendStream.prototype.isCachable = function isCachable () {
-  var statusCode = this.res.statusCode
-  return (statusCode >= 200 && statusCode < 300) ||
-    statusCode === 304
-}
-
-/**
- * Handle stat() error.
- *
- * @param {Error} error
- * @private
- */
-
-SendStream.prototype.onStatError = function onStatError (error) {
-  switch (error.code) {
-    case 'ENAMETOOLONG':
-    case 'ENOENT':
-    case 'ENOTDIR':
-      this.error(404, error)
-      break
-    default:
-      this.error(500, error)
-      break
-  }
-}
-
-/**
- * Check if the cache is fresh.
- *
- * @return {Boolean}
- * @api private
- */
-
-SendStream.prototype.isFresh = function isFresh () {
-  return fresh(this.req.headers, {
-    etag: this.res.getHeader('ETag'),
-    'last-modified': this.res.getHeader('Last-Modified')
-  })
-}
-
-/**
- * Check if the range is fresh.
- *
- * @return {Boolean}
- * @api private
- */
-
-SendStream.prototype.isRangeFresh = function isRangeFresh () {
-  var ifRange = this.req.headers['if-range']
-
-  if (!ifRange) {
-    return true
-  }
-
-  // if-range as etag
-  if (ifRange.indexOf('"') !== -1) {
-    var etag = this.res.getHeader('ETag')
-    return Boolean(etag && ifRange.indexOf(etag) !== -1)
-  }
-
-  // if-range as modified date
-  var lastModified = this.res.getHeader('Last-Modified')
-  return parseHttpDate(lastModified) <= parseHttpDate(ifRange)
-}
-
-/**
- * Redirect to path.
- *
- * @param {string} path
- * @private
- */
-
-SendStream.prototype.redirect = function redirect (path) {
-  var res = this.res
-
-  if (hasListeners(this, 'directory')) {
-    this.emit('directory', res, path)
-    return
-  }
-
-  if (this.hasTrailingSlash()) {
-    this.error(403)
-    return
-  }
-
-  var loc = encodeUrl(collapseLeadingSlashes(this.path + '/'))
-  var doc = createHtmlDocument('Redirecting', 'Redirecting to ' + escapeHtml(loc))
-
-  // redirect
-  res.statusCode = 301
-  res.setHeader('Content-Type', 'text/html; charset=UTF-8')
-  res.setHeader('Content-Length', Buffer.byteLength(doc))
-  res.setHeader('Content-Security-Policy', "default-src 'none'")
-  res.setHeader('X-Content-Type-Options', 'nosniff')
-  res.setHeader('Location', loc)
-  res.end(doc)
-}
-
-/**
- * Pipe to `res.
- *
- * @param {Stream} res
- * @return {Stream} res
- * @api public
- */
-
-SendStream.prototype.pipe = function pipe (res) {
-  // root path
-  var root = this._root
-
-  // references
-  this.res = res
-
-  // decode the path
-  var path = decode(this.path)
-  if (path === -1) {
-    this.error(400)
-    return res
-  }
-
-  // null byte(s)
-  if (~path.indexOf('\0')) {
-    this.error(400)
-    return res
-  }
-
-  var parts
-  if (root !== null) {
-    // normalize
-    if (path) {
-      path = normalize('.' + sep + path)
-    }
-
-    // malicious path
-    if (UP_PATH_REGEXP.test(path)) {
-      debug('malicious path "%s"', path)
-      this.error(403)
-      return res
-    }
-
-    // explode path parts
-    parts = path.split(sep)
-
-    // join / normalize from optional root dir
-    path = normalize(join(root, path))
-  } else {
-    // ".." is malicious without "root"
-    if (UP_PATH_REGEXP.test(path)) {
-      debug('malicious path "%s"', path)
-      this.error(403)
-      return res
-    }
-
-    // explode path parts
-    parts = normalize(path).split(sep)
-
-    // resolve the path
-    path = resolve(path)
-  }
-
-  // dotfile handling
-  if (containsDotFile(parts)) {
-    var access = this._dotfiles
-
-    // legacy support
-    if (access === undefined) {
-      access = parts[parts.length - 1][0] === '.'
-        ? (this._hidden ? 'allow' : 'ignore')
-        : 'allow'
-    }
-
-    debug('%s dotfile "%s"', access, path)
-    switch (access) {
-      case 'allow':
-        break
-      case 'deny':
-        this.error(403)
-        return res
-      case 'ignore':
-      default:
-        this.error(404)
-        return res
-    }
-  }
-
-  // index file support
-  if (this._index.length && this.hasTrailingSlash()) {
-    this.sendIndex(path)
-    return res
-  }
-
-  this.sendFile(path)
-  return res
-}
-
-/**
- * Transfer `path`.
- *
- * @param {String} path
- * @api public
- */
-
-SendStream.prototype.send = function send (path, stat) {
-  var len = stat.size
-  var options = this.options
-  var opts = {}
-  var res = this.res
-  var req = this.req
-  var ranges = req.headers.range
-  var offset = options.start || 0
-
-  if (headersSent(res)) {
-    // impossible to send now
-    this.headersAlreadySent()
-    return
-  }
-
-  debug('pipe "%s"', path)
-
-  // set header fields
-  this.setHeader(path, stat)
-
-  // set content-type
-  this.type(path)
-
-  // conditional GET support
-  if (this.isConditionalGET()) {
-    if (this.isPreconditionFailure()) {
-      this.error(412)
-      return
-    }
-
-    if (this.isCachable() && this.isFresh()) {
-      this.notModified()
-      return
-    }
-  }
-
-  // adjust len to start/end options
-  len = Math.max(0, len - offset)
-  if (options.end !== undefined) {
-    var bytes = options.end - offset + 1
-    if (len > bytes) len = bytes
-  }
-
-  // Range support
-  if (this._acceptRanges && BYTES_RANGE_REGEXP.test(ranges)) {
-    // parse
-    ranges = parseRange(len, ranges, {
-      combine: true
-    })
-
-    // If-Range support
-    if (!this.isRangeFresh()) {
-      debug('range stale')
-      ranges = -2
-    }
-
-    // unsatisfiable
-    if (ranges === -1) {
-      debug('range unsatisfiable')
-
-      // Content-Range
-      res.setHeader('Content-Range', contentRange('bytes', len))
-
-      // 416 Requested Range Not Satisfiable
-      return this.error(416, {
-        headers: { 'Content-Range': res.getHeader('Content-Range') }
-      })
-    }
-
-    // valid (syntactically invalid/multiple ranges are treated as a regular response)
-    if (ranges !== -2 && ranges.length === 1) {
-      debug('range %j', ranges)
-
-      // Content-Range
-      res.statusCode = 206
-      res.setHeader('Content-Range', contentRange('bytes', len, ranges[0]))
-
-      // adjust for requested range
-      offset += ranges[0].start
-      len = ranges[0].end - ranges[0].start + 1
-    }
-  }
-
-  // clone options
-  for (var prop in options) {
-    opts[prop] = options[prop]
-  }
-
-  // set read options
-  opts.start = offset
-  opts.end = Math.max(offset, offset + len - 1)
-
-  // content-length
-  res.setHeader('Content-Length', len)
-
-  // HEAD support
-  if (req.method === 'HEAD') {
-    res.end()
-    return
-  }
-
-  this.stream(path, opts)
-}
-
-/**
- * Transfer file for `path`.
- *
- * @param {String} path
- * @api private
- */
-SendStream.prototype.sendFile = function sendFile (path) {
-  var i = 0
-  var self = this
-
-  debug('stat "%s"', path)
-  fs.stat(path, function onstat (err, stat) {
-    if (err && err.code === 'ENOENT' && !extname(path) && path[path.length - 1] !== sep) {
-      // not found, check extensions
-      return next(err)
-    }
-    if (err) return self.onStatError(err)
-    if (stat.isDirectory()) return self.redirect(path)
-    self.emit('file', path, stat)
-    self.send(path, stat)
-  })
-
-  function next (err) {
-    if (self._extensions.length <= i) {
-      return err
-        ? self.onStatError(err)
-        : self.error(404)
-    }
-
-    var p = path + '.' + self._extensions[i++]
-
-    debug('stat "%s"', p)
-    fs.stat(p, function (err, stat) {
-      if (err) return next(err)
-      if (stat.isDirectory()) return next()
-      self.emit('file', p, stat)
-      self.send(p, stat)
-    })
-  }
-}
-
-/**
- * Transfer index for `path`.
- *
- * @param {String} path
- * @api private
- */
-SendStream.prototype.sendIndex = function sendIndex (path) {
-  var i = -1
-  var self = this
-
-  function next (err) {
-    if (++i >= self._index.length) {
-      if (err) return self.onStatError(err)
-      return self.error(404)
-    }
-
-    var p = join(path, self._index[i])
-
-    debug('stat "%s"', p)
-    fs.stat(p, function (err, stat) {
-      if (err) return next(err)
-      if (stat.isDirectory()) return next()
-      self.emit('file', p, stat)
-      self.send(p, stat)
-    })
-  }
-
-  next()
-}
-
-/**
- * Stream `path` to the response.
- *
- * @param {String} path
- * @param {Object} options
- * @api private
- */
-
-SendStream.prototype.stream = function stream (path, options) {
-  var self = this
-  var res = this.res
-
-  // pipe
-  var stream = fs.createReadStream(path, options)
-  this.emit('stream', stream)
-  stream.pipe(res)
-
-  // cleanup
-  function cleanup () {
-    destroy(stream, true)
-  }
-
-  // response finished, cleanup
-  onFinished(res, cleanup)
-
-  // error handling
-  stream.on('error', function onerror (err) {
-    // clean up stream early
-    cleanup()
-
-    // error
-    self.onStatError(err)
-  })
-
-  // end
-  stream.on('end', function onend () {
-    self.emit('end')
-  })
-}
-
-/**
- * Set content-type based on `path`
- * if it hasn't been explicitly set.
- *
- * @param {String} path
- * @api private
- */
-
-SendStream.prototype.type = function type (path) {
-  var res = this.res
-
-  if (res.getHeader('Content-Type')) return
-
-  var type = mime.lookup(path)
-
-  if (!type) {
-    debug('no content-type')
-    return
-  }
-
-  var charset = mime.charsets.lookup(type)
-
-  debug('content-type %s', type)
-  res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : ''))
-}
-
-/**
- * Set response header fields, most
- * fields may be pre-defined.
- *
- * @param {String} path
- * @param {Object} stat
- * @api private
- */
-
-SendStream.prototype.setHeader = function setHeader (path, stat) {
-  var res = this.res
-
-  this.emit('headers', res, path, stat)
-
-  if (this._acceptRanges && !res.getHeader('Accept-Ranges')) {
-    debug('accept ranges')
-    res.setHeader('Accept-Ranges', 'bytes')
-  }
-
-  if (this._cacheControl && !res.getHeader('Cache-Control')) {
-    var cacheControl = 'public, max-age=' + Math.floor(this._maxage / 1000)
-
-    if (this._immutable) {
-      cacheControl += ', immutable'
-    }
-
-    debug('cache-control %s', cacheControl)
-    res.setHeader('Cache-Control', cacheControl)
-  }
-
-  if (this._lastModified && !res.getHeader('Last-Modified')) {
-    var modified = stat.mtime.toUTCString()
-    debug('modified %s', modified)
-    res.setHeader('Last-Modified', modified)
-  }
-
-  if (this._etag && !res.getHeader('ETag')) {
-    var val = etag(stat)
-    debug('etag %s', val)
-    res.setHeader('ETag', val)
-  }
-}
-
-/**
- * Clear all headers from a response.
- *
- * @param {object} res
- * @private
- */
-
-function clearHeaders (res) {
-  var headers = getHeaderNames(res)
-
-  for (var i = 0; i < headers.length; i++) {
-    res.removeHeader(headers[i])
-  }
-}
-
-/**
- * Collapse all leading slashes into a single slash
- *
- * @param {string} str
- * @private
- */
-function collapseLeadingSlashes (str) {
-  for (var i = 0; i < str.length; i++) {
-    if (str[i] !== '/') {
-      break
-    }
-  }
-
-  return i > 1
-    ? '/' + str.substr(i)
-    : str
-}
-
-/**
- * Determine if path parts contain a dotfile.
- *
- * @api private
- */
-
-function containsDotFile (parts) {
-  for (var i = 0; i < parts.length; i++) {
-    var part = parts[i]
-    if (part.length > 1 && part[0] === '.') {
-      return true
-    }
-  }
-
-  return false
-}
-
-/**
- * Create a Content-Range header.
- *
- * @param {string} type
- * @param {number} size
- * @param {array} [range]
- */
-
-function contentRange (type, size, range) {
-  return type + ' ' + (range ? range.start + '-' + range.end : '*') + '/' + size
-}
-
-/**
- * Create a minimal HTML document.
- *
- * @param {string} title
- * @param {string} body
- * @private
- */
-
-function createHtmlDocument (title, body) {
-  return '<!DOCTYPE html>\n' +
-    '<html lang="en">\n' +
-    '<head>\n' +
-    '<meta charset="utf-8">\n' +
-    '<title>' + title + '</title>\n' +
-    '</head>\n' +
-    '<body>\n' +
-    '<pre>' + body + '</pre>\n' +
-    '</body>\n' +
-    '</html>\n'
-}
-
-/**
- * Create a HttpError object from simple arguments.
- *
- * @param {number} status
- * @param {Error|object} err
- * @private
- */
-
-function createHttpError (status, err) {
-  if (!err) {
-    return createError(status)
-  }
-
-  return err instanceof Error
-    ? createError(status, err, { expose: false })
-    : createError(status, err)
-}
-
-/**
- * decodeURIComponent.
- *
- * Allows V8 to only deoptimize this fn instead of all
- * of send().
- *
- * @param {String} path
- * @api private
- */
-
-function decode (path) {
-  try {
-    return decodeURIComponent(path)
-  } catch (err) {
-    return -1
-  }
-}
-
-/**
- * Get the header names on a respnse.
- *
- * @param {object} res
- * @returns {array[string]}
- * @private
- */
-
-function getHeaderNames (res) {
-  return typeof res.getHeaderNames !== 'function'
-    ? Object.keys(res._headers || {})
-    : res.getHeaderNames()
-}
-
-/**
- * Determine if emitter has listeners of a given type.
- *
- * The way to do this check is done three different ways in Node.js >= 0.8
- * so this consolidates them into a minimal set using instance methods.
- *
- * @param {EventEmitter} emitter
- * @param {string} type
- * @returns {boolean}
- * @private
- */
-
-function hasListeners (emitter, type) {
-  var count = typeof emitter.listenerCount !== 'function'
-    ? emitter.listeners(type).length
-    : emitter.listenerCount(type)
-
-  return count > 0
-}
-
-/**
- * Determine if the response headers have been sent.
- *
- * @param {object} res
- * @returns {boolean}
- * @private
- */
-
-function headersSent (res) {
-  return typeof res.headersSent !== 'boolean'
-    ? Boolean(res._header)
-    : res.headersSent
-}
-
-/**
- * Normalize the index option into an array.
- *
- * @param {boolean|string|array} val
- * @param {string} name
- * @private
- */
-
-function normalizeList (val, name) {
-  var list = [].concat(val || [])
-
-  for (var i = 0; i < list.length; i++) {
-    if (typeof list[i] !== 'string') {
-      throw new TypeError(name + ' must be array of strings or false')
-    }
-  }
-
-  return list
-}
-
-/**
- * Parse an HTTP Date into a number.
- *
- * @param {string} date
- * @private
- */
-
-function parseHttpDate (date) {
-  var timestamp = date && Date.parse(date)
-
-  return typeof timestamp === 'number'
-    ? timestamp
-    : NaN
-}
-
-/**
- * Parse a HTTP token list.
- *
- * @param {string} str
- * @private
- */
-
-function parseTokenList (str) {
-  var end = 0
-  var list = []
-  var start = 0
-
-  // gather tokens
-  for (var i = 0, len = str.length; i < len; i++) {
-    switch (str.charCodeAt(i)) {
-      case 0x20: /*   */
-        if (start === end) {
-          start = end = i + 1
-        }
-        break
-      case 0x2c: /* , */
-        if (start !== end) {
-          list.push(str.substring(start, end))
-        }
-        start = end = i + 1
-        break
-      default:
-        end = i + 1
-        break
-    }
-  }
-
-  // final token
-  if (start !== end) {
-    list.push(str.substring(start, end))
-  }
-
-  return list
-}
-
-/**
- * Set an object of headers on a response.
- *
- * @param {object} res
- * @param {object} headers
- * @private
- */
-
-function setHeaders (res, headers) {
-  var keys = Object.keys(headers)
-
-  for (var i = 0; i < keys.length; i++) {
-    var key = keys[i]
-    res.setHeader(key, headers[key])
-  }
-}
diff --git a/node_modules/send/node_modules/encodeurl/HISTORY.md b/node_modules/send/node_modules/encodeurl/HISTORY.md
deleted file mode 100644
index 41313b2b3ee8a02ec17c62184bd6a31ebd5a9703..0000000000000000000000000000000000000000
--- a/node_modules/send/node_modules/encodeurl/HISTORY.md
+++ /dev/null
@@ -1,14 +0,0 @@
-1.0.2 / 2018-01-21
-==================
-
-  * Fix encoding `%` as last character
-
-1.0.1 / 2016-06-09
-==================
-
-  * Fix encoding unpaired surrogates at start/end of string
-
-1.0.0 / 2016-06-08
-==================
-
-  * Initial release
diff --git a/node_modules/send/node_modules/encodeurl/LICENSE b/node_modules/send/node_modules/encodeurl/LICENSE
deleted file mode 100644
index 8812229bc59b5f365549fb3c799b32a4d4acdabc..0000000000000000000000000000000000000000
--- a/node_modules/send/node_modules/encodeurl/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2016 Douglas Christopher Wilson
-
-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/send/node_modules/encodeurl/README.md b/node_modules/send/node_modules/encodeurl/README.md
deleted file mode 100644
index 127c5a0d491b284eab066ee42ef8a1e136160101..0000000000000000000000000000000000000000
--- a/node_modules/send/node_modules/encodeurl/README.md
+++ /dev/null
@@ -1,128 +0,0 @@
-# encodeurl
-
-[![NPM Version][npm-image]][npm-url]
-[![NPM Downloads][downloads-image]][downloads-url]
-[![Node.js Version][node-version-image]][node-version-url]
-[![Build Status][travis-image]][travis-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-Encode a URL to a percent-encoded form, excluding already-encoded sequences
-
-## Installation
-
-This is a [Node.js](https://nodejs.org/en/) module available through the
-[npm registry](https://www.npmjs.com/). Installation is done using the
-[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
-
-```sh
-$ npm install encodeurl
-```
-
-## API
-
-```js
-var encodeUrl = require('encodeurl')
-```
-
-### encodeUrl(url)
-
-Encode a URL to a percent-encoded form, excluding already-encoded sequences.
-
-This function will take an already-encoded URL and encode all the non-URL
-code points (as UTF-8 byte sequences). This function will not encode the
-"%" character unless it is not part of a valid sequence (`%20` will be
-left as-is, but `%foo` will be encoded as `%25foo`).
-
-This encode is meant to be "safe" and does not throw errors. It will try as
-hard as it can to properly encode the given URL, including replacing any raw,
-unpaired surrogate pairs with the Unicode replacement character prior to
-encoding.
-
-This function is _similar_ to the intrinsic function `encodeURI`, except it
-will not encode the `%` character if that is part of a valid sequence, will
-not encode `[` and `]` (for IPv6 hostnames) and will replace raw, unpaired
-surrogate pairs with the Unicode replacement character (instead of throwing).
-
-## Examples
-
-### Encode a URL containing user-controled data
-
-```js
-var encodeUrl = require('encodeurl')
-var escapeHtml = require('escape-html')
-
-http.createServer(function onRequest (req, res) {
-  // get encoded form of inbound url
-  var url = encodeUrl(req.url)
-
-  // create html message
-  var body = '<p>Location ' + escapeHtml(url) + ' not found</p>'
-
-  // send a 404
-  res.statusCode = 404
-  res.setHeader('Content-Type', 'text/html; charset=UTF-8')
-  res.setHeader('Content-Length', String(Buffer.byteLength(body, 'utf-8')))
-  res.end(body, 'utf-8')
-})
-```
-
-### Encode a URL for use in a header field
-
-```js
-var encodeUrl = require('encodeurl')
-var escapeHtml = require('escape-html')
-var url = require('url')
-
-http.createServer(function onRequest (req, res) {
-  // parse inbound url
-  var href = url.parse(req)
-
-  // set new host for redirect
-  href.host = 'localhost'
-  href.protocol = 'https:'
-  href.slashes = true
-
-  // create location header
-  var location = encodeUrl(url.format(href))
-
-  // create html message
-  var body = '<p>Redirecting to new site: ' + escapeHtml(location) + '</p>'
-
-  // send a 301
-  res.statusCode = 301
-  res.setHeader('Content-Type', 'text/html; charset=UTF-8')
-  res.setHeader('Content-Length', String(Buffer.byteLength(body, 'utf-8')))
-  res.setHeader('Location', location)
-  res.end(body, 'utf-8')
-})
-```
-
-## Testing
-
-```sh
-$ npm test
-$ npm run lint
-```
-
-## References
-
-- [RFC 3986: Uniform Resource Identifier (URI): Generic Syntax][rfc-3986]
-- [WHATWG URL Living Standard][whatwg-url]
-
-[rfc-3986]: https://tools.ietf.org/html/rfc3986
-[whatwg-url]: https://url.spec.whatwg.org/
-
-## License
-
-[MIT](LICENSE)
-
-[npm-image]: https://img.shields.io/npm/v/encodeurl.svg
-[npm-url]: https://npmjs.org/package/encodeurl
-[node-version-image]: https://img.shields.io/node/v/encodeurl.svg
-[node-version-url]: https://nodejs.org/en/download
-[travis-image]: https://img.shields.io/travis/pillarjs/encodeurl.svg
-[travis-url]: https://travis-ci.org/pillarjs/encodeurl
-[coveralls-image]: https://img.shields.io/coveralls/pillarjs/encodeurl.svg
-[coveralls-url]: https://coveralls.io/r/pillarjs/encodeurl?branch=master
-[downloads-image]: https://img.shields.io/npm/dm/encodeurl.svg
-[downloads-url]: https://npmjs.org/package/encodeurl
diff --git a/node_modules/send/node_modules/encodeurl/index.js b/node_modules/send/node_modules/encodeurl/index.js
deleted file mode 100644
index fc4906c6c7896396a877e1f369c78f804e3afa10..0000000000000000000000000000000000000000
--- a/node_modules/send/node_modules/encodeurl/index.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/*!
- * encodeurl
- * Copyright(c) 2016 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = encodeUrl
-
-/**
- * RegExp to match non-URL code points, *after* encoding (i.e. not including "%")
- * and including invalid escape sequences.
- * @private
- */
-
-var ENCODE_CHARS_REGEXP = /(?:[^\x21\x25\x26-\x3B\x3D\x3F-\x5B\x5D\x5F\x61-\x7A\x7E]|%(?:[^0-9A-Fa-f]|[0-9A-Fa-f][^0-9A-Fa-f]|$))+/g
-
-/**
- * RegExp to match unmatched surrogate pair.
- * @private
- */
-
-var UNMATCHED_SURROGATE_PAIR_REGEXP = /(^|[^\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF]([^\uDC00-\uDFFF]|$)/g
-
-/**
- * String to replace unmatched surrogate pair with.
- * @private
- */
-
-var UNMATCHED_SURROGATE_PAIR_REPLACE = '$1\uFFFD$2'
-
-/**
- * Encode a URL to a percent-encoded form, excluding already-encoded sequences.
- *
- * This function will take an already-encoded URL and encode all the non-URL
- * code points. This function will not encode the "%" character unless it is
- * not part of a valid sequence (`%20` will be left as-is, but `%foo` will
- * be encoded as `%25foo`).
- *
- * This encode is meant to be "safe" and does not throw errors. It will try as
- * hard as it can to properly encode the given URL, including replacing any raw,
- * unpaired surrogate pairs with the Unicode replacement character prior to
- * encoding.
- *
- * @param {string} url
- * @return {string}
- * @public
- */
-
-function encodeUrl (url) {
-  return String(url)
-    .replace(UNMATCHED_SURROGATE_PAIR_REGEXP, UNMATCHED_SURROGATE_PAIR_REPLACE)
-    .replace(ENCODE_CHARS_REGEXP, encodeURI)
-}
diff --git a/node_modules/send/node_modules/encodeurl/package.json b/node_modules/send/node_modules/encodeurl/package.json
deleted file mode 100644
index b9f25ef10b2fc15b4a9c2ea5aa48856d73f1aade..0000000000000000000000000000000000000000
--- a/node_modules/send/node_modules/encodeurl/package.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "name": "encodeurl",
-  "description": "Encode a URL to a percent-encoded form, excluding already-encoded sequences",
-  "version": "1.0.2",
-  "contributors": [
-    "Douglas Christopher Wilson <doug@somethingdoug.com>"
-  ],
-  "license": "MIT",
-  "keywords": [
-    "encode",
-    "encodeurl",
-    "url"
-  ],
-  "repository": "pillarjs/encodeurl",
-  "devDependencies": {
-    "eslint": "3.19.0",
-    "eslint-config-standard": "10.2.1",
-    "eslint-plugin-import": "2.8.0",
-    "eslint-plugin-node": "5.2.1",
-    "eslint-plugin-promise": "3.6.0",
-    "eslint-plugin-standard": "3.0.1",
-    "istanbul": "0.4.5",
-    "mocha": "2.5.3"
-  },
-  "files": [
-    "LICENSE",
-    "HISTORY.md",
-    "README.md",
-    "index.js"
-  ],
-  "engines": {
-    "node": ">= 0.8"
-  },
-  "scripts": {
-    "lint": "eslint .",
-    "test": "mocha --reporter spec --bail --check-leaks test/",
-    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
-    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/"
-  }
-}
diff --git a/node_modules/send/node_modules/ms/index.js b/node_modules/send/node_modules/ms/index.js
deleted file mode 100644
index ea734fb73820316ed1c0f6a2f6e96dce0e3eb6f0..0000000000000000000000000000000000000000
--- a/node_modules/send/node_modules/ms/index.js
+++ /dev/null
@@ -1,162 +0,0 @@
-/**
- * Helpers.
- */
-
-var s = 1000;
-var m = s * 60;
-var h = m * 60;
-var d = h * 24;
-var w = d * 7;
-var y = d * 365.25;
-
-/**
- * Parse or format the given `val`.
- *
- * Options:
- *
- *  - `long` verbose formatting [false]
- *
- * @param {String|Number} val
- * @param {Object} [options]
- * @throws {Error} throw an error if val is not a non-empty string or a number
- * @return {String|Number}
- * @api public
- */
-
-module.exports = function (val, options) {
-  options = options || {};
-  var type = typeof val;
-  if (type === 'string' && val.length > 0) {
-    return parse(val);
-  } else if (type === 'number' && isFinite(val)) {
-    return options.long ? fmtLong(val) : fmtShort(val);
-  }
-  throw new Error(
-    'val is not a non-empty string or a valid number. val=' +
-      JSON.stringify(val)
-  );
-};
-
-/**
- * Parse the given `str` and return milliseconds.
- *
- * @param {String} str
- * @return {Number}
- * @api private
- */
-
-function parse(str) {
-  str = String(str);
-  if (str.length > 100) {
-    return;
-  }
-  var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
-    str
-  );
-  if (!match) {
-    return;
-  }
-  var n = parseFloat(match[1]);
-  var type = (match[2] || 'ms').toLowerCase();
-  switch (type) {
-    case 'years':
-    case 'year':
-    case 'yrs':
-    case 'yr':
-    case 'y':
-      return n * y;
-    case 'weeks':
-    case 'week':
-    case 'w':
-      return n * w;
-    case 'days':
-    case 'day':
-    case 'd':
-      return n * d;
-    case 'hours':
-    case 'hour':
-    case 'hrs':
-    case 'hr':
-    case 'h':
-      return n * h;
-    case 'minutes':
-    case 'minute':
-    case 'mins':
-    case 'min':
-    case 'm':
-      return n * m;
-    case 'seconds':
-    case 'second':
-    case 'secs':
-    case 'sec':
-    case 's':
-      return n * s;
-    case 'milliseconds':
-    case 'millisecond':
-    case 'msecs':
-    case 'msec':
-    case 'ms':
-      return n;
-    default:
-      return undefined;
-  }
-}
-
-/**
- * Short format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function fmtShort(ms) {
-  var msAbs = Math.abs(ms);
-  if (msAbs >= d) {
-    return Math.round(ms / d) + 'd';
-  }
-  if (msAbs >= h) {
-    return Math.round(ms / h) + 'h';
-  }
-  if (msAbs >= m) {
-    return Math.round(ms / m) + 'm';
-  }
-  if (msAbs >= s) {
-    return Math.round(ms / s) + 's';
-  }
-  return ms + 'ms';
-}
-
-/**
- * Long format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function fmtLong(ms) {
-  var msAbs = Math.abs(ms);
-  if (msAbs >= d) {
-    return plural(ms, msAbs, d, 'day');
-  }
-  if (msAbs >= h) {
-    return plural(ms, msAbs, h, 'hour');
-  }
-  if (msAbs >= m) {
-    return plural(ms, msAbs, m, 'minute');
-  }
-  if (msAbs >= s) {
-    return plural(ms, msAbs, s, 'second');
-  }
-  return ms + ' ms';
-}
-
-/**
- * Pluralization helper.
- */
-
-function plural(ms, msAbs, n, name) {
-  var isPlural = msAbs >= n * 1.5;
-  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
-}
diff --git a/node_modules/send/node_modules/ms/license.md b/node_modules/send/node_modules/ms/license.md
deleted file mode 100644
index fa5d39b6213f8a5e142b643575f99d9149cc71c6..0000000000000000000000000000000000000000
--- a/node_modules/send/node_modules/ms/license.md
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2020 Vercel, 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/send/node_modules/ms/package.json b/node_modules/send/node_modules/ms/package.json
deleted file mode 100644
index 49971890df8e2b9a4a5f4909fbd6678b862d8a50..0000000000000000000000000000000000000000
--- a/node_modules/send/node_modules/ms/package.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "name": "ms",
-  "version": "2.1.3",
-  "description": "Tiny millisecond conversion utility",
-  "repository": "vercel/ms",
-  "main": "./index",
-  "files": [
-    "index.js"
-  ],
-  "scripts": {
-    "precommit": "lint-staged",
-    "lint": "eslint lib/* bin/*",
-    "test": "mocha tests.js"
-  },
-  "eslintConfig": {
-    "extends": "eslint:recommended",
-    "env": {
-      "node": true,
-      "es6": true
-    }
-  },
-  "lint-staged": {
-    "*.js": [
-      "npm run lint",
-      "prettier --single-quote --write",
-      "git add"
-    ]
-  },
-  "license": "MIT",
-  "devDependencies": {
-    "eslint": "4.18.2",
-    "expect.js": "0.3.1",
-    "husky": "0.14.3",
-    "lint-staged": "5.0.0",
-    "mocha": "4.0.1",
-    "prettier": "2.0.5"
-  }
-}
diff --git a/node_modules/send/node_modules/ms/readme.md b/node_modules/send/node_modules/ms/readme.md
deleted file mode 100644
index 0fc1abb3b8e30a3ab97023d243127c75b1b3a4d7..0000000000000000000000000000000000000000
--- a/node_modules/send/node_modules/ms/readme.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# ms
-
-![CI](https://github.com/vercel/ms/workflows/CI/badge.svg)
-
-Use this package to easily convert various time formats to milliseconds.
-
-## Examples
-
-```js
-ms('2 days')  // 172800000
-ms('1d')      // 86400000
-ms('10h')     // 36000000
-ms('2.5 hrs') // 9000000
-ms('2h')      // 7200000
-ms('1m')      // 60000
-ms('5s')      // 5000
-ms('1y')      // 31557600000
-ms('100')     // 100
-ms('-3 days') // -259200000
-ms('-1h')     // -3600000
-ms('-200')    // -200
-```
-
-### Convert from Milliseconds
-
-```js
-ms(60000)             // "1m"
-ms(2 * 60000)         // "2m"
-ms(-3 * 60000)        // "-3m"
-ms(ms('10 hours'))    // "10h"
-```
-
-### Time Format Written-Out
-
-```js
-ms(60000, { long: true })             // "1 minute"
-ms(2 * 60000, { long: true })         // "2 minutes"
-ms(-3 * 60000, { long: true })        // "-3 minutes"
-ms(ms('10 hours'), { long: true })    // "10 hours"
-```
-
-## Features
-
-- Works both in [Node.js](https://nodejs.org) and in the browser
-- If a number is supplied to `ms`, a string with a unit is returned
-- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`)
-- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned
-
-## Related Packages
-
-- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time.
-
-## Caught a Bug?
-
-1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device
-2. Link the package to the global module directory: `npm link`
-3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms!
-
-As always, you can run the tests using: `npm test`
diff --git a/node_modules/send/package.json b/node_modules/send/package.json
deleted file mode 100644
index a3233e005711b7fbfc358d07c33ef8821b6ca5e8..0000000000000000000000000000000000000000
--- a/node_modules/send/package.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
-  "name": "send",
-  "description": "Better streaming static file server with Range and conditional-GET support",
-  "version": "0.19.0",
-  "author": "TJ Holowaychuk <tj@vision-media.ca>",
-  "contributors": [
-    "Douglas Christopher Wilson <doug@somethingdoug.com>",
-    "James Wyatt Cready <jcready@gmail.com>",
-    "Jesús Leganés Combarro <piranna@gmail.com>"
-  ],
-  "license": "MIT",
-  "repository": "pillarjs/send",
-  "keywords": [
-    "static",
-    "file",
-    "server"
-  ],
-  "dependencies": {
-    "debug": "2.6.9",
-    "depd": "2.0.0",
-    "destroy": "1.2.0",
-    "encodeurl": "~1.0.2",
-    "escape-html": "~1.0.3",
-    "etag": "~1.8.1",
-    "fresh": "0.5.2",
-    "http-errors": "2.0.0",
-    "mime": "1.6.0",
-    "ms": "2.1.3",
-    "on-finished": "2.4.1",
-    "range-parser": "~1.2.1",
-    "statuses": "2.0.1"
-  },
-  "devDependencies": {
-    "after": "0.8.2",
-    "eslint": "7.32.0",
-    "eslint-config-standard": "14.1.1",
-    "eslint-plugin-import": "2.25.4",
-    "eslint-plugin-markdown": "2.2.1",
-    "eslint-plugin-node": "11.1.0",
-    "eslint-plugin-promise": "5.2.0",
-    "eslint-plugin-standard": "4.1.0",
-    "mocha": "9.2.2",
-    "nyc": "15.1.0",
-    "supertest": "6.2.2"
-  },
-  "files": [
-    "HISTORY.md",
-    "LICENSE",
-    "README.md",
-    "SECURITY.md",
-    "index.js"
-  ],
-  "engines": {
-    "node": ">= 0.8.0"
-  },
-  "scripts": {
-    "lint": "eslint .",
-    "test": "mocha --check-leaks --reporter spec --bail",
-    "test-ci": "nyc --reporter=lcov --reporter=text npm test",
-    "test-cov": "nyc --reporter=html --reporter=text npm test"
-  }
-}
diff --git a/node_modules/serve-static/HISTORY.md b/node_modules/serve-static/HISTORY.md
deleted file mode 100644
index dccf667866f235c68664f91e3cbeefb29f23330e..0000000000000000000000000000000000000000
--- a/node_modules/serve-static/HISTORY.md
+++ /dev/null
@@ -1,487 +0,0 @@
-1.16.2 / 2024-09-11
-===================
-
-* deps: encodeurl@~2.0.0
-
-1.16.1 / 2024-09-11
-===================
-
-* deps: send@0.19.0
-
-1.16.0 / 2024-09-10
-===================
-
-* Remove link renderization in html while redirecting
-
-
-1.15.0 / 2022-03-24
-===================
-
-  * deps: send@0.18.0
-    - Fix emitted 416 error missing headers property
-    - Limit the headers removed for 304 response
-    - deps: depd@2.0.0
-    - deps: destroy@1.2.0
-    - deps: http-errors@2.0.0
-    - deps: on-finished@2.4.1
-    - deps: statuses@2.0.1
-
-1.14.2 / 2021-12-15
-===================
-
-  * deps: send@0.17.2
-    - deps: http-errors@1.8.1
-    - deps: ms@2.1.3
-    - pref: ignore empty http tokens
-
-1.14.1 / 2019-05-10
-===================
-
-  * Set stricter CSP header in redirect response
-  * deps: send@0.17.1
-    - deps: range-parser@~1.2.1
-
-1.14.0 / 2019-05-07
-===================
-
-  * deps: parseurl@~1.3.3
-  * deps: send@0.17.0
-    - deps: http-errors@~1.7.2
-    - deps: mime@1.6.0
-    - deps: ms@2.1.1
-    - deps: statuses@~1.5.0
-    - perf: remove redundant `path.normalize` call
-
-1.13.2 / 2018-02-07
-===================
-
-  * Fix incorrect end tag in redirects
-  * deps: encodeurl@~1.0.2
-    - Fix encoding `%` as last character
-  * deps: send@0.16.2
-    - deps: depd@~1.1.2
-    - deps: encodeurl@~1.0.2
-    - deps: statuses@~1.4.0
-
-1.13.1 / 2017-09-29
-===================
-
-  * Fix regression when `root` is incorrectly set to a file
-  * deps: send@0.16.1
-
-1.13.0 / 2017-09-27
-===================
-
-  * deps: send@0.16.0
-    - Add 70 new types for file extensions
-    - Add `immutable` option
-    - Fix missing `</html>` in default error & redirects
-    - Set charset as "UTF-8" for .js and .json
-    - Use instance methods on steam to check for listeners
-    - deps: mime@1.4.1
-    - perf: improve path validation speed
-
-1.12.6 / 2017-09-22
-===================
-
-  * deps: send@0.15.6
-    - deps: debug@2.6.9
-    - perf: improve `If-Match` token parsing
-  * perf: improve slash collapsing
-
-1.12.5 / 2017-09-21
-===================
-
-  * deps: parseurl@~1.3.2
-    - perf: reduce overhead for full URLs
-    - perf: unroll the "fast-path" `RegExp`
-  * deps: send@0.15.5
-    - Fix handling of modified headers with invalid dates
-    - deps: etag@~1.8.1
-    - deps: fresh@0.5.2
-
-1.12.4 / 2017-08-05
-===================
-
-  * deps: send@0.15.4
-    - deps: debug@2.6.8
-    - deps: depd@~1.1.1
-    - deps: http-errors@~1.6.2
-
-1.12.3 / 2017-05-16
-===================
-
-  * deps: send@0.15.3
-    - deps: debug@2.6.7
-
-1.12.2 / 2017-04-26
-===================
-
-  * deps: send@0.15.2
-    - deps: debug@2.6.4
-
-1.12.1 / 2017-03-04
-===================
-
-  * deps: send@0.15.1
-    - Fix issue when `Date.parse` does not return `NaN` on invalid date
-    - Fix strict violation in broken environments
-
-1.12.0 / 2017-02-25
-===================
-
-  * Send complete HTML document in redirect response
-  * Set default CSP header in redirect response
-  * deps: send@0.15.0
-    - Fix false detection of `no-cache` request directive
-    - Fix incorrect result when `If-None-Match` has both `*` and ETags
-    - Fix weak `ETag` matching to match spec
-    - Remove usage of `res._headers` private field
-    - Support `If-Match` and `If-Unmodified-Since` headers
-    - Use `res.getHeaderNames()` when available
-    - Use `res.headersSent` when available
-    - deps: debug@2.6.1
-    - deps: etag@~1.8.0
-    - deps: fresh@0.5.0
-    - deps: http-errors@~1.6.1
-
-1.11.2 / 2017-01-23
-===================
-
-  * deps: send@0.14.2
-    - deps: http-errors@~1.5.1
-    - deps: ms@0.7.2
-    - deps: statuses@~1.3.1
-
-1.11.1 / 2016-06-10
-===================
-
-  * Fix redirect error when `req.url` contains raw non-URL characters
-  * deps: send@0.14.1
-
-1.11.0 / 2016-06-07
-===================
-
-  * Use status code 301 for redirects
-  * deps: send@0.14.0
-    - Add `acceptRanges` option
-    - Add `cacheControl` option
-    - Attempt to combine multiple ranges into single range
-    - Correctly inherit from `Stream` class
-    - Fix `Content-Range` header in 416 responses when using `start`/`end` options
-    - Fix `Content-Range` header missing from default 416 responses
-    - Ignore non-byte `Range` headers
-    - deps: http-errors@~1.5.0
-    - deps: range-parser@~1.2.0
-    - deps: statuses@~1.3.0
-    - perf: remove argument reassignment
-
-1.10.3 / 2016-05-30
-===================
-
-  * deps: send@0.13.2
-    - Fix invalid `Content-Type` header when `send.mime.default_type` unset
-
-1.10.2 / 2016-01-19
-===================
-
-  * deps: parseurl@~1.3.1
-    - perf: enable strict mode
-
-1.10.1 / 2016-01-16
-===================
-
-  * deps: escape-html@~1.0.3
-    - perf: enable strict mode
-    - perf: optimize string replacement
-    - perf: use faster string coercion
-  * deps: send@0.13.1
-    - deps: depd@~1.1.0
-    - deps: destroy@~1.0.4
-    - deps: escape-html@~1.0.3
-    - deps: range-parser@~1.0.3
-
-1.10.0 / 2015-06-17
-===================
-
-  * Add `fallthrough` option
-    - Allows declaring this middleware is the final destination
-    - Provides better integration with Express patterns
-  * Fix reading options from options prototype
-  * Improve the default redirect response headers
-  * deps: escape-html@1.0.2
-  * deps: send@0.13.0
-    - Allow Node.js HTTP server to set `Date` response header
-    - Fix incorrectly removing `Content-Location` on 304 response
-    - Improve the default redirect response headers
-    - Send appropriate headers on default error response
-    - Use `http-errors` for standard emitted errors
-    - Use `statuses` instead of `http` module for status messages
-    - deps: escape-html@1.0.2
-    - deps: etag@~1.7.0
-    - deps: fresh@0.3.0
-    - deps: on-finished@~2.3.0
-    - perf: enable strict mode
-    - perf: remove unnecessary array allocations
-  * perf: enable strict mode
-  * perf: remove argument reassignment
-
-1.9.3 / 2015-05-14
-==================
-
-  * deps: send@0.12.3
-    - deps: debug@~2.2.0
-    - deps: depd@~1.0.1
-    - deps: etag@~1.6.0
-    - deps: ms@0.7.1
-    - deps: on-finished@~2.2.1
-
-1.9.2 / 2015-03-14
-==================
-
-  * deps: send@0.12.2
-    - Throw errors early for invalid `extensions` or `index` options
-    - deps: debug@~2.1.3
-
-1.9.1 / 2015-02-17
-==================
-
-  * deps: send@0.12.1
-    - Fix regression sending zero-length files
-
-1.9.0 / 2015-02-16
-==================
-
-  * deps: send@0.12.0
-    - Always read the stat size from the file
-    - Fix mutating passed-in `options`
-    - deps: mime@1.3.4
-
-1.8.1 / 2015-01-20
-==================
-
-  * Fix redirect loop in Node.js 0.11.14
-  * deps: send@0.11.1
-    - Fix root path disclosure
-
-1.8.0 / 2015-01-05
-==================
-
-  * deps: send@0.11.0
-    - deps: debug@~2.1.1
-    - deps: etag@~1.5.1
-    - deps: ms@0.7.0
-    - deps: on-finished@~2.2.0
-
-1.7.2 / 2015-01-02
-==================
-
-  * Fix potential open redirect when mounted at root
-
-1.7.1 / 2014-10-22
-==================
-
-  * deps: send@0.10.1
-    - deps: on-finished@~2.1.1
-
-1.7.0 / 2014-10-15
-==================
-
-  * deps: send@0.10.0
-    - deps: debug@~2.1.0
-    - deps: depd@~1.0.0
-    - deps: etag@~1.5.0
-
-1.6.5 / 2015-02-04
-==================
-
-  * Fix potential open redirect when mounted at root
-    - Back-ported from v1.7.2
-
-1.6.4 / 2014-10-08
-==================
-
-  * Fix redirect loop when index file serving disabled
-
-1.6.3 / 2014-09-24
-==================
-
-  * deps: send@0.9.3
-    - deps: etag@~1.4.0
-
-1.6.2 / 2014-09-15
-==================
-
-  * deps: send@0.9.2
-    - deps: depd@0.4.5
-    - deps: etag@~1.3.1
-    - deps: range-parser@~1.0.2
-
-1.6.1 / 2014-09-07
-==================
-
-  * deps: send@0.9.1
-    - deps: fresh@0.2.4
-
-1.6.0 / 2014-09-07
-==================
-
-  * deps: send@0.9.0
-    - Add `lastModified` option
-    - Use `etag` to generate `ETag` header
-    - deps: debug@~2.0.0
-
-1.5.4 / 2014-09-04
-==================
-
-  * deps: send@0.8.5
-    - Fix a path traversal issue when using `root`
-    - Fix malicious path detection for empty string path
-
-1.5.3 / 2014-08-17
-==================
-
-  * deps: send@0.8.3
-
-1.5.2 / 2014-08-14
-==================
-
-  * deps: send@0.8.2
-    - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream`
-
-1.5.1 / 2014-08-09
-==================
-
-  * Fix parsing of weird `req.originalUrl` values
-  * deps: parseurl@~1.3.0
-  * deps: utils-merge@1.0.0
-
-1.5.0 / 2014-08-05
-==================
-
-  * deps: send@0.8.1
-    - Add `extensions` option
-
-1.4.4 / 2014-08-04
-==================
-
-  * deps: send@0.7.4
-    - Fix serving index files without root dir
-
-1.4.3 / 2014-07-29
-==================
-
-  * deps: send@0.7.3
-    - Fix incorrect 403 on Windows and Node.js 0.11
-
-1.4.2 / 2014-07-27
-==================
-
-  * deps: send@0.7.2
-    - deps: depd@0.4.4
-
-1.4.1 / 2014-07-26
-==================
-
-  * deps: send@0.7.1
-    - deps: depd@0.4.3
-
-1.4.0 / 2014-07-21
-==================
-
-  * deps: parseurl@~1.2.0
-    - Cache URLs based on original value
-    - Remove no-longer-needed URL mis-parse work-around
-    - Simplify the "fast-path" `RegExp`
-  * deps: send@0.7.0
-    - Add `dotfiles` option
-    - deps: debug@1.0.4
-    - deps: depd@0.4.2
-
-1.3.2 / 2014-07-11
-==================
-
-  * deps: send@0.6.0
-    - Cap `maxAge` value to 1 year
-    - deps: debug@1.0.3
-
-1.3.1 / 2014-07-09
-==================
-
-  * deps: parseurl@~1.1.3
-    - faster parsing of href-only URLs
-
-1.3.0 / 2014-06-28
-==================
-
-  * Add `setHeaders` option
-  * Include HTML link in redirect response
-  * deps: send@0.5.0
-    - Accept string for `maxAge` (converted by `ms`)
-
-1.2.3 / 2014-06-11
-==================
-
-  * deps: send@0.4.3
-    - Do not throw un-catchable error on file open race condition
-    - Use `escape-html` for HTML escaping
-    - deps: debug@1.0.2
-    - deps: finished@1.2.2
-    - deps: fresh@0.2.2
-
-1.2.2 / 2014-06-09
-==================
-
-  * deps: send@0.4.2
-    - fix "event emitter leak" warnings
-    - deps: debug@1.0.1
-    - deps: finished@1.2.1
-
-1.2.1 / 2014-06-02
-==================
-
-  * use `escape-html` for escaping
-  * deps: send@0.4.1
-    - Send `max-age` in `Cache-Control` in correct format
-
-1.2.0 / 2014-05-29
-==================
-
-  * deps: send@0.4.0
-    - Calculate ETag with md5 for reduced collisions
-    - Fix wrong behavior when index file matches directory
-    - Ignore stream errors after request ends
-    - Skip directories in index file search
-    - deps: debug@0.8.1
-
-1.1.0 / 2014-04-24
-==================
-
-  * Accept options directly to `send` module
-  * deps: send@0.3.0
-
-1.0.4 / 2014-04-07
-==================
-
-  * Resolve relative paths at middleware setup
-  * Use parseurl to parse the URL from request
-
-1.0.3 / 2014-03-20
-==================
-
-  * Do not rely on connect-like environments
-
-1.0.2 / 2014-03-06
-==================
-
-  * deps: send@0.2.0
-
-1.0.1 / 2014-03-05
-==================
-
-  * Add mime export for back-compat
-
-1.0.0 / 2014-03-05
-==================
-
-  * Genesis from `connect`
diff --git a/node_modules/serve-static/LICENSE b/node_modules/serve-static/LICENSE
deleted file mode 100644
index cbe62e8e7f20b6aa70e4d138b1503837ae4e5f95..0000000000000000000000000000000000000000
--- a/node_modules/serve-static/LICENSE
+++ /dev/null
@@ -1,25 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2010 Sencha Inc.
-Copyright (c) 2011 LearnBoost
-Copyright (c) 2011 TJ Holowaychuk
-Copyright (c) 2014-2016 Douglas Christopher Wilson
-
-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/serve-static/README.md b/node_modules/serve-static/README.md
deleted file mode 100644
index 262d944ab7510ecb39b47055189a92793c94aa26..0000000000000000000000000000000000000000
--- a/node_modules/serve-static/README.md
+++ /dev/null
@@ -1,257 +0,0 @@
-# serve-static
-
-[![NPM Version][npm-version-image]][npm-url]
-[![NPM Downloads][npm-downloads-image]][npm-url]
-[![Linux Build][github-actions-ci-image]][github-actions-ci-url]
-[![Windows Build][appveyor-image]][appveyor-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-## Install
-
-This is a [Node.js](https://nodejs.org/en/) module available through the
-[npm registry](https://www.npmjs.com/). Installation is done using the
-[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
-
-```sh
-$ npm install serve-static
-```
-
-## API
-
-```js
-var serveStatic = require('serve-static')
-```
-
-### serveStatic(root, options)
-
-Create a new middleware function to serve files from within a given root
-directory. The file to serve will be determined by combining `req.url`
-with the provided root directory. When a file is not found, instead of
-sending a 404 response, this module will instead call `next()` to move on
-to the next middleware, allowing for stacking and fall-backs.
-
-#### Options
-
-##### acceptRanges
-
-Enable or disable accepting ranged requests, defaults to true.
-Disabling this will not send `Accept-Ranges` and ignore the contents
-of the `Range` request header.
-
-##### cacheControl
-
-Enable or disable setting `Cache-Control` response header, defaults to
-true. Disabling this will ignore the `immutable` and `maxAge` options.
-
-##### dotfiles
-
- Set how "dotfiles" are treated when encountered. A dotfile is a file
-or directory that begins with a dot ("."). Note this check is done on
-the path itself without checking if the path actually exists on the
-disk. If `root` is specified, only the dotfiles above the root are
-checked (i.e. the root itself can be within a dotfile when set
-to "deny").
-
-  - `'allow'` No special treatment for dotfiles.
-  - `'deny'` Deny a request for a dotfile and 403/`next()`.
-  - `'ignore'` Pretend like the dotfile does not exist and 404/`next()`.
-
-The default value is similar to `'ignore'`, with the exception that this
-default will not ignore the files within a directory that begins with a dot.
-
-##### etag
-
-Enable or disable etag generation, defaults to true.
-
-##### extensions
-
-Set file extension fallbacks. When set, if a file is not found, the given
-extensions will be added to the file name and search for. The first that
-exists will be served. Example: `['html', 'htm']`.
-
-The default value is `false`.
-
-##### fallthrough
-
-Set the middleware to have client errors fall-through as just unhandled
-requests, otherwise forward a client error. The difference is that client
-errors like a bad request or a request to a non-existent file will cause
-this middleware to simply `next()` to your next middleware when this value
-is `true`. When this value is `false`, these errors (even 404s), will invoke
-`next(err)`.
-
-Typically `true` is desired such that multiple physical directories can be
-mapped to the same web address or for routes to fill in non-existent files.
-
-The value `false` can be used if this middleware is mounted at a path that
-is designed to be strictly a single file system directory, which allows for
-short-circuiting 404s for less overhead. This middleware will also reply to
-all methods.
-
-The default value is `true`.
-
-##### immutable
-
-Enable or disable the `immutable` directive in the `Cache-Control` response
-header, defaults to `false`. If set to `true`, the `maxAge` option should
-also be specified to enable caching. The `immutable` directive will prevent
-supported clients from making conditional requests during the life of the
-`maxAge` option to check if the file has changed.
-
-##### index
-
-By default this module will send "index.html" files in response to a request
-on a directory. To disable this set `false` or to supply a new index pass a
-string or an array in preferred order.
-
-##### lastModified
-
-Enable or disable `Last-Modified` header, defaults to true. Uses the file
-system's last modified value.
-
-##### maxAge
-
-Provide a max-age in milliseconds for http caching, defaults to 0. This
-can also be a string accepted by the [ms](https://www.npmjs.org/package/ms#readme)
-module.
-
-##### redirect
-
-Redirect to trailing "/" when the pathname is a dir. Defaults to `true`.
-
-##### setHeaders
-
-Function to set custom headers on response. Alterations to the headers need to
-occur synchronously. The function is called as `fn(res, path, stat)`, where
-the arguments are:
-
-  - `res` the response object
-  - `path` the file path that is being sent
-  - `stat` the stat object of the file that is being sent
-
-## Examples
-
-### Serve files with vanilla node.js http server
-
-```js
-var finalhandler = require('finalhandler')
-var http = require('http')
-var serveStatic = require('serve-static')
-
-// Serve up public/ftp folder
-var serve = serveStatic('public/ftp', { index: ['index.html', 'index.htm'] })
-
-// Create server
-var server = http.createServer(function onRequest (req, res) {
-  serve(req, res, finalhandler(req, res))
-})
-
-// Listen
-server.listen(3000)
-```
-
-### Serve all files as downloads
-
-```js
-var contentDisposition = require('content-disposition')
-var finalhandler = require('finalhandler')
-var http = require('http')
-var serveStatic = require('serve-static')
-
-// Serve up public/ftp folder
-var serve = serveStatic('public/ftp', {
-  index: false,
-  setHeaders: setHeaders
-})
-
-// Set header to force download
-function setHeaders (res, path) {
-  res.setHeader('Content-Disposition', contentDisposition(path))
-}
-
-// Create server
-var server = http.createServer(function onRequest (req, res) {
-  serve(req, res, finalhandler(req, res))
-})
-
-// Listen
-server.listen(3000)
-```
-
-### Serving using express
-
-#### Simple
-
-This is a simple example of using Express.
-
-```js
-var express = require('express')
-var serveStatic = require('serve-static')
-
-var app = express()
-
-app.use(serveStatic('public/ftp', { index: ['default.html', 'default.htm'] }))
-app.listen(3000)
-```
-
-#### Multiple roots
-
-This example shows a simple way to search through multiple directories.
-Files are searched for in `public-optimized/` first, then `public/` second
-as a fallback.
-
-```js
-var express = require('express')
-var path = require('path')
-var serveStatic = require('serve-static')
-
-var app = express()
-
-app.use(serveStatic(path.join(__dirname, 'public-optimized')))
-app.use(serveStatic(path.join(__dirname, 'public')))
-app.listen(3000)
-```
-
-#### Different settings for paths
-
-This example shows how to set a different max age depending on the served
-file type. In this example, HTML files are not cached, while everything else
-is for 1 day.
-
-```js
-var express = require('express')
-var path = require('path')
-var serveStatic = require('serve-static')
-
-var app = express()
-
-app.use(serveStatic(path.join(__dirname, 'public'), {
-  maxAge: '1d',
-  setHeaders: setCustomCacheControl
-}))
-
-app.listen(3000)
-
-function setCustomCacheControl (res, path) {
-  if (serveStatic.mime.lookup(path) === 'text/html') {
-    // Custom Cache-Control for HTML files
-    res.setHeader('Cache-Control', 'public, max-age=0')
-  }
-}
-```
-
-## License
-
-[MIT](LICENSE)
-
-[appveyor-image]: https://badgen.net/appveyor/ci/dougwilson/serve-static/master?label=windows
-[appveyor-url]: https://ci.appveyor.com/project/dougwilson/serve-static
-[coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/serve-static/master
-[coveralls-url]: https://coveralls.io/r/expressjs/serve-static?branch=master
-[github-actions-ci-image]: https://badgen.net/github/checks/expressjs/serve-static/master?label=linux
-[github-actions-ci-url]: https://github.com/expressjs/serve-static/actions/workflows/ci.yml
-[node-image]: https://badgen.net/npm/node/serve-static
-[node-url]: https://nodejs.org/en/download/
-[npm-downloads-image]: https://badgen.net/npm/dm/serve-static
-[npm-url]: https://npmjs.org/package/serve-static
-[npm-version-image]: https://badgen.net/npm/v/serve-static
diff --git a/node_modules/serve-static/index.js b/node_modules/serve-static/index.js
deleted file mode 100644
index 3f3e64e9eaad83c4638b1a458ecfa6c49a6bebc1..0000000000000000000000000000000000000000
--- a/node_modules/serve-static/index.js
+++ /dev/null
@@ -1,209 +0,0 @@
-/*!
- * serve-static
- * Copyright(c) 2010 Sencha Inc.
- * Copyright(c) 2011 TJ Holowaychuk
- * Copyright(c) 2014-2016 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module dependencies.
- * @private
- */
-
-var encodeUrl = require('encodeurl')
-var escapeHtml = require('escape-html')
-var parseUrl = require('parseurl')
-var resolve = require('path').resolve
-var send = require('send')
-var url = require('url')
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = serveStatic
-module.exports.mime = send.mime
-
-/**
- * @param {string} root
- * @param {object} [options]
- * @return {function}
- * @public
- */
-
-function serveStatic (root, options) {
-  if (!root) {
-    throw new TypeError('root path required')
-  }
-
-  if (typeof root !== 'string') {
-    throw new TypeError('root path must be a string')
-  }
-
-  // copy options object
-  var opts = Object.create(options || null)
-
-  // fall-though
-  var fallthrough = opts.fallthrough !== false
-
-  // default redirect
-  var redirect = opts.redirect !== false
-
-  // headers listener
-  var setHeaders = opts.setHeaders
-
-  if (setHeaders && typeof setHeaders !== 'function') {
-    throw new TypeError('option setHeaders must be function')
-  }
-
-  // setup options for send
-  opts.maxage = opts.maxage || opts.maxAge || 0
-  opts.root = resolve(root)
-
-  // construct directory listener
-  var onDirectory = redirect
-    ? createRedirectDirectoryListener()
-    : createNotFoundDirectoryListener()
-
-  return function serveStatic (req, res, next) {
-    if (req.method !== 'GET' && req.method !== 'HEAD') {
-      if (fallthrough) {
-        return next()
-      }
-
-      // method not allowed
-      res.statusCode = 405
-      res.setHeader('Allow', 'GET, HEAD')
-      res.setHeader('Content-Length', '0')
-      res.end()
-      return
-    }
-
-    var forwardError = !fallthrough
-    var originalUrl = parseUrl.original(req)
-    var path = parseUrl(req).pathname
-
-    // make sure redirect occurs at mount
-    if (path === '/' && originalUrl.pathname.substr(-1) !== '/') {
-      path = ''
-    }
-
-    // create send stream
-    var stream = send(req, path, opts)
-
-    // add directory handler
-    stream.on('directory', onDirectory)
-
-    // add headers listener
-    if (setHeaders) {
-      stream.on('headers', setHeaders)
-    }
-
-    // add file listener for fallthrough
-    if (fallthrough) {
-      stream.on('file', function onFile () {
-        // once file is determined, always forward error
-        forwardError = true
-      })
-    }
-
-    // forward errors
-    stream.on('error', function error (err) {
-      if (forwardError || !(err.statusCode < 500)) {
-        next(err)
-        return
-      }
-
-      next()
-    })
-
-    // pipe
-    stream.pipe(res)
-  }
-}
-
-/**
- * Collapse all leading slashes into a single slash
- * @private
- */
-function collapseLeadingSlashes (str) {
-  for (var i = 0; i < str.length; i++) {
-    if (str.charCodeAt(i) !== 0x2f /* / */) {
-      break
-    }
-  }
-
-  return i > 1
-    ? '/' + str.substr(i)
-    : str
-}
-
-/**
- * Create a minimal HTML document.
- *
- * @param {string} title
- * @param {string} body
- * @private
- */
-
-function createHtmlDocument (title, body) {
-  return '<!DOCTYPE html>\n' +
-    '<html lang="en">\n' +
-    '<head>\n' +
-    '<meta charset="utf-8">\n' +
-    '<title>' + title + '</title>\n' +
-    '</head>\n' +
-    '<body>\n' +
-    '<pre>' + body + '</pre>\n' +
-    '</body>\n' +
-    '</html>\n'
-}
-
-/**
- * Create a directory listener that just 404s.
- * @private
- */
-
-function createNotFoundDirectoryListener () {
-  return function notFound () {
-    this.error(404)
-  }
-}
-
-/**
- * Create a directory listener that performs a redirect.
- * @private
- */
-
-function createRedirectDirectoryListener () {
-  return function redirect (res) {
-    if (this.hasTrailingSlash()) {
-      this.error(404)
-      return
-    }
-
-    // get original URL
-    var originalUrl = parseUrl.original(this.req)
-
-    // append trailing slash
-    originalUrl.path = null
-    originalUrl.pathname = collapseLeadingSlashes(originalUrl.pathname + '/')
-
-    // reformat the URL
-    var loc = encodeUrl(url.format(originalUrl))
-    var doc = createHtmlDocument('Redirecting', 'Redirecting to ' + escapeHtml(loc))
-
-    // send redirect response
-    res.statusCode = 301
-    res.setHeader('Content-Type', 'text/html; charset=UTF-8')
-    res.setHeader('Content-Length', Buffer.byteLength(doc))
-    res.setHeader('Content-Security-Policy', "default-src 'none'")
-    res.setHeader('X-Content-Type-Options', 'nosniff')
-    res.setHeader('Location', loc)
-    res.end(doc)
-  }
-}
diff --git a/node_modules/serve-static/package.json b/node_modules/serve-static/package.json
deleted file mode 100644
index 49d7542351e8f02de0439c66bd2ff3cd1ffd6299..0000000000000000000000000000000000000000
--- a/node_modules/serve-static/package.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
-  "name": "serve-static",
-  "description": "Serve static files",
-  "version": "1.16.2",
-  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
-  "license": "MIT",
-  "repository": "expressjs/serve-static",
-  "dependencies": {
-    "encodeurl": "~2.0.0",
-    "escape-html": "~1.0.3",
-    "parseurl": "~1.3.3",
-    "send": "0.19.0"
-  },
-  "devDependencies": {
-    "eslint": "7.32.0",
-    "eslint-config-standard": "14.1.1",
-    "eslint-plugin-import": "2.25.4",
-    "eslint-plugin-markdown": "2.2.1",
-    "eslint-plugin-node": "11.1.0",
-    "eslint-plugin-promise": "5.2.0",
-    "eslint-plugin-standard": "4.1.0",
-    "mocha": "9.2.2",
-    "nyc": "15.1.0",
-    "safe-buffer": "5.2.1",
-    "supertest": "6.2.2"
-  },
-  "files": [
-    "LICENSE",
-    "HISTORY.md",
-    "index.js"
-  ],
-  "engines": {
-    "node": ">= 0.8.0"
-  },
-  "scripts": {
-    "lint": "eslint .",
-    "test": "mocha --reporter spec --bail --check-leaks test/",
-    "test-ci": "nyc --reporter=lcov --reporter=text npm test",
-    "test-cov": "nyc --reporter=html --reporter=text npm test",
-    "version": "node scripts/version-history.js && git add HISTORY.md"
-  }
-}
diff --git a/node_modules/simple-update-notifier/LICENSE b/node_modules/simple-update-notifier/LICENSE
deleted file mode 100644
index 1e0b0c116923cb899cb0ebc49528551dde1f6ab9..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2022 Alex Brazier
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/node_modules/simple-update-notifier/README.md b/node_modules/simple-update-notifier/README.md
deleted file mode 100644
index ec177944638c4be4d4d8cf639d00bab0cc774acc..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/README.md
+++ /dev/null
@@ -1,82 +0,0 @@
-# simple-update-notifier [![GitHub stars](https://img.shields.io/github/stars/alexbrazier/simple-update-notifier?label=Star%20Project&style=social)](https://github.com/alexbrazier/simple-update-notifier/stargazers)
-
-[![CI](https://github.com/alexbrazier/simple-update-notifier/workflows/Build%20and%20Deploy/badge.svg)](https://github.com/alexbrazier/simple-update-notifier/actions)
-[![Dependencies](https://img.shields.io/librariesio/release/npm/simple-update-notifier)](https://www.npmjs.com/package/simple-update-notifier?activeTab=dependencies)
-[![npm](https://img.shields.io/npm/v/simple-update-notifier)](https://www.npmjs.com/package/simple-update-notifier)
-[![npm bundle size](https://img.shields.io/bundlephobia/min/simple-update-notifier)](https://bundlephobia.com/result?p=simple-update-notifier)
-[![npm downloads](https://img.shields.io/npm/dw/simple-update-notifier)](https://www.npmjs.com/package/simple-update-notifier)
-[![License](https://img.shields.io/npm/l/simple-update-notifier)](./LICENSE)
-
-Simple update notifier to check for npm updates for cli applications.
-
-<img src="./.github/demo.png" alt="Demo in terminal showing an update is required">
-
-Checks for updates for an npm module and outputs to the command line if there is one available. The result is cached for the specified time so it doesn't check every time the app runs.
-
-## Install
-
-```bash
-npm install simple-update-notifier
-OR
-yarn add simple-update-notifier
-```
-
-## Usage
-
-```js
-import updateNotifier from 'simple-update-notifier';
-import packageJson from './package.json' assert { type: 'json' };
-
-updateNotifier({ pkg: packageJson });
-```
-
-### Options
-
-#### pkg
-
-Type: `object`
-
-##### name
-
-_Required_\
-Type: `string`
-
-##### version
-
-_Required_\
-Type: `string`
-
-#### updateCheckInterval
-
-Type: `number`\
-Default: `1000 * 60 * 60 * 24` _(1 day)_
-
-How often to check for updates.
-
-#### shouldNotifyInNpmScript
-
-Type: `boolean`\
-Default: `false`
-
-Allows notification to be shown when running as an npm script.
-
-#### distTag
-
-Type: `string`\
-Default: `'latest'`
-
-Which [dist-tag](https://docs.npmjs.com/adding-dist-tags-to-packages) to use to find the latest version.
-
-#### alwaysRun
-
-Type: `boolean`\
-Default: `false`
-
-When set, `updateCheckInterval` will not be respected and a check for an update will always be performed.
-
-#### debug
-
-Type: `boolean`\
-Default: `false`
-
-When set, logs explaining the decision will be output to `stderr` whenever the module opts to not print an update notification
diff --git a/node_modules/simple-update-notifier/build/index.d.ts b/node_modules/simple-update-notifier/build/index.d.ts
deleted file mode 100644
index 60f53e0560e592029577d1e0c965d55c252b5e36..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/build/index.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-interface IUpdate {
-    pkg: {
-        name: string;
-        version: string;
-    };
-    updateCheckInterval?: number;
-    shouldNotifyInNpmScript?: boolean;
-    distTag?: string;
-    alwaysRun?: boolean;
-    debug?: boolean;
-}
-declare const simpleUpdateNotifier: (args: IUpdate) => Promise<void>;
-export { simpleUpdateNotifier as default };
diff --git a/node_modules/simple-update-notifier/build/index.js b/node_modules/simple-update-notifier/build/index.js
deleted file mode 100644
index 090f9df6cba465f6dd5204106f9ad19ac791d523..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/build/index.js
+++ /dev/null
@@ -1,210 +0,0 @@
-'use strict';
-
-var process$1 = require('process');
-var semver = require('semver');
-var os = require('os');
-var path = require('path');
-var fs = require('fs');
-var https = require('https');
-
-/******************************************************************************
-Copyright (c) Microsoft Corporation.
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
-AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-
-function __awaiter(thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-}
-
-function __generator(thisArg, body) {
-    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
-    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
-    function verb(n) { return function (v) { return step([n, v]); }; }
-    function step(op) {
-        if (f) throw new TypeError("Generator is already executing.");
-        while (g && (g = 0, op[0] && (_ = 0)), _) try {
-            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
-            if (y = 0, t) op = [op[0] & 2, t.value];
-            switch (op[0]) {
-                case 0: case 1: t = op; break;
-                case 4: _.label++; return { value: op[1], done: false };
-                case 5: _.label++; y = op[1]; op = [0]; continue;
-                case 7: op = _.ops.pop(); _.trys.pop(); continue;
-                default:
-                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
-                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
-                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
-                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
-                    if (t[2]) _.ops.pop();
-                    _.trys.pop(); continue;
-            }
-            op = body.call(thisArg, _);
-        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
-        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
-    }
-}
-
-var packageJson = process$1.env.npm_package_json;
-var userAgent = process$1.env.npm_config_user_agent;
-var isNpm6 = Boolean(userAgent && userAgent.startsWith('npm'));
-var isNpm7 = Boolean(packageJson && packageJson.endsWith('package.json'));
-var isNpm = isNpm6 || isNpm7;
-var isYarn = Boolean(userAgent && userAgent.startsWith('yarn'));
-var isNpmOrYarn = isNpm || isYarn;
-
-var homeDirectory = os.homedir();
-var configDir = process.env.XDG_CONFIG_HOME ||
-    path.join(homeDirectory, '.config', 'simple-update-notifier');
-var getConfigFile = function (packageName) {
-    return path.join(configDir, "".concat(packageName.replace('@', '').replace('/', '__'), ".json"));
-};
-var createConfigDir = function () {
-    if (!fs.existsSync(configDir)) {
-        fs.mkdirSync(configDir, { recursive: true });
-    }
-};
-var getLastUpdate = function (packageName) {
-    var configFile = getConfigFile(packageName);
-    try {
-        if (!fs.existsSync(configFile)) {
-            return undefined;
-        }
-        var file = JSON.parse(fs.readFileSync(configFile, 'utf8'));
-        return file.lastUpdateCheck;
-    }
-    catch (_a) {
-        return undefined;
-    }
-};
-var saveLastUpdate = function (packageName) {
-    var configFile = getConfigFile(packageName);
-    fs.writeFileSync(configFile, JSON.stringify({ lastUpdateCheck: new Date().getTime() }));
-};
-
-var getDistVersion = function (packageName, distTag) { return __awaiter(void 0, void 0, void 0, function () {
-    var url;
-    return __generator(this, function (_a) {
-        url = "https://registry.npmjs.org/-/package/".concat(packageName, "/dist-tags");
-        return [2 /*return*/, new Promise(function (resolve, reject) {
-                https
-                    .get(url, function (res) {
-                    var body = '';
-                    res.on('data', function (chunk) { return (body += chunk); });
-                    res.on('end', function () {
-                        try {
-                            var json = JSON.parse(body);
-                            var version = json[distTag];
-                            if (!version) {
-                                reject(new Error('Error getting version'));
-                            }
-                            resolve(version);
-                        }
-                        catch (_a) {
-                            reject(new Error('Could not parse version response'));
-                        }
-                    });
-                })
-                    .on('error', function (err) { return reject(err); });
-            })];
-    });
-}); };
-
-var hasNewVersion = function (_a) {
-    var pkg = _a.pkg, _b = _a.updateCheckInterval, updateCheckInterval = _b === void 0 ? 1000 * 60 * 60 * 24 : _b, _c = _a.distTag, distTag = _c === void 0 ? 'latest' : _c, alwaysRun = _a.alwaysRun, debug = _a.debug;
-    return __awaiter(void 0, void 0, void 0, function () {
-        var lastUpdateCheck, latestVersion;
-        return __generator(this, function (_d) {
-            switch (_d.label) {
-                case 0:
-                    createConfigDir();
-                    lastUpdateCheck = getLastUpdate(pkg.name);
-                    if (!(alwaysRun ||
-                        !lastUpdateCheck ||
-                        lastUpdateCheck < new Date().getTime() - updateCheckInterval)) return [3 /*break*/, 2];
-                    return [4 /*yield*/, getDistVersion(pkg.name, distTag)];
-                case 1:
-                    latestVersion = _d.sent();
-                    saveLastUpdate(pkg.name);
-                    if (semver.gt(latestVersion, pkg.version)) {
-                        return [2 /*return*/, latestVersion];
-                    }
-                    else if (debug) {
-                        console.error("Latest version (".concat(latestVersion, ") not newer than current version (").concat(pkg.version, ")"));
-                    }
-                    return [3 /*break*/, 3];
-                case 2:
-                    if (debug) {
-                        console.error("Too recent to check for a new update. simpleUpdateNotifier() interval set to ".concat(updateCheckInterval, "ms but only ").concat(new Date().getTime() - lastUpdateCheck, "ms since last check."));
-                    }
-                    _d.label = 3;
-                case 3: return [2 /*return*/, false];
-            }
-        });
-    });
-};
-
-var borderedText = function (text) {
-    var lines = text.split('\n');
-    var width = Math.max.apply(Math, lines.map(function (l) { return l.length; }));
-    var res = ["\u250C".concat('─'.repeat(width + 2), "\u2510")];
-    for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) {
-        var line = lines_1[_i];
-        res.push("\u2502 ".concat(line.padEnd(width), " \u2502"));
-    }
-    res.push("\u2514".concat('─'.repeat(width + 2), "\u2518"));
-    return res.join('\n');
-};
-
-var simpleUpdateNotifier = function (args) { return __awaiter(void 0, void 0, void 0, function () {
-    var latestVersion, err_1;
-    return __generator(this, function (_a) {
-        switch (_a.label) {
-            case 0:
-                if (!args.alwaysRun &&
-                    (!process.stdout.isTTY || (isNpmOrYarn && !args.shouldNotifyInNpmScript))) {
-                    if (args.debug) {
-                        console.error('Opting out of running simpleUpdateNotifier()');
-                    }
-                    return [2 /*return*/];
-                }
-                _a.label = 1;
-            case 1:
-                _a.trys.push([1, 3, , 4]);
-                return [4 /*yield*/, hasNewVersion(args)];
-            case 2:
-                latestVersion = _a.sent();
-                if (latestVersion) {
-                    console.error(borderedText("New version of ".concat(args.pkg.name, " available!\nCurrent Version: ").concat(args.pkg.version, "\nLatest Version: ").concat(latestVersion)));
-                }
-                return [3 /*break*/, 4];
-            case 3:
-                err_1 = _a.sent();
-                // Catch any network errors or cache writing errors so module doesn't cause a crash
-                if (args.debug && err_1 instanceof Error) {
-                    console.error('Unexpected error in simpleUpdateNotifier():', err_1);
-                }
-                return [3 /*break*/, 4];
-            case 4: return [2 /*return*/];
-        }
-    });
-}); };
-
-module.exports = simpleUpdateNotifier;
diff --git a/node_modules/simple-update-notifier/package.json b/node_modules/simple-update-notifier/package.json
deleted file mode 100644
index 4d710a72e90eba53c3e080174ce488e85608e6d4..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/package.json
+++ /dev/null
@@ -1,100 +0,0 @@
-{
-  "name": "simple-update-notifier",
-  "version": "2.0.0",
-  "description": "Simple update notifier to check for npm updates for cli applications",
-  "main": "build/index.js",
-  "types": "build/index.d.ts",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/alexbrazier/simple-update-notifier.git"
-  },
-  "homepage": "https://github.com/alexbrazier/simple-update-notifier.git",
-  "author": "alexbrazier",
-  "license": "MIT",
-  "engines": {
-    "node": ">=10"
-  },
-  "scripts": {
-    "test": "jest src --noStackTrace",
-    "build": "rollup -c rollup.config.js --bundleConfigAsCjs",
-    "prettier:check": "prettier --check src/**/*.ts",
-    "prettier": "prettier --write src/**/*.ts",
-    "eslint": "eslint src/**/*.ts",
-    "lint": "yarn prettier:check && yarn eslint",
-    "prepare": "yarn lint && yarn build",
-    "release": "release-it"
-  },
-  "dependencies": {
-    "semver": "^7.5.3"
-  },
-  "devDependencies": {
-    "@babel/preset-env": "^7.22.5",
-    "@babel/preset-typescript": "^7.22.5",
-    "@release-it/conventional-changelog": "^5.1.1",
-    "@types/jest": "^29.5.2",
-    "@types/node": "^20.3.1",
-    "@typescript-eslint/eslint-plugin": "^5.60.0",
-    "@typescript-eslint/parser": "^5.60.0",
-    "eslint": "^8.43.0",
-    "eslint-config-prettier": "^8.8.0",
-    "eslint-plugin-prettier": "^4.0.0",
-    "jest": "^29.5.0",
-    "prettier": "^2.8.8",
-    "release-it": "^15.11.0",
-    "rollup": "^3.25.2",
-    "rollup-plugin-ts": "^3.2.0",
-    "typescript": "^5.1.3"
-  },
-  "resolutions": {
-    "semver": "^7.5.3"
-  },
-  "publishConfig": {
-    "registry": "https://registry.npmjs.org/"
-  },
-  "files": [
-    "build",
-    "src"
-  ],
-  "release-it": {
-    "git": {
-      "commitMessage": "chore: release ${version}",
-      "tagName": "v${version}"
-    },
-    "npm": {
-      "publish": true
-    },
-    "github": {
-      "release": true
-    },
-    "plugins": {
-      "@release-it/conventional-changelog": {
-        "preset": "angular",
-        "infile": "CHANGELOG.md"
-      }
-    }
-  },
-  "eslintConfig": {
-    "plugins": [
-      "@typescript-eslint",
-      "prettier"
-    ],
-    "extends": [
-      "prettier",
-      "eslint:recommended",
-      "plugin:@typescript-eslint/recommended"
-    ],
-    "parser": "@typescript-eslint/parser",
-    "rules": {
-      "prettier/prettier": [
-        "error",
-        {
-          "quoteProps": "consistent",
-          "singleQuote": true,
-          "tabWidth": 2,
-          "trailingComma": "es5",
-          "useTabs": false
-        }
-      ]
-    }
-  }
-}
diff --git a/node_modules/simple-update-notifier/src/borderedText.ts b/node_modules/simple-update-notifier/src/borderedText.ts
deleted file mode 100644
index 7145ac2f43189ec3c945d1009df3dfe3d4c92d36..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/src/borderedText.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-const borderedText = (text: string) => {
-  const lines = text.split('\n');
-  const width = Math.max(...lines.map((l) => l.length));
-  const res = [`┌${'─'.repeat(width + 2)}┐`];
-  for (const line of lines) {
-    res.push(`│ ${line.padEnd(width)} │`);
-  }
-  res.push(`└${'─'.repeat(width + 2)}┘`);
-  return res.join('\n');
-};
-
-export default borderedText;
diff --git a/node_modules/simple-update-notifier/src/cache.spec.ts b/node_modules/simple-update-notifier/src/cache.spec.ts
deleted file mode 100644
index 49e1cb276993af3991196dca44a43f9f14da17a9..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/src/cache.spec.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { createConfigDir, getLastUpdate, saveLastUpdate } from './cache';
-
-createConfigDir();
-
-jest.useFakeTimers().setSystemTime(new Date('2022-01-01'));
-
-const fakeTime = new Date('2022-01-01').getTime();
-
-test('can save update then get the update details', () => {
-  saveLastUpdate('test');
-  expect(getLastUpdate('test')).toBe(fakeTime);
-});
-
-test('prefixed module can save update then get the update details', () => {
-  saveLastUpdate('@alexbrazier/test');
-  expect(getLastUpdate('@alexbrazier/test')).toBe(fakeTime);
-});
diff --git a/node_modules/simple-update-notifier/src/cache.ts b/node_modules/simple-update-notifier/src/cache.ts
deleted file mode 100644
index e11deba0ae1e8694311a9cc792014d727534d0df..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/src/cache.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import os from 'os';
-import path from 'path';
-import fs from 'fs';
-
-const homeDirectory = os.homedir();
-const configDir =
-  process.env.XDG_CONFIG_HOME ||
-  path.join(homeDirectory, '.config', 'simple-update-notifier');
-
-const getConfigFile = (packageName: string) => {
-  return path.join(
-    configDir,
-    `${packageName.replace('@', '').replace('/', '__')}.json`
-  );
-};
-
-export const createConfigDir = () => {
-  if (!fs.existsSync(configDir)) {
-    fs.mkdirSync(configDir, { recursive: true });
-  }
-};
-
-export const getLastUpdate = (packageName: string) => {
-  const configFile = getConfigFile(packageName);
-
-  try {
-    if (!fs.existsSync(configFile)) {
-      return undefined;
-    }
-    const file = JSON.parse(fs.readFileSync(configFile, 'utf8'));
-    return file.lastUpdateCheck as number;
-  } catch {
-    return undefined;
-  }
-};
-
-export const saveLastUpdate = (packageName: string) => {
-  const configFile = getConfigFile(packageName);
-
-  fs.writeFileSync(
-    configFile,
-    JSON.stringify({ lastUpdateCheck: new Date().getTime() })
-  );
-};
diff --git a/node_modules/simple-update-notifier/src/getDistVersion.spec.ts b/node_modules/simple-update-notifier/src/getDistVersion.spec.ts
deleted file mode 100644
index b78a42e5aa90f08aa6508eb9243e612b8f7c9040..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/src/getDistVersion.spec.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import Stream from 'stream';
-import https from 'https';
-import getDistVersion from './getDistVersion';
-
-jest.mock('https', () => ({
-  get: jest.fn(),
-}));
-
-test('Valid response returns version', async () => {
-  const st = new Stream();
-  (https.get as jest.Mock).mockImplementation((url, cb) => {
-    cb(st);
-
-    st.emit('data', '{"latest":"1.0.0"}');
-    st.emit('end');
-  });
-
-  const version = await getDistVersion('test', 'latest');
-
-  expect(version).toEqual('1.0.0');
-});
-
-test('Invalid response throws error', async () => {
-  const st = new Stream();
-  (https.get as jest.Mock).mockImplementation((url, cb) => {
-    cb(st);
-
-    st.emit('data', 'some invalid json');
-    st.emit('end');
-  });
-
-  expect(getDistVersion('test', 'latest')).rejects.toThrow(
-    'Could not parse version response'
-  );
-});
diff --git a/node_modules/simple-update-notifier/src/getDistVersion.ts b/node_modules/simple-update-notifier/src/getDistVersion.ts
deleted file mode 100644
index d474e1f9ead19135a390c930e5801f4e6910c0a4..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/src/getDistVersion.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import https from 'https';
-
-const getDistVersion = async (packageName: string, distTag: string) => {
-  const url = `https://registry.npmjs.org/-/package/${packageName}/dist-tags`;
-
-  return new Promise<string>((resolve, reject) => {
-    https
-      .get(url, (res) => {
-        let body = '';
-
-        res.on('data', (chunk) => (body += chunk));
-        res.on('end', () => {
-          try {
-            const json = JSON.parse(body);
-            const version = json[distTag];
-            if (!version) {
-              reject(new Error('Error getting version'));
-            }
-            resolve(version);
-          } catch {
-            reject(new Error('Could not parse version response'));
-          }
-        });
-      })
-      .on('error', (err) => reject(err));
-  });
-};
-
-export default getDistVersion;
diff --git a/node_modules/simple-update-notifier/src/hasNewVersion.spec.ts b/node_modules/simple-update-notifier/src/hasNewVersion.spec.ts
deleted file mode 100644
index af7ab22cacee30687de862601171a819fd95c782..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/src/hasNewVersion.spec.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import hasNewVersion from './hasNewVersion';
-import { getLastUpdate } from './cache';
-import getDistVersion from './getDistVersion';
-
-jest.mock('./getDistVersion', () => jest.fn().mockReturnValue('1.0.0'));
-jest.mock('./cache', () => ({
-  getLastUpdate: jest.fn().mockReturnValue(undefined),
-  createConfigDir: jest.fn(),
-  saveLastUpdate: jest.fn(),
-}));
-
-const pkg = { name: 'test', version: '1.0.0' };
-
-afterEach(() => jest.clearAllMocks());
-
-const defaultArgs = {
-  pkg,
-  shouldNotifyInNpmScript: true,
-  alwaysRun: true,
-};
-
-test('it should not trigger update for same version', async () => {
-  const newVersion = await hasNewVersion(defaultArgs);
-
-  expect(newVersion).toBe(false);
-});
-
-test('it should trigger update for patch version bump', async () => {
-  (getDistVersion as jest.Mock).mockReturnValue('1.0.1');
-
-  const newVersion = await hasNewVersion(defaultArgs);
-
-  expect(newVersion).toBe('1.0.1');
-});
-
-test('it should trigger update for minor version bump', async () => {
-  (getDistVersion as jest.Mock).mockReturnValue('1.1.0');
-
-  const newVersion = await hasNewVersion(defaultArgs);
-
-  expect(newVersion).toBe('1.1.0');
-});
-
-test('it should trigger update for major version bump', async () => {
-  (getDistVersion as jest.Mock).mockReturnValue('2.0.0');
-
-  const newVersion = await hasNewVersion(defaultArgs);
-
-  expect(newVersion).toBe('2.0.0');
-});
-
-test('it should not trigger update if version is lower', async () => {
-  (getDistVersion as jest.Mock).mockReturnValue('0.0.9');
-
-  const newVersion = await hasNewVersion(defaultArgs);
-
-  expect(newVersion).toBe(false);
-});
-
-it('should trigger update check if last update older than config', async () => {
-  const TWO_WEEKS = new Date().getTime() - 1000 * 60 * 60 * 24 * 14;
-  (getLastUpdate as jest.Mock).mockReturnValue(TWO_WEEKS);
-  const newVersion = await hasNewVersion({
-    pkg,
-    shouldNotifyInNpmScript: true,
-  });
-
-  expect(newVersion).toBe(false);
-  expect(getDistVersion).toHaveBeenCalled();
-});
-
-it('should not trigger update check if last update is too recent', async () => {
-  const TWELVE_HOURS = new Date().getTime() - 1000 * 60 * 60 * 12;
-  (getLastUpdate as jest.Mock).mockReturnValue(TWELVE_HOURS);
-  const newVersion = await hasNewVersion({
-    pkg,
-    shouldNotifyInNpmScript: true,
-  });
-
-  expect(newVersion).toBe(false);
-  expect(getDistVersion).not.toHaveBeenCalled();
-});
diff --git a/node_modules/simple-update-notifier/src/hasNewVersion.ts b/node_modules/simple-update-notifier/src/hasNewVersion.ts
deleted file mode 100644
index 31d5069f97d3abf90d2c105374c21c44bde35b82..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/src/hasNewVersion.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import semver from 'semver';
-import { createConfigDir, getLastUpdate, saveLastUpdate } from './cache';
-import getDistVersion from './getDistVersion';
-import { IUpdate } from './types';
-
-const hasNewVersion = async ({
-  pkg,
-  updateCheckInterval = 1000 * 60 * 60 * 24,
-  distTag = 'latest',
-  alwaysRun,
-  debug,
-}: IUpdate) => {
-  createConfigDir();
-  const lastUpdateCheck = getLastUpdate(pkg.name);
-  if (
-    alwaysRun ||
-    !lastUpdateCheck ||
-    lastUpdateCheck < new Date().getTime() - updateCheckInterval
-  ) {
-    const latestVersion = await getDistVersion(pkg.name, distTag);
-    saveLastUpdate(pkg.name);
-    if (semver.gt(latestVersion, pkg.version)) {
-      return latestVersion;
-    } else if (debug) {
-      console.error(
-        `Latest version (${latestVersion}) not newer than current version (${pkg.version})`
-      );
-    }
-  } else if (debug) {
-    console.error(
-      `Too recent to check for a new update. simpleUpdateNotifier() interval set to ${updateCheckInterval}ms but only ${
-        new Date().getTime() - lastUpdateCheck
-      }ms since last check.`
-    );
-  }
-
-  return false;
-};
-
-export default hasNewVersion;
diff --git a/node_modules/simple-update-notifier/src/index.spec.ts b/node_modules/simple-update-notifier/src/index.spec.ts
deleted file mode 100644
index 98ffb5a9201cc15e27251e3bbe4f190a422ab0eb..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/src/index.spec.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import simpleUpdateNotifier from '.';
-import hasNewVersion from './hasNewVersion';
-
-const consoleSpy = jest.spyOn(console, 'error');
-
-jest.mock('./hasNewVersion', () => jest.fn().mockResolvedValue('2.0.0'));
-
-beforeEach(jest.clearAllMocks);
-
-test('it logs message if update is available', async () => {
-  await simpleUpdateNotifier({
-    pkg: { name: 'test', version: '1.0.0' },
-    alwaysRun: true,
-  });
-
-  expect(consoleSpy).toHaveBeenCalledTimes(1);
-});
-
-test('it does not log message if update is not available', async () => {
-  (hasNewVersion as jest.Mock).mockResolvedValue(false);
-  await simpleUpdateNotifier({
-    pkg: { name: 'test', version: '2.0.0' },
-    alwaysRun: true,
-  });
-
-  expect(consoleSpy).toHaveBeenCalledTimes(0);
-});
diff --git a/node_modules/simple-update-notifier/src/index.ts b/node_modules/simple-update-notifier/src/index.ts
deleted file mode 100644
index 2b0d2cfcd7a4d1596e2257c7fe0d73cdf9bb49e4..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/src/index.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import isNpmOrYarn from './isNpmOrYarn';
-import hasNewVersion from './hasNewVersion';
-import { IUpdate } from './types';
-import borderedText from './borderedText';
-
-const simpleUpdateNotifier = async (args: IUpdate) => {
-  if (
-    !args.alwaysRun &&
-    (!process.stdout.isTTY || (isNpmOrYarn && !args.shouldNotifyInNpmScript))
-  ) {
-    if (args.debug) {
-      console.error('Opting out of running simpleUpdateNotifier()');
-    }
-    return;
-  }
-
-  try {
-    const latestVersion = await hasNewVersion(args);
-    if (latestVersion) {
-      console.error(
-        borderedText(`New version of ${args.pkg.name} available!
-Current Version: ${args.pkg.version}
-Latest Version: ${latestVersion}`)
-      );
-    }
-  } catch (err) {
-    // Catch any network errors or cache writing errors so module doesn't cause a crash
-    if (args.debug && err instanceof Error) {
-      console.error('Unexpected error in simpleUpdateNotifier():', err);
-    }
-  }
-};
-
-export default simpleUpdateNotifier;
diff --git a/node_modules/simple-update-notifier/src/isNpmOrYarn.ts b/node_modules/simple-update-notifier/src/isNpmOrYarn.ts
deleted file mode 100644
index ee4c8371afc074e93c8bd48bfe6ba9257c19cbee..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/src/isNpmOrYarn.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import process from 'process';
-
-const packageJson = process.env.npm_package_json;
-const userAgent = process.env.npm_config_user_agent;
-const isNpm6 = Boolean(userAgent && userAgent.startsWith('npm'));
-const isNpm7 = Boolean(packageJson && packageJson.endsWith('package.json'));
-
-const isNpm = isNpm6 || isNpm7;
-const isYarn = Boolean(userAgent && userAgent.startsWith('yarn'));
-const isNpmOrYarn = isNpm || isYarn;
-
-export default isNpmOrYarn;
diff --git a/node_modules/simple-update-notifier/src/types.ts b/node_modules/simple-update-notifier/src/types.ts
deleted file mode 100644
index c395eb002762d0d4cca2b254b073b33db8b83da4..0000000000000000000000000000000000000000
--- a/node_modules/simple-update-notifier/src/types.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export interface IUpdate {
-  pkg: { name: string; version: string };
-  updateCheckInterval?: number;
-  shouldNotifyInNpmScript?: boolean;
-  distTag?: string;
-  alwaysRun?: boolean;
-  debug?: boolean;
-}
diff --git a/node_modules/string_decoder/.npmignore b/node_modules/string_decoder/.npmignore
deleted file mode 100644
index 206320cc1d21b9cc9e3e0e8a303896045453c524..0000000000000000000000000000000000000000
--- a/node_modules/string_decoder/.npmignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build
-test
diff --git a/node_modules/string_decoder/LICENSE b/node_modules/string_decoder/LICENSE
deleted file mode 100644
index 6de584a48f5c897d27bfe9922f976297c07cae02..0000000000000000000000000000000000000000
--- a/node_modules/string_decoder/LICENSE
+++ /dev/null
@@ -1,20 +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.
diff --git a/node_modules/string_decoder/README.md b/node_modules/string_decoder/README.md
deleted file mode 100644
index 4d2aa001501107cd2792f385ad62237dc3757521..0000000000000000000000000000000000000000
--- a/node_modules/string_decoder/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-**string_decoder.js** (`require('string_decoder')`) from Node.js core
-
-Copyright Joyent, Inc. and other Node contributors. See LICENCE file for details.
-
-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. **Prefer the stable version over the unstable.**
-
-The *build/* directory contains a build script that will scrape the source from the [joyent/node](https://github.com/joyent/node) repo given a specific Node version.
\ No newline at end of file
diff --git a/node_modules/string_decoder/index.js b/node_modules/string_decoder/index.js
deleted file mode 100644
index b00e54fb7909827a02b6fa96ef55bd4dd85a3fe7..0000000000000000000000000000000000000000
--- a/node_modules/string_decoder/index.js
+++ /dev/null
@@ -1,221 +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.
-
-var Buffer = require('buffer').Buffer;
-
-var isBufferEncoding = Buffer.isEncoding
-  || function(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 assertEncoding(encoding) {
-  if (encoding && !isBufferEncoding(encoding)) {
-    throw new Error('Unknown encoding: ' + encoding);
-  }
-}
-
-// StringDecoder provides an interface for efficiently splitting a series of
-// buffers into a series of JS strings without breaking apart multi-byte
-// characters. CESU-8 is handled as part of the UTF-8 encoding.
-//
-// @TODO Handling all encodings inside a single object makes it very difficult
-// to reason about this code, so it should be split up in the future.
-// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code
-// points as used by CESU-8.
-var StringDecoder = exports.StringDecoder = function(encoding) {
-  this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
-  assertEncoding(encoding);
-  switch (this.encoding) {
-    case 'utf8':
-      // CESU-8 represents each of Surrogate Pair by 3-bytes
-      this.surrogateSize = 3;
-      break;
-    case 'ucs2':
-    case 'utf16le':
-      // UTF-16 represents each of Surrogate Pair by 2-bytes
-      this.surrogateSize = 2;
-      this.detectIncompleteChar = utf16DetectIncompleteChar;
-      break;
-    case 'base64':
-      // Base-64 stores 3 bytes in 4 chars, and pads the remainder.
-      this.surrogateSize = 3;
-      this.detectIncompleteChar = base64DetectIncompleteChar;
-      break;
-    default:
-      this.write = passThroughWrite;
-      return;
-  }
-
-  // Enough space to store all bytes of a single character. UTF-8 needs 4
-  // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).
-  this.charBuffer = new Buffer(6);
-  // Number of bytes received for the current incomplete multi-byte character.
-  this.charReceived = 0;
-  // Number of bytes expected for the current incomplete multi-byte character.
-  this.charLength = 0;
-};
-
-
-// write decodes the given buffer and returns it as JS string that is
-// guaranteed to not contain any partial multi-byte characters. Any partial
-// character found at the end of the buffer is buffered up, and will be
-// returned when calling write again with the remaining bytes.
-//
-// Note: Converting a Buffer containing an orphan surrogate to a String
-// currently works, but converting a String to a Buffer (via `new Buffer`, or
-// Buffer#write) will replace incomplete surrogates with the unicode
-// replacement character. See https://codereview.chromium.org/121173009/ .
-StringDecoder.prototype.write = function(buffer) {
-  var charStr = '';
-  // if our last write ended with an incomplete multibyte character
-  while (this.charLength) {
-    // determine how many remaining bytes this buffer has to offer for this char
-    var available = (buffer.length >= this.charLength - this.charReceived) ?
-        this.charLength - this.charReceived :
-        buffer.length;
-
-    // add the new bytes to the char buffer
-    buffer.copy(this.charBuffer, this.charReceived, 0, available);
-    this.charReceived += available;
-
-    if (this.charReceived < this.charLength) {
-      // still not enough chars in this buffer? wait for more ...
-      return '';
-    }
-
-    // remove bytes belonging to the current character from the buffer
-    buffer = buffer.slice(available, buffer.length);
-
-    // get the character that was split
-    charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);
-
-    // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
-    var charCode = charStr.charCodeAt(charStr.length - 1);
-    if (charCode >= 0xD800 && charCode <= 0xDBFF) {
-      this.charLength += this.surrogateSize;
-      charStr = '';
-      continue;
-    }
-    this.charReceived = this.charLength = 0;
-
-    // if there are no more bytes in this buffer, just emit our char
-    if (buffer.length === 0) {
-      return charStr;
-    }
-    break;
-  }
-
-  // determine and set charLength / charReceived
-  this.detectIncompleteChar(buffer);
-
-  var end = buffer.length;
-  if (this.charLength) {
-    // buffer the incomplete character bytes we got
-    buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
-    end -= this.charReceived;
-  }
-
-  charStr += buffer.toString(this.encoding, 0, end);
-
-  var end = charStr.length - 1;
-  var charCode = charStr.charCodeAt(end);
-  // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
-  if (charCode >= 0xD800 && charCode <= 0xDBFF) {
-    var size = this.surrogateSize;
-    this.charLength += size;
-    this.charReceived += size;
-    this.charBuffer.copy(this.charBuffer, size, 0, size);
-    buffer.copy(this.charBuffer, 0, 0, size);
-    return charStr.substring(0, end);
-  }
-
-  // or just emit the charStr
-  return charStr;
-};
-
-// detectIncompleteChar determines if there is an incomplete UTF-8 character at
-// the end of the given buffer. If so, it sets this.charLength to the byte
-// length that character, and sets this.charReceived to the number of bytes
-// that are available for this character.
-StringDecoder.prototype.detectIncompleteChar = function(buffer) {
-  // determine how many bytes we have to check at the end of this buffer
-  var i = (buffer.length >= 3) ? 3 : buffer.length;
-
-  // Figure out if one of the last i bytes of our buffer announces an
-  // incomplete char.
-  for (; i > 0; i--) {
-    var c = buffer[buffer.length - i];
-
-    // See http://en.wikipedia.org/wiki/UTF-8#Description
-
-    // 110XXXXX
-    if (i == 1 && c >> 5 == 0x06) {
-      this.charLength = 2;
-      break;
-    }
-
-    // 1110XXXX
-    if (i <= 2 && c >> 4 == 0x0E) {
-      this.charLength = 3;
-      break;
-    }
-
-    // 11110XXX
-    if (i <= 3 && c >> 3 == 0x1E) {
-      this.charLength = 4;
-      break;
-    }
-  }
-  this.charReceived = i;
-};
-
-StringDecoder.prototype.end = function(buffer) {
-  var res = '';
-  if (buffer && buffer.length)
-    res = this.write(buffer);
-
-  if (this.charReceived) {
-    var cr = this.charReceived;
-    var buf = this.charBuffer;
-    var enc = this.encoding;
-    res += buf.slice(0, cr).toString(enc);
-  }
-
-  return res;
-};
-
-function passThroughWrite(buffer) {
-  return buffer.toString(this.encoding);
-}
-
-function utf16DetectIncompleteChar(buffer) {
-  this.charReceived = buffer.length % 2;
-  this.charLength = this.charReceived ? 2 : 0;
-}
-
-function base64DetectIncompleteChar(buffer) {
-  this.charReceived = buffer.length % 3;
-  this.charLength = this.charReceived ? 3 : 0;
-}
diff --git a/node_modules/string_decoder/package.json b/node_modules/string_decoder/package.json
deleted file mode 100644
index f2dd499c465d6fceaccda2bc6052f724a536a915..0000000000000000000000000000000000000000
--- a/node_modules/string_decoder/package.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "name": "string_decoder",
-  "version": "0.10.31",
-  "description": "The string_decoder module from Node core",
-  "main": "index.js",
-  "dependencies": {},
-  "devDependencies": {
-    "tap": "~0.4.8"
-  },
-  "scripts": {
-    "test": "tap test/simple/*.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/rvagg/string_decoder.git"
-  },
-  "homepage": "https://github.com/rvagg/string_decoder",
-  "keywords": [
-    "string",
-    "decoder",
-    "browser",
-    "browserify"
-  ],
-  "license": "MIT"
-}
diff --git a/node_modules/to-regex-range/LICENSE b/node_modules/to-regex-range/LICENSE
deleted file mode 100644
index 7cccaf9e345e50544c2e3215553395c2d37258a1..0000000000000000000000000000000000000000
--- a/node_modules/to-regex-range/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015-present, Jon Schlinkert.
-
-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/to-regex-range/README.md b/node_modules/to-regex-range/README.md
deleted file mode 100644
index 38887dafa1b41ef777de6d6f3658685eb5fd8b2f..0000000000000000000000000000000000000000
--- a/node_modules/to-regex-range/README.md
+++ /dev/null
@@ -1,305 +0,0 @@
-# to-regex-range [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W8YFZ425KND68) [![NPM version](https://img.shields.io/npm/v/to-regex-range.svg?style=flat)](https://www.npmjs.com/package/to-regex-range) [![NPM monthly downloads](https://img.shields.io/npm/dm/to-regex-range.svg?style=flat)](https://npmjs.org/package/to-regex-range) [![NPM total downloads](https://img.shields.io/npm/dt/to-regex-range.svg?style=flat)](https://npmjs.org/package/to-regex-range) [![Linux Build Status](https://img.shields.io/travis/micromatch/to-regex-range.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/to-regex-range)
-
-> Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than 2.78 million test assertions.
-
-Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
-
-## Install
-
-Install with [npm](https://www.npmjs.com/):
-
-```sh
-$ npm install --save to-regex-range
-```
-
-<details>
-<summary><strong>What does this do?</strong></summary>
-
-<br>
-
-This libary generates the `source` string to be passed to `new RegExp()` for matching a range of numbers.
-
-**Example**
-
-```js
-const toRegexRange = require('to-regex-range');
-const regex = new RegExp(toRegexRange('15', '95'));
-```
-
-A string is returned so that you can do whatever you need with it before passing it to `new RegExp()` (like adding `^` or `$` boundaries, defining flags, or combining it another string).
-
-<br>
-
-</details>
-
-<details>
-<summary><strong>Why use this library?</strong></summary>
-
-<br>
-
-### Convenience
-
-Creating regular expressions for matching numbers gets deceptively complicated pretty fast.
-
-For example, let's say you need a validation regex for matching part of a user-id, postal code, social security number, tax id, etc:
-
-* regex for matching `1` => `/1/` (easy enough)
-* regex for matching `1` through `5` => `/[1-5]/` (not bad...)
-* regex for matching `1` or `5` => `/(1|5)/` (still easy...)
-* regex for matching `1` through `50` => `/([1-9]|[1-4][0-9]|50)/` (uh-oh...)
-* regex for matching `1` through `55` => `/([1-9]|[1-4][0-9]|5[0-5])/` (no prob, I can do this...)
-* regex for matching `1` through `555` => `/([1-9]|[1-9][0-9]|[1-4][0-9]{2}|5[0-4][0-9]|55[0-5])/` (maybe not...)
-* regex for matching `0001` through `5555` => `/(0{3}[1-9]|0{2}[1-9][0-9]|0[1-9][0-9]{2}|[1-4][0-9]{3}|5[0-4][0-9]{2}|55[0-4][0-9]|555[0-5])/` (okay, I get the point!)
-
-The numbers are contrived, but they're also really basic. In the real world you might need to generate a regex on-the-fly for validation.
-
-**Learn more**
-
-If you're interested in learning more about [character classes](http://www.regular-expressions.info/charclass.html) and other regex features, I personally have always found [regular-expressions.info](http://www.regular-expressions.info/charclass.html) to be pretty useful.
-
-### Heavily tested
-
-As of April 07, 2019, this library runs [>1m test assertions](./test/test.js) against generated regex-ranges to provide brute-force verification that results are correct.
-
-Tests run in ~280ms on my MacBook Pro, 2.5 GHz Intel Core i7.
-
-### Optimized
-
-Generated regular expressions are optimized:
-
-* duplicate sequences and character classes are reduced using quantifiers
-* smart enough to use `?` conditionals when number(s) or range(s) can be positive or negative
-* uses fragment caching to avoid processing the same exact string more than once
-
-<br>
-
-</details>
-
-## Usage
-
-Add this library to your javascript application with the following line of code
-
-```js
-const toRegexRange = require('to-regex-range');
-```
-
-The main export is a function that takes two integers: the `min` value and `max` value (formatted as strings or numbers).
-
-```js
-const source = toRegexRange('15', '95');
-//=> 1[5-9]|[2-8][0-9]|9[0-5]
-
-const regex = new RegExp(`^${source}$`);
-console.log(regex.test('14')); //=> false
-console.log(regex.test('50')); //=> true
-console.log(regex.test('94')); //=> true
-console.log(regex.test('96')); //=> false
-```
-
-## Options
-
-### options.capture
-
-**Type**: `boolean`
-
-**Deafault**: `undefined`
-
-Wrap the returned value in parentheses when there is more than one regex condition. Useful when you're dynamically generating ranges.
-
-```js
-console.log(toRegexRange('-10', '10'));
-//=> -[1-9]|-?10|[0-9]
-
-console.log(toRegexRange('-10', '10', { capture: true }));
-//=> (-[1-9]|-?10|[0-9])
-```
-
-### options.shorthand
-
-**Type**: `boolean`
-
-**Deafault**: `undefined`
-
-Use the regex shorthand for `[0-9]`:
-
-```js
-console.log(toRegexRange('0', '999999'));
-//=> [0-9]|[1-9][0-9]{1,5}
-
-console.log(toRegexRange('0', '999999', { shorthand: true }));
-//=> \d|[1-9]\d{1,5}
-```
-
-### options.relaxZeros
-
-**Type**: `boolean`
-
-**Default**: `true`
-
-This option relaxes matching for leading zeros when when ranges are zero-padded.
-
-```js
-const source = toRegexRange('-0010', '0010');
-const regex = new RegExp(`^${source}$`);
-console.log(regex.test('-10')); //=> true
-console.log(regex.test('-010')); //=> true
-console.log(regex.test('-0010')); //=> true
-console.log(regex.test('10')); //=> true
-console.log(regex.test('010')); //=> true
-console.log(regex.test('0010')); //=> true
-```
-
-When `relaxZeros` is false, matching is strict:
-
-```js
-const source = toRegexRange('-0010', '0010', { relaxZeros: false });
-const regex = new RegExp(`^${source}$`);
-console.log(regex.test('-10')); //=> false
-console.log(regex.test('-010')); //=> false
-console.log(regex.test('-0010')); //=> true
-console.log(regex.test('10')); //=> false
-console.log(regex.test('010')); //=> false
-console.log(regex.test('0010')); //=> true
-```
-
-## Examples
-
-| **Range**                   | **Result**                                                                      | **Compile time** |
-| ---                         | ---                                                                             | ---              |
-| `toRegexRange(-10, 10)`     | `-[1-9]\|-?10\|[0-9]`                                                           | _132μs_          |
-| `toRegexRange(-100, -10)`   | `-1[0-9]\|-[2-9][0-9]\|-100`                                                    | _50μs_           |
-| `toRegexRange(-100, 100)`   | `-[1-9]\|-?[1-9][0-9]\|-?100\|[0-9]`                                            | _42μs_           |
-| `toRegexRange(001, 100)`    | `0{0,2}[1-9]\|0?[1-9][0-9]\|100`                                                | _109μs_          |
-| `toRegexRange(001, 555)`    | `0{0,2}[1-9]\|0?[1-9][0-9]\|[1-4][0-9]{2}\|5[0-4][0-9]\|55[0-5]`                | _51μs_           |
-| `toRegexRange(0010, 1000)`  | `0{0,2}1[0-9]\|0{0,2}[2-9][0-9]\|0?[1-9][0-9]{2}\|1000`                         | _31μs_           |
-| `toRegexRange(1, 50)`       | `[1-9]\|[1-4][0-9]\|50`                                                         | _24μs_           |
-| `toRegexRange(1, 55)`       | `[1-9]\|[1-4][0-9]\|5[0-5]`                                                     | _23μs_           |
-| `toRegexRange(1, 555)`      | `[1-9]\|[1-9][0-9]\|[1-4][0-9]{2}\|5[0-4][0-9]\|55[0-5]`                        | _30μs_           |
-| `toRegexRange(1, 5555)`     | `[1-9]\|[1-9][0-9]{1,2}\|[1-4][0-9]{3}\|5[0-4][0-9]{2}\|55[0-4][0-9]\|555[0-5]` | _43μs_           |
-| `toRegexRange(111, 555)`    | `11[1-9]\|1[2-9][0-9]\|[2-4][0-9]{2}\|5[0-4][0-9]\|55[0-5]`                     | _38μs_           |
-| `toRegexRange(29, 51)`      | `29\|[34][0-9]\|5[01]`                                                          | _24μs_           |
-| `toRegexRange(31, 877)`     | `3[1-9]\|[4-9][0-9]\|[1-7][0-9]{2}\|8[0-6][0-9]\|87[0-7]`                       | _32μs_           |
-| `toRegexRange(5, 5)`        | `5`                                                                             | _8μs_            |
-| `toRegexRange(5, 6)`        | `5\|6`                                                                          | _11μs_           |
-| `toRegexRange(1, 2)`        | `1\|2`                                                                          | _6μs_            |
-| `toRegexRange(1, 5)`        | `[1-5]`                                                                         | _15μs_           |
-| `toRegexRange(1, 10)`       | `[1-9]\|10`                                                                     | _22μs_           |
-| `toRegexRange(1, 100)`      | `[1-9]\|[1-9][0-9]\|100`                                                        | _25μs_           |
-| `toRegexRange(1, 1000)`     | `[1-9]\|[1-9][0-9]{1,2}\|1000`                                                  | _31μs_           |
-| `toRegexRange(1, 10000)`    | `[1-9]\|[1-9][0-9]{1,3}\|10000`                                                 | _34μs_           |
-| `toRegexRange(1, 100000)`   | `[1-9]\|[1-9][0-9]{1,4}\|100000`                                                | _36μs_           |
-| `toRegexRange(1, 1000000)`  | `[1-9]\|[1-9][0-9]{1,5}\|1000000`                                               | _42μs_           |
-| `toRegexRange(1, 10000000)` | `[1-9]\|[1-9][0-9]{1,6}\|10000000`                                              | _42μs_           |
-
-## Heads up!
-
-**Order of arguments**
-
-When the `min` is larger than the `max`, values will be flipped to create a valid range:
-
-```js
-toRegexRange('51', '29');
-```
-
-Is effectively flipped to:
-
-```js
-toRegexRange('29', '51');
-//=> 29|[3-4][0-9]|5[0-1]
-```
-
-**Steps / increments**
-
-This library does not support steps (increments). A pr to add support would be welcome.
-
-## History
-
-### v2.0.0 - 2017-04-21
-
-**New features**
-
-Adds support for zero-padding!
-
-### v1.0.0
-
-**Optimizations**
-
-Repeating ranges are now grouped using quantifiers. rocessing time is roughly the same, but the generated regex is much smaller, which should result in faster matching.
-
-## Attribution
-
-Inspired by the python library [range-regex](https://github.com/dimka665/range-regex).
-
-## About
-
-<details>
-<summary><strong>Contributing</strong></summary>
-
-Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
-
-</details>
-
-<details>
-<summary><strong>Running Tests</strong></summary>
-
-Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
-
-```sh
-$ npm install && npm test
-```
-
-</details>
-
-<details>
-<summary><strong>Building docs</strong></summary>
-
-_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
-
-To generate the readme, run the following command:
-
-```sh
-$ npm install -g verbose/verb#dev verb-generate-readme && verb
-```
-
-</details>
-
-### Related projects
-
-You might also be interested in these projects:
-
-* [expand-range](https://www.npmjs.com/package/expand-range): Fast, bash-like range expansion. Expand a range of numbers or letters, uppercase or lowercase. Used… [more](https://github.com/jonschlinkert/expand-range) | [homepage](https://github.com/jonschlinkert/expand-range "Fast, bash-like range expansion. Expand a range of numbers or letters, uppercase or lowercase. Used by micromatch.")
-* [fill-range](https://www.npmjs.com/package/fill-range): Fill in a range of numbers or letters, optionally passing an increment or `step` to… [more](https://github.com/jonschlinkert/fill-range) | [homepage](https://github.com/jonschlinkert/fill-range "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`")
-* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/micromatch/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.")
-* [repeat-element](https://www.npmjs.com/package/repeat-element): Create an array by repeating the given value n times. | [homepage](https://github.com/jonschlinkert/repeat-element "Create an array by repeating the given value n times.")
-* [repeat-string](https://www.npmjs.com/package/repeat-string): Repeat the given string n times. Fastest implementation for repeating a string. | [homepage](https://github.com/jonschlinkert/repeat-string "Repeat the given string n times. Fastest implementation for repeating a string.")
-
-### Contributors
-
-| **Commits** | **Contributor** |  
-| --- | --- |  
-| 63 | [jonschlinkert](https://github.com/jonschlinkert) |  
-| 3  | [doowb](https://github.com/doowb) |  
-| 2  | [realityking](https://github.com/realityking) |  
-
-### Author
-
-**Jon Schlinkert**
-
-* [GitHub Profile](https://github.com/jonschlinkert)
-* [Twitter Profile](https://twitter.com/jonschlinkert)
-* [LinkedIn Profile](https://linkedin.com/in/jonschlinkert)
-
-Please consider supporting me on Patreon, or [start your own Patreon page](https://patreon.com/invite/bxpbvm)!
-
-<a href="https://www.patreon.com/jonschlinkert">
-<img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" height="50">
-</a>
-
-### License
-
-Copyright © 2019, [Jon Schlinkert](https://github.com/jonschlinkert).
-Released under the [MIT License](LICENSE).
-
-***
-
-_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 07, 2019._
\ No newline at end of file
diff --git a/node_modules/to-regex-range/index.js b/node_modules/to-regex-range/index.js
deleted file mode 100644
index 77fbaced17fc86d8cd3f73912b5dd56f3cfb3aaf..0000000000000000000000000000000000000000
--- a/node_modules/to-regex-range/index.js
+++ /dev/null
@@ -1,288 +0,0 @@
-/*!
- * to-regex-range <https://github.com/micromatch/to-regex-range>
- *
- * Copyright (c) 2015-present, Jon Schlinkert.
- * Released under the MIT License.
- */
-
-'use strict';
-
-const isNumber = require('is-number');
-
-const toRegexRange = (min, max, options) => {
-  if (isNumber(min) === false) {
-    throw new TypeError('toRegexRange: expected the first argument to be a number');
-  }
-
-  if (max === void 0 || min === max) {
-    return String(min);
-  }
-
-  if (isNumber(max) === false) {
-    throw new TypeError('toRegexRange: expected the second argument to be a number.');
-  }
-
-  let opts = { relaxZeros: true, ...options };
-  if (typeof opts.strictZeros === 'boolean') {
-    opts.relaxZeros = opts.strictZeros === false;
-  }
-
-  let relax = String(opts.relaxZeros);
-  let shorthand = String(opts.shorthand);
-  let capture = String(opts.capture);
-  let wrap = String(opts.wrap);
-  let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap;
-
-  if (toRegexRange.cache.hasOwnProperty(cacheKey)) {
-    return toRegexRange.cache[cacheKey].result;
-  }
-
-  let a = Math.min(min, max);
-  let b = Math.max(min, max);
-
-  if (Math.abs(a - b) === 1) {
-    let result = min + '|' + max;
-    if (opts.capture) {
-      return `(${result})`;
-    }
-    if (opts.wrap === false) {
-      return result;
-    }
-    return `(?:${result})`;
-  }
-
-  let isPadded = hasPadding(min) || hasPadding(max);
-  let state = { min, max, a, b };
-  let positives = [];
-  let negatives = [];
-
-  if (isPadded) {
-    state.isPadded = isPadded;
-    state.maxLen = String(state.max).length;
-  }
-
-  if (a < 0) {
-    let newMin = b < 0 ? Math.abs(b) : 1;
-    negatives = splitToPatterns(newMin, Math.abs(a), state, opts);
-    a = state.a = 0;
-  }
-
-  if (b >= 0) {
-    positives = splitToPatterns(a, b, state, opts);
-  }
-
-  state.negatives = negatives;
-  state.positives = positives;
-  state.result = collatePatterns(negatives, positives, opts);
-
-  if (opts.capture === true) {
-    state.result = `(${state.result})`;
-  } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) {
-    state.result = `(?:${state.result})`;
-  }
-
-  toRegexRange.cache[cacheKey] = state;
-  return state.result;
-};
-
-function collatePatterns(neg, pos, options) {
-  let onlyNegative = filterPatterns(neg, pos, '-', false, options) || [];
-  let onlyPositive = filterPatterns(pos, neg, '', false, options) || [];
-  let intersected = filterPatterns(neg, pos, '-?', true, options) || [];
-  let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive);
-  return subpatterns.join('|');
-}
-
-function splitToRanges(min, max) {
-  let nines = 1;
-  let zeros = 1;
-
-  let stop = countNines(min, nines);
-  let stops = new Set([max]);
-
-  while (min <= stop && stop <= max) {
-    stops.add(stop);
-    nines += 1;
-    stop = countNines(min, nines);
-  }
-
-  stop = countZeros(max + 1, zeros) - 1;
-
-  while (min < stop && stop <= max) {
-    stops.add(stop);
-    zeros += 1;
-    stop = countZeros(max + 1, zeros) - 1;
-  }
-
-  stops = [...stops];
-  stops.sort(compare);
-  return stops;
-}
-
-/**
- * Convert a range to a regex pattern
- * @param {Number} `start`
- * @param {Number} `stop`
- * @return {String}
- */
-
-function rangeToPattern(start, stop, options) {
-  if (start === stop) {
-    return { pattern: start, count: [], digits: 0 };
-  }
-
-  let zipped = zip(start, stop);
-  let digits = zipped.length;
-  let pattern = '';
-  let count = 0;
-
-  for (let i = 0; i < digits; i++) {
-    let [startDigit, stopDigit] = zipped[i];
-
-    if (startDigit === stopDigit) {
-      pattern += startDigit;
-
-    } else if (startDigit !== '0' || stopDigit !== '9') {
-      pattern += toCharacterClass(startDigit, stopDigit, options);
-
-    } else {
-      count++;
-    }
-  }
-
-  if (count) {
-    pattern += options.shorthand === true ? '\\d' : '[0-9]';
-  }
-
-  return { pattern, count: [count], digits };
-}
-
-function splitToPatterns(min, max, tok, options) {
-  let ranges = splitToRanges(min, max);
-  let tokens = [];
-  let start = min;
-  let prev;
-
-  for (let i = 0; i < ranges.length; i++) {
-    let max = ranges[i];
-    let obj = rangeToPattern(String(start), String(max), options);
-    let zeros = '';
-
-    if (!tok.isPadded && prev && prev.pattern === obj.pattern) {
-      if (prev.count.length > 1) {
-        prev.count.pop();
-      }
-
-      prev.count.push(obj.count[0]);
-      prev.string = prev.pattern + toQuantifier(prev.count);
-      start = max + 1;
-      continue;
-    }
-
-    if (tok.isPadded) {
-      zeros = padZeros(max, tok, options);
-    }
-
-    obj.string = zeros + obj.pattern + toQuantifier(obj.count);
-    tokens.push(obj);
-    start = max + 1;
-    prev = obj;
-  }
-
-  return tokens;
-}
-
-function filterPatterns(arr, comparison, prefix, intersection, options) {
-  let result = [];
-
-  for (let ele of arr) {
-    let { string } = ele;
-
-    // only push if _both_ are negative...
-    if (!intersection && !contains(comparison, 'string', string)) {
-      result.push(prefix + string);
-    }
-
-    // or _both_ are positive
-    if (intersection && contains(comparison, 'string', string)) {
-      result.push(prefix + string);
-    }
-  }
-  return result;
-}
-
-/**
- * Zip strings
- */
-
-function zip(a, b) {
-  let arr = [];
-  for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]);
-  return arr;
-}
-
-function compare(a, b) {
-  return a > b ? 1 : b > a ? -1 : 0;
-}
-
-function contains(arr, key, val) {
-  return arr.some(ele => ele[key] === val);
-}
-
-function countNines(min, len) {
-  return Number(String(min).slice(0, -len) + '9'.repeat(len));
-}
-
-function countZeros(integer, zeros) {
-  return integer - (integer % Math.pow(10, zeros));
-}
-
-function toQuantifier(digits) {
-  let [start = 0, stop = ''] = digits;
-  if (stop || start > 1) {
-    return `{${start + (stop ? ',' + stop : '')}}`;
-  }
-  return '';
-}
-
-function toCharacterClass(a, b, options) {
-  return `[${a}${(b - a === 1) ? '' : '-'}${b}]`;
-}
-
-function hasPadding(str) {
-  return /^-?(0+)\d/.test(str);
-}
-
-function padZeros(value, tok, options) {
-  if (!tok.isPadded) {
-    return value;
-  }
-
-  let diff = Math.abs(tok.maxLen - String(value).length);
-  let relax = options.relaxZeros !== false;
-
-  switch (diff) {
-    case 0:
-      return '';
-    case 1:
-      return relax ? '0?' : '0';
-    case 2:
-      return relax ? '0{0,2}' : '00';
-    default: {
-      return relax ? `0{0,${diff}}` : `0{${diff}}`;
-    }
-  }
-}
-
-/**
- * Cache
- */
-
-toRegexRange.cache = {};
-toRegexRange.clearCache = () => (toRegexRange.cache = {});
-
-/**
- * Expose `toRegexRange`
- */
-
-module.exports = toRegexRange;
diff --git a/node_modules/to-regex-range/package.json b/node_modules/to-regex-range/package.json
deleted file mode 100644
index 4ef194f352a3f4b1e409404c8cae3bd3197648d6..0000000000000000000000000000000000000000
--- a/node_modules/to-regex-range/package.json
+++ /dev/null
@@ -1,88 +0,0 @@
-{
-  "name": "to-regex-range",
-  "description": "Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than 2.78 million test assertions.",
-  "version": "5.0.1",
-  "homepage": "https://github.com/micromatch/to-regex-range",
-  "author": "Jon Schlinkert (https://github.com/jonschlinkert)",
-  "contributors": [
-    "Jon Schlinkert (http://twitter.com/jonschlinkert)",
-    "Rouven Weßling (www.rouvenwessling.de)"
-  ],
-  "repository": "micromatch/to-regex-range",
-  "bugs": {
-    "url": "https://github.com/micromatch/to-regex-range/issues"
-  },
-  "license": "MIT",
-  "files": [
-    "index.js"
-  ],
-  "main": "index.js",
-  "engines": {
-    "node": ">=8.0"
-  },
-  "scripts": {
-    "test": "mocha"
-  },
-  "dependencies": {
-    "is-number": "^7.0.0"
-  },
-  "devDependencies": {
-    "fill-range": "^6.0.0",
-    "gulp-format-md": "^2.0.0",
-    "mocha": "^6.0.2",
-    "text-table": "^0.2.0",
-    "time-diff": "^0.3.1"
-  },
-  "keywords": [
-    "bash",
-    "date",
-    "expand",
-    "expansion",
-    "expression",
-    "glob",
-    "match",
-    "match date",
-    "match number",
-    "match numbers",
-    "match year",
-    "matches",
-    "matching",
-    "number",
-    "numbers",
-    "numerical",
-    "range",
-    "ranges",
-    "regex",
-    "regexp",
-    "regular",
-    "regular expression",
-    "sequence"
-  ],
-  "verb": {
-    "layout": "default",
-    "toc": false,
-    "tasks": [
-      "readme"
-    ],
-    "plugins": [
-      "gulp-format-md"
-    ],
-    "lint": {
-      "reflinks": true
-    },
-    "helpers": {
-      "examples": {
-        "displayName": "examples"
-      }
-    },
-    "related": {
-      "list": [
-        "expand-range",
-        "fill-range",
-        "micromatch",
-        "repeat-element",
-        "repeat-string"
-      ]
-    }
-  }
-}
diff --git a/node_modules/touch/LICENSE b/node_modules/touch/LICENSE
deleted file mode 100644
index 05eeeb88c2ef4cc9bacbcc46d6cfcb6962f8b385..0000000000000000000000000000000000000000
--- a/node_modules/touch/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/touch/README.md b/node_modules/touch/README.md
deleted file mode 100644
index b5a361e6bee2a16e327af8e15b247f27c025ec9c..0000000000000000000000000000000000000000
--- a/node_modules/touch/README.md
+++ /dev/null
@@ -1,52 +0,0 @@
-# node-touch
-
-For all your node touching needs.
-
-## Installing
-
-```bash
-npm install touch
-```
-
-## CLI Usage:
-
-See `man touch`
-
-This package exports a binary called `nodetouch` that works mostly
-like the unix builtin `touch(1)`.
-
-## API Usage:
-
-```javascript
-var touch = require("touch")
-```
-
-Gives you the following functions:
-
-* `touch(filename, options, cb)`
-* `touch.sync(filename, options)`
-* `touch.ftouch(fd, options, cb)`
-* `touch.ftouchSync(fd, options)`
-
-All the `options` objects are optional.
-
-All the async functions return a Promise.  If a callback function is
-provided, then it's attached to the Promise.
-
-## Options
-
-* `force` like `touch -f` Boolean
-* `time` like `touch -t <date>` Can be a Date object, or any parseable
-  Date string, or epoch ms number.
-* `atime` like `touch -a` Can be either a Boolean, or a Date.
-* `mtime` like `touch -m` Can be either a Boolean, or a Date.
-* `ref` like `touch -r <file>` Must be path to a file.
-* `nocreate` like `touch -c` Boolean
-
-If neither `atime` nor `mtime` are set, then both values are set.  If
-one of them is set, then the other is not.
-
-## cli
-
-This package creates a `nodetouch` command line executable that works
-very much like the unix builtin `touch(1)`
diff --git a/node_modules/touch/bin/nodetouch.js b/node_modules/touch/bin/nodetouch.js
deleted file mode 100644
index f78f0829d1fa9c09fc6565a51ceefc4a1bc80cda..0000000000000000000000000000000000000000
--- a/node_modules/touch/bin/nodetouch.js
+++ /dev/null
@@ -1,112 +0,0 @@
-#!/usr/bin/env node
-const touch = require("../index.js")
-
-const usage = code => {
-  console[code ? 'error' : 'log'](
-    'usage:\n' +
-    'touch [-acfm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]] file ...'
-  )
-  process.exit(code)
-}
-
-const singleFlags = {
-  a: 'atime',
-  m: 'mtime',
-  c: 'nocreate',
-  f: 'force'
-}
-
-const singleOpts = {
-  r: 'ref',
-  t: 'time'
-}
-
-const files = []
-const args = process.argv.slice(2)
-const options = {}
-for (let i = 0; i < args.length; i++) {
-  const arg = args[i]
-  if (!arg.match(/^-/)) {
-    files.push(arg)
-    continue
-  }
-
-  // expand shorthands
-  if (arg.charAt(1) !== '-') {
-    const expand = []
-    for (let f = 1; f < arg.length; f++) {
-      const fc = arg.charAt(f)
-      const sf = singleFlags[fc]
-      const so = singleOpts[fc]
-      if (sf)
-        expand.push('--' + sf)
-      else if (so) {
-        const soslice = arg.slice(f + 1)
-        const soval = soslice.charAt(0) === '=' ? soslice : '=' + soslice
-        expand.push('--' + so + soval)
-        f = arg.length
-      } else if (arg !== '-' + fc)
-        expand.push('-' + fc)
-    }
-    if (expand.length) {
-      args.splice.apply(args, [i, 1].concat(expand))
-      i--
-      continue
-    }
-  }
-
-  const argsplit = arg.split('=')
-  const key = argsplit.shift().replace(/^\-\-/, '')
-  const val = argsplit.length ? argsplit.join('=') : null
-
-  switch (key) {
-    case 'time':
-      const timestr = val || args[++i]
-      // [-t [[CC]YY]MMDDhhmm[.SS]]
-      const parsedtime = timestr.match(
-        /^(([0-9]{2})?([0-9]{2}))?([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})(\.([0-9]{2}))?$/
-      )
-      if (!parsedtime) {
-        console.error('touch: out of range or illegal ' +
-                      'time specification: ' +
-                      '[[CC]YY]MMDDhhmm[.SS]')
-        process.exit(1)
-      } else {
-        const y = +parsedtime[1]
-        const year = parsedtime[2] ? y
-          : y <= 68 ? 2000 + y
-          : 1900 + y
-
-        const MM = +parsedtime[4] - 1
-        const dd = +parsedtime[5]
-        const hh = +parsedtime[6]
-        const mm = +parsedtime[7]
-        const ss = +parsedtime[8]
-
-        options.time = new Date(Date.UTC(year, MM, dd, hh, mm, ss))
-      }
-      continue
-
-    case 'ref':
-      options.ref = val || args[++i]
-      continue
-
-    case 'mtime':
-    case 'nocreate':
-    case 'atime':
-    case 'force':
-      options[key] = true
-      continue
-
-    default:
-      console.error('touch: illegal option -- ' + arg)
-      usage(1)
-  }
-}
-
-if (!files.length)
-  usage()
-
-process.exitCode = 0
-Promise.all(files.map(f => touch(f, options)))
-  .catch(er => process.exitCode = 1)
diff --git a/node_modules/touch/index.js b/node_modules/touch/index.js
deleted file mode 100644
index fa6a8d7ef0b42b564eee069c7c539ab79fd7c589..0000000000000000000000000000000000000000
--- a/node_modules/touch/index.js
+++ /dev/null
@@ -1,224 +0,0 @@
-'use strict'
-
-const EE = require('events').EventEmitter
-const cons = require('constants')
-const fs = require('fs')
-
-module.exports = (f, options, cb) => {
-  if (typeof options === 'function')
-    cb = options, options = {}
-
-  const p = new Promise((res, rej) => {
-    new Touch(validOpts(options, f, null))
-      .on('done', res).on('error', rej)
-  })
-
-  return cb ? p.then(res => cb(null, res), cb) : p
-}
-
-module.exports.sync = module.exports.touchSync = (f, options) =>
-  (new TouchSync(validOpts(options, f, null)), undefined)
-
-module.exports.ftouch = (fd, options, cb) => {
-  if (typeof options === 'function')
-    cb = options, options = {}
-
-  const p = new Promise((res, rej) => {
-    new Touch(validOpts(options, null, fd))
-      .on('done', res).on('error', rej)
-  })
-
-  return cb ? p.then(res => cb(null, res), cb) : p
-}
-
-module.exports.ftouchSync = (fd, opt) =>
-  (new TouchSync(validOpts(opt, null, fd)), undefined)
-
-const validOpts = (options, path, fd) => {
-  options = Object.create(options || {})
-  options.fd = fd
-  options.path = path
-
-  // {mtime: true}, {ctime: true}
-  // If set to something else, then treat as epoch ms value
-  const now = new Date(options.time || Date.now()).getTime() / 1000
-  if (!options.atime && !options.mtime)
-    options.atime = options.mtime = now
-  else {
-    if (true === options.atime)
-      options.atime = now
-
-    if (true === options.mtime)
-      options.mtime = now
-  }
-
-  let oflags = 0
-  if (!options.force)
-    oflags = oflags | cons.O_RDWR
-
-  if (!options.nocreate)
-    oflags = oflags | cons.O_CREAT
-
-  options.oflags = oflags
-  return options
-}
-
-class Touch extends EE {
-  constructor (options) {
-    super(options)
-    this.fd = options.fd
-    this.path = options.path
-    this.atime = options.atime
-    this.mtime = options.mtime
-    this.ref = options.ref
-    this.nocreate = !!options.nocreate
-    this.force = !!options.force
-    this.closeAfter = options.closeAfter
-    this.oflags = options.oflags
-    this.options = options
-
-    if (typeof this.fd !== 'number') {
-      this.closeAfter = true
-      this.open()
-    } else
-      this.onopen(null, this.fd)
-  }
-
-  emit (ev, data) {
-    // we only emit when either done or erroring
-    // in both cases, need to close
-    this.close()
-    return super.emit(ev, data)
-  }
-
-  close () {
-    if (typeof this.fd === 'number' && this.closeAfter)
-      fs.close(this.fd, () => {})
-  }
-
-  open () {
-    fs.open(this.path, this.oflags, (er, fd) => this.onopen(er, fd))
-  }
-
-  onopen (er, fd) {
-    if (er) {
-      if (er.code === 'EISDIR')
-        this.onopen(null, null)
-      else if (er.code === 'ENOENT' && this.nocreate)
-        this.emit('done')
-      else
-        this.emit('error', er)
-    } else {
-      this.fd = fd
-      if (this.ref)
-        this.statref()
-      else if (!this.atime || !this.mtime)
-        this.fstat()
-      else
-        this.futimes()
-    }
-  }
-
-  statref () {
-    fs.stat(this.ref, (er, st) => {
-      if (er)
-        this.emit('error', er)
-      else
-        this.onstatref(st)
-    })
-  }
-
-  onstatref (st) {
-    this.atime = this.atime && st.atime.getTime()/1000
-    this.mtime = this.mtime && st.mtime.getTime()/1000
-    if (!this.atime || !this.mtime)
-      this.fstat()
-    else
-      this.futimes()
-  }
-
-  fstat () {
-    const stat = this.fd ? 'fstat' : 'stat'
-    const target = this.fd || this.path
-    fs[stat](target, (er, st) => {
-      if (er)
-        this.emit('error', er)
-      else
-        this.onfstat(st)
-    })
-  }
-
-  onfstat (st) {
-    if (typeof this.atime !== 'number')
-      this.atime = st.atime.getTime()/1000
-
-    if (typeof this.mtime !== 'number')
-      this.mtime = st.mtime.getTime()/1000
-
-    this.futimes()
-  }
-
-  futimes () {
-    const utimes = this.fd ? 'futimes' : 'utimes'
-    const target = this.fd || this.path
-    fs[utimes](target, ''+this.atime, ''+this.mtime, er => {
-      if (er)
-        this.emit('error', er)
-      else
-        this.emit('done')
-    })
-  }
-}
-
-class TouchSync extends Touch {
-  open () {
-    try {
-      this.onopen(null, fs.openSync(this.path, this.oflags))
-    } catch (er) {
-      this.onopen(er)
-    }
-  }
-
-  statref () {
-    let threw = true
-    try {
-      this.onstatref(fs.statSync(this.ref))
-      threw = false
-    } finally {
-      if (threw)
-        this.close()
-    }
-  }
-
-  fstat () {
-    let threw = true
-    const stat = this.fd ? 'fstatSync' : 'statSync'
-    const target = this.fd || this.path
-    try {
-      this.onfstat(fs[stat](target))
-      threw = false
-    } finally {
-      if (threw)
-        this.close()
-    }
-  }
-
-  futimes () {
-    let threw = true
-    const utimes = this.fd ? 'futimesSync' : 'utimesSync'
-    const target = this.fd || this.path
-    try {
-      fs[utimes](target, this.atime, this.mtime)
-      threw = false
-    } finally {
-      if (threw)
-        this.close()
-    }
-    this.emit('done')
-  }
-
-  close () {
-    if (typeof this.fd === 'number' && this.closeAfter)
-      try { fs.closeSync(this.fd) } catch (er) {}
-  }
-}
diff --git a/node_modules/touch/package.json b/node_modules/touch/package.json
deleted file mode 100644
index a51c29ba36c167ed72a92778c6ca5188f002da29..0000000000000000000000000000000000000000
--- a/node_modules/touch/package.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
-  "name": "touch",
-  "description": "like touch(1) in node",
-  "version": "3.1.1",
-  "repository": "git://github.com/isaacs/node-touch.git",
-  "bin": {
-    "nodetouch": "./bin/nodetouch.js"
-  },
-  "license": "ISC",
-  "scripts": {
-    "test": "tap test/*.js --100 -J",
-    "preversion": "npm test",
-    "postversion": "npm publish",
-    "postpublish": "git push origin --all; git push origin --tags"
-  },
-  "devDependencies": {
-    "mutate-fs": "^1.1.0",
-    "tap": "^10.7.0"
-  },
-  "files": [
-    "index.js",
-    "bin/nodetouch.js"
-  ]
-}
diff --git a/node_modules/undefsafe/.github/workflows/release.yml b/node_modules/undefsafe/.github/workflows/release.yml
deleted file mode 100644
index e6ee8866858f79b90eb2b1ea8d5181fc8a041b74..0000000000000000000000000000000000000000
--- a/node_modules/undefsafe/.github/workflows/release.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-name: Release
-on:
-  push:
-    branches:
-      - master
-jobs:
-  release:
-    name: Release
-    runs-on: ubuntu-18.04
-    steps:
-      - name: Checkout
-        uses: actions/checkout@v1
-      - name: Setup Node.js
-        uses: actions/setup-node@v1
-        with:
-          node-version: 16
-      - name: Install dependencies
-        run: npm ci
-      - name: Test
-        run: npm run test
-      - name: Release
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
-        run: npx semantic-release
diff --git a/node_modules/undefsafe/.jscsrc b/node_modules/undefsafe/.jscsrc
deleted file mode 100644
index 9e01c9bebe37be1b0217bf89ef704a97ba7a6f85..0000000000000000000000000000000000000000
--- a/node_modules/undefsafe/.jscsrc
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "preset": "node-style-guide",
-  "requireCapitalizedComments": null,
-  "requireSpacesInAnonymousFunctionExpression": {
-    "beforeOpeningCurlyBrace": true,
-    "beforeOpeningRoundBrace": true
-  },
-  "disallowSpacesInNamedFunctionExpression": {
-    "beforeOpeningRoundBrace": true
-  },
-  "excludeFiles": ["node_modules/**"],
-  "disallowSpacesInFunction": null
-}
diff --git a/node_modules/undefsafe/.jshintrc b/node_modules/undefsafe/.jshintrc
deleted file mode 100644
index b47f672fd9451ebe3a3378f4f84166dcdd13fc27..0000000000000000000000000000000000000000
--- a/node_modules/undefsafe/.jshintrc
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "browser": false,
-  "camelcase": true,
-  "curly": true,
-  "devel": true,
-  "eqeqeq": true,
-  "forin": true,
-  "indent": 2,
-  "noarg": true,
-  "node": true,
-  "quotmark": "single",
-  "undef": true,
-  "strict": false,
-  "unused": true
-}
-
diff --git a/node_modules/undefsafe/.travis.yml b/node_modules/undefsafe/.travis.yml
deleted file mode 100644
index a1ace24a762a27bcee0010afeaceecd44d20778d..0000000000000000000000000000000000000000
--- a/node_modules/undefsafe/.travis.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-sudo: false
-language: node_js
-cache:
-  directories:
-    - node_modules
-notifications:
-  email: false
-node_js:
-  - '4'
-before_install:
-  - npm i -g npm@^2.0.0
-before_script:
-  - npm prune
-after_success:
-  - npm run semantic-release
-branches:
-  except:
-    - "/^v\\d+\\.\\d+\\.\\d+$/"
diff --git a/node_modules/undefsafe/LICENSE b/node_modules/undefsafe/LICENSE
deleted file mode 100644
index caaf03ae2482776e4bb88c28fc231b60de4caf79..0000000000000000000000000000000000000000
--- a/node_modules/undefsafe/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright © 2016 Remy Sharp, http://remysharp.com <remy@remysharp.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/undefsafe/README.md b/node_modules/undefsafe/README.md
deleted file mode 100644
index 46a706bc09c13f5b697315bf50692f42dcd8075c..0000000000000000000000000000000000000000
--- a/node_modules/undefsafe/README.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# undefsafe
-
-Simple *function* for retrieving deep object properties without getting "Cannot read property 'X' of undefined"
-
-Can also be used to safely set deep values.
-
-## Usage
-
-```js
-var object = {
-  a: {
-    b: {
-      c: 1,
-      d: [1,2,3],
-      e: 'remy'
-    }
-  }
-};
-
-console.log(undefsafe(object, 'a.b.e')); // "remy"
-console.log(undefsafe(object, 'a.b.not.found')); // undefined
-```
-
-Demo: [https://jsbin.com/eroqame/3/edit?js,console](https://jsbin.com/eroqame/3/edit?js,console)
-
-## Setting
-
-```js
-var object = {
-  a: {
-    b: [1,2,3]
-  }
-};
-
-// modified object
-var res = undefsafe(object, 'a.b.0', 10);
-
-console.log(object); // { a: { b: [10, 2, 3] } }
-console.log(res); // 1 - previous value
-```
-
-## Star rules in paths
-
-As of 1.2.0, `undefsafe` supports a `*` in the path if you want to search all of the properties (or array elements) for a particular element.
-
-The function will only return a single result, either the 3rd argument validation value, or the first positive match. For example, the following github data:
-
-```js
-const githubData = {
-        commits: [{
-          modified: [
-            "one",
-            "two"
-          ]
-        }, /* ... */ ]
-      };
-
-// first modified file found in the first commit
-console.log(undefsafe(githubData, 'commits.*.modified.0'));
-
-// returns `two` or undefined if not found
-console.log(undefsafe(githubData, 'commits.*.modified.*', 'two'));
-```
diff --git a/node_modules/undefsafe/example.js b/node_modules/undefsafe/example.js
deleted file mode 100644
index ed93c23bbf1ac7ef3b17595d2b51e313e8e6fc53..0000000000000000000000000000000000000000
--- a/node_modules/undefsafe/example.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var undefsafe = require('undefsafe');
-
-var object = {
-  a: {
-    b: {
-      c: 1,
-      d: [1, 2, 3],
-      e: 'remy'
-    }
-  }
-};
-
-console.log(undefsafe(object, 'a.b.e')); // "remy"
-console.log(undefsafe(object, 'a.b.not.found')); // undefined
diff --git a/node_modules/undefsafe/lib/undefsafe.js b/node_modules/undefsafe/lib/undefsafe.js
deleted file mode 100644
index 744687805338a7d480ff922d75222b414d8b682f..0000000000000000000000000000000000000000
--- a/node_modules/undefsafe/lib/undefsafe.js
+++ /dev/null
@@ -1,125 +0,0 @@
-'use strict';
-
-function undefsafe(obj, path, value, __res) {
-  // I'm not super keen on this private function, but it's because
-  // it'll also be use in the browser and I wont *one* function exposed
-  function split(path) {
-    var res = [];
-    var level = 0;
-    var key = '';
-
-    for (var i = 0; i < path.length; i++) {
-      var c = path.substr(i, 1);
-
-      if (level === 0 && (c === '.' || c === '[')) {
-        if (c === '[') {
-          level++;
-          i++;
-          c = path.substr(i, 1);
-        }
-
-        if (key) {
-          // the first value could be a string
-          res.push(key);
-        }
-        key = '';
-        continue;
-      }
-
-      if (c === ']') {
-        level--;
-        key = key.slice(0, -1);
-        continue;
-      }
-
-      key += c;
-    }
-
-    res.push(key);
-
-    return res;
-  }
-
-  // bail if there's nothing
-  if (obj === undefined || obj === null) {
-    return undefined;
-  }
-
-  var parts = split(path);
-  var key = null;
-  var type = typeof obj;
-  var root = obj;
-  var parent = obj;
-
-  var star =
-    parts.filter(function(_) {
-      return _ === '*';
-    }).length > 0;
-
-  // we're dealing with a primitive
-  if (type !== 'object' && type !== 'function') {
-    return obj;
-  } else if (path.trim() === '') {
-    return obj;
-  }
-
-  key = parts[0];
-  var i = 0;
-  for (; i < parts.length; i++) {
-    key = parts[i];
-    parent = obj;
-
-    if (key === '*') {
-      // loop through each property
-      var prop = '';
-      var res = __res || [];
-
-      for (prop in parent) {
-        var shallowObj = undefsafe(
-          obj[prop],
-          parts.slice(i + 1).join('.'),
-          value,
-          res
-        );
-        if (shallowObj && shallowObj !== res) {
-          if ((value && shallowObj === value) || value === undefined) {
-            if (value !== undefined) {
-              return shallowObj;
-            }
-
-            res.push(shallowObj);
-          }
-        }
-      }
-
-      if (res.length === 0) {
-        return undefined;
-      }
-
-      return res;
-    }
-
-    if (Object.getOwnPropertyNames(obj).indexOf(key) == -1) {
-      return undefined;
-    }
-
-    obj = obj[key];
-    if (obj === undefined || obj === null) {
-      break;
-    }
-  }
-
-  // if we have a null object, make sure it's the one the user was after,
-  // if it's not (i.e. parts has a length) then give undefined back.
-  if (obj === null && i !== parts.length - 1) {
-    obj = undefined;
-  } else if (!star && value) {
-    key = path.split('.').pop();
-    parent[key] = value;
-  }
-  return obj;
-}
-
-if (typeof module !== 'undefined') {
-  module.exports = undefsafe;
-}
diff --git a/node_modules/undefsafe/package.json b/node_modules/undefsafe/package.json
deleted file mode 100644
index a4542332bffc8fb91e218159fe550bf3cc90c4ab..0000000000000000000000000000000000000000
--- a/node_modules/undefsafe/package.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "name": "undefsafe",
-  "description": "Undefined safe way of extracting object properties",
-  "main": "lib/undefsafe.js",
-  "tonicExampleFilename": "example.js",
-  "directories": {
-    "test": "test"
-  },
-  "scripts": {
-    "test": "tap test/**/*.test.js -R spec",
-    "cover": "tap test/*.test.js --cov --coverage-report=lcov",
-    "semantic-release": "semantic-release"
-  },
-  "prettier": {
-    "trailingComma": "none",
-    "singleQuote": true
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/remy/undefsafe.git"
-  },
-  "keywords": [
-    "undefined"
-  ],
-  "author": "Remy Sharp",
-  "license": "MIT",
-  "devDependencies": {
-    "semantic-release": "^18.0.0",
-    "tap": "^5.7.1",
-    "tap-only": "0.0.5"
-  },
-  "dependencies": {},
-  "version": "2.0.5"
-}
diff --git a/node_modules/utils-merge/.npmignore b/node_modules/utils-merge/.npmignore
deleted file mode 100644
index 3e53844186447e50779e1a5d63835e7fb7b134ce..0000000000000000000000000000000000000000
--- a/node_modules/utils-merge/.npmignore
+++ /dev/null
@@ -1,9 +0,0 @@
-CONTRIBUTING.md
-Makefile
-docs/
-examples/
-reports/
-test/
-
-.jshintrc
-.travis.yml
diff --git a/node_modules/utils-merge/LICENSE b/node_modules/utils-merge/LICENSE
deleted file mode 100644
index 76f6d083db5f4d381a91b89f6ff437e10d1a0fb8..0000000000000000000000000000000000000000
--- a/node_modules/utils-merge/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2013-2017 Jared Hanson
-
-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/utils-merge/README.md b/node_modules/utils-merge/README.md
deleted file mode 100644
index 0cb71171255f78b087185dba6e09f7bb6a74dd98..0000000000000000000000000000000000000000
--- a/node_modules/utils-merge/README.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# utils-merge
-
-[![Version](https://img.shields.io/npm/v/utils-merge.svg?label=version)](https://www.npmjs.com/package/utils-merge)
-[![Build](https://img.shields.io/travis/jaredhanson/utils-merge.svg)](https://travis-ci.org/jaredhanson/utils-merge)
-[![Quality](https://img.shields.io/codeclimate/github/jaredhanson/utils-merge.svg?label=quality)](https://codeclimate.com/github/jaredhanson/utils-merge)
-[![Coverage](https://img.shields.io/coveralls/jaredhanson/utils-merge.svg)](https://coveralls.io/r/jaredhanson/utils-merge)
-[![Dependencies](https://img.shields.io/david/jaredhanson/utils-merge.svg)](https://david-dm.org/jaredhanson/utils-merge)
-
-
-Merges the properties from a source object into a destination object.
-
-## Install
-
-```bash
-$ npm install utils-merge
-```
-
-## Usage
-
-```javascript
-var a = { foo: 'bar' }
-  , b = { bar: 'baz' };
-
-merge(a, b);
-// => { foo: 'bar', bar: 'baz' }
-```
-
-## License
-
-[The MIT License](http://opensource.org/licenses/MIT)
-
-Copyright (c) 2013-2017 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)>
-
-<a target='_blank' rel='nofollow' href='https://app.codesponsor.io/link/vK9dyjRnnWsMzzJTQ57fRJpH/jaredhanson/utils-merge'>  <img alt='Sponsor' width='888' height='68' src='https://app.codesponsor.io/embed/vK9dyjRnnWsMzzJTQ57fRJpH/jaredhanson/utils-merge.svg' /></a>
diff --git a/node_modules/utils-merge/index.js b/node_modules/utils-merge/index.js
deleted file mode 100644
index 4265c694fec6f4eb174612ee434c3ab7da8e40fa..0000000000000000000000000000000000000000
--- a/node_modules/utils-merge/index.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Merge object b with object a.
- *
- *     var a = { foo: 'bar' }
- *       , b = { bar: 'baz' };
- *
- *     merge(a, b);
- *     // => { foo: 'bar', bar: 'baz' }
- *
- * @param {Object} a
- * @param {Object} b
- * @return {Object}
- * @api public
- */
-
-exports = module.exports = function(a, b){
-  if (a && b) {
-    for (var key in b) {
-      a[key] = b[key];
-    }
-  }
-  return a;
-};
diff --git a/node_modules/utils-merge/package.json b/node_modules/utils-merge/package.json
deleted file mode 100644
index e36b0781c1909d7893646e532bf617fdcb73d3c0..0000000000000000000000000000000000000000
--- a/node_modules/utils-merge/package.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "name": "utils-merge",
-  "version": "1.0.1",
-  "description": "merge() utility function",
-  "keywords": [
-    "util"
-  ],
-  "author": {
-    "name": "Jared Hanson",
-    "email": "jaredhanson@gmail.com",
-    "url": "http://www.jaredhanson.net/"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/jaredhanson/utils-merge.git"
-  },
-  "bugs": {
-    "url": "http://github.com/jaredhanson/utils-merge/issues"
-  },
-  "license": "MIT",
-  "licenses": [
-    {
-      "type": "MIT",
-      "url": "http://opensource.org/licenses/MIT"
-    }
-  ],
-  "main": "./index",
-  "dependencies": {},
-  "devDependencies": {
-    "make-node": "0.3.x",
-    "mocha": "1.x.x",
-    "chai": "1.x.x"
-  },
-  "engines": {
-    "node": ">= 0.4.0"
-  },
-  "scripts": {
-    "test": "node_modules/.bin/mocha --reporter spec --require test/bootstrap/node test/*.test.js"
-  }
-}
diff --git a/node_modules/vary/HISTORY.md b/node_modules/vary/HISTORY.md
deleted file mode 100644
index f6cbcf7f9be9d45391c5e4e14d02541f59087351..0000000000000000000000000000000000000000
--- a/node_modules/vary/HISTORY.md
+++ /dev/null
@@ -1,39 +0,0 @@
-1.1.2 / 2017-09-23
-==================
-
-  * perf: improve header token parsing speed
-
-1.1.1 / 2017-03-20
-==================
-
-  * perf: hoist regular expression
-
-1.1.0 / 2015-09-29
-==================
-
-  * Only accept valid field names in the `field` argument
-    - Ensures the resulting string is a valid HTTP header value
-
-1.0.1 / 2015-07-08
-==================
-
-  * Fix setting empty header from empty `field`
-  * perf: enable strict mode
-  * perf: remove argument reassignments
-
-1.0.0 / 2014-08-10
-==================
-
-  * Accept valid `Vary` header string as `field`
-  * Add `vary.append` for low-level string manipulation
-  * Move to `jshttp` orgainzation
-
-0.1.0 / 2014-06-05
-==================
-
-  * Support array of fields to set
-
-0.0.0 / 2014-06-04
-==================
-
-  * Initial release
diff --git a/node_modules/vary/LICENSE b/node_modules/vary/LICENSE
deleted file mode 100644
index 84441fbb5709262c2bfc9b5ff0166ad4f024a1b8..0000000000000000000000000000000000000000
--- a/node_modules/vary/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014-2017 Douglas Christopher Wilson
-
-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/vary/README.md b/node_modules/vary/README.md
deleted file mode 100644
index cc000b34684a1d0b03d4c4cb4fac3e1094a81eec..0000000000000000000000000000000000000000
--- a/node_modules/vary/README.md
+++ /dev/null
@@ -1,101 +0,0 @@
-# vary
-
-[![NPM Version][npm-image]][npm-url]
-[![NPM Downloads][downloads-image]][downloads-url]
-[![Node.js Version][node-version-image]][node-version-url]
-[![Build Status][travis-image]][travis-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-Manipulate the HTTP Vary header
-
-## Installation
-
-This is a [Node.js](https://nodejs.org/en/) module available through the
-[npm registry](https://www.npmjs.com/). Installation is done using the
-[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): 
-
-```sh
-$ npm install vary
-```
-
-## API
-
-<!-- eslint-disable no-unused-vars -->
-
-```js
-var vary = require('vary')
-```
-
-### vary(res, field)
-
-Adds the given header `field` to the `Vary` response header of `res`.
-This can be a string of a single field, a string of a valid `Vary`
-header, or an array of multiple fields.
-
-This will append the header if not already listed, otherwise leaves
-it listed in the current location.
-
-<!-- eslint-disable no-undef -->
-
-```js
-// Append "Origin" to the Vary header of the response
-vary(res, 'Origin')
-```
-
-### vary.append(header, field)
-
-Adds the given header `field` to the `Vary` response header string `header`.
-This can be a string of a single field, a string of a valid `Vary` header,
-or an array of multiple fields.
-
-This will append the header if not already listed, otherwise leaves
-it listed in the current location. The new header string is returned.
-
-<!-- eslint-disable no-undef -->
-
-```js
-// Get header string appending "Origin" to "Accept, User-Agent"
-vary.append('Accept, User-Agent', 'Origin')
-```
-
-## Examples
-
-### Updating the Vary header when content is based on it
-
-```js
-var http = require('http')
-var vary = require('vary')
-
-http.createServer(function onRequest (req, res) {
-  // about to user-agent sniff
-  vary(res, 'User-Agent')
-
-  var ua = req.headers['user-agent'] || ''
-  var isMobile = /mobi|android|touch|mini/i.test(ua)
-
-  // serve site, depending on isMobile
-  res.setHeader('Content-Type', 'text/html')
-  res.end('You are (probably) ' + (isMobile ? '' : 'not ') + 'a mobile user')
-})
-```
-
-## Testing
-
-```sh
-$ npm test
-```
-
-## License
-
-[MIT](LICENSE)
-
-[npm-image]: https://img.shields.io/npm/v/vary.svg
-[npm-url]: https://npmjs.org/package/vary
-[node-version-image]: https://img.shields.io/node/v/vary.svg
-[node-version-url]: https://nodejs.org/en/download
-[travis-image]: https://img.shields.io/travis/jshttp/vary/master.svg
-[travis-url]: https://travis-ci.org/jshttp/vary
-[coveralls-image]: https://img.shields.io/coveralls/jshttp/vary/master.svg
-[coveralls-url]: https://coveralls.io/r/jshttp/vary
-[downloads-image]: https://img.shields.io/npm/dm/vary.svg
-[downloads-url]: https://npmjs.org/package/vary
diff --git a/node_modules/vary/index.js b/node_modules/vary/index.js
deleted file mode 100644
index 5b5e741279d4b800b0c408c5efbac8de6ece450b..0000000000000000000000000000000000000000
--- a/node_modules/vary/index.js
+++ /dev/null
@@ -1,149 +0,0 @@
-/*!
- * vary
- * Copyright(c) 2014-2017 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module exports.
- */
-
-module.exports = vary
-module.exports.append = append
-
-/**
- * RegExp to match field-name in RFC 7230 sec 3.2
- *
- * field-name    = token
- * token         = 1*tchar
- * tchar         = "!" / "#" / "$" / "%" / "&" / "'" / "*"
- *               / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
- *               / DIGIT / ALPHA
- *               ; any VCHAR, except delimiters
- */
-
-var FIELD_NAME_REGEXP = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/
-
-/**
- * Append a field to a vary header.
- *
- * @param {String} header
- * @param {String|Array} field
- * @return {String}
- * @public
- */
-
-function append (header, field) {
-  if (typeof header !== 'string') {
-    throw new TypeError('header argument is required')
-  }
-
-  if (!field) {
-    throw new TypeError('field argument is required')
-  }
-
-  // get fields array
-  var fields = !Array.isArray(field)
-    ? parse(String(field))
-    : field
-
-  // assert on invalid field names
-  for (var j = 0; j < fields.length; j++) {
-    if (!FIELD_NAME_REGEXP.test(fields[j])) {
-      throw new TypeError('field argument contains an invalid header name')
-    }
-  }
-
-  // existing, unspecified vary
-  if (header === '*') {
-    return header
-  }
-
-  // enumerate current values
-  var val = header
-  var vals = parse(header.toLowerCase())
-
-  // unspecified vary
-  if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) {
-    return '*'
-  }
-
-  for (var i = 0; i < fields.length; i++) {
-    var fld = fields[i].toLowerCase()
-
-    // append value (case-preserving)
-    if (vals.indexOf(fld) === -1) {
-      vals.push(fld)
-      val = val
-        ? val + ', ' + fields[i]
-        : fields[i]
-    }
-  }
-
-  return val
-}
-
-/**
- * Parse a vary header into an array.
- *
- * @param {String} header
- * @return {Array}
- * @private
- */
-
-function parse (header) {
-  var end = 0
-  var list = []
-  var start = 0
-
-  // gather tokens
-  for (var i = 0, len = header.length; i < len; i++) {
-    switch (header.charCodeAt(i)) {
-      case 0x20: /*   */
-        if (start === end) {
-          start = end = i + 1
-        }
-        break
-      case 0x2c: /* , */
-        list.push(header.substring(start, end))
-        start = end = i + 1
-        break
-      default:
-        end = i + 1
-        break
-    }
-  }
-
-  // final token
-  list.push(header.substring(start, end))
-
-  return list
-}
-
-/**
- * Mark that a request is varied on a header field.
- *
- * @param {Object} res
- * @param {String|Array} field
- * @public
- */
-
-function vary (res, field) {
-  if (!res || !res.getHeader || !res.setHeader) {
-    // quack quack
-    throw new TypeError('res argument is required')
-  }
-
-  // get existing header
-  var val = res.getHeader('Vary') || ''
-  var header = Array.isArray(val)
-    ? val.join(', ')
-    : String(val)
-
-  // set new header
-  if ((val = append(header, field))) {
-    res.setHeader('Vary', val)
-  }
-}
diff --git a/node_modules/vary/package.json b/node_modules/vary/package.json
deleted file mode 100644
index 028f72a93c5153af4163764face616d0ccb7a7b8..0000000000000000000000000000000000000000
--- a/node_modules/vary/package.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
-  "name": "vary",
-  "description": "Manipulate the HTTP Vary header",
-  "version": "1.1.2",
-  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
-  "license": "MIT",
-  "keywords": [
-    "http",
-    "res",
-    "vary"
-  ],
-  "repository": "jshttp/vary",
-  "devDependencies": {
-    "beautify-benchmark": "0.2.4",
-    "benchmark": "2.1.4",
-    "eslint": "3.19.0",
-    "eslint-config-standard": "10.2.1",
-    "eslint-plugin-import": "2.7.0",
-    "eslint-plugin-markdown": "1.0.0-beta.6",
-    "eslint-plugin-node": "5.1.1",
-    "eslint-plugin-promise": "3.5.0",
-    "eslint-plugin-standard": "3.0.1",
-    "istanbul": "0.4.5",
-    "mocha": "2.5.3",
-    "supertest": "1.1.0"
-  },
-  "files": [
-    "HISTORY.md",
-    "LICENSE",
-    "README.md",
-    "index.js"
-  ],
-  "engines": {
-    "node": ">= 0.8"
-  },
-  "scripts": {
-    "bench": "node benchmark/index.js",
-    "lint": "eslint --plugin markdown --ext js,md .",
-    "test": "mocha --reporter spec --bail --check-leaks test/",
-    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
-    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/"
-  }
-}
diff --git a/package-lock.json b/package-lock.json
index 75f62306530dc33bf5e1fa9e3e5aa0afbba29e09..fb2689fe44f79983ceb3937d25ebb80efb66aea2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,54 +12,18 @@
         "bcryptjs": "^3.0.2",
         "body-parser": "^1.20.3",
         "dotenv": "^16.4.7",
-        "express": "^4.21.2",
         "express-session": "^1.18.1",
-        "mysql2": "^3.13.0",
-        "mysql2-promise": "^0.1.4"
-      },
-      "devDependencies": {}
-    },
-    "node_modules/accepts": {
-      "version": "1.3.8",
-      "license": "MIT",
-      "dependencies": {
-        "mime-types": "~2.1.34",
-        "negotiator": "0.6.3"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/ansicolors": {
-      "version": "0.2.1",
-      "license": "MIT"
-    },
-    "node_modules/anymatch": {
-      "version": "3.1.3",
-      "license": "ISC",
-      "dependencies": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      },
-      "engines": {
-        "node": ">= 8"
+        "mysql2": "^3.13.0"
       }
     },
-    "node_modules/array-flatten": {
-      "version": "1.1.1",
-      "license": "MIT"
-    },
     "node_modules/aws-ssl-profiles": {
       "version": "1.1.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
+      "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",
       "engines": {
         "node": ">= 6.0.0"
       }
     },
-    "node_modules/balanced-match": {
-      "version": "1.0.2",
-      "license": "MIT"
-    },
     "node_modules/bcryptjs": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz",
@@ -68,20 +32,6 @@
         "bcrypt": "bin/bcrypt"
       }
     },
-    "node_modules/binary-extensions": {
-      "version": "2.3.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/bn.js": {
-      "version": "2.0.0",
-      "license": "MIT"
-    },
     "node_modules/body-parser": {
       "version": "1.20.3",
       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
@@ -105,34 +55,18 @@
         "npm": "1.2.8000 || >= 1.4.16"
       }
     },
-    "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/braces": {
-      "version": "3.0.3",
-      "license": "MIT",
-      "dependencies": {
-        "fill-range": "^7.1.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/bytes": {
       "version": "3.1.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
       "engines": {
         "node": ">= 0.8"
       }
     },
     "node_modules/call-bind-apply-helpers": {
       "version": "1.0.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
       "dependencies": {
         "es-errors": "^1.3.0",
         "function-bind": "^1.1.2"
@@ -143,7 +77,8 @@
     },
     "node_modules/call-bound": {
       "version": "1.0.4",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
       "dependencies": {
         "call-bind-apply-helpers": "^1.0.2",
         "get-intrinsic": "^1.3.0"
@@ -155,99 +90,55 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/cardinal": {
-      "version": "0.4.4",
-      "license": "MIT",
-      "dependencies": {
-        "ansicolors": "~0.2.1",
-        "redeyed": "~0.4.0"
-      },
-      "bin": {
-        "cdl": "bin/cdl.js"
-      }
-    },
-    "node_modules/chokidar": {
-      "version": "3.6.0",
-      "license": "MIT",
-      "dependencies": {
-        "anymatch": "~3.1.2",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.2",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.6.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "funding": {
-        "url": "https://paulmillr.com/funding/"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "license": "MIT"
-    },
-    "node_modules/content-disposition": {
-      "version": "0.5.4",
-      "license": "MIT",
-      "dependencies": {
-        "safe-buffer": "5.2.1"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
     "node_modules/content-type": {
       "version": "1.0.5",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
       "engines": {
         "node": ">= 0.6"
       }
     },
     "node_modules/cookie": {
-      "version": "0.7.1",
-      "license": "MIT",
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+      "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
       "engines": {
         "node": ">= 0.6"
       }
     },
     "node_modules/cookie-signature": {
-      "version": "1.0.6",
-      "license": "MIT"
-    },
-    "node_modules/core-util-is": {
-      "version": "1.0.3",
-      "license": "MIT"
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
+      "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA=="
     },
     "node_modules/debug": {
       "version": "2.6.9",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dependencies": {
         "ms": "2.0.0"
       }
     },
     "node_modules/denque": {
       "version": "2.1.0",
-      "license": "Apache-2.0",
+      "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+      "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
       "engines": {
         "node": ">=0.10"
       }
     },
     "node_modules/depd": {
       "version": "2.0.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
       "engines": {
         "node": ">= 0.8"
       }
     },
     "node_modules/destroy": {
       "version": "1.2.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
       "engines": {
         "node": ">= 0.8",
         "npm": "1.2.8000 || >= 1.4.16"
@@ -264,13 +155,10 @@
         "url": "https://dotenvx.com"
       }
     },
-    "node_modules/double-ended-queue": {
-      "version": "2.0.0-0",
-      "license": "MIT"
-    },
     "node_modules/dunder-proto": {
       "version": "1.0.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
       "dependencies": {
         "call-bind-apply-helpers": "^1.0.1",
         "es-errors": "^1.3.0",
@@ -282,32 +170,29 @@
     },
     "node_modules/ee-first": {
       "version": "1.1.1",
-      "license": "MIT"
-    },
-    "node_modules/encodeurl": {
-      "version": "2.0.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
     },
     "node_modules/es-define-property": {
       "version": "1.0.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/es-errors": {
       "version": "1.3.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/es-object-atoms": {
       "version": "1.1.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
       "dependencies": {
         "es-errors": "^1.3.0"
       },
@@ -315,72 +200,6 @@
         "node": ">= 0.4"
       }
     },
-    "node_modules/escape-html": {
-      "version": "1.0.3",
-      "license": "MIT"
-    },
-    "node_modules/esprima": {
-      "version": "1.0.4",
-      "bin": {
-        "esparse": "bin/esparse.js",
-        "esvalidate": "bin/esvalidate.js"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/etag": {
-      "version": "1.8.1",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/express": {
-      "version": "4.21.2",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
-      "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
-      "dependencies": {
-        "accepts": "~1.3.8",
-        "array-flatten": "1.1.1",
-        "body-parser": "1.20.3",
-        "content-disposition": "0.5.4",
-        "content-type": "~1.0.4",
-        "cookie": "0.7.1",
-        "cookie-signature": "1.0.6",
-        "debug": "2.6.9",
-        "depd": "2.0.0",
-        "encodeurl": "~2.0.0",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "finalhandler": "1.3.1",
-        "fresh": "0.5.2",
-        "http-errors": "2.0.0",
-        "merge-descriptors": "1.0.3",
-        "methods": "~1.1.2",
-        "on-finished": "2.4.1",
-        "parseurl": "~1.3.3",
-        "path-to-regexp": "0.1.12",
-        "proxy-addr": "~2.0.7",
-        "qs": "6.13.0",
-        "range-parser": "~1.2.1",
-        "safe-buffer": "5.2.1",
-        "send": "0.19.0",
-        "serve-static": "1.16.2",
-        "setprototypeof": "1.2.0",
-        "statuses": "2.0.1",
-        "type-is": "~1.6.18",
-        "utils-merge": "1.0.1",
-        "vary": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.10.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/express"
-      }
-    },
     "node_modules/express-session": {
       "version": "1.18.1",
       "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.1.tgz",
@@ -399,76 +218,26 @@
         "node": ">= 0.8.0"
       }
     },
-    "node_modules/express-session/node_modules/cookie": {
-      "version": "0.7.2",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
-      "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/express-session/node_modules/cookie-signature": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
-      "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA=="
-    },
-    "node_modules/fill-range": {
-      "version": "7.1.1",
-      "license": "MIT",
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/finalhandler": {
-      "version": "1.3.1",
-      "license": "MIT",
-      "dependencies": {
-        "debug": "2.6.9",
-        "encodeurl": "~2.0.0",
-        "escape-html": "~1.0.3",
-        "on-finished": "2.4.1",
-        "parseurl": "~1.3.3",
-        "statuses": "2.0.1",
-        "unpipe": "~1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/forwarded": {
-      "version": "0.2.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/fresh": {
-      "version": "0.5.2",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
     "node_modules/function-bind": {
       "version": "1.1.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/generate-function": {
       "version": "2.3.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
+      "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
       "dependencies": {
         "is-property": "^1.0.2"
       }
     },
     "node_modules/get-intrinsic": {
       "version": "1.3.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
       "dependencies": {
         "call-bind-apply-helpers": "^1.0.2",
         "es-define-property": "^1.0.1",
@@ -490,7 +259,8 @@
     },
     "node_modules/get-proto": {
       "version": "1.0.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
       "dependencies": {
         "dunder-proto": "^1.0.1",
         "es-object-atoms": "^1.0.0"
@@ -499,19 +269,10 @@
         "node": ">= 0.4"
       }
     },
-    "node_modules/glob-parent": {
-      "version": "5.1.2",
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/gopd": {
       "version": "1.2.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
       "engines": {
         "node": ">= 0.4"
       },
@@ -521,7 +282,8 @@
     },
     "node_modules/has-symbols": {
       "version": "1.1.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
       "engines": {
         "node": ">= 0.4"
       },
@@ -531,7 +293,8 @@
     },
     "node_modules/hasown": {
       "version": "2.0.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
       "dependencies": {
         "function-bind": "^1.1.2"
       },
@@ -541,7 +304,8 @@
     },
     "node_modules/http-errors": {
       "version": "2.0.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
       "dependencies": {
         "depd": "2.0.0",
         "inherits": "2.0.4",
@@ -555,7 +319,8 @@
     },
     "node_modules/iconv-lite": {
       "version": "0.4.24",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
       "dependencies": {
         "safer-buffer": ">= 2.1.2 < 3"
       },
@@ -563,77 +328,33 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/ignore-by-default": {
-      "version": "1.0.1",
-      "license": "ISC"
-    },
     "node_modules/inherits": {
       "version": "2.0.4",
-      "license": "ISC"
-    },
-    "node_modules/ipaddr.js": {
-      "version": "1.9.1",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/is-binary-path": {
-      "version": "2.1.0",
-      "license": "MIT",
-      "dependencies": {
-        "binary-extensions": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-number": {
-      "version": "7.0.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.12.0"
-      }
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "node_modules/is-property": {
       "version": "1.0.2",
-      "license": "MIT"
-    },
-    "node_modules/isarray": {
-      "version": "0.0.1",
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+      "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
     },
     "node_modules/long": {
       "version": "5.3.1",
-      "license": "Apache-2.0"
+      "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz",
+      "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng=="
     },
     "node_modules/lru-cache": {
       "version": "7.18.3",
-      "license": "ISC",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/lru.min": {
       "version": "1.1.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz",
+      "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==",
       "engines": {
         "bun": ">=1.0.0",
         "deno": ">=1.30.0",
@@ -646,52 +367,32 @@
     },
     "node_modules/math-intrinsics": {
       "version": "1.1.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/media-typer": {
       "version": "0.3.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/merge-descriptors": {
-      "version": "1.0.3",
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/methods": {
-      "version": "1.1.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
       "engines": {
         "node": ">= 0.6"
       }
     },
-    "node_modules/mime": {
-      "version": "1.6.0",
-      "license": "MIT",
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/mime-db": {
       "version": "1.52.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
       "engines": {
         "node": ">= 0.6"
       }
     },
     "node_modules/mime-types": {
       "version": "2.1.35",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
       "dependencies": {
         "mime-db": "1.52.0"
       },
@@ -699,19 +400,10 @@
         "node": ">= 0.6"
       }
     },
-    "node_modules/minimatch": {
-      "version": "3.1.2",
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
     "node_modules/ms": {
       "version": "2.0.0",
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
     },
     "node_modules/mysql2": {
       "version": "3.13.0",
@@ -732,45 +424,10 @@
         "node": ">= 8.0"
       }
     },
-    "node_modules/mysql2-promise": {
-      "version": "0.1.4",
-      "license": "MIT",
-      "dependencies": {
-        "mysql2": "^0.15.7",
-        "q": "^1.3.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/mysql2-promise/node_modules/lru-cache": {
-      "version": "2.5.0",
-      "license": "MIT"
-    },
-    "node_modules/mysql2-promise/node_modules/mysql2": {
-      "version": "0.15.8",
-      "license": "MIT",
-      "dependencies": {
-        "bn.js": "2.0.0",
-        "cardinal": "0.4.4",
-        "double-ended-queue": "2.0.0-0",
-        "named-placeholders": "0.1.3",
-        "readable-stream": "1.0.33"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/mysql2-promise/node_modules/named-placeholders": {
-      "version": "0.1.3",
-      "license": "MIT",
-      "dependencies": {
-        "lru-cache": "2.5.0"
-      }
-    },
     "node_modules/mysql2/node_modules/iconv-lite": {
       "version": "0.6.3",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
       "dependencies": {
         "safer-buffer": ">= 2.1.2 < 3.0.0"
       },
@@ -780,7 +437,8 @@
     },
     "node_modules/named-placeholders": {
       "version": "1.1.3",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
+      "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
       "dependencies": {
         "lru-cache": "^7.14.1"
       },
@@ -788,86 +446,10 @@
         "node": ">=12.0.0"
       }
     },
-    "node_modules/negotiator": {
-      "version": "0.6.3",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/nodemon": {
-      "version": "3.1.9",
-      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz",
-      "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==",
-      "dependencies": {
-        "chokidar": "^3.5.2",
-        "debug": "^4",
-        "ignore-by-default": "^1.0.1",
-        "minimatch": "^3.1.2",
-        "pstree.remy": "^1.1.8",
-        "semver": "^7.5.3",
-        "simple-update-notifier": "^2.0.0",
-        "supports-color": "^5.5.0",
-        "touch": "^3.1.0",
-        "undefsafe": "^2.0.5"
-      },
-      "bin": {
-        "nodemon": "bin/nodemon.js"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/nodemon"
-      }
-    },
-    "node_modules/nodemon/node_modules/debug": {
-      "version": "4.4.0",
-      "license": "MIT",
-      "dependencies": {
-        "ms": "^2.1.3"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/nodemon/node_modules/has-flag": {
-      "version": "3.0.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/nodemon/node_modules/ms": {
-      "version": "2.1.3",
-      "license": "MIT"
-    },
-    "node_modules/nodemon/node_modules/supports-color": {
-      "version": "5.5.0",
-      "license": "MIT",
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/normalize-path": {
-      "version": "3.0.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/object-inspect": {
       "version": "1.13.4",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
       "engines": {
         "node": ">= 0.4"
       },
@@ -877,7 +459,8 @@
     },
     "node_modules/on-finished": {
       "version": "2.4.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
       "dependencies": {
         "ee-first": "1.1.1"
       },
@@ -895,51 +478,16 @@
     },
     "node_modules/parseurl": {
       "version": "1.3.3",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
       "engines": {
         "node": ">= 0.8"
       }
     },
-    "node_modules/path-to-regexp": {
-      "version": "0.1.12",
-      "license": "MIT"
-    },
-    "node_modules/picomatch": {
-      "version": "2.3.1",
-      "license": "MIT",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/proxy-addr": {
-      "version": "2.0.7",
-      "license": "MIT",
-      "dependencies": {
-        "forwarded": "0.2.0",
-        "ipaddr.js": "1.9.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/pstree.remy": {
-      "version": "1.1.8",
-      "license": "MIT"
-    },
-    "node_modules/q": {
-      "version": "1.5.1",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.6.0",
-        "teleport": ">=0.2.0"
-      }
-    },
     "node_modules/qs": {
       "version": "6.13.0",
-      "license": "BSD-3-Clause",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+      "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
       "dependencies": {
         "side-channel": "^1.0.6"
       },
@@ -958,16 +506,10 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/range-parser": {
-      "version": "1.2.1",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
     "node_modules/raw-body": {
       "version": "2.5.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+      "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
       "dependencies": {
         "bytes": "3.1.2",
         "http-errors": "2.0.0",
@@ -978,35 +520,10 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/readable-stream": {
-      "version": "1.0.33",
-      "license": "MIT",
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.1",
-        "isarray": "0.0.1",
-        "string_decoder": "~0.10.x"
-      }
-    },
-    "node_modules/readdirp": {
-      "version": "3.6.0",
-      "license": "MIT",
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/redeyed": {
-      "version": "0.4.4",
-      "license": "MIT",
-      "dependencies": {
-        "esprima": "~1.0.4"
-      }
-    },
     "node_modules/safe-buffer": {
       "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
       "funding": [
         {
           "type": "github",
@@ -1020,79 +537,27 @@
           "type": "consulting",
           "url": "https://feross.org/support"
         }
-      ],
-      "license": "MIT"
+      ]
     },
     "node_modules/safer-buffer": {
       "version": "2.1.2",
-      "license": "MIT"
-    },
-    "node_modules/semver": {
-      "version": "7.7.1",
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/send": {
-      "version": "0.19.0",
-      "license": "MIT",
-      "dependencies": {
-        "debug": "2.6.9",
-        "depd": "2.0.0",
-        "destroy": "1.2.0",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "fresh": "0.5.2",
-        "http-errors": "2.0.0",
-        "mime": "1.6.0",
-        "ms": "2.1.3",
-        "on-finished": "2.4.1",
-        "range-parser": "~1.2.1",
-        "statuses": "2.0.1"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/send/node_modules/encodeurl": {
-      "version": "1.0.2",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/send/node_modules/ms": {
-      "version": "2.1.3",
-      "license": "MIT"
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "node_modules/seq-queue": {
-      "version": "0.0.5"
-    },
-    "node_modules/serve-static": {
-      "version": "1.16.2",
-      "license": "MIT",
-      "dependencies": {
-        "encodeurl": "~2.0.0",
-        "escape-html": "~1.0.3",
-        "parseurl": "~1.3.3",
-        "send": "0.19.0"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
+      "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
     },
     "node_modules/setprototypeof": {
       "version": "1.2.0",
-      "license": "ISC"
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
     },
     "node_modules/side-channel": {
       "version": "1.1.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
       "dependencies": {
         "es-errors": "^1.3.0",
         "object-inspect": "^1.13.3",
@@ -1109,7 +574,8 @@
     },
     "node_modules/side-channel-list": {
       "version": "1.0.0",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
       "dependencies": {
         "es-errors": "^1.3.0",
         "object-inspect": "^1.13.3"
@@ -1123,7 +589,8 @@
     },
     "node_modules/side-channel-map": {
       "version": "1.0.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
       "dependencies": {
         "call-bound": "^1.0.2",
         "es-errors": "^1.3.0",
@@ -1139,7 +606,8 @@
     },
     "node_modules/side-channel-weakmap": {
       "version": "1.0.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
       "dependencies": {
         "call-bound": "^1.0.2",
         "es-errors": "^1.3.0",
@@ -1154,61 +622,34 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/simple-update-notifier": {
-      "version": "2.0.0",
-      "license": "MIT",
-      "dependencies": {
-        "semver": "^7.5.3"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/sqlstring": {
       "version": "2.3.3",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
+      "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
       "engines": {
         "node": ">= 0.6"
       }
     },
     "node_modules/statuses": {
       "version": "2.0.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
       "engines": {
         "node": ">= 0.8"
       }
     },
-    "node_modules/string_decoder": {
-      "version": "0.10.31",
-      "license": "MIT"
-    },
-    "node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
     "node_modules/toidentifier": {
       "version": "1.0.1",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
       "engines": {
         "node": ">=0.6"
       }
     },
-    "node_modules/touch": {
-      "version": "3.1.1",
-      "license": "ISC",
-      "bin": {
-        "nodetouch": "bin/nodetouch.js"
-      }
-    },
     "node_modules/type-is": {
       "version": "1.6.18",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
       "dependencies": {
         "media-typer": "0.3.0",
         "mime-types": "~2.1.24"
@@ -1228,27 +669,10 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/undefsafe": {
-      "version": "2.0.5",
-      "license": "MIT"
-    },
     "node_modules/unpipe": {
       "version": "1.0.0",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/utils-merge": {
-      "version": "1.0.1",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/vary": {
-      "version": "1.1.2",
-      "license": "MIT",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
       "engines": {
         "node": ">= 0.8"
       }
diff --git a/package.json b/package.json
index 5687e824fb7e8490c314b7a986c6b276c4a1619d..7df7c73d6a62984e4b72431e9444b763f1593549 100644
--- a/package.json
+++ b/package.json
@@ -3,19 +3,18 @@
   "version": "1.0.0",
   "description": "",
   "main": "server.js",
-  "dependencies": {
-    "bcryptjs": "^3.0.2",
-    "body-parser": "^1.20.3",
-    "dotenv": "^16.4.7",
-    "express": "^4.21.2",
-    "express-session": "^1.18.1",
-    "mysql2": "^3.13.0",
-    "mysql2-promise": "^0.1.4"
-  },
   "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1",
     "start": "node server.js"
   },
+  "keywords": [],
   "author": "",
-  "license": "ISC"
+  "license": "ISC",
+  "dependencies": {
+    "bcryptjs": "^3.0.2",
+    "body-parser": "^1.20.3",
+    "dotenv": "^16.4.7",
+    "express-session": "^1.18.1",
+    "mysql2": "^3.13.0"
+  }
 }